{"version":3,"sources":["locales/translations.ts","utils/LocaleHE.js","utils/date-utils.ts","api/odata/ODataFilter.ts","styles/colors/bookitColors.ts","utils/userProfileSettings.ts","app/slice/selectors.ts","app/components/BasicTable/types/FilterParam.ts","app/components/BasicIcons/FontAwesome/index.tsx","api/HttpClient.ts","app/components/Forms/FormsLayout/FormRightSection/index.tsx","app/components/Forms/FormsLayout/StyledForm/index.tsx","api/SettingsApi.ts","app/slice/workers/doPrefetchConfigurableColumns.ts","app/slice/saga.ts","app/slice/index.ts","app/components/BasicButtons/Button/index.tsx","app/components/Typography/index.tsx","utils/url-utils.ts","app/slice/types.ts","utils/loadable.tsx","app/Layout/FrontendLayout/slice/type.ts","app/components/BasicButtons/IconButton/index.tsx","app/Layout/FrontendLayout/slice/saga.ts","app/Layout/FrontendLayout/slice/index.ts","app/components/basic/Wrappers/Box/index.tsx","app/Layout/FrontendLayout/slice/selectors.ts","utils/typeUtils.ts","types/AppSettings.ts","utils/globalSettings/GlobalSettings.ts","utils/mobileDetect.ts","app/components/BasicPickers/AutocompletePicker/index.tsx","app/components/BasicPickers/BaseOptionsPicker/highlightSearchTerm.tsx","types/KnownModules.ts","app/components/BasicTooltips/Tooltip/index.tsx","api/odata/generated/enums/AvailabilityTypes.ts","enums/AssetAttributes.ts","enums/ServiceTypes.ts","styles/typography/bookitTypography.ts","utils/redux-injectors.ts","app/components/Typography/BasicTypography.tsx","app/components/BasicPickers/Utils/autoCompletePickerUtils.ts","utils/enumKeys.ts","app/hooks/useEffectOnMount.ts","app/pages/ReservationDetails/Details/slice/types.ts","app/hooks/useAsyncAwaitedState.ts","utils/string-utils.ts","app/components/ExternalLink/index.tsx","app/hooks/useSystemDate.ts","app/Layout/FrontendLayout/components/CoverWrapper/index.tsx","app/components/LinearProgress/index.tsx","app/Layout/FrontendLayout/components/PageWrapper/components/Head.tsx","app/Layout/FrontendLayout/components/PageWrapper/components/ShortHead.tsx","app/Layout/FrontendLayout/components/PageWrapper/styled/index.tsx","app/Layout/FrontendLayout/components/PageWrapper/components/ButtonsPanel.tsx","app/Layout/FrontendLayout/components/PageWrapper/components/TopButtonsPanel.tsx","app/Layout/FrontendLayout/components/PageWrapper/components/FormSkeleton.tsx","app/Layout/FrontendLayout/components/PageWrapper/index.tsx","utils/assertExhaustive.tsx","app/pages/OtherServiceDetails/Details/slice/selectors.ts","app/pages/ReservationDetails/Details/slice/selectors.ts","app/components/Forms/Schemas/index.ts","utils/@reduxjs/toolkit.tsx","app/components/DialogConfirm/index.tsx","enums/ConfigurableTypes.ts","app/pages/Samples/RequestSamplesPage/slice/types.ts","app/pages/Samples/RequestSamplesPage/slice/utils/ServiceRequestTableColumn.ts","app/pages/Samples/RequestSamplesPage/slice/selectors.ts","app/components/Forms/FormTextField.tsx","app/hooks/useSidePanelOpen.tsx","enums/RepetitiveOptions.ts","app/components/BasicButtons/TopActionButton/index.tsx","app/components/BasicPickers/BaseOptionsPicker/index.tsx","app/components/Forms/FormRender/FormRenderer.tsx","utils/globalSettings/AllowedSettings.ts","app/components/BasicIcons/InfoIcon/index.tsx","app/components/DatePeriods/index.tsx","app/pages/CalendarPage/Scheduler/components/event_text/handlebars.ts","app/pages/CalendarPage/Scheduler/components/event_text/ExtractPathsVisitor.ts","app/permissions/Reservations/reservationPermissions.ts","app/pages/CalendarPage/Scheduler/slice/selectors.ts","types/CustomDate.ts","app/Layout/FrontendLayout/components/Snackbar/types.ts","api/odata/generated/enums/RequiredTypes.ts","api/odata/generated/enums/DisplayTypes.ts","app/components/CustomForm/CustomFormUtils.ts","app/components/pickers/AutocompletePickers/UserPicker/index.tsx","app/hooks/usePromise.ts","types/PresetDatesRange.ts","app/components/pickers/MultiSelectPickers/AssetsPicker/index.tsx","app/pages/Samples/RequestSamplesPage/slice/saga.ts","app/pages/Samples/RequestSamplesPage/slice/index.ts","app/pages/Samples/SamplePlatesPage/slice/index.ts","utils/entity-utils.ts","app/pages/AssetPopUp/OpenAssetDetails/index.tsx","app/components/Forms/FormRichTextField.tsx","enums/RestrictDurationUnitTypes.ts","app/pages/CalendarPage/Scheduler/utils/index.ts","app/pages/OtherServiceDetails/Details/slice/types.ts","app/pages/OtherServiceDetails/Details/slice/saga.ts","app/pages/OtherServiceDetails/Details/slice/index.ts","app/components/LoadingIndicator/index.tsx","types/AuthenticatedUser.ts","app/pages/Samples/SamplesListPage/slice/index.ts","app/components/DropDown/index.tsx","app/components/BasicTable/CellRenderers/DateRenderer/index.tsx","enums/Article.ts","app/components/Forms/FormConnectedFilters/slice/selectors.ts","app/components/Forms/FormNumberField.tsx","enums/commentReferenceTypes.ts","app/components/Forms/FormLabelText.tsx","enums/TrainingState.ts","api/OtherServicesApi.ts","app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/selectors.ts","app/components/PopupImportExport/Actions/Types.ts","app/components/BasicTable/Filters/AssetRangeFilter/index.tsx","app/hooks/useIsMobile.ts","app/components/pickers/MultiSelectPickers/OnlineServicesPicker/index.tsx","app/pages/Actions/GlobalSelectedActions/ValidToRender/renderTypes.ts","app/components/BasicTable/withSavedHistory.tsx","app/components/ReactActions/useStyles.tsx","app/components/ReactActions/StyledMenuItem.tsx","app/components/ReactActions/HoverActions.tsx","app/components/ReactActions/ClickableActions.tsx","app/components/ReactActions/index.tsx","app/components/BasicInputs/TextControlField/index.tsx","api/ReservationsApi.ts","utils/messages.ts","app/components/BasicTable/BasicFilter/AppliedFilterComponent.tsx","app/pages/Samples/EditableTable/EditableCell/index.tsx","app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton/index.tsx","app/components/BasicTable/Filters/BooleanPickerFilter/index.tsx","app/components/BasicButtons/ActionButton/index.tsx","app/components/BasicInputs/BaseTextField/index.tsx","app/components/BasicTable/components/BooleanRender/index.tsx","app/components/BasicInputs/Check/styles.ts","app/components/BasicInputs/Check/index.tsx","app/components/Forms/FormBookitDatePicker/index.tsx","app/components/BasicTable/Filters/DatesRangeFilter/index.tsx","app/hooks/useAsyncGetOnMount.ts","app/components/pickers/AutocompletePickers/OfflineServiceTypePicker/index.tsx","app/pages/ArticlesPage/slice/selectors.ts","app/components/DatePicker/utils/pickerDateValidate.tsx","app/components/BasicTable/types/ColumnWithDeps.ts","app/components/BasicTable/Comparers/index.ts","app/components/BasicTable/index.tsx","app/components/pickers/AutocompletePickers/BudgetPicker/index.tsx","enums/enums.ts","enums/DraftReservationTypes.ts","api/odata/generated/enums/AllowReservationCollaboratorsTypes.ts","app/pages/ReservationDetails/Details/slice/mapSettingsFromServices.ts","app/pages/ReservationDetails/Details/slice/ConvertModelToUpdateEntity.ts","app/pages/ReservationDetails/Details/slice/ConvertModelToInsertEntity.ts","app/pages/ReservationDetails/Details/slice/saga.ts","app/pages/ReservationDetails/Details/slice/TryDisableRemoveableEquipments.ts","app/pages/ReservationDetails/Details/slice/ConvertDtoToModel.ts","app/pages/ReservationDetails/Details/slice/getReservationSettings.ts","app/pages/ReservationDetails/Details/slice/index.ts","app/components/BasicInputs/GhostInput/index.tsx","app/components/BasicChip/index.tsx","app/components/LargeFilesUpload/slice/saga.ts","app/components/LargeFilesUpload/slice/index.ts","api/CommentsApi.ts","app/components/Forms/FormConnectedFilters/slice/types.ts","app/components/Forms/FormConnectedFilters/slice/saga.ts","app/components/Forms/FormConnectedFilters/slice/index.ts","styles/constantVariables.ts","app/components/pickers/AutocompletePickers/ExtraddlPicker/index.tsx","app/components/BasicPickers/AutocompleteMultiPicker/index.tsx","app/components/BasicPickers/BaseURLPicker/index.tsx","enums/EmptySlotAdminClick.ts","api/WorkOrderApi.ts","app/components/BasicTable/RowActions.tsx","app/components/pickers/StaticOptionsPickers/FundingTypeIdPicker/index.tsx","app/components/BasicTable/useProfileSetting/index.ts","app/components/LargeFilesUpload/Components/useUploadToNewComment.ts","app/permissions/WorkOrders/allowedroles.tsx","app/permissions/WorkOrders/workOrdersPermissionUtils.ts","app/components/Forms/Switch.tsx","app/pages/ReservationDetails/Details/components/utils.ts","app/components/Forms/FormBookitDateTimePicker/index.tsx","app/components/BasicTable/Filters/ExtraDDLFilter/index.tsx","app/components/BasicPickers/AutocompleteMultiPickerEx/index.tsx","app/components/AssetThumbImage/getAssetImageSrc.tsx","enums/WorkingHoursTypes.ts","app/pages/CalendarPage/Scheduler/slice/saga.ts","app/pages/CalendarPage/Scheduler/slice/index.ts","app/pages/ReservationDetails/Details/components/useGlobalSettingsHook.ts","app/components/BasicTable/UnconfigurableTable/FilterHandler.tsx","app/pages/SavedViewsPage/SavedViewPage/slice/types.ts","app/pages/SavedViewsPage/SavedViewPage/slice/saga.ts","app/pages/SavedViewsPage/SavedViewPage/slice/index.ts","app/components/Forms/FormUserPicker.tsx","app/components/BasicAlert/index.tsx","app/pages/SavedViewsPage/SavedViewPage/slice/selectors.ts","app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/saga.ts","app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/index.ts","app/pages/Samples/EditableTable/Fields/TextField/index.tsx","app/components/Messages/slice/type.ts","app/pages/AssetPopUp/IAsset.tsx","app/components/PopupImportExport/Actions/index.ts","app/components/PopupImportExport/Actions/Api.ts","app/pages/Samples/SamplesListPage/slice/selectors.ts","app/components/BasicTable/Filters/index.tsx","app/components/TextField/index.tsx","app/components/Forms/FormCheckbox.tsx","app/pages/Samples/RequestSamplesPage/slice/path.ts","app/components/BasicTable/BasicFilter/AddFilterButton.tsx","app/components/BasicTable/BasicFilter/AppliedFiltersContainer/index.tsx","app/components/BasicTable/BasicFilter/index.tsx","app/components/Forms/FormControls/FormControlLabel/index.tsx","app/components/BookitDatePicker/DateInput.tsx","app/components/DatePicker/utils/toEndDateDisplayValue.tsx","app/components/DatePicker/utils/truncateTime.tsx","utils/DateFormattingUtils/longFormatters.ts","utils/DateFormattingUtils/getFormatTokens.ts","app/components/BookitDatePicker/utils/types.ts","app/components/BookitDatePicker/StyledPicker.tsx","app/components/pickers/StaticOptionsPickers/DaysByMonthPicker/index.tsx","app/components/pickers/StaticOptionsPickers/MonthOfYearPicker/index.tsx","app/components/pickers/StaticOptionsPickers/YearsPicker/index.tsx","app/components/BookitDatePicker/DateDropDown/index.tsx","app/components/pickers/StaticOptionsPickers/HoursPicker/index.tsx","app/components/pickers/StaticOptionsPickers/MinutesPicker/index.tsx","app/components/pickers/StaticOptionsPickers/AmPmPicker/index.tsx","app/components/BookitDatePicker/TimeDropDown/index.tsx","app/hooks/useIsomorphicLayoutEffect.ts","app/hooks/useEventListener.ts","app/components/BookitDatePicker/utils/useDateTimeChange.ts","app/components/BookitDatePicker/KeyboardRifmInput/index.tsx","app/components/BookitDatePicker/KeyboardInput.tsx","app/components/BookitDatePicker/TimeOptionPicker/index.tsx","app/components/BookitDatePicker/index.tsx","app/hooks/useKeyUpOutside.ts","utils/logLevel.ts","types/DatesRange.ts","app/components/BasicTable/useProfileSetting/parseProfileUrl.ts","app/hooks/useExpandedSideBarState.ts","app/components/Forms/FormControls/FormControl/index.tsx","types/SiteMapSettings.ts","types/IRepetitiveDto.ts","styles/shadows/bookitShadow.ts","app/components/pickers/AutocompletePickers/WorkOrderTypePicker/index.tsx","app/components/pickers/AutocompletePickers/InventoryBatchesPicker/index.tsx","app/pages/CalendarPage/Scheduler/utils/parseType.tsx","api/odata/generated/enums/TimelineGroupBy.ts","app/pages/CalendarPage/parseCalendarPageParams.tsx","app/components/BasicTable/CellRenderers/AlignRight.tsx","enums/CustomFormType.ts","app/components/BasicTable/components/UserProfileLink/index.tsx","app/components/pickers/AutocompletePickers/UserGroupPicker/index.tsx","app/components/BasicTable/Filters/UserFilter/index.tsx","app/components/BasicTable/components/DescriptionCell/index.tsx","app/components/DateTimeLabel/index.tsx","enums/BudgetFields.ts","api/savedViewsApi.ts","app/pages/Samples/EditableTable/Fields/NumberField/index.tsx","app/pages/ServiceRequestsKanbanPage/slice/selectors.ts","app/components/pickers/ServiceGroupPicker/index.tsx","app/components/Forms/FormServiceGroupPicker.tsx","app/pages/ArticlesPage/slice/saga.ts","app/pages/ArticlesPage/slice/index.ts","app/components/Forms/FormControls/FormHelperText/index.tsx","app/pages/ServiceRequestsKanbanPage/slice/saga.ts","app/pages/ServiceRequestsKanbanPage/slice/index.ts","app/components/BasicTable/Hooks/aggregations.js","app/components/BasicTable/Hooks/utils.js","app/components/BasicTable/Hooks/useSummary.js","app/components/BasicTable/components/TableCard/index.tsx","app/components/BasicTable/components/TabsToolbar/index.tsx","app/components/BasicTable/components/FloatingActions.tsx","app/components/BasicTable/components/CustomTableToolbar/index.tsx","app/components/BasicTable/ControlledTable/RenderRow.tsx","app/components/BasicTable/components/CustomEmptyTable/index.tsx","app/components/BasicTable/ControlledTable/TableCell.tsx","app/components/BasicTable/ControlledTable/RenderGroupedRow.tsx","app/components/BasicTable/ImportButton/index.tsx","app/components/BasicTable/ControlledTable/index.tsx","app/components/BasicTable/components/TableSkeleton/index.tsx","app/components/BasicInputs/Toggle/index.tsx","app/components/BasicToggle/index.tsx","app/components/Comments/index.tsx","app/components/CalendarButton/index.tsx","app/pages/CalendarPage/GetCalendarPagePath.tsx","app/components/BasicInputs/Select/index.tsx","app/components/BasicTable/BasicFilter/SavedListsDropDown/index.tsx","app/components/BasicPickers/EnumPicker/index.tsx","types/IConnectedFiltersDto.ts","app/components/BasicTable/Filters/NumberFieldFilter/index.tsx","app/components/pickers/AutocompletePickers/BuildingPicker/index.tsx","app/components/pickers/AutocompletePickers/CampusPicker/index.tsx","app/components/pickers/AutocompletePickers/RoomPicker/index.tsx","app/components/BasicTable/BasicFilter/TableToolbar/TableToolbarHeader.tsx","app/components/BasicTable/BasicFilter/TableToolbar/index.tsx","app/components/basic/Wrappers/FlexWrappers/flexRow.tsx","app/components/pickers/AutocompletePickers/AssetPicker/index.tsx","app/components/BasicTable/UnconfigurableTable/UnconfigurableTable.tsx","app/components/PrintToPDF/slice/saga.ts","app/components/PrintToPDF/slice/index.ts","app/Layout/FrontendLayout/components/TopBar/styled/index.tsx","app/components/Forms/FormsLayout/wrappers/index.tsx","app/slice/globalDbSettingsSelectors.ts","app/components/Forms/FormAssetsPicker.tsx","app/components/pickers/AutocompletePickers/ResrevationStatusMultiPicker/index.tsx","app/components/BasicTable/Filters/ResrvationStatusMultiFilter/index.tsx","app/components/BasicTable/Filters/UpcomingReservationfilter/index.tsx","app/components/BasicTable/Filters/WorkflowBookingFilter/index.tsx","app/components/pickers/AutocompletePickers/ReservationByIdWithPartsPicker/index.tsx","app/components/BasicTable/Filters/ReservationByIdWithPartsFilter/index.tsx","app/components/BasicTable/BasicFilter/FilterDisplay/InstrumentsFilterDisplay/index.tsx","app/pages/ReservationHistoryPage/Filter.tsx","app/components/Forms/FormRepetitive/slice/saga.ts","app/components/Forms/FormRepetitive/slice/index.ts","enums/ServiceGroupRegistrationStatus.ts","app/components/BasicTable/ConfigurableColumns.ts","enums/RemindBefore.ts","app/permissions/Asset/assetPermissions.ts","app/components/pickers/AutocompletePickers/UserMultiPicker/index.tsx","app/components/BasicTable/BasicFilter/utils.ts","app/components/Forms/FormEquipmentsPicker.tsx","api/odata/generated/entities/IAssetDto.ts","app/components/Forms/FormBudgetPicker.tsx","app/components/Forms/FormFundingTypePicker.tsx","api/odata/generated/enums/ServiceRequestMilestoneStatuses.ts","app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/types.ts","api/odata/ODataParamsBuilder.ts","app/components/BasicList/StyledList/index.tsx","styles/colors/info.ts","styles/MUIExtend/themeOverrides.ts","styles/theme.tsx","app/components/BasicTable/Filters/BuildingPickerFilter/index.tsx","app/components/pickers/AutocompletePickers/LocationPicker/index.tsx","app/components/pickers/MultiSelectPickers/ServiceGroupsPicker/index.tsx","app/hooks/useGlobalServiceGroupsFilter.ts","app/components/ButtonConfirm/index.tsx","app/pages/InvoiceDetails/InvoiceDetailsSidePanel/index.tsx","app/components/Forms/ValidationSchemaProvider.tsx","app/pages/Samples/components/RunTypePicker/index.tsx","app/pages/AssetPopUp/AttributeRenderers/index.tsx","app/pages/AssetPopUp/IAssetRow.tsx","app/pages/AssetPopUp/AssetLocationLastUpdate.tsx","app/components/BasicTable/components/DoubleRenderer/index.tsx","app/pages/AssetPopUp/components/AssetComments.tsx","app/pages/AssetPopUp/getAssetEditLink.ts","app/pages/AssetPopUp/Rows.tsx","app/pages/AssetPopUp/components/Utils.ts","app/pages/AssetPopUp/components/TopAssetActionsDropDown.tsx","app/pages/AssetPopUp/CreateAnAssetRelatedEvent.tsx","app/pages/AssetPopUp/components/AssetDetailsFiles.tsx","app/pages/AssetPopUp/components/RenderAssetRows.tsx","app/pages/AssetPopUp/components/MismatchCoreMessage.tsx","app/pages/AssetPopUp/components/AssetDetailsTabContent.tsx","app/pages/AssetPopUp/components/AssetBookingRules.tsx","app/pages/AssetPopUp/components/TableFilters.tsx","app/pages/AssetPopUp/components/GetTableCount.ts","app/pages/AssetPopUp/components/AssetTrainingSessions.tsx","app/pages/AssetPopUp/components/AssetArcticlesTable.tsx","app/pages/AssetPopUp/components/AssetWorkOrders.tsx","app/pages/AssetPopUp/components/BadgeCounter.tsx","app/pages/AssetPopUp/components/AssetMobileDropDownTabs/index.tsx","app/pages/AssetPopUp/components/AssetDetailsTabs.tsx","app/pages/AssetPopUp/components/types.ts","app/pages/AssetPopUp/index.tsx","app/components/BasicLinks/Link/index.tsx","app/components/BasicButtons/ActionIconButton/index.tsx","app/Layout/FrontendLayout/components/PageWrapper/PageActions/SwitchActions.tsx","app/components/Forms/FormsLayout/FormSectionTitle.tsx","app/pages/Actions/GlobalSelectedActions/OpenWorkOrder.tsx","app/components/Forms/FormOfflineServiceTypePicker.tsx","app/components/CommentsContainer/styles.ts","app/components/CommentsContainer/FileButton.tsx","app/components/LargeFilesUpload/slice/selectoes.ts","app/components/LargeFilesUpload/Upload/index.ts","app/components/LargeFilesUpload/Upload/Api.ts","app/components/LargeFilesUpload/Components/FileCard.tsx","app/components/LargeFilesUpload/Components/SelectFile.tsx","app/components/LargeFilesUpload/index.tsx","app/components/CommentsContainer/index.tsx","enums/ReservationOrDowntimeEnum.ts","app/components/BookitDatePicker/BookitDateTimePicker.tsx","app/pages/AssetsInventory/Details/slice/selectors.ts","enums/MultipleInstrumentReservations.ts","app/pages/CalendarPage/Scheduler/slice/types.ts","app/components/BasicTable/Filters/ServiceMultiFilter/index.tsx","styles/MUIExtend/autocompleteStyles.ts","app/components/BasicTable/initFilterData.ts","enums/InvoiceStatuses.ts","app/components/PrintToPDF/slice/selectors.ts","app/components/Forms/FormRepetitive/slice/types.ts","app/components/pickers/DatePeriodsPicker/index.tsx","app/components/AssetThumbImage/index.tsx","app/components/Forms/FormAutocompleteOptions.tsx","app/components/Forms/FormAutocompleteMultiOptions.tsx","api/ExternalApi.ts","app/components/CustomForm/CustomFormFields/CustomFormDropDown.tsx","styles/colors/types.ts","app/pages/CalendarPage/Scheduler/utils/formatSchedulerDateOrUndefined.tsx","api/odata/generated/enums/FileTypes.ts","utils/fileStoreHelper.ts","api/odata/generated/enums/Roles.ts","api/odata/generated/enums/PurchaseOrderOptions.ts","app/pages/Samples/RequestSamplesPage/slice/prepareServiceRequestRowModel.ts","app/pages/LocationsPage/Details/index.tsx","enums/CatRateTypes.ts","app/components/Forms/Schemas/InvoiceChildRowBaseSchema/index.ts","enums/allowCreateInvoicesBy.ts","app/pages/AddPaymentPage/index.tsx","app/pages/AddPaymentPage/PaymentSchema.ts","api/ChargeApi.ts","app/components/Forms/FormCatRateTypePicker.tsx","app/components/pickers/AutocompletePickers/OfflineServicePicker/index.tsx","app/components/Forms/FormOfflineServicePicker.tsx","app/components/Forms/FormSampleTypePicker.tsx","app/components/Forms/FormServiceUserGroupPicker.tsx","app/pages/AddChargePage/index.tsx","app/pages/AddChargePage/ChargeSchema.ts","app/pages/LabelTypesPage/LabelTypeEdit/Loadable.ts","app/pages/ArticlesPage/Hooks/useAllowedToChangeStatus.tsx","app/pages/ArticlesPage/ArticleDetails/index.tsx","app/components/Forms/FormAssetPicker.tsx","app/pages/ArticlesPage/utils.ts","app/components/Forms/FormCustomPicker.tsx","app/pages/ArticlesPage/ArticlePickers/index.tsx","app/pages/ArticlesPage/ArticleFormPickers/index.tsx","app/pages/ArticlesPage/NewArticleDetailsForm/index.tsx","app/pages/ArticlesPage/ArticleComments.tsx","app/pages/ArticlesPage/EditArticleDetailsForm/index.tsx","app/pages/UserAttributes/UserAttributesDetailsPage/Details/Actions/UserAttributesActions.tsx","app/pages/UserAttributes/UserAttributesDetailsPage/Details/slice/types.ts","api/UserAttributesApi.ts","app/pages/UserAttributes/UserAttributesDetailsPage/Details/slice/saga.ts","app/pages/UserAttributes/UserAttributesDetailsPage/Details/slice/index.ts","app/pages/UserAttributes/UserAttributesDetailsPage/Details/slice/selectors.ts","app/pages/UserAttributes/UserAttributesDetailsPage/Details/UserAttributesForm/index.tsx","app/pages/UserAttributes/UserAttributesDetailsPage/Details/index.tsx","api/odata/generated/enums/Priorities.ts","app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails/schema.ts","app/components/pickers/StaticOptionsPickers/PriorityPicker/index.tsx","app/components/Forms/FormPriorityPicker.tsx","app/components/Forms/FormServiceRequestStatusPicker.tsx","app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails/components/Form/index.tsx","app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails/components/AddSubTicket/index.tsx","app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails/index.tsx","app/pages/OtherServiceDetails/StockRenewal/StockRenewalForm.tsx","app/pages/OtherServiceDetails/StockRenewal/index.tsx","app/pages/OtherServiceDetails/RenewStock/RenewStockForm.tsx","app/pages/OtherServiceDetails/RenewStock/index.tsx","app/pages/OtherServiceDetails/InventoryBatch/InventoryBatchForm.tsx","app/pages/OtherServiceDetails/InventoryBatch/index.tsx","app/pages/ArticlesPage/ArticleAssociationForm/index.tsx","app/Layout/FrontendLayout/components/SidePanel/SidePanelRenderer.tsx","app/components/pickers/AutocompletePickers/AssetCatGroupPicker/index.tsx","app/components/pickers/AutocompletePickers/InstitutePicker/index.tsx","app/components/pickers/AutocompletePickers/AssetCatPicker/index.tsx","app/components/pickers/AutocompletePickers/DepartmentPicker/index.tsx","app/components/BasicTable/Filters/RoomPickerFilter/index.tsx","app/components/ReservationEditButton/index.tsx","app/components/pickers/AutocompletePickers/InstituteTypePicker/index.tsx","app/components/Description/index.tsx","app/components/BasicCards/index.tsx","app/components/BasicTable/CellRenderers/AssetRenderer/index.tsx","app/components/BasicTable/TableFilterBuilder/index.ts","app/pages/Animals/InternalIdLoginPage/slice/saga.ts","app/pages/Animals/InternalIdLoginPage/slice/index.ts","app/components/Forms/FormUsersPicker.tsx","app/components/pickers/AutocompletePickers/SubLocationListPicker/index.tsx","app/components/BasicPickers/BaseOptionsMultiPicker/index.tsx","app/slice/router-selectors.ts","enums/BudgetExperimentStatuses.ts","enums/OnlineServiceTypeEnum.ts","app/components/pickers/StaticOptionsPickers/OnlineServiceTypePicker/index.tsx","app/pages/Actions/GlobalSelectedActions/ValidToRender/useAssetsPermissionsUtils.ts","app/pages/Actions/GlobalSelectedActions/AddWorkOrder.tsx","app/components/pickers/AutocompletePickers/MyAssetAvailabilityTypeMultiPicker/index.tsx","app/hooks/useResponseModel.ts","app/components/BasicButtons/FilterIconButton/index.tsx","app/components/ReservationCreateButton/index.tsx","app/pages/CalendarPage/SchedulerWithFiltersProps.tsx","app/pages/CalendarPage/getDefaultFilter.tsx","app/pages/CalendarPage/getRequiredFilter.tsx","app/pages/CalendarPage/CalendarPageDefaultRedir.tsx","app/pages/CalendarPage/index.tsx","app/components/BooleanPicker/index.tsx","app/components/DialogAlert/slice/index.ts","app/components/ErrorBoundary/index.tsx","app/Layout/FrontendLayout/components/PageWrapper/components/TitlePage.tsx","app/components/CommentsContainer/commentParser.tsx","app/pages/ReservationDetails/Details/slice/combineOfflineServiceTypes.ts","app/pages/ReservationDetails/Details/slice/getBudgetVisible.ts","app/components/pickers/AutocompletePickers/TrainingSessionPicker/index.tsx","app/components/pickers/StaticOptionsPickers/RemindBeforePicker/index.tsx","app/components/pickers/AutocompletePickers/WorkflowBookingPicker/index.tsx","app/components/BasicTable/styles.ts","app/components/BasicTable/useMemoFilters.ts","app/components/ValueLabel/index.tsx","app/components/BasicTabs/TabPanel/index.tsx","app/components/Forms/FormAutocomplete.tsx","app/components/Forms/FormAutocompleteMulti.tsx","app/components/CustomForm/CustomFormFields/CustomFormUserSelection.tsx","app/components/Forms/FormRepetitive/slice/selectors.ts","app/components/pickers/AutocompletePickers/SampleTypePicker.index.tsx","app/components/Forms/FromRadioGroup.tsx","app/components/CustomForm/CustomFormFields/CustomFormAnswerQuestions.tsx","app/components/CustomForm/CustomFormFields/CustomFormCheckBox.tsx","app/components/CustomForm/CustomFormFields/CustomFormDate.tsx","app/components/CustomForm/CustomFormFields/CustomFormDisclimer.tsx","app/components/CustomForm/CustomFormFields/CustomFormEmail.tsx","app/components/CustomForm/CustomFormFields/CustomFormNumberText.tsx","app/components/CustomForm/CustomFormFields/CustomFormParagraph.tsx","app/components/CustomForm/CustomFormFields/CustomFormPositiveNumber.tsx","app/components/CustomForm/CustomFormFields/CustomFormRadioGroup.tsx","app/components/CustomForm/CustomFormFields/CustomFormRichText.tsx","app/components/CustomForm/CustomFormFields/CustomFormShortText.tsx","app/components/CustomForm/CustomFormFields.tsx","app/pages/OtherServiceDetails/Details/components/AddService.tsx","app/pages/OtherServiceDetails/Details/components/InventoryBatchChip.tsx","app/pages/OtherServiceDetails/Details/components/QuickServiceItem.tsx","app/pages/Actions/PageTopActions/AddConsumable/index.tsx","app/pages/OtherServiceDetails/Details/components/AddServiceFromSelection.tsx","app/pages/OtherServiceDetails/Details/components/BookQuickServices.tsx","app/components/BookitlabLogo/messages.ts","app/pages/CalendarPage/Scheduler/utils/syncSchedulerEvents.tsx","api/fileStoreApi.ts","app/hooks/usePrevious.tsx","api/odata/generated/entities/IUserFilterDto.ts","api/odata/generated/enums/SamplePlatePositionNamingTypes.ts","api/CustomFormApi.ts","app/components/CustomForm/CustomFormContent/index.tsx","app/components/CustomForm/CusomFormControl/Form/index.tsx","app/components/CustomForm/CusomFormControl/index.tsx","api/utils.ts","app/components/pickers/AutocompletePickers/ServiceRequestStatusMultiPicker/index.tsx","app/pages/NotFoundPage/P.ts","app/pages/NotFoundPage/index.tsx","app/components/BasicInputs/Radio/index.tsx","app/components/RadioGroup/index.tsx","api/BillingActionsApi.ts","app/pages/OnlineBudgetsStatusPage/slice/types.ts","api/PaymentApi.ts","app/components/Forms/FormsLayout/FormRow/index.tsx","app/pages/Samples/SamplePlatesPage/slice/selectors.ts","app/components/pickers/AutocompletePickers/UnitTypePicker/index.tsx","app/components/BasicTable/BasicFilter/FilterBox/index.tsx","app/pages/UserTrainings/TrainingDetailsPage/Details/Actions/TrainingActions.tsx","app/components/Forms/Schemas/SchemaMethods.ts","app/components/pickers/AutocompletePickers/WorkOrdersPicker/index.tsx","app/components/Forms/FormRestrictedUserGroupPicker.tsx","app/pages/ServiceRequestsKanbanPage/Filter.ts","app/pages/Samples/EditableTable/TablePaginationActions.tsx","app/pages/Samples/EditableTable/index.tsx","app/components/pickers/AutocompletePickers/SamplePlatePositionsPicker/index.tsx","app/components/Forms/FormGradientPicker.tsx","app/pages/Samples/components/CreateReservationComponent/index.tsx","app/pages/Samples/RunDetailsPage/ImportComponents/PopupImport.tsx","app/pages/Samples/RunDetailsPage/ImportButton.tsx","app/pages/Samples/RunDetailsPage/Actions/index.ts","app/pages/Samples/RunDetailsPage/SelectedRowActions/GetSelectaedRowActions.tsx","app/pages/Samples/RunDetailsPage/AnalyticalSampleIDSuffix.tsx","app/pages/Samples/RunDetailsPage/CellPositionToNumber.tsx","app/pages/Samples/RunDetailsPage/index.tsx","app/components/BasicInputs/FileUpload/styles.ts","app/components/BasicInputs/FileUpload/FileView.tsx","app/components/BasicInputs/FileUpload/FileInput.tsx","app/components/BasicInputs/FileUpload/FilesPreview.tsx","app/components/BasicInputs/FileUpload/FileUpload.tsx","app/components/Forms/FormInputFile.tsx","api/EmailNotificationsApi.ts","app/pages/EmailNotificationsPage/index.tsx","app/pages/EmailNotificationsPage/SelectedRowActions/GetSelectedRowActions.tsx","app/components/BasicInputs/BaseInputs/StandardInput/styles.ts","app/components/BasicInputs/BaseInputs/StandardInput/index.tsx","app/components/BasicTable/withGlobalServiceGroupFilter.tsx","app/components/Admin/AdminActions/index.tsx","app/components/BasicTable/Filters/UserGroupFIlter/index.tsx","app/components/BasicLinks/ButtonLink/index.tsx","app/components/BasicTable/Filters/AssetCatGroupFilter/index.tsx","app/components/BasicTable/Filters/InstituteFilter/index.tsx","types/ResponseType.ts","app/components/BasicTable/Filters/AssetCatFilter/index.tsx","app/components/BasicTable/Filters/ServiceGroupFilter/index.tsx","app/components/BasicTable/Filters/DepartmentFilter/index.tsx","app/components/pickers/AutocompletePickers/ProjectPicker/index.tsx","app/components/BasicTable/Filters/ProjectFilter/index.tsx","app/components/pickers/AutocompletePickers/UserDisciplinePicker/index.tsx","app/components/pickers/AutocompletePickers/ServiceTypePicker/index.tsx","app/components/BasicTable/Filters/InstituteTypeFilter/index.tsx","app/components/pickers/AutocompletePickers/InvoiceIdMultiPicker/index.tsx","app/components/LabelPrint/Printers/getQrUrl.ts","app/components/LabelPrint/Printers/Dymo.ts","app/components/LabelPrint/Printers/Zebra.ts","app/components/LabelPrint/Printers/index.ts","app/components/LabelPrint/slice/saga.ts","app/components/LabelPrint/slice/index.ts","app/components/pickers/AutocompletePickers/TrainingLevelPicker/index.tsx","app/components/pickers/AutocompletePickers/AssetMultiPicker/index.tsx","app/components/BasicTable/Filters/AssetMultiFilter/index.tsx","app/components/BasicTable/Filters/LocationPickerFilter/index.tsx","app/components/BookitlabLogo/index.tsx","app/components/BasicTable/Filters/CampusPickerFilter/index.tsx","app/components/QrCodeExport/index.tsx","app/components/pickers/AutocompletePickers/AreassPicker/index.tsx","api/odata/generated/enums/EmailType.ts","app/components/BasicButtons/BaseToggleButton/index.tsx","app/components/BasicButtons/BaseToggleButtonGroup/index.tsx","app/components/BasicTable/FilterContainer/index.tsx","app/pages/Actions/PageTopActions/AddReservation/index.tsx","app/components/BasicTable/Filters/ServiceGroupsFilter/index.tsx","app/components/pickers/AutocompletePickers/TagsPicker/index.tsx","app/components/pickers/AutocompletePickers/LoanablePicker/index.tsx","app/components/pickers/AutocompletePickers/StatusPicker/index.tsx","app/components/pickers/AutocompletePickers/LockersPicker/index.tsx","app/components/BasicTable/Filters/SubLocationListFilter/index.tsx","app/Layout/FrontendLayout/components/CustomerLogo/index.tsx","enums/InstrumentListAssemblyTypes.ts","app/components/pickers/StaticOptionsPickers/AssemblyTypePicker/index.tsx","app/components/Forms/FormsLayout/StyledFormFieldsContainer/index.tsx","app/components/BasicTable/getFilterValue.tsx","app/Layout/FrontendLayout/components/PageWrapper/components/SkeletonIfLoading.tsx","app/components/BasicTable/BasicFilter/FiltersButton/index.tsx","app/components/BasicTable/Filters/ProjectFilter/getBudgetsFilterSettings.tsx","app/components/pickers/AutocompletePickers/AvailabilityTypePicker/index.tsx","app/components/BasicTable/GlobalFilter.tsx","app/pages/WorkOrdersPage/Actions/NewWorkOrder/index.tsx","app/pages/Actions/GlobalSelectedActions/BringBackUp.tsx","app/pages/Actions/GlobalSelectedActions/DownWorkOrder.tsx","app/pages/Actions/GlobalSelectedActions/OpenCalendar.tsx","app/pages/Actions/GlobalSelectedActions/OpenWrokOrders.tsx","app/components/BasicTable/useConfigurableColumnsAdvanced.ts","app/components/Popover/index.tsx","app/components/BasicTable/withoutGlobalServiceGroupFilter.tsx","app/components/BasicTable/components/TableCardGrid/index.tsx","app/components/BasicTable/BasicFilter/TableToolbar/styled/index.tsx","api/odata/getPredicates.ts","app/components/BasicLinks/RouterLink/index.tsx","app/pages/ArticlesPage/ArticleDoiLink/index.tsx","app/components/pickers/StaticOptionsPickers/PaymentMethodEnumPicker/index.tsx","app/components/pickers/AutocompletePickers/SamplePlatePicker/index.tsx","app/components/pickers/AutocompletePickers/SamplePlatePositionPicker/index.tsx","app/pages/Samples/SamplesListPage/ImportButton.tsx","app/components/pickers/StaticOptionsPickers/PriceSheetMethodPicker/index.tsx","app/components/pickers/AutocompletePickers/SuperGroupPicker/index.tsx","app/pages/MyAssetsPage/DefaultFilter.tsx","app/components/BasicTable/CellRenderers/DecimalRenderer/index.tsx","app/components/pickers/StaticOptionsPickers/ServiceTypeEnumPicker/index.tsx","app/pages/Samples/EditableTable/Fields/DateField/index.tsx","app/components/pickers/AutocompletePickers/ServiceRequestStatusPicker/index.tsx","app/pages/AddChargePage/AddChargeButton.tsx","enums/MinTimeAheadPeriodTypes.ts","api/RestrictionsApi.ts","enums/TrainingStatus.ts","app/pages/InstrumentRestrictionsPage/Details/components/UserOwnPermissions.tsx","api/UserPermissionsApi.ts","app/pages/InstrumentRestrictionsPage/Details/InstrumentRestrictions.tsx","app/components/Copyright/messages.ts","app/components/Copyright/styled/index.tsx","app/components/Copyright/index.tsx","app/components/Messages/slice/selector.ts","app/pages/ReservationDetails/Details/useOpenReservationSidePanel.tsx","app/components/Messages/index.tsx","app/components/BasicDialog/BasicDialogActions.tsx","app/components/BasicDialog/BasicDialogContentWithTitle.tsx","app/components/BasicDialog/index.tsx","api/BarcodeScanApi.ts","app/pages/AssetsInventory/Details/slice/saga.ts","app/pages/AssetsInventory/Details/slice/index.ts","app/components/Messages/slice/saga.ts","app/components/Messages/slice/index.ts","app/components/EndUsageConfirm/styles.ts","app/components/EndUsageConfirm/index.tsx","app/components/BasicDialog/BasicDialogContent.tsx","app/components/DialogForm/index.tsx","app/components/Popper/index.tsx","app/components/Popper/PopperTitle.tsx","app/components/RichTextEditor/index.tsx","app/components/Forms/FormControls/FormGroup/index.tsx","app/components/Forms/FormAdminUserPicker.tsx","app/components/BasicTable/Filters/DatesPeriodFilter/index.tsx","enums/WorkWeekDays.ts","app/pages/CalendarPage/Scheduler/utils/parseLength.tsx","app/pages/CalendarPage/Scheduler/utils/applyForceFullDayReservations.tsx","app/pages/CalendarPage/Scheduler/utils/adjustSchedulerEventTimes.tsx","app/hooks/useGlobalDomEvents.ts","app/components/BasicTable/BasicFilter/FiltersGroupDisplay/index.tsx","app/components/BasicTable/BasicFilter/FilterDisplay/index.tsx","enums/GlobalEnums.ts","app/components/LabelPrint/PrintSelectedAssetLabelsButton/index.tsx","app/components/BasicTable/useConfigurableColumns.ts","app/components/BasicTable/TablePaginationActions.tsx","app/components/BasicTable/ExportButton/index.tsx","app/components/BasicTable/SelectedActions/index.tsx","app/components/BasicTable/components/ConfigureColumnsButton.tsx","app/hooks/useLocationChange.ts","app/components/BasicTabs/TabsWrapper.tsx","app/components/CustomForm/CustomFormFields/CustomFormFileUpload.tsx","app/components/Forms/FormRepetitive/RepetitiveControl.tsx","app/components/CommentsContainer/IComment.ts","api/SamplesApi.ts","app/pages/Samples/RunDetailsPage/ImportComponents/ImportComponent.tsx","utils/redux-saga/index.ts","api/InvoiceTemplatesApi.ts","app/components/Forms/FormInventoryBatchPicker.tsx","app/pages/ServiceRequestsKanbanPage/components/getServiceRequestTicketTitle.tsx","app/pages/ServiceRequestsKanbanPage/components/ParentTicketDetailsButton/index.tsx","app/components/Forms/FormsLayout/FormErrorSummury/index.tsx","app/pages/ArticlesExternalSearchPage/Loadable.ts","app/components/pickers/AutocompletePickers/BudgetExperimentsPicker/index.tsx","app/components/Forms/FormBudgetExperimentsPicker.tsx","app/components/Forms/FormConnectedFilters/FormFieldListeners/UserGroupListener.tsx","app/components/Forms/FormConnectedFilters/FormFieldListeners/UserNameListener.tsx","app/components/Forms/FormConnectedFilters/FormFieldListeners/BudgetListener.tsx","app/components/Forms/FormConnectedFilters/index.tsx","app/components/Forms/FormConnectedFilters/ConnectedFiltersControl.tsx","app/components/PrintToPDF/Components/Dialog.tsx","app/components/PrintToPDF/Components/styles.ts","app/components/PrintToPDF/Components/CheckBox.tsx","app/components/PrintToPDF/ServiceRequestSectionTypes.ts","app/components/PrintToPDF/Components/PopupPrintToPDFComponent.tsx","app/components/PrintToPDF/Components/PrintToPDFPopup.tsx","enums/ReferenceType.ts","app/pages/OtherServiceDetails/Details/OfflineForm/index.tsx","app/pages/OtherServiceDetails/Details/index.tsx","app/components/pickers/StaticOptionsPickers/ServiceRequestMilestoneStatusPicker/index.tsx","app/components/Forms/FormServiceRequestMilestoneStatusPicker.tsx","app/pages/Samples/components/ServiceRequestMilestoneDetails/index.tsx","app/components/Forms/FormUnitTypePicker.tsx","app/components/Forms/FormServiceRequestMilestoneChargeServicePicker.tsx","app/pages/Samples/components/ServiceRequestMilestoneChargeDetails/index.tsx","app/components/RichTextEditor/RichEditorSerializer.tsx","app/components/RichTextEditor/RichEditor.tsx","app/components/RichTextEditor/styles.ts","app/components/Avatar/styles.ts","app/components/Avatar/index.tsx","app/components/pickers/AutocompletePickers/PaymentMethodPicker/index.tsx","app/components/Forms/FormPaymentMethodPicker.tsx","app/components/BasicTable/ControlledTable/addRowSelect.tsx","app/components/BasicTable/ControlledTable/ConditionalSelectHeaderCheckbox.ts","enums/InvoiceFundingType.ts","enums/ScreenToShowOn.ts","app/components/BasicTable/Filters/InstrumentCatFilter/index.tsx","app/components/BasicTable/Filters/UserAssetContactMultiFilter/index.tsx","app/pages/UsersPage/PageActions/Actions.ts","app/pages/BillingPreviewPage/Actions/Apis.ts","app/components/BasicTable/CellRenderers/PercentageRenderer/index.tsx","app/components/LabelPrint/slice/selectors.ts","app/components/BasicTable/CellRenderers/DateTimeRenderer/index.tsx","app/pages/Actions/GlobalSelectedActions/OpenArticleDetails.tsx","app/pages/LocationsPage/Details/ditails.ts","app/pages/Animals/InternalIdLoginPage/slice/selectors.ts","app/components/BasicTable/Filters/CustomPickerFilter/index.tsx","app/components/pickers/CustomPicker/index.tsx","app/pages/PublicAssets/slice/selectors.ts","app/components/BasicTable/Filters/ServiceTypeFilter/index.tsx","api/EmailApi.ts","app/hooks/useSendMail.ts","app/components/BasicTable/Filters/UserDisciplineFilter/index.tsx","app/pages/SavedViewsPage/AddToLists/index.tsx","app/components/BasicTable/CellRenderers/ListRenderer/index.tsx","app/components/pickers/AutocompletePickers/ReservationStatusPicker/index.tsx","app/components/Forms/FormRoomPicker.tsx","app/components/PopupImportExport/Components/Dialog/index.tsx","app/components/PopupImportExport/Components/Types.ts","app/components/PopupImportExport/Data/index.ts","app/components/PopupImportExport/Components/SelectFile.tsx","app/components/PopupImportExport/Components/TypePicker.tsx","app/components/PopupImportExport/Components/AutomaticAssetImportNamingPicker.tsx","app/components/PopupImportExport/Components/ImageList.tsx","app/components/PopupImportExport/Components/SelectImageFiles.tsx","app/components/PopupImportExport/Components/step1.tsx","app/components/PopupImportExport/Components/step2_4.tsx","app/components/PopupImportExport/Components/NamePicker.tsx","app/components/PopupImportExport/Components/Table/index.tsx","app/components/PopupImportExport/Components/step3.tsx","app/components/PopupImportExport/Components/step5.tsx","app/components/PopupImportExport/Actions/Import.tsx","app/components/PopupImportExport/index.tsx","app/components/BasicTable/Filters/CampusFilter/index.tsx","app/components/pickers/AutocompletePickers/ServiceUserGroupPicker/index.tsx","app/components/pickers/AutocompletePickers/UserGroupMultiPicker/index.tsx","app/components/BasicDialog/BasicDialogTitle.tsx","app/pages/PublicAssets/slice/saga.ts","app/pages/PublicAssets/slice/index.ts","app/components/InvoiceRowReferenceLinks/index.tsx","app/components/Forms/FormLocationPicker.tsx","app/components/PopupImport/index.tsx","app/components/BasicTable/Filters/TagsFilter/index.tsx","app/components/BasicTable/Filters/LoanableFilter/index.tsx","app/components/BasicTable/Filters/StatusFilter/index.tsx","app/components/BasicTable/Filters/LockersFilter/index.tsx","app/components/BasicTable/Filters/AssemblyTypesFilter/index.tsx","app/components/BasicTable/Filters/AreasFilter/index.tsx","app/components/BasicTable/Filters/OnlineServiceTypeFilter/index.tsx","app/components/BasicTable/Filters/MyAssetAvailabilityTypeMultiPickerFilter/index.tsx","app/components/DateLabel.tsx/index.tsx","app/components/pickers/AutocompletePickers/TrainingStatePicker/index.tsx","app/components/BasicTable/Filters/TrainingStatePickerFilter/index.tsx","app/components/pickers/AutocompletePickers/ReservationOrDowntimePicker/index.tsx","app/components/BasicTable/Filters/ReservationOrDowntimePickerFilter/index.tsx","app/components/BasicTable/Filters/WithReservationsOnlyFilter/index.tsx","app/pages/CalendarPage/Filter.tsx","app/components/PrintToPDF/Components/PrintStyles.ts","app/components/PrintToPDF/index.tsx","app/components/pickers/AutocompletePickers/SamplePlateTypePicker/index.tsx","app/components/Forms/FromSamplePlateTypePicker.tsx","app/components/Forms/FormsLayout/FormFieldsSection/index.tsx","app/components/Forms/FormsLayout/FormLeftSection/index.tsx","app/components/BasicTable/BasicFilter/TableToolbar/RefreshIcon.tsx","app/components/BasicTable/Filters/NumbersRangeFilter/index.tsx","app/components/BasicTable/Filters/AvailabilityTypeBookableFilter/index.tsx","app/pages/TrainingSessionsPage/PrimaryAction.ts","app/pages/WorkOrdersPage/PrimaryAction.ts","app/components/Forms/FormParagraph.tsx","app/components/pickers/AutocompletePickers/CatRateTypePicker/index.tsx","app/pages/OtherServiceDetails/Details/components/InventoryBatchList.tsx","app/components/BasicTable/CellRenderers/ImageRenderer/index.tsx","app/components/BasicPickers/BaseURLMultiPicker/index.tsx","app/components/BasicTable/CellRenderers/EquipmentIdRenderer/index.tsx","app/components/BasicTable/CellRenderers/OperationTypeIdRenderer/index.tsx","app/components/BasicTable/CellRenderers/AssetImageRenderer/index.tsx","app/pages/OtherServiceDetails/OtherServiceDetailsPage/index.tsx","app/components/BasicTable/Filters/ServiceFilter/index.tsx","app/components/BasicIcons/SvgIcons/I-cursor.svg","app/components/BasicIcons/SvgIcons/check.svg","app/components/BasicIcons/SvgIcons/times.svg","app/components/BasicIcons/SvgIcons/chevron-down.svg","app/components/BasicIcons/SvgIcons/chevron-up.svg","app/components/BasicIcons/SvgIcons/notavailable.svg","app/components/BasicIcons/SvgIcons/notAllowed.svg","app/components/BasicIcons/SvgIcons/checked.svg","app/components/BasicIcons/SvgIcons/unchecked.svg","app/components/BasicIcons/SvgIcons/undeterminate.svg","app/components/BasicIcons/SvgIcons/index.tsx","app/components/pickers/AutocompletePickers/RoomTSPicker/index.tsx","app/components/BasicTable/Filters/RoomTSFilter/index.tsx","app/components/pickers/MultiSelectPickers/TrainingProgramsMultiPicker/index.tsx","app/components/BasicTable/Filters/TrainingProgramsMultiFilter/index.tsx","app/pages/TrainingSessionsPage/Filter.tsx","app/components/pickers/AutocompletePickers/ActiveSampleTypesPicker/index.tsx","app/components/pickers/AutocompletePickers/RelevantBudgetPicker/index.tsx","app/pages/ServiceRequestListPage/CreateNewRequest/index.tsx","app/Layout/FrontendLayout/components/SidePanel/wrappers/index.tsx","app/Layout/FrontendLayout/components/SidePanel/SidePanelPopup.tsx","app/Layout/FrontendLayout/components/SidePanel/index.tsx","app/components/BasicInputs/BaseInputs/FilledInput/index.tsx","utils/ExportToExcel.ts","app/components/BasicTable/getNextFilter.tsx","app/components/pickers/AutocompletePickers/InvoiceStatusPicker/index.tsx","app/Layout/FrontendLayout/components/TopBar/components/openMenuButton/index.tsx","app/components/BasicTable/CellRenderers/UserRenderer/index.tsx","app/components/BasicCheckBox/index.tsx","app/pages/CalendarPage/Scheduler/components/ViewTypeLengthDropDown/index.tsx","app/pages/CalendarPage/Scheduler/components/ExportToPDF.tsx","app/components/BasicTable/Filters/DatePickerFilter/index.tsx","app/components/BasicTable/Filters/TextFieldFilter/index.tsx","app/pages/ReservationHistoryPage/MyListFilter.tsx","app/pages/Documents/DocumentsTable.tsx","app/components/BasicTable/components/NoTableData/index.tsx","app/components/BasicTable/components/TableError/index.tsx","app/components/BasicTable/CellRenderers/DefaultRenderer/index.tsx","app/pages/Documents/Columns.tsx","app/pages/TrainingSessionsPage/Columns.tsx","app/components/BasicTable/CellRenderers/UsedSlotsRenderer/index.tsx","app/components/BasicTable/CellRenderers/TrainingStateRenderer/index.tsx","app/pages/TrainingSessionsPage/RowActions/ReservationLink.tsx","app/pages/TrainingSessionsPage/TrainingSessionsTable.tsx","app/pages/ArticlesPage/ArticlesTable.tsx","app/pages/ArticlesPage/PrimaryAction.ts","app/pages/WorkOrdersPage/WorkOrdersTable.tsx","api/AssetDetailsApi.ts","app/pages/QuizDetailsPage/QuizDetails/index.tsx","app/pages/Actions/GlobalSelectedActions/OpenTimeline.tsx","app/components/ScannerView/index.tsx","app/pages/Samples/SamplePlatesPage/slice/saga.ts","app/components/InfoIcon/index.tsx","app/components/BasicTable/Filters/SuperGroupFilter/index.tsx","api/ServiceRequestsApi.ts","app/pages/MyAssetsPage/Columns.tsx","app/components/BasicTable/Filters/ServiceTypeEnumFilter/index.tsx","app/pages/MyAssetsPage/SelectedRowActions/GetSelectedActions.tsx","app/pages/Actions/GlobalSelectedActions/CloneEquipments.tsx","app/components/BasicTable/Filters/AssetFilter/index.tsx","app/pages/InvoiceBatches/InvoiceBatchesComments.tsx","app/pages/OtherServiceDetails/OtherServiceDetailsPage/getQueryStringParameter.ts","app/pages/OnlineBudgetsStatusPage/Filter.tsx","app/components/InfiniteScroll/index.tsx","app/pages/CalendarPage/Scheduler/components/EventRender/EventContent.tsx","app/pages/CalendarPage/Scheduler/utils/formatSchedulerTime.tsx","app/pages/CalendarPage/Scheduler/components/EventRender/EventHeader.tsx","app/pages/CalendarPage/Scheduler/components/EventRender/TrainingSessionStatus.tsx","app/pages/CalendarPage/Scheduler/components/EventRender/TrainingSessionEventConent.tsx","app/pages/CalendarPage/Scheduler/components/EventRender/ReservationStatusIcon.tsx","app/pages/CalendarPage/Scheduler/components/EventRender/ReservationEventContent.tsx","app/pages/CalendarPage/Scheduler/components/EventRender/OfflineEventContent.tsx","app/pages/CalendarPage/Scheduler/components/EventRender/index.tsx","app/pages/CalendarPage/Scheduler/servicesToSections.ts","app/pages/CalendarPage/Scheduler/serverListUtils.tsx","app/pages/CalendarPage/Scheduler/renderServiceLabel.tsx","app/pages/CalendarPage/Scheduler/utils/timelineEventsSortIteratee.ts","app/pages/CalendarPage/Scheduler/components/NoServices/index.tsx","app/hooks/useComparedHooks.ts","app/pages/CalendarPage/Scheduler/components/EventRender/EventTimelineContent.tsx","app/pages/CalendarPage/Scheduler/components/event_text/index.tsx","app/pages/CalendarPage/Scheduler/components/Tooltips/TooltipLine/index.tsx","app/pages/CalendarPage/Scheduler/components/Tooltips/TrainingSessionTooltip/index.tsx","app/pages/CalendarPage/Scheduler/components/Tooltips/OfflineTooltip/index.tsx","app/pages/CalendarPage/Scheduler/components/Tooltips/ReservationTooltip/index.tsx","app/pages/CalendarPage/Scheduler/components/Tooltips/index.tsx","app/hooks/useDidUpdate.ts","app/pages/CalendarPage/Scheduler/updateView.tsx","app/pages/CalendarPage/Scheduler/deleteTempReservations.tsx","app/pages/CalendarPage/Scheduler/resetEventEdits.tsx","app/pages/CalendarPage/Scheduler/findParentTarget.tsx","app/pages/CalendarPage/Scheduler/transformToSerializableEvent.tsx","app/components/PrintToPDF/Scheduler/ExportMethods.ts","app/components/PrintToPDF/Scheduler/index.tsx","app/pages/CalendarPage/Scheduler/index.tsx","app/pages/CalendarPage/Scheduler/utils/getEvent.tsx","app/pages/CalendarPage/Scheduler/utils/adjustMonthTimelineLength.tsx","app/pages/CalendarPage/Scheduler/createTimelineView.tsx","app/pages/CalendarPage/Scheduler/createUnitsView.tsx","app/pages/CalendarPage/Scheduler/getServiceIdFromServiceClickEvent.tsx","app/components/pickers/MultiSelectPickers/EquipmentReservationPicker/index.tsx","app/components/Forms/FormReservationEquipmentsPicker.tsx","app/components/Forms/FormReservationStatusPicker.tsx","app/pages/ReservationDetails/Details/components/ReservationCustomForm.tsx","app/pages/ReservationDetails/Details/components/FormFieldListeners/BudgetListener.tsx","app/pages/ReservationDetails/Details/components/FormFieldListeners/UserNameListener.tsx","app/pages/ReservationDetails/Details/components/FormFieldListeners/UserGroupListener.tsx","app/pages/ReservationDetails/Details/components/FormFieldListeners/StartTimeListener.tsx","app/pages/ReservationDetails/Details/components/FormFieldListeners/EndTimeListener.tsx","app/components/BasicChip/ChipChekBoxGroup.tsx","app/components/BasicChip/ChipLabelGroup.tsx","app/components/Forms/FormChipsGroup.tsx","app/pages/ReservationDetails/Details/components/ReservationOfflineServices.tsx","app/components/pickers/MultiSelectPickers/AccompaniedServicesPicker/index.tsx","app/components/Forms/FormAccompaniedServicesPicker.tsx","app/pages/ReservationDetails/Details/components/ReservationActions.tsx","app/pages/ReservationDetails/Details/components/TerminateReservation.tsx","app/components/Forms/FormTrainingSessionPicker.tsx","app/components/pickers/AutocompletePickers/ReservationBudgetExperimentPicker/index.tsx","app/components/Forms/ReservationBudgetExperimentPicker.tsx","app/pages/ReservationDetails/Details/ReservationForm/getReservationsLink.tsx","app/pages/TrainingSessionsPage/components/EditTrainingSessionsLink/index.tsx","app/pages/ReservationDetails/Details/components/TrainingSignUpAdminAlertContent/index.tsx","app/pages/ReservationDetails/Details/components/ReservationTimePicker/index.tsx","app/pages/ReservationDetails/Details/components/EquipmentsDataAssemblies/index.tsx","app/pages/ReservationDetails/Details/components/ReservationWorkOrders/index.tsx","app/components/Forms/FormWorkFlowBooking/index.tsx","app/pages/ReservationDetails/Details/ReservationForm/index.tsx","app/pages/ReservationDetails/Details/ReservationForm/handlers.tsx","app/pages/ReservationDetails/Details/ReservationForm/getReservationCollaboratorsFilter.tsx","app/pages/ReservationDetails/Details/components/ApproveTrainingRecords.tsx","app/pages/ReservationDetails/Details/components/TransferReservation.tsx","app/pages/ReservationDetails/Details/components/Modifications/index.tsx","app/pages/ReservationDetails/Details/components/Modifications/Columns.tsx","app/pages/ReservationDetails/Details/components/Modifications/Filter.tsx","app/pages/ReservationDetails/Details/components/CalculatePricing/index.tsx","app/pages/ReservationDetails/Details/index.tsx","app/components/pickers/AutocompletePickers/InvoiceTemplatePicker/index.tsx","app/pages/InvoiceDetails/Slice/saga.ts","app/pages/InvoiceDetails/Slice/index.ts","app/pages/InvoiceDetails/Slice/selector.ts","app/pages/InvoiceDetails/InvoiceComments/index.tsx","app/pages/InvoiceDetails/InvoiceInReview/styles.ts","app/pages/InvoiceDetails/InvoiceInReview/index.tsx","app/pages/InvoiceDetails/ReadOnly/styles.ts","app/pages/InvoiceDetails/InvoiceRemarks/index.tsx","app/pages/InvoiceDetails/ReadOnly/index.tsx","app/pages/InvoiceDetails/ReadOnly/Rows.tsx","app/pages/InvoiceDetails/Tables/Details/Columns.tsx","app/components/BasicTable/Filters/SampleTypeFilter/index.tsx","app/pages/InvoiceDetails/Tables/Filter.tsx","app/pages/InvoiceDetails/Tables/Details/getDefaultFilters.ts","app/pages/InvoiceDetails/Tables/Details/index.tsx","app/pages/InvoiceDetails/Tables/InvoiceHistory/index.tsx","app/pages/InvoiceDetails/Tables/InvoiceHistory/Columns.tsx","app/pages/InvoiceDetails/Tables/InvoiceHistory/Filter.tsx","app/pages/InvoiceDetails/Tables/PayHistory/index.tsx","app/pages/InvoiceDetails/Tables/PayHistory/columns.tsx","app/pages/InvoiceDetails/Tables/PayHistory/Filter.tsx","app/pages/InvoiceDetails/Tables/Payments/index.tsx","app/pages/InvoiceDetails/Tables/Payments/Columns.tsx","app/pages/InvoiceDetails/Tables/RowHistory/index.tsx","app/pages/InvoiceDetails/Tables/RowHistory/Columns.tsx","app/pages/InvoiceDetails/Tables/RowHistory/Filter.tsx","app/pages/InvoiceDetails/index.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/Actions/WorkOrderActions.tsx","app/components/Forms/FormWorkOrderTypePicker.tsx","app/components/pickers/AutocompletePickers/WorkOrderTypeStatusPicker/index.tsx","app/components/Forms/FormWorkOrderTypeStatusPicker.tsx","app/components/Forms/FormRemindBeforePicker.tsx","app/components/pickers/AutocompletePickers/SymptomCodesPicker/index.tsx","app/components/Forms/FormSymptomCodesPicker.tsx","app/components/pickers/AutocompletePickers/RepairCodesPicker/index.tsx","app/components/Forms/FormRepairCodesPicker.tsx","app/components/pickers/AutocompletePickers/ReasonTypePicker/index.tsx","app/components/Forms/FormReasonTypePicker.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/CreationDetails/styles.ts","app/pages/WorkOrders/WorkOrderDetailsPage/Details/CreationDetails/index.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/WorkOrderForm/FormUnlimitedDowntime.tsx","app/components/pickers/AutocompletePickers/CustomFormPicker/index.tsx","app/components/Forms/FormCustomFormPicker.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/WorkOrderForm/WorkOrderComments.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/WorkOrderForm/WorkOrderLinks/AddCalibrationWorkOrder.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/WorkOrderForm/WorkOrderLinks/HoverLinkItem.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/WorkOrderForm/WorkOrderLinks/WorkOrderLinks.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/WorkOrderForm/index.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/WorkOrderForm/validationSchema.ts","app/pages/WorkOrders/WorkOrderDetailsPage/Details/index.tsx","app/components/pickers/StaticOptionsPickers/ScreenToShowOnPicker/index.tsx","app/components/pickers/StaticOptionsPickers/InvoiceStatusWithStaticOptionsPicker/index.tsx","app/pages/BillingActions/BillingActionsDetailsPage/Details/slice/types.ts","app/pages/BillingActions/BillingActionsDetailsPage/Details/slice/saga.ts","app/pages/BillingActions/BillingActionsDetailsPage/Details/slice/index.ts","app/pages/BillingActions/BillingActionsDetailsPage/Details/slice/selectors.ts","app/components/pickers/MultiSelectPickers/EmailAttachmentTypePicker/EATBaseURLMultiPicker/index.tsx","app/components/pickers/MultiSelectPickers/EmailAttachmentTypePicker/index.tsx","app/components/Forms/FormEmailAttachmentTypePicker.tsx","app/components/Forms/FormInvoiceStatusPicker.tsx","app/components/Forms/FormScreenToShowOnPicker.tsx","app/components/Forms/FormPaymentMethodEnumPicker.tsx","app/components/pickers/MultiSelectPickers/EmailRecipientTypesPicker/ERTBaseURLMultiPicker/index.tsx","app/components/pickers/MultiSelectPickers/EmailRecipientTypesPicker/index.tsx","app/components/Forms/FormEmailRecipientTypesPicker.tsx","app/pages/BillingActions/BillingActionsDetailsPage/Details/BillingActionsForm/index.tsx","app/pages/BillingActions/BillingActionsDetailsPage/Details/Actions/BillingActions_Actions.tsx","app/pages/BillingActions/BillingActionsDetailsPage/Details/index.tsx","app/pages/CoreSelectionPage/Table/getFilters.tsx","app/pages/CoreSelectionPage/Table/getDefaultFilters.ts","app/components/pickers/AutocompletePickers/PermissionLevelPicker/index.tsx","app/components/Forms/FormPermissionLevelPicker/index.tsx","app/components/pickers/AutocompletePickers/TimeSlotTypePicker/index.tsx","app/components/Forms/FormTimeSlotTypePicker/index.tsx","app/components/Forms/FormUserGroupsPicker/index.tsx","app/pages/CoreSelectionPage/SelectedBulkActions/UpdateUserGroupPermissions/UpdateGroupPermissions.tsx","app/pages/CoreSelectionPage/SelectedBulkActions/UpdateUserGroupPermissions/index.tsx","app/pages/CoreSelectionPage/SelectedBulkActions/GetSelectedActions.tsx","app/pages/CoreSelectionPage/Table/CoreSelectionTable.tsx","app/pages/CoreSelectionPage/Table/Columns.tsx","app/pages/CoreSelectionPage/slice/index.ts","app/pages/CoreSelectionPage/slice/selectors.ts","app/pages/CoreSelectionPage/CoreSelection.tsx","app/components/CheckBoxGroup/index.tsx","app/components/Forms/FormCheckBoxGroup.tsx","app/components/pickers/StaticOptionsPickers/EveryDaysPicker/index.tsx","app/components/Forms/FormEveryDaysPicker.tsx","app/components/pickers/StaticOptionsPickers/RepeatMonthlyBy/index.tsx","app/components/Forms/FormRepeatMonthlyByPicker.tsx","app/components/pickers/StaticOptionsPickers/RepeatPeriodPicker/index.tsx","app/components/Forms/FormRepeatPeriodPicker.tsx","app/components/pickers/StaticOptionsPickers/RepetitiveOptionsPicker/index.tsx","app/components/Forms/FormRepetitiveOptionsPicker.tsx","app/components/Forms/Schemas/RepititiveSchema.ts","app/components/Forms/FormRepetitive/index.tsx","api/UserTrainingApi.ts","app/pages/UserTrainings/TrainingDetailsPage/Details/slice/types.ts","app/pages/UserTrainings/TrainingDetailsPage/Details/slice/saga.ts","app/pages/UserTrainings/TrainingDetailsPage/Details/slice/index.ts","app/pages/UserTrainings/TrainingDetailsPage/Details/slice/selectors.ts","app/components/pickers/AutocompletePickers/TrainingReservationsPicker/index.tsx","app/components/Forms/FormTrainingReservationsPicker.tsx","app/components/Forms/FormTrainingLevelPicker.tsx","app/pages/UserTrainings/TrainingDetailsPage/Details/UserTrainingForm/UserTrainingComments/index.tsx","app/pages/UserTrainings/TrainingDetailsPage/Details/UserTrainingForm/index.tsx","app/pages/UserTrainings/TrainingDetailsPage/Details/index.tsx","app/pages/PriceSheetPeriodDetails/Details/slice/types.ts","api/PriceSheetApi.ts","app/pages/PriceSheetPeriodDetails/Details/slice/saga.ts","app/pages/PriceSheetPeriodDetails/Details/slice/index.ts","app/pages/PriceSheetPeriodDetails/Details/slice/selectors.ts","app/components/Forms/FormPriceSheetMethodPicker.tsx","app/pages/PriceSheetPeriodDetails/Details/PricePeriodsForm/index.tsx","app/pages/PriceSheetPeriodDetails/Details/index.tsx","app/pages/CalendarMessages/CalendarMessagesDetails/Details/Actions/CalendarMessagesActions.tsx","app/pages/CalendarMessages/CalendarMessagesDetails/Details/slice/types.ts","api/CalendarMessagesApi.ts","app/pages/CalendarMessages/CalendarMessagesDetails/Details/slice/saga.ts","app/pages/CalendarMessages/CalendarMessagesDetails/Details/slice/index.ts","app/pages/CalendarMessages/CalendarMessagesDetails/Details/slice/selectors.ts","app/pages/CalendarMessages/CalendarMessagesDetails/Details/CalendarMessagesForm/index.tsx","app/pages/CalendarMessages/CalendarMessagesDetails/Details/index.tsx","app/pages/CalendarPage/FiltersComponent.tsx","app/pages/CalendarPage/Scheduler/components/MultiToggle/index.tsx","app/components/FullScreenButton/index.tsx","app/pages/CalendarPage/Scheduler/components/FullScreenSchedulerButton/index.tsx","app/pages/CalendarPage/Scheduler/components/CalendarDatePicker/index.tsx","app/pages/CalendarPage/Scheduler/components/TimelineGroupByPicker/index.tsx","app/pages/CalendarPage/Scheduler/components/CalendarHeader/index.tsx","app/pages/MyAssetsPage/AssetsSelection/Filter.tsx","app/pages/MyAssetsPage/AssetsSelection/AssetsSelectionTable.tsx","app/pages/MyAssetsPage/AssetsSelection/slice/index.ts","app/pages/MyAssetsPage/AssetsSelection/slice/selectors.ts","app/pages/MyAssetsPage/AssetsSelection/RecentAssets.tsx","app/pages/MyAssetsPage/AssetsSelection/AssetsSelection.tsx","app/pages/MyAssetsPage/AssetsSelection/useAddNewActions.ts","app/components/pickers/StaticOptionsPickers/BarcodeLogStatusPicker/index.tsx","app/components/BasicTable/Filters/BarcodeLogStatusFilter/index.tsx","app/pages/AssetsInventoryLog/InventoryLog/GetFilters.tsx","app/pages/AssetsInventoryLog/InventoryLog/InventoryLogTable.tsx","app/pages/AssetsInventoryLog/InventoryLog/GetColumns.tsx","app/pages/AssetsInventoryLog/InventoryLog/index.tsx","app/pages/SavedViewsPage/SavedViewPage/Details/Actions/SavedViewActions.tsx","app/pages/SavedViewsPage/SavedViewPage/Details/SavedViewForm.tsx","app/pages/SavedViewsPage/SavedViewPage/Details/validationSchema.ts","app/pages/SavedViewsPage/SavedViewPage/Details/index.tsx","app/pages/SavedViewsPage/SavedViewPage/Details/Actions/RightTopActions.tsx","app/pages/InvoiceTemplates/InvoiceTemplatePopUp/PopUpListItems/index.tsx","app/pages/InvoiceTemplates/InvoiceTemplatePopUp/HtmlTextBox/index.tsx","app/components/Forms/FormColorPicker.tsx","app/pages/InvoiceTemplates/InvoiceTemplatePopUp/PreviewButton.tsx","app/pages/InvoiceTemplates/InvoiceTemplatePopUp/index.tsx","app/components/pickers/StaticOptionsPickers/EmailTypePicker/index.tsx","app/components/BasicTable/Filters/EmailTypeFilter/index.tsx","app/pages/EmailNotificationsPage/Filter.tsx","app/components/CustomForm/CustomFormSkeleton/index.tsx","app/components/CustomForm/QuizCustomForm.tsx","app/pages/QuizPage/StartQuiz/index.tsx","app/components/BasicChip/StatusChip.tsx","app/pages/WorkOrdersPage/Columns.tsx","utils/export.ts","app/pages/Samples/SamplesListPage/slice/saga.ts","app/pages/OtherServiceDetails/ReportConsumables/ConsumablesForm.tsx","app/pages/OtherServiceDetails/ReportConsumables/index.tsx","app/pages/ArticlesPage/AricleDatasetLink/index.tsx","app/pages/ArticlesPage/Columns.tsx","app/pages/Samples/EditableTable/Fields/StyledSelect.tsx","app/pages/Samples/components/TmtType/index.tsx","app/components/BasicTabs/BasicTab/index.tsx","app/components/BasicTabs/index.tsx","app/Layout/FrontendLayout/components/TopBar/ProfileMenu/EventsCount/index.tsx","api/assetQuickSearchApi.ts","app/components/AssetQuickSearch/slice/saga.ts","app/components/AssetQuickSearch/slice/index.ts","app/components/AssetQuickSearch/slice/selectors.ts","app/components/ListItemLink/index.tsx","app/components/AssetQuickSearch/AssetListItem/index.tsx","app/components/AssetQuickSearch/RecentWrappers/wrappers.tsx","app/components/AssetQuickSearch/RecentAssetsList/index.tsx","app/components/AssetQuickSearch/RecentItem/index.tsx","app/components/AssetQuickSearch/RecentSearchTermsList/index.tsx","app/components/AssetQuickSearch/MenuSearchItem/index.tsx","app/components/AssetQuickSearch/MenuSearchResultList/index.tsx","app/components/AssetQuickSearch/AssetSearchResultsByType/index.tsx","app/components/AssetQuickSearch/index.tsx","app/Layout/FrontendLayout/components/TopBar/ProfileMenu/messages.ts","app/Layout/FrontendLayout/components/TopBar/ProfileMenu/UserMenu/UserMenuButton.tsx","app/Layout/FrontendLayout/components/TopBar/ProfileMenu/UserMenu/index.tsx","app/Layout/FrontendLayout/components/TopBar/ProfileMenu/SwitchSites/index.tsx","app/Layout/FrontendLayout/components/TopBar/ProfileMenu/index.tsx","app/Layout/FrontendLayout/components/TopBar/components/ToggleSideMenuButton.tsx","app/Layout/FrontendLayout/components/TopBar/TopToolbar/index.tsx","app/components/GlobalServiceGroupFilter/TopGroupButton/index.tsx","app/components/GlobalServiceGroupFilter/CoreDashboardButton/index.tsx","app/components/GlobalServiceGroupFilter/styles.ts","app/components/GlobalServiceGroupFilter/CoreSelectionButton/index.tsx","app/Layout/FrontendLayout/components/TopBar/SubTopToolbar/index.tsx","app/Layout/FrontendLayout/components/TopBar/index.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarMenu/MenuItemComponent.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarMenu/HoverMenu.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarMenu/MenuItem.tsx","styles/CssVariables/styledVariables.ts","app/Layout/FrontendLayout/components/SideBar/SideBarMenu/index.tsx","app/components/BookitlabLogo/BookitlabShortLogo.tsx","app/Layout/FrontendLayout/components/SideBar/UserProfileMobile/index.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarHeader/index.tsx","app/Layout/FrontendLayout/components/SideBar/styles.ts","app/Layout/FrontendLayout/components/SideBar/SideBarFooter/index.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarQuickAction/index.tsx","app/Layout/FrontendLayout/components/SideBar/index.tsx","app/Layout/FrontendLayout/SideBarDrawer.tsx","app/Layout/FrontendLayout/styled/index.tsx","app/Layout/FrontendLayout/components/AdminPanel/index.tsx","app/Layout/FrontendLayout/index.tsx","app/hooks/useRequiredRedirectToCoreSelection.ts","app/pages/Samples/components/SamplesTable/index.tsx","app/pages/Samples/RequestSamplesPage/components/ServiceRequestCustomForm/index.tsx","app/components/PrintToPDF/PrintPDFSection.tsx","app/pages/Samples/components/EventBudgetPicker/index.tsx","app/pages/Samples/components/ReadonlyField/index.tsx","app/pages/Samples/components/Utils/index.ts","app/pages/Samples/components/ServiceRequestSubmissionDetails/index.tsx","app/pages/Samples/RequestSamplesPage/components/SubmitServiceRequestButton/index.tsx","app/pages/Samples/RequestSamplesPage/components/CancelServiceRequestButton/index.tsx","app/pages/Samples/components/ServiceRequestAddons/index.tsx","app/pages/Samples/components/ServiceRequestAddons/utils.ts","app/components/pickers/StaticOptionsPickers/ServiceRequestMilestoneStatusMenuPicker/index.tsx","app/pages/Samples/components/ServiceRequestMilestones/index.tsx","app/pages/Samples/components/ServiceRequestMilestonesSection/index.tsx","app/pages/Samples/RequestSamplesPage/components/CloneServiceRequestButton/index.tsx","app/pages/Samples/components/ServiceRequestRowsTable/components/AddServiceRequestRowButton/index.tsx","app/pages/Samples/components/ServiceRequestRowEditableCell/index.tsx","app/pages/Samples/EditableTable/Fields/DropDownList/index.tsx","app/pages/Samples/EditableTable/Fields/DropDownList/IWithAsyncOptions.tsx","app/pages/Samples/EditableTable/Fields/DropDownList/useAsyncOptions.tsx","app/pages/Samples/EditableTable/Fields/getCellComponent.tsx","app/pages/Samples/EditableTable/Fields/getReadonlyCell.tsx","app/pages/Samples/components/ServiceRequestRowsTable/getCustomFormTableColumns.tsx","app/pages/Samples/components/ServiceRequestRowStatusPicker/index.tsx","app/pages/Samples/components/ServiceRequestRowsTable/getTableColumns.tsx","api/odata/generated/enums/InternalServiceRequestRowStatus.ts","app/pages/Samples/components/ServiceRequestRowsTable/components/ServiceRequestComments/index.tsx","app/pages/Samples/components/ServiceRequestRowsTable/components/ServiceRequestRowsImport/index.tsx","app/pages/Samples/components/ServiceRequestRowsTable/components/BulkUpdate/index.tsx","app/pages/Samples/components/ServiceRequestRowsTable/components/ColumnsSelect/index.tsx","app/pages/Samples/components/ServiceRequestRowsTable/index.tsx","app/pages/Samples/RequestSamplesPage/components/QuoteSentToUserAlert/index.tsx","app/pages/Samples/RequestSamplesPage/components/SendQuoteButton/index.tsx","app/pages/Samples/components/ServiceRequestRowsTable/getServiceRequestRowSchema.ts","api/odata/generated/enums/InternalServiceRequestStatus.ts","app/pages/Samples/RequestSamplesPage/components/DownloadAllFiles/index.tsx","app/pages/Samples/RequestSamplesPage/index.tsx","app/components/PrintToPDF/getPrintPDFSections.tsx","app/pages/Samples/RequestSamplesPage/utils/validationSchema.ts","app/pages/EmailNotificationsPage/getNotificationsLogPageLocation.tsx","app/pages/Samples/RequestSamplesPage/getServiceRequestTitle.tsx","app/pages/ServiceRequestsKanbanPage/components/ServiceRequestCard/index.tsx","app/pages/ServiceRequestsKanbanPage/components/Kanban/index.tsx","app/Layout/FrontendLayout/components/ContentBox/index.tsx","app/pages/ServiceRequestsKanbanPage/index.tsx","styles/global-styles.ts","app/pages/NotFoundPage/Loadable.tsx","app/Layout/FrontendLayout/Loadable.ts","locales/i18n.ts","app/pages/AnimalTypesPage/Loadable.ts","app/components/DialogAlert/messages.ts","app/components/DialogAlert/slice/selectors.ts","app/components/DialogAlert/index.tsx","app/Layout/FrontendLayout/components/Snackbar/Loadable.ts","app/pages/Animals/InternalIdLoginPage/Loadable.ts","app/pages/AnimalsListPage/Loadable.ts","app/Layout/PosLayout/styles.ts","app/Layout/PosLayout/index.tsx","app/pages/Animals/AnimalCaseConsumablesPage/Loadable.ts","app/components/basic/Wrappers/FlexWrappers/flexColumn.tsx","app/Layout/LoginLayout/index.tsx","app/pages/Animals/AnimalsHomePage/Loadable.ts","app/pages/Animals/PrivateAnimalRoute/index.tsx","app/pages/Animals/CreateNewCasePage/Loadable.ts","app/pages/Samples/SamplesListPage/Loadable.ts","app/pages/Samples/RunDetailsPage/Loadable.ts","app/pages/Samples/RequestSamplesPage/Loadable.ts","app/pages/TrainingSessionsPage/Loadable.ts","app/pages/Buildings/Loadable.ts","app/pages/ReservationHistoryPage/Loadable.ts","app/pages/AddNewReportPage/Loadable.ts","app/pages/TrainingWaitingListPage/Loadable.ts","store/history.ts","app/pages/EmailNotificationsPage/Loadable.ts","app/pages/ExperimentTemplates/Loadable.ts","app/pages/UsersHistoryPage/Loadable.ts","app/pages/UserTrainingsPage/Loadable.ts","app/pages/NotAvailablePage/Loadable.ts","app/components/Routers/RestrictedRoute/index.tsx","app/pages/UsersPage/loadable.ts","app/pages/Animals/AnimalExtendedBillingReportPage/Loadable.ts","app/pages/UserTrainingHistoryPage/Loadable.ts","app/pages/OtherServicesPage/Loadable.ts","app/pages/BudgetsPage/Loadable.ts","app/pages/ServiceRequestListPage/Loadable.ts","app/pages/WorkOrdersPage/Loadable.ts","app/pages/Documents/Loadable.ts","app/pages/QuizPage/Loadable.ts","app/pages/QuizDetailsPage/Loadable.ts","app/pages/UserTrainings/TrainingDetailsPage/Loadable.ts","app/pages/Samples/SampleModificationsPage/Loadable.ts","app/pages/UsageHistoryPage/Loadable.ts","app/pages/Samples/RunsListPage/Loadable.ts","app/pages/Animals/AnimalCaseEditPage/AnimalCasesHistory/Loadable.ts","app/pages/SendEmailToUsers/Loadable.ts","app/pages/ChargesPage/Loadable.ts","app/pages/MyAssetsPage/Loadable.ts","app/pages/LocationsPage/loadable.ts","app/pages/LocationsPage/BuildingPage/loadable.ts","app/pages/LocationsPage/CampusesPage/loadable.ts","app/pages/LocationsPage/AreasPage/loadable.ts","app/pages/LocationsPage/LocationListPage/loadable.ts","app/pages/LocationsPage/SubLocationListPage/loadable.ts","app/pages/InvoiceBatches/Loadable.ts","app/pages/CategoriesPage/Loadable.ts","app/pages/CategoryGroupsPage/Loadable.ts","app/pages/BillingPreviewPage/Loadable.ts","app/pages/OnlineBudgetsStatusPage/slice/selectors.ts","app/pages/OnlineBudgetsStatusPage/slice/saga.ts","app/pages/OnlineBudgetsStatusPage/slice/index.ts","app/pages/OnlineBudgetsStatusPage/ChargeOnlineBudgetsButton/index.tsx","app/pages/OnlineBudgetsStatusPage/GenerateInvoicesButton/index.tsx","app/pages/OnlineBudgetsStatusPage/PayButton/index.tsx","app/pages/OnlineBudgetsStatusPage/GenerateInvoicesAndSendToSap/index.tsx","app/pages/AddPaymentPage/AddPaymentButton.tsx","app/pages/OnlineBudgetsStatusPage/useRowActions.tsx","app/pages/OnlineBudgetsStatusPage/index.tsx","app/pages/OnlineBudgetsStatusPage/columns.tsx","app/pages/OnlineBudgetsStatusPage/pageActions.tsx","app/pages/OnlineBudgetsStatusPage/getDefaultFitlers.ts","app/pages/InvoiceDetails/Loadable.ts","app/pages/WorkOrders/WorkOrderDetailsPage/Loadable.ts","app/pages/InvoiceBillingPage/Loadable.ts","app/pages/BillingActions/BillingActionsPage/Loadable.ts","app/pages/BillingActions/BillingActionsDetailsPage/Loadable.ts","app/pages/LocationsPage/LocationTypesPage/loadable.ts","app/pages/LocationsPage/SubLocationTypesPage/loadable.ts","app/pages/SavedViewsPage/SavedViewPage/Loadable.ts","app/pages/SavedViewsPage/SavedViewsPage/Loadable.ts","app/pages/LabelTypesPage/Loadable.ts","app/pages/AssetDetailsPage/Loadable.ts","app/components/LabelPrint/LabelPrintDialog/Loadable.ts","app/pages/KioskProjects/Loadable.ts","app/pages/KioskProjects/KioskProjectConsumablesPage/Loadable.ts","app/pages/KioskProjects/PrivateKioskProjectsRoute/Loadable.ts","app/components/SessionTimeout/SessionTimeout.ts","app/components/SessionTimeout/DialogAlert.tsx","app/components/SessionTimeout/index.tsx","app/pages/QuizSubmissionsPage/Loadable.ts","app/pages/QuizzesPage/Loadable.ts","app/pages/AdHocReportListPage/Loadable.ts","app/pages/RoomsPage/Loadable.ts","app/pages/CalendarMessages/CalendarMessagesPage/Loadable.ts","app/pages/CoresDirectoryPage/Loadable.ts","app/pages/Samples/SamplePlatesPage/Loadable.ts","app/Layout/FrontendLayout/components/HeadTitle/useTabTitle.ts","app/Layout/FrontendLayout/components/HeadTitle/index.tsx","app/pages/InstrumentRestrictionsPage/Loadable.ts","app/pages/LabelTypeDetailsPage/Loadable.ts","app/pages/ConfigurableColumnExportImport/Loadable.ts","app/components/Routers/ShortURLRoute/index.tsx","app/components/Routers/ServerBarcodesRoute/index.tsx","app/pages/NewMessagePage/Loadable.ts","app/pages/OtherServiceDetails/OtherServiceDetailsPage/Loadable.ts","app/pages/InvoiceTemplates/InvoiceTemplatesPage/Loadable.ts","app/pages/ExpensesPage/Loadable.ts","app/pages/PriceSheetPeriodsPage/Loadable.ts","app/pages/PriceSheetPeriodDetails/PriceSheetPeriodDetailsPage/Loadable.ts","app/pages/ArticlesPage/Loadable.ts","app/Layout/AccountLayout/Loadable.ts","app/pages/Account/Register/Loadable.ts","app/pages/CalendarPage/Loadable.tsx","app/hocs/withSaveAsLastVisitedPage.tsx","app/pages/ReservationDetails/ReservationDetailsPage/Loadable.ts","app/pages/HomePage/Loadable.tsx","app/pages/SystemPage/Loadable.tsx","app/pages/DashboardPage/Loadable.ts","app/pages/CoreSelectionPage/Loadable.ts","app/pages/CoreHomePage/Loadable.ts","app/pages/CoreStatsPage/Loadable.ts","app/pages/ReportingPage/Loadable.ts","app/pages/BookitLabDashboardPage/Loadable.ts","app/components/RedirectWithSearch/index.tsx","app/pages/MyAssetsPage/AssetsSelection/Loadable.ts","app/pages/TermsOfUseAgreementPage/Loadable.ts","app/Layout/FrontendLayout/components/Snackbar/SnackWrapper.tsx","app/pages/ActiveUserGroupPage/Loadable.ts","app/pages/CannedReports/Loadable.ts","app/pages/UserAttributes/UserAttributesPage/Loadable.ts","app/pages/OtherServiceDetails/ReportConsumables/ReportConsumablesPage/Loadable.ts","app/pages/LoginPage/Loadable.ts","app/pages/CalendarMessages/CalendarMessagesDetails/Loadable.ts","app/pages/ServiceRequestsKanbanPage/Loadable.ts","app/pages/OfflineServiceTypesPage/Loadable.ts","app/pages/Animals/AnimalCaseEditPage/Loadable.ts","app/AllIcons.ts","app/Layout/PublicAssetsLayout/index.tsx","app/pages/PublicAssets/Loadable.ts","app/pages/NotAllowedPage/Loadable.ts","app/pages/PlayGround/Loadable.ts","app/pages/AssetsInventory/Loadable.ts","app/pages/AssetsInventoryLog/Loadable.ts","app/pages/ServiceRequestAuditTrailHistoryPage/Loadable.ts","app/pages/FloorsPage/Loadable.ts","app/pages/SubscriptionTypesPage/Loadable.ts","app/pages/BudgetExperimentsPage/Loadable.ts","app/index.tsx","store/BarcodeScanner.ts","reportWebVitals.ts","app/components/MobileBarcodeScanner/index.tsx","index.tsx","store/configureStore.ts","store/reducers.ts"],"names":["translations","convertLanguageJsonToObject","json","objToConvertTo","current","Object","keys","forEach","key","currentLookupKey","obj","_index","require","__esModule","default","formatLongHE","date","formats","full","long","medium","short","defaultWidth","time","dateTime","log","getLogger","dateUtils","dateFnsUtils","DateIOFormats","dayOfMonth","fullDate","fullDateWithWeekday","fullDateTime","fullDateTime12h","fullDateTime24h","fullTime","fullTime12h","fullTime24h","hours12h","hours24h","keyboardDate","keyboardDateTime","keyboardDateTime12h","keyboardDateTime24h","minutes","month","monthAndDate","monthAndYear","monthShort","weekday","weekdayShort","normalDate","normalDateWithWeekday","seconds","shortDate","year","isToday","differenceInSeconds","differenceInMinutes","differenceInHours","differenceInDays","differenceInWeeks","differenceInMonths","differenceInQuarters","differenceInYears","differenceInCalendarDays","add","addSeconds","addMinutes","addHours","addDays","addWeeks","addMonths","addQuarters","addYears","startOfHour","startOfDay","startOfMonth","startOfQuarter","startOfYear","endOfHour","endOfDay","endOfMonth","endOfQuarter","endOfYear","endOfTomorrow","startOfTomorrow","startOfYesterday","endOfYesterday","startOfToday","lastDayOfMonth","getDaysInMonth","getDayOfYear","getYear","getMonth","getHours","getMinutes","getDate","setDate","setMonth","setYear","setHours","setMinutes","intervalToDuration","this","DateFnsUtils","s","split","x","y","undefined","toUpperCase","toLowerCase","locale","cultureName","systemFirstDayOfWeek","dateFnsCultureName","getLocale","options","weekStartsOn","console","error","culture","a","result","code","formatLong","v","parseISO","firstWeekContainsDate","localeFirstWeekContainsDate","toInteger","defaultFirstWeekContainsDate","localeWeekStartsOn","defaultWeekStartsOn","f","d","dateOrStringToDate","format","err","truncatedString","length","substr","isNaN","getTime","parse","formatDistanceToNow","addSuffix","timeFormat","dateFormat","representation","gfs","Date","formatDate","formatISO","convertedDate","value","fdow","startOfWeek","Array","from","map","e","i","startDate","endDate","months","getFullYear","firstDayOfWeek","endOfWeek","getDay","week","setWeek","day","setDay","values","set","FirstDayOfWeek","getWeekOfMonth","hoursMinutes","parseInt","CustomDate","toDate","meridiem","ampm","val","hours","ODataOperators","quoteODataValue","toString","escapeODataValue","isArray","join","Id","Error","replaceAll","withisInversed","condition","isInversed","Condition","field","operator","field1","c1","start","push","GreaterThanEqual","end","LessThanEqual","c","GreaterThan","LessThan","res","fieldName","name","String","Equals","NotEquals","Contains","ContainsM","resCM","Between","between","Intersection","intersection","Any","hasAny","NotAny","notAny","In","InM","inM","Includes","Excludes","AnyIn","anyIn","HasNoAny","haNoAny","All","all","AllIn","allIn","ODataFilterBuilder","predicates","globalServiceGroupFilter","stringColumns","stringSearch","isOptionalServiceGroup","filter","stringValue","p","concat","bookitColors","base","black","white","grayscale","blackRegular","blackComponents","graySubtitles","grayComponents","grayComponentsLight","grayBorders","graySelection","graybgComponents","grayBackground","grayBackgroundLight","overlays","overlayBlack","overlayWhite","primary","dark","hover","regular","components","componentsLight","borders","disabled","bgHover","background","bgLight","secondary","violet","danger","success","warning","UserProfile","settings","savedSettings","sett","find","index","Key","defaultSetting","Value","Enabled","Selected","UserName","Name","AdGroup","DefaultGroups","IsMultiple","StaffEnabled","comparator","selectSlice","state","appSettings","initialState","selectAppSettings","createSelector","selectKnownModules","Modules","selectKnownModule","knownModules","includes","selectDateFnsLocale","Globalization","Locale","selectUseAmPm","UseAmPm","selectSystemFirstDayOfWeek","selectWebVersion","WebVersion","selectUploadFileSizeLimit","UploadFileSizeLimit","selectMinimizedBookitlabLogo","MinimizedBookitlabLogo","defaultForbiddenFileExtensions","selectForbiddenFileExtensions","ForbiddenFileExtensions","selectLastCodeUpdate","LastCodeUpdate","selectAppTimeZone","TimeZone","selectPublicUrl","PublicBaseUrl","appendTrailingSlash","selectRegisterUserGroup","DefaultRegistrationGroup","selectOffsetDate","timeZone","systemOffset","TimezoneOffsetMinutes","correctDate","currentDateOffset","getTimezoneOffset","selectEmailFromAddress","UserRegistersToSpecificCores","UserRegistersToSpecificCoresType","UserRegistersToSpecificCores_NA","EmailFromAddress","selectExistingImages","ExistingImages","selectAuthenticatedUserObject","authenticatedUser","selectAuthenticatedUser","AuthenticatedUser","constructAuthenticatedUser","selectAssetFieldSettings","pickBy","AssetFieldSettings","IsPublic","selectAssetPopupSettings","assetFieldSettings","entries","Visible","DisplayName","selectIsFullScreen","isFullScreen","selectLoading","currentLanguage","isAuthenticated","loadingAppSettings","loadingSiteMapSettings","loadingUserProfileSettings","loadingSystemSettings","loadingAuthenticatedUser","selectLoadingUser","selectNotifications","notifications","selectGlobalSettingsObj","systemSettings","selectglobalSettings","GlobalSettings","selectGlobalSetting","globalSettingsObj","trim","AllowedSettings","selectImageExist","image","existingImages","some","selectGlobalSettingBool","selectSiteMapSettings","siteMapSettings","selectSiteMapProvider","siteMapProvider","SiteMapProvider","selectEventsCount","eventsCount","selectEventsCountLoading","loadingEventsCount","selectUserProfileSettings","userProfileSettings","selectUserProfileSetting","GetSettingByKey","selectIsSubBarCollapsed","isExpanded","subBarCollapsed","selectIsAuthenticated","updatedUserProfileSettings","selectIsExpandedSideBar","updatedExpandState","isMobile","expanded","GetSideBarExpanded","selectGlobalServiceGroupFilter","topServiceGroupsIsHidden","selectShowGlobalServiceGroupFilter","showGlobalServiceGroupFilter","selectShowGlobalServiceGroupsAsList","showGlobalServiceGroupsAsList","selectBarcodeScanTarget","barcodeScanTarget","selectShowAllCores","showAllCores","selectReservationStatuses","KnownModules","UserGroupCoordRole","AllowWorkflowBooking","MultipleTentativeReservationsUnderWorkflowBooking","DraftReservationsEnabled","t","GetListItem","ReservationStatus","list","Approved","Pending","PendingCoord","Cancelled","CancelledByAdmin","Tentative","Draft","URLSearchParamsCI","params","URLSearchParams","append","delete","get","other","b","GetRawValue","setisInversedForUrl","isInversedPrefix","findIsfilterInversed","search","startsWith","isFilterInversed","definedVal","hasprefix","substring","GetNumberOrUndefined","rawValue","number","GetStringOrUndefined","getStringUnionOrUndefined","unionArray","toLocaleLowerCase","GetBooleanOrUndefined","GetDateOrUndefined","type","parseQueryStringDate","GetPartialEntity","id","GetEnum","enumObject","enumToEntityArray","numValue","tryParseInt","item","GetBooleanEntity","Yes","No","initPickerValue","additionalOptions","additionalItem","option","Promise","resolve","failureResult","data","verifiedData","initExPickerValue","sourceUrl","withoutServiceGroups","initMultiExPickerValue","separator","serviceGroups","ids","additionalItems","every","initMultiPickerValue","getPeriodTypeNameOrUndefined","lowered","namedValue","ALL_PERIOD_TYPES","num","getDefaultFilterDatePeriod","periodTypeFieldName","customStartFieldName","customEndFieldName","periodType","isNullOrUndefined","PresetDatesRange","Custom","fromType","presetDatesRangeToQueryString","formatQueryStringDate","getDefaultFilterNumberPeriod","NumebersRangeToQueryString","startFieldName","endFieldName","formatQueryStringDateValue","serializeValue","defaultSerializer","arrayToQueryString","stringValues","arrayByNameEntityNumberToQueryString","getStringEntityArray","allSearch","splitFilterValue","allEntities","getNumberEntityArray","getNumberEntityArrayFromString","assetRangeSerializer","fieldname","isAssetRangeType","unitType","getAssetRange","valOrNull","parseFloat","getSplitNumberArray","indexOf","joinArray","Icon","React","ref","icon","color","colorExtend","info","props","iconName","theme","useTheme","defColor","getColor","WithTitle","children","title","axios","defaults","baseURL","process","timeout","isStatusOK","status","httpClient","cancelToken","CancelToken","url","response","config","put","post","patch","payload","requests","r","rootedPathWithSearch","toRootedURL","pathName","method","atomicityGroup","URL","window","location","origin","headers","uniqueId","body","responses","urls","batch","file","formData","FormData","responseType","Accept","FormRightSection","isCover","DetectIsMobile","sidePanelExpanded","useSelector","selectExpandedSidePanel","sidePanelOpen","selectSidePanelOpen","showShortView","className","clsx","shortView","StyledForm","onSubmit","avoidStyles","sectionStyle","noPadding","StyledFormFieldsContainer","SettingsApi","$select","names","enumStringKeys","$filter","doPrefetchConfigurableColumns","select","authSet","ScreensId","CoresDirectory","ReservationHistory","UserTraining","m","Instruments","UpcomingTrainingSessions","ServiceRequests","MyAssets","Alerts","MaintenanceAssets","noAuthSet","PublicAssets","screenId","GetCachedConfigurableColumnsData","ConfigurableTypes","ColumnScreenConfig","getAppSettings","getAuthenticatedUser","doSetIsAuthenticated","setLanguage","getSiteMapSource","doNavigate","getEventsCount","getUserProfileSettings","getSystemSettings","getLoginSystemSettings","updateUserProfileSettings","doUpdateExpandedState","doLoadGlobalServiceGroupFilter","doSaveGlobalServiceGroupFilter","doSaveUserProfileSetting","doSaveFilter","doSavePageSize","doSaveCardsMode","doUpdateMyListSelected","doBarcodeScan","handleFullScreenChange","doEnterFullScreen","doExitFullScreen","doSetBarcodeScannigTarget","doShowAllCores","doCollapseSubBar","getAppSettingsFromSaga","action","call","actions","appSettingsLoaded","changeLanguage","loadSystemSettings_Success","noAuthSettings","loadError","message","user","LoginType","LoginTypes","Password","getAuthenticatedUser_Success","Roles","LargeAnimalsOperatingRoomTechnician","internalIdLoginActions","setIsAuthenticated","replace","getAuthenticatedUser_Error","IsAuthenticatedChanged","language","l","i18next","setLocale","languageChanged","siteMap","loadSiteMapSettings_Success","debug","loadSiteMapSettings_Error","href","count","loadEventsCount_Success","loadEventsCount_Error","delay","loadUserProfile_Success","loadUserProfile_Error","loadSystemSettings_Error","loadLoginSystemSettings_Success","loadLoginSystemSettings_Error","withDelay","GetSettingByKeyOrDefault","assign","model","requestURL","updateUserProfile_Success","updateUserProfile_Error","updateExpandedState_Success","updateExpandedState_Error","loadGlobalServiceGroupFilter_Success","selection","addNotification","variant","SwitchedTo","httpPaload","equals","navigate","updateMyList","MIN_LENGTH_DEFAULT","MinBarcodeLength","minBarcodeLengthString","scannTarget","ScanTarget","BarcodeScanModalBody","scanResult","parseBarcode","BarcodeNotFoundEx","ScanTemplateResult","Asset","Internal","External","InternalCode","getRoomByExternalBarcode","roomId","roomid","barcode","$top","document","fullscreenElement","enterFullScreen_Success","exitFullScreen_Success","selector","documentElement","querySelector","fullScreenElement","requestFullscreen","exitFullscreen","barcodeScannigTarget_Success","setShowAllCores","setCollapseSubBar","takeLatest","loadAppSettings","loadSiteMapSettings","loadEventsCount","loadUserProfileSettings","updateExpandedState","loadGlobalServiceGroupFilter","saveGlobalServiceGroupFilter","saveUserProfileSetting","saveFilter","loadSystemSettings","loadLoginSystemSettings","savePageSize","updateMyListSelected_Local","BARCODE_SCANNED","saveCardsMode","fullScreenChannel","eventChannel","emitter","addEventListener","removeEventListener","takeEvery","takeLeading","enterFullScreen","exitFullScreen","setBarcodeScannigTarget","collapseSubBar","notificationsCount","slice","createSlice","reducers","Language","findIndex","splice","addNotifications","removeNotification","array","keyFn","upsert","itemIndex","updatedItem","userNodes","ChildNodes","flat","element","reactUrl","pathname","Url","ss","LoginScreenCompanyLogo","LoginScreenCompanyLogoLink","LoginScreenCompanyLogoHeight","ShowForgotPassword","Help_Login","updateExpandedState_Local","saveGlobalServiceGroupFilter_Success","setShowGlobalServiceGroupsAsList","enterFullScreen_Error","exitFullScreen_Error","barcodeScannigTarget_Error","appSettingsActions","useAppSettingsSlice","useInjectReducer","reducer","useInjectSaga","saga","Button","processing","size","component","to","dispatch","useDispatch","appActions","absolutePath","path","handleClick","onClick","toto","toLocationDescriptor","disableRipple","disableFocusRipple","disableTouchRipple","event","capitalize","startIcon","endIcon","H1","H2","H3","H4","Body","bold","bodyVarian","Caption","captionVarian","Uppercase","Tips","tipsVarian","InputLabel","inputLabelVarian","InputValue","inputValueVarian","ButtonLabel","buttonLabeVarian","isAbsoluteURL","urlString","schema","query","cpath","tryCleanASPRoot","rootedpath","isRooted","basePath","trimEnd","trimStart","combine","toQueryString","buildURL","endsWith","useAbsolute","toPath","publicUrl","getExportParameters","$format","getExportForImportParameters","openExportLinkOld","open","openExportLink","cd","filename","fileDownload","odataUrlPrefix","getReturnURL","defaultReturnURL","returnURLKey","downloadFile","decodeURIComponent","defaultFileName","anonimusUrls","parseBarcodeURL","assetScanned","regExpTemplate","AssetBarcodeRelativeUrlTemplate","toCompareUrl","internalCode","regObject","RegExp","exec","groups","resUrl","parseAssetUrl","subLocationScanned","SubLocationBarcodeRelativeUrlTemplate","subLocationId","locationId","RoomId","locationid","sublocationid","SubLocation","LocationId","SubLocationId","parseSubLocationUrl","locationScanned","LocationBarcodeRelativeUrlTemplate","Location","parseLocationUrl","roomScanned","RoomBarcodeRelativeUrlTemplate","Room","parseRoomUrl","external","lazyLoad","importFunc","selectorFunc","opts","fallback","lazyFactory","then","module","LazyComponent","lazy","RenderPageType","IconButton","shape","target","stopPropagation","doOpenSidePanel","doOpenAdminPanel","layoutSaga","selectHasNotSavedChanges","isChangesNotSaved","setContinueState","continue","setConfirmOpen","resetSidePanel","setTuggleOpenState","selectAdminPanelOpen","resetAdminPanel","setAdminPanelUrl","setAdminPanelOpen","openSidePanel","openAdminPanel","sidePanelState","pageType","pageProps","coverOpen","coverExpanded","confirmState","confirmOpen","approved","rejected","showLocalConfirm","continueToLink","hasAnyNotSavedChanges","doRefreshTable","continueState","continueOnApprove","hideNavigation","actionTableProcessing","upsnackbarIndex","isMobileView","adminPanelState","adminPanelOpen","toggleSidePanel","setPageType","setPageProps","setExpanded","resetConfirmState","setConfirmApproved","setConfirmRejected","setContinueToLink","setNotSavedChanges","setRefreshTable","setActionTableProcessing","setLocalConfirm","setContinueOnApprove","setHideNavigation","resetContinueState","setUpSnackBarIndex","setIsMobileView","setIsCoverOpen","setIsCoverExpanded","layoutActions","useLayoutSlice","Box","layout","selectSidePanelState","selectPageType","selectPageTypeProps","selectConfirmOpen","selectConfirmApproved","selectConfirmRejected","selectDoRefreshTable","selectContinueState","selectContinueToLink","selectHideNavigation","selectSnackBarIndex","selectIsMobileView","selectActionTableProcessing","selectProcessingIndicator","methodName","selectIsCoverOpen","selectIsCoverExpanded","selectAdminPanelUrl","isEmptyOrWhitespace","toUndefinedIfEmptyOrWhitespace","toLowerCaseSafely","notUndefined","toNumberOrNull","EnumAssetTypes","IsBudgetFieldEnabled","setting","BudgetField","BudgetFieldSettings","bf","Disabled","IsModuleEnabled","IsAssetFieldEnabled","AssetField","AssetAvailabilityType","AssetAttributes","AssetTypes","IsAssetFieldIsPublic","IsAssetImageExist","imageName","imageSize","getOffsetDate","GetAssetTypeFrom","availability","AvailabilityTypes","NotAvailable","AvailableNotBookable","FreelyBookable","LoanableEquipment","ServiceRelated","ServiceGroup","SuperGroup","RequestRelated","TrainingProgram","LectureRoom","keyValue","TryGet","GetString","typeEnum","getDefault","checkIsMobile","useIsMobile","GetBrowserInfo","rdd","AutocompletePicker","label","loadData","filterOptions","onChange","mini","isOpen","disableClearable","style","fullWidth","noOptionsText","required","ariaLabel","propsLoading","loading","freeSolo","handleInputChange","additionalSearchTerm","renderOptionName","getOptionLabelName","inputProps","autoFocus","autoHighlight","autoComplete","autoSelect","blurOnSelect","clearOnEscape","includeInputInList","selectOnFocus","disableListWrap","filterSelectedOptions","disableCloseOnSelect","openOnFocus","setSomeOpen","ListboxProps","useTranslation","classes","autocompleteStyles","extClasses","autocompleteExtendStyles","timerRef","firstOpen","setOpen","setOptions","searchTerm","setSearchTerm","hasSelected","setSelected","firstMounted","setFirstMounted","useEffectOnMount","handleSelectText","setSelectionRange","clearTimeout","setLoading","doload","active","rawResponse","extractDataFromResponse","optionsData","loadDataAndPrepareOptions","Autocomplete","onOpen","onPickerOpen","onClose","reason","details","multiple","onInputChange","newInputValue","getOptionSelected","getOptionDisabled","getOptionLabel","NA","renderOption","text","highlight","matches","match","parts","part","highlightSearchTerm","inputValue","root","tag","tagSizeSmall","inputRoot","input","inputFocused","endAdornment","clearIndicator","popupIndicator","popupIndicatorOpen","paper","listbox","noOptions","groupLabel","groupUl","extendRoot","onBlur","popupIcon","closeIcon","renderInput","BaseTextField","placeholder","AllValues","helperText","onFocus","setTimeout","InputProps","CircularProgress","position","right","top","InfoIcon","infoIcon","infoWidthPlus","infoWidthMinus","Tooltip","themeColor","headTitle","arrow","interactive","popper","ServiceType","boldS","fontFamily","fontSize","fontStyle","lineHeight","fontWeight","letterSpacing","bodyS","tipsRegular","inputLabelM","inputLabelXS","inputValueS","buttonM","buttonS","bookitTypography","h1","h2","h3","h4","subtitle1","subtitle2","boldL","boldM","bodyL","bodyM","captionBold","captionRegular","uppercase","textTransform","tipsBold","inputValueM","typographyComponentMapping","useReducer","useSaga","BasicTypography","italic","MAX_TOP","getAutoCompleteLoadDataFn","idPropertyName","DisplaynamePropertyName","basePredicates","expand","transformModel","useSearchOrPredicate","queryString","maxTop","dynamicPredicates","$orderby","uniq","$expand","more","limit","unshift","nonSelectableOptions","ShowingFirstXRecords","maxRecordsLimit","isNumber","onlyStringReducer","nums","reduce","enumToDescriptedArray","enumeration","Number","description","tryGetName","tFunction","GetTFunction","i18n","isInitialized","getFixedT","ns","defaultNS","toEntityEnumArray","prefixKey","OriginalName","GetOptionsFilterFunction","items","customSearch","enumToArray","effect","FundingTypes","RecurringReservationUpdateOptions","ReservationRepeatPeriods","ReservationRepeatMonthlyTypes","getSingleReservationStatus","useAsyncExtendedState","useState","setState","useMemo","nextState","initialNextState","mounted","partialState","initialExtendState","removeHtml","tryParseWithoutNaN","tryParse","tryParseFloat","tryParseBool","isNumericPositive","test","ExternalLink","LinkBehavior","Link","useInlineUrl","rest","history","useHistory","useStyles","emptyLink","localPath","handleLocalPathClick","showIcon","externalLinkRoot","link","CopyURL","clipboardWrite","URLCopied","makeStyles","whiteSpace","cursor","externalLinkIcon","display","clipboardWriteEnabled","navigator","permissions","clipboard","writeText","copyResult","useSystemDate","appTimeZone","currentTimezoneOffser","getOffset","useCallback","newDate","parsedDate","getOffsetDateOrNull","localDate","withoutOffset","withOffset","CoverWrapper","height","Dialog","maxWidth","coverShortRoot","hideBackdrop","scroll","disableAutoFocus","LinearProgress","styled","visible","TitleRoot","paddingTop","flexDirection","alignItems","width","gap","justifyContent","alignSelf","padding","spacing","flex","Head","closable","useSidePanel","closePanel","pageName","titlePage","pageLink","titleTooltip","disableExpandToggle","expandPanel","subTitlePage","leftTopActions","rightTopActions","showProcessing","useSwithActions","switchState","rightTopActionsLength","rightActionsLoading","actionsLength","SkeletonIfLoading","cover","aria-label","ShowLess","TitlePage","buttonsLenth","tooltip","Skeleton","backgroundColor","ReactActions","ot","ind","keepOpen","SwitchActions","getProps","Close","ShortTitleRoot","ShortHead","toPageLink","rightTopActionsAsMenu","useShortView","hideMenu","topIconsLength","absolutePageLink","toExpandPanel","CloseSidePanel","TopButtonsContainer","ButtonsPanel","leftActions","rightActions","leftActionsMaxLength","MoreOptionsMobile","iconVariant","paddingInline","TopButtonsPanel","maxLeftTopButtonsLength","leftActionsLoading","getRandomWidth","Math","random","toFixed","ButtonsSkeleton","FormSkeleton","overflow","fullPage","PageWrapperRoot","minWidth","overflowY","boxShadow","palette","common","borderRadius","bookitShadows","shadowBorderTop","PageWrapper","closeSidePanel","confirm","closeCover","useSwitchActions","topProcessing","hideTitleBar","coverClosed","isCoverOpen","collapsedBar","isCovered","isCoverClosed","setIsCoverClosed","covered","baseRootUsePanelHeight","baseRootUsePanelShortHeight","baseRootHeight","subBarExpanded","baseNavigationHeight","contentRoot","contentMobRoot","assertExhaustive","offlineServiceState","selectProcessing","selectInitConsumablesProcessing","consumablesProcessing","selectService","detailsState","selectServiceHasError","hasErrors","selectServiceCompleted","completed","selectConnectedInitState","connectedDataState","selectServiceChangeState","serviceChangeResultState","selectFieldHandler","valueHandler","selectCreditState","creditState","selectCredit","selectCreditProcessing","selectCreditCompleted","selectHasCharges","hasCharges","selectConsumablesState","consumablesState","selectSavedReservationService","savedReservationService","selectConsumablesData","selectConsumablesHasErrors","selectConsumablesCompleted","selectConsumablesValueHandler","consumablesValueHandler","selectSelectedServiceType","selectedServiceTypes","selectEditCreatableService","editCreatableService","selectBarcodeScanned","barcodeScanned","selectRefreshConsumableServices","refeshOfflineServices","selectStockRenewalsState","stockRenewalState","selectStockRenewalProcessing","selectStockRenewalData","selectStockRenewalHasErrors","selectStockRenewalCompleted","selectStockRenewalValueHandler","stockRenewalValueHandler","selectRenewStockState","renewStockState","selectRenewStockProcessing","selectRenewStockData","selectRenewStockHasErrors","selectRenewStockCompleted","selectRenewStockValueHandler","renewStockValueHandler","selectIsEdit","isEdit","selectInventoryBatchState","inventoryBatchState","selectInventoryBatchProcessing","selectInventoryBatchData","selectInventoryBatchHasErrors","selectInventoryBatchCompleted","selectInventoryBatchValueHandler","inventoryBatchValueHandler","selectInventoryBatchIsEdit","batchIsEdit","selectInventoryBatchEditable","inventoryBatchEditable","selectCreatableService","getCreatableService","reservation","selectReservationState","selectReservation","selectReservationProcessing","selectReservationHasError","selectReservationCompleted","selectReservationData","selectReservationSettings","reservationSettingsState","selectEquipmentsSettings","equipmentsSettingsState","selectConfirmAssistedReservations","confirmAssistedReservations","selectUserTrainingData","trainingsData","selectRequestedValueFor","requestedValueFor","selectEquipmentChangeState","requestedValue","equipmentChangeResultState","selectEquipmentChangeCompleted","isChangeCompleted","selectAsyncChangeLoading","asyncChangeLoading","selectTransferState","transferState","selectTransferProcessing","transferProcessing","selectTransferStepCompleted","transferStepCompleted","selectTransferToUser","User","selectTransferReservation","ReservtionId","selectTransferWaitingApproval","WaitingTransferApproval","selectSavedOfflineServices","savedOfflineServices","selectRefreshOfflineServices","refeshOfflineService","selectTerminateState","terminationState","selectTerminateProcessing","terminatProcessing","selectTerminateCompleted","terminateCompleted","selectCloneReservations","cloneReservation","selectReservationDtoState","reservationDtoState","selectSavedForLater","SaveForLater","selectIsCreditSubmited","submitCredit","selectByApprovalErrors","ByApprovalErrors","selectRefreshWorkOrderLink","refreshWorkOrderLink","EntityNumberSchema","Yup","ensure","EntityStringSchema","CheckEntityShema","defined","checked","inventoryBatchesSchema","of","ServiceGroupEntitySchema","ServiceGroupId","ServiceTypeId","Active","HideProjects","IntQuantityOnly","UnitTypeID","nullable","UnitTypeName","AllowToUser","Inventory","DefaultQuantity","notRequired","ReservationOverlappingInventory","IsAdmin","AllowedBudgets","StaffOnly","BudgetsTurnedOn","NotLessThanZero","TrackInventory","InventoryBatchesEnabled","InventoryBatches","BudgetEntitySechema","BudgetExperimentEntitySechema","InstituteProjectEntitySechema","PaymentMethodEntitySchema","UserEntitySchema","OnlineServiceEntitySchema","OfflineServiceTypeEntitySchema","FeeTypeEntitySchema","UserGroupEntitySchema","ServiceTypeSchema","createSliceOriginal","DialogConfirm","confirmButtonLabel","cancelButtonLabel","onConfirm","onCancel","subtitle","confirmTitle","managedState","handleClose","handleConfirm","btnActions","Confirm","Cancel","isopen","PaperProps","ExportTypes","ColumnTypesArray","ServiceRequestTableColumn","columnDto","isAdmin","IsColumn","Options","ColumnType","isRequired","Label","Index","Required","ParentId","SizeLimit","Description","DisplayType","CopyPrevValues","CustomRoles","UserSelectionType","FixedRoles","Parent","Children","isColumnRequired","createOptions","parentFieldName","getParentFieldName","parent","getFieldName","columnId","ServiceRequestTableColumnsCollection","columnsData","VisibleToAdminOnly","columnsObj","columns","column","keyBy","AssignParent","requestSamples","selectRequestSamples","selectServiceRequestStatuses","ServiceRequestStatuses","selectServiceRequestRowStatues","ServiceRequestRowStatuses","selectSubmitting","submitting","selectServiceRequestStatusesByInternalId","serviceRequestInternalStatus","InternalStatusId","selectServiceRequestId","serviceRequestId","selectRequestDetails","RequestDetails","selectCommentIsInternal","CommentIsInternal","selectRequestDetailsData","selectServiceRequestCustomForm","FormValues","selectServiceRequestCustomTable","Rows","selectServiceRequestFormData","formValues","rows","selectRequestDetailsFieldsState","fieldsState","selectServiceRequestDetailsFieldState","Service","selectStatus","Status","selectCreatedFor","CreatedFor","selectIsServiceRequestAdmin","isOwner","isEditable","Administrators","IsAdminOf","ServiceId","Sample","internalStatusId","selectSamplesTableState","SamplesTableState","selectSamplesData","RequestSamples","selectImportState","ImportState","selectSelectedSamples","SamplesSelected","selectCustomForm","CustomForm","selectCustomFormFields","FormFields","selectServiceRequestCustomFormColumns","customForm","selectServiceRequestCustomFormFields","selectServiceRequestMilestones","Milestones","selectServiceRequestMilestoneProcessing","milestoneProcessing","selectServiceRequestSidePanel","SidePanel","ServiceRequestRows","fromDtoValue","formValueDto","tryFormatIso","DisplayValue","selectServiceRequestRowInsertStatus","createServiceRequestRowStatus","FormTextField","useField","meta","useSidePanelState","onReject","confirmRejected","confirmApproved","continueToOther","continueLink","setCover","setCoverClosed","onCloseCover","showConfirm","openPanel","renderPageType","renderPageProps","RepetitiveOptions","RepeatPeriod","RepeatMonthlyBy","GetRepetitiveOptions","dayName","getDayText","weekName","WorkWeekDays","getWeekNumberOfMonth","weekDays","getLongDaysArray","RepeatWeeklyOn","RepeatMonthlyOn","RepeatEveryWeekDay","TopActionButton","customIcon","noChangeOnMobile","isIconButton","starticon","endicon","BaseOptionsPicker","getOptions","createFilterOptions","ignoreAccents","ignoreCase","stringify","FormikField","fullRow","hide","minRow","FormikSection","fields","order","avoidRenderSection","titleSection","FormListener","onFormChange","useFormikContext","setFieldValue","isValid","dirty","setFieldTouched","validateField","setFieldError","validate","SubmittingHandler","resetSubmitting","setSubmitting","FieldHandler","run","fieldKey","fieldValue","shouldValidate","resetFieldState","additionalFunc","useFieldChangeHandler","changeField","FieldValue","setValue","resetValueKey","getFieldMeta","styles","createStyles","zIndex","left","getPeriodTypesEntity","valueType","getPeriods","getPeriodTypesEntityById","Handlebar","sanitizeHtml","customFormAst","template","compileHandlebarsTemplate","ast","ReplaceMutatingVisitor","accept","replacementStatement","_replacementStatement","_path","mutating","mustache","original","ExtractPathsVisitor","paths","canEditReservation","row","IsAdminOrOwnerOf","scheduler","selectScheduler","selectEvents","events","selectSchedulerOfflineHours","viewState","offlineHours","selectTrainingSessions","trainingSessions","selectSchedulerViewState","selectSchedulerDateTs","selectSchedulerViewType","viewType","selectNonWorkingHours","nonWorkingHours","selectSchedulerTempEvents","tempReservations","selectLoadedServices","selectedServices","selectSchedulerServicesLimit","services","globalSettings","limitKey","limitString","selectSchedulerFilters","filters","selectWithReservationsOnly","selectSchedulerServicesLimitReached","limitNumber","selectSchedulerSelectedServices","selectSchedulerDerivedServices","derivedServices","selectMappedReservations","mapEvents","reservation_id","start_date","StartTime","end_date","EndTime","EquipmentColor","service_id","EquipmentId","service_name","EquipmentName","selectMappedOfflineHours","offline","alert_id","AlertId","offline_id","selectMappedTrainingSessions","ReservationId","trainingsession_id","selectMapped","selectSchedulerParseEvents","mappedEvents","TrainingSignUp","readonly","notClickable","Online","UserId","BookedById","Restricted","allowedToViewAlert","ReportedBy","_no_resize_end","_no_resize_start","_no_drag_move","selectSchedulerServices","WithReservationsOnly","servicesWithEvents","Set","service","has","filterServicesByEvents","serviceGroupIds","filterServicesByServiceGroups","selectSchedulerPreviousViewState","previousViewState","selectMultipleModeState","MultipleInstrumentReservations","selectSelectedSavedView","multipleInstrumentsSetting","currentSelected","userProfile","NotAllowed","instrumentMultipleEnabled","GetSettingValueBy","Multiple","AllowedDefaultMultiple","selectSchedulerViewStartDate","getViewStartDate","viewLength","customStart","selectSchedulerViewEndDate","getViewEndDate","customDays","selectSchedulerViewCustomStart","selectNotUseLocation","notUseLocation","selectEmptySlotAdminClick","emptySlotAdminClick","selectSchedulerNewEventServices","tempReservation","getSingleServiceEventServices","selectTwoDaysTimelineButtonEnabled","GetBoolean","selectCustomDaysTimelineButtonEnabled","selectSelectedReservationEvents","selectedReservationEvents","selectDefaultCustomDaysTimelineValue","daysString","selectSchedulerReservationBodyTemplate","SchedulerReservationBodyTemplate","selectSchedulerReservationTooltipTemplate","SchedulerReservationTooltipTemplate","selectCalendarReservationColumns","EquipmentAssemblies","t1","t2","workflowBooking","reservationHistorySelectArray","union","selectSchedulerLoadingEvents","loadingEvents","selectTimelineGroupBy","groupBy","selectExportToPDF","exportToPDF","SnackBarActionType","SnackBarMessageType","RequiredTypes","DisplayTypes","formFileSchema","Size","PostedFile","formValueSchema","FormFieldId","Readonly","SourceValueId","AlertTypeId","CustomFormId","CustomFormName","RequestId","ExperimentItemId","BudgetExperimentId","ServiceGroupUserId","ParseFormFieldEnums","formFields","ff","DeserializeValue","formField","formValue","Type","ddlValue","getDropDownInitValue","SerializeValue","objects","members","object","member","instanceOfIFormValueType","fileValue","getFieldSchema","fileSize","notAllowedExt","when","RequiredFieldToCompare","DependencyFieldId","is","context","exclusive","min","files","blockedTypes","lookup","allowedExt","getCustomFormDateSchema","email","max","singleResult","multipleResult","RequiredValueToCompare","comparedValue","getParentValue","isDependencyVisible","DependencyValue","valueTocompare","parentValue","DependencyMultiple","DependencyVisibility","vp","pv","vf","hasOwnProperty","getFieldsVisibilities","visibleOnCompletion","visibilities","visibleOnComletion","AlwaysVisible","VisibleToUserOnDoneRequest","isVisible","useCustomFormSchema","getCustomFormInitialValues","startQuiz","initialValues","orderFields","next","serializeValues","serialized","serializeCustomFormRowValue","getCustomFormColumnSchema","baseSchema","integer","getCustomFormColumnBaseSchema","fullActiveUrl","adminsUrl","budgetExperimentsUrl","initUserData","urlType","$skip","initUrl","UserPicker","selectArray","AllUsers","ServicesFilter","budgetExperimentEnabled","userGroupId","budgetId","HideProject","AdminServicesFilter","serviceItems","groupIds","groupsF","servF","initAssigneeAdminUsers","AssignedToCoreAdmin","AssignedToInstrumentAdmin","AssignedToLabTech","reject","usePromise","asyncFunction","isCancelled","useRef","isUnmounted","callAsyncFunction","promise","cancel","fulfillPromise","reset","stateWithReset","useEffect","shortDateTimeFormat","DatesRange","fromPreset","st","et","bookable","bookableAndnotbookable","servicesRelated","initAssetsData","initval","byService","serviceTypes","admin","types","AssetsFilterForWorkOrder","orederType","Groups","AssetCats","AssetsFilterForCalibrationWorkOrder","selectedIds","AssetsFilterForSavedView","topServiceGroups","AssetsPicker","defaultValue","restrictByAvType","showOnlyActiveAssets","avFilter","getAvFilter","innerLoadData","doInit","doLoadRequestDetails","doRefreshRequestDetails","doLoadFormValues","doSaveFormValue","doLoadSamples","doLoadServiceRequestRows","doLoadMilestones","doCreateSample","doUpdateServiceRequestSampleField","doUpdateServiceRequestRowValue","doImport","doDeleteSamples","doPatchRequestDetails","doUpdateStatus","doUpdateServiceRequestRowStatus","doUpdateBudget","doSubmit","putErrorMessages","doCancelServiceRequest","doInsertMilestoneCharge","doDeleteServiceRequestMilestoneCharge","doUpdateMilestoneCharge","doInsertMilestone","doDeleteMilestone","doUpdateMilestone","doCloseSidePanel","doCloneServiceRequest","doCreateServiceRequestRow","doLoadServiceRequestRowStatuses","requestSamplesSaga","statuses","initServiceRequestStatuses_Success","requestDetails","loadRequestDetails_Success","omit","loadFormValues","RequestMilestones","requestMilestones","MilestonesAddonsType","loadMilestones","InvoiceId","requestblockedbyinvoice","loadRequestDetails_Error","refreshRequestDetails_Success","valuesObject","loadFormValues_Success","warn","currentTableState","$count","pageSize","pageIndex","sortBy","desc","TableFilterBuilder","customFilters","globalFilter","searchColumns","loadSamples_Success","loadSamples_Error","AnErrorOccurred","Forbidden","prepareServiceRequestRowModel","loadServiceRequestRows_Success","loadMilestones_Success","createSample_Success","createSample_Error","updateServiceRequestSampleField_Success","updateServiceRequestSampleField_Error","msg","innererror","serviceRequestValue","RowId","ColumnId","JSON","updateServiceRequestRowValue_Success","updateServiceRequestRowValue_Error","uploadFile","AllRowsImportedSuccessfully","OneOrMoreErrorOccurredDuringImportPleaseReviewOutputFile","import_Success","import_Error","deleteSamples","errors","successCount","tableState","loadSamples","XRecordsWereBeDeleted","patch_Success","Reason","updateStatus_Success","StatusUpdatedTo","updateStatus_Error","axiosError","statusText","ServiceRequestStatusUpdate_Error","serviceRequestRowId","updateServiceRequestRowStatus_Success","Budget","updateBudget_Success","BudgetUpdatedTo","refreshRequestDetails","updateBudget_Error","submitStep_success","StepHasBeenSubmitted","errorMessages","getErrorMessages","submitStep_Error","isAxiosError","dataErrorMessages","ErrorMessages","RequestCancelled","err_OperationFailed","ServiceRequestId","ServiceRequestMilestoneId","charge","Amount","Rate","OfflineServiceType","Quantity","OfflineServiceTypeId","Remarks","UnitTypeId","UpdatedBy","Title","UnitType","Unit","insertMilestoneCharge_Success","InsertSuccess","insertMilestoneCharge_Error","serviceRequest","deleteMilestoneCharge_Success","DeleteSuccess","updateMilestoneCharge_Success","UpdateSuccess","updateMilestoneCharge_Error","CompletionDate","Assignees","u","Charged","ServiceRequestMilestoneCharges","TargetDate","insertMilestone_Success","insertMilestone_Error","deleteMilestone_Success","requestPayload","StatusId","ServiceRequestMilestoneStatuses","updateMilestone_Success","ServiceRequestDetails","GetServiceRequestDetailsPath","NewRequestId","messages","getv2ControllerErrorMessages","messageKey","dto","serviceRequestModelToDto","createServiceRequestRow_Success","ServiceRequestRow_InsertSuccess","ServiceRequestRow_InsertError","ExceptionMessage","Message","SampleManagementTables","loadServiceRequestRowStatuses_Success","init","loadRequestDetails","insertMilestoneCharge","updateMilestoneCharge","deleteMilestoneCharge","insertMilestone","updateMilestone","deleteMilestone","updateStatus","updateServiceRequestRowStatus","updateBudget","submitStep","cancelServiceRequest","createSample","debounce","updateServiceRequestSampleField","updateServiceRequestRowValue","import","cloneServiceRequest","createServiceRequestRow","takeLatestByKey","saveFormValues","initServiceRequestStatuses_Error","merge","prev","patch_Error","dataLength","loadServiceRequestRows","loadServiceRequestRows_Error","deleteServiceRequestRows","deleteServiceRequestRows_Success","createServiceRequestRow_Error","milestone","updateMilestone_Error","remove","milestoneChargeProcessing","toggleImport","setHasFiles","HasFiles","requestSamplesActions","useRequestSamplesSlice","create","bulckCreate","update","visibleColumns","get_Success","get_Error","export","getPlateTypes_Success","plateTypes","showCreate","IsRack","SamplePlateType","showBulkCreate","hideCreate","hideBulkCreate","bulkCreate","bulkCreate_SetProgress","progress","create_Success","bulkCreate_Success","create_Error","bulkCreate_Error","hideUpdate","edit","toEntity","LocationName","RoomName","SamplePlateTypeId","SamplePlateTypeName","ServiceGroupName","update_Success","update_Error","delete_Success","delete_Error","deactivatePlates","deactivatePlates_Success","deactivatePlates_Error","deletePlates","deletePlates_Success","deletePlates_Error","samplePlatesActions","useSamplePlatesSlice","samplePlatesSaga","AssetLink","openAsset","useOpenAssetPopUp","ShowAssetSidePanel","serviceId","serviceType","openPanelWithCover","panelState","AssetDetails","OpenAssetPrimaryAction","toggle","FormRichTextField","hasMentions","onChangeMentions","additionalButtons","isInvoiceTemplateEditor","extendedMode","helpers","RichTextField","formikValue","autofocus","StyledInfo","marginLeft","Boolean","RestrictDurationUnitTypes","getViewLength","viewMode","getViewType","parseViewMode","getSchedulerViewMode","viewlength","getSchedulerViewType","datets","days","getPeriodDisplayLabel","compact","isSameYear","isSameMonth","lengthTypeToPeriodType","lengthType","viewStateFromFilter","periodTypeUnion","schedulerPreset","SchedulerDatePositionArray","periodTypeToLengthType","preset","serializeSchedulerDate","getPeriodFromViewLength","timelineColumnWidth","MatchUnitSlotToEnd","startTime","endTime","amount","dateSt","slotLength","lastCorrectEnd","diffDuration","LimitMinutes","getMinutesDiff","LimitHours","getHoursDiff","LimitDays","getDaysDiff","LimitWeeks","LimitMonths","getMonthDiff","adjustToTimeSlot","workingHours","minDuration","weekStartDay","slots","mergeDateAndTime","DayOfWeek","startSlots","startOrdered","orderBy","correctEnd","weekEndDay","endSlots","endOrdered","ConvertDtoToConnectedModel","BookedBy","UserDisplayName","UserGroup","UserGroupName","BudgetID","InstituteProject","InstituteProjectId","InstituteProjectName","ServiceDate","BudgetExperiment","BudgetExperimentName","ExternalCustomer","ExternalCustomerId","ExternalCustomerName","FundingType","getSingleInvoiceFundingType","PurchaseOrder","Reference","ConvertModelToInsertEntity","connectedModel","ServiceTypeID","DiscountFactor","UsageId","SyncReservation","SyncUsage","Units","InventoryBatchId","InventoryBatch","InventoryBatchName","InventoryBatchAmount","ConvertModelToUpdateEntity","ConvertModelToUpdateRenewStockEntity","autoGenerateBatch","DateReceived","RenewStockInventory","AutoGenerateNewBatches","getDefaultService","Mandatory","HasCharges","getDefaultBatch","shortDateFormat","ExpirationDate","Lot","OfflineServiceTypeName","PurchaseDate","PurchasePricePerUnit","ConvertConsumablesToInsertEntity","ConvertRenewStockToInsertEntity","ConvertInventoryBatchToEntity","doInitDetails","doInitServiceChangeStateData","doCreate","doUpdate","doSetAnyValue","doSetConsumableValue","doSetRenewalValue","doGetCredit","doGetTotalCredit","doInitConsumables","doCreateConsumables","doSetIsBarcodeScanned","doInitStockRenewal","doCreateStockRenewals","doInitRenewStock","doCreateRenewStock","doUpdateRenewStock","doInitInventoryBatch","doCreateInventoryBatch","doUpdateInventoryBatch","doSetRenewStockValue","doSetInventoryBatchValue","offlineServiceStateSaga","hasError","api","initOfflineService","uuid","WarningMessages","SuccessMessages","IsValid","getServiceType","connectedFiltersActions","extendSettingsState","Offline","saveState","initDetails_Success","editCreatable","parameters","ServiceTypes","ADGroup","Start","BudgetId","FundingTypeId","initServiceChangeStateData","initDetails_Error","getServiceChangeState","initServiceChangeStateData_Success","initServiceChangeStateData_Error","selectConnectedFiltersData","httpPayloads","insertOtherService","responseErrors","responseWarnings","responseSuccess","messageType","openSidepanelDetails","messageTypeProps","created","itemName","OfflineService","detailsType","OtherServiceDetails","detailsTypeProps","queryParams","initialService","saveCreatable","setReservationService","createService_Success","errormessage","createService_Error","updatedService","updateOtherService","results","respErrors","updateService_Success","updateService_Error","setAnyValueSuccess","setConsumableValueSuccess","setStockRenewalValueSuccess","calculateCredit","getCredit_Success","credit","TotalCost","balance","Balance","calculateTotalCredit","getTotalCredit_Success","initConsumableServices","ConnectedFiltersInit","initConsumables_Success","initConsumables_Error","Services","insertConsumableServices","itemEndName","multiDetails","createConsumables_Success","createConsumables_Error","getAssetByInternalCode","serviceTypeId","Consumables","scanedBarcode","internalId","setSelectedServiceType","setBarcodeScanned","setBarcodeScanned_Success","initStockRenewalServices","initStockRenewal_Success","initStockRenewal_Error","insertStockRenewalServices","RenewStock","createStockRenewals_Success","createStockRenewals_Error","initRenewStockService","initRenewStock_Success","initRenewStock_Error","setEditCreatableService","createRenewStock_Success","preventRefreshTable","createRenewStock_Error","updateRenewStock_Success","updateRenewStock_Error","initInventoryBatch","initInventoryBatch_Success","initInventoryBatch_Error","insertInventoryBatch","initialBatch","setInventoryBatchEditable","createInventoryBatch_Success","createInventoryBatch_Error","updateInventoryBatch","updateInventoryBatch_Success","updateInventoryBatch_Error","setRenewStockValueSuccess","setInventoryBatchValueSuccess","initDetails","createService","updateService","setAnyValue","setConsumableValue","createConsumables","getCredit","getTotalCredit","initConsumables","setStockRenewalValue","setRenewStockValue","setInventoryBatchValue","initStockRenewal","createStockRenewals","initRenewStock","createRenewStock","updateRenewStock","createInventoryBatch","ConvertDtoToModel","resetDetailsState","resetValueHandler","resetServiceChangeState","getCredit_Error","resetCreditState","getTotalCredit_Error","resetTotalCreditState","resetConsumableValueHandler","extendConsumablesData","resetConsumablesState","resetSelectedServiceType","setRefreshConsumableOfflineServices","resetStockRenewalValueHandler","resetStockRenewalState","resetRenewStockValueHandler","ConvertRenewStockToModel","resetRenewStockState","resetInventoryBatchValueHandler","resetInventoryBatchState","offlineServiceStateActions","useOfflineServiceStateSlice","Progress","inProgress","marginTop","CultureName","UserGroups","ActiveUserGroup","AdminEquipments","AdminServiceGroups","InstrumentEventsGroups","CreatableGroups","HasRegisterableServiceGroups","FormatedName","HasNotifications","HasOptOutCoreSelection","CalendarType","RequireUserGroupCoordApproval","HasSignedTermsOfUse","IsActiveDirectory","HasAdminGroupPermissions","HasLabTechGroupPermissions","HasAdminServicePermissions","HasLabTechServicePermissions","serviceGroupId","GroupAdministrators","IsLabTech","EquipmentAdministrator","CreateNewAssetsAdmin","LabTech","InventoryAdmin","g","IsAllAdminGroupPermissions","IsAllServicesAdmin","IsAllLabTechGroupPermissions","IsAllServicesLabTech","isInRole","role","baseRoles","odjRoles","SamplesList","SamplesListTableState","EditMode","ShowRunDialog","ImportStarted","ImportFinished","loadSamplesList","loadSamplesList_Success","loadSamplesList_Error","setSelectedSamples","loadAllFilteredSamples","loadAllFilteredSamples_Success","updateField","updateField_Success","updateField_Error","loadRunDetqails","loadRunDetqails_Success","RunDetails","runSelectedSamples","SelectedRunType","runType","runSelectedSamples_Success","updateRunSampleValue","Samples","rt","RUN_TYPES","k","RunType","prop","payloadWithoutId","TMT_Set","setShowRunDialog","setRunType","StandardRun","MassSpec","Labeling","setShowImportDialog","readImportFile","readImportFile_Success","record","sample","TargetPosition","TargetPlateId","TargetTubeLabel","TargetSampleType","TargetConcentration","TargetVolume","completeRun","aciton","completeRun_Success","completeRun_Error","updateRun","updateRun_Success","Gradient","Instrument","SecondaryInstrument","ACQUISITION_TYPE","updateRun_Error","exportRun","toggleEditMode","samplesListActions","useSamplesListSlice","samplesListSaga","DropDown","onMouseDown","menuChildren","menuProps","addChevron","onHandleClose","iconButton","disablePortal","anchorEl","setAnchorEl","marginThreshold","anchorOrigin","handleOpen","currentTarget","aria-controls","aria-haspopup","getContentAnchorEl","MenuListProps","dense","container","vertical","horizontal","transformOrigin","DateRenderer","ArticleStatus","selectConnectedFilters","connectedFilters","selectConnectedFieldHandler","connectedValueHandler","selectConnectedSettings","connectedSettings","FormNumberField","noWarnOnNuN","CommentReferenceTypes","FormLabelText","html","TrainingState","OtherServicesApi","otherService","otherServices","rowId","deleteService","deleteCustom","isBudgetsTurnedOn","offlineServiceTypeId","calculateCreditModel","getReservationOfflineServices","reservationId","repeat","deleteInventoryBatch","loadOfflineServiceData","selectWorkOrder","workOrder","selectWorkOrderProcessing","selectCreateWorkOrderProcessing","createState","selectUpdateWorkOrderProcessing","updateState","selectCreateWorkOrder","selectUpdateWorkOrder","selectCreateWorkOrderCompleted","selectUpdateWorkOrderCompleted","selectCreateWorkOrderHasError","selectUpdateWorkOrderHasError","selectSendEmailOnResOffline","sendEmailOnOffline","selectReservationOffline","reservationOffline","selectReservationOfflineData","selectReservationOfflineProcessing","selectReservationOfflineCompleted","selectReadonlyWorkOrder","readonlyState","selectUpdateAllRecurrent","updateAllRecurrent","selectOfflineEventStart","OfflineEventStart","selectOfflineEventEnd","OfflineEventEnd","selectSaveNewComments","doSaveNewComments","selectCreatedOrders","createdOrders","selectSavedLinkedOrders","savedLinkedOrders","selectLinksProcessing","calibrationsChanged","linksProcessing","selectDowntimeOverlaps","downtimeOverlaps","ImportAdditionalData","ImportResult","entity","initAssetRangeData","initUnitTypeData","assetRangeCustomFilter","filterBySelectedUnit","SourceUnits","sourceFilter","unit","rate","ConversionRate","TargetId","TargetUnits","targetFilter","assetRangeDisplay","AssetRangeFilter","customData","stateValue","handleOnChange","newState","PleaseSelectRangeUnitType","useMobileOrientation","orientation","isLandscape","isPortrait","innerWidth","breakpoints","md","adminUrl","reservableUrl","initOnlineServicesData","sourceurl","OnlineServiceMultiPicker","OnlineServiceSinglePicker","RestrictedByAdminFilter","ServiceGroupIds","IsAdminPanel","ServiceGroupFilter","RenderTypes","AllowedToRender","renderType","asset","AllowedByRolePermissions","AvailableByServiceType","AvailableByAvailabilityType","Availability","AddToList","AddWorkOrder","OpenCalendar","OpenTimeline","OpenWorkOrder","OpenWorkOrders","NewReservation","DownWorkOrder","BringBackUp","ExportQRCodes","PrintAssetLabels","CloneEquipments","DownloadImages","ExportForImport","serType","availabilityType","avType","toURLSearchParams","queryStringSerializer","serializer","n","useFilters","savedFilterKey","GetFiltersDefinition","getDefaultFilter","reservedQueryStringParameterNames","getRequiredFilter","getSelectedViewFilter","enableSavedLists","savedListSettings","useCardsByDefault","getPartialResults","useSyncSearch","useSavedViewSlice","savedViewActions","useLocation","showFiltersFn","visibleFiltersFilter","rowsKey","useCardsKey","useProfileSetting","profileSettingKey","savedUrl","savedValue","updateSavedFilterValue","updateValue","parseProfileUrl","savedFilterValue","defaultSearch","getPresetFilter","isDefault","requiredSearch","savedViewId","SAVEDVIEW_SEARCH_KEY","selectSavedView","localizedFilters","getLocalizedFilters","visibleFilters","mapDefaultFilters","urlKey","depFilters","getDependencyFilters","setAppliedFilters","initFilterData","routerActions","defaultRows","setPageSize","defaultCardsMode","setCardsMode","removeEmptyFilters","newParams","savedFilter","allFilters","appliedFilters","setPageIndex","cardsMode","syncSearch","currentSearch","getNextFilter","originalSearch","savedListSerializedKey","selectMyList","currentSearchString","handleFilterChange","setFilterValueCallback","getFilterValueCallback","getFilterValue","handelPageSizeChange","handelPageIndexChange","handleCardsModeChange","isCardsMode","defaultFilters","setDefaultFilters","getDefaultFilters","allfilters","setFilterValue","onModeChange","notNullable","notDefault","withSavedHistoryT","Component","onFilterChange","availableFilters","onPageSizeChanged","onPageIndexChanged","getIgnoredSearch","ignore","StyledMenuItem","button","MenuItem","HoverActions","popupState","usePopupState","popupId","buttons","anchorRef","bindHover","bindMenu","close","ClickableActions","bindTrigger","Menu","closeAfterTransition","hoverMenu","nonEmptyItems","TextControlField","startIconComponent","endIconComponent","startAdornment","ReservationsApi","initReservation","insertReservation","updateReservation","getReservation","hasAnyFirstReservations","getEquipmentsChangeState","getValidationState","getReservationSlots","validateDuration","validatePrerequisite","validatePermissions","changeStatus","getEquipmentsData","createTraining","reservations","HasFutureReservationsHttp","equipmentNames","transferReservation","sendTransferNotification","sendCancelTransferNotification","cancelTransferReservation","sendTerminateNotification","ReservationIds","hasUsage","resId","eqid","eqId","endUsage","remarks","sids","quantity","userCanBookEquipment","equipmentid","_t","IsEntity","IsEntityType","IsEntityArray","IsEntityString","IsEmptyArray","IsNotEmptyArray","PureAppliedFilterComponent","onRemove","onApply","direction","filterData","filterPredicates","depValue","depKey","predict","setPredict","handleChange","applyItem","handleRemoveClick","labelFunc","invalidLabel","canHaveInversed","customFilter","inversionDisabled","toggleInversed","fieldName1","flexShrink","displayName","selected","dateTimeClear","NonRemovableFilter","margin","textOverflow","flexWrap","AppliedFilterComponent","prevProps","nextProps","predicetes","EditableCell","WrappedComponent","initialValue","updateMyData","SelectedRowsActionIconButton","snackBarMessageType","onRefresh","confirmBody","variantButton","updateDialogVariant","validConfirm","toggleAllRowsSelected","busy","setBusy","setShowConfirm","handleAction","resp","Notification","persist","showLinkMessage","linkUrl","linkText","respm","errmsg","sccmsg","wrnmsg","BooleanPickerFilter","trueName","falseName","ActionButton","placement","PopperProps","variantComponent","standard","StandardInput","filled","FilledInput","outlined","BaseField","FormHelperTextProps","hiddenLabel","InputLabelProps","inputRef","focused","multiline","rowsMax","rowsMin","SelectProps","inputMore","shrink","notched","displayRequired","native","requiredPlaseholder","helperTextId","inputLabelId","InputComponent","sizeClass","InputElement","aria-describedby","noLabel","LabelElement","htmlFor","withLabel","labelId","withStyles","BooleanRender","withPadding","backgroundImage","checkedIcon","content","indeterminateIcon","Check","checkicon","uncheckicon","indetermicon","Checkbox","FormBookitDatePicker","disableFuture","disablePast","inputVariant","clearable","fullScreen","truncateTime","minDate","maxDate","allPeriods","noFuturePeriods","DatesRangeFilter","periodValue","changedValue","periods","Forever","From","minutesStep","saveOnSelect","maskIfEmpty","To","useAsyncGetWthEffect","load","defaultVal","deps","setVal","OfflineServiceTypePicker","UsageRelatedFilter","Ids","excludedIds","ReservationsRelatedFilter","equipmentGroups","optionalServiceTypes","hideProject","allServicesAllowed","budgetServiceGroupServicesAllowed","byAdmin","byUser","OfflineServiceRelatedFilter","relatedGroups","RenewStockRelatedFilter","InventoryBatchRelatedFilter","selectArticles","articles","selectArticlesExternalSearchResults","externalSearchResults","selectArticlesExternalSearchForm","externalSearchFormDetails","selectArticlesExternalSearchPageIndex","externalSearchPageIndex","selectArticlesExternalSearchPageSize","externalSearchPageSize","selectArticlesExternalSearchPageData","page","selectArticleDetails","articleDetails","selectRefreshEditArticleAssociation","refreshEditArticleAssociation","selectArticleDetailsBusy","articleDetailsBusy","selectEditArticleAssociationBusy","editArticleAssociationBusy","selectArticleDetailsForm","ServiceGroupAssets","Assets","InstrumentAssets","validateError","propss","utils","validateDate","currentDate","opDate","maxMonthDays","finalDate","maxDateMessage","minDateMessage","invalidDateMessage","strictCompareDates","validateTime","convertToMeridiem","getMeridiem","hasDeps","SortByComparer","ServiceGroupsComparer","columnsComparer","accessor","ColumnAccesorsComparer","REQUEST_CANCELLED_MESSAGE","defaultRowIdAccessor","BasicTable","additionalColumns","getRowId","useExport","rowActions","inlineRowActions","pageActions","screenName","selectedRowsActions","filterOpen","customParams","useImportLink","importLink","importHandler","needRefresh","ServiceGroupsOptional","topAlertMessage","expandedColumns","floatingTabSettings","useExportForImport","customEmptyTableSettings","exportForImportFilterKey","printing","initComplete","dataState","setDataState","extendDataState","doRefresh","setTableState","handleChangeState","serviceGroupsCompared","useCustomCompareMemo","additionalColumnsCompared","columnsCompared","useConfigurableColumns","configurableColumns","handleConfigurableColumns","configCompleted","refreshConfigurableColumns","getDisplayColumns","calculateColumnAccessors","columnAccessors","getColumnAccessors","getAllAdditionalColumns","flatMap","useMemoFilters","fetchData","oDataParams","buildParams","getUrlAndParams","controlledPageCount","ceil","titleKey","cancelTokenSource","source","allAdditionalColumns","columnsConfig","isFetchReady","globalFilterValue","token","handleExportClick","TryGetExportColumns","exportColumnAccessors","tableParams","exporturl","getAllFilteredRows","allRowsSelected","setAllRowsSelected","handleRefresh","reloadConfigurableColumns","useRowSelect","selectedRowIds","refreshFromState","TableSkeleton","ControlledTable","compactTable","onChangeState","onExport","pageCount","initialPageSize","onDownloadTemplate","onSelectedRowsChange","subHeader","onConfigurableColumns","useGlobalFilter","imageSrcKey","allowCards","primaryAction","withToolBar","tabSectionSettings","isRowSelectable","onSelectedChange","hideMenuOnMobile","viewCardsCheck","cardSize","cardPosition","useConfigurable","customToolbarSettings","preventInnerClicks","getAllFilteredRowsCallback","hideFilters","baseTableActionsOnToolbar","screenNameVariant","customExpandMenu","customScreenName","showGlobalSearchIconOnToolbar","toggleGlobalSearchIcon","importMenuItems","isContentEditable","tablePaddingVariant","minCardHeight","initBudgetData","queryUrl","BudgetPicker","allActiveBudgets","BudgetByUserGroupFilter","loadBudgets","restrictedBudgetFilter","budgetLimitedByUsers","isBudgetsWithoutUserGroup","defaultBudgetEnabled","userDefaultBudgetEnabled","hideNonDefaultBudgets","fundingType","usrFilter","memberTimeFilter","fundingTypeId","startFilter","endFilter","groupFilter","servFilter","deffFilter","PriceSheetBy","BudgetType","AutomaticAssetNamings","UserReservationsRestricted","SideBarQuickActionsEnum","DraftReservationTypes","AllowReservationCollaboratorsTypes","mapSettingsFromServices","equipments","accServices","HasHideProjects","HasConflictProjects","HasMultipleProjects","allowPartialProjectCharges","AllowPartialProjectCharges","HasPartialSingleProject","allowPartialSingleProjectCharges","AllowPartialSingleProjectCharges","AllOffServicesAllowed","ReservationOfflineServicesEnabled","OfflineServicesVisible","AllowReservationCollaborators","hideReservationCollaborators","AllowedToStartUsage","NotAllowedToStartUsage","budgetExperimentVisible","budgetExperimentModuleEnabled","BudgetExperimentSettings","TrainingSignUpApproval","HideTrainingSession","HasAttendance","ForceTutoring","ForceFullDayReservations","IsEquipmentTutoring","NotAllowReservations","AllowOneAccSerOnly","IsAllAdmin","RestrictReservationToTimeSlots","DefaultReservationDuration","sort","MinOrderHours","MaxOrderHours","MaxOrderDuration","MinOrderGap","RestrictDurationUnitsAmount","RestrictDurationUnitType","DefaultAccServiceId","Billable","IsLoanDesc","LoanTypeId","AllowModification","allowOngoingReservationModificationEnabled","AllowExtendReservation","AllowUsersToShortenReservations","AllowedToTransfer","AllowedToTransferAll","EnforceReservationRestrictions","LimitlessReservationAllowed","BudgetVisible","getBudgetVisible","OfflineServiceTypes","combineOfflineServiceTypes","arr","HasAccServices","AccServices","StaffUserVisibleAllways","StaffUserSelectionVisible","StaffUserVisibleOnPending","StaffUserRequiredAlwais","StaffUserSelectionRequired","StaffUserRequiredOnPending","StaffUserSelection","acc","DraftForAll","DraftReservationsTypeId","DraftReservationTypes_AllUser","DraftApprovalRequred","DraftReservationTypes_ApprovalRequired","DraftSaveForLater","DraftReservationTypes_SaveForLater","combineOptionalEquipments","offlineServices","terminate","EquipmentsData","AccServiceIds","AssemblyId","SampleRunId","SampleIds","Collaborators","CollaboratedUsers","PartialAttendance","PartialAttendanceStart","PartialAttendanceEnd","Tutoring","FullDayReservation","Username","StaffUser","UserGroupId","TrainingSessionId","TrainingSession","TransferFromId","UserRequestedByApproval","TransferredTo","WorkflowBooking","RecurringUpdateOption","AllStartTimes","BudgetIds","OfflineServices","ServiceTypeName","UnitsName","Factor","TransferInProgress","InsertedAt","Entered","InsertedBy","RecordDate","UpdatedAt","CancelledAt","CustomFormValues","FieldId","Parts","TutorName","Terminated","SavedForLater","StartDate","EndDate","PartReservations","BudgetName","AssignToServiceRequestId","AssignToServiceRequestRowIds","AssignToServiceRequestSampleIds","Repeat","RecurringEvents","DoNotRepeat","RepeatsEveryType","RepeatsEveryPeriod","RepeatsEveryNum","RepeatsEveryDay","RepeatEndTime","RecurringEndDate","RepeatOption","Repeat_Period","RepeatsBy","RepeatsMonthlyBy","RepeatsOn","RepeatsOnDays","MandatoriesEquipments","OptionalsEquipments","doInitReservation","doInitReservationEdit","getReservationProperty","doUpdateSettigs","doUpdateEquipmentSettigs","doLoadValidationData","doSetStart","doSetEnd","doSetAny","doTransferReservation","doCancelTransferReservation","doTerminateReservation","reservationSaga","UpdateToNow","isChange","resourceChanged","BaseEquipment","extendEquipmentSettingsState","mandatories","End","sampleRunId","initReservation_Success","isChanged","userTrainigData","userTrainingsApprovalData","allEquipments","Equipments","CheckStatus","srrid","prevState","CheckSession","initValidationData","warnings","initReservation_Error","doInitReservationEdit_Load_OfflineMandatory","OfflineMandatory","extendReservationSettings","budgetModuleEnabled","trainingSessionEnabled","instituteProjectsEnabled","SamplesAutomation","accServicesEnabled","TerminateReservation","AccServiceId","fork","isCloned","calcCredit","customFormFiles","getFilesModel","FileTypes","ReservationFile","CustomFormTypeEnum","Reservation","FileStoreApi","saveFormFiles","fileRes","fileResponse","self","setCloneReservation","ReservationDetails","warnOnTrainingSession","FirstEquipmentId","ClickHere","afterLinkText","res_futureTrainingSession_LinkTitle","repetitiveActions","resetState","createReservation_Success","reservationIds","insertModel","insertedModel","createReservation_Error","reservationDto","reccurentUpdateOption","filesData","originalCustomFormFiles","currentCustomFormFiles","updateFormFiles","fileResponses","terminateReservation_error","Succes_ReservationTerminated","terminateReservation_success","offRes","offErrors","offResponse","offWarnings","initClonedReservation_Success","updateReservation_Success","updateReservation_Error","updateReservationSettings","newSettings","updateEquipmentSettingsState","CustomForms","StatusChange","IsForceTutoring","initValidationData_Success","initValidationData_Error","setStartSuccess","setEndSuccess","transferReservation_Error","transferReservation_Success","cancelTransfer_Error","cancelTransfer_Success","createReservation","setStartDate","setEndDate","cancelTransfer","terminateReservation","TryDisableRemoveableEquipments","noremoved","titleInfo","StaffMandatoryEquipment","allowToRemoveFromMultipleReservation","generateTrainingSessionName","op","AssemblyParts","getReservationSettings","FatherId","TrainingSessionOnly","SessionId","LastUpdateDate","LastUpdateAdmin","ParentAssemblyReservationId","TopAssemblyReservationId","HasOfflineServices","HasTrainingSession","NextReservationTime","CurrentReservation","FirstInitEquipments","FutureReservation","IsFuture","Ongoing","IsOngoing","PastReservation","IsPast","resetOperateState","resetAssisteTrainingData","resetEquipmentChangeState","getAnyValue","getAnyValueSuccess","resetRequestedFor","resetTransferState","setSavedOfflineServices","setRefreshOfflineServices","resetTerminateState","setAsyncChangeLoading","setSubmitCredit","setByApprovalErrors","setRefreshWorkOrderLink","reservationActions","useReservationSlice","GhostInput","valueHtml","valueText","labelBolder","ghosInputLabelBold","StyledChip","custombgcolor","main","customsize","customcolor","paddingBlock","opacity","pointerEvents","darken","fullwidth","customwidth","notremoved","labelSmall","clickable","sizeSmall","deleteIcon","customiconcolor","contrastText","fade","Chip","BookitChip","aria-disabled","onDelete","preventDefault","BookitChipWithCheck","BookitChipWithInfo","checkname","checkid","largeFilesUploadSaga","selectedFiles","canUpload","uploading","targetId","startedToUpload","currentNumberOfUploadedFiles","numberOfUploadedFiles","commentType","referenceId","setSeletedFiles","setCommentProperties","setCanUpload","addFile","removeFile","resetNumberOfUploadedFiles","useLargeFilesUploadSlice","CommentsApi","GetComments","reference","SendComment","typeId","Files","Text","IsInternal","form","delteUrl","mapSettings","isEditMode","budgetEnabled","resUGEnabled","reservationUserGroupGroupByBudgetUserGroup","isServiceAdmin","IsAllGroupOrLabTechAdmin","isRoleAdmin","isUserGroupCoordinator","UserGroupCoord","btExpEnabled","chargesViewAllowed","FinAdmin","InvoicesReader","hasConflictProjects","budgetVisible","fundingTypeVisible","fundingTypeBudgetEnabled","purchaseOrderBudgetEnabled","ReservationUserGroupGroupByBudgetUserGroup","userGroupVisible","userVisible","budgetExpirementVisible","instProjVisible","extCustomerVisible","purchaseOrderVisible","PurchaseOrderOptionId","PurchaseOrderOptions","Hidden","referenceVisible","showReferenceFieldInReservationDetails","onlyOwnUserGroupsAllowed","endTimeVisible","startTimeVisible","allowUsersToViewTheirCharges","doSetConnectedValue","doResetState","connectedFiltersSaga","setConnectedValueSuccess","currentData","updateSettingsState","resetConnectedState_success","setConnectedValue","resetConnectedState","toISOString","setSubmit","resetConnectedHandler","useConnectedFiltersSlice","DRAWER_WIDTH","DRAWER_MOBILE_WIDTH","SIDE_PANEL_WIDTH","COVER_WIDTH","initExtraDDLData","ExtraDDLPicker","AutocompleteMultiPicker","fullWdithOptions","renderTags","renderOptionLabel","renderOptions","onChipClick","setInputValue","newValue","getTagProps","Color","Fragment","BaseURLPicker","queryfilter","EmptySlotAdminClick","WorkOrderApi","initCreateData","initUpdateData","insertWorkOrder","updateWorkOrder","offData","getNewWorkOrderStatus","deleteOrders","DowntimeOrders","assetIds","foo","nowDate","removefromLinks","linkedId","addToLinked","removeLinkedCalibration","addLinkedToCalibration","getLinkedToCalibration","getOverlappingDowntimes","StyledItemIcon","ListItemIcon","RowMenuActions","tooltipOpen","setTooltipOpen","popupProps","renderAsTitle","localizedText","RouterLink","RowActionsMenu","useRowActionsColumn","tablePlugins","actionColumns","Header","Action","disableSortBy","Cell","hooks","useInlineRowActionsColumn","InvoiceFundingType","initFundingTypeData","FundingTypeIdPicker","marginRight","userProfileSetting","savedEnabled","updateEnabled","useUploadToNewComment","largeFileActions","onCommentAdded","comment","allowedroles","InstrumentEventsAdmin","useWorkOrdersPermissions","roles","callback","hasPermissions","allowedToView","isMainOrInstrumentEventsAdmin","HasAdminGroupOnlyPermissions","HasAdminServiceOnlyPermissions","HasInstrumentEventsGroupPermissions","IsReadOnlyUser","CalendarOnly","FormSwitch","boldLebel","maxLabelWidth","boldLabel","boxed","updateFormValues","coming","orn","o","validateReservation","validateMinEnd","validateAccServices","allAcc","getWorkFlowName","userName","FormBookitDateTimePicker","labelInline","dateLabel","timeLabel","ExtraDDLFilter","AutocompleteMultiPickerEx","selectable","undefinedIfIsEmpty","getAssetImageThumbSrc","imageExist","defaultImage","getDefaultImage","getAssetImageSrc","PartOfDay","doChangeViewMode","doChangeViewModePartial","changeLocation","doGetEvents","doGetServices","doGetDerivedServices","doEdit","doEditTrainingSession","doEditReservation","doEditAlert","doReset","doUpdateMultipleMode","doUpdateEmptySlotClick","doGetEmptySlotAdminClick","doSetFilters","doResetWorkOrder","schedulerSaga","previous","isStateEqual","forceEvents","getEvents","setPreviousViewState","pickViewState","isEqual","applyStateSearchParams","periodFilterFieldName","groupByFilterFieldName","currentMode","previousMode","GetCalendarPagePath","eventsParams","splitFilter","eventFilters","training","ReservationOrDowntime","sharedFilter","servicesFilter","equipmentIdArray","withReservationsOnly","fetchedServices","reservations_fields","effects","fetchEvents","fetchTrainingSessions","noServicesSelected","loadWorkingHoursForFetchedEvents","fetchWorkingHours","fetchedEventsEffect","fetchedTrainingSessionsEffect","fetchWorkingHoursEffect","fetchedEvents","fetchedTrainingSessions","fetchedWorkingHours","getEvents_Success","offlineServicesFilter","getOfflineHours_Success","distinctEquipmentIds","getDerivedServices","getNonWorkingHours","nonWorking","getNonWorkingHours_Success","ReservationOrDowntimeEnum","ReservationsOnly","OffLine","DownTimeOnly","trainingFilterBuilder","serviceIdParameter","startParameter","prepareDateParameter","endParameter","batchResponse","getServiceDetails","getServices_Success","needMoreServiceProps","servicesResponse","requiredProps","actualProps","getDerivedServices_Success","trainingSession","un","tsid","reservationDetailsState","reservationSidePanelOpened","offStart","offEnd","workOrderActions","setOfflineEventStart","setOfflineEventEnd","WorkOrderDetails","requestedServices","defaultMulti","defaultMultiModeBehavior","equipmentChanged","equipment","payloadServiceIds","requestedServicesAssemblyIds","TopAssemblyId","useRequestedServices","Scheduler_AssemblyPartSelected_InfoMessage","reservationSidePanelServiceId","ug","sample_run_id","alertQueryParams","down","offH","eStart","aType","alert_type","useSwithButtons","useSwitchButtons","selectedSavedView","updateMultiMode_Success","updateEmptySlotSettings_success","gsettings","defaultEmptySlotSetting","GetNullableByKey","CalendarTimelineEmptySlotClickSettings","defaultEmptySlotClick","WhatToAdd","userEmptySlotAdminClick","userSetting","getPredicate","predicate","serviceRelatedFilters","filteredServices","serviceFilterValue","MaximumTimelineRowsLimit","maxTimelineServices","CalendarServicesPickerCapacity","maxCalendarServices","maxServices","changeViewMode","changeViewModePartial","createWorkOrder_Success","updateWorkOrder_Success","resetUpdateWorkOrderState","resetCreateWorkOrderState","getServices","setFilters","updateMultiMode","updateEmptySlotSettings","getEmptySlotAdminClick","TimelineGroupBy","withNoChangeLocation","changeGroupBy","getEvents_Error","getTrainingSessions_Success","multipleInstrumentsMode","setNotUseLocation","setSelectedReservationEvents","resetExportToPDF","schedulerActions","useSchedulerSlice","useGlobalSettingsHook","adminRoles","InstituteCoord","privateBudgetsRoles","HeadOfLab","userRoles","reservationRestricted","setReservationRestricted","setBudgetModuleEnabled","priceSheetPricing","setPriceSheetPricing","purchaseOrderLengthSetting","setPurchaseOrderLengthSetting","userIsMainAdmin","setUserIsMainAdmin","userSettings","setAllowOngoingReservationModificationEnabled","doNotAllowReservationUserChangeByStaff","setDoNotAllowReservationUserChangeByStaff","setInstituteProjectsEnabled","reservationTerminationEnabled","setReservationTerminationEnabled","draftReservationsEnabled","setDraftReservationsEnabled","MandatoryOfflineServicesOnTrainingSignUps","setMandatoryOfflineServicesOnTrainingSignUps","crossInstrumentTrainingEnabled","setCrossInstrumentTrainingEnabled","userAndGroupPermissionsEnabled","setUserAndGroupPermissionsEnabled","tutoringModulesEnabled","setTutoringModulesEnabled","setAccServicesEnabled","setAllowUsersToViewTheirCharges","setShowReferenceFieldInReservationDetails","offlineServiceWithReservation","setOfflineServiceWithReservation","multipleInstrumentsEnabled","setMultipleInstrumentsEnabled","setTrainingSessionEnabled","reservationFormEnabled","setReservationFormEnabled","resMultipleFormsEnabled","setResMultipleFormsEnabled","assistedReservationsEnabled","setAssistedReservationsEnabled","showCalcPriceOnOfflineService","setShowCalcPriceOnOfflineService","showCalculatePrice","setShowCalculatePrice","setAllowPartialProjectCharges","setAllowPartialSingleProjectCharges","setBudgetExperimentModuleEnabled","setFundingTypeBudgetEnabled","setPurchaseOrderBudgetEnabled","setIsBudgetsWithoutUserGroup","setIsBudgetLimitedByUsers","setHideNonDefaultBudgets","assemblyPartsEnabled","setAssemblyPartsEnabled","setUserDefaultBudgetEnabled","setDefaultBudgetEnabled","userGroupReservationRestricted","setUserGroupReservationRestricted","setReservationUserGroupGroupByBudgetUserGroup","setOnlyOwnUserGroupsAllowed","allowAddRemoveOnEditReservation","setAllowAddRemoveOnEditReservation","setAllowToRemoveFromMultipleReservation","setHideReservationCollaborators","isConfidentialBudgetsEnabled","setIsConfidentialBudgetsEnabled","allowWorkflowBookingEnabled","setAllowWorkflowBookingEnabled","modifyReservationNameForUsers","setModifyReservationNameForUsers","loadCompleted","setLoadCompleted","BudgetFields","Confidential","MultipleInstruments_AddRemoveOnEditReservation","AllowToRemoveFromMultipleReservation","HideTrainingSessionsSettings","ModifyReservationNameForUsers","InstituteProjects","AllowOngoingReservationModification","DoNotAllowReservationUserChangeByStaff","HideReferenceFieldInReservationDetails","AllowUsersToViewCharges","HideAssistedReservationsSettings","BudgetLimited_ByUsers","Budgets","PriceSheetPricing","PurchaseOrderLengthSetting","intValue","OfflineServiceWithReservation","resRestrictedSetting","UserOwnRestricted","resUserGroupRestrictedSetting","UserGroupRestricted","UserPermission","GroupPermissions","CrossInstrumentTraining","ShowDefaultBudgetOnUserProfile","HideCalcPriceOnOfflineService","Billing","Invoices","Default","PurchaseOrderOption","TutoringHours","HideNonDefaultBudgets","SGACreateProjects","BudgetExperiments","DisableBillingEvents","AllowPartialMultipleProjectCharges","ReservationsCustomForm","MultipleCustomForms","HideReservationCollaborators","resCustomFormEnabled","AssemblyPartsEnabled","confidentialBudgetsEnabled","filterHandler","isSidePanel","saved","withoutReserved","withReserved","addReserved","filterSearch","filterValue","reserved","ConvertModelToEntity","Shared","doInitNewDetails","doUpdateViewAssets","doSelectSavedView","doPatch","savedViewSaga","loadNew","eid","initNewDetails_Success","initNewDetails_Error","httpPayload","createSavedView","MyInstrumentList","SavedViewDetails","createView_Success","createView_Error","updateSavedView","updateView_Success","updateView_Error","newAssets","assets","el","view","groupId","shared","updateViewAssets_Success","updateViewAssets_Error","selectSavedView_Success","savedViewsApi","patch_success","initNewDetails","createView","updateView","updateViewAssets","savedViewUserName","resetCreateSavedViewState","resetUpdateSavedViewState","selectSavedView_Error","FormUserPicker","MessageText","div","css","showMore","minHeight","defaultIconMapping","BasicAlert","collapsedMinHeight","isShowMore","setIsShowMore","in","severity","iconMapping","show","savedView","selectSavedViewProcessing","selectCreateSavedView","selectUpdateSavedView","selectUpdateUserName","selectCreateSavedViewCompleted","selectUpdateSavedViewCompleted","selectCreateSavedViewHasError","selectUpdateSavedViewHasError","doInitCreate","doInitUpdate","doSendReservationsOfflineEmail","doRemoveFromLinked","doAddToLinked","doRemoveLinkedCalibration","doaddLinkedCalibration","doSetCreatedOrders","doCheckDowntimeOverlaps","workOrderSaga","initWorkOrder_Success","initWorkOrder_Error","initUpdateWorkOrder_Success","initUpdateWorkOrder_Error","ConvertNewWorkOrdersToModel","submissionFormFiles","workOrderDetails","SubmissionFormFiles","savedLinkeCalibrations","idx","AlertTypeFile","AlertType","WorkOrderTypeId","setSaveNewComments","setOrderNumbers","WorkOrdersPageName","widx","addLinkedCalibration","WorkOrderType","hasResOffline","ReservationOffline","ReasonName","createWorkOrder_Error","staffFormFiles","StaffFormFiles","updateAll","UpdateAll","originalSubFormFiles","RecurringAssetId","RecurringGroupId","originalStaffFormFiles","AlertFile","Alert","AutoCreatedOrders","longDateTimeFormat","updateWorkOrder_Error","paload","deleted","insert","doNotNotifyUsers","allAffectedUsers","sendData","sendReservationsOfflineEmail_Success","sendReservationsOfflineEmail_Error","removeFromLinked_success","addToLink_success","removeLinkedCalibration_success","addLinkedCalibration_success","setOrderNumbers_success","checkDowntimeOverlaps_Success","initWorkOrder","initUpdateWorkOrder","createWorkOrder","sendReservationsOfflineEmail","removeFromLinked","checkDowntimeOverlaps","ConvertEntityToModel","ToDown","resetReservationsOfflineState","setUpdateAllRecurrent","LinkedAlerts","setSavedLinkedOrders","resetSavedLinkedOrders","setCalibrationChanged","useWorkOrderSlice","TextField","disableUnderline","mapToAssetDto","myAsset","AssetCatId","AvailabilityTypeId","AvailabilityTypeName","ServiceGroupAssetId","Api","ConfigurableColumns","listId","configurableType","ListID","ConfigurableType","TemplateColumns","ScreenId","Iad","none","iad","ImportTemplate","Ext","ext","importImages","maxContentLength","ExportImportActions","Export","Import","ImportImages","samplesList","selectSamplesList","selectRunDetails","selectShowRunDialog","selectSamplesListEditMode","selectImportingRunDetails","selectImportingRunDetailsFinished","selectRunDetailsInstrument","selectRunDetailsSecondaryInstrument","selectRunDetailsGradient","selectRunDetailsCreatedDate","CreateDate","selectRunDetailsAcquision_type","StyledTextField","MatTextField","FormCheckbox","ServiceRequestDetailsPath","generatePath","selectPaper","selectRoot","selectTitle","textAlign","selectContent","maxHeight","addButtonRoot","addCollapsContainer","AddFilterButton","filtersSelectionOpen","setInnput","disabledTitle","Popper","SelectFieldToFilterBy","SearchFilter","MenuList","mobHorizontal","tabIndex","handleFilterSelect","AppliedFiltersContainer","mobileRoot","mobileHorizontalRoot","dependencyProp","depFiltered","filt","filterValues","updateDepValues","BasicFilterGroup","appliedFiltersDirection","filterDefaultOpen","setVisibleFilters","handleAddFilterWithValue","currentState","handleApply","areSameFilter","handleRemoveFitler","available","applied","appliedFitltersCount","autoOpenAddFilter","SavedListsDropDown","serviceItem","savedListRelatedPickerName","hasInVisibleFilters","addFilter","serializedKey","listViewbyAsset","MoreFilters","MoreFiltersDisabled","showFooter","ButtonsContainer","apply","ResetFilters_info","ResetFilters","FormControlLabel","withInfo","boxedChecked","boxedError","DateInput","openPicker","TextFieldComponent","validationError","togglePicker","TextComponent","innerInputProps","readOnly","InputAdornment","ev","nodeName","onKeyDown","toEndDateDisplayValue","truncatedDate","dir","dateLongFormatter","pattern","timeLongFormatter","longFormatters","P","dateTimeFormat","matchResult","datePattern","timePattern","formattingTokensRegExp","longFormattingTokensRegExp","getFormatTokens","formatString","tokens","firstCharacter","longFormatter","setInputViewDate","ddd","getValueDateOrTruncat","getMaskedDateValue","mask","singleValue","dateStartFrom","dateSeparator","getMaskedTimeValue","hour","minute","StyledPicker","PickerPopper","shadowXL","daysEntityArray","_","defaultDayValue","getDayEntityFromDate","DaysByMonthPicker","maxDay","monthDate","monthEntityArray","FullName","MonthId","defaultMonthValue","getMonthEntityFromDate","MonthOfYearPicker","MAX_YEAR","yearsEntityArray","defaultYearValue","getYearEntityFromDate","YearsPicker","DateDropDown","dayDisabled","monthDisabled","yearDisabled","onError","useUtils","dateTimeValue","dateSelected","setDateSelected","daySelected","setDaySelected","monthSelected","setMonthSelected","yearSelected","setYearSelected","innerError","setInnerError","isYearOpen","setIsYearOpen","isMonthOpen","setIsMonthOpen","isDayOpen","setIsDayOpen","someOpen","withCompletion","handleDayChange","handleMonthChange","handleYearChange","FormControl","FormHelperText","hoursEntityArray12","hoursEntityArray24","defaultHourValue12","getMeridiemHours","defaultHourValue24","getHoursEntityFromDate","HoursPicker","useAmPm","minutesEntityArray","defaultMinutes","getMinutesEntityFromDate","MinutesPicker","AmPmEntityArray","defaultAmPm","getAmPmEntityFromDate","AmPmPicker","TimeDropDown","hoursDisabled","minutesDisabled","hoursSelected","setHoursSelected","minutesSelected","setMinutesSelected","ampmSelected","setAmpmSelected","isHourOpen","setIsHourOpen","isMinuteOpen","setIsMinuteOpen","isAmPmOpen","setIsAmPmOpen","ampmValue","handleHoursChange","handleMinutesChange","handleAmPmChange","ampmVal","useIsomorphicLayoutEffect","useLayoutEffect","useEventListener","eventName","handler","savedHandler","targetElement","eventListener","useDateTimeChange","refresh","valueRef","dateTimeMask","maskFormats","dateStartOf","userValue","isDeleleteButtonDownRef","wasZeroBefore","selectionStateChanged","eventValue","increment","isHourChanged","isMinutesChanged","isAmPmChanged","isDayChanged","isMonthChanged","isYearChanged","isNoOperation","selectionChanged","formattedValue","moveSelectionForward","finalTime","partChanged","maskFormat","prevValue","stayOnSelection","newTime","prevParts","prevHour","prevMinute","prevMeridiem","newVal","hourInt","prevHourInt","comb","minuteInt","prevMinuteInt","formatingTime","finalValue","isPrevZero","isSelectionChanged","zeroPress","startedFrom","dayVal","prevDayVal","dayInt","prevInt","monthVal","prevMonthVal","monthInt","prevMonthInt","yearVal","prevYearVal","yearInt","padEnd","formatingDate","oneLetterHour","handleKeyDown","evt","handleKeyUp","hasSingleChar","selectionStart","maskedValue","onSelectionChange","selectionEnd","KeyboardRifmInput","isPickerOpen","defTokens","first","dateStartWith","dateTokens","timeTokens","defaultDateTimeMask","inputMask","setHasError","errorMessage","setErrorMessage","setSelectionChanged","dateChange","onMouseUp","timeSelection","dateSelection","onKeyUp","arrows","dateArrowSelection","selStart","selEnd","nativeEvent","stopImmediatePropagation","KeyboardInput","displayDate","isEmpty","emptyLabel","getDisplayDate","innerInputValue","setInnerInputValue","changedValueRef","dateVal","getParsableDate","setValidationError","innerValidationError","textValue","TimeOptionPicker","hoursItems","minutesItems","ampmItems","hourRef","minuteRef","selectedId","scrollTo","hourScroll","step","minuteScroll","PickerOptions","List","disablePadding","ListItem","Divider","ap","gridAutoColumns","gridAutoRows","gridColumn","gridRow","borderBottom","borderTop","listStyle","scrollBehavior","BookitDatePicker","elementRef","closablePicker","closeTitle","readonlyInput","useTimeClockPicker","useTimeDropDowns","useDateDropDowns","dateInputProps","keyboardInputProps","dateValue","setDateValue","handleSave","contains","countState","inputDisplayValue","getInputViewDate","ClickAwayListener","mouseEvent","onClickAway","inpValue","transition","TransitionProps","Fade","Paper","TimePicker","disableToolbar","timeValue","DatePicker","Save","Clear","prefix","levelFormatter","level","nameFormatter","timestampFormatter","createPeriod","now","startFn","endFn","addFn","offset","part1","part2","useExpandedSideBarState","expandLocal","MainTabs","AssetsSubTab","AssetsSubTabUnionArray","NoAuthNodes","HasChildNodes","ResourceKey","reg_NewUserRegistration","RootNode","HideReact","isAdminNode","ParentNode","Hide","MainTab","SubTab","IsAdminSettings","GroupTab","node","searchItem","irurl","chitem","rurl","rpath","prurl","purl","rurl1","getCurrentMainNode","getUserNodes","parentNodes","childNodes","currentPathNameLowered","elementPathName","newSearch","getCurrentNodes","currentNode","findNode","menuTab","filtered","nodeAccesibleByRole","it","subTab","findMainTabNode","subTabTitle","ShortWeekDays","getShortDaysArray","RepetitiveInit","untilDate","GetAutoCreateTitle","eventStart","AutoCreateEvent","AutoCreateFor","RepeatCustom","periodName","Days","Weeks","RepeatDaily","parseISOOrNull","GetIntervals","dates","originStart","originalEnd","nextWeek","dayWeek","newMonthDate","newDayWeek","calcDay","checkDate","counter","theDay","firstDay","lastDay","newDay","period","everyDayNum","nextDay","daysToAdd","newDayDate","mtheDay","mnextDay","mdaysToAdd","Months","RepeatsBy_DayOfMonth","monthDay","RepeatsBy_DayOfWeek","newMonth","box_shadow_s","box_shadow_m","shadowXS","shadowS","shadowM","shadowL","initWOTypeData","initWOTypeDataParams","downtime","filteredWorkOrderTypes","calibration","grp","elem","cts","byGroups","byCats","WorkOrderTypePicker","convertInventoryBatchName","loadBaseData","InventoryBatchPicker","loadInventoryBatchesData","BatchesByServiceTypeFilter","withStockRenewed","TimelineGroupByUnionArray","parseCalendarPageParams","dashView","defaultviewType","parseType","presetPeriodToViewLength","getTimelineGroupBy","AlignRight","UserProfileLink","twoRows","UserFormatResult","initUserGroupData","UserGroupPicker","RestrictedUserGroupPicker","RestrictedFilter","departmentId","instituteId","instituteTypeId","restricted","UserFilter","DescriptionCell","leaveDelay","leaveTouchDelay","DateTimeLabel","deleteSavedViews","viewIds","getMySavedViews","mySavedViewFilter","onlyMyView","NumberField","withMinMax","withProps","serviceRequestsKanban","selectServiceRequestsKanban","selectServiceRequestsKanbanProcessingUpdate","processingUpdate","selectServiceRequestsKanbanProcessingInsert","processingInsert","selectServiceRequestsKanbanTickets","selectServiceRequestsKanbanSelectedStatuses","selectedStatuses","selectServiceRequestsKanbanData","tickets","dataList","section","selectShowAddSubTicket","showAddSubTicket","selectEdit","parentTicket","ticket","regPublicUrl","billableAdminUrl","initServiceGroupsData","ServiceGroupPicker","serviceGroupFilterUrl","FormServiceGroupPicker","doShowDetails","doExternalSearch","doSaveArticleAssociation","articlesSaga","externalId","externalIdSource","showDetails_Success","externalSearch_Skip","searchForm","Source","externalSearch_Success","Count","Items","StatusCodes","TOO_MANY_REQUESTS","TooManyRequests","externalSearch_Error","isNew","fn","Queryable","AwaitingApproval","PublicationAwaitingApproval","Success","saveArticleAssociation_Success","mes","saveArticleAssociation_Error","showDetails","externalSearch","chnagePage","saveArticleAssociation","article","resetArticleAssociationState","someAction","clearArticleDetails","articlesActions","useArticlesSlice","shiftRight","doGetItems","doGetMoreItems","doSetSelectedStatuses","doReorder","doInsert","selectorChangeSaga","monitorSelector","doShowEdit","doShowEditParent","serviceRequestsKanbanSaga","ENTITY_SET_URL","fetchTicketsByStatusId","fetchTicketsParams","statusId","skip","fetchTicketById","FETCH_SELECT_EXPAND","$orderBy","notificationMessageKey_getItems","bar","getItems_Success","getItems_Error","getMoreItems_Success","loadedIds","currentStatusIdentifiers","getItems","indexChanges","ServiceRequestStatusId","destinationSectionId","destinationIndex","reorder_Success","reorder_Error","sourceIndex","sourceSectionId","notificationMessageKey","AssignedTo_Id","AssignedTo","Priority","SamplesCount","ParentTicket","ParentTicketId","insert_Success","GenericInsertSuccessMessage","insert_Error","modelState","getModelStateErrors","GenericUpdateSuccessMessage","extractErrorMessages","previousValue","currentValue","takePattern","nextValue","take","openSidePanelProps","showEdit_Success","ServiceRequestTicketDetails","showEdit","showEdit_Error","getMoreItems","setSelectedStatuses","reorder","showEditParent","selectedStatusIds","fetchCount","sourceSection","destinationSection","removed","updateSamplesCount","serviceRequestsKanbanActions","useServiceRequestsKanbanSlice","originalSamplesCount","sum","aggregatedValues","minMax","average","median","mid","floor","unique","uniqueCount","Map","getFirstDefined","args","flattenBy","recurse","emptyArray","emptyObject","resetGroupBy","setGroupBy","useSummary","stateReducers","visibleColumnsDeps","instance","useInstance","prepareRow","previousState","groupByColumns","col","nonGroupByColumns","isGrouped","groupedIndex","pluginName","defaultUserAggregations","flatRows","rowsById","allColumns","groupByFn","defaultGroupByFn","manualGroupBy","aggregations","userAggregations","plugins","autoResetGroupBy","disableGroupBy","defaultCanGroupBy","ensurePluginOrder","defaultColumnGroupBy","defaultGroupBy","columnDisableGroupBy","canGroupBy","Aggregated","existingGroupBy","aggregateRowsToValues","leafRows","groupedRows","depth","aggregateFn","aggregate","groupedValues","leafValues","columnValue","aggregateValue","aggregateValueFn","groupedFlatRows","groupedRowsById","onlyGroupedFlatRows","onlyGroupedRowsById","nonGroupedFlatRows","nonGroupedRowsById","groupUpRecursively","parentId","rowGroupsMap","aggregatedGroupedRows","groupByVal","subRows","groupByID","subRow","summaryRows","getAutoResetGroupBy","useGetLatest","useMountedLayoutEffect","preGroupedRows","preGroupedFlatRow","preGroupedRowsById","allCells","cell","isPlaceholder","isAggregated","resKey","TableCard","viewCheckBox","useSelect","hasAdditionalActions","hasInlineRowActions","someSelected","showTitleCell","contentEditable","useButtons","cells","sizeOfMobileCard","img","hasImg","imgSrc","showSelect","setShowSelect","isDisabled","render","CardMouseOver_info","backStyle","imageSrc","selectVisible","checkBox","showBullet","mobileSize","toggleRowSelected","useImage","topActions","hasTopActions","cardContentRows","TabsToolbar","leftTabs","selectedValue","selectedArray","rowsCount","getMultiMode","onAllRowsSelected","disableMultiMode","defaultMultiMode","rightTabActions","multiMode","setMultiMode","TabsContainer","Grow","Tabs","updateIndicator","selectionFollowsFocus","indicatorColor","tab","allPagesUnselected","Unselect","ClearSelection","CoreMultiSelect_info","CoreSelectAll","genericMemo","FloatingContainer","insetBlock","insetInline","bottom","SperActions","FloatingActions","selectedActions","totalRows","buttonActions","maxButtons","baseActions","sperActions","fixedContainer","fixedContainerMobile","isPopup","mobile","compactActions","CustomToolbarFunc","customRoot","tabsContant","buttonsContant","CustomToolbar","RenderRow","onRowClicked","canClickRow","TableRow","getRowProps","TableCell","getCellProps","CustomEmptyTable","TableHeaderCellLabel","RenderGroupedRow","ImportButton","handleImport","menuItems","showSingleImportButton","keepMounted","defaultGetSubRows","defaultCheckIfRowIsSelectable","tableRowsSize","getSubRows","manualPagination","manualSorting","enablePagination","alwaysShowTableHeader","baseSortBy","globalActions","filtersButtonAnchorEl","setFiltersButtonAnchorEl","useSortBy","useExpanded","usePagination","addRowSelect","columnsDefinition","columnDefaults","DefaultRenderer","useTable","manualSortBy","manualGlobalFilter","autoResetSelectedRows","autoResetPage","getTableProps","getTableBodyProps","headerGroups","reactTableRows","reactTablePage","gotoPage","setGlobalFilter","selectedFlatRows","isAllRowsSelected","setSortBy","isSomeSelected","accumulator","appliedFiltersLength","alreadySelected","setAlreadySelected","filterRef","handleFilterOpen","customProcesing","globalSearchOpen","selectGlobalSearchOpen","showGlobalFilter","defaultPageActions","dataCount","FilterIconButton","filterLength","innerRef","rowsPerPageOptions","sortedUniq","handleSortBy","sortAction","newSortBy","sortDescFirst","isSortedDesc","existingSortBy","existingIndex","hasDescDefined","sortByActual","topMessage","setTopMessage","setGlobalMessage","ShowNotRelatedServiceGroups_warning","autoHideDuration","isCards","setIsCards","print","onLoading","baseTableActions","ConfigureColumnsButton","ExportButton","selectedFilterRowProp","onDownloadTemplateClick","Table","Cards","table_id","tableHead","TableHead","headerGroup","getHeaderGroupProps","getHeaderProps","getSortByToggleProps","TableSortLabel","IconComponent","TableHeaderIcon","isSorted","hideSortIcon","TableContainer","tableContainerSyles","TableToolbar","showMenu","showGlobalSearchIcon","toggleGlobalFilter","FilterContainer","BasicFilter","tableButtonsRoot","tableButtonsRootShort","tableButtonsLeft","tableButtonWrap","tableButtonNoWrap","SelectedActions","GlobalFilter","FiltersButton","tableButtonsRight","tableButtonsRightShort","filterDisplayRoot","filterDisplayRootShort","FiltersGroupDisplay","openFilter","useCustomToolbar","useTabsSection","selectedTabValue","showClear","tableContent","tableContentShort","TableError","TableCardGrid","tableScrolling","table","withFooter","TableBody","rowIndex","summaryRow","tableFooter","tableFooterWithBorder","TablePagination","colSpan","rowsPerPage","labelRowsPerPage","MenuProps","menuPaper","onChangePage","onChangeRowsPerPage","newPageSize","ActionsComponent","TablePaginationActions","NoTableData","useFloatingActions","selectedFloatingActions","buttonFloatingActions","tableContainer","tableHeaderCell","borderRight","tableHeader","tableRowContainer","tableRowCell","tableRow","tableFooterContainer","shadow","useTableCardsStyle","card","cardVertical","cardHorizontal","cardSkelet","RenderTableRowsItems","aria-live","aria-busy","xs","RenderTableHeaderCells","RenderTableRows","TableCardsSkeleton","TableRowsSkeleton","flexGrow","marginBottom","sm","Toggle","Switch","BasicToggle","isChecked","setIsChecked","withInfoLabel","baseLabelStyle","FormGroup","control","Comments","defaultComment","cannotComment","emailType","changed","setChanged","comments","finally","withMentions","Invoice","referenceName","CalendarButton","openToBook","useCalendarLink","GetSchedulerPagePath","calendarPageFullPath","selectGlobalDbSetting_EnableLegacyScheduler","Select","renderValue","classNames","ITEM_HEIGHT","displayEmpty","SavedLists","savedActions","selectedServiceGroups","fetchView","myViews","setMyViews","fetchViewState","fetchViewPromise","selectedView","displayedOptions","searchText","getViewDislpayName","renderedView","selectedChangeLocation","selectedViewChange","removeSelected","openDetailsList","FilterBox","InstrumentList","PleaseSelectView","MySavedLists","ListItemText","SharedLists","ManageLists","AddSavedView","EnumPicker","nameRender","EnumNamesArray","selectedOption","withEnumOptions","NumberFieldFilter","assetBuildingUrl","publicBuildingUrl","LocationsUrl","initBuildingData","BuildingPicker","isAuth","assetCampusUrl","publicCampusUrl","initCampusData","CampusPicker","CampusByServiceGroupFilter","convertRoomWithBuildingName","BuildingName","assetRoomUrl","initRoomData","RoomPicker","RoomByBuildingFilter","TableToolbarHeader","FormSectionTitle","gutterBottom","memo","alertContent","showAlert","titleIcon","titleAsColumn","disableGutters","shortview","edge","titleAndIconMobile","RefreshIcon","RefreshContent","FlexRowDiv","initAssetData","AssetPicker","UnconfigurableTable","onExportForImport","setData","setDataLength","setControlledPageCount","serializedCustomFilter","handleSelectedRowsChange","doUpdateSections","doSaveSections","printPDFSaga","selectPrintPDFSections","sections","updateSections","saveSections","isLoading","useSections","setPrinting","setUseSections","Sections","updateSection","clearLoading","tables","printPDFActions","usePrintPDFSlice","StyledTopBar","drawerWidth","sidePanelWidth","drawer","transitions","easing","sharp","duration","leavingScreen","enteringScreen","SubTopBar","attrs","easeInOut","ProfileSection","StyledUserMenu","Section","LeftSection","RightSection","RowSection","FormFieldsBox","GetBooleanByKey","EnableLegacyScheduler","FormAssetsPicker","initReservationStatusMultiData","ReservationStatusMultiPicker","BaseOptionsMultiPicker","ResrvationStatusMultiFilter","Future","getInitUpcomingReservationfilterMultiData","UpcomingReservationfilter","AllReservations","WorkflowBookingFilter","WorkflowBookingPicker","initReservationByIdWithPartsData","ReservationByIdWithPartsPicker","ReservationByIdWithPartsFilter","InstrumentFilterChip","InstrumentsFilterDisplay","handleDelete","border","noWrap","chip","GetFilters","RG_DatePeriod","pushServicesFilter","initData","pushBookedByFilter","budgetsFilter","getBudgetsFilterSettings","pushAssetCatGroupFilter","pushAssetCatFilter","pushAssetAvailabilityFilter","Institute","initInstituteData","InstituteFilter","ExcludeStatus","UserGroupFilter","ReservationsRelatedToReservationId","refreshAfterInit","ReservationParts","OrderedBy","ReservationStartsOn","DatePickerFilter","ReservationEndsOn","Loanable","Duration","NumbersRangeFilter","Department","initDepartmentData","DepartmentFilter","InstituteType","initInstituteTypeData","InstituteTypeFilter","Model","TextFieldFilter","ModelNumber","pushRoomFilter","pushBuildingFilter","Discipline","UserDisciplineFilter","initUserDisciplineData","pushBudgetManagerFilter","pushCampusFilter","UpcomingReservations","pushWorkflowBookingFilter","AssetCatGroupName","initAssetCatGroupData","AssetCatGroupFilter","AvailabilityType","initAvailabilityTypeData","AvailabilityTypeBookableFilter","BudgetManager","AssetCategory","initAssetCatData","AssetCatFilter","RoomPickerFilter","Building","BuildingPickerFilter","includeAllMyManagedServicesOption","allMyManagedServicesOption","AllMyManagedServices","InstrumentServiceName","ServiceAdminFilter","ServiceReservationFilter","ServiceMultiFilter","pushServicesCalendarFilter","renderFilterDisplay","Campus","CampusFilter","initWorkflowBookingData","doSaveState","doSetRepetitiveValue","repetitiveSaga","saveState_success","setRepetitiveValueSuccess","setRepetitiveValue","repetitiveValueHandler","resetRepetitiveHandler","useRepetitiveSlice","ServiceGroupRegistrationStatus","configurableColumnsCache","force","param","getTableColumns","ConfigurableColumnsSetUp","j","hasCustomName","CustomName","ColumnExportConfig","RemindBefore","useAdminPermissions","allowedToEdit","allowedToAdd","HasCreateAdminGroupPermissions","allowedToEditOffline","allowedToAddOffline","allowedToEditBatch","allowedToEditGroup","allowedRoles","hasRolePermissions","defaultUrl","initUserMultiData","UserMultiPicker","filterKey","FormOnlineServicesComboPicker","FormOnlineServicesSinglePicker","mapAssetsToServiceFilterDto","mapAssetsToServiceTypeFilterDto","FormBudgetPicker","FormFundingTypePicker","ServiceRequestMilestoneStatusesUnionArray","toDown","AlertStart","AssignUsers","AssignedUsers","AlertDescription","Downtime","InstrumentWasDown","EventEnd","EventStart","OfflineRemarks","ReasonType","ReasonTypeId","ReasonTypeName","getSingleReminder","RemindMeBefore","WorkOrderTypeStatus","StatusName","RepairCodes","SymptomCodes","AlertTitle","AutoCreateTitle","StaffFormValues","fv","SubmissionFormValues","StuffCustomForm","HasAletForm","IsClosed","ClosedStatuses","ShowOnCalibrationHistory","NotEditable","entities","workModel","repeatAsset","times","repetitive","alert","offlineStart","offlineEnd","dur","alertStart","offend","parseRepetitive","assetGuid","Guid","ass","timesGuid","AssetId","MaxDate","RepeatAssets","RecurringAssetUniq","RecurringGroupUniq","AssetName","getAlertStart","remindBefore","doNotNotify","oneday","twodays","threedays","oneweek","onemonth","isExport","expaneded","customparams","getPredicates","bulletedStyles","overflowX","rowOverRule","SimpleList","BulletedList","infoColors","colorInfoFull","cyan","colorInfoDark","colorInfoHover","colorInfoRegular","colorInfoComponents","colorInfoComponentsLight","colorInfoBorders","colorInfoDisabled","colorInfoBgHover","colorInfoBg","colorInfoBgLight","MuiButtonOverride","textDecoration","contained","containedSizeSmall","containedSizeLarge","textSizeSmall","textSizeLarge","sizeLarge","iconSizeMedium","iconSizeLarge","iconSizeSmall","MuiIconButtonOverride","MuiToggleButtonGroupOverride","borderColor","grouped","groupedHorizontal","borderLeft","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","groupedVertical","MuiToggleButtonOverride","boxSizing","createBreakpoints","lato_Light","src","lato_Regular","lato_Bold","lato_Black","DefaultThemeSettings","typography","overrides","MuiCssBaseline","unicodeRange","BookitThemeSettings","mobileStepper","speedDial","appBar","modal","snackbar","light","textHover","accent","blackComponent","graySubtitle","backgroundHover","grayDividers","MuiTypography","colorError","colorPrimary","colorSecondary","colorTextPrimary","colorTextSecondary","MuiAppBar","colorDefault","MuiLink","MuiSelect","MuiInputBase","adornedStart","paddingLeft","adornedEnd","paddingRight","MuiFilledInput","borderBottomColor","underline","transform","shorter","easeOut","marginInline","borderBottomStyle","marginDense","paddingBottom","inputMarginDense","inputHiddenLabel","inputMultiline","inputAdornedStart","inputAdornedEnd","MuiFormHelperText","MuiFormGroup","MuiFormLabel","asterisk","MuiInputLabel","formControl","animated","MuiInputAdornment","positionStart","positionEnd","MuiSvgIcon","fontSizeSmall","MuiList","MuiListItem","MuiListItemText","MuiListItemIcon","MuiAvatar","MuiTableContainer","MuiTable","MuiTableHead","MuiTableBody","MuiTableRow","MuiTableCell","head","footer","MuiTableSortLabel","MuiTablePagination","caption","spacer","toolbar","menuItem","MuiTextField","MuiChip","MuiButton","MuiIconButton","MuiToggleButtonGroup","MuiToggleButton","MuiSwitch","verticalAlign","colorAdjust","switchBase","shortest","thumb","track","MuiFormControl","marginNormal","MuiFormControlLabel","WebkitTapHighlightColor","labelPlacementStart","labelPlacementTop","labelPlacementBottom","MuiCheckbox","MuiRadio","PrivateSwitchBase","MuiBadge","badge","MUIDataTableBodyCell","MUIDataTableBody","MUIDataTableHeadCell","contentWrapper","fixedHeader","toolButton","MUIDataTableToolbarSelect","paddingLe","MuiDialog","paperWidthXs","scrollPaper","paperWidthFalse","paperScrollPaper","paperFullWidth","MuiBackdrop","MuiAlert","MuiMenu","MuiMenuItem","MuiPickersDatePickerRoot","toolbarLandscape","dateLandscape","MuiPickerDTToolbar","MuiDrawer","up","paperAnchorDockedLeft","MuiPickersToolbar","MuiPickersToolbarButton","toolbarBtn","MuiPickersToolbarText","toolbarTxt","toolbarBtnSelected","MuiAutocomplete","MuiTabs","flexContainer","scrollable","indicator","MuiTab","wrapper","textColorInherit","MuiTooltip","darkTheme","grey","green","animalsThemeSettings","h5","h6","body1","body2","CreateTheme","baseTheme","createMuiTheme","getBaseTheme","initLocationData","LocationPicker","serviceGroup","initServiceGroupsMultiData","initFiltersServiceGroupsData","ServiceGroupByDivisionsFilter","ServiceGroupsPicker","useGlobalServiceGroupsFilter","applyGlobalServiceGroupsFilter","gloabalSettings","HideTopServiceGroupFilter","ButtonConfirm","confirmationDialogTitle","confirmationDialogBody","AreYouSure","InvoiceDetailsSidePanel","InvoiceDetailsSidePanelLink","InvoiceDetails","RequiredFieldsContext","createContext","requiredFields","ValidationSchemaProvider","skipValidation","describe","fieldValidationSchema","getIn","tests","Provider","useIsRequired","useContext","getRunTypeOptions","getRunTypeValue","runtype","RunTypePicker","ShortText","FullText","ImageGallery","imageRendering","backgroundSize","backgroundBlendMode","HtmlRenderer","fullText","setFullText","needButton","setNeedButton","clientHeight","scrollHeight","clientWidth","scrollWidth","ShowMore","ArrayRenderer","indx","AssetRowState","UsersRenderer","Email","OfficeTel","AssetLocationLastUpdate","assetId","fetchState","fetch","Updated","DoubleRender","AssetComments","staffonly","noTitle","getAssetEditLink","divisionId","getRows","PropName","Image","defaultImgSrc","defaultImgMobileSrc","defaultImg","pathSrc","setPathSrc","loadingImg","setLoadingImg","imageDimensions","setImageDimensions","checkImage","onload","onerror","cardImageMobile","backgroundRepeat","backgroundPosition","AssetDetailsImageRender","AssetImageSizeType","NoHeader","validToRender","editLink","DivisionId","ApprovalRequired","TrainingMandatory","MinimumReservationDurationH","MaximumReservationDurationH","ReservationMinimumGap","CarryOverTimeSlotGap","CarryOverTimeSlotTypeName","dependencies","AssetsInstituteBusiness","DivisionName","Accessories","AssetCatEnabled","SeeAllRelatedAssets","setProps","actionType","assetCatGroupId","AssetCat","GroupId","customPredicates","hideCoresToggle","AssetsSelection","InternalServiceAvaliable","assetCatId","NickName","OtherNames","Brand","RoomNumber","LocationsList","EquipmentExpert","ContactsPersonForEquipment","ExternalCompany","MainSpecificationRange","ElectricalSpecs","FunctionalCharacteristics","WebLink","RoutineActiveAnalysisCapable","Tags","Asset_ExtraDate0","Asset_ExtraDate1","Asset_ExtraDate2","Asset_ExtraDate3","Asset_ExtraDate4","Asset_ExtraDate5","Asset_ExtraDate6","Asset_ExtraDate7","Asset_ExtraDate8","Asset_ExtraDate9","Asset_ExtraText0","Asset_ExtraText1","Asset_ExtraText2","Asset_ExtraText3","Asset_ExtraText4","Asset_ExtraText5","Asset_ExtraText6","Asset_ExtraText7","Asset_ExtraText8","Asset_ExtraText9","Asset_ExtraText10","Asset_ExtraText11","Asset_ExtraText12","Asset_ExtraText13","Asset_ExtraText14","Asset_ExtraText15","Asset_ExtraInt0","Asset_ExtraInt1","Asset_ExtraInt2","Asset_ExtraInt3","Asset_ExtraInt4","Asset_ExtraDec0","Asset_ExtraDec1","Asset_ExtraDec2","Asset_ExtraDec3","Asset_ExtraDec4","Asset_ExtraBool0","Asset_ExtraBool1","Asset_ExtraBool2","Asset_ExtraBool3","Asset_ExtraBool4","Asset_ExtraUrl0","Asset_ExtraUrl1","Asset_ExtraUrl2","Asset_ExtraUrl3","Asset_ExtraUrl4","Asset_ExtraRichText0","Asset_ExtraRichText1","Asset_ExtraRichText2","Asset_ExtraRichText3","Asset_ExtraRichText4","Asset_ExtraDDL0","ExtraDDL0","Asset_ExtraDDL1","ExtraDDL1","Asset_ExtraDDL2","ExtraDDL2","Asset_ExtraDDL3","ExtraDDL3","Asset_ExtraDDL4","ExtraDDL4","Asset_ExtraDDL5","ExtraDDL5","Asset_ExtraDDL6","ExtraDDL6","Asset_ExtraDDL7","ExtraDDL7","Asset_ExtraDDL8","ExtraDDL8","Asset_ExtraDDL9","ExtraDDL9","Asset_ExtraDDL10","ExtraDDL10","Asset_ExtraDDL11","ExtraDDL11","Asset_ExtraDDL12","ExtraDDL12","Asset_ExtraDDL13","ExtraDDL13","Asset_ExtraDDL14","ExtraDDL14","Asset_ExtraDDL15","ExtraDDL15","BrandBarcodeNumber","ServiceContract","WarrantyEndDate","LifeDateView","ExportLicense","InternalEquipmentBarcodeNumber","AccountingId","State","SectionName","AssetClassification","AssetLocation","AssetContacts","AssetIdentifiers","AssetAdditionalInfo","AssetSectionLabel7","AssetSectionLabel8","AssetSectionLabel9","AssetSectionLabel10","Doi","doiURL","AssetDoiTooltip","RenderStatus","AssemblyStructure","AssetDetailsLink","Details","renderItem","childRes","Range","MinValue","MaxValue","CommentsAndAttachments","CommentsAreStaffonly","isBookable","isOnlineService","moveArrayItem","pos","ri","GetReservationEnabled","notAllowReservations","reservationEnabled","GetUsageEnabled","autoMode","AutoMode","LocalAppEnabled","GetAlertsEnabled","alertsEnabled","RemoveLastEmptySections","pop","GetRawSections","CheckEmptyRawSections","RemoveEmptySections","GetSections","noNameSection","GetRowsSections","leftRes","rightRes","checkSection","getSectionsFilter","resSections","imageSection","removeArrayItem","RowToSections","leftSections","rightSections","RowsToSections","fetchAssetBy","fetchAssetAdditionalData","buttonsData","ButtonOrLink","CreateAnAssetRelatedEvent","fetchAlertTypesPromise","fetchAlertTypesState","fetchAlertTypes","downtimeProps","mismatchCore","PleaseSelectAnEventType","Event","ExcludeAssetDocumentsColumns","AssetDetailsFiles","documentsColumns","getColumns","assetPredicate","groupPredicate","DocumentsTable","notFullWidth","noLabelRendersArray","asHtmlRenderArray","DefautltCell","RenderRows","cellData","RenderLeftSection","RenderRightSection","MismatchCore","MismatchCoreMessage","updateGlobalServiceGroup","sg","MismatchAssetCore_warning","SwitchToThisCore","AssetDetailsTabContent","AssetBookingRules","InstrumentRestrictions","initUser","showTable","assetPickerDisabled","withNoPadding","hideEquipmentFormTitle","withNoWrapper","BaseFilterValues","GetFilter","SetValue","GettableCount","AssetTrainingSessionsColumns","GetPredicates","serviceGroupPredicate","Trainer","updateCounters","AssetTrainingSessions","filterBy","rf","getTrainingFilters","trainingSessionsColumns","AddNew","ManageSessions","goToTrainingSessions","hasNextSession","trainingSessionPrimaryAction","TrainingSessionsTable","AssetArticlesTable","articlePrimaryAction","ArticlesTable","AssetWorkOrdersColumns","AssetCalibrationColumns","calibrationPredicate","GetWorkOrdersTableCount","AssetWorkOrders","workOrdersColumns","PageActions","allowToAddNew","NewWorkOrder","WorkOrder","initAsset","assetName","workOrderPrimaryAction","goToWorkOrders","WorkOrdersTable","ActiveIncidents","Badge","BadgeCounter","hasValue","DropDownTabsWrapper","AssetMobileDropDownTabs","tabs","tabsId","tabsPanelId","handleTabChange","selectedTab","tabPanels","getTabProps","ListItemSecondaryAction","TabPanel","scrollableContent","Content","AssetDetailsTabs","setSelectedTab","handleSelectedTabChange","tabsPanels","BasicTabs","selectedTabIndex","ExpandableRows","DefaultRows","DefaultAttributes","countersForTabs","Reservations","Schedule","WorkOrders","Calibrations","enabled","Publications","TrainingSessions","AssetPopUp","useRedirectToDash","addFromCalendar","setRows","selectColumns","setSelectColumns","expandColumns","setExpandColumns","setButtonsData","loadingAdditionalData","setLoadingAdditionalData","loadingButtonsAdditionalData","setLoadingButtonsAdditionalData","openEndUsage","setOpenEndUsage","assetCover","counters","setCounters","assetProps","isDashboardCore","assetFieldEnabled","tempCounters","updateCountersEnable","dict","loadAdditionalData","ad","AssetAssemblyStructure","Allowed_ByTraining","EndUsageIds","CanRequestAccess","ApprovalStatusId","CanBeCreatedFromLinkOnly","ReservationEnabled","loadButtonsAdditionalData","UsageEnabled","CanStartUsage","CanEndUsage","PlanedEventsEnabled","AlertInfo","NotifyExists","ShowFeed","loadCounters","GetTrainingSessionsTableCount","GetArticlesTableCount","enabledAssetProps","columnNamesFilter","setRequestParams","rn","addArrayItemByName","moveArrayItemByName","rs","assetProp","Division","AssetCatGroup","AlertsEnabled","handleEndUsage","usageData","AssetDetailsApi","catch","getTopAssetActionsDropDown","isMismatchCore","canAddQuiz","useAssetsPermissions","NotificationIsAvailable","EditSettings","Settings","menu_AddNewTrainingSessions","NewTrainingSession","UntrainedToolTip","Calendar","Timeline","PrintSelectedAssetLabelsButton","PrintLabels","menu_ReservationsHistory","UsageHistory","Quizzes","TrainingQuiz","AlertsIcon","ScheduledEvents","RequestAnOtherService","CreateNewSampleRequest","ResCancelNotifications","ReservationNotification","NotifyToolTip","NoNotifyToolTip","EditRemainders","AddRemainders","CalendarPublicIntegrationFeed_Icon","OutlookGoogle","useTopAssetActionsDropDown","addWorkOrder","addReservation","ReservationCreateButton","PlaceAReservation","instruments","openPanelOrCover","addUsage","StartUsage","Use","StopUsage","Stop","addTakeDown","hasDownActive","noAlerts","hasActive","alertId","HasActiveDownAlertsAdmin_info","Up","TrendingUpRounded","HasNoAlertsAdmin_info","SampleRequests","ReportAConsumable","stid","ReportConsumables","LogConsumables","SwitchToCoreOpenItsBoard","CoreBoard","approvalStatus","RequestAccess","addRequestAccess","assetActionsDropDown","AssetDetailsTab_Details","commentsForStaff","BookingRules","AssetDetailsTab_WorkOrders","handleCloselClick","ShowAssetFull","EndUsageConfirm","Messages","err_Equipment_NotFound","tt","isPathAndQuery","ActionIconButton","SwitchTarget","updateX","openReservation","openWorkOrder","SwitchToReservationTitle","SwitchToDowntime","setSelectedOption","SectionTitle","OpenWorkOrderButton","buttonName","orderId","bringBackUp","orderProps","panelProps","openOrder","menu_EditWorkOrder","WorkOrderLink","useOpenWorkOrderPopUp","FormOfflineServiceTypePicker","useCommentStyles","commentSection","commentTextFiles","commentText","nameAndTime","nameTitleButtons","nameTitle","useContainerStyles","commentsContainer","sectionTitle","controlBox","addCommentBox","leftSide","rightSide","alertSpacing","flexBasis","itemCheck","fileSizeToString","dp","thresh","abs","units","round","FileButton","canRemove","onDeleteFile","openDelete","setOpenDelete","sendNotifications","useResponseModel","msg_DeleteFile","Grid","rawName","suffix","shortenName","Delete","err_DeleteFileFailure","selectLargeFilesUpload","largeFilesUpload","selectLargeFilesCanUpload","selectLargeFilesUploading","selectLargeFilesStartedToUpload","selectLargeFilesUploadTargetId","selectLargeFilesUploadFilesNumber","selectLargeFilesUploadSelectedFiles","minChunkSize","UploadLargeFile","_pause","_busy","finished","fileId","uploadId","NeedCompleteMultipartUpload","uploadResponses","pause","DeleteUnfinishedLargeFiles","chunkSendResult","continueFrom","uploadEnd","CompletionResult","conscreateCancelToken","chunkSize","uploadChunk","Result","FileId","UploadId","ETag","PartNumber","CompleteMultipartUpload","finish","uploadChunck","fileName","chunck","EMPTY","chunk","FileCard","remorFile","canUplpoad","setInProgress","setProgress","setPart","setError","setShow","setPause","getFileSize","notificationActions","uploadLargeFile","closeHandler","deleteUnfinishedLargeFiles","upload","stopAndCancel","Card","CardContent","ErrorDueUpload","ReUploadFile","string","SelectFile","filesPlaceholder","downloadFileName","maxFilesCount","maxSize","maxFiles","onDrop","acceptedFiles","useDropzone","getRootProps","getInputProps","StyledDropboxContainer","borderWidth","borderStyle","outline","LargeFilesUpdate","AllowLargeFilesUpload","fh","MaxLargeFileSize","MaxUploadFileSize","DragTheFilesOrBrowse","Attachments","Template","AddComment","bindSubmitComment","formRef","scrollIntoView","behavior","block","inline","userSchema","Users","initial","handleSubmit","resetForm","validationSchema","formik","submitForm","getFieldHelpers","VisibleToUsers","fixedWidth","WriteAComment","isSubmitting","CommentCell","onEditComment","onDeleteComment","setHover","setEdit","setFiles","currentUserComment","CreatedBy","uploadedFiles","commentId","filesUpload","getComments","newComment","Avatar","onMouseEnter","onMouseLeave","Edit","CreatedAt","CommentsContainer","emailBody","emailSubject","shouldSendEmail","setCount","sortedComments","writeCommentOpen","setWriteCommentOpen","sendMail","useSendMail","createEmail","DefaultEmailTemplateBody","DefaultEmailTemplateSubject","DefaultPageName","DefaultReferenceName","CommentsCount","Comments_EmptyMessage","Subject","renderToStaticMarkup","SaveToLog","Cc","Bcc","BookitDateTimePicker","dateId","timeId","dateName","timeName","dateLabelInline","timeLabelInline","parsedValue","setTimeValue","setDateError","handleDateChange","displayValue","getSeconds","handleTimeChange","dateError","timeError","setTimeError","handleOnError","onDateError","onTimeError","noLabelInline","datePlaceholder","timePlaceholder","selectAssetInventory","assetInventory","selectRoomSelected","selectedRoomState","selectLocationSelected","selectedLocationState","selectSubLocationSelected","selectedSubLocationState","selectScanProcessing","scanProcessing","selectNoRoomAccessProcessing","noRoomAccessProcessing","selectInventoryLogFilters","logFilters","ViewLengthsArray","viewLengthOptions","shortName","viewTypeOptions","visibility","hasPopupIcon","hasClearIcon","clearIndicatorDirty","popperDisablePortal","disabledOpacity","filterByServiceGroups","initCompleted","ServiceGroups","InvoiceStatuses","selectPrintPDF","printPDF","selectPrintPDFPrinting","selectPrintPDFisLoading","RepetitiveFor","DATE_PERIODS","DatePeriodsPicker","getOptionsCallback","MAX_SIZE_DEFAULT","AssetThumbImage","hasImgeBroken","setHasImgeBroken","avatar","alt","getContrastText","FormAutocompleteOptions","FormAutocomplete","FormAutocompleteMultiOptions","FormAutocompleteMulti","ExternalApi","formFieldId","isMultiple","OptionsSourceType","deserializeOptions","optsArray","opt","CustomFormDropDown","externalLoadData","getBlackColorOption","getColorOption","serializeSchedulerDateOrUndefined","formType","updateOption","reccurentAssetId","recurrentGroupId","alertTypeId","added","operation","Values","rowValues","getArray","modelValue","LocationDetails","hasChanges","shallowEqual","DeatilsOperations","handleSubmitForm","submitFormRef","handleCancelClick","PageComponent","bindSubmitForm","handleSubmitCallResult","submitcall","LocationContent","ModelDetails","Update","IdSpec","onBeforeunload","CatRateTypes","InvoiceChildRowBaseSchema","PleaseSelectABudgetNumber","PleaseSelectServiceGroup","PleaseSelectADate","AllowCreateInvoicesBy","AddPayment","notifyActions","submitRef","refreshTable","sendResponse","closeApproved","closeRejected","paymentId","invoiceId","submit","payment","PaymentApi","UpdatePayment","success_EditInvoicePayment","err_EditInvoicePayment","err_InvoicePaymentAdd","budget","Method","setinitialValues","BudgetNumber","MethodId","PaymentMethodName","isMounted","PaymentSchema","optional","err_PaymentMethodRequired","PleaseEnterAnAmount","positive","InvalidValue","getPaymentSchema","PaymentSchemaWithBudgetNotRequired","getPaymentSchemaWithBudgetNotRequired","Paymentform","validateOnMount","inputMode","FormPaymentMethodPicker","PaymentMethod","Submit","Payment","AddPaymentInvoice","ChargeApi","Resource","OtherService","BaseRate","CatRateTypeId","FeeType","SampleTypeId","SampleType","ActualRate","FormCatRateTypePicker","CatRateTypePicker","OfflineServicePicker","FormOfflineServicePicker","FormSampleTypePicker","FormServiceUserGroupPicker","ServiceUserGroupPicker","AddCharge","insertedAt","setinsertedAt","insertedBy","setinsertedBy","userGroupByBudeget","Manual","setInitialValue","OnlineServiceId","OnlineService","CatRateType","SampleServiceId","SampleService","queryBudg","budgetRes","serviceGroupRes","budegtval","success_EditInvoiceLine","msg_addedChargeSuccessfully","budgetOnly","CreateInovicesBy","AlllowCreateInvoicesBy_BudgetsOnly","ChargeSchema","catRateType","Refund","negative","GetChargeSchema","ChargeForm","setAmount","bySystemSetting","manual","Equipment","Charge","AddManualInvoiceLine","LabelTypePage","LabelTypeEdit","useAllowedToChangeStatus","readOnlyUser","ArticleDetails","selectedArticle","refreshDetails","isSaved","articleDetailsForm","allowedToChangeStatus","CreatedByMe","PublicationRecordApproved_info","useCanEdit","canEdit","canAdd","useCanAdd","firstLoad","setFirstLoad","ExternalId","ExternalIdSource","openExternalEntry","ArticleEdit","editArticle","ArticleForm","getValue","PublicationDetails","EditAssociationButton","Authors","EnteredBy","EnteredAt","ArticleDoiLink","doi","ArticleDataset","Dataset","ISSN","ORCID","ORCIDs","Year","RelatedUser","RelatedUserDisplayName","CalibrationRecord","Journal","ArticlePageNumber","PageNumber","ParticipatedLabs","ParticipatedInstruments","Abstract","EditArticle","EditAssociation","AssociateThisPublicationTitle","AssociateThisPublication","FormAssetPicker","assetSchema","assetsSchema","GetInstrumentFilter","sv","GetCalibrationRecordFilter","test_s","FormCustomPicker","CustomPickerFilter","ArticleWorkOrdersPicker","ArticleFormPicker","NewArticleDetailsForm","oldServiceGroups","setOldServiceGroups","setServiceGroups","setInstruments","canEditStatus","setCanEditStatus","ServiceGroupAsset","otherwise","handleCloseClick","instrumentFilter","CalibrationRecordFilter","handleFormChange","setTouched","ArticleContributionLevelId","FirstInstrumentAssetName","FirstServiceGroupAssetName","CalibrationRecordName","DepartmentId","DepartmentName","InstituteId","InstituteName","InstituteTypeId","InstituteTypeName","statusPickerData","AddPublication","validateOnBlur","ValueLabel","ArticlePleaseSelectEquipmentFirst","PleaseSelectWorkOrder","CalibrationRecord_info","PleaseSelectAUser","PleaseSelectAsset","ArticleComments","commentsFormRef","setchanged","newSavedComments","setNewSavedComments","newComments","setNewComments","Article","portalRef","Portal","ConvertNewToComment","EditArticleDetailsForm","editProcessing","detailsLoading","submitCommentRef","GetServiceGroupAsset","SaveFormButton","ConvertModelToEntityUserAttributesDetails","Attribute","AttributeLocalized","SSO","SSOAttribute","RegistrationForm","UserDetails","UserSidePanel","Order","ConvertEntityToModelUserAttributesDetails","UserAttributesApi","userAttributesDetailsSaga","initUserAttributesDetails_Success","initUserAttributesDetails_Error","initUpdateUserAttributesDetails_Success","initUpdateUserAttributesDetails_Error","menu_UserAttributes","UserAttributesDetails","createUserAttributesDetails_Success","createUserAttributesDetails_Error","updateUserAttributesDetails_Success","updateUserAttributesDetails_Error","initUserAttributesDetails","initUpdateUserAttributesDetails","createUserAttributesDetails","updateUserAttributesDetails","resetUpdateUserAttributesDetailsState","resetCreateUserAttributesDetailsState","userAttributesDetailsActions","selectUserAttributesDetails","userAttributesDetail","selectCreateUserAttributesDetails","selectCreateUserAttributesDetailsCompleted","selectUpdateUserAttributesDetails","selectUpdateUserAttributesDetailsCompleted","selectUserAttributesDetailsProcessing","UserAttributesForm","isNotEditableField","userAttributesDetailsSchema","sso","formikHelpers","UserAttributeDetails","MandatoryFieldsArePartOfTheRegistrationForm","hasUnsavedChanges","requestCreateCompleted","requestUpdateCompleted","createModel","editModel","baseModel","requestCompleted","setRequestCompleted","handleSaveClick","EditAttribute","AddNewAttribute","Priorities","getInitialValues","getTicketSchema","samplesAutomationEnabled","parentSamplesCount","samplesRequired","PriorityPicker","FormPriorityPicker","FormServiceRequestStatusPicker","ServiceRequestStatusPicker","Form","AssignedSamplesToThisTicket","AddSubTicket","ServiceRequest","SubSamplesCount","TotalSamplesCount","handleCancel","AddSubServiceRequestTicket","editState","editItem","enableAddSubTicket","handleAddSubTicketClick","ParentTicketDetailsButton","updated","getServiceRequestTicketTitle","ServiceRequestTicket","ServiceRequestTickets","StockRenewalForm","innerFormRef","onRenewStockClick","onAddServiceClick","onAddBatchClick","fieldHandler","validateForms","resetFieldHandler","serviceChanged","setServiceChanged","recentMostBatchesChanged","setRecentMostBatchesChanged","allIsValid","setAllIsValid","servicesSelected","setServicesSelected","validateForm","otherServicesSchema","changeOfflineServices","addedServ","stockRenwevalSchema","err_OfflineServiceTypeRequired","err_DateReceived_required","initServices","prepareService","otherData","StockRenewal","createServices","staticServices","onRemoveService","onRemoveServices","onUpdateService","onAddAndRemoveServices","loadServiceTypes","validateOnChange","enableReinitialize","setErrors","ReportConsumablesMainInfo","ReceivedDateTimeLabel","AutoGenerateNewBatchesDisabled_info","AutoGenerateNewBatches_info","ReportedConsumables","BookQuickServices","createServiceFromServiceType","staticService","createServicesFromServiceType","initServicesFunc","onServiceRemove","onServicesRemove","onServiceUpdate","onServiceClick","useAssetSelection","onAddClick","createdEditable","loadSeviceTypes","renewStock","initialServices","actionCompleted","stockRenewalServicesData","isReadOnlyUser","RoomOnly","assetsFilter","userGroups","renewProps","batchProps","selParams","offTypeIds","StockRenewals","RenewStockForm","onBatchClick","batchRequested","batchChanged","setBatchChanged","serviceTypeSelected","setServiceTypeSelected","minStep","maxStep","computedSchema","renewStockSchema","err_Quantity_required","currVal","err_IntQuantityOnly","Batch","withMutation","NotAllowNegativeInventory_currentEqualsZero_err","NotAllowNegativeInventory_currentMoreThanZero_err","err_InventoryBatch_required","RenewStockInfo","Consumable","PleaseSelectServices","precision","FormInventoryBatchPicker","AddNewBatch","EditSelectedBatch","renewStockData","RenewStockOfConsumables","InventoryBatchForm","inventoryBatchSchema","BatchName","err_BatchName_required","BatchExpirationDate","BatchPurchaseDate","err_BatchPurchaseDate_required","BatchInventory","err_BatchInventory_required","BatchLot","BatchPurchasePricePerUnit","NotAllowNegativeInventory_err","BatchInfo","Inventory_ServiceType_Description","inventoryBatchData","CreateNewBatch","ArticleAssociationForm","SidePanelRenderer","TrainingDetails","QuizCreate","StartQuiz","QuizzDetails","QuizDetails","AddBillingAction","LabelType","RestrictionDetails","PricePeriodsDetails","ArticleNew","InvoiceTemplatePopUp","CoreSelection","CalendarMessagesDetails","ServiceRequestMilestone","ServiceRequestMilestoneDetails","ServiceRequestMilestoneCharge","ServiceRequestMilestoneChargeDetails","InvoiceBatchesComments","AssetInventoryLog","InventoryLog","assetBaseUrl","AssetCatGroupPicker","noGlobalServiceGroupFilter","InstitutePicker","AssetCatPicker","DepartmentPicker","ReservationEditButton","useReservationEditBehavior","ReservationEditButtonLink","legacyURL","InstituteTypePicker","DEFAULT_WIDTH","tryCleanValue","titleValue","parsedTitle","htmlParse","maxChars","toCharsWidth","data-html","TruncatedDescriptionText","Styled","toCssWidth","BasicCard","cardContent","iconTitle","maxContentHeight","imgError","setImageError","imageUrl","loadImage","showHeader","contentHeight","mouseUp","setMouseUp","trimTitleText","trimmedTitle","trimSize","StyledCard","cardActive","cardInfo","cardSuccess","cardWarning","cardError","position_vertical","position_horizontal","cardSize_small","cardSize_medium","parentElement","ImageContainer","mobileSizeMedium","mobileSizeSmall","onLoadedMetadata","onLoad","onClickCapture","BasicCardWithInfo","AssetRenderer","additionalFilters","multipleServiceGroups","filterSettingToCondition","extractValuePart","doLogin","doRedirectToLogin","internalIdLoginSaga","SESSIONSTORAGE_KEY","storeInternalIdLogin","sessionStorage","removeItem","setItem","loadInternalIdLogin","getItem","storedIdentity","init_success","isLargeAnimals","General","InternalId","login","redirectToLogin","logout","initialized","returnUrl","identity","clearError","useInternalIdLoginSlice","FormUsersPicker","initSubLocationListData","SubLocationListPicker","selectRouterSlice","router","selectRouterLocation","selectRouterSearch","selectRouterSearchParams","selectRouterPathname","BudgetExperimentStatuses","OnlineServiceType","getSingleOnlineServiceType","initOnlineServiceTypeData","OnlineServiceTypePicker","roomsEnabled","RoomUserRoleEnabled","Software","LocalApp","Relay","IpRelay","WebRelayTm","WebRelayX600m","UsageForm","LoanDesk","DoorAccess","NiDAQmx","KmTronicRelay","RaspberryPi","GetAvailableOnlineServiceTypes","WorkButton","getAssets","setAssets","workTypes","setWorkTypes","workTypeLoading","setWorkTypeLoading","assetLoading","setAssetLoading","handleAssetChange","getParamFromUrl","AddEvent","wrap","QuickWorkOrderPleaseSelectAssets","wt","AssetAlertType","sympt","aStatus","aStart","sid","handleWorkTypeClick","NoAlertTypesFoundForSelectedAssets","onlineUrl","initMyAssetAvailabilityTypeMultiData","initMyAssetAvailabilityTypeOnlineMultiData","MyAssetAvailabilityTypeMultiPicker","filterLengs","badgeContent","showZero","openProps","SchedulerConnectedWithFilters","customDaysEnabled","twoDaysEnabled","new_state","setFilterOpen","handleFilterClose","handleSetPeriodFilter","updateSearchPeriod","handleViewTypeLengthChange","noChangeLocation","presetValue","searchComp","servicesLimit","limitReached","SchedulerServicesLimitReachedWarningMessage","CalendarHeader","onMultipleModeChange","onFilterClose","onFilterOpen","ErrorBoundary","fallBack","Scheduler","defaultDuration","presetPosition","onDataUpdated","onViewModeChange","onEdit","onCreate","reservationEditEvents","getFilters","MyListFilter","CalendarPageDefaultRedir","calendarPathUserProfileKey","defaultPathName","savedPathName","savedSearch","calendarPageDefaultPath","CalendarPagePaths","CalendarPage","viewStateSearchParams","parseViewState","searchParams","purlSearchParams","schedulerServices","selectedMultipleEvents","handleEdit","handleCreate","selectedEquipment","GetBooleanFilterOptions","BooleanPicker","hideAlert","useDialogAlertSlice","_log","errorInfo","TitleSection","ShortTitle","showCopy","setShowCopy","copied","setCopied","truncatedTitle","cliTruncate","iconSize","domNode","attribs","class","attributes","haidProject","group","combineMandatoryOfflineServices","RemainedSlots","MaxAttendees_NA","TrainingSessionPicker","PleaseSelectATRainingSession","ReservRelatedFilter","RemindBeforePicker","tableRoot","filterPanel","tableButtonsLeftShort","divider","nonEmpty","singleValueToId","mapped","scrollablePanel","hidden","aria-labelledby","initValue","initids","getGetUserSelectionsAutocompleteFn","CustomFormUserSelection","selectRepetitive","selectRepetitiveData","selectRepetitiveFieldHandler","initSampleTypeData","SampleTypePicker","FormRadioGroup","submitCount","showError","touched","StyledFormControl","StyledFormLabel","StyledFormTitle","RadioGroup","StyledFormHelperText","FormLabel","CustomFormAnswerQuestions","QuizScore","Points","indexToAlpha","CustomFormCheckBox","CustomFormDate","CustomFormDisclimer","CustomFormEmail","CustomFormNumberText","CustomFormParagraph","FormParagraph","CustomFormPositiveNumberText","CustomFormRadioGroup","CustomFormRichText","CustomFormShortText","CustomFormField","CustomFormDisclaimer","CustomFormFileUpload","requireComponent","AddService","addService","getServiceTypes","fetchServiceTypes","setServiceTypes","setMenuItems","fetchServiceTypeState","fetchServiceTypePromise","NotFound","AddConsumable","InventoryBatchChip","renderService","handleServiceChange","savedCreatableRenewal","handleBatchListClose","availableBatches","currentBatch","handleChipSelect","InventoryBatchEmptyGenerateOn_info","InventoryBatchEmptyGenerateOff_info","InventoryBatch_notFound","handleBatchListOpen","InventoryBatchList","addNewBatchClick","selectedBatch","showRenewStockButtons","createdRenewal","batchId","batches","QuickItem","QuickServiceItem","mandatory","handleRemove","handleAddError","setQuantity","IsAdminOfService","counterUpdated","setCounterUpdated","arrowTitle","RenewStockArrow_info","ReservationOfflineServiceEditArrow_info","ConsumableCreateArrow_info","ReservationOfflineServiceCreateArrow_info","serviceChange","change","withError","err_LowQuantity","err_HighQuantity","OfflineServiceMandatory_info","valid","StyledBaseTextField","spin","AddCoverConsumable","AddServiceFromSelection","addServices","removeServices","addAndRemoveServices","newSelectedServices","setUpdated","isBarcodeScanned","QuickServiceItems","refreshServices","refreshCosumables","offlineActions","fetchServices","currentUser","serviceCreated","setServiceCreated","setServices","fetchServicesState","fetchServicesPromise","handleRemoveService","handleAddService","StokRenewed","handleAddServices","handleRemoveServices","newServices","handleAddAndRemoveServices","focusedService","hasServices","ScannerView","bookitlab","BookitLab","syncSchedulerEvents","_events","mappedEventIds","getState","min_date","max_date","mapfn","usePrevious","convertAuthToIUserFilterDto","SamplePlatePositionNamingTypes","CustomFormApi","customFormId","CustomFormContent","validationEnabled","sectionStyles","withTopSeparator","withBottomSeparator","isVisibleField","sortedActiveFormFields","styleSection","formName","formIsValid","setInitialValues","CustomFormControl","FormType","onLoadCompleted","onLoadStarted","originalFiles","setOriginalFiles","fetchCustomForm","loadValue","fieldId","InitFormFiles","resvalue","fetchFormValues","getFormValues","fetchFormState","fetchFormPromise","loadedValues","setValues","serializedvalues","vals","handleBadRequest","ModelState","ms","initServiceRequestStatusMultiData","ServiceRequestStatusMultiPicker","exclude","NotFoundPage","Wrapper","DivStyle","viewBox","fill","xmlns","clipPath","stroke","stroke-width","stroke-linecap","stroke-linejoin","stroke-miterlimit","Radio","RadioIconUnchecked","RadioIconChecked","BillingActionsApi","insertBillingActionsDetails","updateBillingActionsDetails","deleteBillingActionsDetails","billingActionIds","getBillingActions","screen","getBillingActionById","billingActionId","getBillingActionInvoices","batchInvoiceIds","processEmailAction","billingActionsParams","invoiceIds","ProcessSftpUploadAction","processStatusAction","getRecipientsEmailAddresses","billingActionsRow","emailTypes","EmailRecipientTypes","ShowOn","specEmailAddresses","SpecificEmailAddresses","PaymentMethods","ShouldCloseInvoice","FormRow","wrapOnMobile","hideRow","selectSamplePlates","samplePlates","selectSamplePlatesData","selectSamplePlatesTableState","selectSamplePlatesCreate","selectBulkSamplePlatesCreate","selectSamplePlatesUpdate","UnitTypePicker","TrainingActivationAllowedBySGAOnly","UpdateActiveTrainingWarningTitle","DeactivateTrainingMessage","ActivateButton","DeactivateTraining","Deactivate","TransformDate","ctx","isType","WorkOrderPicker","WorkOrdersCalibrationFilter","woTypeId","excludeIds","loadWorkOrders","FormRestrictedUserGroupPicker","StatusFilterId","IncludeStatus","EditableTable","getToggleAllRowsSelectedProps","getToggleRowSelectedProps","tableInstance","isSomeselected","handleExport","newPage","range","SamplePlatePositionsPicker","plateId","samplePlateId","loadDatax","plate","SamplePlateTypeRows","columnsCount","SamplePlateTypeColumns","SamplePlateTypeColumnsNaming","Alpha","fromCharCode","SamplePlateTypeRowsNaming","S2Value","TargetSamplePlatePositionsPicker","FormGradientPicker","EstimatedRuntimeMinutes","SampleOverhead","TotalOverhead","SecondaryEquipment","CreateReservationComponent","runDetails","save","setSave","formikRef","CreateReservation","InstrumentId","SecondaryInstrumentId","GradientId","srid","srsid","getReservationDuration","handleCreateReservationButtonClick","DialogTitle","RunDetailsCreateReservation","SaveGradient_info","DialogContent","SampleRunGradient","DialogActions","totalMinutes","ImportSamplePlateForm","setFile","generatePlatesonImport","setGeneratePlatesonImport","handleFileChange","handleCheckboxChange","ImportRecords","ImportComponent","hideMessage","onDownloadTemplateButtonClick","GeneratePlatesOnImport","FormRoomPicker","FormLocationPicker","importStarted","importFinished","ImportTargetSamples","ExportForImportRunDetailsSamples","exportConfigurableColumns","samples_url","exportUrl","GetSelectedActions","validUpdate","Suffix","PopupSuffixComponent","handleSubmitk","AnalyticalSampleIDSuffix","AnalyticalSampleIDSuffix_info","Continue","AnalyticalSampleIDSuffixPopup","SuffixDialog","disableBackdropClick","disableEscapeKeyDown","RUN_DETAILS_PAGE_PATH","RunDetailsPage","requestactions","instrument","secondaryInstrument","gradient","createdDate","acquision_type","showSuffixDialog","setShowSuffixDialog","samples","handleCompleteButtonClick","submitSuffixDialog","showCompleteDialog","runId","handleExportButtonClick","handleDownloadTemplateButtonClick","SampleId","TMT_Type","TMT_Label","SamplePlateId","UniquePlateNumber","PlatePosition","NumericalPlatePosition","charCodeAt","CellPositionToNumber","SamplePlatePicker","TargetSamplePlatePositionPicker","ExportForRobot","useConfigurableColumnsAdvanced","SampleRunsDetails","handleDownloadTemplateClick","DownloadTemplateRunDetailsSamples","hideImportButton","RunDetailsPageInstructions","ExportRunDetailsSamples","paddingX","uploadStyle","buttonRoot","buttonLabel","dividerRoot","previewContainer","previewIconAndText","previewIcon","previewText","previewTextSize","previewCloseButton","previewCloseButtonIcon","FileView","prettyBytes","maximumFractionDigits","mimeType","fileUrl","webkitRelativePath","previewImg","downloadClick","Download","FileInput","onFileChange","uploadLabel","errorMesage","Input","FilesPreview","FileUpload","showPreview","saveFiles","fileInputProps","innerFiles","setInnerFiles","fileValues","setFileValues","updateFiles","deleteFileName","savedFiles","convertFilesToArray","gridRowGap","updatedFiles","newFiles","addNewFiles","FormInputFile","helper","EmailNotificationsApi","NOTIFICATIONS_LOG_PAGE_PATH","TTable","EmailNotificationsPage","withGlobalServiceGroupFilter","scopeOfMonth","DeleteEmailNotficationsMonth","EmailNotficationsScreenWarning","isMainAdmin","Timestamp","Recipient","RecipientName","EmailTo","EmailCc","EmailBcc","EmailMessage","Attachment","selectedRowActions","DeleteEmailNotificationsRows_info","DeleteRows","ConfirmDeleteEmailNotif_title","ConfirmDeleteEmailNotif_message","OK","postData","DeleteNotifications_success","DeleteNotifications_error","menu_EmailNotifications","WebkitBoxShadow","WebkitTextFillColor","caretColor","inputTypeSearch","forwardRef","inputComponent","AdminActions","adminSettings","adminSettingsActions","ar","AssetsRelatedSetting","ButtonLink","StyledLink","GetResponseMessages","infoText","initProjectData","ProjectFilter","AllBudgets","UserDisciplinePicker","loadPublicData","UserDisciplinePublicPicker","initServiceTypeData","ServiceTypePicker","withServiceGroupFilter","initInvoiceIdData","InvoiceIdMultiPicker","getQrUrl","urlTemplate","assetDetails","AssetBarcodeUrlTemplate","getAssetQrUrl","Handlebars","compile","getQrUrlH","generateLabel","labelXml","assetData","globalThis","dymo","framework","openLabelXml","objectMapping","getObjectMapping","objectName","writeData","splittedData","SubLocationName","setObjectText","staticObjectNames","getObjectNames","nameParts","assetPropertyName","properties","shift","Dymo","getPrinters","dymoLabelPrinterOption","printer","Device","initDymoFramework","getLabelWriterPrintersAsync","dymoPrinters","preview","labelType","blob","dataURItoBlob","Xml","download","Blob","getLabelXml","printParams","createLabelWriterPrintParamsXml","twinTurboRoll","TwinTurboRoll","errorDetails","dataURI","byteString","atob","mimeString","ab","ArrayBuffer","ia","Uint8Array","registerHelper","maxLength","fillString","padStart","DymoPrinter","Zebra","BrowserPrint","getLocalDevices","device_list","uid","labels","zebra","Printer","stopWatching","send","getPrinterInterface","doGetPrinters","doGetLabelTypes","doGetObjects","doOpen","doPrint","labelPrintSaga","printers","DymoPrinterSupported","dymo_printers","getPrinters_Error","ZebraPrinterSupported","zebra_printers","serializablePayload","getPrinters_Success","labelTypes","getLabelTypes_Success","getLabelTypes_Error","loadObjects","assetResponse","roomResponse","locationlistsResponse","sublocationlistsResponse","samplePlatesResponse","consumableTypesResponse","getAssetDetails_Success","getAssetDetails_Failure","selectLabelPrint","getAssetDetails","getLabelTypes","DymoPrinterIsNotSupported","print_Error","ZebraPrinterIsNotSupported","printerInterface","RoomBarcodeUrlTemplate","LocationBarcodeUrlTemplate","SubLocationBarcodeUrlTemplate","SamplePlateBarcodeUrlTemplate","ConsumableTypeBarcodeUrlTemplate","QR","printAction","print_Success","printState","closeAssetLabelPrintDialog","selectedPrinter","selectedTemplate","download_Success","download_Error","preview_Success","preview_Error","labelPrintActions","useLabelPrintSlice","initTrainingLevelData","TrainingLevelPicker","TrainingLevelFilter","trainingLevelPermissionsEnabled","userPermissionsEnabled","eq","UseServiceGroupTrainingLevels","initAssetMultiData","AssetMultiFilter","AssetWorkOrderMultiFilter","LocationPickerFilter","BookitlabLogo","BookitlabLoginLogo","CampusPickerFilter","ExportQRCodesButton","ExportQR","initAreasData","AreasPicker","EmailType","EmailTypeUnionArray","BaseToggleButton","mainIcon","separated","ToggleButton","BaseToggleButtonGroupInner","otherOptions","toggleValue","setToggleValue","handleOtherChange","handleToggleValue","newViewType","ToggleButtonGroup","errorBorder","fullWidthButton","hasStartIcon","hasEndIcon","hasMainIcon","withTitle","Other","BaseToggleButtonGroup","filterRoot","scrollPaperCompact","useGlobalDOMEvents","keyup","Filters","PaperComponent","StyledDialogPaper","BackdropProps","invisible","ClearAll","clickAway","clickAwayFunc","AddReservation","serviceIdsRawValue","serviceIds","ServiceGroupsFilter","assetTagsUrl","publicAssetTagsUrl","initTagsData","intIds","strIds","TagsPicker","LoanTypeOptions","initLoanableData","LoanablePicker","initStatusData","StatusPicker","initLockersData","LockersPicker","SubLocationFilter","objectFit","CustomerLogo","customerLink","setCustomerLink","customerImg","setCustomerImg","TopCustomerLogoLink","TopCustomerLogo","CompanyLogo","AssemblyTypes","initAssemblyTypeData","AssemblyTypePicker","SceletonBox","allFiltersLength","loadBookableData","AvailabilityTypeBookablePicker","useRemoveSearch","useAsyncDebounce","Search","NewWorkOrderButton","loadingAsset","setLoadingAssets","useLocationChange","previus","bindPopover","getAssetIds","getEquipmentIds","fetchDownOrders","downOrders","setDownOrders","fetchOrdersState","fetchOrdersPromise","calendarLinkParams","calendarLink","alertslink","aid","downTime","BringBackUpOnWorkOrders","BringBackUpOnCalendar","bookMultiple","menu_WorkOrders","excludeFroExport","configurableColumnsExport","GetTargetColumns","columnsToRemove","ExcludeColumns","Popover","rootMobile","elevation","closeButtonTitle","withoutGlobalServiceGroupFilter","CardGrid","StyledToolbar","cp","doiId","tryGetDoiFromUrl","externalIdSourceType","linkURL","getSinglePaymentMethod","PaymentMethodEnumPicker","SamplePlatePositionPicker","SourceSamplePlatePositionPicker","onImportButtonClick","getSinglePriceSheetMethod","PriceSheetMethodPicker","baseUrl","initSuperGroupData","SuperGroupPicker","DefaultFilter","DecimalRenderer","getSingleServiceTypeEnum","initServiceTypeEnumData","ServiceTypeEnumPicker","Workflow","Workflows","GetAvailableServiceTypes","DateField","AddChargeButton","singleAdminServiceGroup","ServiceGroupBudgetsAdmin","MinTimeAheadPeriodTypes","RestrictionsApi","TrainingStatus","PrerequisiteFor","UserOwnPermissions","onUserChange","permLoading","restrictedOption","handleUserChange","userIsAdmin","ShowRestrictionsFor","clearOnBlur","permRoot","Valid","contentRow","PermissionName","TimeSlotTypeName","TimeSlotTypeId","NoAdditionalRestrictionsFound","res_err_Permissions_StaffOnly","cardTitle","titleOverRule","rowTitle","rowText","cardActions","cardActionsButtons","restUrl","UserPermissionsApi","authuser","equipmentId","setEquipmentId","equipmentGroupId","setEquipmentGroupId","selectedService","setSelectedService","selectedUser","setSelectedUser","fetchRestrictions","restrictions","setRestriction","fetchRestrictionsState","fetchRestrictionsPromise","userRestrictions","setUserRestrictions","fetchUserRestrictions","username","fetchUserRestrictionsState","fetchUserRestrictionsPromise","fetchAsset","fetchAssetState","fetchAssetPromise","getStatus","validRender","PrerequisiteTrainingsIndicators","found","CoreWideRequirement","prerequisites","PrerequisiteEquipments","preq","usrrest","ImageName","userOnChange","assetOnChange","RenderContent","Permissions","PrerequisiteTrainings","Passed","Expired","PreApproved","PreApproved_info","MinReservationOrder","MaxReservationOrder","CarryOverTimeSlotTypeId","MinTimeAheadPeriodValue","MinTimeAheadMinutesSinceMidnight","MinimumTimeAhead","AdvancedReservation_info","ToBeBookedBy_info","Before","AdvancedReservation","MinTimeAheadPeriodType","OnTheSameDay","ToBeBookedBy","RestrictionsOverview","BypassQuotas","BypassQuotasForReservations","BypassUserQuotasAndGaps","BypassUserQuotasAndGapsD","BypassUserQuotasAndGapsD_Description","BypassUserQuotasAndGapsD_DescriptionCont","BypassMinResDurationD","BypassMinResDurationT","BypassMinResDurationD_DescriptionCont","AdditionalRestrictions","titleLink","SpecificUserSlotPermissions_info","ReservationRestrictions","Prog4biz","BookitlabCopyrightNoticeTitle","SoftwareBy","SystemTime","TermsOfUse","CopyrightSection","Copyright","webVersion","lastUpdate","appOffset","appNow","setAppNow","interval","setInterval","clearInterval","align","disableVersionOnMobile","messagesState","selectMessages","selectMessagesAlreadyExist","useOpenReservationSidePanel","useMessageStyles","closeAllKey","pageToType","calendar","reservationStarted","usageReservation","secondaryPage","alreadyExists","hideIconVariant","preventDuplicate","maxSnack","MaxMessage","variantInfo","MessagesChildren","useSnackbar","enqueueSnackbar","closeSnackbar","useMessagesSlice","allMessages","clear","closeAllOptions","removableAnnouncment","gotIt","DashboardAnnouncement","CloseAll","GotIt","RenderMessge","Announcment","loadDesk","ReservationStartedMessage","AllUsagesEnded","InstrumentStillReservered","ReleaseUnusedReservation","YouHaveOngoingReservations","curr","ReservationStarted","UpdateOngoingReservations","UsageReservationMessage","IpRelay_reservationTimeForInstrument","IpRelay_LinkToUsage","CalendarMessage","LoanDeskMessage","ReservationStartedMessage_LoanDesk","WithSpace","Truncicated","getSize","parsed","moreTitle","MoreTitle","truncate","createElement","classList","innerText","appendChild","inner","innerHTML","parentNode","removeChild","MoreLink","MoreButton","TitleIfExists","MorePopUp","WebkitLineClamp","WebkitBoxOrient","actionsStyles","BasicDialogActions","titleContainer","titleSubtitle","closeButton","BasicDialogContentWithTitle","titles","formContainer","MuiDialogContent","BasicDialog","dialogStyles","BarcodeScanApi","sublocationId","doSetSelectedRoom","doSetSelectedLocation","doSetSelectedSubLocation","doSetNoRoomAccess","assetInventoryStateSaga","setSelectedRoom_Success","setSelectedLocation_Success","setSelectedSubLocation_Success","QRCodeBaseLength","minBarcodeAssetLengthString","MinAssetQRLength","setScanProcessing","scanManualBarcode_error","room","subLocation","Barcode","RoomDetails","scanManualBarcode_Success","roomResult","LocationListId","SubLocationDetails","roomSelected","setNoRoomAccess_error","setNoRoomAccess_success","setSelectedSubLocation","setSelectedLocation","setSelectedRoom","scanManualBarcode","setNoRoomAccess","setNoRoomAccessProcessing","setLogFilters","assetInventoryActions","useAssetInventorySlice","doeRefreshReservations","addReservations","addUsages","addLoanDesks","addCalendarMessages","doGotIt","messagesSaga","calendarUrl","func","funcs","getPageMessages","_action","reservationsInValue","_i","usagesInValue","usages","LoanDeskInValue","LoanDesks","withNull","calendarInValue","calendars","refreshUsages","messagesActions","defaultOffService","chosenService","serviceSchema","yup","ServiceInput","offService","onCurrentChange","UsageEndOfflineService","PleaseSelectOptionalOfflineServiceType","UsageEndOfflineService_info","AddOfflineButton","usageProcessing","setSelectedServices","setRemarks","setConfirm","setIds","setOffService","totalServices","isValidSync","ConfirmEndUsage_title","EndUsageConfirmTitle","ConfirmServicesCorrect","NotUsedOfflineServicesPleaseDetailHere_Usage","ConfirmEndUsage","BasicDialogContent","StyledDialogContent","DialogForm","FormContent","BasicDialogTitle","subTitle","rootMobileHorizontal","poperPaper","poperRoot","poperTitle","PopperTitle","poperTditle","RichTextEditor","FormAdminUsersPicker","FormAdminSingleUsersPicker","applyForceFullDayReservations","forceFullDayReservations","pick","truncatedEndTime","adjustSchedulerEventTimes","flow","partialRight","setItems","FilterChip","FilterDisplay","GetPresetDatesRangeDisplayString","getDisplay","UserGroupsProviderTypes","setConfigurableColumns","loadConfigurableColumns","WrongColumnDefinition_info","fetchConfigState","getConfigurableColumns","setConfigurableColumnsExport","loadConfigurableColumnsExport","fetchExport","publicSub","redirUrl","ReturnUrl","setProcessing","handleExportForImportClick","handleExportForImport","rowsCallback","toBigQS","selectedRows","exportRows","MaxRecordsAllowedAssetImport","messageLongQS","err_ImportForExportFailed_longQS","deffMessage","err_ImportForExportFailed","showSingleExportButton","ExportButtonTooltip","ExportToXLSX","DownloadTemplate","allActions","ConfigurableColumnsLink","Columns","prevLocation","TabsWrapper","TabPanelWrapper","RepetitiveControl","saveRepetitive","setInitData","RepetitiveData","newcomment","buttonId","ImportRecordsDescription","ImportRecordsSteps","ToImportNewRecords","UploadTheUpdatedFile","patternOrChannel","keyfn","tasks","isKeyEmpty","task","InvoiceTemplatesApi","insertInvoiceTemplate","invoiceTemplate","HeaderFile","FooterFile","updateInvoiceTemplate","deleteInvoiceTemplates","invoiceTemplatesIds","getInvoiceTemplateById","MainTicket","SummuryBox","ErrorsSummury","ArticlesExternalSearchPagePath","ArticlesExternalSearchPage","budgetExperimentsFilter","resStart","resEnd","BudgetExperimentsPicker","loadBudgetExperiments","FormBudgetExperimentsPicker","UserGroupListener","userGroup","setUser","setBudget","forceDisabled","initilized","setInitilized","serviceSettings","UserNameListener","setUserGroup","BudgetListener","setBudgetExperiment","serviceTypeEnum","fetchBudgetExperiment","budgetExperiments","budg","HideExperiments","experiments","ConnectedFiltersForm","ConnectedFiltersData","startTimeLabel","endTimeLabel","startLabelInline","endLabelInline","orderForConsumables","budgetPickerInfo","connectedData","userChanged","setUserChanged","userGroupChanged","setUserGroupChanged","budgetChanged","setBudgetChanged","budgetExpirementChanged","setBudgetExpirementChanged","startTimeChanged","setStartTimeChanged","endTimeChanged","setEndTimeChanged","ConnectedFiltersSchema","BudgetIsRequired","res_err_BudgetExperimentRequired","err_UserGroupRequired","err_UserFieldRequired","_errEndTimeRequired","err_EndTimeLowerThanStartTime","reserFieldHandler","updateDataState","editAllowed","createUpdateAllowed","SponsorDepartment_Desc","ReservationUser_Desc","ConnectedFiltersControl","saveConnectedFilters","PopupPrintToPDFDialog","boxcontainer","selectFileBox","infoBox","CheckBox","ServiceRequestSectionTypesArray","PopupPrintToPDFComponent","convertItemsToFlags","checkboxes","setCheckboxes","handleCheckboxChecked","preparing","PrintToPDFPopup","ReferenceType","OfflineForm","connectedFiltersFormRef","connectedInit","serviceChangeState","quantityChanged","setQuantityChanged","DefaultBudget","DefaultExperiment","otherServiceSchema","ServiceGroupServicesAllowed","LogDateTimeLabel","offlineService","creditProccessing","creditCompleted","showCalculateCredit","setShowCalculateCredit","handleCalculateCredit","handleCalculateClose","CalculatePricing_info","CalculatePricing","topButtons","OfflineServiceCharges","refType","refId","EditOfflineServiceTitle","AddNewOfflineService","ConsumableLog","Pricing_EstimatedCost","PricingConfirmationOfflineEditText1","PricingConfirmationOfflineText1","Pricing_Balance","Pricing_BalanceResult","ServiceRequestMilestoneStatusPicker","FormServiceRequestMilestoneStatusPicker","toDto","updateCharge","handleSubmitButtonClick","toInitialValues","AddMilestone","Milestone","serviceRequestMilestoneSchema","currentStatus","newStatus","oneOf","FormUnitTypeTypePicker","FormServiceRequestMilestoneChargeServicePicker","selectedType","setSelectedType","insertCharge","serviceRequestMilestoneId","addServiceSchema","handle","enableAddonCharge","enableManualCharge","ChargeTypeToggle","entityValue","ELEMENT_TAGS","A","getAttribute","BLOCKQUOTE","H5","H6","IMG","LI","OL","PRE","UL","MENTION","TABLE","TBODY","THEAD","TR","TD","TH","TEXT_TAGS","CODE","DEL","strikethrough","EM","I","S","STRONG","U","DATA","plain","deserialize","nodeType","textContent","jsx","child","deserializeHtmlString","htmlString","currentSring","DOMParser","parseFromString","serializeItemHtmlString","leaf","leafHtmlString","elementHtmlString","EMPTY_SLATE_NODE","serializeHtmlString","emptyValue","HOTKEYS","RichTextWithMentions","useCodeButton","renderElement","renderLeaf","editor","withImages","withTables","withHtml","withHistory","withReact","createEditor","setInitValue","setTarget","setIndex","setSearch","users","setUsers","mention","setMention","mentions","setMentions","showControlPanel","stringVal","unmounted","Transforms","insertNodes","at","move","distance","prevIndex","nextIndex","rect","ReactEditor","toDOMRange","getBoundingClientRect","pageYOffset","pageXOffset","header","headerControls","editorClass","editorBodyStyle","debounceValue","isCollapsed","edges","wordBefore","Editor","before","beforeRange","beforeText","beforeMatch","after","afterRange","afterMatch","newMentions","getMentions","onMentionsChange","anchor","focus","EnterAUser","spellCheck","hotkey","isHotkey","toggleMark","data-cy","char","isMarkActive","removeMark","addMark","MarkButton","useSlate","BlockButton","isBlockActive","toggleBlock","nodes","LIST_TYPES","isActive","isList","unwrapNodes","setNodes","wrapNodes","marks","StartRichEditor","isInline","isVoid","ReactDOM","createPortal","insertData","getData","insertImage","uri","fnRemoteImage","isImageUrl","isUrl","imageExtensions","deleteBackward","deleteForward","insertBreak","isEditor","SlateElement","isElement","cellPath","Point","fragment","insertFragment","Element","Leaf","ImageElement","useSelected","useFocused","TrStyled","TdStyled","Mention","withPointer","initials","defaultText","PaymentMethodPicker","checkboxProps","headerProps","checkIfRowIsSelectable","shouldSelectPage","checkIfAllSelectableRowsSelected","isSelected","isSelectPage","getToggleAllPageRowsSelectedProps","indeterminate","getConditionalSelectHeaderCheckboxProps","checkProps","getConditionalSelectColumnCheckboxProps","getToggleRowExpandedProps","ScreenToShowOn","initInstrumentCatData","InstrumentCatFilter","UserAssetContactMultiFilter","GetMessagesArray","DoAction1","Failed","DoAction","insertUserAD","BillingPreviewApi","FormView1_UpdateItem","PercentageRenderer","labelPrint","DateTimeRenderer","TruncatedLabel","ArticleLink","openArticle","useOpenArticlePopUp","internalIdLogin","selectInternalIdLogin","selectInternalIdLoginUserId","selectInternalIdLoginUserName","selectLoginType","initCustomPicker","CustomPicker","selectPublicAsset","publicAsset","selectSelectedUnitItem","selectSelectedUnitSearch","selectedData","dataSearch","selectMenuOpen","menuOpen","ServiceTypeFilter","EmailApi","msg_EmailSent","msg_EmailSendingFailed","AddToLists","getEquipments","setLoadingCompleted","hasUpdateError","updateAssets","CreateList","ListRenderer","localized","notLocalizedValue","onlyone","tooltipTitle","initReservationStatusData","NaN","ReservationStatusPicker","PopupImportExportDialog","AutomaticAssetImportNaming","ImprotData","_ScreenId","needReloadTemplateColumns","_ImportAssetImageFiles","_AutoGenerateAssetNamesBasedOn","_UpdateQRCode","_ImportAdditionalData","File","Images","RowCount","AddOnly","book","Excel","Include","fi","hvalue","cn","tvalue","ExcelName","InitHeaderByTemplate","ValueType","Null","SharedString","Formula","RichText","Hyperlink","xlsx","ws","getWorksheet","rowCount","row1","getRow","eachCell","rc","tr","GetCellData","Papa","dynamicTyping","complete","LoadXlsx","LoadCsv","selectFileHandler","Init","TypePicker","AutomaticAssetImportNamingPicker","ByAssetCatModelNumber","ImageList","RemoveImage","removeImage","SelectImageFiles","importing","setImporting","setPaths","MaximumImagesPerOneUpload","MaxImageSize","MaxLoadedAssetImageMbSize","setImages","createObjectURL","AddImages","ClearImages","RecommendationsOfLoadImages","RecommendationsBodyOfLoadImages","InformationToLoadImages","LoadImages","selectImageBox","PopupImportExportStep1","filetype","setFiletype","fileIsSelected","setFileIsSelected","ImportAssetImageFiles","importAssetImageFiles","setImportAssetImageFiles","handleImportAssetImageFiles","handleFileTypeChange","AssetProperties","SelectFileBox","fileType","BulkImportTitle","ImportTenplateHandler","GetTheTemplate","InfoBox","nextName","cancelName","AutoGenerateAssetNamesBasedOn","autoGenerateAssetNamesBasedOn","setAutoGenerateAssetNamesBasedOn","UpdateQRCode","updateQRCode","setUpdateQRCode","app","showInternalCode","ImportAssetAutoNaming","handleImageChange","handleAutoNameingChange","handleUpdateQRCodeChange","ImportAssetAutoNaming_info","ImportAssetsUpdateQRcodes","ImportAssetsUpdateQRcodesInfo","SelectImageFilesBox","MaxFileSize","ImportFileType","DragTheImagesOrBrowse","AssetImgSupportedTypes","BulkCreateNewRecords","Bulk_CNR1","ExcelImportSpecificRequirements","Excel_ISR1","Excel_ISR2","CSVImportSpecificRequirements","CSV_ISR1","Buli_CNR2","UpdateExistingRecords","Update_ER1","Update_ER2","Update_ER3","PopupImportExportProgress","NamePicker","headerRow","StyledTableRow","HeaderColumn","setChecked","handleCheckChandge","HeaderColumnPicker","showPicker","setShowPicker","handleValueChandge","header1","header2","containerCenter","toggleBox","PopupImportExportStep3","toggle1","setToggle1","handleColumnCheckboxChange","handleColumnPickerChange","handleToggleChange1","ToggleBox","back","backName","toggle2","setToggle2","RecordsInTheFile","handleChange1","handleChange2","defaultChecked","FirstRowContainsColumnsName","UpdateAnyExistingRecords","UncheckColumnIfYouDontWantItToBeImported","OnlyFirst5RowsOfTheFileAreDisplayedForPreview","containerRows","rowData","RowData","PopupImportExportStep5","ImportSuccessfullyCompleted","NewRecordsImported","newRows","ExistingRecordsUpdated","existingRows","ErrorsDuringImport","handleDownloadImportErrorReport","DownloadImportErrorReport","DownloadDetailedImportResults","ImportCompletedWithErrors","failed","ImportHasFailed","ImportErrorFailedMessage","ImportAdditionalDetails","ImportBackToPage","ParseResultBlob","jsonBlobSize","jsonBlobSizeText","jsonBlob","GenericImport","resultData","resultFileName","importResult","InsertedRows","UpdatedRows","ImportErrors","Errors","SystemErrorMessage","testmsg","PopupImportExport","budgetType","setStep","setColumns","setImportResult","setResultData","setResultFileName","setNewRows","setExistingRows","cancelFileUpload","cancelImport","LoadExcelfile","LoadTemplateColumns","cc","SetTemplateColumns","ColumnCount","importFileResult","steps","Next","UploadingFile","CancelFileUpload","RowsFound","Back","ImportingData","CancelImport","ImportRowsFor","ImportColumns","initServiceUserGroupData","initUserGroupMultiData","UserGroupMultiPicker","titleStyles","titleBody","disableTypography","dosetSelectedItem","dosetSelectedItems","dosetAssetPublicFilters","publicAssetSaga","setSelectedItem_Success","setSelectedItems_Success","currValue","setAssetPublicFilters_success","setSelectedItem","setSelectedItems","setAssetPublicFilters","setMenuOpen","toggleMenuOpen","setGlobalSearchOpen","toggleGlobalSearchOpen","publicAssetActions","usePublicAssetSlice","InvoiceRowReferenceLinks","references","menu_UsageDetails","SubscriptionId","SubscriptionDetails","OfflineServiceId","PopupImport","downloadTemplateprocessing","setDownloadTemplateProcessing","TagsFilter","LoanableFilter","StatusFilter","LockersFilter","AssetTypesFilter","AreasFilter","OnlineServiceTypeFilter","AvailabilityTypeAvailableMultiFilter","AvailabilityTypeAvailableOnlineMultiFilter","DateLabel","TrainingStatePicker","TrainingStatePickerFilter","ReservationOrDowntimePicker","ReservationOrDowntimePickerFilter","WithReservationsOnlyFilter","ShowAll","WithEventsOnly_info","WithEventsOnly","pushReservationsOnlyFilter","Available","UnderMinimum","Maximum","SignedUp","getTrainingStatePickerFilter","getReservationOrDowntimePickerFilter","printtopdf","PrintToPDF","printPDFSections","printPDFFisLoading","startPrinting","setStartPrinting","componentRef","promiseResolveRef","handlePrint","useReactToPrint","documentTitle","printTitle","onAfterPrint","onBeforeGetContent","saveMarkedSections","StyledDiv","SamplePlateTypePicker","FormSamplePlateTypePicker","FormFieldsSection","FormLeftSection","pageDescription","warningNodes","infoNodes","successNodes","dataErrors","setDataErrors","dataWarnings","setDataWarnings","dataSuccess","setDataSuccess","dataInfos","setDataInfos","colapsedMinHeight","handleCloseError","handleCloseWarning","handleCloseInfo","handleCloseSuccess","succ","propsValue","hasReservation","myReservationId","initCatRateTypeData","bysSystemSetting","getLoadData","batchDeletable","removedBatch","setRemovedBatch","removeBatchOpen","setRemoveBatchOpen","DeleteBatchInventory_title","DeleteBatchInventory_message","ImageRenderer","BaseURLMultiPicker","useServiceIdAction","hrefPath","ID","ServiceIdRenderer","OperationTypeIdRenderer","AssetImageRenderer","OtherServiceDetailsPage","queryProps","getParams","OtherServiceEditLink","handleOfflineServiceClick","otherProps","ServiceFilter","arrayValue","arguments","prototype","excluded","sourceKeys","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","SvgChevronUp","_ref","svgRef","titleId","_ref3","_ref4","_ref5","_ref6","_ref7","_ref8","_ref9","_ref10","strokeWidth","strokeMiterlimit","_ref11","_ref12","_ref13","_ref14","_ref15","_ref16","_ref17","_ref18","_ref19","_ref20","_ref21","_ref22","_ref23","_ref24","_ref25","_ref26","_ref27","_ref28","_ref29","_ref30","_ref31","_ref32","_ref33","_ref34","_ref35","_ref36","_ref37","_ref38","_ref39","_ref40","_ref41","_ref42","_ref43","_ref44","_ref45","strokeLinecap","strokeLinejoin","_ref46","_ref47","_ref48","_ref49","_ref50","_ref51","_ref52","_ref53","_ref54","_ref55","_ref56","_ref57","_ref58","_ref59","_ref60","_ref61","_ref62","_ref63","_ref64","_ref65","_ref66","_ref67","_ref68","_ref69","_ref70","_ref71","_ref72","SvgNotavailable","SvgNotAllowed","SvgIcon","ChevronUpIcon","NotAvailableSVG","htmlColor","NotAvailableIcon","NotAllowedSVG","NotAllowedIcon","initRoomTSData","RoomTSPicker","RoomTSFilter","initTrainingProgramMultiData","TrainingProgramsMultiPicker","applyGlobalServiceGroupFilter","TrainingProgramsMultiFilter","CustomDatePeriods","ShowOnlyWithAvailability","UpcomingSessionsOnly","TrainerName","ActiveSampleTypesPicker","RelevantBudgetPicker","selectedBudget","budgets","IsDefault","CreateNewRequest","chosenUser","setChosenUser","chosenBudget","setChosenBudget","setService","initActiveSampleTypesData","getServiceRequest","getService","showProject","ProjectIsRequired","projectIsRequired","ServiceRequestsApi","AddRequest","Requests_Created_Failure","Requests_Created_Success","propsSide","mt","RequiredLabServiceLabel","PleaseSelectUser","ServiceRequests_Ordering","SidePanelRoot","SidePanelPopper","SidePanelPopup","sidePanelRootExpanded","sidePanelRootCollapsed","backdropOpen","rootopen","rootclose","mobileroot","modifiers","keepTogether","preventOverflow","boundariesElement","flip","ExportToExcel","sheetName","sheet","addWorksheet","workBook","workSheet","addRow","columnNames","GetObjectNames","AddWorkSheetHeader","GetObjectValues","SetWorkSheetHeader","AddWorkSheetData","writeBuffer","buffer","InvoiceStatusPicker","OpenMenuButton","UserRenderer","BasicCheckBox","ViewTypeLengthDropDown","onTypeLengthChange","lengthOptions","haideCalendarViewType","customTimelineDays","customCalendarDays","titletext","itemText","vt","subheader","vl","ExportToPDF","debouncedOnChange","newProps","Reflect","deleteProperty","Documents","menu_Documents","dash_EmptyWidgetTitle","dash_EmptyWidgetBody","LoadingFailed","StaffUsersFiles","StaffOnlyFiles","PublicFiles","FileName","AvailableToUsers","DocumentType","FileType","Signups","TrainingStateRenderer","TrainingResource","DurationH","MinimumAttendance","MaximumAttendance","TotalUsedSlots","UsedSlotsRenderer","HashSymbol","HasNextSession","NextSession","ReservationLinkAction","asLinkRendered","TrainingSessions_Calendar_SignedUp","TrainingSessions_Calendar_UnderMinimum","TrainingSessions_Calendar_Maximum","TrainingSessions_Calendar_Available","iconsize","AllTrainingSessions","globalServiceGroupsFilter","newPredicates","externalPredicates","Articles","menu_AllWorkOrders","getAssetById","expandable","downloadImages","downUrl","scanBarcode","logNoRoomAccess","quizSubmissionId","fetchDataPromiseState","fetchDataPromise","backToQuizess","BackToQuizzes","Quiz","QuizzYourScoreIsXoutofY","Score","MaxScore","CongratulationsYouHavePassedTheQuiz","YouAreNowCertified","TrainingLevelName","Level","QuizSuccessTestMessage","SorryThisDidNotWorkSoWell","QuizFailureTestMessage","StyledScanView","BarcodeScannViewDescription","doGet","doExport","doBulkCreate","doDelete","doDeactivatePlates","doDeletePlates","getLoadDataParams","someResult","genratePlatesFromBulk","LastId","firstId","FirstId","log10","Prefix","plates","samplePlate","SuperGroupFilter","UpdateStatuses","SourceUrl","DeleteRequests","osid","suppliersLabel","RequireSupplierExternalId","SupplierExternalId","notShowTitle","Created","LifeDate","InstrumentCat","OperationType","AssetCatName","AssetType2Counter","Overdue","DueToday","ShortDescriptionOfInstrument","AreaMapId","RoomMapId","CoreName","DivisionAssetId","Raac","MainSpecRange","BrandCode","Rank","ExtraDDL8Value","GasSource","SGA_Public","UnderOriginalWarranty","WarrantyEndDateVisibleAllUsers","canview","EquipmentExperts","AssemblyParent","AssemblyChilds","BookAppVersion","BookAppVersionUpdateDate","LateTime","EarlyLeaveTime","EarlyStartAllowedMinutes","InstrumentType","LocationTracking","LocationUpdatedAt","ServiceTypeEnumFilter","allowedToImport","enabledByCores","isShowAllCores","TakeDown","canExportAssetRanges","ExportAssetRangesTooltip","ExportAssetRanges","AssetRanges","DownloadAssetImages","CloneEquipmentSettings","menu_CloneEquipmentSettings","AssetPickerFilter","CustomRole","InvoiceBatchesCommentsRenderer","ipid","servicedate","bid","be","ecid","po","factor","adg","BudgetIsOnline","HasBalanceOrEstimatedCharges","Company","InfiniteScroll","scrollableTarget","FrontendLayout_MainContent_ID","loader","EventContent","dhx_event_move","dhx_event_click","containerWidth","offsetTopHeight","formatSchedulerTime","formatSchedulerDateTime","EventHeader","TrainingSessionStatus","stateid","TrainingSessionEventConent","TrainingSessionEventHeader","TrainingSessionEventBody","ReservationStatusIcon","reservationStatus","ReservationEventConent","ReservationEventBody","columnGap","rowGap","OfflineEventConent","renderEvent","header_content","body_content","container_width","getBackgroundColor","topEventHeight","getSlotsFromEvent","scroll_hour","originalEvent","getEvent","RenderFC","eventType","RenderEvent","ReactDOMServer","HTMLReactParser","eithSlotsHeight","startHeight","defaultColor","prepareSchedulerSections","r1","produce","groupByOption","currentIndex","groupAssemblyParts","chain","assetCat","mapServiceToSection","scheduler_services_collection_name","getServerListService","serverList","getServerList","scheduleServiceTemplate","mobileView","containerProps","scheduleServiceContainerClassName","scheduleServicePaddingMobile","scheduleServicePadding","scheduleServiceIdAttributeName","imageProps","scheduleImageClassName","labelTextProps","scheduleServiceLabelTextMobile","scheduleServiceLabelText","TimelineServiceContent","timelineEventsSortIteratee","compareFn","valueOf","valueA","valueB","NoServices","NothingToShowForThisScheduler_Title","NothingToShowForThisScheduler_Message","eqStrict","fromEquals","strictEqual","eqArray","eqDependencies","ReadonlyArray","Record","EventTimelineContent","bodyContent","event_text","timeline_event_text","TooltipLine","lablel","TrainingSessionTooltip","statusTextLocalizationKey","statusTextKey","footerTextLocalizationKey","statusClickTextKey","Attendees","MaxAttendees","CampusName","TrainingSignedUp","MinAttendees","TrainingSessions_Calendar_ClickToView","TrainingSessions_Calendar_ClickToSignUp","OfflineTooltip","user_name","ReservationTooltip","reservationHtml","reservationTooltipTemplate","ReservationPendingApproval","DraftReservationStatus","ApprovedByStaff","tooltip_text","HIDE_TOOLTIP","schedulerEvent","TooltipElement","SchedulerEventTooltip","tooltipElementProps","GetSchedulerEventTooltipProps","tooltip_text_fn","currentPosition","forceUpdate","currentView","getView","_mark_now","deleteTempReservations","schedulerRef","deleteEvent","resetEventEdits","updateEvent","findParentTarget","selectors","closest","std","getElementSizes","sizes","_els","add_export_methods","getTimeline","mode","matrix","dpi","zoom","rtl","_export_html","_send_to_export","exportToPNG","exportToICal","_serialize_plain","exportToExcel","templates","xml_format","_serialize_columns","_plain_export_copy","$text","date_to_str","version","skin","_ajax_to_export","_create_hidden_form","firstChild","server","_hidden_export_form","_get_export_size","scales","A5","A4","A3","A2","A1","A0","dataX","cSize","initialSizes","smartRendering","timeline","smart_rendering","nav_height","xy","scroll_width","style_width","_obj","style_height","timeline_scrollable","timeline_smart_rendering","getInitialSizes","setExportSizes","setCurrentView","setInitialSizes","PrintSchedulerToPDF","NEW_EVENT_TEXT","zoomEnabled","schedulerContainer","hasCustomStart","compiledSchedulerReservationBodyTemplate","compiledSchedulerReservationTooltipTemplate","permissionsError","role_err_Permissions","DefaultDuration","restrictTimeSlots","WorkingHours","restrictDuration","durationType","durationAmount","transformedEvent","transformToSerializableEvent","useCustomCompareCallback","attachEvent","detachEvent","handleBeforeDrag","handleBeforeEventChange","is_new","new_end","newSlot","onEmptyClick","handleEmptyClick","containerClassName","action_data","getActionData","new_event","addEvent","initSchedulerEvents","attachEventSettings","old_mode","old_date","prevViewState","currentViewState","x_size","x_length","qst","qet","offsetStart","weeks","getWeekDiff","x_start","adjustMonthTimelineLength","new_viewMode","new_date","event_bar_date","openToReport","alertType","addEventNow","DHTMLX","getSchedulerInstance","timeline_tab","calendar_tab","section_custom","all_timed","treetimeline","daytimeline","multiselect","configOptions","multi_day","details_on_create","details_on_dblclick","start_on_monday","CurrentLocale","tryGetStartOnMonday","edit_on_create","hour_date","mark_now","now_date","time_step","touch","touch_drag","delay_render","drag_event_body","check_limits","scale_width","scale_height","hour_size_px","min_event_height","parse_date","event_class","select_id","event_bar_text","week_scale_date","unit_scale_text","hour_scale","week_date_class","today","orderedServerListData","setServerList","schedulerSectionsGroupByField","y_unit","y_property","column_width","event_min_dy","createTimelineView","x_unit","x_date","x_step","second_scale","week_timeline_start","week_start","get_week_timeline_end","month_start","sharedSettings","property","unitsName","createUnitsView","_key","_label","_date","destructor","handleServiceLabelClick","handleSchedulerClick","serviceContainer","serviceIdAttributeValue","getServiceIdFromServiceClickEvent","dom","capture","stringifiedServices","parsedServices","updateCollection","updateServerList","nonWorkingHoursRef","getUnits","timeSpans","deleteMarkedTimespan","highlights","timeSpan","spanId","addMarkedTimespan","hasMount","useDidUpdate","setRange","newStart","newEnd","showProgress","showNoDataPlaceholder","hideCalData","handleClosePrintToPDF","getTitle","hight","dhx_cal_container","initEquipmentsData","ReservationEquipmentsPicker","ReservationSingleEquipmentPicker","ReservationsEquipmentFilter","firstInitEquipments","mandatoryIds","FormReservationEquipmentsPicker","autoExpand","FormReservationStatusPicker","ReservationCustomForm","customForms","customFormRef","mandatoryForms","optionalForms","isAsyncChangeLoading","selectedForms","formValuesForms","formId","equipmentSettings","StartTimeListener","initialStart","initialEnd","changeHandler","prevStartTime","setPrevStartTime","prevEndTime","setPrevEndTime","isStartChanged","setIsStartChanged","isEndChanged","setIsEndChanged","dt","prevEnd","EndTimeListener","setInitialized","ChipCheckBoxGroup","isRow","ChipLabelGroup","FormChipCheckBoxGroup","setOnChanged","FormChipLabelGroup","ReservationOfflineServices","savedServices","savedServiceEditable","offActions","reservationSettings","hanleUpdateLocalServices","fooBar","OfflineOptional","fetchServiceType","sortFunc","ReservationOfflineServiceDefaultRemarks","servicesFiltered","responseDel","fetchAnyServices","potentialData","hasAnyServices","setHasAnyServices","fetchAnyServicesState","fetchAnyServicesPromise","AccompaniedServicesPicker","SingleAccompaniedServicesPicker","ReservationsAccServicesFilter","FormAccompaniedServicesPicker","CancelReservationButton","ApproveReservationButton","SaveForLaterButton","TransferButton","TerminateReservationButton","CreateTrainingButton","isLoaanDesc","onTerminate","settingActions","terminateProcessing","endUsageOfflineServiceIds","setEndUsageOfflineServiceIds","showConfirmEndUsage","setShowConfirmEndUsage","showEndUsage","setShowEndUsage","usageEndProcessing","setUsageEndProcessing","hasUsageProcessing","setHasUsageProcessing","HasUsage","OfflineServiceTypeIds","TerminateReservationMobile","TerminateReservationWithUsage","FormTrainingSessionPicker","budgetDtoFields","budgetExperimentDtoFields","getBudgetExperimentsValidForReservationPathInfo","getBudgetExpandClause","pp","userId","ReservationBudgetExperimentPicker","getDefaultBudgetExperiment","selectedExpirementId","FormReservationBudgetExperimentPicker","fetchDefaultBudgetExperimentState","fetchDefaultBudgetExperiment","setValueRef","serializedServices","deserializedServices","componentDidMount","BudgetTaskBudgetId","getReservationsLink","trainingSignUp","EditTrainingSessionLink","trainingSessionId","TrainingSignUpAdminAlertContent","attendees","getSessionSlots","TrainingSessionsCountMessage","ManageSignUps","EditTrainingSession","trainingSesisonId","FormReservationTimePeriodPicker","StartTimePropertyName","startField","startMeta","EndTimePropertyName","endField","endMeta","endHelpers","getStoreValue","handleStartTimeChange","originalStartTime","originalEndTime","diff","adjustEndByStart","onStartTimeChange","handleEndTimeChange","onEndTimeChange","datePickerVariant","startTimeDisabled","endTimeDisabled","fetchAssemblies","sorted","Path","assembly","assemblyParts","EquipmentsDataAssemblies","reservedAssemblyParts","extendState","fetchAssembliesPromiseState","fetchAssembliesPromise","popperAnchor","equipmentsData","reservedAssemblyPart","RenderAssemblyParts","NoDataFound","PartsIncludedWithin","err_ErrorOccured","ReservationWorkOrders","onWorkTypeClick","refreshWorkOrders","equipmentIds","relatedAssets","relatedWorkOrders","workOrdersLink","workOrdersLinkTitle","ReservationAlertsLink","StaffOnly_Icon","NoReservationAlerts","PleaseSelectAnAlertType","FormWorkFlowBooking","useWorkFlowPicker","entityVal","ReservationForm","repetitiveFormRef","onEquipmentClicked","onRestrictionsClick","onStatusChange","onOfflineServiceClick","editable","timeEnabled","waitingTransferApproval","transferToUser","terminationEnabled","transferForId","handleTerminate","allowEditMultipleEquipments","offlineServicesErrors","assistedTrainingData","allowOngoingModifications","requestedFor","equipmentChangeState","equipmentChangeCompleted","insertUpdateCompleted","savedForLater","isCreditSubmited","durationErrors","setDurationErrors","permissionErrors","setPermissionErrors","prerequisitErrors","setPrerequisitErrors","customFormErrors","setCustomFormErrors","otherErrors","setOtherErrors","otherWarnings","setOtherWarnings","otherInfo","setOtherInfo","otherSuccess","setOtherSuccess","mandatoryServices","ParentName","resetAllErrors","currentFormFiles","originalFormFiles","reserValueKey","saveRequestedValue","addPrerquisitErrors","ErrorMessage","pre","AllRestrictions","per","prerquisitErrorsHandler","addDurationErrors","durationErrorsHandler","addOtheMessages","setMessage","otheMessagesHandler","addCustomFormErrors","customFormErrorsHandler","addPermissionsErrors","permissionsErrorsHandler","bookedbyChanged","setBookedByChanged","staffChanged","setStaffChanged","accServiceChanged","setAccServiceChanged","statusChanged","setStatusChanged","tutoringChanged","setTutoringChanged","optionalChanged","setOptionalChanged","trainingSessionChanged","setTrainingSessionChanged","setOriginalFormFiles","setCurrentFormFiles","setFirstInitEquipments","setCurrentStatus","isTrainingSignUp","setIsTrainingSignUp","userProfileVisible","tutoringVisible","tutoringEnabled","tutoringAllowed","forceTutoring","hasValidTraining","RequiresAdminApproval","trainingSessionVisible","workflowBookingVisible","workflowBookingEnabled","trainingSignUpVisible","staffVisible","reservationCollaboratorsVisible","staffRequired","warningMessages","AvailableInstrumentsMessage","Approve","res_wrn_NewPendingReservation","RequireGroupCoordApprovalMessage","res_wrn_NewPendingCoordReservation","res_wrn_DraftReservation","MakeFirm","Transfer","ReservationTransferMessage","TrainingSessionsRes_warning","infoMessages","TutoringAssistedReservation","AssistedReservationsPendingApprovalInfo","TransferReservation","TransferredToDetailsMessage","CancelTransfer","resIdTransferredFrom","TakeOverTransfer","NotUsingThisReservation","TerminateReservationInfo","ReleaseUnusedTimeButton","session","ReservationSidePanelAssemblyPart_ErrorMessage","successMessages","ReservationAssistedApproved","equipmentsChangeHandler","selectedEqs","extendStaffMandatoryEquipment","staff","extendMandatoryEquipments","initStaffReservation","staffEquipmentId","accid","singleClick","ft","terminated","staffUser","initTrainingSession","trainingSessionData","setStaffEquipmentRestricted","staffUserName","err_res_StaffUserEquipmentRestricted","staffChangeHandler","StaffEquipmentId","setEquipments","staffEquipment","mand","alleqs","staffUserChangeHandler","multipleEquipmentsChangeHandler","getMandatoryOfflineServices","warn_TrainingSessionsTimeSlot","SignUp","trainingSessionChangeHandler","TrainingSessionData","validations","resultValidation","PermissionErrors","err_MultipleEquipmentsWithAndWithoutAccServices","reservationSchema","err_OnlineServiceFieldRequired","AssemblyPartReservationCanNotBeUpdatedDirectly","_errStartTimeRequired","OrderStatus","ExperimentEln","Experiment","Attendance","PartialAttendanceStartDuration","PartialAttendanceEndDuration","AccompaniedService","CollaboratorUsers","err_AccompaniedService_required","StaffUserRequired","err_WorkflowBookingRequired","handleFullDayReservationChange","fullDayReservation","currentPeriod","adjusted","partialReservationDetailsState","messageList","reservationCollaboratorsFilter","getReservationCollaboratorsFilter","staffUserPickerPredicates","PleaseSelectAnAccompaniedService","rotate","AddingsMandatoryEquipments","AddingsOptionalEquipments","ReservationName_Desc","FullDayReservation_Description","StaffUser_Info","PleaseSelectStaffUser","CollaboratorUsers_Info","ReservationTrainingApproval_Desc","TrainingSignUp_info","RepetitiveReservation","ReservationConsumables","ReservationSampleRunId_Desc","ApproveTrainingRecords","handleApproveOnce","handleEditAssisted","appSetActions","existingTrainings","servicesWithoutTraining","TrainingRecordId","showPopupAccordingToSetting","NotShowPopup","showPopup","handleEditClick","equId","equIds","fatherId","rid","handleNweCreateClick","handleCreateTrainings","TrainingLevelId","trdata","TrainingsCreatedSuccessfully","TrainingsAlreadyExist","ApproveOnce","menu_EditUserTraining","CreateDetailedTraining","ApproveForGood","AssistedReservationApprovalOptions","This_user_already_has_a_valid_training","CreateNewTrainingRecord_YesNo","handleTransfer","transferAllowedToGroup","adGroup","budgetExpirementModuleEnabled","trnsferSubmitted","trasferToUser","setTranferToUser","TransferReservation_info","TransferToUser","ReservationModifications","Field","OldValue","NewValue","Done","ModificationsHistory","Period","CreditContainer","creditProcessing","PricingConfirmationLabelEditText1","PricingConfirmationLabelText1","repetitiveValues","reservationProcessing","confirmAssisted","transferStepWaiting","transferUser","transferredForId","confirmBeforeTransfer","setShowTransfer","setConfirmBeforeTransfer","showConfirmRecurring","setShowConfirmRecurring","showConfirmAssisted","setShowConfirmAssisted","showTransfer","confirmCloned","setConfirmCloned","canceled","setCanceled","openModifications","setOpenModifications","allowSortenReservation","timeEnabledForOwner","canBeCanceled","canBeApproved","canSaveForLater","reservationCanceled","calculateButtonVisible","not_restricted","noInstumentRestricted","confidential","workOrderSwithProps","eqids","cancelReservation","approveReservation","draftReservation","handleChangeStatus","setOfflineServicesErrors","handleSetError","AutoEndReservation_remarks","handleUpdateAllRecurrent","handleUpdateFollowing","Following","handleByApprovalConfirm","editAssisted","handleEquipmentClick","handleRestrictionsClick","restrictProps","woProps","handleAddBatchClick","mactions","CancelReservation","ApproveReservation","CreateTraining","OfflineServicesError_info","res_SaveAndClone_info","SaveAndClone","CreateAndClone","relId","ShowRelatedReservations","pageTitle","CloneReservation","menu_ReservationDetails","menu_NewReservation","ByApprovalAvailable","CancelMultipleReservations","UpdateMultipleReservations","WeeklyReservationConfirmationMessage","JustThisOne","CancelFollowing","UpdateFollowing","CancelAll","CloneReservationConfirm","Proceed","transfer","ByApprovalConfirmationModalTitle","ReservationConfirmByApproval","justifySelf","RestrictedNotAllowed","InvoiceTemplatePicker","doGetInvoice","InvoiceDetailsSaga","invoice","setInvoice","notFound","getInvoice","InvoiceDetailActions","useInvoiceDetailsSlice","selectNotFound","selectActiveFilters","selectInvoice","InvoiceComments","InvoiceInReview","notifActions","SentToReview","InvoiceInReviewMessage","InvoiceDetailsUrl","ReviewApproved","InvoiceApprovedMsg","Reject","EnterInvoiceRejectReason","InvoiceRejectReasonPrefix","ReviewRejected","InvoiceRemarks","UpdatedOK","UpdateFailed","ReadOnlyDetails","openChangeStatus","openChangeInvoiceTemplate","currency","ISOCurrencySymbol","InvoiceBalance","attrib","InvoiceTemplate","InvoiceTemplateId","LastSentToBilling","justify","InvoiceNotFound","hasSubRows","SampleTypeFilter","ShowZeroAmountRows","showZeroAmountRows","DetailsTable","OpenEditRow","appsettings","openEdit","BudgetCat","BudgetCats","InstrumentsAndServices","Task","EquipmentService","Mixed","TimeSlotType","SubsProfPercentage","SubsidyProfit","RelevantToManualCharges","InsertedByDisplay","EditInvoiceLine","RowActions","DeletInvoiceRows","ConfirmDeleting","deleteInvoiceConfirmMessage","toggleAll","InvoicePaid","EditBudgetInvoiceRows","EditBudgetInvoiceRows_info","Change","ReferenceId","SubscriptionName","setIsGrouped","InvoiceCharges","menu_InvoiceCharges","GroupByReferenceDescription","DoNotGroupByReference","GroupByReference","InvoiceHistory","History","PayHistory","InvoiceRowId","PaymentTable","openEditPayment","EditInvoicePayment","PaymentDeleteConfirm","PaymentsDelete_success","PaymentsDelete_err","menu_InvoicePayments","RowHistory","deleteInvoiceOpen","setDeleteInvoiceOpen","allowedFees","AllowedFeeTypes","isChargesAllowed","pagelink","setfilterCallback","invoiceHistoryOpen","setInvoiceHistoryOpen","rowHistoryOpen","setRowHistoryOpen","payHistoryOpen","setPayHistoryOpen","updateStatusOpen","setUpdateStatusOpen","updateInvoiceTemplateOpen","setUpdateInvoiceTemplateOpen","updateInvoiceIdsOpen","setUpdateInvoiceIdsOpen","openNewCharge","chargProps","openNewPayment","paymentProps","deletable","setNewStatus","setInvoiceTemplate","setInvoiceIds","deleteInvoice","invoiceTemplateId","AddACharge","EditInvoiceStatus","EditInvoiceTemplate","CantDeleteInvoice","InvoiceRowsHistory","Preview","invoiceIdEntity","paymentPageActions","PaymentModificationsHistory","PayId","disableEnforceFocus","UpdateInvoiceStatus","UpdateInvoiceTemplate","handlePreview","InvoiceDeleteConfirmationMessage","ReopenOrderButton","DeleteOrderButton","FormWorkOrderTypePicker","WorkOrderTypeStatusPicker","onlyNew","FormWorkOrderTypeStatusPicker","FormRemindBeforePicker","SymptomCodesPicker","FormSymptomCodesPicker","RepairCodesPicker","AssetCatIds","ac","FormRepairCodesPicker","initReasonTypeData","ReasonTypePicker","FormReasonTypePicker","gridGap","CreationDetails","WorkOrderAdvancedDetails","ReportedByDisplayName","ReportedDate","LastUpdated","EventTypeStatus","ClosedAt","DoneDate","WorkStillInProgress","ClosedBy","DoneBy","FormUnlimitedDowntime","UnlimitedDowntime","EndDowntime","CustomFormPicker","FormCustomFormPicker","WorkOrderComments","doSaveComments","saveComments","referenceIds","AddCalibrationWorkOrder","workOrederIds","workOrederTypeId","saveLinkedOrders","setAsset","setWorkOrder","workOrderType","setWorkOrderType","fetchWorkOrderType","woId","handleWorkTypeChange","handleWorkOrderChange","LinkWorkOrder","AddCalibrationReference","PleaseSelectACalibration","HoverLinkedItem","linked","useHoverButton","onHoverClick","hoverIcon","HoverLinkedItems","onItemClcik","Linked","getLength","WorkOrderLinks","links","countLinks","LinkedWorkOrders","Collapse","unmountOnExit","WorkOrderForm","handleTypeChange","workOrderTypeFormRef","workOrderStaffFormRef","readonlyDetails","canView","onAssetClicked","setWorkOrderOfflineStartChangedValue","setWorkOrderOfflineEndChangedValue","onLinkedClick","bringUp","overlaps","unlimitedDowntime","setUnlimitedDowntime","typeChanged","setTypeChanged","downTimeChanged","setDownTimeChanged","remindBeforeChanged","setRemindBeforeChanged","setOriginalSubFormFiles","setOriginalStaffFormFiles","linkedWorkOrders","Links","workOrderSchema","err_AssetRequired","errEvent_Type_Required","typeError","AlertName","err_AlertNameRequired","errEvent_Type_Status_Required","EventDueDate","err_EventDueDateRequired","AlertStartTimeLabel","OfflineEventStartLabel","check","OfflineEventStartRequired","OfflineEventEndLabel","err_DownTimeEndGreaterThenStart","getWorkOrdersShema","DefaultSubject","DowntimeReasonTypeId","DowntimeDuration","DefaultRemaindBefore","remb","assignee","AssignedToCreator","changeLinkedOrders","orders","addedOrders","removedOrders","removeCalibrationOrder","addCalibrationOrder","handleOfflineEventStartChange","handleOfflineEventEndChange","InstrumentHasOverlappingDowntimeEvents","ShowAllDowntimeEventsOn","isInitialValid","LockedClosedRecord","EventDetails","PleaseSelectAnAssigneeUser","PleaseSelectAnAlertTypeStatus","ReportSymptoms","PleaseSelectAnAlertSymptomCode","RepairCodesEnabled","PleaseSelectAnAlertRepairCode","EventDueDateTimeLabel","RemindMeBefore_Description","PleaseSelectAReasonType","OfflineRemarksPlaceholder","SubmissionFormDetails","StaffFilledForm","PleaseSelectCustomForm","continueTo","sendOfflineEmail","sendOfflineProcessing","sendOfflineData","sendEmailCompleted","hasCreateProcessing","hasUpdateUpdateProcessing","hasCreateError","showDeleteRecurring","setShowDeleteRecurring","showSendEmail","setShowSendEmail","showCloseStatus","setShowCloseStatus","closedStatus","setClosedStatus","radioNotifyUsersValue","setRadioNotifyUsersValue","radioCancelAffectedReservationsValue","setRadioCancelAffectedReservationsValue","workOrderOfflineStartChangedValue","workOrderOfflineEndChangedValue","isCloseWorkOrderClicked","setIsCloseWorkOrderClicked","hasProcessing","IsAllInstrumentEventsGroupPermissions","viewPermissions","typeName","setTypeName","reservationSwithProps","subFormFiles","orderType","handleDeleteOrder","OnlyMainOrResourceWorkOrdersAdminCanDeleteCalibrationRecords","handleSendEmailClick","handleCancelSend","handleCloseOrder","handleOpenOrder","handleDeleteClick","handleDeleteAllNext","CloseIncident","CloseEvent","ReopenIncident","ReopenEvent","DeleteIncident","DeleteEvent","SendCustomEmail_short","SendCustomEmail","ViewCalendar_short","ViewCalendar","ShowAllRecurringEvents","notifyUsersRadioGroupOptions","Info","JustBookedUsers","AllAffectedUsers","AllAffectedUsers_info","cancelAffectedReservationsRadioGroupOptions","menu_AddNewWorkOrder","Add","WorkOrderRestrictedNotAllowed","UpdateDowntimeAdditionalActions","CreateDowntimeAdditionalActions","TheDowntimePeriodHasChangedNotifyUsers","NotifyUsers","isChangedStartDowntimeShorter","isChangedEndDowntimeShorter","isChangedDowntimeShorter","CancelAffectedReservations","UpdateDowntime","CreateDowntime","UpdateRecurringEventsTitle","EventRepeatConfirmationMessage","UpdateAllRecurringEvents","DeleteRecurringEvents","DeleteAllRecurringEvents","DeleteAllFutureRecurringEvents","YouAreClosingCalibrationRecord","RecordWillBeNotEditableAfterClosing","getSingleScreenToShowOn","ScreenToShowOnPicker","getSingleInvoiceStatusWithStaticOptions","InvoiceStatusWithStaticOptionsPicker","ConvertModelToEntityBillingActionsDetails","OperationName","IsSendEmail","IsSftpUpload","EmailAttachmentTypes","ChangeStatusTo","GeneratePayment","ConvertEntityToModelBillingActionsDetails","billingActionsDetailsSaga","initBillingActionsDetails_Success","initBillingActionsDetails_Error","initUpdateBillingActionsDetails_Success","initUpdateBillingActionsDetails_Error","createBillingActionsDetails_Success","createBillingActionsDetails_Error","BillingActionsPageName","updateBillingActionsDetails_Success","updateBillingActionsDetails_Error","initBillingActionsDetails","initUpdateBillingActionsDetails","createBillingActionsDetails","resetUpdateBillingActionsDetailsState","resetCreateBillingActionsDetailsState","billingActionsDetailsActions","selectBillingActionsDetails","billingActionsDetail","selectCreateBillingActionsDetails","selectCreateBillingActionsDetailsCompleted","selectUpdateBillingActionsDetails","selectUpdateBillingActionsDetailsCompleted","selectBillingActionsDetailsProcessing","EATBaseURLMultiPicker","EmailAttachmentTypePicker","FormEmailAttachmentTypePicker","FormInvoiceStatusPicker","FormScreenToShowOnPicker","FormPaymentMethodEnumPicker","ERTBaseURLMultiPicker","EmailRecipientTypesPicker","FormEmailRecipientTypesPicker","BillingActionsForm","isSftpEnabled","SAP_SFTP","budgetFieldFundingTypeEnabled","CostObjects","IsSendEmailChanged","setIsSendEmailChanged","IsSftpUploadChanged","setIsSftpUploadChanged","isMultipleEmails","billingActionsDetailsSchema","err_OperationNameRequired","err_ShowOn","FundingTypeIsRequired","BillingActionDetails","err_OperationNameUnique","AllInvoiceStatuses","EnterEmailsSeparatedByCommaWithoutSpaces","BillingActionsDetails","menu_EditAction","menu_AddNewAction","EditAction","AddNewAction","hasOwnedGroups","OnlyMyCores","onlyMyCores","ownedbyme","PermissionLevelPicker","FormPermissionLevelPicker","TimeSlotTypePicker","FormTimeSlotTypePicker","FormUserGroupsPicker","UpdateGroupPermissionsForm","AdGroups","PermissionLevel","err_SelectPermissionLevelException","err_TimeSlotTypeRequired","SetPermissionsOnSelectedServiceGroups","UpdateUserGroupPermissions","updtPermissionOpen","setUpdtPermissionOpen","submitted","setSubmitted","updatePermission","PermissionLevelId","CreateUpdateGroupPermissions","SetPermissions","CoreSelectionTable","updtFirstLogin","updtOptOut","redirectToDash","optOutCoreSelection","serviceGroupActions","savedServiceGroups","setOnlyMyCores","tabNumber","setTubNumber","showImportConfirm","setShowImportConfirm","userHelp","Help_ServiceGroupRegistration","multiCoresSelectionMode","setMultiCoresselectionMode","skipCoreSelectionScreen","SkipCoreSelectionScreen","setSelectedRowIds","loacalServiceGroups","setLoacalServiceGroups","showMyCoresOptions","handleRemoveGroup","oldGroups","handleRowsServiceGroupsChange","handleServiceGroupsChange","handleSingleGroupChange","onSelectChange","canSwitch","OnSelectNotRegisteredCore_error","primaryMultipleAction","isGroupAdmin","cols","OwnedByMe","AdminEmail","OnlineServicesCount","OfflineServicesCount","RequestTypesCount","LimitServiceGroupLicenses","ServiceGroupAdminsLimit","AdminsTotal","LabTechsLimit","LabTechTotal","DeSelectServiceGroup","SelectServiceGroup","ViewServiceGroupDetails","_selectedRows","_rows","_onRefresh","_toggleAll","toggleSingle","DeleteSelectedCard_info","tabLeftActions","Tab","_count","tabRightActions","DontShowThisAgain","_ev","CoreSelectionOptOut_info","selectedBulkActions","DeleteSelectedGroups","SelectedServiceGroupsWillBeDeleted","err_ServiceGroupCanNotBeDeleted","DeactivateServiceGroup","ConfirmDeactivate","err_ServiceGroupCanNotBeDeactivated","allowedToUseBulkActions","acts","CreateNew","SelectDeffServiceGroups","CoresTabSetting","addColumns","adds","ImportHandler","handleImportClose","menu_CoreSelection","Rejected","_toggleAllRowsSelected","selectCoreSelection","coreSelection","selectCoreSelectionFilters","noDashboardRedirectByClick","NoDashboardRedirectOnCoreSelection","isFirstLogin","updateIsFirstLogin","OptOutCoreSelection","updateIsOptOut","Private","CheckBoxGroup","labelPlacement","FormCheckBoxGroup","EveryDaysPicker","FormEveryDaysPicker","RepeatMonthlyByPicker","FormRepeatMonthlyByPicker","RepeatPeriodPicker","FormRepeatPeriodPicker","RepetitiveOptionsPicker","withParamsFilter","FormRepetitiveOptionsPicker","RepetitiveSchema","Until","err_RepeatUntilDateLessThanStart","err_AlertInvalidRecurringUntilDate","err_PepeatsOnDaysRequired","RepetitiveForm","recurringChanged","setRecurringChanged","repeatPeriodChanged","setRepeatPeriodChanged","repeatEndChanged","setRepeatEndChanged","leftSideSections","RepeatsEvery","UserTrainingApi","trainings","approve","ur","AllowBookingFromTrainingDate","ExpiredDate","MustOrderEveryDays","MustUseEveryDays","TrainerId","TrainingDate","TrainingLevel","UnhideServiceGroup","TrainingProgramId","TrainingProgramName","duUpdateTraining","doApproveRejectReservations","doActivate","trainingSaga","initCreateTraining_Success","initCreateTraining_Error","initUpdateTraining_Success","initUpdateTraining_Error","trainingsResponse","createTraining_Success","createTraining_Error","updateTraining_Success","updateTraining_Error","approveRejectReservations_success","approveRejectReservations_error","activateDeactivateTraining_success","activate","activateDeactivateTraining_error","initCreateTraining","initUpdateTraining","updateTraining","approveRejectReservations","activateDeactivateTraining","reservationsUpdateState","showApproveReservations","showRejectReservations","ApproveRejectRecords","ShowApproveReservationsMessage","ShowReviseToPendingMessage","resetCreateTrainingState","resetReservationsState","resetUpdateTrainingState","ReservationStart","ReservationEnd","setReservationsUpdateState","trainingActions","selectTraining","selectInitTrainingProcessing","selectCreateTraining","selectUpdateTraining","selectCreateTrainingCompleted","selectUpdateTrainingCompleted","selectCreateTrainingHasError","selectUpdateTrainingHasError","selectShowApproveReservatiions","selectShowRejectReservatiions","selectReservatiionsData","selectReservatiionsProcessing","selectReservatiionsUpdateCompleted","formatName","TrainingResevationsPicker","trainingDate","tDate","strDate","FormTrainingReservationsPicker","FormTrainingLevelPicker","UserTrainingComments","UserTrainingForm","TrainingLevelPermissions","usersShema","equipmentShema","err_UserNameRequired","ServiceType_Online","err_TrainingDateFieldRequired","err_TrainerIsRequired","activeDisabled","resDisbaled","setResDisbaled","allowBookingDisbaled","setAllowBookingDisbaled","setAllowBookingVisible","setEquipmentChanged","trDateChanged","setTrDateChanged","trLevelChanged","setTrLevelChanged","handleEquipmentChange","handleTrDateChange","handleTrLevelChange","ExpiredDays","UserTrainingTopMessage","NotActive","UserTraining_EquipmentInfo","UserTraining_UserInfo","UsersPlaceholder","DateOfTraining","LevelAchieved","TrainingLevelPlaceholder","TrainerPlaceholder","LinkedReservation","SelectLinkedReservation","TrainingRestrictions","TrainingExpiration","User_ExpiredDate_Description","User_MustOrderEveryDays_Description","EnterNumberOfDays","User_MustUseEveryDays_Description","HideInstrumentsFromUntrainedUsers","UnhideServiceGroup_Description","AllowBookingFromNow","showApprove","setShowApprove","showReject","setShowReject","approveReservations","rejectReservations","relatedReservations","updateResCompleted","editTraining","currenTrainingServiceGroupId","activateAllowed","handleActivateTraining","handleReject","handleApprove","handleResCancel","ActivateTraining","UserTrainingModificationHistory","menu_UserTraining","menu_AddNewUserTraining","RejectAllReservations","UserTraining_ReviseReservations","RejectAll","ApproveAllReservations","UserTraining_ApproveReservations","ApproveAll","PriceSheetApi","doCreatePeriod","doUpdatePeriod","pricePeriodSaga","menu_PriceSheetPeriod","initialPeriod","createPeriod_Success","createPeriod_Error","updatedPeriod","updatePeriod_Success","updatePeriod_Error","updatePeriod","pricePeriodActions","selectPricePeriod","pricePeriod","selectDetails","selectDetailsHasError","selectDetailsCompleted","FormPriceSheetMethodPicker","PricePeriodsForm","globalPriceSheetEnabled","priceEnabled","serviceGroupChanged","setServiceGroupChanged","startChanged","setStartChanged","endChanged","setEndChanged","pricPeriodsSchema","PriceSheetMethod","err_ServiceGroupRequired","err_PriceSheetMethod_isrequired","PricePeriodDetails","PriceSheetMethod_info","GlobalPriceSheetPeriods","priceSheetByEnabled","priceSheetBy","fullAdmin","PriceSheets","OpenPriceSheetInfo","periodId","gName","priceBy","EditPriceSheetPeriod","AddPriceSheetPeriod","PricePeriod","AddPricePeriod","ConvertModelToEntityCalendarMessagesDetails","PlantDate","DisplaySeconds","ConvertEntityToModelCalendarMessagesDetails","CalendarMessagesApi","calendarMessagesDetailsSaga","initCalendarMessagesDetails_Success","initCalendarMessagesDetails_Error","initUpdateCalendarMessagesDetails_Success","initUpdateCalendarMessagesDetails_Error","menu_CalendarMessages","createCalendarMessagesDetails_Success","createCalendarMessagesDetails_Error","updateCalendarMessagesDetails_Success","updateCalendarMessagesDetails_Error","initCalendarMessagesDetails","initUpdateCalendarMessagesDetails","createCalendarMessagesDetails","updateCalendarMessagesDetails","resetUpdateCalendarMessagesDetailsState","resetCreateCalendarMessagesDetailsState","calendarMessagesDetailsActions","selectCalendarMessagesDetails","calendarMessagesDetail","selectCreateCalendarMessagesDetails","selectCreateCalendarMessagesDetailsCompleted","selectUpdateCalendarMessagesDetails","selectUpdateCalendarMessagesDetailsCompleted","selectCalendarMessagesDetailsProcessing","CalendarMessagesForm","initValues","IsServiceGroupChanged","setIsServiceGroupChanged","IsEquipmentChanged","setIsEquipmentChanged","calendarMessagesDetailsSchema","Laboratory","Group","getDisabledInfo","AllServiceGroups","Announcement","AddNewAnnouncement","FiltersComponent","MultiToggle","ToggleMultipleInstruments_info","onchange","FullScreenButton","OpenInFullScreen","FullScreenSchedulerButton","intervalRefreshingCalendar","IntervalRefreshingCalendar","calendarOnly","configuredRefreshInterval","CalendarDatePicker","views","openTo","TimelineGroupByPicker","GroupReservationBy","showPeriodPicker","multipleMode","moveToDate","customDiff","addDateFn","lengths","EquipmentAssembliesEnabled","TimelineGroupByEnumsArray","secondaryPageActions","calendarActions","primaryPageActions","withoutHeader","otherControls","periodControls","Previous","Today","viewTypeControls","myAssetsDefaultFilters","AdvancedAssetSearchFilterAttributes","CreatedSince","ActiveAssets","Areas","LocationList","SubLocationsList","LocationNotUpdatedSince","ResourceServiceType","ShowAssemblyParts","UsageStatus","RangeWeight","RangekN","RangeTemperature","RangeArea","RangeVolume","RangeAmount","AssetsSelectionTable","primaryMultiAction","multiModeDisabled","useRecentAssets","RecentAssets","isShortView","emptyTable","POnumber","AssetAccessories","Contacts","Experts","Suppliers","ShortDescription","multiAssetSelectionMode","setMultiAssetSelectionMode","setCurrentMode","currentModeRef","loacalAssets","setLoacalAssets","localAssetsRef","getMyListFilter","selectedRws","selectedRowDefaultActions","handleRowsChange","handleSingleChange","oldAssets","AssetSearch","selectAssetsSelection","assetsSelection","selectAssetsSelectionFilters","RecentContent","collapseOpen","setCollapseOpen","fetchRecentAssets","recentAssets","setRecentAssets","fetchRecentAssetsState","fetchRecentAssetsPromise","recentShort","requestTypeIds","appSettingsAction","openRequest","setOpenRequest","requestId","setRequestId","selectedAssets","setSelectedAssets","schedActions","AssetCatGroupId","createOffline","addTrainingSession","startUsage","useAddNewActions","allowMultiToggle","allowAllCoresToggle","availabilityTypesArray","SelectConsumables","CreateRequest","CreateAWorkOrder","AddTrainingSession","InstrumentAssetSearch","noTableData","NoConsumablesHeadTitle","NoConsumablesTitle","primaryRecentAction","notAvailable","handleSearchAllCores","SearchAllCores","menu_MyInstrumentsAssets","Statuses","initLogStatusesData","BarcodeLogStatusPicker","BarcodeLogStatusFilter","AllStatuses","hideRoomFloor","HideRoomFloorTextBoxes","EntryDate","fromInitPreset","FloorName","ShowBarcodesWithoutAssetsOrRooms","InventoryLogTable","defaultFilter","BarCode","BarcodeScanLog","menu_AssetInventoryLog","defaultFilterSearch","dateFilter","SavedViewForm","viewOnly","savedViewSchema","err_SavedViewNameRequired","SavedViewName","err_savedViewAssetRequired","SavedViewAssets","SavedViewShared","SavedViewBookMultiple","getsavedViewSchema","SavedViewAssetsPlaceholder","SavedViewBookMultiple_info","isServiceGroupAdmin","notShown","BookableAsset","useLeftTopActions","menu_EditSavedView","menu_AddNewSavedView","PopUpListItems","invoiceTemplateRightSection","BillingAddress_info","BudgetActivityCode_info","BudgetCostCenter_info","BudgetExtraTextField1_info","BudgetExtraTextField2_info","BudgetExtraTextField3_info","BudgetExtraTextField4_info","BudgetExtraTextField5_info","BudgetProjectCode_info","BudgetProjectName_info","CoreCostCenter_info","CreditCode_info","InvoiceBalance_info","InvoiceCore_info","InvoiceCurrency_info","InvoiceCustomerEHF_info","InvoiceCustomerRef_info","InvoiceDate_info","InvoiceDepartment_info","InvoiceFromDate_info","InvoiceId_info","InvoiceInstitute_info","InvoiceInstituteType_info","InvoiceIdLink_info","InvoiceProcessedUser_info","InvoiceProcessedUserEmail_info","InvoiceProcessedUserGroup_info","InvoiceProcessedUserMobile_info","InvoiceProcessedUserPhone_info","InvoiceProjectNumber_info","InvoiceRemarks_info","ConfigureColumns","InvoiceLetters","InvoiceSummaryTable_info","InvoiceSummarServicesTable_info","InvoiceSummury_BudgetUserService_info","InvoiceToDate_info","InvoiceTotalCost_info","InvoiceAdGroup_info","InvoiceUserGroupEmail_info","InvoiceVAT_template_info","BudgetInvoicingRemarks_info","LastRequestID_info","LetterDate_info","ProjectActivity_info","ProjectNumber_info","InvoiceUserGroup_info","HtmlTextBox","formikValues","Html","textBoxValue","setTextBoxValue","OnUpdate","invoiceTemplateHtmlTextBox","InvoiceTemplateHtmlSource","FormColorPicker","PreviewButton","handleInvoiceIdChange","InvoiceTemplatePopUpLink","TableHeaderColor","TableBodyColor","HeaderFileName","FooterFileName","testHex","InvoiceTemplatePopUpSchema","OnSubmit","invoiceTemplateHtml","valueToReplace","patrn","originalValue","html_replace","InvoiceTemplateUpdateSuccess","InvoiceTemplateAddedSuccessfully","leftSectionH6Image","rightSectionH5Title","InvoiceTemplateForm","classname","TemplateName","AllFundingTypes","TemplateHeaderImage","ModifyInvoiceLetterTemplateHere","TemplateFooterImage","InvoiceLetterTableHeadColor","InvoiceLetterTableHeadColor_info","InvoiceLetterTableBodyColor","InvoiceLetterTableBodyColor_info","ReservedWordsForInvoiceLetterTemplateMsg","menu_InvoiceTemplates","AddInvoiceTemplate","EmailTypePicker","EmailTypeFilter","NotificationType","CustomFormSkeleton","QuizCustomForm","fetchQuiz","quizId","ShuffleFields","Question","UsedAttempts","Submissions","SubmittedById","QuizTrainingPassingScore","UserCanStartQuiz","QuizNumberOfAttempts","fetchQuizPromiseState","fetchQuizPromise","setStartQuiz","quizSubmission","submitStatus","submitQuiz","submission","setSubmission","submissionId","resultQuiz","ContinueToQuiz","CancelYourSubmission","QuizDescription","QuizInstructions","QuizFiledAttemptsMessage","QuizFiledAttemptsInstrumentMessage","StatusChip","LastComment","LastCommentBy","LastCommentAt","AlertOfflineTime","writeCsvFile","exportCsv","stringData","csvContent","doLoadData","doUpdateField","doRunSelectedSamples","doCompleteRun","doUpdateRun","doLoadRunDetqails","doImportRunDetails","doLoadAllSelectedSamples","doExportRun","loadIds","httpUrl","allsamples","completeRunResponse","XSamplesWereProcessed","skippedSamplesCount","XSamplesWereSkipped","derivativesCount","runupdate","samples_response","readCsvFile","platesUrl","createPlate","createPlates","runSamples","tpid","records","tablestate","AnalyticalSampleId","Position","TubeLabel","Volume","Concentration","ConsumablesForm","reportConsumableSchema","ConsumableProject_info","consumableServicesData","byGroup","AllowedServices","ArticleDatasetLink","dataset","ArticleServiceGroupsColumnId","ArticleInstrumentsColumnId","PubMedId","FileComment","checkRow","StyledSelect","TmtType","autoWidth","BasicTab","textColor","scrollButtons","centered","setTabIndex","tabsVertical","tabsHorizontal","scrollContent","EventsCount","eventsLoading","isMaintenanceAssetsEnabled","StyledSpanIcon","AssetQuickSearchApi","getAssetSearch","q","Results","TotalResultsLength","getRecentAssets","doShowSearchInput","doSetOpen","doSearchAssets","doSearchAllAssets","doGetRecentAssets","doGetRecentSearchTerms","assetQuickSearchSaga","getRecentSearchTerms","searchAssets_Success","searchAssets_Error","allCores","searchMenus","searchMenu","menuResult","setMenuSearchResults","setOnlineSearchResults","setOfflineSearchResults","setRequestSearchResults","setTotalSearchCount","online","request","totalRresults","searchAllAssets_Success","searchAllAssets_Error","getRecentAssets_Success","getRecentAssets_Error","getRecentSearchTerms_Success","getRecentSearchTerms_Error","menuNodes","childItems","ch","uniqBy","showSearchInput","searchAssets","searchAllAssets","showSearchInSidebar","showSearchResults","recentSearchTerms","searchResults","allSearchResults","onlineSearchResults","offlineSearchResults","requestSearchResults","totalSearchCount","menuItemsSearchResult","assetQuickSearchActions","useAssetQuickSearchSlice","selectAssetQuickSearch","assetQuickSearch","selectRecentAssets","selectRecentSearchTerms","selectAllSearchResults","selectSearchTerm","selectOpen","selectShowSearchInSidebar","selectOnlineSearchResults","selectOfflineSearchResults","selectRequestSearchResults","selectTotalSearchCount","selectMenuSearchResults","ListItemLink","DefaultQuickAssetSearchAction","getAssetDetailsLink","getCalendarLink","getTimelineLink","AssetListItem","useAssetPopup","truncateName","defaultLink","validKey","getSettingValue","showCalendarLinks","handleAssetClick","ShowFullDetails","QuickSearchSection","QuickSearchSectionTitle","QuickSearchSearchesItems","QuickSearchRecentItems","QuickSearchEmptySection","QuickSearchEmptyContent","QuickSearchSeeAll","QuickSearchMainTitleSection","QuickSearchAllInstrumentsSection","MenuSearchEmptyContent","RecentAssetsList","RecentItem","RecentSearchTermsList","recentSearchTermsState","RecentSearches","NoSearchTermFound","MenuSearchItem","convertUrl","LinkWithChildren","MenuSearchResultList","menuSearchState","RelatedScreens","NoRelatedScreensFound","AssetSearchResultsByType","onAllAssetsClick","onlineState","offlineState","requestState","menuItemsState","OnlineServiceLabel","InstrumentsFound","RequestServiceLabel","RequestsFound","OfflineServiceLabel","ConsumablesFound","showOnline","showOffline","showRequests","NothingFound","FullResults","AssetQuickSearch","searchAllCores","handleOpenAssets","showInSideBar","SearchAnAssets","inputRootMobile","AssetsSearch","SeeAllInstruments","menuButton","searchIcon","inputInput","paperTitleSection","reg_ChangePassword","main_master_LogOutLinkText","Help","OptOutNotifications","ServiceGroupRegistration","menu_GoogleCalendar","menu_OutlookCalendar","Notifications","UserMenuButton","UserMenu","googleCalendarModuleEnabled","GoogleCalendar","multipleAdGroupsModuleEnabled","MultipleAdGroups","serviceGroupRegistrationModuleEnabled","googleCalendar","outlookCalendar","Opt_Out","AllowUsersToOpt_Out","SwitchFromToAnotherUserGroup","SwitchFrom","SwitchSites","allowToSwitchToOtherSites","AllowToSwitchToOtherSites","externalTitleOne","ExternalSwitchTitle1","externalUrlOne","ExternalSwitchUrl1","externalTitleTwo","ExternalSwitchTitle2","externalUrlTwo","ExternalSwitchUrl2","externalSitesIcon","ExternalSitesIcon","buttonIcon","hasExternalOne","hasExternalTwo","useExternalLinks","SwitchToOtherSites","ProfileMenu","showGroups","ToggleSideMenuButton","Separator","TopToolbar","TopGroupButton","firstServiceGroupName","CoreDashboardMenu","popoverPaper","mainContentAndScroll","mainContent","searchAndHeader","controlButtons","coresAndServices","coreCheks","scrollPaddings","ddlClasses","listItemText","useListStyles","setSelectedServiceGroups","availableServiceGroups","setAvailableServiceGroups","availableLoading","setAvailableLoading","Dashboard_ServiceGroupSelection","handleItemClick","handleSaveItemClick","Dashboard_ServiceGroupSwith","CoreSelectionButton","showInlineGroups","SubTopToolbar","serviceGroupsCount","singleCore","isAdminOfSingle","handleCollapse","OpenCore","TopBar","sidePanelCollapsed","appBarShift","sidePanelShift","MenuItemComponent","currentindex","onExternalClick","childRoot","focusVisible","createMenuItemRefs","rowInd","menuItemRefs","HoverSideMenu","handleChildClick","childActiveIndex","setChildActiveIndex","parentRowIndex","keyCode","bindFocus","anchorPosition","TransitionComponent","cindex","exact","focusVisibleClassName","SidbarMenuItem","PropTypes","bool","indexChanged","chIndex","mainTab","hasAdminSettings","closeOnClick","isExpandable","setChildIndex","sidebarExpanded","urlLink","setUrlLink","mainTabMenu","mainTabExpanded","mainTabShort","mainTabOpen","data-parent-id","verticalScrolling","NavWrapper","MainMenuItem","replaceIcon","SideBarMenu","routerPathName","selectedIndex","setSelectedIndex","mapItems","citem","chItem","groupTab","handleListItemClick","sideBarExpanded","sideBarCollapsed","sideBarListMobile","mainMenuItemExpanded","mainMenuItemCollapsed","BookitlabShortLogo","xmlnsXlink","enableBackground","xmlSpace","UserProfileMobile","assetSearchActions","SearchAssets","SideBarHeader","logoMinimized","sideBarHeaderOpen","sideBarHeaderMobile","headerButtonsMobile","sideBarHeader","sideBarFooter","SideBarFooter","SideBarQuickAction","actionOptions","defaultSystemAction","SideBarQuickActions","systemAction","coreSelected","baseAction","SidebarQuickAction","sideBarQickActionMobile","SideBarComponent","setCurrentNode","currentNodes","setCurrentNodes","SideBar","SideBarDrawer","handleDrawerClose","Drawer","ModalProps","sideBarMobile","sideBarMobileHorizontal","drawerOpen","drawerClose","LayoutRoot","Main","AdminPanelPopper","sideBarOpen","AdminPanel","iframeLoaded","setIframeLoaded","iframeRef","closeAdminPanel","FrontendLayout","isBudgets","globalCoreVisible","termsOfUseAgreementEnabled","TermsOfUseAgreement","isFirstActiveUserGroupSelected","usageKioskRoleEnabled","UsageKioskRoleEnabled","roomUserRoleEnabled","redirectToTermsOfUseAgreement","setRedirectToTermsOfUseAgreement","redirectToActiveUserGroup","setRedirectToActiveUserGroup","redirectToCoreSelection","setRedirectToCoreSelection","redirectToUsageKiosk","setRedirectToUsageKiosk","redirectToUsageRoom","setRedirectToUsageRoom","redirectToConsumableKiosk","setRedirectToConsumableKiosk","KioskAdmin","ConsumableKiosk","useRequiredRedirect","isRedirectToTermsOfUseAgreement","isRedirectToActiveUserGroup","isRedirectToCoreSelection","isRedirectToUsageKiosk","isRedirectToUsageRoom","isRedirectToConsumableKiosk","handleRejectConfirm","handleApproveConfirm","layoutRootMobile","useselectable","mobileOpen","NotSavedChanges_message","NotSavedChanges_title","READONLY_COLUMNS","SamplesTable","samplesTableState","selectedSamples","CellTextField","BiologicalSampleId","SubjectId","TaxaId","Grouping","CellDateField","CellNumberField","customPageSize","handleCreateButtonClick","SourceRunIds","TargetRunIds","openExportUrl","readWriteOnly","exportColumns","downloadTemplateUrl","goToSamplesList","OpenInSamplesList","_refresh","handelDeleteSamplesClick","ThisCannotBeUndoneAreYouSure","AddSample","MoreActions","getActions","ServiceRequestCustomForm","PrintPDFSection","EventBudgetPicker","eventPredicates","ReadonlyField","useServiceRequestStatusUpdate","serviceRequestStatusId","fieldState","ServiceRequestSubmissionDetails","authUser","statusFieldState","SubmittedBy","SubmittedAt","StatusAndBudget","SubmitServiceRequestButton","getRowsErrors","submitEnabled","ServiceRequestSubmitButtonTooltip_Enabled","ServiceRequestSubmitButtonTooltip_Disabled","ServiceRequest_SubmitStepAlert","CancelServiceRequestButton","CancelRequest","ServiceRequestAddons","ServiceOrCharge","show_newAddonCharge","ServiceRequestInternalStatus","ServiceRequestAddonTypes","showAddonCharge","AddonType","InternalStatus","show_newManualCharge","showManualCharge","handleAddServiceClick","handleAddChargeClick","charges","AddOnServices","AddonCharges_Empty_AddEnabled","ServiceRequestMilestoneStatusMenuPicker","getChipColor","handleMenuItemClick","ServiceRequestMilestones","milestones","handleAddMilestoneClick","sidePanelProps","showActionsColumn","Records","Total","handleStatusChange","ServicesRow","backgroundClip","ServiceRequestMilestonesSection","tableContainerStyles","CloneServiceRequestButton","handleCloneButtonClick","Clone","AddServiceRequestRowButton","AddNewCustomTableRow","arrayHelpers","AddRows","ServiceRequestRowEditableCell","fieldProps","innerValue","setInnerValue","useDebounce","getDebounceValue","childColumn","getServiceRequestRowFieldName","getServiceRequestRowName","columnFieldName","columnType","SRSelect","withAsyncOptions","hocProps","asyncOptionProps","async","optionsPromise","fetchOptions","promiseState","debounced","trailing","maxWait","useAsyncOptions","getCellComponent","getReadonlyCell","getValueRenderer","getCustomFormTableColumns","fieldComponent","isFocused","getCell","originalRow","enableHide","ServiceRequestRowStatusPicker","handleBlur","ServiceREquestRowStatusCell","RowGap","ActionsCell","DeleteButton","CloneButton","handleCloneClick","InternalServiceRequestRowStatus","CommentsWrap","ServiceRequestRowComments","canUserEdit","ServiceRequestRowsImport","ImportSuccessMessage","convertImportResponse","ImportErrorMessage","UpdateColumnValueAcrossMultipleRows","DownloadImportTemplate","ExportRows","importResponse","mapValues","Completed","InsertDate","Serial","SourceLinkId","SourceRowId","UpdateDate","BulkUpdate","Column","formikContext","rowIdentifiers","postValue","rowids","GenericUpdateErrorMessage","ColumnsSelect","getHidableColumns","colvis_buttontext","toggleHideColumn","handleToggle","hiddenColumns","getHiddenColumnsKey","getHiddenColumns","localStorage","columnIds","ServiceRequestRowsTable","customFormColumns","tableColumns","dynamicColumns","staticColumns","cellProps","tableSectionStyles","serviceRequestTypeId","SRFormContent","autoResetExpanded","setHiddenColumns","ServiceRequestTable","RequestRows_error","SRTableBody","rowProps","EditableCellField","StyledTableCell","ServiceRequestRow","SRTablePagination","QuoteSentToUserAlert","approvedStatus","cancelledStatuses","Request_SendQuoteToUser_PendingMessage","Request_SendQuoteToUser_ApproveQuote","firstCancelledStatus","dialogOpen","setDialogOpen","Request_SendQuoteToUser_RejectQuote","ConfirmRejectDialog","RejectReasonEmpty_err","Confirm_RejectQuote_Title","Confirm_RejectQuote_TextLabel","SendQuoteButtonButton","SendQuote","InternalServiceRequestStatus","getSchema","dynamicValuesSchema","DownloadAllFiles","RequestSamplesPage","RequestDetailsPage","requestDetailsData","serviceRequestFormData","submittingRequest","SampleManagementTablesEnabled","printActions","sidePanel","setPrint","printSections","userProfileSettingsSections","ExportPDF_SubmissionsDetails","ExportPDF_RequestForm_Table","ExportPDF_Comments","ExportPDF_RequestRows_Table","ExportPDF_Milestones_Services","ExportPDF_ModificationHistory","getPrintPDFSections","customFormFields","handlePrintToPDF","customFormSchema","getRequestDetailsSchema","hasRowsErrors","setHasRowsErrors","PrintPdf","PleaseSubmitRequestFirstInOrderToPrint","NotificationTypeId","SendQuoteToUser","NOT_FOUND","addonType","AddonCharges","getServiceRequestTitle","CommentOnEditOnly","ReturnedToUser","ServiceRequestCard","CardHeader","dragHandleProps","StyledCardContentRow","StyledFoo","PriorityIcon","priority","CardActions","getIcon","getIconColor","Kanban","onDragEnd","provided","destination","itemId","draggableId","droppableId","StyledGridContainer","StyledColumn","droppableProvided","droppableSnapshot","hasMore","scrollThreshold","sectionId","onLoadMore","CardsContainer","renderTitle","draggableProvided","draggableSnapshot","draggableRubric","draggableProps","FrontendLayoutContentBox","ServiceRequestsKanbanPagePath","ServiceRequestsKanban","SERVICE_REQUEST_KANBAN_IGNORED_STATUSES","ServiceRequestsKanbanPage","kanban","StyledServiceRequestStatusMultiPicker","GlobalStyle","createGlobalStyle","en","backendOptions","loadPath","lngs","namespaces","AnimalTypesPage","use","Backend","initReactI18next","lng","fallbackLng","appendNamespaceToMissingKey","interpolation","escapeValue","backend","selectDialogAlert","dialogAlert","DialogAlert","useMediaQuery","DialogContentText","SnackbarManager","InternalIdLoginPage","AnimalsListPage","PosLayout","AnimalCaseConsumablesPage","FlexColumnDiv","mainWrapper","LoginLayout","AppBar","Toolbar","LogoMenu","Container","AnimalsHomePage","PrivateAnimalRoute","encodeURIComponent","CreateNewCasePage","SamplesListPage","TrainingSessionsPage","BuildingsPage","HistoryPage","AddNewReportPage","TrainingWaitingListPage","createBrowserHistory","basename","ExperimentTemplatesPage","UsersHistoryPage","UsersHistory","UserTrainingPage","RestrictedRoute","allowedNode","accesibleByRole","UsersPage","AnimalExtendedBillingReportPage","UserTrainingHistoryPage","UserTrainingHistory","OtherServicesPage","BudgetsPage","ServiceRequestPage","ServiceRequestListPage","WorkOrdersPage","DocumentsPage","QuizPage","QuizDetailsPage","UserTrainingDetailsPage","TrainingDetailsPage","SampleModificationsPage","UsageHistoryPage","RunsListPage","AnimalCasesHistoryPage","SendEmailToUsersPage","SendEmailToUsers","Charges","ChargesPage","MyAssetsPage","Locations","LocationsPage","BuildingPage","CampusesPage","AreasPage","LocationListPage","SubLocationListPage","InvoiceBatches","InvoiceBatchesPage","CategoriesPage","CategoryGroupsPage","BillingPreviewPage","selectOnlineBudgetsStatus","onlineBudgetsStatus","selectOnlineBudgetsStatusSelected","selectPayState","pay","selectGenerateInvoicesState","generateInvoicesState","selectChargeOnlineBudgetsState","selectEndDate","selectIGenerateInvoicesAndSendToSapState","generateInvoicesAndSendToSap","doGetTableData","doGenerateInvoices","doChargeOnlineBudgets","doDownloadChargeOnlineBudgetsErrors","doPay","doGenerateSelectedInvoices","onlineBudgetsStatusSaga","getTableData_Success","getTableData_Error","Item","ServiceGroupsCsv","UserGroupsCsv","PeriodType","BudgetIncluded","invoiceBy","CoreInvoiceBy","InvoiceCreatedBy","InvoiceVat","CoreBy","ShowZeroAmountInvoices","ShowInvoicePartialEvents","Async","Recalculate","generateInvoices_Success","getTableData","generateInvoices_Error","processed","chargeOnlineBudgets_SetCurrentRecord","chargeOnlineBudgets_SetStatus","SuccessTransactionsCount","HostBudgetNumber","chargeOnlineBudgets_Error","chargeOnlineBudgets_Success","chargeOnlineBudgets_SetDialogOpen","ProcessingFinished","paymentDate","payments","balanceRow","Payments","pay_setStatus","pay_Finish","PaymentCreatedSuccess","GenerateInvoicesAndChargeOnlineBudgets_SetCurrentRecord","GenerateInvoicesAndChargeOnlineBudgets_SetProgress","GenerateSelectedInvoices_Error","GenerateSelectedInvoices_Success","chargeOnlineBudgets","generateInvoices","chargeOnlineBudgets_DownloadErrors","GenerateInvoicesAndChargeOnlineBudgets","needTableRefresh","setneedTableRefresh","currentRecord","pay_Open","pay_SetSelected","pay_Close","GenerateSelectedInvoices_SetDialogOpen","onlineBudgetsStatusActions","useOnlineBudgetsStatusSlice","ChargeOnlineBudgetsButton","handleDialogClose","confirmationMessage","SendBalanceToSap","ChargeBalanceOnline","DownloadErrors","GenerateInvoicesButton","GenerateInvoiceForEstimatedCharges","PayButton","totalUpaidBalance","UnpaidBalance","PayDescription","Pay","paymentMethod","TotalPayments","PaySelected","GenerateInvoicesAndSendToSap","GenerateInvoices","AddPaymentButton","useRowActions","accumulateInvoices","AccumulateNewChargesToExistingInvoice","invoices","tryParseInvoicesData","getBudget","getServiceGroup","getPaymentAmount","subActions","InvoiceStart","InvoiceEnd","InvoiceDetailsLink","SeeFullDetailsOfBalanceAndTransferChargesToAnotherBudget","BudgetDetailsBudgetTransfer","InvoiceBudgetBalanceKeyAccessor","OnlineBudgetsStatusPage","ByProjectUserGroup","IDNo","BudgetAmount","BudgetHardLimit","BudgetSoftLimit","TotalInvoiced","ugid","showEstimated","TotlaPaid","OnlineBudgetStatusBalanceTooltip","OverallEstimatedBalanceTooltip","OverallEstimatedBalance","OnlineBudgetStatusEstimatedChargesTooltip","EstimatedCharges","useColumns","endDateString","memoedColumns","disableActionButtons","EndDateMustBeSetToTodayOrEarlier","WS_Billing","usePageActions","handleEndDateChange","OnlineBudgetsBillingUnfinishedUsagesRemark0","OnlineBudgetsBillingUnfinishedUsagesRemark1","OnlineBudgetsBillingUnfinishedUsagesRemark2","OnlineBudgetsBillingUnfinishedUsagesRemark4","OnlineBudgetsBillingUnfinishedUsagesRemark3","rowAccessor","OnlineBudgetsStatusTable","BillingByProjectsOrCores","OnlineBudgetsStatus","InvoiceDetailsPage","WorkOrderDetailsPage","BillingPage","BillingActions","BillingActionsPage","BillingActionsDetailsPage","LocationTypesPage","SubLocationTypesPage","SavedViewDetailsPage","SavedViews","SavedViewsPage","LabelTypesPage","AssetDetailsPage","LabelPrintDialog","KioskProjectsPage","KioskProjectConsumablesPage","PrivateKioskProjectsRoute","SESSIONTIMEOUT_ASHX_CACHE_BUST","checkFailCount","CheckSessionTimeout","loginUrl","appRoot","showWarning","redirectAction","onbeforeunload","currentUrl","Fulfilled","ExtendSessionTimeout","dataType","contentType","buttonText","onButtonClick","SessionTimeout","checkUrl","ignoreSession","Warning","SessionExpirationWarning","SubmissionsPage","QuizzesPage","AdHocReportListPage","Rooms","CalendarMessages","CalendarMessagesPage","CoresDirectoryPage","SamplePlatesPage","useTabTitle","loaded","setLoaded","selectorLoading","setTitle","favIconImg","FavIconImg","favIconTitle","FavIconTitle","favIcon","favLink","getElementById","HeadTitle","isDispatcherLoading","handleFavIconChange","handleTitleChange","titleTemplate","defaultTitle","htmlAttributes","lang","InstrumentRestrictionsPage","LabelTypeDetailsPage","ConfigurableColumnExportImportPage","ShortURLRoute","hash","rooted","ServerBarcodeRoute","NewMessagePage","InvoiceTemplates","InvoiceTemplatesPage","Expenses","ExpensesPage","PricePeriodsPagePage","PricePeriods","PriceSheetPeriodDetailsPage","ArticlesPagePath","ArticlesPage","AccountLayout","RegisterPage","updateY","withSaveAsLastVisitedPage","ReservationDetailsPage","HomePage","SystemPage","DashboardPage","DefaultDashboardPage","CoreSelectionPage","CoreHomePage","CoreHomeByRoutePage","CoreStatsPage","ReportingPage","BookitLabDashboadPage","RedirectWithSearch","preserveSearch","AssetSelectionPage","TermsOfUseAgreementPage","SnackWrapper","upSnackbarIndex","zindex301","ActiveUserGroupPage","CannedReportsPage","CannedReports","UserAttributes","UserAttributesPage","ReportConsumablesPage","LoginPage","CalendarMessagesDetailsPage","OfflineServiceTypesPage","AnimalCaseEditPage","library","faUserCircle","faChevronUp","faPencil","faLock","faUsers","faBell","faQuestionCircle","faSignOutAlt","faHome","faLayerGroup","faBookmark","faCalendarAlt","faDumbbell","faCommentAltDots","faBolt","faListUl","faChartBar","faChartColumn","faChartLine","faChartPie","faChartPieAlt","faMegaphone","faFileInvoiceDollar","faCog","faTimes","faCircle","faCircleSmall","faCircleCheck","faPrint","faSearch","faChevronDoubleUp","faChevronDoubleDown","faCheck","faCheckDouble","faInfo","faTriangleExclamation","faXmark","faChevronDown","faCircleXmark","faEllipsisV","faPlus","faFilter","faTable","faMinus","faFileImport","faGlobe","faLockOpen","faEdit","faTrash","faInfoCircle","faGripVertical","faBellSlash","faExclamationCircle","faTimesCircle","faArrowLeft","faTools","faPlay","faHistory","faAdd","faStream","faRulerTriangle","faThList","faClipboardListCheck","faPencilAlt","faCalendarPlus","faPause","faSave","faCalendars","faListTimeline","faCode","faBan","faFloppyDiskCircleArrowRight","faCalculator","faRefresh","faSquare","faClone","faClock","faChevronRight","faClipboardList","faEnvelope","faCalendar","faCheckCircle","faLink","faChevronDoubleRight","faChevronDoubleLeft","faChevronLeft","faList","faUser","faGripHorizontal","faArrowFromLeft","faVial","faStopwatch","faWrench","faArrowUpRightFromSquare","faExternalLink","faExternalLinkAlt","faClose","faDownload","faBold","faItalic","faUnderline","faH1","faH2","faQuoteRight","faListOl","faFileAlt","faAt","faBarcode","faChain","faPowerOff","faPlug","faMicroscope","faCalendarCheck","faCalendarExclamation","faCalendarTimes","faFileUpload","faSpinner","faMoneyCheckEdit","faLevelUpAlt","faPaperclip","faAbacus","faAlbum","faFile","faSync","faRectangleVerticalHistory","faUniversity","faShopSlash","faDollarSign","faExchange","faSms","faUserPlus","faUserShield","faWarning","faLocationCrosshairs","faCircleDollarToSlot","faCopy","faCodeBranch","faChevronsUp","faChevronsDown","faEquals","faFileSpreadsheet","faFilePdf","faNewspaper","faFileImage","faFlag","faBarcodeScan","faMap","faBars","faMagnifyingGlass","faGrid2","faScrewdriver","faBullhorn","faMoneyBill","faFileArrowUp","faEarthEurope","faScannerKeyboard","faChevronsLeft","faChevronsRight","faCircleNotch","faMapLocation","faScrewdriverWrench","faBandage","faHourglassHalf","fasInfinity","falCircleCheck","falTriangleExclamation","falCircleQuarters","falCircleExclamation","falMinimize","falMaximize","falTable","falCalendars","fadTelescope","fadInfinity","fadCalendarCheck","fadCalendarExclamation","fadCalendarTimes","fadCalendarPlus","farMaximize","farCommentQuestion","farcircleExclamation","farCircleCheck","fabGoogle","fabWindows","faShare","PublicAssetsLayout","PublicAssetsPage","NotAllowedPage","PlayGroundPage","AssetsInventoryPage","AssetsInventoryLogPage","ServiceRequestAuditTrailHistoryPage","Floors","SubscriptionTypesPage","BudgetExperimentsPage","jss","jssPreset","App","userLoading","isLoginPage","isPublicPage","bookitTheme","defaultTheme","animalTheme","kioskTheme","dateFnsLocale","dateFnsLocales","StylesProvider","CssBaseline","barcodeScannerMiddleware","store","BARCODE_SCANNING","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","MobileBarcodeScanner","handleBarcodeScanned","mobileBarcodeScanCallback","sagaMiddleware","createSagaMiddleware","runSaga","middlewares","createRouterMiddleware","createReducer","injectedReducers","combineReducers","connectRouter","barcodeScanner","barcodeScannerReducer","enhancers","createInjectorsEnhancer","configureStore","middleware","getDefaultMiddleware","serializableCheck","ignoredPaths","ignoredActionPaths","devTools","configureAppStore","MOUNT_NODE","google","families","intervalBetweenKeyPress","scanningEndTimeout","ignoreOnInput","historyLength"],"mappings":";sGAEA,oEASO,IAAMA,EAA2D,GAQ3DC,EAA8B,SAA9BA,EACXC,GAGI,IAFJC,EAEG,uDAFcH,EACjBI,EACG,uCACHC,OAAOC,KAAKJ,GAAMK,SAAQ,SAAAC,GACxB,IAAMC,EAAmBL,EAAO,UAAMA,EAAN,YAAiBI,GAAQA,EAChC,kBAAdN,EAAKM,IACdL,EAAeK,GAAO,GACtBP,EACEC,EAAKM,GACLL,EAAeK,GACfC,IAGFN,EAAeK,GAAOC,O,yECzBIC,E,woBAJ5BC,IAI4BD,EAH9BE,EAAQ,QAIMF,EAAIG,WAAaH,EAAM,CAAEI,QAASJ,GAGlD,IAmCaK,GAjBI,CACfC,MAAM,EAAIL,GAAOG,SAAS,CACxBG,QApBc,CAChBC,KAAM,uBACNC,KAAM,iBACNC,OAAQ,gBACRC,MAAO,SAiBLC,aAAc,SAEhBC,MAAM,EAAIZ,GAAOG,SAAS,CACxBG,QAlBc,CAChBC,KAAM,eACNC,KAAM,YACNC,OAAQ,UACRC,MAAO,QAeLC,aAAc,SAEhBE,UAAU,EAAIb,GAAOG,SAAS,CAC5BG,QAhBkB,CACpBC,KAAM,+CACNC,KAAM,+CACNC,OAAQ,qBACRC,MAAO,sBAaLC,aAAc,U,mBCmCZG,GAAMC,aAAU,aAqjBTC,GAAY,I,WAljBvB,aAAe,yBADfC,kBACc,OA+VPC,cAA+B,CACpCC,WAAY,IACZC,SAAU,KACVC,oBAAqB,OACrBC,aAAc,OACdC,gBAAiB,eACjBC,gBAAiB,WACjBC,SAAU,IACVC,YAAa,YACbC,YAAa,QACbC,SAAU,KACVC,SAAU,KACVC,aAAc,IACdC,iBAAkB,MAClBC,oBAAqB,cACrBC,oBAAqB,UACrBC,QAAS,KACTC,MAAO,OACPC,aAAc,SACdC,aAAc,YACdC,WAAY,MACZC,QAAS,OACTC,aAAc,MACdC,WAAY,SACZC,sBAAuB,aACvBC,QAAS,KACTC,UAAW,QACXC,KAAM,QA1XM,KA4XPC,QAAUA,IA5XH,KA8XPC,oBAAsBA,IA9Xf,KA+XPC,oBAAsBA,IA/Xf,KAgYPC,kBAAoBA,IAhYb,KAiYPC,iBAAmBA,IAjYZ,KAkYPC,kBAAoBA,IAlYb,KAmYPC,mBAAqBA,IAnYd,KAoYPC,qBAAuBA,IApYhB,KAqYPC,kBAAoBA,IArYb,KAsYPC,yBAA2BA,IAtYpB,KAyYPC,IAAMA,IAzYC,KA0YPC,WAAaA,IA1YN,KA2YPC,WAAaA,IA3YN,KA4YPC,SAAWA,IA5YJ,KA6YPC,QAAUA,KA7YH,KA8YPC,SAAWA,KA9YJ,KA+YPC,UAAYA,KA/YL,KAgZPC,YAAcA,KAhZP,KAiZPC,SAAWA,KAjZJ,KAoZPC,YAAcA,KApZP,KAqZPC,WAAaA,KArZN,KA+ZPC,aAAeA,IA/ZR,KAgaPC,eAAiBA,KAhaV,KAiaPC,YAAcA,KAjaP,KAoaPC,UAAYA,IApaL,KAqaPC,SAAWA,KAraJ,KA+aPC,WAAaA,KA/aN,KAgbPC,aAAeA,KAhbR,KAibPC,UAAYA,KAjbL,KAkbPC,cAAgBA,IAlbT,KAmbPC,gBAAkBA,IAnbX,KAobPC,iBAAmBA,IApbZ,KAqbPC,eAAiBA,IArbV,KAsbPC,aAAeA,IAtbR,KAubPC,eAAiBA,IAvbV,KAwbPC,eAAiBA,IAxbV,KAybPC,aAAeA,IAzbR,KA4bPC,QAAUA,IA5bH,KA6bPC,SAAWA,IA7bJ,KA8bPC,SAAWA,IA9bJ,KA+bPC,WAAaA,IA/bN,KAgcPC,QAAUA,IAhcH,KAicPC,QAAUA,IAjcH,KAkcPC,SAAWA,IAlcJ,KAmcPC,QAAUA,IAncH,KAocPC,SAAWA,IApcJ,KAqcPC,WAAaA,IArcN,KAqfPC,mBAAqBA,IApf1BC,KAAK7E,aAAe,IAAI8E,I,sDAQ1B,SAAmBC,GAAoB,IAAD,EACvBA,EAAEC,MAAM,KADe,mBAC/BC,EAD+B,KAC5BC,EAD4B,KAGpC,OADAA,OAAUC,IAAND,EAAkB,GAAKA,EAAEE,cACtBH,EAAEI,cAAgBH,I,2BAE3B,WACE,OAAOL,KAAK7E,aAAasF,S,8DAE3B,WAAuBC,EAAqBC,GAA5C,gFACQP,EAAIJ,KAAKY,mBAAmBF,GADpC,kBAGyBV,KAAKa,UAAUT,GAHxC,OAGUK,EAHV,OAIIT,KAAK7E,aAAasF,OAASA,EAC3BT,KAAK7E,aAAasF,OAAOK,QAAQC,aAAeJ,EALpD,gDAOIK,QAAQC,MAAM,YAAaP,EAA3B,MAPJ,yD,uHAUA,WAAgBQ,GAAhB,iBAAAC,EAAA,sEACuB,0CADvB,cACQV,EADR,OAGsB,QADhBW,EAASX,EAAOS,IACTG,OACTD,EAAOE,WAAahH,IAJxB,kBAMS8G,GANT,2C,uFAQA,SAAmBG,GAEjB,MADuB,kBAANA,EAAiBvB,KAAKwB,SAASD,GAAgBA,I,yCAelE,WACE,OACEvB,KAAK7E,aAAasF,OAAOK,SACzBd,KAAK7E,aAAasF,OAAOK,QAAQW,wB,0CAGrC,WACE,OAA6C,MAAtCzB,KAAK0B,8BACR,EACAC,qBAAU3B,KAAK0B,iC,mCAErB,WACE,OAAiE,MAA1D1B,KAAK7E,aAAasF,OAAOK,QAAQW,sBACpCzB,KAAK4B,+BACLD,qBAAU3B,KAAK7E,aAAasF,OAAOK,QAAQW,yB,gCAEjD,WACE,OACEzB,KAAK7E,aAAasF,OAAOK,SACzBd,KAAK7E,aAAasF,OAAOK,QAAQC,e,iCAGrC,WACE,OAAoC,MAA7Bf,KAAK6B,qBACR,EACAF,qBAAU3B,KAAK6B,wB,0BAErB,WACE,OAAwD,MAAjD7B,KAAK7E,aAAasF,OAAOK,QAAQC,aACpCf,KAAK8B,sBACLH,qBAAU3B,KAAK7E,aAAasF,OAAOK,QAAQC,aAAaA,gB,0BAE9D,WACE,MAAO,CACLU,sBAAuBzB,KAAKyB,wBAC5BV,aAAcf,KAAKe,eACnBN,OAAQT,KAAK7E,aAAasF,U,oBAG9B,SAAOc,EAAqCQ,GAC1C,GAAS,MAALR,QAAmBjB,IAANiB,EACf,OAAO,KAET,IACE,IAAMS,EAAIhC,KAAKiC,mBAAmBV,GAClC,OAAOvB,KAAK7E,aAAa+G,OAAOF,EAAGD,GACnC,MAAOI,GAEP,OADAnB,QAAQC,MAAMkB,GACP,Q,uCAkBX,SAAiCZ,GAE/B,OAAOvB,KAAKkC,OAAOX,EAAGvB,KAAK5E,cAAcO,Y,4BAO3C,SAAsB4F,GACpB,OAAOvB,KAAKkC,OAAOX,EAAGvB,KAAK5E,cAAcE,Y,6BAO3C,SAAuBiG,GACrB,OAAOvB,KAAKkC,OAAOX,EAAGvB,KAAK5E,cAAcY,gB,gCAO3C,SACEuF,GAEA,OAAOvB,KAAKkC,OAAOX,EAAGvB,KAAK5E,cAAcI,gB,iCAO3C,SACE+F,GAEA,OAAOvB,KAAKkC,OAAOX,EAAGvB,KAAK5E,cAAca,oB,wBAE3C,SAAkBsF,GAChB,OAAOvB,KAAKkC,OAAOX,EAAGvB,KAAK5E,cAAcO,Y,sBAE3C,SAAgBuE,GACd,GAAiB,kBAANA,EAAgB,CAIzB,IAAMkC,EACgB,MAApBlC,EAAEA,EAAEmC,OAAS,GAAanC,EAAEoC,OAAO,EAAGpC,EAAEmC,OAAS,GAAKnC,EAGxD,OAFasB,YAASY,GAItB,OAAOlC,I,4BAQX,SAAsBA,GACpB,GAAU,OAANA,EACF,OAAO,KAET,GAAiB,kBAANA,EAQT,OAAOA,EAPP,IACE,OAAOsB,YAAStB,GAChB,MAAOe,GAEP,OADAjG,GAAIiG,MAAJ,2CAA8Cf,IACvC,Q,sBAMb,SAAgBA,GACd,QAAUI,IAANJ,EACF,OAAO,KAET,GAAU,OAANA,EACF,OAAO,KAGT,IAAIkB,EAASpB,KAAKwB,SAAStB,GAC3B,YAAeI,IAAXc,EACK,KAEJmB,MAAMnB,EAAOoB,YAKlBpB,EAASqB,YAAMvC,EAAG,MAAO,EAAG,CAAEO,OAAQT,KAAK7E,aAAasF,SACnD8B,MAAMnB,EAAOoB,WAIX,KAHEpB,GANAA,I,iCAWX,SAA2BG,GACzB,IAAMS,EAAIhC,KAAKiC,mBAAmBV,GAClC,OAAOmB,YAAoBV,EAAG,CAC5BW,WAAW,EACXlC,OAAQT,KAAK7E,aAAasF,W,0BAG9B,SAAoBc,GAClB,IAAMS,EAAIhC,KAAKiC,mBAAmBV,GAElC,OADUnD,aAAW4D,K,uBAYvB,SACEzH,EACAuG,GAKA,IAAM8B,EAAa,WACbC,EAAa,aAgBnB,OAJmB7C,KAAK7E,aAAa+G,OACnC3H,EAZU,SAACuI,GACX,OAAQA,GACN,QACA,IAAK,WACH,MAAM,GAAN,OAAUD,EAAV,cAA0BD,EAA1B,OACF,IAAK,OACH,OAAOC,EACT,IAAK,OACH,OAAOD,GAKXG,CAAG,OAACjC,QAAD,IAACA,OAAD,EAACA,EAASgC,mB,0BAIjB,SACEvI,EACAuG,GAKA,IACE,GAAa,OAATvG,EACF,OAAO,KAET,QAAa+F,IAAT/F,EACF,OAEF,GAAoB,kBAATA,GAAqBA,aAAgByI,KAAM,CACpD,IAAMC,EAAajD,KAAKiC,mBAAmB1H,GAC3C,OAAOyF,KAAKkD,UAAUD,EAAYnC,GAElC,OAAO,KAET,MAAOG,GACP,OAAO,Q,mCAGX,SACE1G,EACAuG,GAGS,IAAD,EACJqC,EAAgBnD,KAAKiC,mBAAmB1H,GAC5C,wBAAQuG,QAAR,IAAQA,OAAR,EAAQA,EAASgC,sBAAjB,QAAmC,YACjC,QACA,IAAK,WACH,OAAO9C,KAAK7E,aAAa+G,OAAOiB,EAAe,yBACjD,IAAK,OACH,OAAOnD,KAAK7E,aAAa+G,OAAOiB,EAAe,cACjD,IAAK,OACH,OAAOnD,KAAK7E,aAAa+G,OAAOiB,EAAe,e,kCAGrD,SAA4BC,GAC1B,OAAOpD,KAAKwB,SAAS4B,K,wBAEvB,SAAkB7I,GAChB,OAAOyF,KAAK7E,aAAa+G,OAAO3H,EAAM,U,+BAGxC,WAAsC,IAAD,OAC7B8I,EAAOC,aAAY,IAAIN,MAC7B,OAAOO,MAAMC,KAAKD,MAAM,IAAIE,KAAI,SAACC,EAAGC,GAAJ,OAC9B,EAAKxI,aAAa+G,OAChBpE,aAAQuF,EAAMM,GACd,EAAKvI,cAAcsB,mB,8BAIzB,WAAqC,IAAD,OAC5B2G,EAAOC,aAAY,IAAIN,MAC7B,OAAOO,MAAMC,KAAKD,MAAM,IAAIE,KAAI,SAACC,EAAGC,GAAJ,OAC9B,EAAKxI,aAAa+G,OAAOpE,aAAQuF,EAAMM,GAAI,EAAKvI,cAAcqB,c,4BAGlE,SAAsBmH,EAAiBC,GAErC,OADWA,EAAQrB,UAAYoB,EAAUpB,WAC3B,M,0BAEhB,SAAoBoB,EAAiBC,GAEnC,OAAQA,EAAQrB,UAAYoB,EAAUpB,WADrB,O,yBAGnB,SAAmBoB,EAAiBC,GAElC,OAAQA,EAAQrB,UAAYoB,EAAUpB,WADrB,Q,yBAGnB,SAAmBoB,EAAiBC,GAElC,OAAQA,EAAQrB,UAAYoB,EAAUpB,WADrB,S,0BAGnB,SAAoBoB,EAAiBC,GACnC,IAAIC,EAIJ,OAHAA,EAA6D,IAAnDD,EAAQE,cAAgBH,EAAUG,eAC5CD,GAAUF,EAAUtE,YACpBwE,GAAUD,EAAQvE,aACD,EAAI,EAAIwE,I,yBAyD3B,SACEvJ,EACAyJ,GAEA,OAAOV,aAAY/I,EAAM,CACvBkG,OAAQvF,GAAUC,aAAasF,OAC/BM,aAAciD,M,uBAUlB,SACEzJ,EACAyJ,GAEA,OAAOC,aAAU1J,EAAM,CACrBkG,OAAQvF,GAAUC,aAAasF,OAC/BM,aAAciD,M,oBA0BlB,SAAczJ,GACZ,OAAO2J,YAAO3J,K,qBAEhB,SACEA,EACA4J,EACAH,GAEA,OAAOI,YAAQ7J,EAAM4J,EAAM,CACzB1D,OAAQT,KAAK7E,aAAasF,OAC1BM,aAAciD,M,oBAGlB,SACEzJ,EACA8J,EACAL,GAEA,OAAOM,YAAO/J,EAAM8J,EAAK,CACvB5D,OAAQT,KAAK7E,aAAasF,OAC1BM,aAAciD,M,iBAGlB,SACEzJ,EACAgK,GAUA,OAAOC,YAAIjK,EAAMgK,K,kCAGnB,SACEhK,EACAkK,GAEA,OAAOC,YAAenK,EAAM,CAC1BkG,OAAQT,KAAK7E,aAAasF,OAC1BM,aAAc0D,M,iCAKlB,SAA2B3J,GACzB,IAAI6J,EAAe7J,EAAKqF,MAAM,QAG9B,OAFYyE,SAASD,EAAa,GAAI,KACxBA,EAAa,GAAKC,SAASD,EAAa,GAAI,IAAM,GACvC,K,oBAE3B,SAAcpK,GACZ,OAAOW,GAAU+G,mBAAmB1H,K,qBAEtC,SAAeA,GACb,OAAKA,EAGI,IAAIsK,KAAW7E,KAAK8E,OAAOvK,GAAO,YAFlC,IAAIsK,KAAW,IAAI7B,KAAQ,c,yBAKtC,SAAmBzI,GACjB,OAAOW,GAAUqE,SAASrE,GAAU4J,OAAOvK,KAAU,GAAK,KAAO,O,+BAEnE,SACEO,EACAiK,EACAC,GAEA,IAAIC,EAAM/J,GAAU4J,OAAOhK,GAC3B,GAAIkK,IACoB9J,GAAUqE,SAAS0F,IAAQ,GAAK,KAAO,QACrCF,EAAU,CAChC,IAAIG,EACW,OAAbH,EACI7J,GAAUqE,SAAS0F,GAAO,GAC1B/J,GAAUqE,SAAS0F,GAAO,GAChC,OAAO/J,GAAU2E,SAASoF,EAAKC,GAGnC,OAAOD,I,8BAET,SAAwBnK,GACtB,IAAImK,EAAM/J,GAAU4J,OAAOhK,GAE3B,MAAwB,QADFI,GAAUqE,SAAS0F,GAAO,GAAK,KAAO,MAE9C/J,GAAUqE,SAAS0F,GAAO,GAGjC/J,GAAUqE,SAAS0F,K,6BAE5B,SAAuB1K,GASrB,OAPW,OAATA,QAA0B+F,IAAT/F,EACb,KACgB,kBAATA,GAES,kBAATA,EADP,IAAIyI,KAAKzI,GAGTW,GAAU+G,mBAAmB1H,O,oPClnB3B4K,E,iDAAAA,K,YAAAA,E,eAAAA,E,iBAAAA,E,sBAAAA,E,cAAAA,E,mBAAAA,E,oBAAAA,E,kBAAAA,E,4BAAAA,E,UAAAA,E,gBAAAA,E,QAAAA,E,oBAAAA,E,oBAAAA,E,UAAAA,E,cAAAA,E,sBAAAA,E,oBAAAA,E,UAAAA,E,eAAAA,M,KAkFL,SAASC,EACdhC,GAEA,GAAc,OAAVA,EACF,OAAO,KACF,GAAqB,kBAAVA,EAChB,OAAOA,EAAMiC,WACR,GAAqB,mBAAVjC,EAChB,OAAOA,EAAMiC,WACR,GAAqB,kBAAVjC,EAChB,MAAM,IAAN,OAAWkC,EAAiBlC,GAA5B,KACuC,IAAD,EAAjC,GAAIA,aAAiByB,IAC1B,MAAM,GAAN,OAAU3J,IAAUgI,UAAUE,EAAO,CACnCN,eAAc,UAAGM,EAAqBN,sBAAxB,QAA0C,UAErD,GAAIM,aAAiBJ,KAC1B,MAAM,GAAN,OAAU9H,IAAUgI,UAAUE,EAAO,CAAEN,eAAgB,cAClD,GAAIS,MAAMgC,QAAQnC,GACvB,MAAM,IAAN,OAAWA,EAAMK,KAAI,SAAAlC,GAAC,OAAI6D,EAAgB7D,MAAIiE,KAAK,KAAnD,KACK,GAAI,OAAQpC,EACjB,OAAOgC,EAAgBhC,EAAMqC,IAG7B,MADAzE,QAAQC,MAAR,oCAA2CmC,GAASA,GAC9C,IAAIsC,MAAJ,oCAAuCtC,IAQ1C,SAASkC,EAAiBlC,GAC/B,OAAOA,EAAMuC,WAAW,IAAK,MAGxB,SAASC,EAEdC,EAAcC,GACd,OAAKA,GAAoC,MAAtB,OAACD,QAAD,IAACA,IAAa,IAG1B,IAAMA,EAAY,aAFhBA,EAQJ,IAAME,EAAb,WAME,WACEC,EACAC,EACA7C,EACA8C,EACAJ,GACC,yBAXIE,WAWL,OAVKE,YAUL,OATKD,cASL,OARK7C,WAQL,OAPK0C,gBAOL,EACA9F,KAAKgG,MAAQA,EACbhG,KAAKkG,OAASA,EACdlG,KAAKiG,SAAWA,EAChBjG,KAAKoD,MAAQA,EACbpD,KAAK8F,WAAaA,EAjBtB,2CAwBE,WACE,IAAMK,EAAwB,GACxBC,EAASpG,KAAKoD,MAAcgD,MACpB,OAAVA,GACFD,EAAGE,KACD,IAAIN,EAAU/F,KAAKgG,MAAOb,EAAemB,iBAAkBF,IAG/D,IAAMG,EAAOvG,KAAKoD,MAAcmD,IAMhC,OALY,OAARA,GACFJ,EAAGE,KAAK,IAAIN,EAAU/F,KAAKgG,MAAOb,EAAeqB,cAAeD,IAGhEJ,EAAG9D,OAAS,EAAZ,WAAoB8D,EAAG1C,KAAI,SAAAgD,GAAC,OAAIA,EAAEpB,cAAYG,KAAK,SAAnD,KAAiE,KArCvE,0BA4CE,WACE,QAAoBlF,IAAhBN,KAAKkG,OAAsB,MAAO,GACtC,IAAMC,EAAwB,GACxBC,EAASpG,KAAKoD,MAAcgD,MACpB,OAAVA,GACFD,EAAGE,KAAK,IAAIN,EAAU/F,KAAKkG,OAAQf,EAAeuB,YAAaN,IAEjE,IAAMG,EAAOvG,KAAKoD,MAAcmD,IAMhC,OALY,OAARA,GACFJ,EAAGE,KAAK,IAAIN,EAAU/F,KAAKgG,MAAOb,EAAewB,SAAUJ,IAG3DJ,EAAG9D,OAAS,EAAZ,UAAmB8D,EAAG1C,KAAI,SAAAgD,GAAC,OAAIA,EAAEpB,cAAYG,KAAK,UAAa,KAxDrE,oBA2DE,WAKE,MAHY,UAAMxF,KAAKgG,MAAX,oBACVhG,KAAKkG,OAAS,IAAMlG,KAAKkG,OAAS,GADxB,eAELd,EAAgBpF,KAAKoD,OAFhB,OA7DhB,qBAkEE,WAEE,MADY,cAAUpD,KAAKgG,MAAf,YAnEhB,oBAsEE,WACE,YAAoB1F,IAAhBN,KAAKkG,OAA6B,GAC1B,UAAMlG,KAAKgG,MAAX,qBAA6BhG,KAAKkG,OAAlC,eAA+Cd,EACzDpF,KAAKoD,OADK,gBAxEhB,mBA6EE,WACE,OAAKG,MAAMgC,QAAQvF,KAAKoD,OACZ,UAAMpD,KAAKgG,MAAX,oBACRhG,KAAKkG,OAAS,IAAMlG,KAAKkG,OAAS,GAD1B,eAELd,EAAgBpF,KAAKoD,OAFhB,KAD2B,KA9E3C,mBAoFE,WACE,OAAKG,MAAMgC,QAAQvF,KAAKoD,OACZ,UAAMpD,KAAKgG,MAAX,oBACVhG,KAAKkG,OAAS,IAAMlG,KAAKkG,OAAS,GADxB,eAELd,EAAgBpF,KAAKoD,OAFhB,KAD2B,KArF3C,iBA2FE,WACE,YAAoB9C,IAAhBN,KAAKkG,OAA6B,GAC1B,UAAMlG,KAAKgG,MAAX,qBAA6BhG,KAAKkG,OAAlC,eAA+Cd,EACzDpF,KAAKoD,OADK,OA7FhB,iBAkGE,WAAO,IAAD,OACAwD,EACa,OAAf5G,KAAKoD,OAAkBG,MAAMgC,QAAQvF,KAAKoD,OACrCpD,KAAKoD,MAAiCK,KAAI,SAAAlC,GACzC,MAAM,GAAN,OAAU6D,EAAgB7D,GAA1B,eAAmC,EAAKyE,eAE1C1F,EACN,YAAeA,IAARsG,EAAA,WAAwBA,EAAIpB,KAAK,QAAjC,KAA8C,KAzGzD,sBA2GE,SAAgBqB,GACd,IAAMD,EAAM5G,KAAKqF,WACXyB,EAAI,OAAGD,QAAH,IAAGA,IAAaE,OAAO/G,KAAKgG,OACtC,YAAY1F,IAARsG,EAA0BA,EACvB,KAAOA,EAAM,QAAUE,EAAO,cA/GzC,sBAiHE,WAAuC,IAAD,OACpC,QAAmBxG,IAAfN,KAAKoD,YAGa9C,IAAlBN,KAAKiG,SAGT,OAAQjG,KAAKiG,UACX,KAAKd,EAAe6B,OACpB,KAAK7B,EAAe8B,UACpB,KAAK9B,EAAeuB,YACpB,KAAKvB,EAAemB,iBACpB,KAAKnB,EAAewB,SACpB,KAAKxB,EAAeqB,cAClB,MAAM,GAAN,OAAUxG,KAAKgG,MAAf,YAAwBhG,KAAKiG,SAA7B,YAAyCb,EAAgBpF,KAAKoD,QAChE,KAAK+B,EAAe+B,SAClB,MAAM,oBAAN,OAA2BlH,KAAKgG,MAAhC,cAA2CZ,EACzCpF,KAAKoD,OACL5C,cAFF,KAGF,KAAK2E,EAAegC,UAClB,IAAIC,EACa,OAAfpH,KAAKoD,OAAkBG,MAAMgC,QAAQvF,KAAKoD,OACrCpD,KAAKoD,MAAiCK,KAAI,SAAAlC,GAAM,IAAD,EAC9C,MAAM,oBAAN,OAA2B,EAAKyE,MAAhC,cAA2CZ,EAAe,iBACxD7D,QADwD,IACxDA,OADwD,EACxDA,EAAC,YADuD,QACzCA,GACff,cAFF,aAIFF,EACN,YAAiBA,IAAV8G,EAAsBA,EAAM5B,KAAK,QAAU,GACpD,KAAKL,EAAekC,QAClB,OAAOrH,KAAKsH,UACd,KAAKnC,EAAeoC,aAClB,OAAOvH,KAAKwH,eACd,KAAKrC,EAAesC,IAClB,OAAOzH,KAAK0H,SACd,KAAKvC,EAAewC,OAClB,OAAO3H,KAAK4H,SACd,KAAKzC,EAAe0C,GAClB,MAAM,IAAN,OAAWzC,EAAgBpF,KAAKoD,OAAhC,eAA6CpD,KAAKgG,MAAlD,KACF,KAAKb,EAAe2C,IAClB,OAAO9H,KAAK+H,MACd,KAAK5C,EAAe6C,SAClB,MAAM,IAAN,OAAWhI,KAAKgG,MAAhB,eAA4BZ,EAAgBpF,KAAKoD,OAAjD,KACF,KAAK+B,EAAe8C,SAClB,MAAM,IAAN,OAAWjI,KAAKgG,MAAhB,eAA4BZ,EAAgBpF,KAAKoD,OAAjD,cACF,KAAK+B,EAAe+C,MAClB,OAAOlI,KAAKmI,QACd,KAAKhD,EAAeiD,SAClB,OAAOpI,KAAKqI,UACd,KAAKlD,EAAemD,IAClB,OAAOtI,KAAKuI,MACd,KAAKpD,EAAeqD,MAClB,OAAOxI,KAAKyI,QACd,QACE,YAvKR,KA+KaC,EAAb,WAME,WAAYtI,GAOR,yBAZJuI,WAAwC,GAYrC,KAXHC,yBAA2C,GAWxC,KAVHC,mBAUG,OATHC,kBASG,OARHC,4BAQG,EACD/I,KAAK2I,WAAavI,EAAEuI,WAAWK,QAC7B,SAAAjH,GAAC,MAAqB,KAAjBA,EAAEsD,iBAAsC/E,IAAjByB,EAAEsD,cAEhCrF,KAAK6I,cAAgBzI,EAAEyI,cACvB7I,KAAK8I,aAAe1I,EAAE0I,aACtB9I,KAAK4I,yBAA2BxI,EAAEwI,0BAA4B,GAC9D5I,KAAK+I,uBAAyB3I,EAAE2I,uBApBpC,4CAsBE,WAAuC,IAAD,EAC9B3I,EAAc,GACpB,QACwBE,IAAtBN,KAAK8I,cACiB,OAAtB9I,KAAK8I,cACiB,KAAtB9I,KAAK8I,mBAEsBxI,IAAvBN,KAAK6I,cAA6B,CACpC,IAAMI,EAAcjJ,KAAK8I,aAAatI,cACtCJ,EAAEiG,KACA,IACErG,KAAK6I,cACFpF,KAAI,SAAAgD,GAAC,MACS,oBAANA,EACHA,EAAE,IAAMnB,EAAiB2D,GAAe,KACxC,IAAIlD,EACFU,EACAtB,EAAe+B,SACf+B,MAGPxF,KAAI,SAAAgD,GAAC,OAAIA,EAAEpB,cACXG,KAAK,QACR,KAuDR,OAnDI,UAAAxF,KAAK2I,kBAAL,eAAiBtG,QAAS,GAC5BjC,EAAEiG,KACA,IACErG,KAAK2I,WACFlF,KAAI,SAAAyF,GAAC,OAAItD,EAAesD,EAAE7D,WAAY6D,EAAC,eACvCF,QAAO,SAAAE,GAAC,MAAU,KAANA,QAAkB5I,IAAN4I,KACxB1D,KAAK,SACR,KAIJxF,KAAK4I,yBAAyBvG,OAAS,GACI,KAA3CrC,KAAK4I,yBAAyB,GAAG5C,QAEc,mBAA3ChG,KAAK4I,yBAAyB,GAAG5C,MACnC5F,EAAEiG,KACA,MACmC,IAAhCrG,KAAK+I,uBACF/I,KAAK4I,yBACFO,OACC,IAAIpD,EACF,iBACAZ,EAAe6B,OACf,OAGHvD,KAAI,SAAAyF,GAAC,OAAIA,EAAE7D,cACXG,KAAK,QACRxF,KAAK4I,yBACFnF,KAAI,SAAAyF,GAAC,OAAIA,EAAE7D,cACXG,KAAK,SACZ,MAGgC,IAAhCxF,KAAK+I,wBACP3I,EAAEiG,KACA,IACErG,KAAK4I,yBACFnF,KAAI,SAAAyF,GAAC,OAAIA,EAAE7D,cACXG,KAAK,QACR,MAMK,IAAbpF,EAAEiC,QAEe,IAAbjC,EAAEiC,QAAyB,OAATjC,EAAE,QADpBE,EAGAF,EAAEoF,KAAK,aAnGjB,M,6BC3TA,kCACO,IA8EM4D,EAAe,CAC1BC,KAAM,CACJC,MAhF0B,UAiF1BC,MAhFyB,WAkF3BC,UAAW,CACTC,aAjFuC,UAkFvCC,gBAjFyC,UAkFzCC,cAjFuC,UAkFvCC,eAjFwC,UAkFxCC,oBAjF8C,UAkF9CC,YAjFqC,UAkFrCC,cAjFuC,UAkFvCC,iBAjF2C,UAkF3CC,eAjFwC,UAkFxCC,oBAjFsC,WAmFxCC,SAAU,CACRC,aAjFiC,uBAkFjCC,aAjFiC,6BAmFnCC,QAAS,CACPC,KAjFiC,UAkFjCC,MAjF4B,UAkF5BC,QAjF8B,UAkF9BC,WAjFiC,UAkFjCC,gBAjFuC,UAkFvCC,QAjF8B,UAkF9BC,SAjF+B,UAkF/BC,QAjF+B,UAkF/BC,WAjFiC,UAkFjCC,QAjF+B,WAmFjCC,UAAW,CACTC,OAAQ,CACNX,KAlFwC,UAmFxCC,MAlFmC,UAmFnCC,QAlFqC,UAmFrCC,WAlFwC,UAmFxCC,gBAlF8C,UAmF9CC,QAlFqC,UAmFrCC,SAlFsC,UAmFtCC,QAlFsC,UAmFtCC,WAlFwC,UAmFxCC,QAlFsC,YAqF1CG,OAAQ,CACNZ,KAnFyC,UAoFzCC,MAnFoC,UAoFpCC,QAnFsC,UAoFtCC,WAnFyC,UAoFzCC,gBAnF+C,UAoF/CC,QAnFsC,UAoFtCC,SAnFuC,UAoFvCC,QAnFuC,UAoFvCC,WAnFyC,UAoFzCC,QAnFuC,WAqFzCI,QAAS,CACPb,KAnF0C,UAoF1CC,MAnFqC,UAoFrCC,QAnFuC,UAoFvCC,WAnF0C,UAoF1CC,gBAnFgD,UAoFhDC,QAnFuC,UAoFvCC,SAnFwC,UAoFxCC,QAnFwC,UAoFxCC,WAnF0C,UAoF1CC,QAnFwC,WAqF1CK,QAAS,CACPd,KAnFwC,UAoFxCC,MAnFmC,UAoFnCC,QAnFqC,UAoFrCC,WAnFwC,UAoFxCC,gBAnF8C,UAoF9CC,QAnFqC,UAoFrCC,SAnFsC,UAoFtCC,QAnFsC,UAoFtCC,WAnFwC,UAoFxCC,QAnFsC,YA2G7B5B,EAAaC,KAAKC,MAMlBF,EAAaC,KAAKE,MAalBH,EAAae,SAASC,aAMtBhB,EAAae,SAASE,aAatBjB,EAAaI,UAAUC,aAMvBL,EAAaI,UAAUE,gBAMvBN,EAAaI,UAAUG,cAMvBP,EAAaI,UAAUI,eAMvBR,EAAaI,UAAUK,oBAMvBT,EAAaI,UAAUM,YAMvBV,EAAaI,UAAUO,cAMvBX,EAAaI,UAAUQ,iBAMvBZ,EAAaI,UAAUS,eAMvBb,EAAaI,UAAUU,oBAYvBd,EAAakB,QAAQC,KAMrBnB,EAAakB,QAAQE,MAMrBpB,EAAakB,QAAQG,QAMrBrB,EAAakB,QAAQI,WAMrBtB,EAAakB,QAAQK,gBAMrBvB,EAAakB,QAAQM,QAMrBxB,EAAakB,QAAQO,SAMrBzB,EAAakB,QAAQQ,QAMrB1B,EAAakB,QAAQS,WAMrB3B,EAAakB,QAAQU,QAYrB5B,EAAagC,QAAQb,KAMrBnB,EAAagC,QAAQZ,MAMrBpB,EAAagC,QAAQX,QAMrBrB,EAAagC,QAAQV,WAMrBtB,EAAagC,QAAQT,gBAMrBvB,EAAagC,QAAQR,QAMrBxB,EAAagC,QAAQP,SAMrBzB,EAAagC,QAAQN,QAMrB1B,EAAagC,QAAQL,WAMrB3B,EAAagC,QAAQJ,QAYrB5B,EAAa+B,OAAOZ,KAMpBnB,EAAa+B,OAAOX,MAMpBpB,EAAa+B,OAAOV,QAMpBrB,EAAa+B,OAAOT,WAMpBtB,EAAa+B,OAAOR,gBAMpBvB,EAAa+B,OAAOP,QAMpBxB,EAAa+B,OAAON,SAMpBzB,EAAa+B,OAAOL,QAMpB1B,EAAa+B,OAAOJ,WAMpB3B,EAAa+B,OAAOH,QAYpB5B,EAAaiC,QAAQd,KAMrBnB,EAAaiC,QAAQb,MAMrBpB,EAAaiC,QAAQZ,QAMrBrB,EAAaiC,QAAQX,WAMrBtB,EAAaiC,QAAQV,gBAMrBvB,EAAaiC,QAAQT,QAMrBxB,EAAaiC,QAAQR,SAMrBzB,EAAaiC,QAAQP,QAMrB1B,EAAaiC,QAAQN,WAMrB3B,EAAaiC,QAAQL,QAYrB5B,EAAa6B,UAAUC,OAAOX,KAM9BnB,EAAa6B,UAAUC,OAAOV,MAM9BpB,EAAa6B,UAAUC,OAAOT,QAM9BrB,EAAa6B,UAAUC,OAAOR,WAM9BtB,EAAa6B,UAAUC,OAAOP,gBAM9BvB,EAAa6B,UAAUC,OAAON,QAM9BxB,EAAa6B,UAAUC,OAAOL,SAM9BzB,EAAa6B,UAAUC,OAAOJ,QAM9B1B,EAAa6B,UAAUC,OAAOH,WAM9B3B,EAAa6B,UAAUC,OAAOF,S,g+CCzlB9BM,EAAb,WAEE,WAAYC,GAAkC,yBAD9CC,mBAC6C,EAC3CxL,KAAKwL,cAAgBD,EAHzB,mDAKE,SAAuBxR,GACrB,GAAIiG,KAAKwL,cAAcnJ,OAAS,EAAG,CACjC,IAAIoJ,EAAOzL,KAAKwL,cAAcE,MAAK,SAACtI,EAAOuI,GAAR,OAAkBvI,EAAMwI,MAAQ7R,KACnE,YAAgBuG,IAATmL,EAAqB,KAAOA,EAEnC,OAAO,OAVb,sCAaE,SAAgC1R,GAC9B,IAAI8R,EAAiB,CACnBD,IAAK7R,EACL+R,MAAO,GACPC,SAAS,EACTC,UAAU,EACVC,SAAU,GACVxG,GAAI,EACJyG,KAAM,GACNC,QAAS,GACTC,cAAe,GACfC,WAAY,KACZC,cAAc,GAEhB,GAAItM,KAAKwL,cAAcnJ,OAAS,EAAG,CACjC,IAAIoJ,EAAOzL,KAAKwL,cAAcE,MAAK,SAACtI,EAAOuI,GAAR,OAAkBvI,EAAMwI,MAAQ7R,KACnE,YAAgBuG,IAATmL,EAAqBI,EAAiBJ,EAE7C,OAAOI,IA/Bb,gCAkCE,SAA0B9R,GACxB,IAAI8R,EAAiB,CACnBD,IAAK7R,EACL+R,MAAO,GACPC,SAAS,EACTC,UAAU,EACVC,SAAU,GACVxG,GAAI,EACJyG,KAAM,GACNC,QAAS,GACTC,cAAe,GACfC,WAAY,KACZC,cAAc,GAEhB,GAAItM,KAAKwL,cAAcnJ,OAAS,EAAG,CACjC,IAAIoJ,EAAOzL,KAAKwL,cAAcE,MAAK,SAACtI,EAAOuI,GAAR,OAAkBvI,EAAMwI,MAAQ7R,KACnE,YAAgBuG,IAATmL,EAAqBI,EAAiBJ,EAE7C,OAAOI,IApDb,+BAuDE,SACEU,GAEA,OAAOvM,KAAKwL,cAAcE,KAAKa,KA1DnC,kCA6DE,SAA4BxS,GAC1B,GAAIiG,KAAKwL,cAAcnJ,OAAS,EAAG,CACjC,IAAIoJ,EAAOzL,KAAKwL,cAAcE,MAAK,SAACtI,EAAOuI,GAAR,OAAkBvI,EAAMwI,MAAQ7R,KACnE,OAAQA,GACN,IAAK,kBACH,YAAgBuG,IAATmL,GAA4BA,EAAKM,SAI9C,OAAO,OAtEX,gCAyEE,SAA0BhS,GACxB,GAAIiG,KAAKwL,cAAcnJ,OAAS,EAAG,CACjC,IAAIoJ,EAAOzL,KAAKwL,cAAcE,MAAK,SAACtI,EAAOuI,GAAR,OAAkBvI,EAAMwI,MAAQ7R,KACnE,OAAQA,GACN,IAAK,kBACH,YAAgBuG,IAATmL,GAA4BA,EAAKM,SAI9C,OAAO,SAlFX,K,iDCYMS,EAAc,SAACC,GACnB,OAAOA,EAAMC,aAAeC,KAEjBC,EAAoBC,YAC/B,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMC,eAGJI,EAAqBD,YAChC,CAACD,IACD,SAAAH,GAAK,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAOM,WAELC,EAAoBH,YAC/B,CAACC,EAAoB,SAACL,EAAOQ,GAAR,OAAuCA,KAC5D,SAACR,EAAOQ,GAAR,8BAAuCR,QAAvC,IAAuCA,OAAvC,EAAuCA,EAAOS,SAASD,UAAvD,YAMWE,GAJqBN,YAChC,CAACD,IACD,SAAAH,GAAK,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAOW,cAAcC,UAEGR,YACjC,CAACD,IACD,SAAAH,GAAU,IAAD,EACDhM,EAAM,OAAGgM,QAAH,IAAGA,GAAH,UAAGA,EAAOW,qBAAV,aAAG,EAAsBC,OACrC,YAAkB/M,IAAXG,OACHH,EACApF,IAAU0F,mBAAmBH,OAGxB6M,EAAgBT,YAAe,CAACD,IAAoB,SAAAH,GAAU,IAAD,EACxE,cAAOA,QAAP,IAAOA,GAAP,UAAOA,EAAOW,qBAAd,aAAO,EAAsBG,WAElBC,EAA6BX,YACxC,CAACD,IACD,SAAAH,GAAK,8BAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAOW,cAAc3I,sBAAzB,QAA2C,KAErCgJ,EAAmBZ,YAC9B,CAACD,IACD,SAAAH,GAAK,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAOiB,cAGLC,EAA4Bd,YACvC,CAACD,IACD,SAAAH,GAAK,OAAS,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOmB,sBAHiB,OAKtBC,EAA+BhB,YAC1C,CAACD,IACD,SAAAH,GAAK,OAAS,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOqB,0BAA0B,KAEtCC,EAAiC,CACrC,OACA,OACA,OACA,MACA,MACA,OACA,OACA,OACA,QAEWC,EAAgCnB,YAC3C,CAACD,IACD,SAAAH,GAAK,8BAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAOwB,+BAAX,QAAsCF,KAEhCG,EAAuBrB,YAClC,CAACD,IACD,SAAAH,GAAK,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAO0B,kBAELC,EAAoBvB,YAC/B,CAACD,IACD,SAAAH,GAAK,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAO4B,YAELC,EAAkBzB,YAAe,CAACD,IAAoB,SAAAH,GAAK,YAC7CnM,KAApB,OAALmM,QAAK,IAALA,OAAA,EAAAA,EAAO8B,oBACHjO,EACAkO,YAAoB/B,EAAM8B,kBAEnBE,EAA0B5B,YACrC,CAACD,IACD,SAAAH,GAAK,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAOiC,4BAELC,EAAmB9B,YAC9B,CAACuB,EAAmB,SAAC3B,EAAOlS,GAAR,OAAmDA,KACvE,SAACqU,EAAUrU,GAAU,IAAD,EACZsU,EAAY,iBAAGD,QAAH,IAAGA,OAAH,EAAGA,EAAUE,6BAAb,QAAsC,EACpDC,EACO,OAATxU,QAA0B+F,IAAT/F,EACbW,IAAU+G,mBAAmB,IAAIe,MACjC9H,IAAU+G,mBAAmB1H,GAC7ByU,EAAoBD,EAAYE,oBAKtC,OAJkB/T,IAAU0C,WAC1BmR,EACAF,EAAeG,MAWRE,GANqCrC,YAChD,CAACD,IACD,SAAAH,GAAK,OACH,OAACA,QAAD,IAACA,OAAD,EAACA,EAAO0C,+BACRC,IAAiCC,mCAECxC,YACpC,CAACD,IACD,SAAAH,GAAK,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAO6C,qBAELC,EAAuB1C,YAClC,CAACD,IACD,SAAAH,GAAK,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAO+C,kBAKZC,EAAgC5C,YACpC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMiD,qBAEJC,EAA0B9C,YACrC,CAAC4C,IACD,SAAAhD,GAGE,OAZ+B,SAACtL,GAClC,YAAab,IAANa,OAAkBb,EAAY,IAAIsP,IAAkBzO,GAU/C0O,CADApD,MAQDqD,EAA2BjD,YACtC,CAACD,EAAmB+C,IACpB,SAACjD,EAAagD,GAAd,OACEK,iBAAM,OACJrD,QADI,IACJA,OADI,EACJA,EAAasD,oBACb,SAAC5M,EAAOrJ,GAAR,OAAgBqJ,EAAM6M,eAAkC3P,IAAtBoP,QAG3BQ,EAA2BrD,YACtC,CAACD,EAAmBkD,EAA0BH,IAC9C,SAACjD,EAAayD,EAAoBT,GAChC,OAAO9V,OAAOwW,QAAQD,GAAoB1M,KAAI,yCAAmB,CAC/DgC,GAD4C,KAE5C4K,SAAS,EACTC,YAH4C,KAGzBA,mBAIZC,EAAqB1D,YAChC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM+D,gBAOJC,GALwB5D,YACnC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMiE,mBAGY7D,YAAe,CAACL,IAAc,SAAAC,GAUzD,OAR4B,IAA1BA,EAAMkE,gBACFlE,EAAMmE,oBACNnE,EAAMoE,wBACNpE,EAAMqE,4BACNrE,EAAMsE,uBACoB,IAA1BtE,EAAMkE,gBACNlE,EAAMmE,oBAAsBnE,EAAMsE,sBAClCtE,EAAMuE,0BAA4BvE,EAAMsE,0BAInCE,GADcpE,YAAe,CAACL,IAAc,SAAAC,GAAK,OAAIA,EAAMxL,SACvC4L,YAC/B,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMuE,6BAEJE,EAAsBrE,YACjC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM0E,iBAEXC,EAA0BvE,YAC9B,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM4E,kBAEJC,EAAuBzE,YAClC,CAACuE,IACD,SAAA3E,GAAK,OAAI,IAAI8E,IAAe9E,GAAU,OAE3B+E,EAAsB3E,YACjC,CAACuE,EAAyB,SAAC3E,EAAO3F,GAAR,OAAkCA,KAC5D,SAAC2K,EAAmB3K,GAAU,IAAD,EACrB1G,EAAIqR,EAAkB/F,MAC1B,SAAA3J,GAAC,OACCA,EAAEmK,KAAKwF,OAAOlR,gBACdmR,IAAgB7K,GAAM4K,OAAOlR,iBAEjC,wBAAOJ,QAAP,IAAOA,OAAP,EAAOA,EAAG0L,aAAV,aAAmBxL,KAGVsR,EAAmB/E,YAC9B,CAAC0C,EAAsB,SAAC9C,EAAOoF,GAAR,OAAiCA,KACxD,SAACC,EAAgBD,GACf,IAAIzQ,GAAS,EACb,OAAc,OAAVyQ,IAGEC,GAAkBA,EAAezP,OAAS,IAC9CjB,EAAS0Q,EAAeC,MAAK,SAAAhQ,GAAC,OAAIA,IAAM8P,MAEnCzQ,MAGE4Q,EAA0BnF,YACrC,CAACuE,EAAyB,SAAC3E,EAAO3F,GAAR,OAAkCA,KAC5D,SAAC2K,EAAmB3K,GAClB,IAAM1G,EAAIqR,EAAkB/F,MAC1B,SAAA3J,GAAC,OACCA,EAAEmK,KAAKwF,OAAOlR,gBACdmR,IAAgB7K,GAAM4K,OAAOlR,iBAEjC,OAAoB,QAAZ,OAADJ,QAAC,IAADA,OAAA,EAAAA,EAAG0L,aACKxL,KAAZ,OAADF,QAAC,IAADA,OAAA,EAAAA,EAAG0L,QACS,KAAZ1L,EAAE0L,OACwB,UAA1B1L,EAAE0L,MAAMtL,eAEoB,SAA1BJ,EAAE0L,MAAMtL,iBAGHyR,EAAwBpF,YACnC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMyF,mBAEJC,EAAwBtF,YACnC,CAACL,IACD,SAAAC,GAAK,uBAAIA,EAAM2F,uBAAV,QAA6B,IAAIC,IAAgB5F,EAAMyF,oBAEjDI,EAAoBzF,YAC/B,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM8F,eAEJC,EAA2B3F,YACtC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMgG,sBAEJC,GAA4B7F,YACvC,CAACL,IACD,SAAAC,GAAK,OAAI,IAAInB,EAAYmB,EAAMkG,wBAOpBC,GAA2B/F,YACtC,CAAC6F,GAA2B,SAACjG,EAAO1S,GAAR,OAAgBA,KAC5C,SAAC0S,EAAO1S,GAAR,uBAAgB0S,EAAMoG,gBAAgB9Y,UAAtC,aAAgB,EAA4B+R,SAMjCgH,IAJmBjG,YAC9B,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMsG,cAEsBlG,YACrC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMuG,oBAOJC,IAJmCpG,YAC9C,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMyG,8BAEoBrG,YACnC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMkE,oBAMJwC,IAJ2BtG,YACtC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM2G,sBAEsBvG,YACrC,CAACL,EAAa,SAACC,EAAO4G,GAAR,OAAqBA,KACnC,SAAC5G,EAAO4G,GACN,IAAIjS,GAAkB,EACtB,GAAIiS,EACFjS,EAASqL,EAAMsG,gBAEf,GAAItG,EAAM2G,mBACRhS,EAASqL,EAAMsG,eACV,CACL,IACIO,EADO,IAAIhI,EAAYmB,EAAMkG,qBACbY,mBAAmB,mBACvCnS,EAAsB,OAAbkS,GAAoBA,EAGjC,OAAOlS,MAGEoS,GAAiC3G,YAC5C,CAACL,IACD,SAAAC,GACE,IAAIgH,EAA2BhH,EAAM4E,eAAe3F,MAClD,SAAA3J,GAAC,MAAa,8BAATA,EAAE0D,MAET,OAC+B,OAA7BgO,QAC6BnT,IAA7BmT,GAEuC,SAAnCA,EAAyB3H,MACpB,GAKFW,EAAM7D,4BAIN8K,GAAqC7G,YAChD,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMkH,gCAEJC,GAAsC/G,YACjD,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMoH,iCAEJC,GAA0BjH,YACrC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMsH,qBAEJC,GAAqBnH,YAChC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMwH,gBASJC,GAA4BrH,YACvC,CACEL,EACA,SAAAC,GAAK,OAAIO,EAAkBP,EAAO0H,IAAaC,qBAC/C,SAAA3H,GAAK,OACHuF,EAAwBvF,EAAOkF,IAAgB0C,uBAC/CrC,EACEvF,EACAkF,IAAgB2C,oDAEpB,SAAA7H,GAAK,OACHuF,EAAwBvF,EAAOkF,IAAgB4C,2BACjD,SAAC9H,EAAO+H,GAAR,OAAyBA,KAE3B,SACE/H,EACA2H,EACAC,EACAE,EACAC,GAEA,IAAMC,EAAc,SAACvU,GAAD,MAA2B,CAC7CuF,GAAIvF,EACJgM,KAAMsI,EAAEE,IAAkBxU,MAEtByU,EAA8B,GAepC,OAbAA,EAAKtO,KAAKoO,EAAYC,IAAkBE,WACxCD,EAAKtO,KAAKoO,EAAYC,IAAkBG,UACpCT,GACFO,EAAKtO,KAAKoO,EAAYC,IAAkBI,eAE1CH,EAAKtO,KAAKoO,EAAYC,IAAkBK,YACxCJ,EAAKtO,KAAKoO,EAAYC,IAAkBM,mBACpCX,GACFM,EAAKtO,KAAKoO,EAAYC,IAAkBO,YAEtCV,GACFI,EAAKtO,KAAKoO,EAAYC,IAAkBQ,QAEnCP,M,syCC7WEQ,EAAb,kDACE,WAAY/R,GAAmC,IAAD,sBAC5C,eAEA,IAH4C,EAGtCgS,EAAS,IAAIC,gBAAgBjS,GAHS,cAIhBgS,GAJgB,IAI5C,2BAAoC,CAAC,IAAD,yBAAxBtO,EAAwB,KAAlB1D,EAAkB,KAClC,EAAKkS,OAAOxO,EAAKtG,cAAe4C,IALU,uCADhD,uCASE,SAAW0D,GACT,OAAO,2DAAUA,EAAKtG,iBAV1B,iBAYE,SAAWsG,EAAc1D,GACvBpD,KAAKuV,OAAOzO,EAAKtG,oBACHF,IAAV8C,GACF,2DAAU0D,EAAM1D,KAftB,sBAmBE,WACE,IADgB,EACVhC,EAAS,GADC,cAEEpB,KAAKnG,QAFP,IAEhB,2BAA+B,CAAC,IAArBE,EAAoB,QAC7BqH,EAAOrH,GAAOiG,KAAKwV,IAAIzb,IAHT,8BAKhB,OAAOqH,IAxBX,oBA2BE,SAAcqU,GACZ,IAAMC,EAAI,IAAIP,EAAkBM,GAChC,OAAOzV,KAAKqF,aAAeqQ,EAAErQ,eA7BjC,eAAuCgQ,kBAiChC,SAASM,EAAYP,EAAyBvO,GACnD,IAAIzD,EAAQgS,EAAOI,IAAI3O,GACvB,GAAc,OAAVzD,EAGJ,MAAc,KAAVA,EACK,KAEFwS,EAAoBxS,GAAO,GAG7B,IAAMyS,EAAmB,OASzB,SAASC,EAAqBC,EAAgBhc,GACnD,QAAYuG,IAARvG,EAGJ,OAXK,SAA0BkL,GAC/B,MAAoB,MAAhB,OAACA,QAAD,IAACA,IAAO,KAGLA,EAAK+Q,WAAWH,GAOhBI,CAFQ,IAAIZ,gBAAgBU,GAChBP,IAAIzb,IAIlB,SAAS6b,EAEd3Q,EAAQa,GACR,GAAoB,MAAhB,OAACb,QAAD,IAACA,IAAO,IAAY,OAAOA,EAC/B,IAAMiR,EAAajR,EACbkR,EAAYD,EAAWF,WAAWH,GACxC,OAAI/P,IAAeqQ,EACVN,EAAmBK,GAEvBpQ,GAAcqQ,EACVD,EAAWE,UAAUP,EAAiBxT,QAExC6T,EAQF,SAASG,EAAqBC,GACnC,QAAiBhW,IAAbgW,EAAJ,CAGA,GAAiB,OAAbA,EACF,OAAO,KAET,IAAIC,EAAS3R,SAAS0R,GACtB,IAAI/T,MAAMgU,GAGV,OAAOA,GAEF,SAASC,EAAqBF,GACnC,QAAiBhW,IAAbgW,EAGJ,OAAiB,OAAbA,GAGa,KAAbA,EAFK,KAKFA,EAEF,SAASG,EACdH,EACAI,GAEA,QAAiBpW,IAAbgW,EAGJ,OAAiB,OAAbA,GAGa,KAAbA,EAFK,KAKFI,EAAWhL,MAChB,SAAA3J,GAAC,OAAIA,EAAE4U,uBAAF,OAA0BL,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAU9V,kBAGtC,SAASoW,EAAsBN,GACpC,QAAiBhW,IAAbgW,EAGJ,OAAiB,OAAbA,EACK,KAEgC,SAA3BA,EAAS9V,cAGlB,SAASqW,EACdP,EACAQ,GAEA,QAAiBxW,IAAbgW,EAAJ,CAGA,GAAiB,OAAbA,EACF,OAAO,KAET,IAAM/b,EAAOW,IAAU6b,qBAAqBT,GAC5C,IAAI/T,MAAMhI,EAAKiI,WAGf,OAAO,IAAIqC,IAAWtK,EAAf,OAAqBuc,QAArB,IAAqBA,IAAQ,aAG/B,SAASE,EACdC,GAEA,QAAW3W,IAAP2W,EAGJ,OAAW,OAAPA,EACK,KAEF,CAAExR,GAAIwR,GAER,SAASC,EACd9T,EACA+T,EACA3C,GAEA,GAAc,OAAVpR,EACF,OAAO,KAET,QAAc9C,IAAV8C,EAAJ,CAGA,IAAItC,EAAUsW,YAAkBD,EAAY3C,GACxC6C,EAAWC,YAAYlU,GAC3B,QAAiB9C,IAAb+W,EACF,OAAO,KAET,GAAI9U,MAAM8U,GACR,OAAO,KAET,IAAIE,EAAOzW,EAAQ4K,MAAK,SAAA3J,GAAC,OAAIA,EAAE0D,KAAO4R,KAEtC,cAAOE,QAAP,IAAOA,IAAQ,MAEV,SAASC,EACdpU,EACAoR,GAEA,QAAclU,IAAV8C,EAGJ,OAAc,OAAVA,EACK,KAEF,CACLqC,GAAIrC,EACJ8I,KAAMsI,GAAY,IAAVpR,EAAiB7J,IAAake,IAAMle,IAAame,KAItD,IAAMC,EAAkB,SAC7B5V,EACA6V,GAEA,8CAAO,WAAOL,GAAP,2BAAApW,EAAA,yDAEC8V,GADA7W,EAAImX,GACG9R,QAIUnF,KADjBuX,EALD,OAKkBD,QALlB,IAKkBA,OALlB,EAKkBA,EAAmBlM,MAAK,SAAAoM,GAAM,OAAIA,EAAOrS,KAAOwR,MALlE,yCAOIc,QAAQC,QAAQH,IAPpB,UASCI,EAA2B,CAAExS,GAAIwR,EAAI/K,KAAM,SACpC,OAATqL,GAAoBnX,GAAc,KAATA,EAAEqF,IAV1B,yCAWIsS,QAAQC,QAAQC,IAXpB,iCAcqBlW,EAAEkV,EAAG5R,YAd1B,eAcG6S,EAdH,OAeGC,EAAiBD,EAAK9U,MAAQ8U,EAAK9U,MAAQ8U,EAC3CpR,EACJqR,EAAa9V,OAAS,EACjB8V,EAAa,GACdF,EAnBH,kBAoBInR,GApBJ,2DAsBImR,GAtBJ,0DAAP,uDA0BWG,EAAoB,SAC/BrW,EAKA6V,EACAS,EACAC,GAEA,8CAAO,WAAOf,GAAP,2BAAApW,EAAA,yDAEC8V,GADA7W,EAAImX,GACG9R,QAIUnF,KADjBuX,EALD,OAKkBD,QALlB,IAKkBA,OALlB,EAKkBA,EAAmBlM,MAAK,SAAAoM,GAAM,OAAIA,EAAOrS,KAAOwR,MALlE,yCAOIc,QAAQC,QAAQH,IAPpB,UASCI,EAA2B,CAAExS,GAAIwR,EAAI/K,KAAM,SACpC,OAATqL,GAAoBnX,GAAc,KAATA,EAAEqF,IAV1B,yCAWIsS,QAAQC,QAAQC,IAXpB,iCAcqBlW,EAAEkV,EAAG5R,WAAYgT,EAAWC,GAdjD,eAcGJ,EAdH,OAeGC,EAAiBD,EAAK9U,MAAQ8U,EAAK9U,MAAQ8U,EAC3CpR,EACJqR,EAAa9V,OAAS,EACjB8V,EAAa,GACdF,EAnBH,kBAoBInR,GApBJ,2DAsBImR,GAtBJ,0DAAP,uDA2BWM,EAAyB,SACpCxW,EAMA6V,EACAS,EACAG,GAEA,8CAAO,WACLjB,EACAkB,GAFK,uBAAAtX,EAAA,yDAKCuX,GADAtY,EAAImX,GACI9T,KAAI,SAAAlC,GAAC,OAAIA,EAAEkE,QACnBkT,EAND,OAMmBf,QANnB,IAMmBA,OANnB,EAMmBA,EAAmB5O,QAAO,SAAA8O,GAAM,OACtDY,EAAIxL,SAAS4K,EAAOrS,UAECkT,EAAgBtW,OATlC,yCAUIsW,GAVJ,UAYCV,EAA6B,KACtB,OAATV,GAAoBnX,IAAMA,EAAEiC,QAAWqW,EAAIE,OAAM,SAAArX,GAAC,OAAKA,GAAW,KAANA,MAb3D,yCAcI0W,GAdJ,iCAiB6BlW,EAC9B2W,EAAIlT,KAAKgT,GAAa,KACtBH,EACAG,GAAa,IACbC,GArBC,eAiBGP,EAjBH,yBAuBIA,EAAK7V,OAAS,EAAI6V,EAAOD,GAvB7B,2DAyBIA,GAzBJ,0DAAP,yDA8BWY,EAAuB,SAClC9W,EACA6V,GAEA,8CAAO,WAAOL,GAAP,uBAAApW,EAAA,yDAECuX,GADAtY,EAAImX,GACI9T,KAAI,SAAAlC,GAAC,OAAIA,EAAEkE,QACnBkT,EAHD,OAGmBf,QAHnB,IAGmBA,OAHnB,EAGmBA,EAAmB5O,QAAO,SAAA8O,GAAM,OACtDY,EAAIxL,SAAS4K,EAAOrS,UAECkT,EAAgBtW,OANlC,yCAOI0V,QAAQC,QAAQW,IAPpB,UASCV,EAA6B,KAExB,OAATV,GACGnX,IAAMA,EAAEiC,QACXqW,EAAIE,OAAM,SAAArX,GAAC,YAAUjB,IAANiB,GAAyB,OAANA,GAAoB,KAANA,MAb7C,yCAeIwW,QAAQC,QAAQC,IAfpB,iCAkBgBlW,EAAE2W,EAAIlT,KAAK,MAlB3B,eAkBG0S,EAlBH,yBAmBIA,EAAK7V,OAAS,EAAI6V,EAAOD,GAnB7B,2DAqBIA,GArBJ,0DAAP,uDAwEK,IAAMa,EAA+B,SAAC5Y,GAC3C,QAAUI,IAANJ,EAAJ,CAGA,IAAM6Y,EAAO,OAAG7Y,QAAH,IAAGA,OAAH,EAAGA,EAAGM,cACbwY,EAAsCC,IAAiBvN,MAC3D,SAAA3J,GAAC,OAAIA,EAAEvB,gBAAkBuY,KAE3B,QAAmBzY,IAAf0Y,EACF,OAAOA,EAGT,IAAME,EAAM7C,EAAqBnW,GACjC,OAAY,OAARgZ,QAAwB5Y,IAAR4Y,GAGhB3W,MAAM2W,GAFD,KAMLA,GAAO,GAAKA,EAAMD,IAAiB5W,OACf4W,IAAiBC,GAIlCF,IAGF,SAASG,EACdC,EACAC,EACAC,EACAlE,GAEA,IAAImE,EAAaT,EACfnD,EAAYP,EAAQgE,IAGhBhT,EAAQyQ,EACZlB,EAAYP,EAAQiE,GACpB,YAEI9S,EAAMsQ,EACVlB,EAAYP,EAAQkE,GACpB,YAYF,OANIE,YAAkBD,KACfC,YAAkBpT,IAAWoT,YAAkBjT,KAClDgT,EAAa,oBAIEjZ,IAAfiZ,GAA2C,OAAfA,EACvBA,EAGU,eAAfA,EACKE,IAAiBC,OAAOtT,EAAOG,GAE/BkT,IAAiBE,SAASJ,EAAY,KAAM,MAIhD,IAAMK,EAAgC,SAC3CR,EACAC,EACAC,GAH2C,OAIxC,SAAClW,GACJ,IAAIhC,EAAS,IAAIiU,gBAEjB,GAAc,OAAVjS,EAEF,OADAhC,EAAOkU,OAAO8D,EAAqB,IAC5BhY,EAET,GAAc,OAAVgC,QAA4B9C,IAAV8C,EAAqB,CAAC,IAAD,IACnC0T,EAAI,UAAI1T,EAA2B0T,YAA/B,aAAG,EAAkCrR,GACzCwR,EAAE,UAAI7T,EAA2B0T,YAA/B,aAAG,EAAkCrR,GAE7C,QAAWnF,IAAP2W,IACF7V,EAAOkU,OAAO8D,EAAqBnC,EAAG5R,YACzB,eAATyR,GAAuB,CACzB,IAC2C,EADvC1Q,EAAShD,EAA2BgD,MACxC,GAAc,OAAVA,QAA4B9F,IAAV8F,EACpBhF,EAAOkU,OACL+D,EACAne,IAAU2e,sBAAsBzT,EAAO,CACrCtD,eAAc,iBACXsD,QADW,IACXA,OADW,EACXA,EAAsBtD,sBADX,QAC6B,cAIjD,IACuC,EADnCyD,EAAOnD,EAA2BmD,IACtC,GAAY,OAARA,QAAwBjG,IAARiG,EAClBnF,EAAOkU,OACLgE,EACApe,IAAU2e,sBAAsBtT,EAAK,CACnCzD,eAAc,iBACXsD,QADW,IACXA,OADW,EACXA,EAAsBtD,sBADX,QAC6B,eAOvD,OAAO1B,IAGI0Y,EAA+B,SAC1CjT,EACAuO,GAEA,IAAMhP,EAAQiQ,EAAqBV,EAAYP,EAAD,UAAYvO,EAAZ,UACxCN,EAAM8P,EAAqBV,EAAYP,EAAD,UAAYvO,EAAZ,UAC5C,YAAcvG,IAAV8F,QAA+B9F,IAARiG,OACzB,EACmB,OAAVH,GAA0B,OAARG,EACpB,KAEA,CACLH,MAAK,OAAEA,QAAF,IAAEA,IAAS,KAChBG,IAAG,OAAEA,QAAF,IAAEA,IAAO,OAILwT,EAA6B,SAAAlT,GAAS,OAAI,SACrDzD,GAEA,IAAIhC,EAAS,IAAIiU,gBACX2E,EAAc,UAAMnT,EAAN,QACdoT,EAAY,UAAMpT,EAAN,QAClB,GAAc,OAAVzD,EAGF,OAFAhC,EAAOkU,OAAO0E,EAAgB,IAC9B5Y,EAAOkU,OAAO2E,EAAc,IACrB7Y,EAET,GAAc,OAAVgC,QAA4B9C,IAAV8C,EAAqB,CAAC,IAAD,IACnCgD,EAAK,OAAIhD,QAAJ,IAAIA,OAAJ,EAAIA,EAAyBgD,MAClCG,EAAG,OAAInD,QAAJ,IAAIA,OAAJ,EAAIA,EAAyBmD,IAEtCnF,EAAOkU,OAAO0E,EAAd,iBAA8B5T,QAA9B,IAA8BA,OAA9B,EAA8BA,EAAOf,kBAArC,QAAmD,IACnDjE,EAAOkU,OAAO2E,EAAd,iBAA4B1T,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAKlB,kBAAjC,QAA+C,IAEjD,OAAOjE,IAEI8Y,EAEW,SAACrT,GAAD,OAAuB,SAC7CzD,GACI,IAAD,IACChC,EAAS,IAAIiU,gBAgBjB,OAfc,OAAVjS,GACFhC,EAAOoD,IAAIqC,EAAW,SAGZvG,IAAV8C,GACU,OAAVA,GACCb,MAAK,OAAEa,QAAF,IAAEA,GAAF,WAAE,EAAAA,GAAgBZ,eAAlB,aAAC,YAEPpB,EAAOoD,IACLqC,EACA3L,IAAU2e,sBAAsBzW,EAAe,CAC7CN,eAAgB,UAIf1B,IAET,SAAS+Y,EAAe/W,GACtB,IAAK,IAAD,IACF,OAAc,OAAVA,EACK,KAEe,kBAAVA,EACVA,EACiB,kBAAVA,EAAP,OACAA,QADA,IACAA,OADA,EACAA,EAAOiC,WACPjC,aAAiByB,IACjB3J,IAAU2e,sBAAsBzW,EAAO,CACrCN,eAAc,UAAGM,EAAqBN,sBAAxB,QAA0C,SAE1DM,aAAiBJ,KACjB9H,IAAU2e,sBAAsBzW,GADhC,OAECA,QAFD,IAECA,GAFD,UAECA,EAA0BqC,UAF3B,aAEA,EAA+BJ,WACnC,SACA,QAIG,IAAM+U,EAEW,SAAAvT,GAAS,OAAI,SAAAzD,GACnC,IAAIhC,EAAS,IAAIiU,gBAIjB,GAHc,OAAVjS,GACFhC,EAAOoD,IAAIqC,EAAW,SAEVvG,IAAV8C,EAAqB,CACvB,IAAI6F,EAAckR,EAAe/W,GACb,OAAhB6F,QAAwC3I,IAAhB2I,GAC1B7H,EAAOoD,IAAIqC,EAAWoC,GAG1B,OAAO7H,IAGIiZ,EAEW,SAAAxT,GAAS,OAAI,SAAAzD,GACnC,IAAIhC,EAAS,IAAIiU,gBACjB,GAAI9R,MAAMgC,QAAQnC,IAAmB,MAATA,EAAe,CAAC,IAAD,EACrCkX,EAAY,OAAGlX,QAAH,IAAGA,OAAH,EAAGA,EACfK,KAAI,SAAAlC,GAAC,OAAI4Y,EAAe5Y,MACzByH,QAAO,SAAAzH,GAAC,YAAUjB,IAANiB,KACfH,EAAOoD,IAAIqC,EAAX,iBAAsByT,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAc9U,KAAK,YAAzC,QAAiD,IAEnD,OAAOpE,IAGImZ,EAEW,SAAA1T,GAAS,OAAI,SAAAzD,GACnC,IAAIhC,EAAS,IAAIiU,gBACjB,GAAI9R,MAAMgC,QAAQnC,IAAmB,MAATA,EAAe,CAAC,IAAD,EACrCkX,EAAY,OAAGlX,QAAH,IAAGA,OAAH,EAAGA,EACfK,KAAI,SAAAlC,GAAC,oBAAKA,QAAL,IAAKA,GAAL,UAAKA,EAAsB2K,YAA3B,aAAI,EAA6B7G,cACvC2D,QAAO,SAAAzH,GAAC,YAAUjB,IAANiB,KACfH,EAAOoD,IAAIqC,EAAX,iBAAsByT,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAc9U,KAAK,YAAzC,QAAiD,IAEnD,OAAOpE,IAEIoZ,EAAuB,SAClCpF,EACAvO,GAEA,IAAIkP,EAASJ,EAAYP,EAAQvO,GACjC,QAAevG,IAAXyV,EAAJ,CACA,GAAe,OAAXA,EAAiB,OAAO,KAC5B,IAAI0E,EAAYC,GAAiB3E,GAAQtS,KAAI,SAAAlC,GAAC,OAAIiV,EAAqBjV,MAEvE,IADAkZ,EAAYA,EAAUzR,QAAO,SAAAzH,GAAC,YAAUjB,IAANiB,MACnBc,OAAf,CACA,IAAIsY,EAAcF,EAAUhX,KAAI,SAAAlC,GAAC,OAAIyV,EAAiBzV,MAEtD,IADAoZ,EAAcA,EAAY3R,QAAO,SAAAzH,GAAC,YAAUjB,IAANiB,MACrBc,OACjB,OAAOsY,KAGIC,EAAuB,SAClCxF,EACAvO,GAEA,IAAIkP,EAASJ,EAAYP,EAAQvO,GACjC,OAAOgU,EAA+B9E,IAE3B8E,EAAiC,SAC5C9E,GAEA,QAAezV,IAAXyV,EAAJ,CACA,GAAe,OAAXA,EAAiB,OAAO,KAC5B,IAAI0E,EAAYC,GAAiB3E,GAAQtS,KAAI,SAAAlC,GAAC,OAAI8U,EAAqB9U,MAEvE,IADAkZ,EAAYA,EAAUzR,QAAO,SAAAzH,GAAC,YAAUjB,IAANiB,MACnBc,OAAf,CACA,IAAIsY,EAAcF,EAAUhX,KAAI,SAAAlC,GAAC,OAAIyV,EAAiBzV,MAEtD,IADAoZ,EAAcA,EAAY3R,QAAO,SAAAzH,GAAC,YAAUjB,IAANiB,MACrBc,OACjB,OAAOsY,KAGIG,GAAgE,SAC3EC,GAD2E,OAExE,SAAA3X,GACH,IAC6B,IADvBwD,EAAM,IAAIyO,gBACZ2F,YAAiB5X,KACnBwD,EAAIpC,IAAIuW,EAAY,MAApB,UAA2BZ,EAAe/W,EAAMA,cAAhD,QAA0D,IAC1DwD,EAAIpC,IAAIuW,EAAY,OAApB,UAA4BZ,EAAe/W,EAAM6X,iBAAjD,QAA8D,KAEhE,OAAOrU,IAGIsU,GAAgB,SAC3B9F,EACAvO,GAEA,IAAM5B,EAAM0Q,EAAYP,EAAQvO,EAAY,OACtCiQ,EAAOnB,EAAYP,EAAQvO,EAAY,QAC7C,GACqB,OAAnBsU,YAAUlW,KACV1C,MAAM6Y,WAAU,OAACnW,QAAD,IAACA,IAAO,MACJ,OAApBkW,YAAUrE,KACVvU,MAAMqC,SAAQ,OAACkS,QAAD,IAACA,IAAQ,KAIzB,MAAO,CACLmE,SAAU,CAAExV,GAAIb,SAAQ,OAACkS,QAAD,IAACA,IAAQ,KACjC1T,MAAOgY,WAAU,OAACnW,QAAD,IAACA,IAAO,MAGhBoW,GAAsB,SAACtF,GAClC,OAAO2E,GAAiB3E,GACrBtS,KAAI,SAAAlC,GACH,IAAIgV,EAAS3R,SAASrD,GACtB,OAAIgB,MAAMgU,GACD,EAEFA,KAERvN,QAAO,SAAAjH,GAAC,OAAIA,EAAI,MAER2Y,GAAmB,SAAC3E,EAAgByC,GAC/C,IAAIpY,EAAI2V,EAAOuF,QAAP,OAAe9C,QAAf,IAAeA,IAAa,MAAQ,EAApC,OAAwCA,QAAxC,IAAwCA,IAAa,IAAM,IAEnE,OADgBzC,EAAO5V,MAAMC,IAGlBmb,GAAY,SAAChX,EAAoBiU,GAC5C,OAAOjU,EAAOiB,KAAP,OAAYgT,QAAZ,IAAYA,IAAa,O,mICrsBrBgD,EAAOC,cAAiB,WAEnCC,GACC,IAFCC,EAEF,EAFEA,KAAMC,EAER,EAFQA,MAAOC,EAEf,EAFeA,YAAaC,EAE5B,EAF4BA,KAASC,EAErC,qDACMC,EAAWL,EAEXM,EAAQC,cACRC,EAAWP,GAASQ,YAASH,EAAOL,EAAOC,GAE3CQ,EAAY,SAAC,GAAD,IAAGC,EAAH,EAAGA,SAAH,OAChBR,EACE,cAAC,IAAD,CAASS,MAAOT,EAAhB,SACE,+BAAOQ,MAGT,mCAAGA,KAEP,OACE,cAACD,EAAD,UACE,cAAC,IAAD,aACEV,KAAMK,EACNJ,MAAOO,GACHJ,U,qJCpCZS,IAAMC,SAASC,QAAUC,GACzBH,IAAMC,SAASG,QAAU,IAQzB,IAAMC,EAAa,SAACC,GAAD,OAAoBA,GAAU,KAAOA,EAAS,KAwNpDC,EAAa,I,iDArJjBC,YAAcR,IAAMS,Y,8EAC3B,WACEC,EACA9H,EACA4H,GAHF,gGAM2BR,IAAMhH,IAAO0H,EAAK,CACvC9H,OAAQA,EACR4H,YAAaA,IARnB,UAMUG,EANV,QAUQN,EAAWM,EAASL,QAV5B,yCAWaK,EAASjF,MAXtB,aAaYiF,EAbZ,8H,mHAmBA,WACED,EACAhF,EACAkF,GAHF,uFAKyBZ,IAAMa,IAAIH,EAAKhF,EAAMkF,GAL9C,UAKQD,EALR,QAMMN,EAAWM,EAASL,QAN1B,yCAOWK,EAASjF,MAPpB,aASUiF,EATV,2C,oHAYA,WACED,EACAhF,EACAkF,GAHF,gGAM2BZ,IAAMc,KAAQJ,EAAKhF,EAAMkF,GANpD,UAMUD,EANV,QAOQN,EAAWM,EAASL,QAP5B,yCAQaK,EAASjF,MARtB,aAUYiF,EAVZ,8H,qHAgBA,WACED,EACAhF,EACAkF,GAHF,uFAKyBZ,IAAMe,MAASL,EAAKhF,EAAMkF,GALnD,UAKQD,EALR,QAMMN,EAAWM,EAASL,QAN1B,yCAOWK,EAASjF,MAPpB,aASUiF,EATV,2C,sHAYA,WACED,EACAE,GAFF,uFAIyBZ,IAAMjH,OAAO2H,GAJtC,UAIQC,EAJR,QAKMN,EAAWM,EAASL,QAL1B,yCAMWK,EAASjF,MANpB,aAQUiF,EARV,2C,0HAWA,WACED,EACAE,GAFF,uFAIyBZ,IAAMjH,OAAO2H,GAJtC,UAIQC,EAJR,QAKMN,EAAWM,EAASL,QAL1B,yCAMWK,EAASjF,MANpB,aAQUiF,EARV,2C,mHAWA,WAAmBzH,GAAnB,+EACyB,KACjB8H,EAAU,CACdC,SAAU/H,EAEPjS,KAAI,SAACia,EAAG/R,GAAW,IAAD,EACXgS,EAAuBC,YAC3BF,EAAEG,eAAyBvd,IAAbod,EAAE3H,OAAuB,GAAzB,WAAkC2H,EAAE3H,UAEpD,MAAO,CACL+H,OAAQJ,EAAEI,OACVC,eAVe,KAWfb,IAAK,IAAIc,IAAIL,EAAsB,IAAIK,IAAIC,OAAOC,SAASC,SAE3DC,QAAS,CACP,eACE,iEACF,gBAAiB,OAEnBnH,GAAE,UAAEyG,EAAEzG,UAAJ,QAAUoH,mBAAS,GAAD,OAlBL,KAkBK,MACpBC,KAAMZ,EAAEY,UApBlB,SAwBwD9B,IAAMc,KAC1D,uBACAE,GA1BJ,YAwBQL,EAxBR,QA8BajF,KAAKqG,UAAU3F,OAAM,SAAAuE,GAAQ,OAAIN,EAAWM,EAASL,WA9BlE,yCAgCWK,EAASjF,MAhCpB,aAkCUiF,EAlCV,4C,uHAqCA,WAAyBqB,GAAzB,0FACSxe,KAAKye,MACVD,EAAK/a,KAAI,SAAA1B,GAAC,MAAK,CACb8b,SAAU9b,EACV+b,OAAQ,eAJd,gD,sHAeA,WAAwBZ,EAAKwB,EAAMtB,GAAnC,gFACQuB,EAAW,IAAIC,UACZtJ,OAAO,OAAQoJ,GAF1B,SAGyBlC,IAAMc,KAAKJ,EAAKyB,EAAhB,aACrBE,aAAc,OACdjC,aAAStc,EACT8d,QAAS,CACP,eAAgB,sBAChBU,OAAQ,qBAEP1B,IAVP,cAGQD,EAHR,yBAYSA,GAZT,2C,+YCxMW4B,EAAmB,SAAChD,GAAkC,IACzDO,EAAsBP,EAAtBO,SAAU0C,EAAYjD,EAAZiD,QACZ3L,EAAW4L,cACXC,EAAoBC,sBAAYC,KAChCC,EAAgBF,sBAAYG,KAC5BC,EACJlM,GAAagM,IAAkBH,GAAsBF,EACjD/C,EAAQC,cACd,OACE,cAAC,IAAD,CACEsD,UAAWC,kBAAK,eAAgB,CAAEC,UAAWH,IAC7CtD,MAAOA,EAFT,SAIGK,K,yCCTMqD,EAAa,SAAC5D,GAA4B,IAEnD9E,EAQE8E,EARF9E,GACA2I,EAOE7D,EAPF6D,SACAC,EAME9D,EANF8D,YACAvD,EAKEP,EALFO,SACAwD,EAIE/D,EAJF+D,aACAd,EAGEjD,EAHFiD,QAEGvJ,GACDsG,EAFFgE,UARkD,YAUhDhE,EAVgD,kFAWpD,OACE,cAAC,IAAD,CAAM6D,SAAUA,EAAU3I,GAAIA,EAA9B,SACE,cAAC+I,EAAA,EAAD,yBACEH,YAAaA,EACbC,aAAcA,EACdd,QAASA,GACLvJ,GAJN,aAMG6G,S,gOC/BI2D,EAyBa,WAAO,IAAD,EAEtB7K,EAGF,CACF8K,QAAS,iBAGPC,EAAgCC,YAAezO,KAAiBlO,KAClE,SAAAlC,GACE,MAAO,CAAEkE,GAAIlE,MAIbyH,EAAM,UACR,IAAIjD,IACF,OACAZ,IAAe6C,SACfmY,GACA9a,kBALM,QAKQ,GAElB,OADA+P,EAAOiL,QAAUrX,EACV+T,IAAWvH,IArBN,+BAqBeJ,IA/ClB6K,EAuEa,WAEtB,OAAOlD,IAAWvH,IADN,yC,sJCrEC8K,GAAV,SAAUA,IAAV,6EACyB,OADzB,SAC+BC,YAAO3T,KADtC,OAEwC,OADvCrB,EADD,gBAE8CgV,YACjDtN,KAHG,OAECtC,EAFD,OAOC6P,EAAqD,CAEzD,CAAEtgB,EAAGugB,IAAUC,gBAEf,CAAExgB,EAAGugB,IAAUE,oBAEf,CAAEzgB,EAAGugB,IAAUG,aAAcC,EAAG1M,IAAa2M,aAE7C,CACE5gB,EAAGugB,IAAUM,yBACbF,EAAG1M,IAAa2M,aAGlB,CAAE5gB,EAAGugB,IAAUO,gBAAiBH,EAAG1M,IAAa6M,iBAEhD,CAAE9gB,EAAGugB,IAAUQ,UAEf,CAAE/gB,EAAGugB,IAAUS,OAAQL,EAAG1M,IAAagN,oBAEnCC,EAAuD,CAE3D,CAAElhB,EAAGugB,IAAUY,gBAEkB1Q,EAAkB6P,EAAUY,GAC5DpY,QAAO,SAAAuO,GAAI,YAAejX,IAAXiX,EAAKsJ,GAAmBtV,EAASwB,QAAQG,SAASqK,EAAKsJ,MACtEpd,KAAI,SAAA8T,GAAI,OAAIA,EAAKrX,KAGZuD,KAAI,SAAA6d,GAAQ,OAClBC,YACED,EACAE,IAAkBC,mBAClB9Q,MAvCC,wC,eC6CU+Q,I,WAmBPC,I,WAqBAC,I,WAGAC,I,WAqBAC,I,WAUAC,I,WAUAC,I,WAUAC,I,WAaAC,I,WAYAC,I,WAWAC,I,WA0BAC,I,WAoBAC,I,WAUAC,I,WAkCAC,I,WAgBAC,I,WA2CAC,I,WAgBAC,I,WAgBAC,I,YAUAC,I,YAwIAC,I,YAQAC,I,YAuBAC,I,YAMAC,I,YAKAC,I,YAGAC,I,YAIOC,IA1fV,SAAU1B,GAAe2B,GAAzB,2EAKiB,MAJH,sBACD,+CACZnG,EAAMmG,EAAO7F,QAFA,sBACD,+CAFb,kBAKuB8F,YAAKvG,IAAWvH,IAAK0H,GAL5C,OAMH,OADMxQ,EALH,gBAMG2Q,YAAIkG,GAAQC,kBAAkB9W,IANjC,OAOH,OAPG,UAOG2Q,YAAIkG,GAAQE,eAAe/W,EAAYU,cAAcC,SAPxD,WAQEgW,EAAO7F,QART,iBASD,OATC,UASKH,YAAIkG,GAAQG,2BAA2BhX,EAAYiX,iBATxD,gCAYH,OAZG,oCAYGtG,YACJkG,GAAQK,UAAU,CAChBC,QAAS,gDAAW,KAAqB1G,gBAAhC,aAAW,EAA+BL,WAdpD,sDAmBP,SAAU6E,GAAqB0B,GAA/B,6EAGqB,MAFA,wCADrB,kBAG2BC,YAAKvG,IAAWvH,IAFtB,yCADrB,OAMI,OAHM2H,EAHV,QAIU2G,EAAO3G,GACR4G,UAAYC,IAAWC,SALhC,SAMU5G,YAAIkG,GAAQW,6BAA6BJ,IANnD,YAOQA,EAAKK,MAAM7I,QAAQ6I,IAAMC,sCAAwC,GAPzE,iBAQM,OARN,UAQY/G,YAAIgH,IAAuBjZ,QAAQ0Y,IAR/C,6DAWI9iB,QAAQC,MAAR,MAEe,OADT6b,EAZV,sCAYmB,KAAqBK,gBAZxC,aAYmB,EAA+BL,SACvBA,IAAUuG,EAAO7F,QAb5C,iBAcM,OAdN,UAcYH,YAAIkG,GAAQe,oBAAmB,IAd3C,gCAgBMrG,OAAOC,SAASqG,QAAQ3G,YAAY,WAhB1C,QAkBI,OAlBJ,UAkBUP,YAAIkG,GAAQiB,2BAA2B,kBAlBjD,sDAqBA,SAAU5C,GAAqByB,GAA/B,iEACE,OADF,SACQhG,YAAIkG,GAAQkB,uBAAuBpB,EAAO7F,UADlD,uCAGA,SAAUqE,GAAYwB,GAAtB,kFACyB,OAAnBA,EAAO7F,QADb,iDAQyC,OARzC,SAKU/c,EAAiB4iB,EAAO7F,QALlC,SAMuB/c,QANvB,IAMuBA,OANvB,EAMuBA,EAAQN,MAAM,KANrC,mBAMWukB,EANX,cAQ+CnE,YACzC/S,KATN,OAYI,OAJM7M,EARV,iBAYU4H,YAAI,CACR+a,aAAK,SAAAqB,GAAC,OAAIC,IAAQnB,eAAekB,KAAID,GACrCpB,aAAK,SAAAqB,GAAC,OAAIzpB,IAAU2pB,UAAUF,EAAGhkB,KAAuBF,KAd9D,QAgBI,OAhBJ,UAgBU4c,YAAIkG,GAAQuB,gBAAgBF,IAAQF,WAhB9C,0DAkBI1jB,QAAQC,MAAM,cAAd,MAlBJ,sDAqBA,SAAU6gB,KAAV,uEAGoB,MAFC,0BADrB,kBAG0BwB,YAAKvG,IAAWvH,IAFrB,2BADrB,OAII,OADMuP,EAHV,gBAIU1H,YAAIkG,GAAQyB,4BAA4BD,IAJlD,8BAOI,OAPJ,yBAMI/jB,QAAQikB,MAAR,MANJ,UAOU5H,YAAIkG,GAAQ2B,0BAA0B,0BAPhD,qDAUA,SAAUnD,GAAWsB,GAArB,sEAE8B,kBAAnBA,EAAO7F,SACd6F,EAAO7F,QAAQlC,QAAQ,SAAW,GAHtC,gBAKI2C,OAAOC,SAASiH,KAAOvH,YAAYyF,EAAO7F,SAL9C,sBAOI,OAPJ,SAOUH,YAAIhX,YAAKgd,EAAO7F,UAP1B,uCAUA,SAAUwE,KAAV,uEAGkB,MAFG,sBADrB,kBAGwBsB,YAAKvG,IAAWvH,IAFnB,uBADrB,OAII,OADM4P,EAHV,gBAIU/H,YAAIkG,GAAQ8B,wBAAwBD,IAJ9C,8BAOI,OAPJ,yBAMIpkB,QAAQikB,MAAR,MANJ,UAOU5H,YAAIkG,GAAQ+B,sBAAsB,+BAP5C,qDAUA,SAAUrD,KAAV,uEACE,OADF,SACQsD,YAAM,KADd,OAIqB,MAFA,sBAFrB,kBAI2BjC,YAAKvG,IAAWvH,IAFtB,uBAFrB,OAKI,OADMjK,EAJV,gBAKU8R,YAAIkG,GAAQiC,wBAAwBja,IAL9C,+BAQI,OARJ,0BAOIvK,QAAQikB,MAAR,MAPJ,UAQU5H,YACJkG,GAAQkC,sBAAsB,wCATpC,sDAaA,SAAUvD,KAAV,uEACE,OADF,SACQqD,YAAM,KADd,OAGqB,OAHrB,kBAG2BjC,YAAKrD,GAHhC,OAII,OADM1U,EAHV,gBAIU8R,YAAIkG,GAAQG,2BAA2BnY,IAJjD,+BAOI,OAPJ,0BAMIvK,QAAQikB,MAAR,MANJ,UAOU5H,YACJkG,GAAQmC,yBAAyB,wCARvC,sDAYA,SAAUvD,KAAV,uEAEqB,OAFrB,kBAE2BmB,YAAKrD,GAFhC,OAGI,OADM1U,EAFV,gBAGU8R,YAAIkG,GAAQoC,gCAAgCpa,IAHtD,8BAMI,OANJ,yBAKIvK,QAAQikB,MAAR,MALJ,UAMU5H,YACJkG,GAAQqC,8BAA8B,iCAP5C,qDAWA,SAAUxD,GACRiB,GADF,mFAOMA,EAAO7F,QAAQqI,UAPrB,gBAQI,OARJ,SAQUN,YAAM,KARhB,OAU4B,OAV5B,SAUkChF,YAAO7N,KAVzC,OAiBiB,OAPTjH,EAVR,OAWM8L,EAAO9L,EAAKqa,yBACdzC,EAAO7F,QAAQzjB,KAEXyjB,EAAU5jB,OAAOmsB,OAAO,GAAIxO,EAAM8L,EAAO7F,QAAQwI,OACjDC,EAfR,yCAeuD5C,EAAO7F,QAAQzjB,KAftE,mBAiBuBupB,YAAKvG,IAAWM,IAAK4I,EAAYzI,GAjBxD,QAkBI,OADMtF,EAjBV,iBAkBUmF,YAAIkG,GAAQ2C,0BAA0BhO,IAlBhD,gCAqBI,OArBJ,0BAoBIlX,QAAQikB,MAAR,MApBJ,UAqBU5H,YACJkG,GAAQ4C,wBAAwB,wCAtBtC,sDA0BA,SAAU9D,GAAsBgB,GAAhC,6EAC4B,OAD5B,SACkC9C,YAAO7N,KADzC,OAQiB,OAPTjH,EADR,OAEM8L,EAAO9L,EAAKqa,yBACd,mBAEItI,EAAU5jB,OAAOmsB,OAAO,GAAIxO,EAAM,CAAExL,QAASsX,EAAO7F,UAL5D,mEAQuB8F,YAAKvG,IAAWM,IARvC,iDAQwDG,GARxD,OASI,OADMtF,EARV,iBASUmF,YAAIkG,GAAQ6C,4BAA4BlO,IATlD,gCAYI,OAZJ,0BAWIlX,QAAQikB,MAAR,MAXJ,UAYU5H,YACJkG,GAAQ8C,0BAA0B,wCAbxC,sDAoBA,SAAU/D,KAAV,yEAIiB,OAJjB,SAEgB,2DACNlN,EAAS,CAAE8K,QAAS,8BAH9B,SAIuBoD,YAAKvG,IAAWvH,IAFvB,2DAEiCJ,GAJjD,OAKI,OADM8C,EAJV,gBAKUmF,YAAIkG,GAAQ+C,qCAAqCpO,EAAK9U,QALhE,+GAUA,SAAUmf,GACRc,GADF,uEAMI,OANJ,SAIgB,2DACNnL,EAAO,CAAEqO,UAAWlD,EAAO7F,QAAQ/Z,KAAI,SAAA1B,GAAC,OAAIA,EAAE0D,OALxD,SAMU6d,YAAKvG,IAAWO,KAFV,2DAEqBpF,GANrC,OAOI,OAPJ,SAOUmF,YAAIkG,GAAQ+C,qCAAqCjD,EAAO7F,UAPlE,YASQ6F,EAAO7F,QAAQnb,QAAU,GATjC,iBAUM,OAVN,UAUYgb,YACJkG,GAAQiD,gBAAgB,CACtBzsB,IAAK,mBACL0sB,QAAS,UACT5C,QAAQ,GAAD,OAAKe,IAAQpQ,EAAEjb,IAAamtB,YAA5B,YAA2CrD,EAAO7F,QACtD/Z,KAAI,SAAA1B,GAAC,OAAIA,EAAEmK,QACX1G,KAAK,UAhBlB,gCAoBM,OApBN,UAoBY6X,YACJkG,GAAQiD,gBAAgB,CACtBzsB,IAAK,mBACL0sB,QAAS,UACT5C,QAAQ,GAAD,OAAKe,IAAQpQ,EAAEjb,IAAamtB,YAA5B,YACLrD,EAAO7F,QAAQ,GAAGtR,KADb,kBAEGmX,EAAO7F,QAAQnb,OAAS,EAF3B,YAxBjB,gHAkCA,SAAUmgB,GAAyBa,GAAnC,uEASI,OATJ,sCAIUsD,EAA2C,CAC/C7a,MAAOuX,EAAO7F,QAAQ1R,MACtBC,QAASsX,EAAO7F,QAAQzR,SAN9B,SASUuX,YAAKvG,IAAWM,IAT1B,6BASoCsJ,EAAY,CAC1CvR,OAAQ,CAAErb,IAAKspB,EAAO7F,QAAQ5R,OAVpC,uDAaI5K,QAAQC,MAAR,MAbJ,qDAgBA,SAAUwhB,GACRY,GADF,qFASUtN,EAASsN,EAAO7F,QAAQzH,OACR,IAAIZ,IAAkBY,GAAQ6Q,OAClD,IAAIzR,IAAkBkO,EAAO7F,QAAQU,SAASnI,SAXpD,mBAeQsN,EAAO7F,QAAQU,SAASnI,SAAWA,IACC,KAAnCsN,EAAO7F,QAAQU,SAASnI,QAA4B,KAAXA,GAhBlD,gBAkBQ,OAlBR,SAkBcsH,YACJkG,GAAQsD,SAAS,CACf9Q,OAAQA,KApBpB,OA0BiD,OA1BjD,SA0BuDwK,YACjD5Q,KA3BN,OA6BI,OAHMD,EA1BV,OA6BI,gBAAO8S,GAAyB,CAC9B1L,KAAMuM,EAAOvM,KACb0G,QAAS,CACP5R,IAAKyX,EAAO7F,QAAQzjB,IACpB+R,MAAOiK,EAAO1Q,WACd4G,SAAUyD,EAAkBjK,GAC5BsG,SAAS,KANb,SA7BJ,0DAuCI/K,QAAQC,MAAR,MAvCJ,sDA2CA,SAAUyhB,GACRW,GADF,uEASI,OATJ,sCAKUsD,EAA2C,CAC/C7a,MAAOuX,EAAO7F,QAAQpa,MAAMiC,YANlC,SASUie,YAAKvG,IAAWM,IAT1B,6BASoCsJ,EAAY,CAC1CvR,OAAQ,CAAErb,IAAKspB,EAAO7F,QAAQzjB,OAVpC,uDAaIiH,QAAQC,MAAR,MAbJ,qDAgBA,SAAU0hB,GACRU,GADF,uEASI,OATJ,sCAKUsD,EAA2C,CAC/C7a,MAAOuX,EAAO7F,QAAQpa,MAAMiC,YANlC,SASUie,YAAKvG,IAAWM,IAT1B,6BASoCsJ,EAAY,CAC1CvR,OAAQ,CAAErb,IAAKspB,EAAO7F,QAAQzjB,OAVpC,uDAaIiH,QAAQC,MAAR,MAbJ,qDAgBA,SAAU2hB,GACRS,GADF,iEAGE,OAHF,SAGQhG,YAAIkG,GAAQuD,aAAazD,EAAO7F,UAHxC,uCAUA,SAAUqF,GAAcQ,GAAxB,uFAEqD,OAD7C0D,EAAqB,EAD7B,SAE2DxG,aAAO,SAAA9T,GAAK,OACnE+E,YAAoB/E,EAAOkF,IAAgBqV,qBAH/C,UAEQC,EAFR,OAKQD,EALR,UAMI1P,YAAY2P,UANhB,QAM2CF,IAErC1D,EAAO7F,QAAQtF,KAAK7V,OAAS2kB,GARnC,iDAW8C,OAX9C,SAWoDzG,YAChDzM,KAZJ,eAcsBxT,KAHd4mB,EAXR,SAcmCA,IAAgBC,IAAW7e,IAd9D,mDAiBmC,OAjBnC,UAiByCiY,YAAO3T,KAjBhD,QAkBE,OADMF,EAjBR,iBAkBQ2Q,YACJkG,GAAQiD,gBAAgB,CACtBC,QAAS,OACT5C,QACEe,IAAQpQ,EAAEjb,IAAa6tB,sBACvB,IACA/D,EAAO7F,QAAQtF,QAxBvB,0BA8CuB5X,KADb+mB,EAAaC,YAAajE,EAAO7F,QAAQtF,KAAMxL,IA7CzD,iBA+CM,OA/CN,UA+CY2Q,YACJkG,GAAQiD,gBAAgB,CACtBC,QAAS,QACT5C,QAASe,IAAQpQ,EAAEjb,IAAaguB,sBAlD1C,+CAuDcF,EAAWvQ,KAvDzB,cAwDa0Q,IAAmBC,MAxDhC,UA4DaD,IAAmBE,SA5DhC,UAwEaF,IAAmBG,SAxEhC,oBAyDU,OAzDV,UAyDgBtK,YAAIhX,YAAK,KAzDzB,QA0DU,OA1DV,UA0DgBgX,YAAIkH,YAAQ,qBAAD,OAAsB8C,EAAWO,gBA1D5D,0CA6DuB,OA7DvB,UA6D6BtE,YACjBuE,GADqB,UAErBR,EAAWO,oBAFU,QAEMvE,EAAO7F,QAAQtF,MA/DtD,gBAiEyB5X,KAJXwnB,EA7Dd,gCAkEY7J,OAAOC,SAASiH,KAAOvH,YAAY,iBAAkB,CACnDmK,OAAQD,IAnEtB,+DA8EU,OALA9mB,QAAQC,MAAR,UACKoiB,EAAOvM,MACVuM,EAAO7F,QACP,wBA5EZ,UA8EgBH,YACJkG,GAAQiD,gBAAgB,CACtBC,QAAS,QACT5C,QAAS,iCAjFvB,0CA0FI,OA1FJ,UA0FUxG,YACJkG,GAAQiD,gBAAgB,CACtBC,QAAS,QACT5C,QAASe,IAAQpQ,EAAEjb,IAAaguB,sBA7FxC,2DAiGIvmB,QAAQC,MAAR,UAAiBoiB,EAAOvM,MAAQuM,EAAO7F,QAAvC,MAjGJ,wD,SAoGeqK,G,iFAAf,WAAwCG,GAAxC,mBAAA7mB,EAAA,+EAEwD4b,IAAWvH,IAC7D,sBACA,CACEyS,KAAM,EACN/H,QAAS,KACTG,QAAS,IAAIta,IACX,kBACAZ,IAAe6B,OACfghB,GACA3iB,aAXV,cAEQ8X,EAFR,OAcQ2K,EAdR,UAciB3K,EAAS/Z,MAAM,UAdhC,aAciB,EAAmBqC,GAdpC,kBAeWqiB,GAfX,0F,sBAoCA,SAAUhF,KAAV,sEACsD,OAA/BoF,SAASC,mBADhC,gBAGI,OAHJ,SAGU9K,YAAIkG,GAAQ6E,2BAHtB,6BAKI,OALJ,SAKU/K,YAAIkG,GAAQ8E,0BALtB,wCAQA,SAAUtF,GAAkBM,GAA5B,6EASI,OARIroB,EAAMC,YAAU,qBAChBqtB,EAAWjF,EAAO7F,QAAQ8K,SAC1BloB,OACSE,IAAbgoB,EACIJ,SAASK,gBACTL,SAASM,cAAcF,GACvBG,EAPR,OAO4BroB,QAP5B,IAO4BA,IAAK8nB,SAASK,gBAP1C,kBASUjF,IATV,OAWI,OADAmF,EAAkBC,oBAVtB,UAWUrL,YAAIkG,GAAQ6E,2BAXtB,QAYIptB,EAAI8gB,KAAK,qBAAsB2M,GAZnC,wBAeI,OAfJ,0BAcIztB,EAAI8gB,KAAK,kCAAT,MAdJ,UAeUuB,YACJkG,GAAQiD,gBAAgB,CACtBC,QAAS,QACT5C,QAAS,qCAAuC9c,OAAO,EAAD,OAlB9D,uDAuBA,SAAUic,KAAV,iEAIE,OAHmC,OAA/BkF,SAASC,mBACXD,SAASS,iBAFb,SAIQtL,YAAIkG,GAAQ8E,0BAJpB,wCAMA,SAAUpF,GACRI,GADF,iEAGE,OAHF,SAGQhG,YAAIkG,GAAQqF,6BAA6BvF,EAAO7F,UAHxD,wCAKA,SAAU0F,GAAeG,GAAzB,iEACE,OADF,SACQhG,YAAIkG,GAAQsF,gBAAgBxF,EAAO7F,UAD3C,wCAGA,SAAU2F,GAAiBE,GAA3B,iEACE,OADF,SACQhG,YAAIkG,GAAQuF,kBAAkBzF,EAAO7F,UAD7C,wCAIO,SAAU4F,KAAV,uEACL,OADK,SACC2F,YAAWxF,GAAQyF,gBAAgBlS,KAAM4K,IAD1C,OAEL,OAFK,SAECqH,YAAWxF,GAAQ5B,qBAAqB7K,KAAM6K,IAF/C,OAGL,OAHK,SAGCoH,YAAWxF,GAAQ0F,oBAAoBnS,KAAMgL,IAH9C,OAIL,OAJK,SAICiH,YAAWxF,GAAQE,eAAe3M,KAAM+K,IAJzC,OAKL,OALK,UAKCkH,YAAWxF,GAAQ2F,gBAAgBpS,KAAMkL,IAL1C,QAML,OANK,UAMC+G,YACJxF,GAAQ4F,wBAAwBrS,KAChCmL,IARG,QAUL,OAVK,UAUC8G,YACJxF,GAAQnB,0BAA0BtL,KAClCsL,IAZG,QAcL,OAdK,UAcC2G,YAAWxF,GAAQe,mBAAmBxN,KAAM8K,IAd7C,QAeL,OAfK,UAeCmH,YAAWxF,GAAQ6F,oBAAoBtS,KAAMuL,IAf9C,QAoBL,OApBK,UAoBC0G,YAAWxF,GAAQsD,SAAS/P,KAAMiL,IApBnC,QAqBL,OArBK,UAqBCgH,YACJxF,GAAQ8F,6BAA6BvS,KACrCwL,IAvBG,QAyBL,OAzBK,UAyBCyG,YACJxF,GAAQ+F,6BAA6BxS,KACrCyL,IA3BG,QA6BL,OA7BK,UA6BCwG,YACJxF,GAAQgG,uBAAuBzS,KAC/B0L,IA/BG,QAiCL,OAjCK,UAiCCuG,YAAWxF,GAAQiG,WAAW1S,KAAM2L,IAjCrC,QAkCL,OAlCK,UAkCCsG,YAAWxF,GAAQkG,mBAAmB3S,KAAMoL,IAlC7C,QAmCL,OAnCK,UAmCC6G,YACJxF,GAAQmG,wBAAwB5S,KAChCqL,IArCG,QAwCL,OAxCK,UAwCC4G,YACJxF,GAAQC,kBAAkB1M,KAC1BwJ,GA1CG,QA4CL,OA5CK,UA4CCyI,YAAWxF,GAAQoG,aAAa7S,KAAM4L,IA5CvC,QA6CL,OA7CK,UA6CCqG,YACJxF,GAAQqG,2BAA2B9S,KACnC8L,IA/CG,QAiDL,OAjDK,UAiDCmG,YAAWc,kBAAiBhH,IAjD7B,QAkDL,OAlDK,UAkDCkG,YAAWxF,GAAQuG,cAAchT,KAAM6L,IAlDxC,QAuDL,OAJMoH,EAAoBC,aAAa,SAAAC,GAErC,OADA/B,SAASgC,iBAAiB,mBAAoBD,GACvC,kBAAM/B,SAASiC,oBAAoB,mBAAoBF,OArD3D,UAuDCG,YAAUL,EAAmBjH,IAvD9B,QAwDL,OAxDK,UAwDCuH,YAAY9G,GAAQ+G,gBAAiBvH,IAxDtC,QAyDL,OAzDK,UAyDCsH,YAAY9G,GAAQgH,eAAgBvH,IAzDrC,QA0DL,OA1DK,UA0DC+F,YACJxF,GAAQiH,wBAAwB1T,KAChCmM,IA5DG,QA8DL,OA9DK,UA8DC8F,YAAWxF,GAAQtP,aAAa6C,KAAMoM,IA9DvC,QA+DL,OA/DK,UA+DC6F,YAAWxF,GAAQkH,eAAe3T,KAAMqM,IA/DzC,yCC5hBA,IAAMxW,GAAiC,CAC5C1L,MAAO,KACP2P,oBAAoB,EACpBI,0BAA0B,EAC1BH,wBAAwB,EACxB4B,oBAAoB,EACpB3B,4BAA4B,EAC5BpE,YAAa,KACbyE,cAAe,GACfe,gBAAiB,KACjBE,gBAAiB,KACjBG,YAAa,EACbI,oBAAqB,GACrBO,4BAA4B,EAC5BH,YAAY,EACZnK,8BAA0BtI,EAC1BqT,8BAA8B,EAC9BtC,eAAgB,GAChBN,uBAAuB,EACvBJ,qBAAiBrQ,EACjBuT,+BAA+B,EAC/BrD,cAAc,EACduD,kBAAmBoT,IAAW7e,IAC9B2L,cAAc,EACdjB,qBAAiB1S,EACjB8S,wBAAoB9S,GAGlBoqB,GAAqB,EACnBC,GAAQC,YAAY,CACxB9jB,KAAM,cACN6F,gBACAke,SAAU,CACR7B,gBADQ,SACQvc,EAAO4W,GACrB5W,EAAMmE,oBAAqB,GAE7B4S,kBAJQ,SAIU/W,EAAO4W,GACvB,IAAM3W,EAAc2W,EAAO7F,QAC3B/Q,EAAMC,YAAcA,EACpBD,EAAMmE,oBAAqB,GAE7BgT,UATQ,SASEnX,EAAO4W,GAEf5W,EAAMxL,MAAQoiB,EAAO7F,QAAQqG,QAC7BpX,EAAMmE,oBAAqB,GAE7B+Q,qBAdQ,SAcalV,EAAO4W,GAC1B5W,EAAMuE,0BAA2B,EACjCvE,EAAMiD,uBAAoBpP,GAE5B4jB,6BAlBQ,SAmBNzX,EACA4W,GAEA,IAAMU,EAAYC,IAAWC,SAC7BxX,EAAMuE,0BAA2B,EACjCvE,EAAMkE,iBAAkB,EACxBlE,EAAMiD,kBAAN,2BAA+B2T,EAAO7F,SAAtC,IAA+CuG,cAC/CtX,EAAMiE,gBAAkB2S,EAAO7F,QAAQsN,UAEzCtG,2BA5BQ,SA4BmB/X,EAAO4W,GAChC5W,EAAMuE,0BAA2B,GAEnCsT,mBA/BQ,SA+BW7X,EAAO4W,KAC1BoB,uBAhCQ,SAgCehY,EAAO4W,GAC5B5W,EAAMkE,gBAAkB0S,EAAO7F,SAEjCiG,eAnCQ,SAmCOhX,EAAO4W,KACtByB,gBApCQ,SAoCQrY,EAAO4W,GACrB5W,EAAMiE,gBAAkB2S,EAAO7F,SAEjCgJ,gBAvCQ,SAuCQ/Z,EAAO4W,GAAsC,IAAD,EAEpDtpB,EAAG,UAAGspB,EAAO7F,QAAQzjB,WAAlB,QAAyB2wB,KAC5B/e,EAAQc,EAAM0E,cAAc4Z,WAAU,SAAA3qB,GAAC,OAAIA,EAAErG,MAAQA,KACvD4R,GAAS,GACXc,EAAM0E,cAAc6Z,OAAOrf,EAAO,GAGpCc,EAAM0E,cAAc9K,KAApB,aACEtM,IAAKA,GACFspB,EAAO7F,WAGdyN,iBApDQ,SAoDSxe,EAAO4W,GACtBA,EAAO7F,QAAQ1jB,SAAQ,SAAAyd,GAAI,OACzB9K,EAAM0E,cAAc9K,KAApB,aACEtM,IAAK2wB,MACFnT,QAIT2T,mBA5DQ,SA4DWze,EAAO4W,GACxB,IAAM1X,EAAQc,EAAM0E,cAAc4Z,WAChC,SAAA3qB,GAAC,OAAIA,EAAErG,MAAQspB,EAAO7F,WAEpB7R,GAAS,GACXc,EAAM0E,cAAc6Z,OAAOrf,EAAO,IAGtCsd,oBApEQ,SAoEYxc,GAClBA,EAAMoE,wBAAyB,GAEjCmU,4BAvEQ,SAuEoBvY,EAAO4W,GACjC,IAAM0B,EAAU1B,EAAO7F,QACvB/Q,EAAMyF,gBAAkB6S,EACxBtY,EAAMoE,wBAAyB,GAEjCqU,0BA5EQ,SA4EkBzY,EAAO4W,GAC/B5W,EAAMxL,MAAQoiB,EAAO7F,QACrB/Q,EAAMoE,wBAAyB,GAEjC0Y,uBAhFQ,SAgFe9c,EAAO4W,IAC5B,SAAmB8H,EAAiB5T,EAAS6T,GAC3C,IAAMrxB,EAAMqxB,EAAM7T,GACZ7T,EAAIynB,EAAMzf,MAAK,SAAAvK,GAAC,OAAIiqB,EAAMjqB,KAAOpH,KACvC,QAAUuG,IAANoD,EACF,OAAOynB,EAAM9kB,KAAKkR,GAElB3d,OAAOmsB,OAAOriB,EAAG6T,GAGrB8T,CACE5e,EAAMkG,oBADF,2BAGC,CACDlN,GAAI,EACJyG,KAAM,KACNC,QAAS,KACTC,cAAe,KACfL,SAAS,EACTM,YAAY,EACZL,UAAU,EACVM,cAAc,IAEb+W,EAAO7F,UAEZ,SAAAzb,GAAC,uBAAIA,EAAE6J,WAAN,aAAI,EAAOpL,kBAGhBgpB,WA5GQ,SA6GN/c,EACA4W,GAKC,IAAD,IACMiI,EAAS,UACb7e,EAAMkG,oBAAoBoY,WACxB,SAAAxT,GAAI,OAAIA,EAAK3L,IAAIpL,gBAAkB6iB,EAAO7F,QAAQzjB,IAAIyG,wBAF3C,SAGP,EACR,GAAI8qB,GAAa,EAAG,CAClB,IAAIC,EAAc9e,EAAMkG,oBAAoBjH,MAC1C,SAAA6L,GAAI,OAAIA,EAAK3L,IAAIpL,gBAAkB6iB,EAAO7F,QAAQzjB,IAAIyG,iBAElD+qB,IACJA,EAAYzf,MAAQuX,EAAO7F,QAAQzH,OACnCtJ,EAAMkG,oBAAoBqY,OAAOM,EAAW,GAC5C7e,EAAMkG,oBAAoBtM,KAAKklB,QAE5B,CAAC,IAAD,EACDhU,EAAO,CACTtL,SAAQ,UAAEQ,EAAMiD,yBAAR,aAAE,EAAyBY,YACnC7K,GAAI,EACJmG,IAAKyX,EAAO7F,QAAQzjB,IACpB+R,MAAOuX,EAAO7F,QAAQzH,QAExBtJ,EAAMkG,oBAAoBtM,KAAKkR,GAUjC,UAAA9K,EAAMyF,uBAAN,SAAuBsZ,UACpB/nB,KAAI,SAAA1B,GAAC,OAAIA,EAAE0pB,cACXC,OACA5xB,SAAQ,SAAA6xB,GACP,QAAgBrrB,IAAZqrB,EAAuB,CACzB,IACiD,EAD3CC,EAAWD,EAAQC,SACzB,QAAiBtrB,IAAbsrB,GAAuC,OAAbA,GACX,UAAGA,EAASzrB,MAAM,KAAK,UAAvB,QAA6ByrB,KAC1BvI,EAAO7F,QAAQU,SAAS2N,WAC1CF,EAAQC,SAAR,UAAsBvI,EAAO7F,QAAQU,SAAS2N,SAA9C,YAA0DxI,EAAO7F,QAAQzH,QACzE4V,EAAQG,IAAR,UAAiBzI,EAAO7F,QAAQU,SAAS2N,SAAzC,YAAqDxI,EAAO7F,QAAQzH,cAMhF4T,aAlKQ,SAkKKld,EAAO4W,GAAwD,IAAD,EACnEiI,EAAS,UACb7e,EAAMkG,oBAAoBoY,WACxB,SAAAxT,GAAI,OAAIA,EAAK3L,IAAIpL,gBAAkB6iB,EAAO7F,QAAQzjB,IAAIyG,wBAF3C,SAGP,EACR,GAAI8qB,GAAa,EAAG,CAClB,IAAIC,EAAc9e,EAAMkG,oBAAoBjH,MAC1C,SAAA6L,GAAI,OAAIA,EAAK3L,IAAIpL,gBAAkB6iB,EAAO7F,QAAQzjB,IAAIyG,iBAElD+qB,IACJA,EAAYzf,MAAQuX,EAAO7F,QAAQpa,MAAMiC,WACzCoH,EAAMkG,oBAAoBqY,OAAOM,EAAW,GAC5C7e,EAAMkG,oBAAoBtM,KAAKklB,QAE5B,CAAC,IAAD,EACDhU,EAAO,CACTtL,SAAQ,UAAEQ,EAAMiD,yBAAR,aAAE,EAAyBY,YACnC7K,GAAI,EACJmG,IAAKyX,EAAO7F,QAAQzjB,IACpB+R,MAAOuX,EAAO7F,QAAQpa,MAAMiC,YAE9BoH,EAAMkG,oBAAoBtM,KAAKkR,KAGnCuS,cA1LQ,SA2LNrd,EACA4W,GACC,IAAD,EACMiI,EAAS,UACb7e,EAAMkG,oBAAoBoY,WACxB,SAAAxT,GAAI,OAAIA,EAAK3L,IAAIpL,gBAAkB6iB,EAAO7F,QAAQzjB,IAAIyG,wBAF3C,SAGP,EACR,GAAI8qB,GAAa,EAAG,CAClB,IAAIC,EAAc9e,EAAMkG,oBAAoBjH,MAC1C,SAAA6L,GAAI,OAAIA,EAAK3L,IAAIpL,gBAAkB6iB,EAAO7F,QAAQzjB,IAAIyG,iBAElD+qB,IACJA,EAAYzf,MAAQuX,EAAO7F,QAAQpa,MAAMiC,WACzCoH,EAAMkG,oBAAoBqY,OAAOM,EAAW,GAC5C7e,EAAMkG,oBAAoBtM,KAAKklB,QAE5B,CAAC,IAAD,EACDhU,EAAO,CACTtL,SAAQ,UAAEQ,EAAMiD,yBAAR,aAAE,EAAyBY,YACnC7K,GAAI,EACJmG,IAAKyX,EAAO7F,QAAQzjB,IACpB+R,MAAOuX,EAAO7F,QAAQpa,MAAMiC,YAE9BoH,EAAMkG,oBAAoBtM,KAAKkR,KAGnC2R,gBArNQ,SAqNQzc,GACdA,EAAMgG,oBAAqB,GAE7B4S,wBAxNQ,SAwNgB5Y,EAAO4W,GAC7B5W,EAAM8F,YAAc8Q,EAAO7F,QAC3B/Q,EAAMgG,oBAAqB,GAE7B6S,sBA5NQ,SA4Nc7Y,EAAO4W,GAC3B5W,EAAMxL,MAAQoiB,EAAO7F,QACrB/Q,EAAMgG,oBAAqB,GAG7BgX,mBAjOQ,SAiOWhd,GACjBA,EAAMsE,uBAAwB,GAEhC2S,2BApOQ,SAoOmBjX,EAAO4W,GAChC,IAAInL,EAAYmL,EAAO7F,QACvB/Q,EAAM4E,eAAmB6G,EAAK9U,MACzB8U,EAAK9U,MACL8U,EACLzL,EAAMsE,uBAAwB,GAEhC2U,yBA3OQ,SA2OiBjZ,EAAO4W,GAC9B5W,EAAMxL,MAAQoiB,EAAO7F,QACrB/Q,EAAMsE,uBAAwB,GAGhC2Y,wBAhPQ,SAgPgBjd,GACtBA,EAAMsE,uBAAwB,GAGhC4U,gCApPQ,SAqPNlZ,EACA4W,GAEA,IAAInL,EAAYmL,EAAO7F,QAUvB,GATAtF,EAAK3M,SAASzR,SAAQ,SAAAoG,GACpB,IAAI6rB,EAAKtf,EAAM4E,eAAe3F,MAAK,SAAA3J,GAAC,OAAIA,EAAE0D,KAAOvF,EAAEuF,WACxCnF,IAAPyrB,EACFA,EAAGjgB,MAAQ5L,EAAE4L,MAEbW,EAAM4E,eAAehL,KAAKnG,MAIJ,OAAtBuM,EAAMC,YACRwL,EAAKnL,QAAQjT,SAAQ,SAAA+mB,GAAM,IAAD,EACyC,OAAXvgB,KAAlD,UAAAmM,EAAMC,mBAAN,eAAmBK,QAAQrB,MAAK,SAAA3J,GAAC,OAAIA,IAAM8e,QAC7C,UAAApU,EAAMC,mBAAN,SAAmBK,QAAQ1G,KAAKwa,OAGpCpU,EAAMC,YAAYsf,uBAAyB9T,EAAK8T,uBAChDvf,EAAMC,YAAYuf,2BAChB/T,EAAK+T,2BACPxf,EAAMC,YAAYwf,6BAChBhU,EAAKgU,6BACPzf,EAAMC,YAAYyf,mBAAqBjU,EAAKiU,mBAC5C1f,EAAMC,YAAY0f,WAAalU,EAAKkU,eAC/B,CACL,IAAI7gB,EAAW,GACfA,EAASygB,uBAAyB9T,EAAK8T,uBACvCzgB,EAAS0gB,2BAA6B/T,EAAK+T,2BAC3C1gB,EAAS2gB,6BACPhU,EAAKgU,6BACP3gB,EAAS4gB,mBAAqBjU,EAAKiU,mBACnC5gB,EAAS6gB,WAAalU,EAAKkU,WAC3B7gB,EAASwB,QAAUmL,EAAKnL,QACxBxB,EAASmC,WAAawK,EAAKxK,WAC3BnC,EAAS4C,eAAiB+J,EAAK/J,eAC/B1B,EAAMC,YAAcnB,EAEtBkB,EAAMsE,uBAAwB,GAEhC6U,8BA9RQ,SA8RsBnZ,EAAO4W,GACnC5W,EAAMxL,MAAQoiB,EAAO7F,QACrB/Q,EAAMsE,uBAAwB,GAGhCoY,wBAnSQ,SAmSgB1c,GACtBA,EAAMqE,4BAA6B,GAErC0U,wBAtSQ,SAuSN/Y,EACA4W,GAEA5W,EAAMkG,oBAAsB0Q,EAAO7F,QACnC/Q,EAAMqE,4BAA6B,GAErC2U,sBA7SQ,SA6SchZ,EAAO4W,GAC3B5W,EAAMxL,MAAQoiB,EAAO7F,QACrB/Q,EAAMqE,4BAA6B,GAErCsR,0BAjTQ,SAkTN3V,EACA4W,GAEA5W,EAAMyG,4BAA6B,GAErCgT,0BAvTQ,SAwTNzZ,EACA4W,GACC,IAAD,EACA5W,EAAMyG,4BAA6B,EACnC,IAAMoY,EAAS,UACb7e,EAAMkG,oBAAoBoY,WACxB,SAAAxT,GAAI,OAAIA,EAAK3L,MAAQyX,EAAO7F,QAAQ5R,cAFzB,SAGP,EACJ0f,GAAa,GACf7e,EAAMkG,oBAAoBqY,OAAOM,EAAW,GAC5C7e,EAAMkG,oBAAoBtM,KAAKgd,EAAO7F,UAEtC/Q,EAAMkG,oBAAoBtM,KAAKgd,EAAO7F,UAG1C2I,wBAvUQ,SAuUgB1Z,EAAO4W,GAC7B5W,EAAMyG,4BAA6B,GAErCkW,oBA1UQ,SA0UY3c,EAAO4W,GACzB5W,EAAM2G,oBAAqB,GAE7BgT,4BA7UQ,SA8UN3Z,EACA4W,GACC,IAAD,EACA5W,EAAM2G,oBAAqB,EAC3B,IAAMkY,EAAS,UACb7e,EAAMkG,oBAAoBoY,WACxB,SAAAxT,GAAI,OAAIA,EAAK3L,MAAQyX,EAAO7F,QAAQ5R,cAFzB,SAGP,EACJ0f,GAAa,GACf7e,EAAMkG,oBAAoBqY,OAAOM,EAAW,GAC5C7e,EAAMkG,oBAAoBtM,KAAKgd,EAAO7F,UAEtC/Q,EAAMkG,oBAAoBtM,KAAKgd,EAAO7F,UAG1C6I,0BA7VQ,SA6VkB5Z,EAAO4W,GAC/B5W,EAAM2G,oBAAqB,GAE7BiZ,0BAhWQ,SAgWkB5f,EAAO4W,GAC/B5W,EAAMsG,WAAasQ,EAAO7F,SAK5BqJ,SAtWQ,SAuWNpa,EACA4W,KAGF1P,6BA3WQ,SA2WqBlH,EAAO4W,GAClC5W,EAAMkH,6BAA+B0P,EAAO7F,SAE9C6L,6BA9WQ,SA8WqB5c,EAAO4W,KACpCiD,qCA/WQ,SAgXN7Z,EACA4W,GAEA5W,EAAM7D,yBAA2Bya,EAAO7F,SAE1C8L,6BArXQ,SAsXN7c,EACA4W,GAEA5W,EAAM7D,yBAA2Bya,EAAO7F,SAE1C8O,qCA3XQ,SA4XN7f,EACA4W,GAEA5W,EAAM7D,yBAA2Bya,EAAO7F,SAE1C+O,iCAjYQ,SAiYyB9f,EAAO4W,GACtC5W,EAAMoH,8BAAgCwP,EAAO7F,SAE/CoM,2BApYQ,SAqYNnd,EACA4W,GAEAriB,QAAQhG,IAAI,iBAAkBqoB,EAAO7F,UAEvCsJ,aA1YQ,SA0YKra,EAAO4W,GACd5W,EAAMC,aAIZ4d,gBA/YQ,SA+YQ7d,EAAO4W,KACvBkH,eAhZQ,SAgZO9d,EAAO4W,KACtB+E,wBAjZQ,SAiZgB3b,EAAO4W,GAC7B5W,EAAM+D,cAAe,GAEvB6X,uBApZQ,SAoZe5b,EAAO4W,GAC5B5W,EAAM+D,cAAe,GAEvBgc,sBAvZQ,SAwZN/f,EACA4W,KAEFoJ,qBA3ZQ,SA2ZahgB,EAAO4W,KAC5BmH,wBA5ZQ,SA6ZN/d,EACA4W,KAEFuF,6BAhaQ,SAiaNnc,EACA4W,GAEA5W,EAAMsH,kBAAoBsP,EAAO7F,SAEnCkP,2BAtaQ,SAsamBjgB,EAAO4W,GAChC5W,EAAMsH,uBAAoBzT,GAE5B2T,aAzaQ,SAyaKxH,EAAO4W,KACpBwF,gBA1aQ,SA0aQpc,EAAO4W,GACrB5W,EAAMwH,aAAeoP,EAAO7F,SAE9BiN,eA7aQ,SA6aOhe,EAAO4W,KACtByF,kBA9aQ,SA8aUrc,EAAO4W,GACvB5W,EAAMuG,gBAAkBqQ,EAAO7F,YAKbmP,GAAuBhC,GAAhCpH,QAEFqJ,GAAsB,WAGjC,OAFAC,YAAiB,CAAE9yB,IAAK4wB,GAAM7jB,KAAMgmB,QAASnC,GAAMmC,UACnDC,YAAc,CAAEhzB,IAAK4wB,GAAM7jB,KAAMkmB,KAAM5J,KAChC,CAAEG,QAASoH,GAAMpH,W,iKC/bb0J,EAASxR,cACpB,WAaEC,GACI,IAAD,IAZDY,EAYC,EAZDA,SACAzR,EAWC,EAXDA,SACAqiB,EAUC,EAVDA,WAUC,IATDC,YASC,MATM,SASN,MARD1G,eAQC,MARS,OAQT,EAPDtB,EAOC,EAPDA,KACAiI,EAMC,EANDA,UACA7Q,EAKC,EALDA,MACA8Q,EAIC,EAJDA,GACGtR,EAGF,qGAEGuR,EAAWC,wBACAC,EAAeZ,cAAxBrJ,QACFkK,OACKntB,IAAT6kB,OACI7kB,EACgB,kBAAT6kB,EACPvH,YAAYuH,GACZvH,YACGuH,EAAuBuI,KACvBvI,EAAuBpP,QAE1B4X,EAAc,SAACjqB,GAInB,GAHIqY,EAAM6R,SACR7R,EAAM6R,QAAQlqB,GAEV2pB,EAAI,CACR,IAAIQ,EAAqB,kBAAPR,EAAkBA,EAAKS,YAAqBT,GAC9DC,EAASE,EAAW3G,SAASgH,MAIjC,OAAOtR,EACL,mCAEE,cAAC,IAAD,CAASA,MAAOA,EAAhB,SACE,+BACE,eAAC,SAAD,yBACEwR,eAAa,EACbC,oBAAkB,EAClBC,oBAAkB,EAClBxH,QACc,SAAZA,GAAkC,aAAZA,EAClB,OACA,YAEN0G,KAAMA,EACNtiB,SAAQ,UAAGqiB,GAAcriB,SAAjB,SACR6Q,IAAKA,EACL0R,WAAoB,OAATA,QAAS,IAATA,IAAeK,GAAe,IAAM,SAC/CG,QAAS,SAAAM,GACPP,EAAYO,IAEd1O,UAAWC,kBACT1D,EAAMyD,UADO,iBAEH2O,qBAAW1H,IAFR,YAGSnmB,IAApByb,EAAMqS,UAA0B,gBAAkB,IAHvC,YAIQ9tB,IAAlByb,EAAMsS,QAAwB,cAAgB,KAEnDlJ,KAAMsI,GACF1R,GAvBN,cAyBE,sBAAMyD,UAAW,cAAjB,SAAiClD,IAEhC4Q,GAAc,cAAC,mBAAD,CAAkBC,KAAM,eAO/C,eAAC,SAAD,yBACEY,eAAa,EACbC,oBAAkB,EAClBC,oBAAkB,EAClBxH,QACc,SAAZA,GAAkC,aAAZA,EAAyB,OAAS,YAE1D0G,KAAMA,EACNtiB,SAAQ,UAAGqiB,GAAcriB,SAAjB,SACR6Q,IAAKA,EACL0R,WAAoB,OAATA,QAAS,IAATA,IAAeK,GAAe,IAAM,SAC/CG,QAAS,SAAAM,GACPP,EAAYO,IAEd1O,UAAWC,kBACT1D,EAAMyD,UADO,iBAEH2O,qBAAW1H,IAFR,YAGSnmB,IAApByb,EAAMqS,UAA0B,gBAAkB,IAHvC,YAIQ9tB,IAAlByb,EAAMsS,QAAwB,cAAgB,KAEnDlJ,KAAMsI,GACF1R,GArBN,cAuBE,sBAAMyD,UAAW,cAAjB,SAAiClD,IAEhC4Q,GAAc,cAAC,mBAAD,CAAkBC,KAAM,a,ubCnJxC,SAASmB,EAAGvS,GAA8B,IACvCO,EAAuBP,EAAvBO,SAAa7G,EADyB,YACfsG,EADe,cAE9C,OACE,cAAC,IAAD,yBAAiB0K,QAAQ,MAAShR,GAAlC,aACG6G,KAIA,SAASiS,EAAGxS,GAA8B,IACvCO,EAAuBP,EAAvBO,SAAa7G,EADyB,YACfsG,EADe,cAE9C,OACE,cAAC,IAAD,yBAAiB0K,QAAQ,MAAShR,GAAlC,aACG6G,KAIA,SAASkS,EAAGzS,GAA8B,IACvCO,EAAuBP,EAAvBO,SAAa7G,EADyB,YACfsG,EADe,cAE9C,OACE,cAAC,IAAD,yBAAiB0K,QAAQ,MAAShR,GAAlC,aACG6G,KAIA,SAASmS,EAAG1S,GAA8B,IACvCO,EAAuBP,EAAvBO,SAAa7G,EADyB,YACfsG,EADe,cAE9C,OACE,cAAC,IAAD,yBAAiB0K,QAAQ,MAAShR,GAAlC,aACG6G,KAuBA,SAASoS,EAAK3S,GAAmB,IAC9BoR,EAAmCpR,EAAnCoR,KAAMwB,EAA6B5S,EAA7B4S,KAAMrS,EAAuBP,EAAvBO,SAAa7G,EADI,YACMsG,EADN,4BAE/B6S,EACK,UAATzB,EACIwB,EACE,QACA,QACO,UAATxB,EACAwB,EACE,QACA,QACFA,EACA,QACA,QACN,OACE,cAAC,IAAD,yBAAiBlI,QAASmI,GAAgBnZ,GAA1C,aACG6G,KASA,SAASuS,EAAQ9S,GAAsB,IACpC4S,EAA6B5S,EAA7B4S,KAAMrS,EAAuBP,EAAvBO,SAAa7G,EADgB,YACNsG,EADM,qBAErC+S,EAAgBH,EAAO,cAAgB,iBAC7C,OACE,cAAC,IAAD,yBAAiBlI,QAASqI,GAAmBrZ,GAA7C,aACG6G,KAOA,SAASyS,EAAUhT,GAAwB,IACxCO,EAAuBP,EAAvBO,SAAa7G,EAD0B,YAChBsG,EADgB,cAE/C,OACE,cAAC,IAAD,yBAAiB0K,QAAQ,aAAgBhR,GAAzC,aACG6G,KAQA,SAAS0S,EAAKjT,GAAmB,IAC9B4S,EAA6B5S,EAA7B4S,KAAMrS,EAAuBP,EAAvBO,SAAa7G,EADU,YACAsG,EADA,qBAE/BkT,EAAaN,EAAO,WAAa,cACvC,OACE,cAAC,IAAD,yBAAiBlI,QAASwI,GAAgBxZ,GAA1C,aACG6G,KAQA,SAAS4S,EAAWnT,GAAyB,IAC1CoR,EAA6BpR,EAA7BoR,KAAM7Q,EAAuBP,EAAvBO,SAAa7G,EADsB,YACZsG,EADY,qBAE3CoT,EAA4B,OAAThC,EAAgB,eAAiB,cAC1D,OACE,cAAC,IAAD,yBAAiB1G,QAAS0I,GAAsB1Z,GAAhD,aACG6G,KAQA,SAAS8S,EAAWrT,GAAyB,IAC1CoR,EAA6BpR,EAA7BoR,KAAM7Q,EAAuBP,EAAvBO,SAAa7G,EADsB,YACZsG,EADY,qBAE3CsT,EAA4B,UAATlC,EAAmB,cAAgB,cAC5D,OACE,cAAC,IAAD,yBAAiB1G,QAAS4I,GAAsB5Z,GAAhD,aACG6G,KASA,SAASgT,EAAYvT,GAA0B,IAC5CoR,EAA6BpR,EAA7BoR,KAAM7Q,EAAuBP,EAAvBO,SAAa7G,EADwB,YACdsG,EADc,qBAE7CwT,EAA4B,UAATpC,EAAmB,UAAY,UACxD,OACE,cAAC,IAAD,yBAAiB1G,QAAS8I,GAAsB9Z,GAAhD,aACG6G,O,miBCzIA,SAASkT,EAAcC,GAC5B,IAAM1W,EAAU0W,EAAUjvB,cAC1B,MAAO,CAAC,UAAW,YAAYuR,MAAK,SAAA2d,GAAM,OAAI3W,EAAQ/C,WAAW0Z,MAqB5D,SAAS9R,EAAY8P,EAAciC,GACxC,IAAMC,EAjBR,SAAyBlC,GACvB,OAAOA,EAAK1X,WATG,KASoB0X,EAAKnJ,QATzB,IAS2C,IAAMmJ,EAgBlDmC,CAAgBnC,GAExBoC,EADcN,EAAcI,IArBpC,SAAkBlC,GAChB,OAAOA,EAAKltB,cAAcwV,WAAW2G,GAAuBnc,eAoBhBuvB,CAASH,GAEjDA,EAjBC,SAAiBI,EAAkBtC,GAKxC,OAHEuC,kBAAQD,EAdW,SAgBnBE,oBAAUxC,EAhBS,KA8BjByC,CAAQxT,GAAwBiT,GAGpC,YADYtvB,IAAVqvB,EAAsBG,EAAtB,UAAsCA,EAAtC,YAAoDM,EAAcT,IAS/D,SAASS,EAAclnB,GAC5B,IAAI9H,EAAS,IAAIiU,gBAMjB,OALAzb,OAAOwW,QAAQlH,GACZF,QAAO,oDAA4B1I,IAA5B,QACPxG,SAAQ,YAAmB,IAAD,mBAAhBC,EAAgB,KAAXqJ,EAAW,KACzBhC,EAAOkU,OAAOvb,EAAKqJ,MAEhBhC,EAGF,SAASivB,EAAS3C,EAActY,GAErC,MADa,CAACwI,EAAY8P,GAAO,IAAK0C,EAAchb,IAAS5P,KAAK,IAe7D,SAASgJ,EAAoBqd,GAClC,OAAOA,GAAYA,EAASyE,SAAS,KAAO,GAAK,KAgB5C,SAASC,EAAY7C,EAAe8C,GACzC,IAAMC,EAAYtR,sBAAY7Q,KAI9B,QAHehO,IAAXkwB,IACF9C,EAAO8C,QAESlwB,IAAdmwB,QAGSnwB,IAATotB,EAAJ,CAGA,GAAI8B,EAAc9B,GAChB,OAAOA,EAGT,IA7BiC7B,EA6B7BnP,EAAU,IAAIsB,IAAIyS,GAEtB,OADgB,IAAIzS,KA9Ba6N,EA8BU6B,GA7B9B1X,WAAW,KACf6V,EAASzV,UAAU,GAEnByV,EA0ByCnP,GACjCrX,YAQZ,SAASqrB,EAAoBtb,GAClC,IAAMhU,EAAM,2BAAQgU,GAAR,IAAgBub,QAAS,qBAIrC,cAHOvvB,EAAM,cACNA,EAAM,YACNA,EAAM,MACNA,EAEF,SAASwvB,EAA6Bxb,GAC3C,IAAMhU,EAAM,eAAQgU,GAIpB,cAHOhU,EAAM,cACNA,EAAM,YACNA,EAAM,MACNA,EAEF,SAASyvB,EACdnD,EACAtY,GAEA,IAAM8H,EAAMU,EAAY8P,EAAMtY,GAC9B6I,OAAO6S,KAAK5T,EAAK,UAGZ,SAAe6T,EAAtB,oC,4CAAO,WACLrD,EACAtY,GAFK,SAAAjU,EAAA,+EAIE,IAAI4W,QAAJ,uCAAY,WAAMC,GAAN,qBAAA7W,EAAA,6DACX+b,EAAMwQ,EAAKnJ,QAAQ5H,GAAwB,IADhC,kBAGQH,IAAMhH,IAAI0H,EAAK,CACpC2B,aAAc,OACdjC,aAAStc,EACT8U,OAAQA,IANK,OAGT+H,EAHS,OAQT6T,EAAK7T,EAASiB,QAAQ,uBACtB6S,OACG3wB,IAAP0wB,EAAmBA,EAAG7wB,MAAM,aAAa,GAAK,kBAChD+wB,IAAa/T,EAASjF,KAAM+Y,GAXb,0DAajBjZ,IAbiB,0DAAZ,wDAJF,4C,sBAqBA,IAAMmZ,EAAiB,iBAIvB,SAASC,EACdlT,GAES,IADTmT,EACQ,uDADmB,IAE3B,IACE,IAAMjc,EAAS,IAAID,IAAkB+I,EAASnI,QACxCub,EAAe,YACfluB,EAAQgS,EAAOI,IAAI8b,GACzB,cAAOluB,QAAP,IAAOA,IAASiuB,EAChB,MAAOpwB,GACP,OAAOowB,GAQJ,SAAeE,EAAtB,kC,4CAAO,WAA4BxV,GAA5B,uBAAA5a,EAAA,sEAIkBqb,IAAMhH,IAAIuG,EAAM2R,KAAM,CAC3C7O,aAAc,SALX,OAIC1B,EAJD,OAOC6T,EAAK7T,EAASiB,QAAQ,uBAPvB,SAQgB4S,QARhB,IAQgBA,OARhB,EAQgBA,EAAI7wB,MAAM,KAR1B,mBAQI8wB,EARJ,KASLC,IACE/T,EAASjF,KACTsZ,mBAAkB,OAACP,QAAD,IAACA,IAAYlV,EAAM0V,kBAXlC,4C,uDC7KP,gNA8CYtN,EAsCAH,EApFZ,S,SA8CYG,O,mCAAAA,I,6CAAAA,I,mCAAAA,I,yBAAAA,I,6CAAAA,I,qBAAAA,I,uBAAAA,I,uBAAAA,I,mCAAAA,I,oCAAAA,I,kDAAAA,I,0CAAAA,I,gCAAAA,I,wBAAAA,I,sCAAAA,I,oDAAAA,I,wCAAAA,I,4BAAAA,I,wBAAAA,I,oCAAAA,I,4BAAAA,I,4BAAAA,I,8BAAAA,I,gDAAAA,I,wDAAAA,I,8BAAAA,I,kEAAAA,I,8EAAAA,I,kFAAAA,I,wCAAAA,I,sCAAAA,I,iDAAAA,M,cAsCAH,O,uBAAAA,I,4BAAAA,M,KAiBL,IAKKmD,EAsBAK,EA3BCkK,EAAe,CAC1B,kBACA,gBACA,kBAyOK,SAASC,EACdzZ,EACAxL,GAEA,IACE,IAAIklB,EAnMD,SACL1Z,EACAxL,GAEA,IAEE,IAKMmlB,GAJJnlB,EAAYolB,gCAAgCxW,QAAQ,MAAQ,EACxD5O,EAAYolB,gCAAgC3xB,MAAM,KAAKqF,KAAK,KAC5DkH,EAAYolB,iCAEcvN,QAAQ,cAAe,eAEnDrH,EAAM,IAAIc,IAAI9F,GACd6Z,EACF7U,EAAI2O,SAASvQ,QAAQ,MAAQ,EACzB4B,EAAI2O,SAAS1rB,MAAM,KAAKqF,KAAK,KAC7B0X,EAAI2O,SACNmG,OAAmC1xB,EACnC2xB,EAAY,IAAIC,OAAOL,GAAgBM,KAAKJ,GAChD,GAAkB,OAAdE,EAAoB,CACtB,IAAIG,EAASH,EAAUG,YACR9xB,IAAX8xB,IACFJ,EAAeI,EAAM,cAGzB,QAAqB9xB,IAAjB0xB,EAA4B,CAC9B,IAAIK,EAAShC,YAAS,GAAD,OAAI3jB,EAAY6B,cAAhB,uBAAoD,CACvEqZ,aAAcoK,IAEhB,MAAO,CACLlb,KAAM0Q,EAAmBC,MACzBvK,IAAKmV,EACLzK,aAAcoK,GAGlB,OACA,MAAO/wB,GACP,QA6JmBqxB,CAAcpa,EAAMxL,GACnC6lB,EA/DD,SACLra,EACAxL,GAEA,IAEE,IAKMmlB,GAJJnlB,EAAY8lB,sCAAsClX,QAAQ,MAAQ,EAC9D5O,EAAY8lB,sCAAsCryB,MAAM,KAAKqF,KAAK,KAClEkH,EAAY8lB,uCAEcjO,QAC9B,qBACA,eAGErH,EAAM,IAAIc,IAAI9F,GACd6Z,EACF7U,EAAI2O,SAASvQ,QAAQ,MAAQ,EACzB4B,EAAI2O,SAAS1rB,MAAM,KAAKqF,KAAK,KAC7B0X,EAAI2O,SACN4G,OAAoCnyB,EACpCoyB,OAAiCpyB,EACjCwnB,OAA6BxnB,EAC7B2xB,EAAY,IAAIC,OAAOL,GAAgBM,KAAKJ,GAChD,GAAkB,OAAdE,EAAoB,CACtB,IAAIG,EAASH,EAAUG,YACR9xB,IAAX8xB,IACFK,EAAgBL,EAAM,GACtBM,EAAaN,EAAM,eACnBtK,EAASsK,EAAM,QAGnB,QACoB9xB,IAAlBmyB,QACenyB,IAAfoyB,QACWpyB,IAAXwnB,EACA,CACA,IAAIuK,EAAShC,YAAS,GAAD,OAAI3jB,EAAY6B,cAAhB,iBAA8C,CACjEokB,OAAQ7K,EACR8K,WAAYF,EACZG,cAAeJ,IAEjB,MAAO,CACL3b,KAAM0Q,EAAmBsL,YACzB5V,IAAKmV,EACLM,OAAQ7K,EACRiL,WAAYL,EACZM,cAAeP,GAGnB,OACA,MAAOxxB,GACP,QAUyBgyB,CAAoB/a,EAAMxL,GAC/CwmB,EAhHD,SACLhb,EACAxL,GAEA,IAEE,IAKMmlB,GAJJnlB,EAAYymB,mCAAmC7X,QAAQ,MAAQ,EAC3D5O,EAAYymB,mCAAmChzB,MAAM,KAAKqF,KAAK,KAC/DkH,EAAYymB,oCAEc5O,QAC9B,qBACA,eAGErH,EAAM,IAAIc,IAAI9F,GACd6Z,EACF7U,EAAI2O,SAASvQ,QAAQ,MAAQ,EACzB4B,EAAI2O,SAAS1rB,MAAM,KAAKqF,KAAK,KAC7B0X,EAAI2O,SACN6G,OAAiCpyB,EACjCwnB,OAA6BxnB,EAC7B2xB,EAAY,IAAIC,OAAOL,GAAgBM,KAAKJ,GAChD,GAAkB,OAAdE,EAAoB,CACtB,IAAIG,EAASH,EAAUG,YACR9xB,IAAX8xB,IACFM,EAAaN,EAAM,GACnBtK,EAASsK,EAAM,QAGnB,QAAmB9xB,IAAfoyB,QAAuCpyB,IAAXwnB,EAAsB,CACpD,IAAIuK,EAAShC,YAAS,GAAD,OAAI3jB,EAAY6B,cAAhB,iBAA8C,CACjEokB,OAAQ7K,EACR8K,WAAYF,IAEd,MAAO,CACL5b,KAAM0Q,EAAmB4L,SACzBlW,IAAKmV,EACLM,OAAQ7K,EACRiL,WAAYL,GAGhB,OACA,MAAOzxB,GACP,QAmEsBoyB,CAAiBnb,EAAMxL,GACzC4mB,EA7JR,SACEpb,EACAxL,GAEA,IAEE,IAKMmlB,GAJJnlB,EAAY6mB,+BAA+BjY,QAAQ,MAAQ,EACvD5O,EAAY6mB,+BAA+BpzB,MAAM,KAAKqF,KAAK,KAC3DkH,EAAY6mB,gCAEchP,QAC9B,qBACA,eAGErH,EAAM,IAAIc,IAAI9F,GACd6Z,EACF7U,EAAI2O,SAASvQ,QAAQ,MAAQ,EACzB4B,EAAI2O,SAAS1rB,MAAM,KAAKqF,KAAK,KAC7B0X,EAAI2O,SACN/D,OAA6BxnB,EAC7B2xB,EAAY,IAAIC,OAAOL,GAAgBM,KAAKJ,GAChD,GAAkB,OAAdE,EAAoB,CACtB,IAAIG,EAASH,EAAUG,YACR9xB,IAAX8xB,IACFtK,EAASsK,EAAM,IAGnB,QAAe9xB,IAAXwnB,EAAsB,CACxB,IAAIuK,EAAShC,YAAS,GAAD,OAAI3jB,EAAY6B,cAAhB,iBAA8C,CACjEokB,OAAQ7K,IAEV,MAAO,CACLhR,KAAM0Q,EAAmBgM,KACzBtW,IAAKmV,EACLM,OAAQ7K,GAGZ,OACA,MAAO7mB,GACP,QAoHkBwyB,CAAavb,EAAMxL,GACrC,OAAMklB,GACJ5wB,QAAQikB,MAAM2M,GACPA,GAEHW,GACJvxB,QAAQikB,MAAMsN,GACPA,GAEHW,GACJlyB,QAAQikB,MAAMiO,GACPA,GAEHI,GACJtyB,QAAQikB,MAAMqO,GACPA,QAET,EACA,MAAOryB,GACP,QAGG,SAASqmB,EACdpP,EACAxL,GAEA,IAEE,IAAIwQ,EAAM,IAAIc,IAAI9F,GAKlB,OAJcgF,EACX7X,WACA7E,cACAwV,WAAWtJ,EAAY6B,cAAc/N,eAU/BmxB,EAAgBzZ,EAAMxL,IAR7B1L,QAAQikB,MAAM,CAAE2C,aAAc1P,IACvB,CACLgF,IAAKA,EAAI7X,WACTyR,KAAM0Q,EAAmBG,SACzBC,aAAc1P,EACdwb,UAAU,IAKd,MAAOzyB,GAEP,OADAD,QAAQikB,MAAM,CAAE2C,aAAc1P,IACvB,CACLgF,IAAKmT,YAAS,GAAD,OAAI3jB,EAAY6B,cAAhB,uBAAoD,CAC/DqZ,aAAc1P,IAEhBpB,KAAM0Q,EAAmBE,SACzBE,aAAc1P,K,SAlSRiP,O,aAAAA,I,6BAAAA,I,iBAAAA,I,yBAAAA,I,kBAAAA,M,cAsBAK,O,iBAAAA,I,eAAAA,I,uBAAAA,I,6BAAAA,I,iBAAAA,I,uBAAAA,I,wBAAAA,M,oGClICmM,EAAW,SAItBC,EACAC,GAEI,IADJC,EACG,uDADU,CAAEC,SAAU,MAErBC,EAA6CJ,EAE7CC,IACFG,EAAc,kBACZJ,IAAaK,MAAK,SAAAC,GAAM,MAAK,CAAE75B,QAASw5B,EAAaK,SAGzD,IAAMC,EAAgBC,eAAKJ,GAE3B,OAAO,SAACjY,GAAD,OACL,cAAC,WAAD,CAAUgY,SAAUD,EAAKC,SAAzB,SACE,cAACI,EAAD,eAAmBpY,S,8BCgDlB,IAAKsY,EAAZ,kC,SAAYA,O,qCAAAA,I,2BAAAA,I,+BAAAA,I,qCAAAA,I,+BAAAA,I,uCAAAA,I,2BAAAA,I,yBAAAA,I,mCAAAA,I,uCAAAA,I,wCAAAA,I,0BAAAA,I,kCAAAA,I,8CAAAA,I,4CAAAA,I,gDAAAA,I,4CAAAA,I,8CAAAA,I,sBAAAA,I,kCAAAA,I,sCAAAA,I,4BAAAA,I,8BAAAA,I,kDAAAA,I,kDAAAA,I,sDAAAA,I,0CAAAA,I,8DAAAA,I,sDAAAA,I,kEAAAA,I,gCAAAA,I,4BAAAA,I,oCAAAA,I,oDAAAA,I,0CAAAA,I,+BAAAA,M,wLCzCL,SAASC,EAAWvY,GAAyB,IAEhDO,EAWEP,EAXFO,SACAzR,EAUEkR,EAVFlR,SAH+C,EAa7CkR,EATFoR,YAJ+C,MAIxC,QAJwC,IAa7CpR,EARF0K,eAL+C,MAKrC,OALqC,IAa7C1K,EAPFwY,aAN+C,MAMvC,SANuC,EAO/CpP,EAMEpJ,EANFoJ,KACAkI,EAKEtR,EALFsR,GACA9Q,EAIER,EAJFQ,MACAiY,EAGEzY,EAHFyY,OACA7Y,EAEEI,EAFFJ,KACGlG,EAZ4C,YAa7CsG,EAb6C,sFAc3CuR,EAAWC,wBACAC,EAAeZ,cAAxBrJ,QACFoK,EAAc,SAACjqB,GAInB,GAHIqY,EAAM6R,SACR7R,EAAM6R,QAAQlqB,GAEV2pB,EAAI,CACR,IAAIQ,EAAqB,kBAAPR,EAAkBA,EAAKS,YAAqBT,GAC9DC,EAASE,EAAW3G,SAASgH,MAI3BJ,OACKntB,IAAT6kB,OACI7kB,EACgB,kBAAT6kB,EACPvH,YAAYuH,GACZvH,YACGuH,EAAuBuI,KACvBvI,EAAuBpP,QAGhC,OAAOoP,EACL,cAAC9I,EAAD,CAAWE,MAAOA,EAAlB,SACE,cAAC,IAAD,CAAM4I,KAAMsI,EAAc+G,OAAQA,EAAlC,SACE,cAAC,IAAD,yBACEhV,UAAWC,kBACT1D,EAAMyD,UADO,iBAEH2O,qBAAW1H,GAFR,oBAE4B0H,qBACvChB,GAHW,iBAIHgB,qBAAWoG,KAEvB1pB,SAAUA,EACVkjB,eAAa,EACbH,QAAS,SAAAM,GACPA,EAAMuG,kBACN9G,EAAYO,KAEVzY,GAbN,aAeK6G,GAAsB,cAAC,IAAD,CAAMX,KAAI,OAAEA,QAAF,IAAEA,IAAQ,2BAKnD,cAACU,EAAD,CAAWE,MAAOA,EAAlB,SACE,cAAC,IAAD,yBACEiD,UAAWC,kBACT1D,EAAMyD,UADO,iBAEH2O,qBAAW1H,GAFR,oBAE4B0H,qBACvChB,GAHW,iBAIHgB,qBAAWoG,KAEvB3G,QAAS,SAAAM,GACPA,EAAMuG,kBACN9G,EAAYO,IAEdrjB,SAAUA,EACVkjB,eAAa,GACTtY,GAbN,aAeK6G,GAAsB,cAAC,IAAD,CAAMX,KAAI,OAAEA,QAAF,IAAEA,IAAQ,yBAM9C,SAASU,EAAT,GAKF,IAJHC,EAIE,EAJFA,SACAC,EAGE,EAHFA,MAIA,OAAIA,EAEA,cAAC,IAAD,CAASA,MAAOA,EAAhB,SACE,+BAAOD,MAIJ,mCAAGA,M,kMCjHGoY,G,WA2CAC,G,WAeAC,GA1DV,SAAUF,EACfrR,GADK,yEAO8B,OAP9B,SAOoC9C,YAAOsU,KAP3C,OAQ0B,OADzBC,EAPD,gBAQgCvU,YAAOjB,KARvC,UAQCD,EARD,QASDyV,EATC,iBAUH,OAVG,SAUGzX,YACJkG,EAAQwR,iBAAiB,CACvBje,KAAMuM,EAAO7F,QAAQ1G,KACrBiF,MAAOsH,EAAO7F,QAAQzB,MACtBzI,SAAU+P,EAAO7F,QAAQlK,SACzB0hB,UAAU,KAfX,OAkBH,OAlBG,UAkBG3X,YAAIkG,EAAQ0R,gBAAe,IAlB9B,oCAoBC5V,EApBD,iBAqBD,OArBC,UAqBKhC,YAAIkG,EAAQ2R,gBAAe,IArBhC,QAsBD,OAtBC,UAsBK3P,YAAM,KAtBX,QAuBD,OAvBC,UAuBKlI,YACJkG,EAAQ4R,mBAAmB,CACzB7hB,WAAY+P,EAAO7F,QAAQlK,SAC3BwD,KAAMuM,EAAO7F,QAAQ1G,KACrBiF,MAAOsH,EAAO7F,QAAQzB,MACtB+U,MAAM,KA5BT,gCAgCD,OAhCC,UAgCKzT,YACJkG,EAAQ4R,mBAAmB,CACzB7hB,WAAY+P,EAAO7F,QAAQlK,SAC3BwD,KAAMuM,EAAO7F,QAAQ1G,KACrBiF,MAAOsH,EAAO7F,QAAQzB,MACtB+U,MAAM,KArCT,wCA2CA,SAAU6D,EACftR,GADK,iEAK2B,OAL3B,SAKiC9C,YAAO6U,KALxC,mCAOH,OAPG,SAOG/X,YAAIkG,EAAQ8R,iBAAgB,IAP/B,OAQH,OARG,SAQG9P,YAAM,KART,OASH,OATG,UASGlI,YAAIkG,EAAQ+R,iBAAiBjS,EAAO7F,QAAQN,MAT/C,gCAWH,OAXG,UAWGG,YAAIkG,EAAQ+R,iBAAiBjS,EAAO7F,QAAQN,MAX/C,QAYH,OAZG,UAYGG,YAAIkG,EAAQgS,mBAAkB,IAZjC,wCAeA,SAAUX,IAAV,iEACL,OADK,SACC7L,YAAWxF,EAAQiS,cAAc1e,KAAM4d,GADxC,OAEL,OAFK,SAEC3L,YAAWxF,EAAQkS,eAAe3e,KAAM6d,GAFzC,uCC5DA,IAAMhoB,EAA4B,CACvC+oB,eAAgB,CACdrW,eAAe,EACfsW,cAAUr1B,EACVs1B,eAAWt1B,EACXgT,UAAU,EACVuiB,WAAW,EACXC,eAAe,GAEjBC,aAAc,CACZC,aAAa,EACbC,UAAU,EACVC,UAAU,EACVC,kBAAkB,EAClBC,oBAAgB91B,GAElB+1B,uBAAuB,EACvBC,gBAAgB,EAChBC,cAAe,CACbC,mBAAmB,EACnBZ,eAAWt1B,EACXq1B,cAAUr1B,EACVgT,cAAUhT,GAEZm2B,oBAAgBn2B,EAChBo2B,2BAAuBp2B,EACvBq2B,qBAAiBr2B,EACjBs2B,kBAAct2B,EACdu2B,gBAAiB,CACfC,gBAAgB,EAChB5Z,SAAK5c,IASHqqB,EAAQC,YAAY,CACxB9jB,KAAM,SACN6F,eACAke,SAAU,CACRkM,gBADQ,SACQtqB,EAAO4W,GACrB5W,EAAMipB,eAAerW,cAAgBgE,EAAO7F,SAE9CgY,cAJQ,SAIM/oB,EAAO4W,KACrB8R,mBALQ,SAMN1oB,EACA4W,GAOA5W,EAAMipB,eAAepiB,SAAW+P,EAAO7F,QAAQlK,SAC/C7G,EAAMipB,eAAeE,UAAYvS,EAAO7F,QAAQzB,MAChDtP,EAAMipB,eAAeC,SAAWtS,EAAO7F,QAAQ1G,KAC/CrK,EAAMipB,eAAerW,cAAgBgE,EAAO7F,QAAQsT,MAEtDkG,YAnBQ,SAmBIvqB,EAAO4W,GACjB5W,EAAMipB,eAAeC,SAAWtS,EAAO7F,SAEzCyZ,aAtBQ,SAsBKxqB,EAAO4W,GAClB5W,EAAMipB,eAAeE,UAAYvS,EAAO7F,SAE1C0Z,YAzBQ,SAyBIzqB,EAAO4W,GACjB5W,EAAMipB,eAAepiB,SAAW+P,EAAO7F,SAEzC0X,eA5BQ,SA4BOzoB,EAAO4W,GACpB5W,EAAMipB,eAAerW,cAAgBgE,EAAO7F,UAAW,EACvD/Q,EAAMipB,eAAeE,eAAYt1B,EACjCmM,EAAMipB,eAAeC,cAAWr1B,EAChCmM,EAAMipB,eAAepiB,UAAW,EAChC7G,EAAMipB,eAAeI,mBAAgBx1B,EACrCmM,EAAMipB,eAAeG,eAAYv1B,EACjCmM,EAAMspB,aAAe,CACnBC,aAAa,EACbC,UAAU,EACVC,UAAU,EACVC,kBAAkB,EAClBC,oBAAgB91B,GAElBmM,EAAM4pB,uBAAwB,EAC9B5pB,EAAMkqB,qBAAkBr2B,GAE1B20B,eA7CQ,SA6COxoB,EAAO4W,GACpB5W,EAAMspB,aAAaC,YAAc3S,EAAO7F,SAE1C2Z,kBAhDQ,SAgDU1qB,EAAO4W,GACvB5W,EAAMspB,aAAe,CACnBC,aAAa,EACbC,UAAU,EACVC,UAAU,EACVC,kBAAkB,EAClBC,oBAAgB91B,IAGpB82B,mBAzDQ,SAyDW3qB,EAAO4W,GACxB5W,EAAMspB,aAAaE,SAAW5S,EAAO7F,SAEvC6Z,mBA5DQ,SA4DW5qB,EAAO4W,GACxB5W,EAAMspB,aAAaG,SAAW7S,EAAO7F,SAEvC8Z,kBA/DQ,SA+DU7qB,EAAO4W,GACvB5W,EAAMspB,aAAaK,eAAiB/S,EAAO7F,SAE7C+Z,mBAlEQ,SAkEW9qB,EAAO4W,GACxB5W,EAAM4pB,sBAAwBhT,EAAO7F,SAEvCga,gBArEQ,SAqEQ/qB,EAAO4W,GACrB5W,EAAM6pB,eAAiBjT,EAAO7F,SAEhCia,yBAxEQ,SAyENhrB,EACA4W,GAEA5W,EAAMiqB,sBAAwBrT,EAAO7F,SAEvCka,gBA9EQ,SA8EQjrB,EAAO4W,GACrB5W,EAAMspB,aAAaI,iBAAmB9S,EAAO7F,SAE/Cma,qBAjFQ,SAiFalrB,EAAO4W,GAC1B5W,EAAM8pB,cAAcC,kBAAoBnT,EAAO7F,SAEjDoa,kBApFQ,SAoFUnrB,EAAO4W,GACvB5W,EAAMgqB,eAAiBpT,EAAO7F,SAEhCuX,iBAvFQ,SAwFNtoB,EACA4W,GAOA5W,EAAM8pB,cAAcC,kBAAoBnT,EAAO7F,QAAQwX,SACvDvoB,EAAM8pB,cAAcX,UAAYvS,EAAO7F,QAAQzB,MAC/CtP,EAAM8pB,cAAcZ,SAAWtS,EAAO7F,QAAQ1G,KAC9CrK,EAAM8pB,cAAcjjB,SAAW+P,EAAO7F,QAAQlK,UAEhDukB,mBArGQ,SAqGWprB,EAAO4W,GACxB5W,EAAM8pB,cAAgB,CACpBC,mBAAmB,EACnBZ,eAAWt1B,EACXq1B,cAAUr1B,EACVgT,cAAUhT,IAGdw3B,mBA7GQ,SA6GWrrB,EAAO4W,GACxB5W,EAAMkqB,gBAAkBtT,EAAO7F,SAEjCua,gBAhHQ,SAgHQtrB,EAAO4W,GACrB5W,EAAMmqB,aAAevT,EAAO7F,SAE9Bwa,eAnHQ,SAmHOvrB,EAAO4W,GACpB5W,EAAMipB,eAAeG,UAAYxS,EAAO7F,SAE1Cya,mBAtHQ,SAsHWxrB,EAAO4W,GACxB5W,EAAMipB,eAAeI,cAAgBzS,EAAO7F,SAE9CiY,eAzHQ,SA0HNhpB,EACA4W,KAEFgS,gBA7HQ,SA6HQ5oB,EAAO4W,GACrB5W,EAAMoqB,gBAAgBC,eAAiBzT,EAAO7F,UAAW,EACzD/Q,EAAMoqB,gBAAgB3Z,SAAM5c,GAE9Bg1B,iBAjIQ,SAiIS7oB,EAAO4W,GACtB5W,EAAMoqB,gBAAgB3Z,IAAMmG,EAAO7F,SAErC+X,kBApIQ,SAoIU9oB,EAAO4W,GACvB5W,EAAMoqB,gBAAgBC,eAAiBzT,EAAO7F,UAAW,MAKvC0a,EAAkBvN,EAA3BpH,QAEF4U,EAAiB,WAG5B,OAFAtL,YAAiB,CAAE9yB,IAAK4wB,EAAM7jB,KAAMgmB,QAASnC,EAAMmC,UACnDC,YAAc,CAAEhzB,IAAK4wB,EAAM7jB,KAAMkmB,KAAM4H,IAChC,CAAErR,QAASoH,EAAMpH,W,yGC/LnB,SAAS6U,EAAT,GAAgD,IAAjC9b,EAAgC,EAAhCA,SAAaP,EAAmB,4BACpD,OAAO,cAAC,IAAD,2BAAYA,GAAZ,aAAoBO,O,6BCP7B,8tBAIM9P,EAAc,SAACC,GACnB,OAAOA,EAAM4rB,QAAU1rB,KAEZ2rB,EAAuBzrB,YAClC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMipB,kBAEJpW,EAAsBzS,YACjC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMipB,eAAerW,iBAEnBkZ,EAAiB1rB,YAC5B,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMipB,eAAeC,YAEnBvW,EAA0BvS,YACrC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMipB,eAAepiB,YAEnBklB,EAAsB3rB,YACjC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMipB,eAAeE,aAMnB6C,GAJqB5rB,YAChC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMspB,gBAEgBlpB,YAC/B,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMspB,aAAaC,gBAEjB0C,EAAwB7rB,YACnC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMspB,aAAaE,YAEjB0C,EAAwB9rB,YACnC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMspB,aAAaG,YAEjBrB,EAA2BhoB,YACtC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM4pB,yBAEJuC,EAAuB/rB,YAClC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM6pB,kBAUJuC,GARyBhsB,YACpC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMspB,aAAaI,oBAEStpB,YACrC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM8pB,cAAcC,qBAEI3pB,YACjC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAM8pB,kBAEJuC,EAAuBjsB,YAClC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMspB,aAAaK,kBAEjB2C,EAAuBlsB,YAClC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMgqB,kBAEJuC,EAAsBnsB,YACjC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMkqB,mBAEJsC,EAAqBpsB,YAChC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMmqB,gBAEJsC,EAA8BrsB,YACzC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMiqB,yBAEJyC,EAA4BtsB,YACvC,CAACqsB,IACD,SAAAhM,GAAU,OAAI,SAACkM,GACb,YAAmB94B,IAAf4sB,OACF,EACSkM,IAAelM,EAAWpmB,KAC5BomB,EAAWA,gBAElB,MAIOmM,EAAoBxsB,YAC/B,CAACyrB,IACD,SAAA7rB,GAAK,OAAIA,EAAMopB,aAEJyD,EAAwBzsB,YACnC,CAACyrB,IACD,SAAA7rB,GAAK,OAAIA,EAAMqpB,iBAEJV,EAAuBvoB,YAClC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMoqB,gBAAgBC,kBAEpByC,EAAsB1sB,YACjC,CAACL,IACD,SAAAC,GAAK,OAAIA,EAAMoqB,gBAAgB3Z,Q,8BC3G1B,SAAS1D,EACdpW,GAEA,OAAiB,OAAVA,QAA4B9C,IAAV8C,EAGpB,SAASo2B,EAAoBt5B,GAClC,OAAa,OAANA,QAAoBI,IAANJ,GAAyB,KAANA,GAAyB,KAAbA,EAAEwR,OAEjD,SAAS+nB,EAA+Bv5B,GAC7C,OAAOs5B,EAAoBt5B,QAAKI,EAAYJ,EAEvC,SAASw5B,EAAkBx5B,GAChC,OAAa,OAANA,QAAoBI,IAANJ,EAAkB,KAAOA,EAAEM,cAblD,8OAgBO,IAAM2a,EAAY,SAAIlW,GAC3B,cAAOA,QAAP,IAAOA,IAAO,MAIH00B,EAAe,SAAI10B,GAC9B,YAAe3E,IAAR2E,GAMF,SAAS20B,EAAex2B,GAC7B,OAAc,OAAVA,QAA4B9C,IAAV8C,EACb,KAEY,kBAAVA,EACLb,MAAMqC,SAASxB,IACV,KAEAwB,SAASxB,GAEQ,kBAAVA,EACTA,EAEA,O,8BC1CX,kPAQYy2B,EARZ,uBA8EO,SAASC,EACdC,EACAC,GAEA,GAAMD,GAAWA,EAAQE,oBAAqB,CAC5C,IAAI74B,EAAS24B,EAAQE,oBAAoBvuB,MAAK,SAAAwuB,GAC5C,OAAOA,EAAGF,cAAgBA,KAE5B,YAAkB15B,IAAXc,IAA2C,IAApBA,EAAO+4B,SAEvC,OAAO,EAWF,SAASC,EACdL,EACA7F,GAEA,SAAM6F,IAAWA,EAAQhtB,WACvB,OAAOgtB,QAAP,IAAOA,OAAP,EAAOA,EAAShtB,QAAQG,SAASgnB,IAI9B,SAASmG,EACdN,EACAO,EACAC,GAEA,GAAMR,GAAWA,EAAQ/pB,yBAAqC1P,IAAfg6B,EAA0B,CACvE,IAAMp6B,EAAI65B,EAAQ/pB,mBAAmBwqB,IAAgBF,IACrD,QAAUh6B,IAANJ,EAAiB,CACnB,QAA8BI,IAA1Bi6B,EAAqC,CACvC,IAAMtjB,EAAK4iB,EAAeU,GAC1B,OAAOr6B,EAAEu6B,WAAWvtB,SAAS+J,GAE7B,OAAO,GAIb,OAAO,EAEF,SAASyjB,EACdX,EACAO,EACAC,GAEA,GAAMR,GAAWA,EAAQ/pB,yBAAqC1P,IAAfg6B,EAA0B,CACvE,IAAMp6B,EAAI65B,EAAQ/pB,mBAAmBwqB,IAAgBF,IACrD,QAAUh6B,IAANJ,EAAiB,CACnB,QAA8BI,IAA1Bi6B,EAAqC,CACvC,IAAMtjB,EAAK4iB,EAAeU,GAC1B,OAAOr6B,EAAEu6B,WAAWvtB,SAAS+J,KAAsB,IAAf/W,EAAE+P,SAEtC,OAAsB,IAAf/P,EAAE+P,UAIf,OAAO,EAEF,SAAS0qB,EACdpvB,EACAqvB,EACAC,GAEA,GACgB,OAAdD,GACa,OAAbrvB,IACCA,EAASiE,gBACPjE,EAASiE,gBAAkBjE,EAASiE,eAAenN,OAAS,EAE/D,OAAO,EAiCT,QA7BIkJ,EAASiE,gBACXjE,EAASiE,eAAenN,OAAS,GACjCkJ,EAASiE,eAAeuC,MAAK,SAAAhQ,GAAC,OAAIA,IAAM64B,KA6BrC,SAASE,EACdvvB,EACAhR,GACC,IAAD,IACMsU,EAAY,iBAAGtD,QAAH,IAAGA,GAAH,UAAGA,EAAU8C,gBAAb,aAAG,EAAoBS,6BAAvB,QAAgD,EAC9DC,EACO,OAATxU,QAA0B+F,IAAT/F,EACbW,IAAU+G,mBAAmB,IAAIe,MACjC9H,IAAU+G,mBAAmB1H,GAC7ByU,EAAoBD,EAAYE,oBAKtC,OAJkB/T,IAAU0C,WAC1BmR,EACAF,EAAeG,GAKZ,SAAS+rB,EACdC,GAEA,OAAQA,GACN,KAAKC,IAAkBC,aACvB,KAAKD,IAAkBE,qBACrB,MAAO,eACT,KAAKF,IAAkBG,eACvB,KAAKH,IAAkBI,kBACrB,MAAO,YACT,KAAKJ,IAAkBK,eACrB,MAAO,iBACT,KAAKL,IAAkBM,aACrB,MAAO,eACT,KAAKN,IAAkBO,WACrB,MAAO,aACT,KAAKP,IAAkBQ,eACrB,MAAO,UACT,KAAKR,IAAkBS,gBACrB,MAAO,kBACT,KAAKT,IAAkBU,YACrB,MAAO,cACT,QACE,S,SA9NM9B,O,yBAAAA,I,qCAAAA,I,6BAAAA,I,+BAAAA,I,2BAAAA,I,qBAAAA,I,mCAAAA,I,gCAAAA,M,sICLCtoB,EAAb,WAEE,WAAY9F,GAAuB,yBADnCF,cACkC,EAChCvL,KAAKuL,SAAWE,EAHpB,0CAKE,SAAc1R,GACZ,GAAIiG,KAAKuL,SAASlJ,OAAS,EAAG,CAC5B,IAAIpI,EAAM+F,KAAKuL,SAASG,MAAK,SAACtI,EAAOuI,GAAR,OAAkBvI,EAAM8I,OAASnS,KAC9D,YAAeuG,IAARrG,EAAoB,KAAOA,EAAI6R,MAEtC,OAAO,OAVb,uBAcE,SAAiB/R,GACf,IAAI6hC,EAAWjqB,IAAgB5X,GAC3B6M,EAAM5G,KAAK67B,OAAOD,EAASv2B,YAC/B,OAAe,OAARuB,EAAe,GAAKA,IAjB/B,8BAmBE,SAAwB7M,GACtB,IAAI6hC,EAAWjqB,IAAgB5X,GAC/B,OAAOiG,KAAK67B,OAAOD,EAASv2B,cArBhC,+BAuBE,SAAyBtL,GACvB,OAAOiG,KAAK67B,OAAO9hC,KAxBvB,6BA0BE,SAAuBA,GACrB,IAAI6M,EAAM5G,KAAK87B,UAAU/hC,GACzB,MAAe,KAAR6M,GAA2C,SAAtBA,EAAIpG,gBA5BpC,wBA8BE,SAAkBzG,GAChB,IAAI6M,EAAM5G,KAAK67B,OAAO9hC,GACtB,OAAe,OAAR6M,GAA6C,SAAtBA,EAAIpG,gBAhCtC,gCAkCE,SAA0BzG,GACxB,IAAI6M,EAAM5G,KAAK67B,OAAO9hC,GACtB,OAAe,OAAR6M,EAAe,KAA6B,SAAtBA,EAAIpG,gBApCrC,qBAsCE,SAAezG,EAAagiC,GAC1B,IAAIn1B,EAAM5G,KAAK67B,OAAO9hC,GACtB,OAAe,OAAR6M,EAAem1B,EAASC,aAAeD,EAASn1B,KAxC3D,6BA0CE,SAAuB7M,EAAagiC,GAClC,IAAIn1B,EAAM5G,KAAK67B,OAAO9hC,GACtB,OAAe,OAAR6M,EAAe,KAAOm1B,EAASn1B,OA5C1C,M,+BCJA,0FAGO,SAASqY,IAEd,OAAOgd,EADmBC,cAAlBD,iBAGH,SAASE,IACdn7B,QAAQikB,MAAR,oCACwBmX,qBADxB,+BAEiBA,cAFjB,kCAGoBA,iBAHpB,8BAIgBA,aAJhB,8BAKgBA,aALhB,iCAMmBA,gBANnB,0BAOYA,SAPZ,6BAQeA,YARf,+BASiBA,cATjB,gCAUkBA,eAVlB,Y,qSC2FK,SAASC,EAAT,GA8CyB,IAAD,EA7C7BC,EA6C6B,EA7C7BA,MACAC,EA4C6B,EA5C7BA,SA4C6B,IA3C7BC,qBA2C6B,MA3Cb,SAAA17B,GAAO,OAAIA,GA2CE,EA1C7BsC,EA0C6B,EA1C7BA,MACAq5B,EAyC6B,EAzC7BA,SACAtP,EAwC6B,EAxC7BA,KAEA1G,GAsC6B,EAvC7BiW,KAuC6B,EAtC7BjW,SACAkW,EAqC6B,EArC7BA,OACAC,EAoC6B,EApC7BA,iBACAC,EAmC6B,EAnC7BA,MAmC6B,IAlC7BC,iBAkC6B,SAjC7BjlB,EAiC6B,EAjC7BA,eACAhN,EAgC6B,EAhC7BA,SACAiR,EA+B6B,EA/B7BA,KACAihB,EA8B6B,EA9B7BA,cACA9lB,EA6B6B,EA7B7BA,GACAsJ,EA4B6B,EA5B7BA,OACAyc,EA2B6B,EA3B7BA,SACAr0B,EA0B6B,EA1B7BA,WACAs0B,EAyB6B,EAzB7BA,UACAzd,EAwB6B,EAxB7BA,UACAjD,EAuB6B,EAvB7BA,MACS2gB,EAsBoB,EAtB7BC,QACAC,EAqB6B,EArB7BA,SACAC,EAoB6B,EApB7BA,kBACAC,EAmB6B,EAnB7BA,qBACAC,GAkB6B,EAlB7BA,iBACAC,GAiB6B,EAjB7BA,mBACAC,GAgB6B,EAhB7BA,WACAC,GAe6B,EAf7BA,UAe6B,KAd7BC,sBAc6B,WAb7BC,GAa6B,EAb7BA,aAa6B,KAZ7BC,mBAY6B,WAX7BC,GAW6B,EAX7BA,aACAC,GAU6B,EAV7BA,cACAC,GAS6B,EAT7BA,mBACAC,GAQ6B,EAR7BA,cACAC,GAO6B,EAP7BA,gBACAC,GAM6B,EAN7BA,sBACAC,GAK6B,EAL7BA,qBACAC,GAI6B,EAJ7BA,YACAC,GAG6B,EAH7BA,YACAC,GAE6B,EAF7BA,aACGxiB,GAC0B,qmBACrBvH,GAAMgqB,cAANhqB,EACFnB,GAAW4L,cACXwf,GAAUC,cACVC,GAAaC,cACbC,GAAWpjB,SAAkB,MAE/BqjB,GAAYnC,EAPa,GAQLlhB,WAAeqjB,IARV,qBAQtBhO,GARsB,MAQhBiO,GARgB,SASCtjB,WAE5B,IAX2B,qBAStB3a,GATsB,MASbk+B,GATa,SAYOvjB,gBACTnb,IAAzBg9B,EAAqC,KAAOA,GAbjB,qBAYtB2B,GAZsB,MAYVC,GAZU,SAeMzjB,gBACvBnb,IAAV8C,GAAiC,OAAVA,GAhBI,qBAetB+7B,GAfsB,MAeTC,GAfS,SAkBW3jB,YACtC,GAnB2B,qBAkBtB4jB,GAlBsB,MAkBRC,GAlBQ,MAqB7BC,aAAiB,WACbjB,IAAeA,GAAW,OAAC3B,QAAD,IAACA,SAE/B,IAAM6C,GAAmB,SACvBtR,GAEAA,EAAMsG,OAAOjU,SACb2N,EAAMsG,OAAOiL,kBAAkB,EAAGvR,EAAMsG,OAAOpxB,MAAMf,QACrDi9B,QAAgBh/B,GAChBU,QAAQhG,IAAI,uBAEdygB,aAAgB,WACd,OAAO,kBAAMikB,aAAab,GAASllC,YAClC,IAlC0B,OAmCC8hB,WAAA,OAAwByhB,QAAxB,IAAwBA,MAnCzB,qBAmCtBC,GAnCsB,MAmCbwC,GAnCa,MAqC7BlkB,aAAgB,gBACOnb,IAAjB48B,GACFyC,GAAWzC,KAEZ,CAACA,IACJ,IAAM0C,GAAS9O,UAAqBxwB,IAAZQ,IAA6C,KAAb,OAAPA,SAAO,IAAPA,QAAA,EAAAA,GAASuB,SACpD6c,GAAoBC,sBAAYC,KAChCC,GAAgBF,sBAAYG,KAC5BC,GAAgBlM,IAAagM,KAAkBH,GAuCrD,OArCAzD,aAAgB,WACd,IAAIokB,GAAS,EACb,GAAKD,GAwBL,OArBA,sBAAC,gCAAAz+B,EAAA,mEAEO0+B,EAFP,wBAGKF,IAAW,GAHhB,SAI+BpD,EAAS0C,GAAYt2B,GAJpD,OAIWm3B,EAJX,OAKW3iB,EAAW4iB,YAAwBD,GACnCE,EAAcC,YAA0B,CAC5C9iB,WACAtF,iBACArD,OAGFwqB,GAAWgB,GACXL,IAAW,GAbhB,0DAgBGX,GAAW,IACXW,IAAW,GAjBd,yDAAD,GAqBO,WACLE,GAAS,KAEV,CAAChoB,EAAgB+nB,GAAQrD,EAAU5zB,EAAYs2B,GAAYzqB,KAE9DiH,aAAgB,WACTqV,IACHkO,QAAW1+B,KAEZ,CAACwwB,KAGF,cAACoP,EAAA,EAAD,CACEjpB,GAAIA,GAAM,oBAGV6Z,KAAMA,KAAQ,EACdiM,cAAeA,GAAiB,aAChClyB,SAAUA,EACVs1B,OAAQ,YACLvD,GAAoBoC,QAAW1+B,IAC/B29B,IAAiBiB,GAAc,MAChCH,IAAQ,GACNT,IAAeA,IAAY,GAC3BviB,GAAMqkB,cAAgBrkB,GAAMqkB,gBAEhCC,QAAS,WACPnB,GAAc,MACdH,IAAQ,GACNT,IAAeA,IAAY,GAC7BqB,IAAW,IAEblD,SAAU,SAACvO,EAAO9qB,EAAOk9B,EAAQC,IAEpB,MAATn9B,QACsB9C,KAArB,OAAC8C,QAAD,IAACA,OAAD,EAACA,EAAaqC,MACsC,KAAnD,OAAErC,QAAF,IAAEA,OAAF,EAAEA,EAAoCyH,aAExCq0B,GAAc,MACN,OAARzC,QAAQ,IAARA,KAAWr5B,GACXg8B,QAAsB9+B,IAAV8C,GAAiC,OAAVA,KAGvCo9B,UAAU,EACVC,cAAe,SAACvS,EAAOwS,EAAeJ,GAEpC,GADAtB,QAAW1+B,GACI,UAAXggC,EAAoB,CACtB,IAAIr7B,EACAy7B,GAAmC,OAAlBA,EACfA,EAAcxQ,YACdwQ,EACNxB,GAAcj6B,QACY3E,IAAtB+8B,GACFA,EAAkBp4B,KAIxB43B,MAAOA,EACP8D,kBAAmB,SAAC7oB,EAAQ1U,GAAT,YACK9C,KAAtB,OAACwX,QAAD,IAACA,OAAD,EAACA,EAAcrS,UACMnF,KAArB,OAAC8C,QAAD,IAACA,OAAD,EAACA,EAAaqC,MACd,OAACqS,QAAD,IAACA,OAAD,EAACA,EAAcrS,OAAf,OAAuBrC,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAaqC,KAEtCm7B,kBAAmB,SAAA9oB,GAAM,8BACrBA,QADqB,IACrBA,OADqB,EACrBA,EAAqCjN,gBADhB,UAGzBg2B,eAAgB,SAAA/oB,GACd,OAAM0lB,GACGA,GAAmB1lB,GAE1B,UAAOA,EAAO5L,YAAd,QAAsBsI,GAAEjb,IAAaunC,IAD/B,IAAD,GAITC,aAAc,SAACjpB,EAAQrL,GAAT,OChSb,SAA6Bu0B,EAAMC,GAExC,IAAMC,EAAUC,IAAMH,EAAMC,GACtBG,EAAQ3+B,IAAMu+B,EAAME,GAE1B,OACE,+BACGE,EAAM39B,KAAI,SAAC49B,EAAM11B,GAAP,OACT01B,EAAKJ,UACH,iCAAqBI,EAAKL,MAAbr1B,GAEb,+BAAmB01B,EAAKL,MAAbr1B,QDsRb21B,CACI/D,GAAmBA,GAAiBzlB,GAAUA,EAAO5L,KACvDO,EAAM80B,aAGVzgC,QAAO,UAAGA,UAAH,QAAkC,GACzCq9B,sBAAuBA,GAKvB3B,cAAeA,EACfW,QAASA,GACT/5B,MAAK,OAAEA,QAAF,IAAEA,IAAS,KAChBq7B,QAAS,CACP+C,KAAM/hB,kBAAKgf,GAAQ+C,KAAMjiB,GAAgB,iBAAcjf,GACvDmhC,IAAKhD,GAAQgD,IACbC,aAAcjD,GAAQiD,aACtBC,UAAWlD,GAAQkD,UACnBC,MAAOnD,GAAQmD,MACfC,aAAcpD,GAAQoD,aACtBC,aAAcrD,GAAQqD,aACtBC,eAAgBtD,GAAQsD,eACxBC,eAAgBvD,GAAQuD,eACxBC,mBAAoBxD,GAAQwD,mBAC5BC,MAAOzD,GAAQyD,MACfC,QAAS1D,GAAQ0D,QACjBhF,QAASsB,GAAQtB,QACjBiF,UAAW3D,GAAQ2D,UACnBtqB,OAAQ2mB,GAAQ3mB,OAChBuqB,WAAY5D,GAAQ4D,WACpBC,QAAS7D,GAAQ6D,SAEnBxF,UAAWA,EACXtd,UAAWC,kBAAKD,EAAWmf,GAAW4D,YACtC3F,iBAAkBA,EAClB4F,OAAM,OAAEzmB,SAAF,IAAEA,QAAF,EAAEA,GAAOymB,OACfrV,KAAMA,EACNsV,UAAW,cAAC,IAAD,CAAM9mB,KAAK,eAAewR,KAAK,OAC1CuV,UAAW,cAAC,IAAD,CAAM/mB,KAAK,eAAewR,KAAK,OAC1CiQ,SAAUA,EACVa,cAAeA,KAAkB5qB,GACjCsvB,YAAa,SAAAvtB,GAAM,eACjB,cAACwtB,EAAA,EAAD,2BACMxtB,GADN,IAEEknB,MAAOA,EACPQ,UAAWA,EACX3P,KAAMA,EACN1G,QAASA,GAAW,WACpB3f,KAAMiV,GAAMjV,KACZ+7B,YAAW,UAAE9mB,GAAM8mB,mBAAR,QAAuBruB,GAAEjb,IAAaupC,WACjD7hC,MAAO8a,GAAM9a,MACbsf,OAAQA,EACRyc,SAAUA,EACV+F,WAAYhnB,GAAMgnB,WAElBrF,UAAWA,GACXsF,QAAS,SAAA9U,GACPwR,aAAab,GAASllC,SAEpB+jC,IACU,OAAVt6B,QACU9C,IAAV8C,GACA66B,IACAoB,KAEAR,GAASllC,QAAUspC,WAAWzD,GAAkB,IAAKtR,KAGzDuP,WAAU,uCACLroB,EAAOqoB,YACPA,IAFK,IAGR,aAAa,GAAb,OACEnB,OAAQh8B,EAAY28B,GAAwB,gBAK9C1gB,MAAOA,IAET2mB,WAAU,yBAERzE,QAAS,CACP+C,KAAM/hB,kBAAKF,GAAgB,iBAAcjf,KAExC8U,EAAO8tB,YALF,IAMRpB,aACE,eAAC,WAAD,WACG/lB,GAAM9a,MACNk8B,GACC,cAACgG,EAAA,EAAD,CACEvnB,MAAM,UACNuR,KAAsB,UAAhB/X,EAAO+X,KAAmB,GAAK,GACrC0P,MAAO,CACLuG,SAAU,WACVC,MAAO,GACPC,IAAK,qBAGPxnB,EACF,cAACynB,EAAA,EAAD,CACEhnB,MAAOT,EACP0D,UAAWC,kBAAKkf,GAAW6E,UAAZ,mBACZ7E,GAAW8E,cACVtE,KAAgBvC,GAFL,cAGZ+B,GAAW+E,gBACTvE,IAAevC,GAJL,MAOf,KACHxnB,EAAO8tB,WAAWpB,sBAM7BnE,cAAeA,GACfC,aAAcA,GACdC,WAAYA,GACZC,aAAcA,GACdC,cAAeA,GACfC,mBAAoBA,GACpBE,gBAAiBA,GACjBG,YAAaA,GACbD,qBAAsBA,GACtBG,aAAcA,O,6BEjab,IAAKpqB,EAAZ,kC,SAAYA,O,qBAAAA,I,mBAAAA,I,uFAAAA,I,6BAAAA,I,qBAAAA,I,6EAAAA,I,+CAAAA,I,mFAAAA,I,mDAAAA,I,iDAAAA,I,kEAAAA,I,sBAAAA,I,kBAAAA,I,4BAAAA,I,kCAAAA,I,sBAAAA,I,kCAAAA,I,sBAAAA,I,4BAAAA,I,gCAAAA,I,kBAAAA,I,wBAAAA,I,8CAAAA,I,4BAAAA,I,8BAAAA,I,sCAAAA,I,sCAAAA,I,sCAAAA,I,8BAAAA,I,4BAAAA,I,kDAAAA,I,8BAAAA,I,sCAAAA,I,8BAAAA,I,gCAAAA,I,0BAAAA,I,0BAAAA,I,4BAAAA,I,0DAAAA,I,wCAAAA,I,cAAAA,I,4BAAAA,I,8DAAAA,I,8CAAAA,I,oDAAAA,I,wDAAAA,I,wBAAAA,I,sBAAAA,I,4CAAAA,I,8CAAAA,I,gCAAAA,I,0BAAAA,I,oCAAAA,I,wBAAAA,I,wCAAAA,I,kDAAAA,I,oCAAAA,I,0EAAAA,I,kDAAAA,I,8BAAAA,I,8BAAAA,I,4CAAAA,I,8BAAAA,I,wBAAAA,I,sBAAAA,I,8BAAAA,I,8CAAAA,I,8BAAAA,I,gCAAAA,I,wBAAAA,I,wCAAAA,I,0CAAAA,I,wBAAAA,I,wCAAAA,I,4BAAAA,I,oCAAAA,I,kEAAAA,I,sCAAAA,I,kCAAAA,I,0CAAAA,I,4CAAAA,I,oBAAAA,I,wCAAAA,I,sBAAAA,I,kCAAAA,I,wBAAAA,I,wCAAAA,I,oBAAAA,I,kBAAAA,I,gCAAAA,I,kGAAAA,I,sDAAAA,I,8DAAAA,I,oDAAAA,I,sDAAAA,I,0CAAAA,I,8CAAAA,I,oDAAAA,I,2CAAAA,I,iEAAAA,I,+BAAAA,I,uCAAAA,I,yBAAAA,I,+EAAAA,I,qDAAAA,I,yCAAAA,I,yDAAAA,I,6CAAAA,I,yDAAAA,I,uBAAAA,I,uCAAAA,I,2CAAAA,I,yDAAAA,I,2DAAAA,I,2CAAAA,I,iEAAAA,I,uEAAAA,I,qCAAAA,I,mBAAAA,I,2BAAAA,I,2BAAAA,I,yBAAAA,I,yBAAAA,I,6CAAAA,I,yBAAAA,I,mCAAAA,I,mCAAAA,I,2BAAAA,I,mCAAAA,I,+BAAAA,I,mCAAAA,I,6CAAAA,I,+CAAAA,I,iDAAAA,I,qCAAAA,I,6BAAAA,I,qCAAAA,I,mDAAAA,I,2BAAAA,I,2FAAAA,I,2DAAAA,I,qGAAAA,I,2CAAAA,I,6CAAAA,I,2CAAAA,I,yBAAAA,I,yDAAAA,I,yCAAAA,I,2CAAAA,I,yDAAAA,I,2CAAAA,I,qDAAAA,I,+CAAAA,I,yDAAAA,I,yCAAAA,I,uEAAAA,I,mDAAAA,I,yBAAAA,I,mCAAAA,I,+DAAAA,I,6CAAAA,I,iFAAAA,I,yEAAAA,I,+CAAAA,I,+BAAAA,I,+CAAAA,I,6DAAAA,I,+BAAAA,I,iDAAAA,I,2CAAAA,I,iDAAAA,I,+DAAAA,I,+BAAAA,I,4CAAAA,M,+HCkBL,SAASwvB,EAAT,GAQY,IAPjBrnB,EAOgB,EAPhBA,SAOgB,IANhBsnB,kBAMgB,MANH,OAMG,EALhBrnB,EAKgB,EALhBA,MACAsnB,EAIgB,EAJhBA,UAIgB,IAHhBC,aAGgB,SAFhBC,EAEgB,EAFhBA,YACGhoB,EACa,mFAChB,OACE,cAAC,IAAD,yBACE+nB,MAAOA,EACPrF,QAAS,CAAEuF,OAAO,QAAD,OAAU7V,YAAWyV,KACtCG,YAAaA,EACbxnB,MACIsnB,GAAgBtnB,GAAmB,KAAVA,EACzB,sBAAKiD,UAAW,UAAhB,YACKqkB,GACD,cAAC,IAAD,CAAM1W,KAAK,QAAQwB,MAAI,EAAC/S,MAAO,UAA/B,SACGioB,IAGL,cAAC,IAAD,CAAM1W,KAAK,QAAQvR,MAAO,UAA1B,SACGW,OAIL,IAGAR,GApBN,aAsBGO,O,gCC5CA,IAAK2e,EANZ,kC,SAMYA,O,+BAAAA,I,+CAAAA,I,mCAAAA,I,mCAAAA,I,+BAAAA,I,2BAAAA,I,mCAAAA,I,sCAAAA,I,0CAAAA,I,+BAAAA,M,uCCNL,IAAKT,EAAZ,kC,SAAYA,O,yBAAAA,I,uCAAAA,I,uBAAAA,I,iCAAAA,I,+BAAAA,I,uBAAAA,I,2BAAAA,I,+BAAAA,I,iBAAAA,I,iBAAAA,I,sBAAAA,I,8BAAAA,I,wBAAAA,I,gBAAAA,I,sBAAAA,I,wBAAAA,I,oBAAAA,I,gBAAAA,I,kCAAAA,I,0DAAAA,I,sCAAAA,I,sBAAAA,I,gBAAAA,I,0BAAAA,I,0BAAAA,I,gCAAAA,I,wBAAAA,I,oBAAAA,I,wBAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,8BAAAA,I,8BAAAA,I,8BAAAA,I,8BAAAA,I,8BAAAA,I,8BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,oCAAAA,I,oCAAAA,I,oCAAAA,I,oCAAAA,I,oCAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,0BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,4BAAAA,I,kDAAAA,I,sCAAAA,I,sCAAAA,I,0BAAAA,I,2BAAAA,I,+BAAAA,I,yCAAAA,I,mCAAAA,I,mBAAAA,I,mCAAAA,I,mCAAAA,I,yCAAAA,I,uBAAAA,I,qCAAAA,I,yBAAAA,I,uCAAAA,I,+BAAAA,I,qCAAAA,I,mCAAAA,I,mCAAAA,I,mCAAAA,I,qCAAAA,I,qBAAAA,I,iCAAAA,I,yBAAAA,I,yCAAAA,I,gBAAAA,M,mCCAL,IAAKyJ,EAAZ,kC,SAAYA,O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jC,kBAAM,mCACN,SAAAO,GAAM,OAAIA,EAAOutW,uBCFNC,GAAoB/tW,aAC/B,kBAAM,oCACN,SAAAO,GAAM,OAAIA,EAAOytW,iB,UCINC,GAAiBjuW,aAC5B,kBAAM,oCACN,SAAAO,GAAM,OAAIA,EAAO2tW,sBCFNC,GAAwBnuW,aACnC,kBAAM,oCACN,SAAAO,GAAM,OAAIA,EAAO4tW,yBCRNC,GAAYpuW,aACvB,kBAAM,0DACN,SAAAO,GAAM,OAAIA,EAAO6tW,aCINC,GAA8BruW,aACzC,kBAAM,oCACN,SAAAO,GAAM,OAAIA,EAAO8tW,+BCFNlV,GAA4Bn5V,aACvC,kBAAM,6CACN,SAAAO,GAAM,OAAIA,EAAO44V,6BCHNmV,GAA0BtuW,aACrC,kBAAM,mCACN,SAAAO,GAAM,OAAIA,EAAO+tW,2B,oBCDNC,GAAqBvuW,aAChC,kBAAM,yDACN,SAAAO,GAAM,OAAIA,EAAOguW,sB,ugEC6XnBC,KAAQzkY,IAEN0kY,gBACAC,eACAC,YACAC,UACAC,WACAC,UACAC,oBACAC,gBACAC,UACAC,gBACAC,cACAC,iBACAC,cACAC,oBACAC,UACAC,YACAC,cACAC,iBACAC,eACAC,cACAC,iBACAC,eACAC,uBACAC,SACAC,WACAC,YACAC,iBACAC,iBACAC,WACAC,YACAC,qBACAC,uBACAC,WACAC,iBACAC,UACAC,yBACAC,WACAC,iBACAC,iBACAC,eACAC,UACAC,YACAC,WACAC,WACAC,gBACAC,WACAC,cACAC,UACAC,WACAC,gBACAC,kBACAC,eACAC,uBACAC,iBACAC,eACAC,WACAC,UACAC,aACAC,SACAC,YACAC,mBACAC,YACAC,wBACAC,eACAC,kBACAC,WACAC,UACAC,eACAC,kBACAC,UACAC,SACAC,gCACAC,gBACAC,aACAC,YACAC,WACAC,WACAC,kBACAC,mBACAC,cACAC,cACAC,iBACAC,UACAC,wBACAC,uBACAC,iBACAC,UACAC,UACAC,oBACAC,mBACAC,UACAC,eACAC,YACAC,4BACAC,kBACAC,qBACAC,WACAC,cACAC,UACAC,YACAC,eACAC,QACAC,QAC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,MAAOxlG,IAAhD,SACE,cAACkvY,EAAA,EAAD,CAAgBZ,IAAKA,GAArB,SACE,eAAC,IAAD,CAAkBtyX,MAAO6yX,EAAzB,UACE,cAACM,GAAA,EAAD,IAEA,eAAC,KAAD,CAAiBxkW,QAASA,GAA1B,WACiB,IAAdwmI,IAEqB,IAApBzgK,GACE,cAAC6uX,GAAD,CAAoB9yX,YAAaA,KAEtB,IAAd0kK,GAAuB,cAACstN,GAAD,KACT,IAAdttN,QAEoB9wK,IAApBqQ,IAAiCg+X,EA0zBhC,cAACv2W,GAAA,EAAD,CAAKhL,UAAU,MAAf,SACE,cAAC,KAAD,CAAU6zD,WAAYmwF,EAAWjkJ,KAAM,OA1zBzC,cAAC,WAAD,WACuB,IAApBxc,EACC,eAAC,IAAD,WACE,cAAC,IAAD,CAEE6jW,OAAK,EACL9mV,KAAI,CACF,0BACA,oCACA,wBACA,wBACA,cACA,cACA,iBACA,8BARE,mBASC+3M,sBATD,CAUF,gBACA,eACA,WACA,WACAh5F,KACA,wBACA,YACA6vG,yBACA,kBACA,yBACA,kBACA,oBACA,uBACAkF,+BACA,gBACA,yBACA,4BACA,oBACA,6BACA,gCACA,kBACA,cACA,aACA,gBACA,YACA,kBACA,oBACA,WACA,SACA,mCACA,gBACA,WACA,sBACA,uBACA,eACA,6CACA,gBACA,cACA,uBACA,iBACA,0BACA,6BACA,qBACA,0BACA,cACA,uBACA,0BACA,gBACA,WACA,mBACA,0BAEA,gBACA,wCACA,oBACA,aACA,YACA,YACA,SACA,gBACA,mBACA,kBACA,cACA,kBACA,kBACA,uBACA,gCACA,oBACA,wBACA,WACA,kBACA,2BACA,8BACA,iBACA,oBACA,sBACA,mBACA,WACA,cACA,uBACA,0BACA,0BACA,kBACA,oBACA,YACA,kCACA,oBACA,2BACA,wBACA,gBACA,2BACA,wBACA,eACA,uBACA,2BACA,iBACAirB,KACAwzH,GACA,kBACA,uBAEA,iBACA,oBACA,wBACA,cACA,mCACA,eACA,qBACA,uBAzHJ,SA4HE,cAAC,IAAD,CAAkBhkX,MAAO4yX,EAAzB,S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","file":"static/js/main.e03d0505.chunk.js","sourcesContent":["import { ConvertedToObjectType, TranslationJsonType } from './types';\r\n\r\n/**\r\n * This file is seperate from the './i18n.ts' simply to make the Hot Module Replacement work seamlessly.\r\n * Your components can import this file in 'messages.ts' files which would ruin the HMR if this isn't a separate module\r\n **/\r\n\r\n/**\r\n * This file is seperate from the './i18n.ts' simply to make the Hot Module Replacement work seamlessly.\r\n * Your components can import this file in 'messages.ts' files which would ruin the HMR if this isn't a separate module\r\n */\r\nexport const translations: ConvertedToObjectType = {} as any;\r\n\r\n/*\r\n * Converts the static JSON file into an object where keys are identical\r\n * but values are strings concatenated according to syntax.\r\n * This is helpful when using the JSON file keys and still having the intellisense support\r\n * along with type-safety\r\n */\r\nexport const convertLanguageJsonToObject = (\r\n json: any,\r\n objToConvertTo = translations,\r\n current?: string,\r\n) => {\r\n Object.keys(json).forEach(key => {\r\n const currentLookupKey = current ? `${current}.${key}` : key;\r\n if (typeof json[key] === 'object') {\r\n objToConvertTo[key] = {};\r\n convertLanguageJsonToObject(\r\n json[key],\r\n objToConvertTo[key],\r\n currentLookupKey,\r\n );\r\n } else {\r\n objToConvertTo[key] = currentLookupKey;\r\n }\r\n });\r\n};\r\n","// This module is copied from\r\n// node_modules\\date-fns\\locale\\he\\_lib\\formatLong\\index.js\r\n// and modified to solve the date separator problem for \"HE\".\r\n// Here the date separator \".\" is replaced with \"/\" for short date case.\r\n\r\nvar _index = _interopRequireDefault(\r\n require('date-fns/locale/_lib/buildFormatLongFn/index.js'),\r\n);\r\n\r\nfunction _interopRequireDefault(obj) {\r\n return obj && obj.__esModule ? obj : { default: obj };\r\n}\r\n\r\nvar dateFormats = {\r\n full: 'EEEE, d בMMMM y',\r\n long: 'd בMMMM y',\r\n medium: 'd בMMM y',\r\n short: 'd/M/y',\r\n};\r\nvar timeFormats = {\r\n full: 'H:mm:ss zzzz',\r\n long: 'H:mm:ss z',\r\n medium: 'H:mm:ss',\r\n short: 'H:mm',\r\n};\r\nvar dateTimeFormats = {\r\n full: \"{{date}} 'בשעה' {{time}}\",\r\n long: \"{{date}} 'בשעה' {{time}}\",\r\n medium: '{{date}}, {{time}}',\r\n short: '{{date}}, {{time}}',\r\n};\r\nvar formatLong = {\r\n date: (0, _index.default)({\r\n formats: dateFormats,\r\n defaultWidth: 'full',\r\n }),\r\n time: (0, _index.default)({\r\n formats: timeFormats,\r\n defaultWidth: 'full',\r\n }),\r\n dateTime: (0, _index.default)({\r\n formats: dateTimeFormats,\r\n defaultWidth: 'full',\r\n }),\r\n};\r\n/*var _default = formatLong;\r\nexports.default = _default;\r\nmodule.exports = exports.default;*/\r\nexport const formatLongHE = formatLong;\r\n","import DateFnsUtils from '@date-io/date-fns';\r\nimport { IUtils } from '@date-io/core/IUtils';\r\nimport getWeekOfMonth from 'date-fns/getWeekOfMonth';\r\n\r\nimport {\r\n parse,\r\n parseISO,\r\n formatDistanceToNow,\r\n isToday,\r\n startOfMonth,\r\n endOfHour,\r\n endOfTomorrow,\r\n differenceInCalendarDays,\r\n getDay,\r\n getYear,\r\n getMonth,\r\n getHours,\r\n getMinutes,\r\n setWeek,\r\n setDay,\r\n getDate,\r\n setDate,\r\n setMonth,\r\n setYear,\r\n setHours,\r\n setMinutes,\r\n set,\r\n intervalToDuration,\r\n startOfTomorrow,\r\n startOfYesterday,\r\n endOfYesterday,\r\n startOfToday,\r\n lastDayOfMonth,\r\n getDaysInMonth,\r\n getDayOfYear,\r\n} from 'date-fns';\r\n\r\nimport {\r\n differenceInSeconds,\r\n differenceInMinutes,\r\n differenceInHours,\r\n differenceInDays,\r\n differenceInWeeks,\r\n differenceInMonths,\r\n differenceInQuarters,\r\n differenceInYears,\r\n} from 'date-fns';\r\nimport {\r\n add,\r\n addSeconds,\r\n addMinutes,\r\n addHours,\r\n addDays,\r\n addWeeks,\r\n addMonths,\r\n addQuarters,\r\n addYears,\r\n} from 'date-fns';\r\n\r\nimport {\r\n endOfDay,\r\n endOfMonth,\r\n endOfQuarter,\r\n endOfWeek,\r\n endOfYear,\r\n startOfHour,\r\n startOfDay,\r\n startOfQuarter,\r\n startOfWeek,\r\n startOfYear,\r\n} from 'date-fns';\r\nimport { CustomDate, DateType } from 'types/CustomDate';\r\nimport { formatLongHE } from 'utils/LocaleHE';\r\nimport { getLogger } from './logLevel';\r\nimport { toInteger } from 'lodash';\r\nimport { ParsableDate } from '@material-ui/pickers/constants/prop-types';\r\n\r\nconst log = getLogger('DateUtils');\r\nclass DateUtils {\r\n dateFnsUtils: IUtils;\r\n constructor() {\r\n this.dateFnsUtils = new DateFnsUtils();\r\n }\r\n /**\r\n * he->he\r\n * en-us->enUS\r\n * @param s\r\n * @returns\r\n */\r\n dateFnsCultureName(s: string): string {\r\n let [x, y] = s.split('-');\r\n y = y === undefined ? '' : y.toUpperCase();\r\n return x.toLowerCase() + y;\r\n }\r\n CurrentLocale(): Locale {\r\n return this.dateFnsUtils.locale;\r\n }\r\n public async setLocale(cultureName: string, systemFirstDayOfWeek: number) {\r\n const x = this.dateFnsCultureName(cultureName);\r\n try {\r\n const locale = await this.getLocale(x);\r\n this.dateFnsUtils.locale = locale;\r\n this.dateFnsUtils.locale.options.weekStartsOn = systemFirstDayOfWeek;\r\n } catch (err) {\r\n console.error('setLocale', cultureName, err);\r\n }\r\n }\r\n async getLocale(culture: string) {\r\n const locale = await import(`date-fns/locale`);\r\n var result = locale[culture];\r\n if (result.code === 'he') {\r\n result.formatLong = formatLongHE;\r\n }\r\n return result;\r\n }\r\n dateOrStringToDate(v: string | Date): Date {\r\n const d = typeof v === 'string' ? this.parseISO(v as string) : (v as Date);\r\n return d;\r\n }\r\n // format(v: Date | string | null | undefined, f: keyof DateIOFormats) {\r\n // if (v == null || v === undefined) {\r\n // return null;\r\n // }\r\n // try {\r\n // const d = this.dateOrStringToDate(v);\r\n // return this.dateFnsUtils.formatByString(d, this.defaultFormats[f]);\r\n // } catch (err) {\r\n // console.error(err);\r\n // return null;\r\n // }\r\n // }\r\n localeFirstWeekContainsDate(): number | null {\r\n return (\r\n this.dateFnsUtils.locale.options &&\r\n this.dateFnsUtils.locale.options.firstWeekContainsDate\r\n );\r\n }\r\n defaultFirstWeekContainsDate(): number {\r\n return this.localeFirstWeekContainsDate() == null\r\n ? 1\r\n : toInteger(this.localeFirstWeekContainsDate());\r\n }\r\n firstWeekContainsDate(): number {\r\n return this.dateFnsUtils.locale.options.firstWeekContainsDate == null\r\n ? this.defaultFirstWeekContainsDate()\r\n : toInteger(this.dateFnsUtils.locale.options.firstWeekContainsDate);\r\n }\r\n localeWeekStartsOn(): number | null {\r\n return (\r\n this.dateFnsUtils.locale.options &&\r\n this.dateFnsUtils.locale.options.weekStartsOn\r\n );\r\n }\r\n defaultWeekStartsOn(): number {\r\n return this.localeWeekStartsOn() == null\r\n ? 0\r\n : toInteger(this.localeWeekStartsOn());\r\n }\r\n weekStartsOn(): number {\r\n return this.dateFnsUtils.locale.options.weekStartsOn == null\r\n ? this.defaultWeekStartsOn()\r\n : toInteger(this.dateFnsUtils.locale.options.weekStartsOn.weekStartsOn);\r\n }\r\n subFnOptions() {\r\n return {\r\n firstWeekContainsDate: this.firstWeekContainsDate(),\r\n weekStartsOn: this.weekStartsOn(),\r\n locale: this.dateFnsUtils.locale,\r\n };\r\n } // If timezone isn't specified, it will be set to the system timezone\r\n format(v: Date | string | null | undefined, f: string): string | null {\r\n if (v == null || v === undefined) {\r\n return null;\r\n }\r\n try {\r\n const d = this.dateOrStringToDate(v);\r\n return this.dateFnsUtils.format(d, f);\r\n } catch (err) {\r\n console.error(err);\r\n return null;\r\n }\r\n }\r\n // formatByString(\r\n // v: Date | string | null | undefined,\r\n // f: string,\r\n // ): string | null {\r\n // if (v == null || v === undefined) {\r\n // return null;\r\n // }\r\n // try {\r\n // const d = this.dateOrStringToDate(v);\r\n // return this.dateFnsUtils.formatByString(d, f);\r\n // } catch (err) {\r\n // console.error(err);\r\n // return null;\r\n // }\r\n // }\r\n public HoursMinutesSecondsFormat(v: Date | string | null): string | null {\r\n //return this.format(v, 'hh:mm:ss');\r\n return this.format(v, this.DateIOFormats.fullTime);\r\n }\r\n /**\r\n * Format to long date only format (localized). e.g. 23 Apr 2987\r\n * @param v date\r\n * @returns localized formatted string\r\n */\r\n public longDateFormat(v: Date | string | null | undefined): string | null {\r\n return this.format(v, this.DateIOFormats.fullDate); //'PP'\r\n }\r\n /**\r\n * Format to short date only format (localized). e.g. 23 04 2987\r\n * @param v date\r\n * @returns localized formatted string\r\n */\r\n public shortDateFormat(v: Date | string | null | undefined): string | null {\r\n return this.format(v, this.DateIOFormats.keyboardDate); //'P'\r\n }\r\n /**\r\n * Format to long date + time format (localized). e.g. 23 Apr 2987 12:13 AM\r\n * @param v date\r\n * @returns localized formatted string\r\n */\r\n public longDateTimeFormat(\r\n v: Date | string | null | undefined,\r\n ): string | null {\r\n return this.format(v, this.DateIOFormats.fullDateTime); //PP pp\r\n }\r\n /**\r\n * Format to short date + time format (localized). e.g. 23 04 2987 12:13 AM\r\n * @param v date\r\n * @returns localized formatted string\r\n */\r\n public shortDateTimeFormat(\r\n v: Date | string | null | undefined,\r\n ): string | null {\r\n return this.format(v, this.DateIOFormats.keyboardDateTime); //P p\r\n }\r\n public timeFormat(v: Date | string | null | undefined): string | null {\r\n return this.format(v, this.DateIOFormats.fullTime); //p\r\n }\r\n public parseISO(s: string | Date): Date {\r\n if (typeof s === 'string') {\r\n // Remove the timezone offeset part before parsing the date\r\n // Currently the dates are serialized as with a fake UTC offset\r\n // this might change in the future so dates will be received with a proper timezone offset\r\n const truncatedString =\r\n s[s.length - 1] === 'Z' ? s.substr(0, s.length - 1) : s;\r\n const date = parseISO(truncatedString);\r\n\r\n return date;\r\n } else {\r\n return s;\r\n }\r\n }\r\n /**\r\n * Little helper function to parse .net dto date fields.\r\n * @param s ISO like string\r\n * @returns parsed date or null\r\n */\r\n public parseISOOrNull(s: string | Date | null): Date | null {\r\n if (s === null) {\r\n return null;\r\n }\r\n if (typeof s === 'string') {\r\n try {\r\n return parseISO(s);\r\n } catch (error) {\r\n log.error(`parseISOOrNull - failed to parse ${s}`);\r\n return null;\r\n }\r\n } else {\r\n return s;\r\n }\r\n }\r\n public tryParse(s: string | undefined | null): Date | null {\r\n if (s === undefined) {\r\n return null;\r\n }\r\n if (s === null) {\r\n return null;\r\n }\r\n //first try pars using iso\r\n let result = this.parseISO(s);\r\n if (result === undefined) {\r\n return null;\r\n }\r\n if (!isNaN(result.getTime())) {\r\n return result;\r\n }\r\n\r\n // then try localized short date time\r\n result = parse(s, 'P p', 0, { locale: this.dateFnsUtils.locale });\r\n if (!isNaN(result.getTime())) {\r\n return result;\r\n }\r\n\r\n return null;\r\n }\r\n public formatDistanceToNow(v: string | Date) {\r\n const d = this.dateOrStringToDate(v);\r\n return formatDistanceToNow(d, {\r\n addSuffix: true,\r\n locale: this.dateFnsUtils.locale,\r\n });\r\n }\r\n public truncateTime(v: Date | string): Date {\r\n const d = this.dateOrStringToDate(v);\r\n const s = startOfDay(d);\r\n return s;\r\n }\r\n\r\n /**\r\n * Custom ISO format is needed since the OData api works with a fake UTC timezone\r\n * Dates on the server are without timezone offset as the dates in the App time zone\r\n * OData processes the DateTime by appending a Zero timezone offset (UTC)\r\n * @param date date to format\r\n * @param options format options\r\n * @returns ISO string representation\r\n */\r\n public formatISO(\r\n date: Date,\r\n options?: {\r\n format?: 'extended' | 'basic';\r\n representation?: DateType;\r\n },\r\n ) {\r\n const timeFormat = 'HH:mm:ss';\r\n const dateFormat = 'yyyy-MM-dd';\r\n const gfs = (representation: DateType | undefined) => {\r\n switch (representation) {\r\n default:\r\n case 'complete':\r\n return `${dateFormat}'T'${timeFormat}'Z'`;\r\n case 'date':\r\n return dateFormat;\r\n case 'time':\r\n return timeFormat;\r\n }\r\n };\r\n const dateString = this.dateFnsUtils.format(\r\n date,\r\n gfs(options?.representation),\r\n );\r\n return dateString;\r\n }\r\n public tryFormatIso(\r\n date: any,\r\n options?: {\r\n format?: 'extended' | 'basic';\r\n representation?: DateType;\r\n },\r\n ) {\r\n try {\r\n if (date === null) {\r\n return null;\r\n }\r\n if (date === undefined) {\r\n return undefined;\r\n }\r\n if (typeof date === 'string' || date instanceof Date) {\r\n const formatDate = this.dateOrStringToDate(date);\r\n return this.formatISO(formatDate, options);\r\n } else {\r\n return null;\r\n }\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n public formatQueryStringDate(\r\n date: Date,\r\n options?: {\r\n representation?: DateType;\r\n },\r\n ): string {\r\n let convertedDate = this.dateOrStringToDate(date);\r\n switch (options?.representation ?? 'complete') {\r\n default:\r\n case 'complete':\r\n return this.dateFnsUtils.format(convertedDate, \"yyyy-MM-dd'T'HH:mm:ss\");\r\n case 'date':\r\n return this.dateFnsUtils.format(convertedDate, 'yyyy-MM-dd');\r\n case 'time':\r\n return this.dateFnsUtils.format(convertedDate, 'HH:mm:ss');\r\n }\r\n }\r\n public parseQueryStringDate(value: string): Date {\r\n return this.parseISO(value);\r\n }\r\n public getDayText(date: Date): string {\r\n return this.dateFnsUtils.format(date, 'cccc');\r\n }\r\n\r\n public getShortDaysArray(): string[] {\r\n const fdow = startOfWeek(new Date());\r\n return Array.from(Array(7)).map((e, i) =>\r\n this.dateFnsUtils.format(\r\n addDays(fdow, i),\r\n this.DateIOFormats.weekdayShort,\r\n ),\r\n );\r\n }\r\n public getLongDaysArray(): string[] {\r\n const fdow = startOfWeek(new Date());\r\n return Array.from(Array(7)).map((e, i) =>\r\n this.dateFnsUtils.format(addDays(fdow, i), this.DateIOFormats.weekday),\r\n );\r\n }\r\n public getMinutesDiff(startDate: Date, endDate: Date) {\r\n let diff = endDate.getTime() - startDate.getTime();\r\n return diff / 60000;\r\n }\r\n public getHoursDiff(startDate: Date, endDate: Date) {\r\n const msInHour = 1000 * 60 * 60;\r\n return (endDate.getTime() - startDate.getTime()) / msInHour;\r\n }\r\n public getDaysDiff(startDate: Date, endDate: Date) {\r\n const msInDays = 1000 * 3600 * 24;\r\n return (endDate.getTime() - startDate.getTime()) / msInDays;\r\n }\r\n public getWeekDiff(startDate: Date, endDate: Date) {\r\n const msInWeek = 7 * 24 * 60 * 60 * 1000;\r\n return (endDate.getTime() - startDate.getTime()) / msInWeek;\r\n }\r\n public getMonthDiff(startDate: Date, endDate: Date) {\r\n var months;\r\n months = (endDate.getFullYear() - startDate.getFullYear()) * 12;\r\n months -= startDate.getMonth();\r\n months += endDate.getMonth();\r\n return months <= 0 ? 0 : months;\r\n }\r\n public DateIOFormats: DateIOFormats = {\r\n dayOfMonth: 'd',\r\n fullDate: 'PP',\r\n fullDateWithWeekday: 'PPPP',\r\n fullDateTime: 'PP p',\r\n fullDateTime12h: 'PP hh:mm aaa',\r\n fullDateTime24h: 'PP HH:mm',\r\n fullTime: 'p',\r\n fullTime12h: 'hh:mm aaa',\r\n fullTime24h: 'HH:mm',\r\n hours12h: 'hh',\r\n hours24h: 'HH',\r\n keyboardDate: 'P',\r\n keyboardDateTime: 'P p',\r\n keyboardDateTime12h: 'P hh:mm aaa',\r\n keyboardDateTime24h: 'P HH:mm',\r\n minutes: 'mm',\r\n month: 'LLLL',\r\n monthAndDate: 'MMMM d',\r\n monthAndYear: 'LLLL yyyy',\r\n monthShort: 'MMM',\r\n weekday: 'EEEE',\r\n weekdayShort: 'EEE',\r\n normalDate: 'd MMMM',\r\n normalDateWithWeekday: 'EEE, MMM d',\r\n seconds: 'ss',\r\n shortDate: 'MMM d',\r\n year: 'yyyy',\r\n };\r\n public isToday = isToday;\r\n // diff functions\r\n public differenceInSeconds = differenceInSeconds;\r\n public differenceInMinutes = differenceInMinutes;\r\n public differenceInHours = differenceInHours;\r\n public differenceInDays = differenceInDays;\r\n public differenceInWeeks = differenceInWeeks;\r\n public differenceInMonths = differenceInMonths;\r\n public differenceInQuarters = differenceInQuarters;\r\n public differenceInYears = differenceInYears;\r\n public differenceInCalendarDays = differenceInCalendarDays;\r\n\r\n // add functions\r\n public add = add;\r\n public addSeconds = addSeconds;\r\n public addMinutes = addMinutes;\r\n public addHours = addHours;\r\n public addDays = addDays;\r\n public addWeeks = addWeeks;\r\n public addMonths = addMonths;\r\n public addQuarters = addQuarters;\r\n public addYears = addYears;\r\n\r\n // startOf functions\r\n public startOfHour = startOfHour;\r\n public startOfDay = startOfDay;\r\n public startOfWeek(\r\n date: Date | number,\r\n firstDayOfWeek?: WeekStartsOn | number,\r\n ) {\r\n return startOfWeek(date, {\r\n locale: dateUtils.dateFnsUtils.locale,\r\n weekStartsOn: firstDayOfWeek as WeekStartsOn,\r\n });\r\n }\r\n public startOfMonth = startOfMonth;\r\n public startOfQuarter = startOfQuarter;\r\n public startOfYear = startOfYear;\r\n\r\n // endOf functions\r\n public endOfHour = endOfHour;\r\n public endOfDay = endOfDay;\r\n public endOfWeek(\r\n date: Date | number,\r\n firstDayOfWeek?: WeekStartsOn | number,\r\n ) {\r\n return endOfWeek(date, {\r\n locale: dateUtils.dateFnsUtils.locale,\r\n weekStartsOn: firstDayOfWeek as WeekStartsOn,\r\n });\r\n }\r\n public endOfMonth = endOfMonth;\r\n public endOfQuarter = endOfQuarter;\r\n public endOfYear = endOfYear;\r\n public endOfTomorrow = endOfTomorrow;\r\n public startOfTomorrow = startOfTomorrow;\r\n public startOfYesterday = startOfYesterday;\r\n public endOfYesterday = endOfYesterday;\r\n public startOfToday = startOfToday;\r\n public lastDayOfMonth = lastDayOfMonth;\r\n public getDaysInMonth = getDaysInMonth;\r\n public getDayOfYear = getDayOfYear;\r\n\r\n //other\r\n public getYear = getYear;\r\n public getMonth = getMonth;\r\n public getHours = getHours;\r\n public getMinutes = getMinutes;\r\n public getDate = getDate;\r\n public setDate = setDate;\r\n public setMonth = setMonth;\r\n public setYear = setYear;\r\n public setHours = setHours;\r\n public setMinutes = setMinutes;\r\n public getDay(date: Date | number): number {\r\n return getDay(date) as number;\r\n }\r\n public setWeek(\r\n date: Date | number,\r\n week: number,\r\n firstDayOfWeek: WeekStartsOn | number,\r\n ): Date {\r\n return setWeek(date, week, {\r\n locale: this.dateFnsUtils.locale,\r\n weekStartsOn: firstDayOfWeek as WeekStartsOn,\r\n });\r\n }\r\n public setDay(\r\n date: Date | number,\r\n day: number,\r\n firstDayOfWeek: WeekStartsOn | number,\r\n ): Date {\r\n return setDay(date, day, {\r\n locale: this.dateFnsUtils.locale,\r\n weekStartsOn: firstDayOfWeek as WeekStartsOn,\r\n });\r\n }\r\n public set(\r\n date: Date | number,\r\n values: {\r\n year?: number;\r\n month?: number;\r\n date?: number;\r\n hours?: number;\r\n minutes?: number;\r\n seconds?: number;\r\n milliseconds?: number;\r\n },\r\n ): Date {\r\n return set(date, values);\r\n }\r\n\r\n public getWeekNumberOfMonth(\r\n date: Date,\r\n FirstDayOfWeek?: WeekStartsOn | number,\r\n ): number {\r\n return getWeekOfMonth(date, {\r\n locale: this.dateFnsUtils.locale,\r\n weekStartsOn: FirstDayOfWeek as WeekStartsOn,\r\n });\r\n }\r\n public intervalToDuration = intervalToDuration;\r\n\r\n public timeStringToDecimal(time: string): number {\r\n var hoursMinutes = time.split(/[.:]/);\r\n var hours = parseInt(hoursMinutes[0], 10);\r\n var minutes = hoursMinutes[1] ? parseInt(hoursMinutes[1], 10) : 0;\r\n return hours + minutes / 60;\r\n }\r\n public toDate(date: Date | string) {\r\n return dateUtils.dateOrStringToDate(date);\r\n }\r\n public newDate(date: Date | string | undefined) {\r\n if (!date) {\r\n return new CustomDate(new Date(), 'complete');\r\n } else {\r\n return new CustomDate(this.toDate(date), 'complete');\r\n }\r\n }\r\n public getMeridiem(date: Date | string) {\r\n return dateUtils.getHours(dateUtils.toDate(date)) >= 12 ? 'pm' : 'am';\r\n }\r\n public convertToMeridiem(\r\n time: Date | string,\r\n meridiem: 'am' | 'pm',\r\n ampm: boolean,\r\n ) {\r\n let val = dateUtils.toDate(time);\r\n if (ampm) {\r\n var currentMeridiem = dateUtils.getHours(val) >= 12 ? 'pm' : 'am';\r\n if (currentMeridiem !== meridiem) {\r\n var hours =\r\n meridiem === 'am'\r\n ? dateUtils.getHours(val) - 12\r\n : dateUtils.getHours(val) + 12;\r\n return dateUtils.setHours(val, hours);\r\n }\r\n }\r\n return val;\r\n }\r\n public getMeridiemHours(time: Date | string) {\r\n let val = dateUtils.toDate(time);\r\n var currentMeridiem = dateUtils.getHours(val) > 12 ? 'pm' : 'am';\r\n if (currentMeridiem === 'pm') {\r\n let hours = dateUtils.getHours(val) - 12;\r\n return hours;\r\n }\r\n return dateUtils.getHours(val);\r\n }\r\n public getParsableDate(date: ParsableDate) {\r\n var resDate =\r\n date === null || date === undefined\r\n ? null\r\n : typeof date === 'object'\r\n ? new Date(date as Date)\r\n : typeof date === 'number'\r\n ? new Date(date)\r\n : dateUtils.dateOrStringToDate(date);\r\n return resDate;\r\n }\r\n}\r\n\r\nexport const dateUtils = new DateUtils();\r\n\r\nexport type WeekStartsOn = 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined;\r\nexport interface DateIOFormats {\r\n /** Localized full date @example \"Jan 1, 2019\" */\r\n fullDate: TLibFormatToken;\r\n /** Partially localized full date with weekday, useful for text-to-speech accessibility @example \"Tuesday, January 1, 2019\" */\r\n fullDateWithWeekday: TLibFormatToken;\r\n /** Date format string with month and day of month @example \"1 January\" */\r\n normalDate: TLibFormatToken;\r\n /** Date format string with weekday, month and day of month @example \"Wed, Jan 1\" */\r\n normalDateWithWeekday: TLibFormatToken;\r\n /** Shorter day format @example \"Jan 1\" */\r\n shortDate: TLibFormatToken;\r\n /** Year format string @example \"2019\" */\r\n year: TLibFormatToken;\r\n /** Month format string @example \"January\" */\r\n month: TLibFormatToken;\r\n /** Short month format string @example \"Jan\" */\r\n monthShort: TLibFormatToken;\r\n /** Month with year format string @example \"January 2018\" */\r\n monthAndYear: TLibFormatToken;\r\n /** Month with date format string @example \"January 1\" */\r\n monthAndDate: TLibFormatToken;\r\n /** Weekday format string @example \"Wednesday\" */\r\n weekday: TLibFormatToken;\r\n /** Short weekday format string @example \"Wed\" */\r\n weekdayShort: TLibFormatToken;\r\n /** Day format string @example \"1\" */\r\n dayOfMonth: TLibFormatToken;\r\n /** Hours format string @example \"11\" */\r\n hours12h: TLibFormatToken;\r\n /** Hours format string @example \"23\" */\r\n hours24h: TLibFormatToken;\r\n /** Minutes format string @example \"44\" */\r\n minutes: TLibFormatToken;\r\n /** Seconds format string @example \"00\" */\r\n seconds: TLibFormatToken;\r\n /** Full time localized format string @example \"11:44 PM\" for US, \"23:44\" for Europe */\r\n fullTime: TLibFormatToken;\r\n /** Not localized full time format string @example \"11:44 PM\" */\r\n fullTime12h: TLibFormatToken;\r\n /** Not localized full time format string @example \"23:44\" */\r\n fullTime24h: TLibFormatToken;\r\n /** Date & time format string with localized time @example \"Jan 1, 2018 11:44 PM\" */\r\n fullDateTime: TLibFormatToken;\r\n /** Not localized date & Time format 12h @example \"Jan 1, 2018 11:44 PM\" */\r\n fullDateTime12h: TLibFormatToken;\r\n /** Not localized date & Time format 24h @example \"Jan 1, 2018 23:44\" */\r\n fullDateTime24h: TLibFormatToken;\r\n /** Localized keyboard input friendly date format @example \"02/13/2020 */\r\n keyboardDate: TLibFormatToken;\r\n /** Localized keyboard input friendly date/time format @example \"02/13/2020 23:44\" */\r\n keyboardDateTime: TLibFormatToken;\r\n /** Partially localized keyboard input friendly date/time 12h format @example \"02/13/2020 11:44 PM\" */\r\n keyboardDateTime12h: TLibFormatToken;\r\n /** Partially localized keyboard input friendly date/time 24h format @example \"02/13/2020 23:44\" */\r\n keyboardDateTime24h: TLibFormatToken;\r\n}\r\n","import { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { SearchColumnType } from 'app/components/BasicTable/BasicTableProps';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\n/**\r\n * Supported OData operators\r\n * TODO: extend to greater than, etc\r\n */\r\nexport enum ODataOperators {\r\n Equals = 'eq',\r\n NotEquals = 'ne',\r\n GreaterThan = 'gt',\r\n GreaterThanEqual = 'ge',\r\n LessThan = 'lt',\r\n LessThanEqual = 'le',\r\n Contains = 'contains',\r\n Between = 'between',\r\n Intersection = 'intersection',\r\n Any = 'any',\r\n NotAny = 'notAny',\r\n In = 'in',\r\n Includes = 'includes',\r\n Excludes = 'excludes',\r\n InM = 'inm',\r\n AnyIn = 'AnyIn',\r\n ContainsM = 'containsm',\r\n HasNoAny = 'hasNoAny',\r\n All = 'all',\r\n AllIn = 'allIn',\r\n}\r\nexport type OdataFilterOperatorType =\r\n | ODataOperators\r\n | ((value: FilterValueType | undefined) => string);\r\nexport const operatorToString = (\r\n key: ODataOperators,\r\n value: FilterValueType | undefined,\r\n t: TFunction,\r\n): string => {\r\n return key === ODataOperators.Equals\r\n ? t(translations.ODataEquals)\r\n : key === ODataOperators.NotEquals\r\n ? t(translations.ODataNotEquals)\r\n : key === ODataOperators.GreaterThan\r\n ? value instanceof Date\r\n ? t(translations.ODataGtAfter)\r\n : t(translations.ODataGreaterThan)\r\n : key === 'lt'\r\n ? value instanceof Date\r\n ? t(translations.ODataLtBefore)\r\n : t(translations.ODataLessThan)\r\n : key === ODataOperators.GreaterThanEqual\r\n ? t(translations.ODataGreaterThanEqual)\r\n : key === ODataOperators.LessThanEqual\r\n ? t(translations.ODataLessThanEqual)\r\n : key === ODataOperators.Intersection\r\n ? t(translations.ODataIntersection)\r\n : key === ODataOperators.NotAny\r\n ? t(translations.ODataNotAny)\r\n : key === ODataOperators.Includes\r\n ? t(translations.ODataIncludes)\r\n : key === ODataOperators.Excludes\r\n ? t(translations.ODataExcludes)\r\n : key === ODataOperators.AnyIn\r\n ? t(translations.ODataAnyIn)\r\n : key === ODataOperators.ContainsM\r\n ? t(translations.ODataContainsM)\r\n : key === ODataOperators.InM\r\n ? t(translations.ODataInM)\r\n : key === ODataOperators.HasNoAny\r\n ? t(translations.ODataHasNoAny)\r\n : key === ODataOperators.All\r\n ? t(translations.ODataAll)\r\n : key === ODataOperators.AllIn\r\n ? t(translations.ODataAllIn)\r\n : key === ODataOperators.In\r\n ? t(translations.ODataIn)\r\n : key === ODataOperators.Any\r\n ? t(translations.ODataAny)\r\n : key;\r\n};\r\n/**\r\n * Supported value types\r\n */\r\nexport type ODataFieldType = string | number | Date | boolean;\r\n\r\n/**\r\n * Formats a const value in oData format.\r\n * @param value value\r\n * @returns formatted value that can be used in odata filter expression\r\n */\r\nexport function quoteODataValue(\r\n value: FilterValueType | Array,\r\n) {\r\n if (value === null) {\r\n return null;\r\n } else if (typeof value === 'number') {\r\n return value.toString();\r\n } else if (typeof value === 'boolean') {\r\n return value.toString();\r\n } else if (typeof value === 'string') {\r\n return `'${escapeODataValue(value)}'`;\r\n } else if (value instanceof CustomDate) {\r\n return `${dateUtils.formatISO(value, {\r\n representation: (value as CustomDate).representation ?? 'date',\r\n })}`;\r\n } else if (value instanceof Date) {\r\n return `${dateUtils.formatISO(value, { representation: 'complete' })}`;\r\n } else if (Array.isArray(value)) {\r\n return `(${value.map(v => quoteODataValue(v)).join(',')})`;\r\n } else if ('Id' in value) {\r\n return quoteODataValue(value.Id);\r\n } else {\r\n console.error(`Value type not supported: ${value}`, value);\r\n throw new Error(`Value type not supported: ${value}`);\r\n }\r\n}\r\n/**\r\n * Escapes const OData value\r\n * @param value value\r\n * @returns\r\n */\r\nexport function escapeODataValue(value: string): string {\r\n return value.replaceAll(\"'\", \"''\");\r\n}\r\n\r\nexport function withisInversed<\r\n T extends string | undefined = string | undefined\r\n>(condition: T, isInversed: boolean | undefined) {\r\n if (!isInversed || (condition ?? '') === '') {\r\n return condition;\r\n }\r\n return '(' + condition + ') eq false';\r\n}\r\n\r\n/**\r\n * Filter condition to be used in future custom filters\r\n */\r\nexport class Condition {\r\n public field: keyof TRow;\r\n public field1?: keyof TRow;\r\n public operator?: ODataOperators;\r\n public value?: FilterValueType;\r\n public isInversed?: boolean;\r\n constructor(\r\n field: keyof TRow,\r\n operator: ODataOperators,\r\n value: FilterValueType | undefined,\r\n field1?: keyof TRow,\r\n isInversed?: boolean,\r\n ) {\r\n this.field = field;\r\n this.field1 = field1;\r\n this.operator = operator;\r\n this.value = value;\r\n this.isInversed = isInversed;\r\n }\r\n\r\n /**\r\n * Format the range filter (between operator)\r\n * @returns odata filter string\r\n */\r\n between() {\r\n const c1: Condition[] = [];\r\n const start = (this.value as any).start;\r\n if (start !== null) {\r\n c1.push(\r\n new Condition(this.field, ODataOperators.GreaterThanEqual, start),\r\n );\r\n }\r\n const end = (this.value as any).end;\r\n if (end !== null) {\r\n c1.push(new Condition(this.field, ODataOperators.LessThanEqual, end));\r\n }\r\n const result =\r\n c1.length > 0 ? `(${c1.map(c => c.toString()).join(' and ')})` : '';\r\n return result;\r\n }\r\n /**\r\n * Format the range filter (intersection operator)\r\n * @returns odata filter string\r\n */\r\n intersection() {\r\n if (this.field1 === undefined) return '';\r\n const c1: Condition[] = [];\r\n const start = (this.value as any).start;\r\n if (start !== null) {\r\n c1.push(new Condition(this.field1, ODataOperators.GreaterThan, start));\r\n }\r\n const end = (this.value as any).end;\r\n if (end !== null) {\r\n c1.push(new Condition(this.field, ODataOperators.LessThan, end));\r\n }\r\n const result =\r\n c1.length > 0 ? `${c1.map(c => c.toString()).join(' and ')}` : '';\r\n return result;\r\n }\r\n hasAny() {\r\n //if (this.field1 === undefined) return '';\r\n const result = `${this.field}/any(g: g${\r\n this.field1 ? '/' + this.field1 : ''\r\n } eq ${quoteODataValue(this.value as number)})`;\r\n return result;\r\n }\r\n haNoAny() {\r\n const result = `not ${this.field}/any()`;\r\n return result;\r\n }\r\n notAny() {\r\n if (this.field1 === undefined) return '';\r\n const result = `${this.field}/any(g: g/${this.field1} eq ${quoteODataValue(\r\n this.value as number,\r\n )}) eq false`;\r\n return result;\r\n }\r\n anyIn() {\r\n if (!Array.isArray(this.value)) return '';\r\n const result = `${this.field}/any(g: g${\r\n !!this.field1 ? '/' + this.field1 : ''\r\n } in ${quoteODataValue(this.value)})`;\r\n return result;\r\n }\r\n allIn() {\r\n if (!Array.isArray(this.value)) return '';\r\n const result = `${this.field}/all(g: g${\r\n this.field1 ? '/' + this.field1 : ''\r\n } in ${quoteODataValue(this.value)})`;\r\n return result;\r\n }\r\n all() {\r\n if (this.field1 === undefined) return '';\r\n const result = `${this.field}/all(g: g/${this.field1} eq ${quoteODataValue(\r\n this.value as number,\r\n )})`;\r\n return result;\r\n }\r\n inM() {\r\n let res: string[] | undefined =\r\n this.value !== null && Array.isArray(this.value)\r\n ? (this.value as Array).map(v => {\r\n return `${quoteODataValue(v)} in ${this.field}`;\r\n })\r\n : undefined;\r\n return res !== undefined ? `(${res.join(' or ')})` : '';\r\n }\r\n public withNull(fieldName?: string) {\r\n const res = this.toString();\r\n const name = fieldName ?? String(this.field);\r\n if (res === undefined) return res;\r\n return '((' + res + ') or ' + name + ' eq null)';\r\n }\r\n public toString(): string | undefined {\r\n if (this.value === undefined) {\r\n return undefined;\r\n }\r\n if (this.operator === undefined) {\r\n return undefined;\r\n }\r\n switch (this.operator) {\r\n case ODataOperators.Equals:\r\n case ODataOperators.NotEquals:\r\n case ODataOperators.GreaterThan:\r\n case ODataOperators.GreaterThanEqual:\r\n case ODataOperators.LessThan:\r\n case ODataOperators.LessThanEqual:\r\n return `${this.field} ${this.operator} ${quoteODataValue(this.value)}`;\r\n case ODataOperators.Contains:\r\n return `contains(tolower(${this.field}), ${quoteODataValue(\r\n this.value,\r\n ).toLowerCase()})`;\r\n case ODataOperators.ContainsM:\r\n let resCM: string[] | undefined =\r\n this.value !== null && Array.isArray(this.value)\r\n ? (this.value as Array).map(v => {\r\n return `contains(tolower(${this.field}), ${quoteODataValue(\r\n v?.['Name'] ?? v,\r\n ).toLowerCase()})`;\r\n })\r\n : undefined;\r\n return resCM !== undefined ? resCM.join(' or ') : '';\r\n case ODataOperators.Between:\r\n return this.between();\r\n case ODataOperators.Intersection:\r\n return this.intersection();\r\n case ODataOperators.Any:\r\n return this.hasAny();\r\n case ODataOperators.NotAny:\r\n return this.notAny();\r\n case ODataOperators.In:\r\n return `(${quoteODataValue(this.value)} in ${this.field})`;\r\n case ODataOperators.InM:\r\n return this.inM();\r\n case ODataOperators.Includes:\r\n return `(${this.field} in ${quoteODataValue(this.value)})`;\r\n case ODataOperators.Excludes:\r\n return `(${this.field} in ${quoteODataValue(this.value)} eq false)`;\r\n case ODataOperators.AnyIn:\r\n return this.anyIn();\r\n case ODataOperators.HasNoAny:\r\n return this.haNoAny();\r\n case ODataOperators.All:\r\n return this.all();\r\n case ODataOperators.AllIn:\r\n return this.allIn();\r\n default:\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * OData filter expression builder\r\n */\r\nexport class ODataFilterBuilder {\r\n predicates: (string | Condition)[] = [];\r\n globalServiceGroupFilter: Condition[] = [];\r\n stringColumns?: Array>;\r\n stringSearch?: string | null;\r\n isOptionalServiceGroup?: boolean;\r\n constructor(x: {\r\n predicates: (string | Condition)[];\r\n stringColumns?: Array>;\r\n stringSearch?: string | null;\r\n globalServiceGroupFilter?: Condition[];\r\n timezone?: string;\r\n isOptionalServiceGroup?: boolean;\r\n }) {\r\n this.predicates = x.predicates.filter(\r\n f => f.toString() !== '' && f.toString() !== undefined,\r\n );\r\n this.stringColumns = x.stringColumns;\r\n this.stringSearch = x.stringSearch;\r\n this.globalServiceGroupFilter = x.globalServiceGroupFilter || [];\r\n this.isOptionalServiceGroup = x.isOptionalServiceGroup;\r\n }\r\n public toString(): string | undefined {\r\n const x: string[] = [];\r\n if (\r\n this.stringSearch !== undefined &&\r\n this.stringSearch !== null &&\r\n this.stringSearch !== ''\r\n ) {\r\n if (this.stringColumns !== undefined) {\r\n const stringValue = this.stringSearch.toLowerCase();\r\n x.push(\r\n '(' +\r\n this.stringColumns\r\n .map(c =>\r\n typeof c === 'function'\r\n ? c(\"'\" + escapeODataValue(stringValue) + \"'\")\r\n : new Condition(\r\n c as keyof T,\r\n ODataOperators.Contains,\r\n stringValue,\r\n ),\r\n )\r\n .map(c => c.toString())\r\n .join(' or ') +\r\n ')',\r\n );\r\n }\r\n }\r\n if (this.predicates?.length > 0) {\r\n x.push(\r\n '(' +\r\n this.predicates\r\n .map(p => withisInversed(p.toString(), p['isInversed']))\r\n .filter(p => p !== '' && p !== undefined)\r\n .join(' and ') +\r\n ')',\r\n );\r\n }\r\n if (\r\n this.globalServiceGroupFilter.length > 0 &&\r\n this.globalServiceGroupFilter[0].field !== ''\r\n ) {\r\n if (this.globalServiceGroupFilter[0].field === 'ServiceGroupId') {\r\n x.push(\r\n '(' +\r\n (this.isOptionalServiceGroup === true\r\n ? this.globalServiceGroupFilter\r\n .concat(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Equals,\r\n null,\r\n ),\r\n )\r\n .map(p => p.toString())\r\n .join(' or ')\r\n : this.globalServiceGroupFilter\r\n .map(p => p.toString())\r\n .join(' or ')) +\r\n ')',\r\n );\r\n } else {\r\n if (this.isOptionalServiceGroup !== true) {\r\n x.push(\r\n '(' +\r\n this.globalServiceGroupFilter\r\n .map(p => p.toString())\r\n .join(' or ') +\r\n ')',\r\n );\r\n }\r\n }\r\n }\r\n const result =\r\n x.length === 0\r\n ? undefined\r\n : x.length === 1 && x[0] === '()'\r\n ? undefined\r\n : x.join(' and ');\r\n return result;\r\n }\r\n}\r\n\r\nexport type oDataValue = { operator: ODataOperators; value: string };\r\n","//base colors\r\nexport const base_black_c11 = '#121926';\r\nexport const base_white_c0 = '#FFFFFF';\r\n//grayscale colors\r\nexport const grayscale_black_regular_c10 = '#202939';\r\nexport const grayscale_black_components_c9 = '#364152';\r\nexport const grayscale_gray_subtitles_c8 = '#4B5565';\r\nexport const grayscale_gray_components_c7 = '#697586';\r\nexport const grayscale_gray_components_light_c6 = '#9AA3B2';\r\nexport const grayscale_gray_borders_c5 = '#CDD5DF';\r\nexport const grayscale_gray_selection_c4 = '#E3E8EF';\r\nexport const grayscale_gray_bg_components_c3 = '#EEF2F6';\r\nexport const grayscale_gray_background_c2 = '#F8FAFC';\r\nexport const grayscale_gray_bg_light_c1 = '#FCFCFD';\r\n\r\n//opacity colors\r\nexport const overlay_opacity_black = 'rgba(0, 5, 10, 0.70)';\r\nexport const overlay_opacity_white = 'rgba(255, 255, 255, 0.95)';\r\n\r\n//primary colors\r\nexport const primary_dark_text_c10 = '#0B4A6F';\r\nexport const primary_hover_c9 = '#065986';\r\nexport const primary_regular_c8 = '#026AA2';\r\nexport const primary_components_c7 = '#0086C9';\r\nexport const primary_components_light_c6 = '#0BA5EC';\r\nexport const primary_borders_c5 = '#36BFFA';\r\nexport const primary_disabled_c4 = '#C5EAFE';\r\nexport const primary_bg_hover_c3 = '#E0F2FE';\r\nexport const primary_background_c2 = '#F0F9FF';\r\nexport const primary_bg_light_c1 = '#F5FBFF';\r\n\r\n//secondary colors\r\nexport const secondary_violet_dark_text_c10 = '#283493';\r\nexport const secondary_violet_hover_c9 = '#404FB7';\r\nexport const secondary_violet_regular_c8 = '#5C6FDB';\r\nexport const secondary_violet_components_c7 = '#7F94FF';\r\nexport const secondary_violet_components_light_c6 = '#9FB0FF';\r\nexport const secondary_violet_borders_c5 = '#B2C1FF';\r\nexport const secondary_violet_disabled_c4 = '#CBD6FF';\r\nexport const secondary_violet_bg_hover_c3 = '#E5EBFF';\r\nexport const secondary_violet_background_c2 = '#F2F5FF';\r\nexport const secondary_violet_bg_light_c1 = '#F9FAFF';\r\n\r\n//danger colors\r\nexport const semantic_danger_dark_text_c10 = '#841444';\r\nexport const semantic_danger_hover_c9 = '#A41F4C';\r\nexport const semantic_danger_regular_c8 = '#C42E52';\r\nexport const semantic_danger_components_c7 = '#EF6D74';\r\nexport const semantic_danger_components_light_c6 = '#EF6D74';\r\nexport const semantic_danger_borders_c5 = '#F78F8B';\r\nexport const semantic_danger_disabled_c4 = '#FCBCB3';\r\nexport const semantic_danger_bg_hover_c3 = '#FDE1D8';\r\nexport const semantic_danger_background_c2 = '#FEF0EC';\r\nexport const semantic_danger_bg_light_c1 = '#FFF8F5';\r\n\r\n//secondary colors\r\nexport const semantic_success_dark_text_c10 = '#076F4F';\r\nexport const semantic_success_hover_c9 = '#0C8654';\r\nexport const semantic_success_regular_c8 = '#13A75C';\r\nexport const semantic_success_components_c7 = '#1CC760';\r\nexport const semantic_success_components_light_c6 = '#27E861';\r\nexport const semantic_success_borders_c5 = '#7CF889';\r\nexport const semantic_success_disabled_c4 = '#A8FCA9';\r\nexport const semantic_success_bg_hover_c3 = '#D7FDD3';\r\nexport const semantic_success_background_c2 = '#EBFEE9';\r\nexport const semantic_success_bg_light_c1 = '#F5FFF4';\r\n\r\n//alert(warning) colors\r\nexport const semantic_alert_dark_text_c10 = '#7F5000';\r\nexport const semantic_alert_hover_c9 = '#9D6800';\r\nexport const semantic_alert_regular_c8 = '#BC8200';\r\nexport const semantic_alert_components_c7 = '#DB9E00';\r\nexport const semantic_alert_components_light_c6 = '#E9BD3A';\r\nexport const semantic_alert_borders_c5 = '#F4D361';\r\nexport const semantic_alert_disabled_c4 = '#FBE896';\r\nexport const semantic_alert_bg_hover_c3 = '#FDF4CA';\r\nexport const semantic_alert_background_c2 = '#FEFAE4';\r\nexport const semantic_alert_bg_light_c1 = '#FFFCF2';\r\n\r\nexport const bookitColors = {\r\n base: {\r\n black: base_black_c11,\r\n white: base_white_c0,\r\n },\r\n grayscale: {\r\n blackRegular: grayscale_black_regular_c10,\r\n blackComponents: grayscale_black_components_c9,\r\n graySubtitles: grayscale_gray_subtitles_c8,\r\n grayComponents: grayscale_gray_components_c7,\r\n grayComponentsLight: grayscale_gray_components_light_c6,\r\n grayBorders: grayscale_gray_borders_c5,\r\n graySelection: grayscale_gray_selection_c4,\r\n graybgComponents: grayscale_gray_bg_components_c3,\r\n grayBackground: grayscale_gray_background_c2,\r\n grayBackgroundLight: grayscale_gray_bg_light_c1,\r\n },\r\n overlays: {\r\n overlayBlack: overlay_opacity_black,\r\n overlayWhite: overlay_opacity_white,\r\n },\r\n primary: {\r\n dark: primary_dark_text_c10,\r\n hover: primary_hover_c9,\r\n regular: primary_regular_c8,\r\n components: primary_components_c7,\r\n componentsLight: primary_components_light_c6,\r\n borders: primary_borders_c5,\r\n disabled: primary_disabled_c4,\r\n bgHover: primary_bg_hover_c3,\r\n background: primary_background_c2,\r\n bgLight: primary_bg_light_c1,\r\n },\r\n secondary: {\r\n violet: {\r\n dark: secondary_violet_dark_text_c10,\r\n hover: secondary_violet_hover_c9,\r\n regular: secondary_violet_regular_c8,\r\n components: secondary_violet_components_c7,\r\n componentsLight: secondary_violet_components_light_c6,\r\n borders: secondary_violet_borders_c5,\r\n disabled: secondary_violet_disabled_c4,\r\n bgHover: secondary_violet_bg_hover_c3,\r\n background: secondary_violet_background_c2,\r\n bgLight: secondary_violet_bg_light_c1,\r\n },\r\n },\r\n danger: {\r\n dark: semantic_danger_dark_text_c10,\r\n hover: semantic_danger_hover_c9,\r\n regular: semantic_danger_regular_c8,\r\n components: semantic_danger_components_c7,\r\n componentsLight: semantic_danger_components_light_c6,\r\n borders: semantic_danger_borders_c5,\r\n disabled: semantic_danger_disabled_c4,\r\n bgHover: semantic_danger_bg_hover_c3,\r\n background: semantic_danger_background_c2,\r\n bgLight: semantic_danger_bg_light_c1,\r\n },\r\n success: {\r\n dark: semantic_success_dark_text_c10,\r\n hover: semantic_success_hover_c9,\r\n regular: semantic_success_regular_c8,\r\n components: semantic_success_components_c7,\r\n componentsLight: semantic_success_components_light_c6,\r\n borders: semantic_success_borders_c5,\r\n disabled: semantic_success_disabled_c4,\r\n bgHover: semantic_success_bg_hover_c3,\r\n background: semantic_success_background_c2,\r\n bgLight: semantic_success_bg_light_c1,\r\n },\r\n warning: {\r\n dark: semantic_alert_dark_text_c10,\r\n hover: semantic_alert_hover_c9,\r\n regular: semantic_alert_regular_c8,\r\n components: semantic_alert_components_c7,\r\n componentsLight: semantic_alert_components_light_c6,\r\n borders: semantic_alert_borders_c5,\r\n disabled: semantic_alert_disabled_c4,\r\n bgHover: semantic_alert_bg_hover_c3,\r\n background: semantic_alert_background_c2,\r\n bgLight: semantic_alert_bg_light_c1,\r\n },\r\n};\r\nexport interface ColorsMeta {\r\n Name: string;\r\n SemanticMeta: ColorSemanticMeta[];\r\n}\r\nexport interface ColorSemanticMeta {\r\n Name: string;\r\n Title: string;\r\n Colors: ColorDescriptionMeta[];\r\n}\r\nexport interface ColorDescriptionMeta {\r\n color: string;\r\n colorName: string;\r\n colorCode: string;\r\n colorVariable: string;\r\n}\r\nexport const baseColorMeta: ColorSemanticMeta = {\r\n Name: 'Base',\r\n Title:\r\n 'Black Palette for titles, copyrighting and components. Brand black color',\r\n Colors: [\r\n {\r\n color: bookitColors.base.black,\r\n colorName: 'Black',\r\n colorCode: 'c11',\r\n colorVariable: 'base_black_c11',\r\n },\r\n {\r\n color: bookitColors.base.white,\r\n colorName: 'White',\r\n colorCode: 'c0',\r\n colorVariable: 'base_white_c0',\r\n },\r\n ],\r\n};\r\nexport const overlaysColorMeta: ColorSemanticMeta = {\r\n Name: 'Overlays',\r\n Title:\r\n 'Black and white overlays for popups, popovers and transparent elements',\r\n Colors: [\r\n {\r\n color: bookitColors.overlays.overlayBlack,\r\n colorName: 'Black Popup Overlay',\r\n colorCode: 'opacity-black',\r\n colorVariable: 'overlay_opacity_black',\r\n },\r\n {\r\n color: bookitColors.overlays.overlayWhite,\r\n colorName: 'White Popup Overlay',\r\n colorCode: 'opacity-white',\r\n colorVariable: 'overlay_opacity_white',\r\n },\r\n ],\r\n};\r\nexport const grayscaleColorMeta: ColorSemanticMeta = {\r\n Name: 'Grayscale',\r\n Title:\r\n 'Black Palette for titles, copyrighting and components. Brand black color',\r\n Colors: [\r\n {\r\n color: bookitColors.grayscale.blackRegular,\r\n colorName: 'Regular',\r\n colorCode: 'c10',\r\n colorVariable: 'grayscale_black_regular_c10',\r\n },\r\n {\r\n color: bookitColors.grayscale.blackComponents,\r\n colorName: 'Black Components',\r\n colorCode: 'c9',\r\n colorVariable: 'grayscale_black_components_c9',\r\n },\r\n {\r\n color: bookitColors.grayscale.graySubtitles,\r\n colorName: 'Gray Subtitles',\r\n colorCode: 'c8',\r\n colorVariable: 'grayscale_gray_subtitles_c8',\r\n },\r\n {\r\n color: bookitColors.grayscale.grayComponents,\r\n colorName: 'Gray Components',\r\n colorCode: 'c7',\r\n colorVariable: 'grayscale_gray_components_c7',\r\n },\r\n {\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n colorName: 'Gray Components Light',\r\n colorCode: 'c6',\r\n colorVariable: 'grayscale_gray_components_light_c6',\r\n },\r\n {\r\n color: bookitColors.grayscale.grayBorders,\r\n colorName: 'Gray Borders',\r\n colorCode: 'c5',\r\n colorVariable: 'grayscale_gray_borders_c5',\r\n },\r\n {\r\n color: bookitColors.grayscale.graySelection,\r\n colorName: 'Gray Selection',\r\n colorCode: 'c4',\r\n colorVariable: 'grayscale_gray_selection_c4',\r\n },\r\n {\r\n color: bookitColors.grayscale.graybgComponents,\r\n colorName: 'Gray Bg Components',\r\n colorCode: 'c3',\r\n colorVariable: 'grayscale_gray_bg_components_c3',\r\n },\r\n {\r\n color: bookitColors.grayscale.grayBackground,\r\n colorName: 'Gray Background',\r\n colorCode: 'c2',\r\n colorVariable: 'grayscale_gray_background_c2',\r\n },\r\n {\r\n color: bookitColors.grayscale.grayBackgroundLight,\r\n colorName: 'Gray Background Light',\r\n colorCode: 'c1',\r\n colorVariable: 'grayscale_gray_bg_light_c1',\r\n },\r\n ],\r\n};\r\nexport const primaryColorMeta: ColorSemanticMeta = {\r\n Name: 'Primary',\r\n Title: 'Primary brand blue color',\r\n Colors: [\r\n {\r\n color: bookitColors.primary.dark,\r\n colorName: 'Dark Text',\r\n colorCode: 'c10',\r\n colorVariable: 'primary_dark_text_c10',\r\n },\r\n {\r\n color: bookitColors.primary.hover,\r\n colorName: 'Hover',\r\n colorCode: 'c9',\r\n colorVariable: 'primary_hover_c9',\r\n },\r\n {\r\n color: bookitColors.primary.regular,\r\n colorName: 'Regular',\r\n colorCode: 'c8',\r\n colorVariable: 'primary_regular_c8',\r\n },\r\n {\r\n color: bookitColors.primary.components,\r\n colorName: 'Components',\r\n colorCode: 'c7',\r\n colorVariable: 'primary_components_c7',\r\n },\r\n {\r\n color: bookitColors.primary.componentsLight,\r\n colorName: 'Components Light',\r\n colorCode: 'c6',\r\n colorVariable: 'primary_components_light_c6',\r\n },\r\n {\r\n color: bookitColors.primary.borders,\r\n colorName: 'Borders',\r\n colorCode: 'c5',\r\n colorVariable: 'primary_borders_c5',\r\n },\r\n {\r\n color: bookitColors.primary.disabled,\r\n colorName: 'Disabled',\r\n colorCode: 'c4',\r\n colorVariable: 'primary_disabled_c4',\r\n },\r\n {\r\n color: bookitColors.primary.bgHover,\r\n colorName: 'Background Hover',\r\n colorCode: 'c3',\r\n colorVariable: 'primary_bg_hover_c3',\r\n },\r\n {\r\n color: bookitColors.primary.background,\r\n colorName: 'Background',\r\n colorCode: 'c2',\r\n colorVariable: 'primary_background_c2',\r\n },\r\n {\r\n color: bookitColors.primary.bgLight,\r\n colorName: 'Background Light',\r\n colorCode: 'c1',\r\n colorVariable: 'primary_bg_light_c1',\r\n },\r\n ],\r\n};\r\nexport const successColorMeta: ColorSemanticMeta = {\r\n Name: 'Success',\r\n Title: 'Main confirmation messages',\r\n Colors: [\r\n {\r\n color: bookitColors.success.dark,\r\n colorName: 'Dark Text',\r\n colorCode: 'c10',\r\n colorVariable: 'success_dark_text_c10',\r\n },\r\n {\r\n color: bookitColors.success.hover,\r\n colorName: 'Hover',\r\n colorCode: 'c9',\r\n colorVariable: 'success_hover_c9',\r\n },\r\n {\r\n color: bookitColors.success.regular,\r\n colorName: 'Regular',\r\n colorCode: 'c8',\r\n colorVariable: 'success_regular_c8',\r\n },\r\n {\r\n color: bookitColors.success.components,\r\n colorName: 'Components',\r\n colorCode: 'c7',\r\n colorVariable: 'success_components_c7',\r\n },\r\n {\r\n color: bookitColors.success.componentsLight,\r\n colorName: 'Components Light',\r\n colorCode: 'c6',\r\n colorVariable: 'success_components_light_c6',\r\n },\r\n {\r\n color: bookitColors.success.borders,\r\n colorName: 'Borders',\r\n colorCode: 'c5',\r\n colorVariable: 'success_borders_c5',\r\n },\r\n {\r\n color: bookitColors.success.disabled,\r\n colorName: 'Disabled',\r\n colorCode: 'c4',\r\n colorVariable: 'success_disabled_c4',\r\n },\r\n {\r\n color: bookitColors.success.bgHover,\r\n colorName: 'Background Hover',\r\n colorCode: 'c3',\r\n colorVariable: 'success_bg_hover_c3',\r\n },\r\n {\r\n color: bookitColors.success.background,\r\n colorName: 'Background',\r\n colorCode: 'c2',\r\n colorVariable: 'success_background_c2',\r\n },\r\n {\r\n color: bookitColors.success.bgLight,\r\n colorName: 'Background Light',\r\n colorCode: 'c1',\r\n colorVariable: 'success_bg_light_c1',\r\n },\r\n ],\r\n};\r\nexport const dangerColorMeta: ColorSemanticMeta = {\r\n Name: 'Danger',\r\n Title: 'For main danger buttons and indication',\r\n Colors: [\r\n {\r\n color: bookitColors.danger.dark,\r\n colorName: 'Dark Text',\r\n colorCode: 'c10',\r\n colorVariable: 'danger_dark_text_c10',\r\n },\r\n {\r\n color: bookitColors.danger.hover,\r\n colorName: 'Hover',\r\n colorCode: 'c9',\r\n colorVariable: 'danger_hover_c9',\r\n },\r\n {\r\n color: bookitColors.danger.regular,\r\n colorName: 'Regular',\r\n colorCode: 'c8',\r\n colorVariable: 'danger_regular_c8',\r\n },\r\n {\r\n color: bookitColors.danger.components,\r\n colorName: 'Components',\r\n colorCode: 'c7',\r\n colorVariable: 'danger_components_c7',\r\n },\r\n {\r\n color: bookitColors.danger.componentsLight,\r\n colorName: 'Components Light',\r\n colorCode: 'c6',\r\n colorVariable: 'danger_components_light_c6',\r\n },\r\n {\r\n color: bookitColors.danger.borders,\r\n colorName: 'Borders',\r\n colorCode: 'c5',\r\n colorVariable: 'danger_borders_c5',\r\n },\r\n {\r\n color: bookitColors.danger.disabled,\r\n colorName: 'Disabled',\r\n colorCode: 'c4',\r\n colorVariable: 'danger_disabled_c4',\r\n },\r\n {\r\n color: bookitColors.danger.bgHover,\r\n colorName: 'Background Hover',\r\n colorCode: 'c3',\r\n colorVariable: 'danger_bg_hover_c3',\r\n },\r\n {\r\n color: bookitColors.danger.background,\r\n colorName: 'Background',\r\n colorCode: 'c2',\r\n colorVariable: 'danger_background_c2',\r\n },\r\n {\r\n color: bookitColors.danger.bgLight,\r\n colorName: 'Background Light',\r\n colorCode: 'c1',\r\n colorVariable: 'danger_bg_light_c1',\r\n },\r\n ],\r\n};\r\nexport const alertColorMeta: ColorSemanticMeta = {\r\n Name: 'alert',\r\n Title: 'For main alert buttons and indication',\r\n Colors: [\r\n {\r\n color: bookitColors.warning.dark,\r\n colorName: 'Dark Text',\r\n colorCode: 'c10',\r\n colorVariable: 'alert_dark_text_c10',\r\n },\r\n {\r\n color: bookitColors.warning.hover,\r\n colorName: 'Hover',\r\n colorCode: 'c9',\r\n colorVariable: 'alert_hover_c9',\r\n },\r\n {\r\n color: bookitColors.warning.regular,\r\n colorName: 'Regular',\r\n colorCode: 'c8',\r\n colorVariable: 'alert_regular_c8',\r\n },\r\n {\r\n color: bookitColors.warning.components,\r\n colorName: 'Components',\r\n colorCode: 'c7',\r\n colorVariable: 'alert_components_c7',\r\n },\r\n {\r\n color: bookitColors.warning.componentsLight,\r\n colorName: 'Components Light',\r\n colorCode: 'c6',\r\n colorVariable: 'alert_components_light_c6',\r\n },\r\n {\r\n color: bookitColors.warning.borders,\r\n colorName: 'Borders',\r\n colorCode: 'c5',\r\n colorVariable: 'alert_borders_c5',\r\n },\r\n {\r\n color: bookitColors.warning.disabled,\r\n colorName: 'Disabled',\r\n colorCode: 'c4',\r\n colorVariable: 'alert_disabled_c4',\r\n },\r\n {\r\n color: bookitColors.warning.bgHover,\r\n colorName: 'Background Hover',\r\n colorCode: 'c3',\r\n colorVariable: 'alert_bg_hover_c3',\r\n },\r\n {\r\n color: bookitColors.warning.background,\r\n colorName: 'Background',\r\n colorCode: 'c2',\r\n colorVariable: 'alert_background_c2',\r\n },\r\n {\r\n color: bookitColors.warning.bgLight,\r\n colorName: 'Background Light',\r\n colorCode: 'c1',\r\n colorVariable: 'alert_bg_light_c1',\r\n },\r\n ],\r\n};\r\nexport const violetColorMeta: ColorSemanticMeta = {\r\n Name: 'Violet',\r\n Title: 'Secondary',\r\n Colors: [\r\n {\r\n color: bookitColors.secondary.violet.dark,\r\n colorName: 'Dark Text',\r\n colorCode: 'c10',\r\n colorVariable: 'secondary_violet_dark_text_c10',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.hover,\r\n colorName: 'Hover',\r\n colorCode: 'c9',\r\n colorVariable: 'secondary_violet_hover_c9',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.regular,\r\n colorName: 'Regular',\r\n colorCode: 'c8',\r\n colorVariable: 'secondary_violet_regular_c8',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.components,\r\n colorName: 'Components',\r\n colorCode: 'c7',\r\n colorVariable: 'secondary_violet_components_c7',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.componentsLight,\r\n colorName: 'Components Light',\r\n colorCode: 'c6',\r\n colorVariable: 'secondary_violet_components_light_c6',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.borders,\r\n colorName: 'Borders',\r\n colorCode: 'c5',\r\n colorVariable: 'secondary_violet_borders_c5',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.disabled,\r\n colorName: 'Disabled',\r\n colorCode: 'c4',\r\n colorVariable: 'secondary_violet_disabled_c4',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.bgHover,\r\n colorName: 'Background Hover',\r\n colorCode: 'c3',\r\n colorVariable: 'secondary_violet_bg_hover_c3',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.background,\r\n colorName: 'Background',\r\n colorCode: 'c2',\r\n colorVariable: 'secondary_violet_background_c2',\r\n },\r\n {\r\n color: bookitColors.secondary.violet.bgLight,\r\n colorName: 'Background Light',\r\n colorCode: 'c1',\r\n colorVariable: 'secondary_violet_bg_light_c1',\r\n },\r\n ],\r\n};\r\n","/**\r\n * UserProfileSettings\r\n */\r\nimport { UserProfileSettings } from 'types/UserProfileSettings';\r\nexport const USER_PROFILE_KEYS = ['SideBarExpanded'] as const;\r\nexport class UserProfile {\r\n savedSettings: UserProfileSettings[];\r\n constructor(settings: UserProfileSettings[]) {\r\n this.savedSettings = settings;\r\n }\r\n public GetSettingByKey(key: string): UserProfileSettings | null {\r\n if (this.savedSettings.length > 0) {\r\n let sett = this.savedSettings.find((value, index) => value.Key === key);\r\n return sett === undefined ? null : sett;\r\n } else {\r\n return null;\r\n }\r\n }\r\n public GetSettingByKeyOrDefault(key: string): UserProfileSettings {\r\n let defaultSetting = {\r\n Key: key,\r\n Value: '',\r\n Enabled: false,\r\n Selected: false,\r\n UserName: '',\r\n Id: 0,\r\n Name: '',\r\n AdGroup: '',\r\n DefaultGroups: '',\r\n IsMultiple: null,\r\n StaffEnabled: false,\r\n } as UserProfileSettings;\r\n if (this.savedSettings.length > 0) {\r\n let sett = this.savedSettings.find((value, index) => value.Key === key);\r\n return sett === undefined ? defaultSetting : sett;\r\n } else {\r\n return defaultSetting;\r\n }\r\n }\r\n public UpdateSettingByKey(key: string): UserProfileSettings {\r\n let defaultSetting = {\r\n Key: key,\r\n Value: '',\r\n Enabled: false,\r\n Selected: false,\r\n UserName: '',\r\n Id: 0,\r\n Name: '',\r\n AdGroup: '',\r\n DefaultGroups: '',\r\n IsMultiple: null,\r\n StaffEnabled: false,\r\n } as UserProfileSettings;\r\n if (this.savedSettings.length > 0) {\r\n let sett = this.savedSettings.find((value, index) => value.Key === key);\r\n return sett === undefined ? defaultSetting : sett;\r\n } else {\r\n return defaultSetting;\r\n }\r\n }\r\n public GetSettingValueBy(\r\n comparator: (item: UserProfileSettings) => boolean,\r\n ): UserProfileSettings | undefined {\r\n return this.savedSettings.find(comparator);\r\n }\r\n\r\n public GetSettingValueByKey(key: string): any | null {\r\n if (this.savedSettings.length > 0) {\r\n let sett = this.savedSettings.find((value, index) => value.Key === key);\r\n switch (key) {\r\n case 'SideBarExpanded': {\r\n return sett === undefined ? true : sett.Enabled;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public GetSideBarExpanded(key: string): any | null {\r\n if (this.savedSettings.length > 0) {\r\n let sett = this.savedSettings.find((value, index) => value.Key === key);\r\n switch (key) {\r\n case 'SideBarExpanded': {\r\n return sett === undefined ? true : sett.Enabled;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n","import { RootState } from 'types';\r\nimport { createSelector } from '@reduxjs/toolkit';\r\nimport { AuthenticatedUser, IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { SiteMapProvider } from 'types/SiteMapSettings';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { SettingModel } from 'utils/globalSettings/SettingModel';\r\nimport { UserProfile } from 'utils/userProfileSettings';\r\nimport { initialState } from '.';\r\nimport { UserRegistersToSpecificCoresType } from 'enums/enums';\r\nimport { appendTrailingSlash } from 'utils/url-utils';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { ReservationStatus } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { TFunction } from 'i18next';\r\nimport { Entity } from 'types/common';\r\nimport { pickBy } from 'lodash';\r\n\r\nconst selectSlice = (state: RootState) => {\r\n return state.appSettings || initialState;\r\n};\r\nexport const selectAppSettings = createSelector(\r\n [selectSlice],\r\n state => state.appSettings,\r\n);\r\n\r\nexport const selectKnownModules = createSelector(\r\n [selectAppSettings],\r\n state => state?.Modules,\r\n);\r\nexport const selectKnownModule = createSelector(\r\n [selectKnownModules, (state, knownModules: KnownModules) => knownModules],\r\n (state, knownModules: KnownModules) => state?.includes(knownModules) ?? false,\r\n);\r\nexport const selectSystemLocale = createSelector(\r\n [selectAppSettings],\r\n state => state?.Globalization.Locale,\r\n);\r\nexport const selectDateFnsLocale = createSelector(\r\n [selectAppSettings],\r\n state => {\r\n const locale = state?.Globalization?.Locale;\r\n return locale === undefined\r\n ? undefined\r\n : dateUtils.dateFnsCultureName(locale);\r\n },\r\n);\r\nexport const selectUseAmPm = createSelector([selectAppSettings], state => {\r\n return state?.Globalization?.UseAmPm;\r\n});\r\nexport const selectSystemFirstDayOfWeek = createSelector(\r\n [selectAppSettings],\r\n state => state?.Globalization.FirstDayOfWeek ?? 1,\r\n);\r\nexport const selectWebVersion = createSelector(\r\n [selectAppSettings],\r\n state => state?.WebVersion,\r\n);\r\nconst DefaultUploadFileSizeLimit = 500000;\r\nexport const selectUploadFileSizeLimit = createSelector(\r\n [selectAppSettings],\r\n state => state?.UploadFileSizeLimit || DefaultUploadFileSizeLimit,\r\n);\r\nexport const selectMinimizedBookitlabLogo = createSelector(\r\n [selectAppSettings],\r\n state => state?.MinimizedBookitlabLogo || false,\r\n);\r\nconst defaultForbiddenFileExtensions = [\r\n '.dll',\r\n '.exe',\r\n '.vbs',\r\n '.js',\r\n '.ts',\r\n '.tsx',\r\n '.msi',\r\n '.com',\r\n '.bat',\r\n];\r\nexport const selectForbiddenFileExtensions = createSelector(\r\n [selectAppSettings],\r\n state => state?.ForbiddenFileExtensions ?? defaultForbiddenFileExtensions,\r\n);\r\nexport const selectLastCodeUpdate = createSelector(\r\n [selectAppSettings],\r\n state => state?.LastCodeUpdate,\r\n);\r\nexport const selectAppTimeZone = createSelector(\r\n [selectAppSettings],\r\n state => state?.TimeZone,\r\n);\r\nexport const selectPublicUrl = createSelector([selectAppSettings], state =>\r\n state?.PublicBaseUrl === undefined\r\n ? undefined\r\n : appendTrailingSlash(state.PublicBaseUrl),\r\n);\r\nexport const selectRegisterUserGroup = createSelector(\r\n [selectAppSettings],\r\n state => state?.DefaultRegistrationGroup,\r\n);\r\nexport const selectOffsetDate = createSelector(\r\n [selectAppTimeZone, (state, date: Date | string | undefined | null) => date],\r\n (timeZone, date) => {\r\n const systemOffset = timeZone?.TimezoneOffsetMinutes ?? 0;\r\n let correctDate =\r\n date === null || date === undefined\r\n ? dateUtils.dateOrStringToDate(new Date())\r\n : dateUtils.dateOrStringToDate(date);\r\n const currentDateOffset = correctDate.getTimezoneOffset();\r\n const dateOrNow = dateUtils.addMinutes(\r\n correctDate,\r\n systemOffset + currentDateOffset,\r\n );\r\n return dateOrNow;\r\n },\r\n);\r\nexport const selectUserRegistersToSpecificCores = createSelector(\r\n [selectAppSettings],\r\n state =>\r\n (state?.UserRegistersToSpecificCores as UserRegistersToSpecificCoresType) ||\r\n UserRegistersToSpecificCoresType.UserRegistersToSpecificCores_NA,\r\n);\r\nexport const selectEmailFromAddress = createSelector(\r\n [selectAppSettings],\r\n state => state?.EmailFromAddress,\r\n);\r\nexport const selectExistingImages = createSelector(\r\n [selectAppSettings],\r\n state => state?.ExistingImages,\r\n);\r\nconst constructAuthenticatedUser = (a?: IAuthenticatedUser) => {\r\n return a === undefined ? undefined : new AuthenticatedUser(a);\r\n};\r\nconst selectAuthenticatedUserObject = createSelector(\r\n [selectSlice],\r\n state => state.authenticatedUser,\r\n);\r\nexport const selectAuthenticatedUser = createSelector(\r\n [selectAuthenticatedUserObject],\r\n state => {\r\n const a = state;\r\n const b = constructAuthenticatedUser(a);\r\n return b;\r\n },\r\n);\r\n/**\r\n * Returns enabled asset attributes for current session (public/private)\r\n * */\r\nexport const selectAssetFieldSettings = createSelector(\r\n [selectAppSettings, selectAuthenticatedUser],\r\n (appSettings, authenticatedUser) =>\r\n pickBy(\r\n appSettings?.AssetFieldSettings,\r\n (value, key) => value.IsPublic || authenticatedUser !== undefined,\r\n ),\r\n);\r\nexport const selectAssetPopupSettings = createSelector(\r\n [selectAppSettings, selectAssetFieldSettings, selectAuthenticatedUser],\r\n (appSettings, assetFieldSettings, authenticatedUser) => {\r\n return Object.entries(assetFieldSettings).map(([key, value]) => ({\r\n Id: key,\r\n Visible: true,\r\n DisplayName: value.DisplayName,\r\n }));\r\n },\r\n);\r\nexport const selectIsFullScreen = createSelector(\r\n [selectSlice],\r\n state => state.isFullScreen,\r\n);\r\nexport const selectCurrentLanguage = createSelector(\r\n [selectSlice],\r\n state => state.currentLanguage,\r\n);\r\n\r\nexport const selectLoading = createSelector([selectSlice], state => {\r\n let loading =\r\n state.isAuthenticated === true\r\n ? state.loadingAppSettings ||\r\n state.loadingSiteMapSettings ||\r\n state.loadingUserProfileSettings ||\r\n state.loadingSystemSettings\r\n : state.isAuthenticated === false\r\n ? state.loadingAppSettings || state.loadingSystemSettings\r\n : state.loadingAuthenticatedUser || state.loadingSystemSettings;\r\n return loading;\r\n});\r\nexport const selectError = createSelector([selectSlice], state => state.error);\r\nexport const selectLoadingUser = createSelector(\r\n [selectSlice],\r\n state => state.loadingAuthenticatedUser,\r\n);\r\nexport const selectNotifications = createSelector(\r\n [selectSlice],\r\n state => state.notifications,\r\n);\r\nconst selectGlobalSettingsObj = createSelector(\r\n [selectSlice],\r\n state => state.systemSettings,\r\n);\r\nexport const selectglobalSettings = createSelector(\r\n [selectGlobalSettingsObj],\r\n state => new GlobalSettings(state || ([] as SettingModel[])),\r\n);\r\nexport const selectGlobalSetting = createSelector(\r\n [selectGlobalSettingsObj, (state, name: AllowedSettings) => name],\r\n (globalSettingsObj, name) => {\r\n const x = globalSettingsObj.find(\r\n f =>\r\n f.Name.trim().toLowerCase() ===\r\n AllowedSettings[name].trim().toLowerCase(),\r\n );\r\n return x?.Value ?? undefined;\r\n },\r\n);\r\nexport const selectImageExist = createSelector(\r\n [selectExistingImages, (state, image: string | null) => image],\r\n (existingImages, image) => {\r\n let result = false;\r\n if (image === null) {\r\n return false;\r\n }\r\n if (!!existingImages && existingImages.length > 0) {\r\n result = existingImages.some(f => f === image);\r\n }\r\n return result;\r\n },\r\n);\r\nexport const selectGlobalSettingBool = createSelector(\r\n [selectGlobalSettingsObj, (state, name: AllowedSettings) => name],\r\n (globalSettingsObj, name) => {\r\n const x = globalSettingsObj.find(\r\n f =>\r\n f.Name.trim().toLowerCase() ===\r\n AllowedSettings[name].trim().toLowerCase(),\r\n );\r\n return x?.Value === null ||\r\n x?.Value === undefined ||\r\n x.Value === '' ||\r\n x.Value.toLowerCase() === 'false'\r\n ? false\r\n : x.Value.toLowerCase() === 'true';\r\n },\r\n);\r\nexport const selectSiteMapSettings = createSelector(\r\n [selectSlice],\r\n state => state.siteMapSettings,\r\n);\r\nexport const selectSiteMapProvider = createSelector(\r\n [selectSlice],\r\n state => state.siteMapProvider ?? new SiteMapProvider(state.siteMapSettings),\r\n);\r\nexport const selectEventsCount = createSelector(\r\n [selectSlice],\r\n state => state.eventsCount,\r\n);\r\nexport const selectEventsCountLoading = createSelector(\r\n [selectSlice],\r\n state => state.loadingEventsCount,\r\n);\r\nexport const selectUserProfileSettings = createSelector(\r\n [selectSlice],\r\n state => new UserProfile(state.userProfileSettings),\r\n);\r\n/**\r\n * Selects specific user profile setting value provided by the key\r\n * usage example:\r\n * const userProfileValue = useSelector(state => selectUserProfileSetting(state, \"userProfileKey\"))\r\n */\r\nexport const selectUserProfileSetting = createSelector(\r\n [selectUserProfileSettings, (state, key) => key],\r\n (state, key) => state.GetSettingByKey(key)?.Value,\r\n);\r\nexport const selectIsExpanded = createSelector(\r\n [selectSlice],\r\n state => state.isExpanded,\r\n);\r\nexport const selectIsSubBarCollapsed = createSelector(\r\n [selectSlice],\r\n state => state.subBarCollapsed,\r\n);\r\n\r\nexport const selectUpdatedUserProfileSettings = createSelector(\r\n [selectSlice],\r\n state => state.updatedUserProfileSettings,\r\n);\r\nexport const selectIsAuthenticated = createSelector(\r\n [selectSlice],\r\n state => state.isAuthenticated,\r\n);\r\nexport const selectUpdatedExpandState = createSelector(\r\n [selectSlice],\r\n state => state.updatedExpandState,\r\n);\r\nexport const selectIsExpandedSideBar = createSelector(\r\n [selectSlice, (state, isMobile) => isMobile],\r\n (state, isMobile) => {\r\n let result: boolean = false;\r\n if (isMobile) {\r\n result = state.isExpanded;\r\n } else {\r\n if (state.updatedExpandState) {\r\n result = state.isExpanded;\r\n } else {\r\n let sett = new UserProfile(state.userProfileSettings);\r\n let expanded = sett.GetSideBarExpanded('SideBarExpanded');\r\n result = expanded !== null ? expanded : true;\r\n }\r\n }\r\n return result;\r\n },\r\n);\r\nexport const selectGlobalServiceGroupFilter = createSelector(\r\n [selectSlice],\r\n state => {\r\n let topServiceGroupsIsHidden = state.systemSettings.find(\r\n f => f.Id === 'HideTopServiceGroupFilter',\r\n );\r\n if (\r\n topServiceGroupsIsHidden !== null &&\r\n topServiceGroupsIsHidden !== undefined\r\n ) {\r\n if (topServiceGroupsIsHidden.Value === 'True') {\r\n return [];\r\n } else {\r\n return state.globalServiceGroupFilter;\r\n }\r\n } else {\r\n return state.globalServiceGroupFilter;\r\n }\r\n },\r\n);\r\nexport const selectShowGlobalServiceGroupFilter = createSelector(\r\n [selectSlice],\r\n state => state.showGlobalServiceGroupFilter,\r\n);\r\nexport const selectShowGlobalServiceGroupsAsList = createSelector(\r\n [selectSlice],\r\n state => state.showGlobalServiceGroupsAsList,\r\n);\r\nexport const selectBarcodeScanTarget = createSelector(\r\n [selectSlice],\r\n state => state.barcodeScanTarget,\r\n);\r\nexport const selectShowAllCores = createSelector(\r\n [selectSlice],\r\n state => state.showAllCores,\r\n);\r\n\r\n/**\r\n * Selects reservation statuses enabled on the system level\r\n * ```\r\n * const statuses = useSelector(state => selectReservationStatuses(state, t));\r\n * ```\r\n */\r\nexport const selectReservationStatuses = createSelector(\r\n [\r\n selectSlice,\r\n state => selectKnownModule(state, KnownModules.UserGroupCoordRole),\r\n state =>\r\n selectGlobalSettingBool(state, AllowedSettings.AllowWorkflowBooking) &&\r\n selectGlobalSettingBool(\r\n state,\r\n AllowedSettings.MultipleTentativeReservationsUnderWorkflowBooking,\r\n ),\r\n state =>\r\n selectGlobalSettingBool(state, AllowedSettings.DraftReservationsEnabled),\r\n (state, t: TFunction) => t,\r\n ],\r\n (\r\n state,\r\n UserGroupCoordRole,\r\n AllowWorkflowBooking,\r\n DraftReservationsEnabled,\r\n t,\r\n ) => {\r\n const GetListItem = (s: ReservationStatus) => ({\r\n Id: s,\r\n Name: t(ReservationStatus[s]),\r\n });\r\n const list: Array> = [];\r\n\r\n list.push(GetListItem(ReservationStatus.Approved));\r\n list.push(GetListItem(ReservationStatus.Pending));\r\n if (UserGroupCoordRole) {\r\n list.push(GetListItem(ReservationStatus.PendingCoord));\r\n }\r\n list.push(GetListItem(ReservationStatus.Cancelled));\r\n list.push(GetListItem(ReservationStatus.CancelledByAdmin));\r\n if (AllowWorkflowBooking) {\r\n list.push(GetListItem(ReservationStatus.Tentative));\r\n }\r\n if (DraftReservationsEnabled) {\r\n list.push(GetListItem(ReservationStatus.Draft));\r\n }\r\n return list;\r\n },\r\n);\r\n","import { GetBooleanFilterOptions } from 'app/components/BooleanPicker';\r\nimport { ALL_PERIOD_TYPES, PeriodTypes } from 'app/components/DatePeriods';\r\nimport startOfDay from 'date-fns/startOfDay';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { CustomDate, DateType } from 'types/CustomDate';\r\nimport { INumbersRange } from 'types/INumbersRange';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { isNullOrUndefined, valOrNull } from 'utils/typeUtils';\r\nimport { FilterValueType } from '../BasicFilter/FilterValueType';\r\nimport {\r\n FilterIntializer,\r\n FilterSerializer,\r\n} from '../BasicFilter/IFilterSettings';\r\nimport { AssetRangeType, isAssetRangeType } from '../Filters/AssetRangeFilter';\r\n\r\nexport interface FilterParam {\r\n Name: string;\r\n Value?: FilterValueType;\r\n}\r\n\r\n/**\r\n * Case Insensitive URLSearchParams\r\n */\r\nexport class URLSearchParamsCI extends URLSearchParams {\r\n constructor(value?: string | URLSearchParams) {\r\n super();\r\n\r\n const params = new URLSearchParams(value);\r\n for (const [name, value] of params) {\r\n this.append(name.toLowerCase(), value);\r\n }\r\n }\r\n public get(name: string): string | null {\r\n return super.get(name.toLowerCase());\r\n }\r\n public set(name: string, value: string | undefined) {\r\n this.delete(name.toLowerCase());\r\n if (value !== undefined) {\r\n super.set(name, value);\r\n }\r\n }\r\n\r\n public toObject() {\r\n const result = {};\r\n for (const key of this.keys()) {\r\n result[key] = this.get(key);\r\n }\r\n return result;\r\n }\r\n\r\n public equals(other: URLSearchParams): boolean {\r\n const b = new URLSearchParamsCI(other);\r\n return this.toString() === b.toString();\r\n }\r\n}\r\n\r\nexport function GetRawValue(params: URLSearchParams, fieldName: string) {\r\n var value = params.get(fieldName);\r\n if (value === null) {\r\n return undefined;\r\n }\r\n if (value === '') {\r\n return null;\r\n }\r\n return setisInversedForUrl(value, false);\r\n}\r\n\r\nexport const isInversedPrefix = 'not;';\r\n\r\nexport function isFilterInversed(val: string | null | undefined) {\r\n if ((val ?? '') === '') {\r\n return false;\r\n }\r\n return val!.startsWith(isInversedPrefix);\r\n}\r\n\r\nexport function findIsfilterInversed(search: string, key: string | undefined) {\r\n if (key === undefined) return undefined;\r\n const params = new URLSearchParams(search);\r\n const val = params.get(key);\r\n return isFilterInversed(val);\r\n}\r\n\r\nexport function setisInversedForUrl<\r\n T extends string | null | undefined = string | null | undefined\r\n>(val: T, isInversed: boolean) {\r\n if ((val ?? '') === '') return val;\r\n const definedVal = val!;\r\n const hasprefix = definedVal.startsWith(isInversedPrefix);\r\n if (isInversed && !hasprefix) {\r\n return isInversedPrefix + definedVal;\r\n }\r\n if (!isInversed && hasprefix) {\r\n return definedVal.substring(isInversedPrefix.length);\r\n }\r\n return definedVal;\r\n}\r\n\r\n/**\r\n *\r\n * @param rawValue\r\n * @returns\r\n */\r\nexport function GetNumberOrUndefined(rawValue: string | undefined | null) {\r\n if (rawValue === undefined) {\r\n return undefined;\r\n }\r\n if (rawValue === null) {\r\n return null;\r\n }\r\n var number = parseInt(rawValue);\r\n if (isNaN(number)) {\r\n return undefined;\r\n }\r\n return number;\r\n}\r\nexport function GetStringOrUndefined(rawValue: string | undefined | null) {\r\n if (rawValue === undefined) {\r\n return undefined;\r\n }\r\n if (rawValue === null) {\r\n return null;\r\n }\r\n if (rawValue === '') {\r\n return null;\r\n }\r\n return rawValue;\r\n}\r\nexport function getStringUnionOrUndefined(\r\n rawValue: string | undefined | null,\r\n unionArray: Array,\r\n) {\r\n if (rawValue === undefined) {\r\n return undefined;\r\n }\r\n if (rawValue === null) {\r\n return null;\r\n }\r\n if (rawValue === '') {\r\n return null;\r\n }\r\n return unionArray.find(\r\n f => f.toLocaleLowerCase() === rawValue?.toLowerCase(),\r\n );\r\n}\r\nexport function GetBooleanOrUndefined(rawValue: string | undefined | null) {\r\n if (rawValue === undefined) {\r\n return undefined;\r\n }\r\n if (rawValue === null) {\r\n return null;\r\n }\r\n const value = rawValue.toLowerCase() === 'true';\r\n return value;\r\n}\r\nexport function GetDateOrUndefined(\r\n rawValue: string | undefined | null,\r\n type?: DateType,\r\n) {\r\n if (rawValue === undefined) {\r\n return undefined;\r\n }\r\n if (rawValue === null) {\r\n return null;\r\n }\r\n const date = dateUtils.parseQueryStringDate(rawValue);\r\n if (isNaN(date.getTime())) {\r\n return undefined;\r\n }\r\n return new CustomDate(date, type ?? 'complete');\r\n}\r\n\r\nexport function GetPartialEntity(\r\n id: T | undefined | null,\r\n): Identifiable | undefined | null {\r\n if (id === undefined) {\r\n return undefined;\r\n }\r\n if (id === null) {\r\n return null;\r\n }\r\n return { Id: id };\r\n}\r\nexport function GetEnum(\r\n value: string | null | undefined,\r\n enumObject: object,\r\n t: TFunction,\r\n) {\r\n if (value === null) {\r\n return null;\r\n }\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n var options = enumToEntityArray(enumObject, t);\r\n var numValue = tryParseInt(value);\r\n if (numValue === undefined) {\r\n return null;\r\n }\r\n if (isNaN(numValue)) {\r\n return null;\r\n }\r\n var item = options.find(f => f.Id === numValue);\r\n\r\n return item ?? null;\r\n}\r\nexport function GetBooleanEntity(\r\n value: boolean | undefined | null,\r\n t: TFunction,\r\n): Entity | undefined | null {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n if (value === null) {\r\n return null;\r\n }\r\n return {\r\n Id: value,\r\n Name: t(value === true ? translations.Yes : translations.No),\r\n };\r\n}\r\n\r\nexport const initPickerValue = (\r\n f: (value: string) => Promise[]>,\r\n additionalOptions?: Array>,\r\n): FilterIntializer => {\r\n return async (item: FilterValueType) => {\r\n const x = item as Identifiable;\r\n const id = x.Id;\r\n // if some \"addionalItem\" are injected through the filter - first try to look the entity there\r\n // for example, the \"all my managed servcies\" - with the magic -999 id\r\n const additionalItem = additionalOptions?.find(option => option.Id === id);\r\n if (additionalItem !== undefined) {\r\n return Promise.resolve(additionalItem);\r\n }\r\n const failureResult: Entity = { Id: id, Name: 'N/A' };\r\n if (item === null || (!!x && x.Id === '')) {\r\n return Promise.resolve(failureResult);\r\n }\r\n try {\r\n const data: any = await f(id.toString());\r\n const verifiedData = !!data.value ? data.value : data;\r\n const name =\r\n verifiedData.length > 0\r\n ? (verifiedData[0] as Entity)\r\n : failureResult;\r\n return name;\r\n } catch {\r\n return failureResult;\r\n }\r\n };\r\n};\r\nexport const initExPickerValue = (\r\n f: (\r\n value: string,\r\n sourceUrl?: any,\r\n withoutServiceGroups?: boolean,\r\n ) => Promise[]>,\r\n additionalOptions?: Array>,\r\n sourceUrl?: any,\r\n withoutServiceGroups?: boolean,\r\n) => {\r\n return async (item: FilterValueType) => {\r\n const x = item as Identifiable;\r\n const id = x.Id;\r\n // if some \"addionalItem\" are injected through the filter - first try to look the entity there\r\n // for example, the \"all my managed servcies\" - with the magic -999 id\r\n const additionalItem = additionalOptions?.find(option => option.Id === id);\r\n if (additionalItem !== undefined) {\r\n return Promise.resolve(additionalItem);\r\n }\r\n const failureResult: Entity = { Id: id, Name: 'N/A' };\r\n if (item === null || (!!x && x.Id === '')) {\r\n return Promise.resolve(failureResult);\r\n }\r\n try {\r\n const data: any = await f(id.toString(), sourceUrl, withoutServiceGroups);\r\n const verifiedData = !!data.value ? data.value : data;\r\n const name =\r\n verifiedData.length > 0\r\n ? (verifiedData[0] as Entity)\r\n : failureResult;\r\n return name;\r\n } catch {\r\n return failureResult;\r\n }\r\n };\r\n};\r\n\r\nexport const initMultiExPickerValue = (\r\n f: (\r\n value: string | undefined,\r\n sourceUrl?: any,\r\n separator?: string,\r\n serviceGroups?: Array>,\r\n ) => Promise[]>,\r\n additionalOptions?: Entity[],\r\n sourceUrl?: any,\r\n separator?: string,\r\n): FilterIntializer => {\r\n return async (\r\n item: FilterValueType,\r\n serviceGroups?: Array>,\r\n ) => {\r\n const x = item as Identifiable[];\r\n const ids = x.map(v => v.Id);\r\n const additionalItems = additionalOptions?.filter(option =>\r\n ids.includes(option.Id),\r\n );\r\n if (additionalItems && additionalItems.length) {\r\n return additionalItems;\r\n }\r\n const failureResult: Entity[] = [];\r\n if (item === null || (!!x && !x.length) || ids.every(v => !v || v === '')) {\r\n return failureResult;\r\n }\r\n try {\r\n const data: Entity[] = await f(\r\n ids.join(separator || '|'),\r\n sourceUrl,\r\n separator || '|',\r\n serviceGroups,\r\n );\r\n return data.length > 0 ? data : failureResult;\r\n } catch {\r\n return failureResult;\r\n }\r\n };\r\n};\r\n\r\nexport const initMultiPickerValue = (\r\n f: (value: string) => Promise[]>,\r\n additionalOptions?: Entity[],\r\n) => {\r\n return async (item: FilterValueType) => {\r\n const x = item as Identifiable[];\r\n const ids = x.map(v => v.Id);\r\n const additionalItems = additionalOptions?.filter(option =>\r\n ids.includes(option.Id),\r\n );\r\n if (additionalItems && additionalItems.length) {\r\n return Promise.resolve(additionalItems);\r\n }\r\n const failureResult: Entity[] = [];\r\n if (\r\n item === null ||\r\n (!!x && !x.length) ||\r\n ids.every(v => v === undefined || v === null || v === '')\r\n ) {\r\n return Promise.resolve(failureResult);\r\n }\r\n try {\r\n const data = await f(ids.join('|'));\r\n return data.length > 0 ? data : failureResult;\r\n } catch {\r\n return failureResult;\r\n }\r\n };\r\n};\r\n\r\nexport function getFilterParams(search: string): FilterParam[] {\r\n let result = [] as FilterParam[];\r\n const params = new URLSearchParams(search);\r\n params.forEach((value, key) => {\r\n if (value !== '' && value !== undefined)\r\n result.push({ Name: key, Value: value });\r\n });\r\n return result;\r\n}\r\n\r\nexport function getDefaultFilterValue(\r\n name: string,\r\n params: FilterParam[],\r\n): string | undefined {\r\n const f = params.find(item => item.Name === name && item.Value !== '');\r\n if (f !== undefined) {\r\n return f.Value as string;\r\n } else return undefined;\r\n}\r\n\r\nexport function getDefaultFilterBool(\r\n name: string,\r\n params: FilterParam[],\r\n t: TFunction,\r\n): Entity | null {\r\n const f = params.find(item => item.Name === name && item.Value !== '');\r\n const value = f?.Value;\r\n const options = GetBooleanFilterOptions(t);\r\n\r\n return options.find(item => item.Id.toString() === value) ?? null;\r\n}\r\n\r\nexport function getDefaultFilterDate(\r\n name: string,\r\n params: FilterParam[],\r\n): Date | null {\r\n const st = getDefaultFilterValue(name, params);\r\n if (st === undefined) {\r\n return null;\r\n }\r\n const date = dateUtils.parseQueryStringDate(st);\r\n if (date === null) {\r\n return null;\r\n }\r\n return startOfDay(date);\r\n}\r\nexport const getPeriodTypeNameOrUndefined = (s: string | null | undefined) => {\r\n if (s === undefined) {\r\n return undefined;\r\n }\r\n const lowered = s?.toLowerCase();\r\n const namedValue: PeriodTypes | undefined = ALL_PERIOD_TYPES.find(\r\n f => f.toLowerCase() === lowered,\r\n );\r\n if (namedValue !== undefined) {\r\n return namedValue;\r\n }\r\n\r\n const num = GetNumberOrUndefined(s);\r\n if (num === null || num === undefined) {\r\n return null;\r\n }\r\n if (isNaN(num)) {\r\n return null;\r\n }\r\n\r\n if (num >= 0 && num < ALL_PERIOD_TYPES.length) {\r\n const numberedValue = ALL_PERIOD_TYPES[num];\r\n return numberedValue;\r\n }\r\n\r\n return namedValue;\r\n};\r\n\r\nexport function getDefaultFilterDatePeriod(\r\n periodTypeFieldName: string,\r\n customStartFieldName: string,\r\n customEndFieldName: string,\r\n params: URLSearchParams,\r\n): PresetDatesRange | undefined | null {\r\n let periodType = getPeriodTypeNameOrUndefined(\r\n GetRawValue(params, periodTypeFieldName),\r\n );\r\n\r\n const start = GetDateOrUndefined(\r\n GetRawValue(params, customStartFieldName),\r\n 'complete',\r\n );\r\n const end = GetDateOrUndefined(\r\n GetRawValue(params, customEndFieldName),\r\n 'complete',\r\n );\r\n\r\n // set the periodType to CustomDate if either start or end date were provided\r\n // this intended to handle cases where a link to the page is not fully constructed\r\n // e.g. /sompage?start=xxx will be translated to period type=CustomDate, start=xxx\r\n if (isNullOrUndefined(periodType)) {\r\n if (!isNullOrUndefined(start) || !isNullOrUndefined(end)) {\r\n periodType = 'CustomDate';\r\n }\r\n }\r\n\r\n if (periodType === undefined || periodType === null) {\r\n return periodType;\r\n }\r\n\r\n if (periodType === 'CustomDate') {\r\n return PresetDatesRange.Custom(start, end);\r\n } else {\r\n return PresetDatesRange.fromType(periodType, null, null);\r\n }\r\n}\r\n\r\nexport const presetDatesRangeToQueryString = (\r\n periodTypeFieldName,\r\n customStartFieldName,\r\n customEndFieldName,\r\n) => (value: FilterValueType | undefined) => {\r\n var result = new URLSearchParams();\r\n\r\n if (value === null) {\r\n result.append(periodTypeFieldName, '');\r\n return result;\r\n }\r\n if (value !== null && value !== undefined) {\r\n const type = (value as PresetDatesRange).type?.Id;\r\n const id = (value as PresetDatesRange).type?.Id;\r\n\r\n if (id !== undefined) {\r\n result.append(periodTypeFieldName, id.toString());\r\n if (type === 'CustomDate') {\r\n var start = (value as PresetDatesRange).start;\r\n if (start !== null && start !== undefined) {\r\n result.append(\r\n customStartFieldName,\r\n dateUtils.formatQueryStringDate(start, {\r\n representation:\r\n (start as CustomDate)?.representation ?? 'complete',\r\n }),\r\n );\r\n }\r\n var end = (value as PresetDatesRange).end;\r\n if (end !== null && end !== undefined) {\r\n result.append(\r\n customEndFieldName,\r\n dateUtils.formatQueryStringDate(end, {\r\n representation:\r\n (start as CustomDate)?.representation ?? 'complete',\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport const getDefaultFilterNumberPeriod = (\r\n fieldName: string,\r\n params: URLSearchParams,\r\n): INumbersRange | undefined | null => {\r\n const start = GetNumberOrUndefined(GetRawValue(params, `${fieldName}-min`));\r\n const end = GetNumberOrUndefined(GetRawValue(params, `${fieldName}-max`));\r\n if (start === undefined && end === undefined) {\r\n return undefined;\r\n } else if (start === null && end === null) {\r\n return null;\r\n } else {\r\n return {\r\n start: start ?? null,\r\n end: end ?? null,\r\n };\r\n }\r\n};\r\nexport const NumebersRangeToQueryString = fieldName => (\r\n value: FilterValueType | undefined,\r\n) => {\r\n var result = new URLSearchParams();\r\n const startFieldName = `${fieldName}-min`;\r\n const endFieldName = `${fieldName}-max`;\r\n if (value === null) {\r\n result.append(startFieldName, '');\r\n result.append(endFieldName, '');\r\n return result;\r\n }\r\n if (value !== null && value !== undefined) {\r\n const start = (value as INumbersRange)?.start;\r\n const end = (value as INumbersRange)?.end;\r\n\r\n result.append(startFieldName, start?.toString() ?? '');\r\n result.append(endFieldName, end?.toString() ?? '');\r\n }\r\n return result;\r\n};\r\nexport const formatQueryStringDateValue: (\r\n fieldName: string,\r\n) => FilterSerializer = (fieldName: string) => (\r\n value: FilterValueType | undefined | null,\r\n) => {\r\n var result = new URLSearchParams();\r\n if (value === null) {\r\n result.set(fieldName, '');\r\n }\r\n if (\r\n value !== undefined &&\r\n value !== null &&\r\n !isNaN((value as Date)?.getTime?.())\r\n ) {\r\n result.set(\r\n fieldName,\r\n dateUtils.formatQueryStringDate(value as Date, {\r\n representation: 'date',\r\n }),\r\n );\r\n }\r\n return result;\r\n};\r\nfunction serializeValue(value: FilterValueType): string | undefined | null {\r\n try {\r\n if (value === null) {\r\n return null;\r\n }\r\n return typeof value === 'string'\r\n ? value\r\n : typeof value === 'number'\r\n ? value?.toString()\r\n : value instanceof CustomDate\r\n ? dateUtils.formatQueryStringDate(value, {\r\n representation: (value as CustomDate).representation ?? 'date',\r\n })\r\n : value instanceof Date\r\n ? dateUtils.formatQueryStringDate(value)\r\n : (value as Entity)?.Id?.toString();\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport const defaultSerializer: (\r\n fieldName: string,\r\n) => FilterSerializer = fieldName => value => {\r\n var result = new URLSearchParams();\r\n if (value === null) {\r\n result.set(fieldName, '');\r\n }\r\n if (value !== undefined) {\r\n var stringValue = serializeValue(value);\r\n if (stringValue !== null && stringValue !== undefined) {\r\n result.set(fieldName, stringValue);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport const arrayToQueryString: (\r\n fieldName: string,\r\n) => FilterSerializer = fieldName => value => {\r\n let result = new URLSearchParams();\r\n if (Array.isArray(value) || value == null) {\r\n let stringValues = value\r\n ?.map(v => serializeValue(v))\r\n .filter(v => v !== undefined);\r\n result.set(fieldName, stringValues?.join('|') ?? '');\r\n }\r\n return result;\r\n};\r\n\r\nexport const arrayByNameEntityNumberToQueryString: (\r\n fieldName: string,\r\n) => FilterSerializer = fieldName => value => {\r\n let result = new URLSearchParams();\r\n if (Array.isArray(value) || value == null) {\r\n let stringValues = value\r\n ?.map(v => (v as Entity)?.Name?.toString())\r\n .filter(v => v !== undefined);\r\n result.set(fieldName, stringValues?.join('|') ?? '');\r\n }\r\n return result;\r\n};\r\nexport const getStringEntityArray = (\r\n params: URLSearchParams,\r\n fieldName: string,\r\n): FilterValueType | undefined => {\r\n let search = GetRawValue(params, fieldName);\r\n if (search === undefined) return undefined;\r\n if (search === null) return null;\r\n let allSearch = splitFilterValue(search).map(v => GetStringOrUndefined(v));\r\n allSearch = allSearch.filter(v => v !== undefined);\r\n if (!allSearch.length) return undefined;\r\n let allEntities = allSearch.map(v => GetPartialEntity(v));\r\n allEntities = allEntities.filter(v => v !== undefined);\r\n if (!allEntities.length) return undefined;\r\n return allEntities as FilterValueType;\r\n};\r\n\r\nexport const getNumberEntityArray = (\r\n params: URLSearchParams,\r\n fieldName: string,\r\n): FilterValueType | undefined => {\r\n let search = GetRawValue(params, fieldName);\r\n return getNumberEntityArrayFromString(search) as FilterValueType;\r\n};\r\nexport const getNumberEntityArrayFromString = (\r\n search: string | undefined | null,\r\n) => {\r\n if (search === undefined) return undefined;\r\n if (search === null) return null;\r\n let allSearch = splitFilterValue(search).map(v => GetNumberOrUndefined(v));\r\n allSearch = allSearch.filter(v => v !== undefined);\r\n if (!allSearch.length) return undefined;\r\n let allEntities = allSearch.map(v => GetPartialEntity(v));\r\n allEntities = allEntities.filter(v => v !== undefined);\r\n if (!allEntities.length) return undefined;\r\n return allEntities;\r\n};\r\n\r\nexport const assetRangeSerializer: (fieldName: string) => FilterSerializer = (\r\n fieldname: string,\r\n) => value => {\r\n const res = new URLSearchParams();\r\n if (isAssetRangeType(value)) {\r\n res.set(fieldname + 'Val', serializeValue(value.value) ?? '');\r\n res.set(fieldname + 'Type', serializeValue(value.unitType) ?? '');\r\n }\r\n return res;\r\n};\r\n\r\nexport const getAssetRange = (\r\n params: URLSearchParams,\r\n fieldName: string,\r\n): FilterValueType | undefined => {\r\n const val = GetRawValue(params, fieldName + 'Val');\r\n const type = GetRawValue(params, fieldName + 'Type');\r\n if (\r\n valOrNull(val) === null ||\r\n isNaN(parseFloat(val ?? '')) ||\r\n valOrNull(type) === null ||\r\n isNaN(parseInt(type ?? ''))\r\n ) {\r\n return undefined;\r\n }\r\n return {\r\n unitType: { Id: parseInt(type ?? '') },\r\n value: parseFloat(val ?? ''),\r\n } as AssetRangeType;\r\n};\r\nexport const getSplitNumberArray = (search: string): number[] => {\r\n return splitFilterValue(search)\r\n .map(v => {\r\n var number = parseInt(v);\r\n if (isNaN(number)) {\r\n return 0;\r\n }\r\n return number;\r\n })\r\n .filter(f => f > 0);\r\n};\r\nexport const splitFilterValue = (search: string, separator?: string) => {\r\n let x = search.indexOf(separator ?? '|') >= 0 ? separator ?? '|' : ',';\r\n let allSearch = search.split(x);\r\n return allSearch;\r\n};\r\nexport const joinArray = (values: Array, separator?: string) => {\r\n return values.join(separator ?? '|');\r\n};\r\n","import { IconName as fontawesome_IconName } from '@fortawesome/fontawesome-svg-core';\r\nimport {\r\n FontAwesomeIcon,\r\n FontAwesomeIconProps,\r\n} from '@fortawesome/react-fontawesome';\r\nimport { useTheme } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport * as React from 'react';\r\nimport { getColor, TypeColor, TypeColorOptions } from 'styles/colors/types';\r\nimport { IconName, IconProp } from 'app/AllIcons';\r\n\r\nexport interface IconProps\r\n extends Omit {\r\n color?: TypeColor;\r\n colorExtend?: TypeColorOptions;\r\n icon: IconProp;\r\n info?: string;\r\n}\r\n\r\nexport const Icon = React.forwardRef(function Icon(\r\n { icon, color, colorExtend, info, ...props }: IconProps,\r\n ref,\r\n) {\r\n const iconName = icon as IconName;\r\n //typeof icon === 'string' ? () : (icon as IconProp);\r\n const theme = useTheme();\r\n const defColor = color && getColor(theme, color, colorExtend); //|| theme.palette.common.graySubtitle\r\n\r\n const WithTitle = ({ children }: { children: React.ReactNode }) =>\r\n info ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n <>{children}\r\n );\r\n return (\r\n \r\n \r\n \r\n );\r\n});\r\n// variant with ref - using SvgIcon component\r\n\r\n// export const Icon = React.forwardRef((props, ref) => {\r\n// const { icon, color, ...rest } = props;\r\n// const iconName = icon as IconName;\r\n// const theme = useTheme();\r\n// const defColor = color && getColor(theme, color);\r\n// return (\r\n// \r\n// \r\n// \r\n// );\r\n// });\r\n","import axios, { AxiosRequestConfig, AxiosResponse, CancelToken } from 'axios';\r\nimport { StatusCodes } from 'http-status-codes';\r\nimport { uniqueId } from 'lodash';\r\nimport { toRootedURL } from 'utils/url-utils';\r\n\r\naxios.defaults.baseURL = process.env.PUBLIC_URL;\r\naxios.defaults.timeout = 600000;\r\n\r\n/**\r\n * Check if HTTP status is a success - anything in 2xx range\r\n * e.g. 200, 201, etc.\r\n * @param status HTTP_STATUS\r\n * @returns true for all success statuses\r\n */\r\nconst isStatusOK = (status: number) => status >= 200 && status < 300;\r\n\r\nexport type BatchRequest = {\r\n id?: string;\r\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\r\n pathName: string;\r\n search?: URLSearchParams;\r\n body?: any;\r\n};\r\ninterface BatchResponse {\r\n id: string;\r\n atomicityGroup: string;\r\n status: StatusCodes;\r\n headers: Record;\r\n body?: unknown;\r\n}\r\nexport interface BatchResponses {\r\n responses: BatchResponse[];\r\n}\r\n// const y = {\r\n// responses: [\r\n// {\r\n// id: 'g1_0',\r\n// atomicityGroup: 'f27f07a2-e8f4-4c62-8216-4611e3ba07c6',\r\n// status: 204,\r\n// headers: { 'odata-version': '4.0' },\r\n// },\r\n// {\r\n// id: 'g1_1',\r\n// atomicityGroup: 'f27f07a2-e8f4-4c62-8216-4611e3ba07c6',\r\n// status: 204,\r\n// headers: { 'odata-version': '4.0' },\r\n// },\r\n// ],\r\n// };\r\n// const x = {\r\n// requests: [\r\n// {\r\n// method: 'PATCH',\r\n// atomicityGroup: 'g1',\r\n// url:\r\n// 'http://localhost:3194/bkt_webApp/api/odata/v4/ServiceRequestTickets(650)',\r\n// headers: {\r\n// 'content-type':\r\n// 'application/json; odata.metadata=minimal; odata.streaming=true',\r\n// 'odata-version': '4.0',\r\n// },\r\n// id: 'g1_0',\r\n// body: { Index: 0 },\r\n// },\r\n// {\r\n// method: 'PATCH',\r\n// atomicityGroup: 'g1',\r\n// url:\r\n// 'http://localhost:3194/bkt_webApp/api/odata/v4/ServiceRequestTickets(651)',\r\n// headers: {\r\n// 'content-type':\r\n// 'application/json; odata.metadata=minimal; odata.streaming=true',\r\n// 'odata-version': '4.0',\r\n// },\r\n// id: 'g1_1',\r\n// body: { Index: 1 },\r\n// },\r\n// ],\r\n// };\r\n\r\nclass Client {\r\n public cancelToken = axios.CancelToken;\r\n public async get(\r\n url: string,\r\n params?: any,\r\n cancelToken?: CancelToken,\r\n ): Promise {\r\n try {\r\n const response = await axios.get(url, {\r\n params: params,\r\n cancelToken: cancelToken,\r\n });\r\n if (isStatusOK(response.status)) {\r\n return response.data;\r\n } else {\r\n throw response;\r\n }\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n public async put>(\r\n url: string,\r\n data?: any,\r\n config?: AxiosRequestConfig,\r\n ): Promise {\r\n const response = await axios.put(url, data, config);\r\n if (isStatusOK(response.status)) {\r\n return response.data;\r\n } else {\r\n throw response;\r\n }\r\n }\r\n public async post(\r\n url: string,\r\n data?: any,\r\n config?: AxiosRequestConfig,\r\n ): Promise {\r\n try {\r\n const response = await axios.post(url, data, config);\r\n if (isStatusOK(response.status)) {\r\n return response.data;\r\n } else {\r\n throw response;\r\n }\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n public async patch(\r\n url: string,\r\n data?: any,\r\n config?: AxiosRequestConfig,\r\n ): Promise {\r\n const response = await axios.patch(url, data, config);\r\n if (isStatusOK(response.status)) {\r\n return response.data;\r\n } else {\r\n throw response;\r\n }\r\n }\r\n public async delete>(\r\n url: string,\r\n config?: AxiosRequestConfig,\r\n ): Promise {\r\n const response = await axios.delete(url);\r\n if (isStatusOK(response.status)) {\r\n return response.data;\r\n } else {\r\n throw response;\r\n }\r\n }\r\n public async deleteCustom(\r\n url: string,\r\n config?: AxiosRequestConfig,\r\n ): Promise {\r\n const response = await axios.delete(url);\r\n if (isStatusOK(response.status)) {\r\n return response.data;\r\n } else {\r\n throw response;\r\n }\r\n }\r\n public async batch(b: Array): Promise {\r\n const atomicityGroup = 'g1';\r\n const payload = {\r\n requests: b\r\n // each request needs to be fully qualified e.g. https://foo/api/odata/v4/entity otherwise odata throws NullRef exception regarding virtualpath\r\n .map((r, index) => {\r\n const rootedPathWithSearch = toRootedURL(\r\n r.pathName + (r.search === undefined ? '' : `?${r.search}`),\r\n );\r\n return {\r\n method: r.method,\r\n atomicityGroup: atomicityGroup,\r\n url: new URL(rootedPathWithSearch, new URL(window.location.origin)),\r\n\r\n headers: {\r\n 'content-type':\r\n 'application/json; odata.metadata=minimal; odata.streaming=true',\r\n 'odata-version': '4.0',\r\n },\r\n id: r.id ?? uniqueId(`${atomicityGroup}_`),\r\n body: r.body,\r\n };\r\n }),\r\n };\r\n const response: AxiosResponse = await axios.post(\r\n '/api/odata/v4/$batch',\r\n payload,\r\n );\r\n\r\n if (\r\n response.data.responses.every(response => isStatusOK(response.status))\r\n ) {\r\n return response.data;\r\n } else {\r\n throw response;\r\n }\r\n }\r\n public async batchDelete(urls: string[]) {\r\n return this.batch(\r\n urls.map(f => ({\r\n pathName: f,\r\n method: 'DELETE',\r\n })),\r\n );\r\n }\r\n /**\r\n * Response type is blob by default due to historical reasons. If json is expected, then\r\n * uploadFile('url', data, {resposneType:'json'})\r\n * @param url\r\n * @param file\r\n * @param config\r\n */\r\n public async uploadFile(url, file, config?: AxiosRequestConfig) {\r\n const formData = new FormData();\r\n formData.append('File', file);\r\n const response = await axios.post(url, formData, {\r\n responseType: 'blob',\r\n timeout: undefined,\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n Accept: 'application/json',\r\n },\r\n ...config,\r\n });\r\n return response;\r\n }\r\n}\r\nexport const httpClient = new Client();\r\n","import * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useTheme } from '@material-ui/core';\r\nimport clsx from 'clsx';\r\nimport { RightSection } from '../wrappers';\r\n\r\nexport interface FormRightSectionProps {\r\n children: React.ReactNode;\r\n isCover?: boolean;\r\n}\r\nexport const FormRightSection = (props: FormRightSectionProps) => {\r\n const { children, isCover } = props;\r\n const isMobile = DetectIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const showShortView =\r\n isMobile || (sidePanelOpen && !sidePanelExpanded) || isCover;\r\n const theme = useTheme();\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Form } from 'formik';\r\nimport { CSSProperties } from '@material-ui/styles';\r\nimport { StyledFormFieldsContainer } from '../StyledFormFieldsContainer';\r\nexport interface IndexNode {\r\n node: React.ReactNode;\r\n index: number | string;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n showMore?: boolean;\r\n}\r\nexport interface StyledFormProps {\r\n onSubmit?: (e?: React.FormEvent | undefined) => void;\r\n children: React.ReactNode;\r\n avoidStyles?: boolean;\r\n id?: string;\r\n sectionStyle?: CSSProperties;\r\n isCover?: boolean;\r\n noPadding?: boolean;\r\n}\r\nexport const StyledForm = (props: StyledFormProps) => {\r\n const {\r\n id,\r\n onSubmit,\r\n avoidStyles,\r\n children,\r\n sectionStyle,\r\n isCover,\r\n noPadding,\r\n ...other\r\n } = props;\r\n return (\r\n
\r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n","import { enumStringKeys } from 'utils/enumKeys';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { SettingModel } from 'utils/globalSettings/SettingModel';\r\nimport { httpClient } from './HttpClient';\r\nimport { Condition, ODataOperators } from './odata/ODataFilter';\r\nimport { Identifiable } from 'types/common';\r\n\r\nexport const SettingsApi = {\r\n getSystemSettingByKey: (payload: { key: string }) => {\r\n const url = '/api/odata/v4/SystemSettings';\r\n const params: {\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $filter: '(Id eq ' + payload.key + ')',\r\n $select: 'Id,Name,Value',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient.get(url, params);\r\n },\r\n getAllSystemSetting: () => {\r\n const url = '/api/odata/v4/SystemSettings';\r\n const params: {\r\n $select: string;\r\n } = {\r\n $select: 'Id,Name,Value',\r\n };\r\n return httpClient.get(url, params);\r\n },\r\n getAlowedSystemSetting: () => {\r\n const url = '/api/odata/v4/SystemSettings';\r\n const params: {\r\n $select: string;\r\n $filter?: string;\r\n } = {\r\n $select: 'Id,Name,Value',\r\n };\r\n\r\n let names: Identifiable[] = enumStringKeys(AllowedSettings).map(\r\n v => {\r\n return { Id: v };\r\n },\r\n );\r\n\r\n let filter =\r\n new Condition(\r\n 'Name',\r\n ODataOperators.Includes,\r\n names,\r\n ).toString() ?? '';\r\n params.$filter = filter;\r\n return httpClient.get(url, params);\r\n },\r\n getAllSystemSettingFromList: (keys: string[]) => {\r\n const url = '/api/odata/v4/SystemSettings';\r\n const params: {\r\n $select: string;\r\n $filter?: string;\r\n } = {\r\n $select: 'Id,Name,Value',\r\n };\r\n\r\n let names: Identifiable[] = keys.map(v => {\r\n return { Id: v };\r\n });\r\n\r\n let filter =\r\n new Condition(\r\n 'Name',\r\n ODataOperators.Includes,\r\n names,\r\n ).toString() ?? '';\r\n params.$filter = filter;\r\n return httpClient.get(url, params);\r\n },\r\n getLoginSystemSettings: () => {\r\n const url = '/api/v3/appsettings/GetLoginSettings';\r\n return httpClient.get(url);\r\n },\r\n setSystemSetting: (setting: SettingModel) => {\r\n const url = '/api/odata/v4/SystemSettings';\r\n return httpClient.post(url, setting);\r\n },\r\n};\r\n","import { select } from 'redux-saga/effects';\r\nimport { selectAppSettings, selectIsAuthenticated } from '../selectors';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { ConfigurableTypes, ScreensId } from 'enums/ConfigurableTypes';\r\nimport { GetCachedConfigurableColumnsData } from 'app/components/BasicTable/ConfigurableColumns';\r\nimport { KnownModules } from 'types/KnownModules';\r\n\r\n/**\r\n * Does prefetch for configurable columns for selected table based pages. These should include mostly used/mostly visited ones\r\n */\r\nexport function* doPrefetchConfigurableColumns() {\r\n const settings: AppSettings = yield select(selectAppSettings);\r\n const isAuthenticated: boolean | undefined = yield select(\r\n selectIsAuthenticated,\r\n );\r\n // Ids of the pages (ScreenId enum) and respective required modules\r\n // Some of the pages can be disabled and are not shown so not all of the configurable columns might be needed\r\n const authSet: Array<{ s: ScreensId; m?: KnownModules }> = [\r\n // service groups aka cores directory src\\app\\pages\\CoresDirectoryPage\\index.tsx\r\n { s: ScreensId.CoresDirectory },\r\n // reservation history - C:\\Users\\mikea\\Projects\\bookitlab\\web-ui\\src\\app\\pages\\ReservationHistoryPage\\index.tsx\r\n { s: ScreensId.ReservationHistory },\r\n // user training - src\\app\\pages\\UserTrainingsPage\\index.tsx\r\n { s: ScreensId.UserTraining, m: KnownModules.Instruments },\r\n // training sessions - src\\app\\pages\\TrainingSessionsPage\\index.tsx\r\n {\r\n s: ScreensId.UpcomingTrainingSessions,\r\n m: KnownModules.Instruments,\r\n },\r\n // service requests - src\\app\\pages\\ServiceRequestListPage\\index.tsx\r\n { s: ScreensId.ServiceRequests, m: KnownModules.ServiceRequests },\r\n // my assets / instruments - src\\app\\pages\\MyAssetsPage\\index.tsx\r\n { s: ScreensId.MyAssets },\r\n // work orders aka events aka alerts - src\\app\\pages\\WorkOrdersPage\\index.tsx\r\n { s: ScreensId.Alerts, m: KnownModules.MaintenanceAssets },\r\n ];\r\n const noAuthSet: Array<{ s: ScreensId; m?: KnownModules }> = [\r\n // public assets src\\app\\pages\\PublicAssets\\index.tsx\r\n { s: ScreensId.PublicAssets },\r\n ];\r\n const screens: Array = (isAuthenticated ? authSet : noAuthSet)\r\n .filter(item => item.m === undefined || settings.Modules.includes(item.m))\r\n .map(item => item.s);\r\n // preloads reservations history display columns to get faster to the table data\r\n // does not return anything here, but the fetched data will be already prefetch for the later use elsewhere\r\n screens.map(screenId =>\r\n GetCachedConfigurableColumnsData(\r\n screenId,\r\n ConfigurableTypes.ColumnScreenConfig,\r\n isAuthenticated,\r\n ),\r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { SettingsApi } from 'api/SettingsApi';\r\nimport { internalIdLoginActions } from 'app/pages/Animals/InternalIdLoginPage/slice';\r\nimport { AxiosError } from 'axios';\r\nimport { push, replace } from 'connected-react-router';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n call,\r\n put,\r\n takeLatest,\r\n delay,\r\n all,\r\n select,\r\n takeEvery,\r\n takeLeading,\r\n} from 'redux-saga/effects';\r\nimport { AuthenticatedUser, IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { Entity } from 'types/common';\r\nimport { UserProfileSettings } from 'types/UserProfileSettings';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { UserProfile } from 'utils/userProfileSettings';\r\nimport { appSettingsActions as actions } from '.';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectBarcodeScanTarget,\r\n selectGlobalSetting,\r\n selectSystemFirstDayOfWeek,\r\n selectUserProfileSettings,\r\n} from './selectors';\r\nimport {\r\n LoginTypes,\r\n parseBarcode,\r\n Roles,\r\n SaveUserProfileSettingAction,\r\n ScanTarget,\r\n ScanTemplateResult,\r\n} from './types';\r\nimport { Location } from 'history';\r\nimport { URLSearchParamsCI } from 'app/components/BasicTable/types/FilterParam';\r\nimport { SavedViewSelected } from 'app/pages/SavedViewsPage/SavedViewPage/slice/types';\r\nimport { BARCODE_SCANNED } from 'react-usb-barcode-scanner';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IRoomDto } from 'api/odata/generated/entities/IRoomDto';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { eventChannel } from 'redux-saga';\r\nimport { getLogger } from 'utils/logLevel';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { doPrefetchConfigurableColumns } from './workers/doPrefetchConfigurableColumns';\r\n\r\nexport function* getAppSettings(action: PayloadAction) {\r\n const requestURL = '/api/v3/appsettings';\r\n const noAuthURL = '/api/v3/appsettings/NotAuthenticatedSettings';\r\n const url = action.payload ? requestURL : noAuthURL;\r\n try {\r\n const appSettings = yield call(httpClient.get, url);\r\n yield put(actions.appSettingsLoaded(appSettings));\r\n yield put(actions.changeLanguage(appSettings.Globalization.Locale));\r\n if (!action.payload) {\r\n yield put(actions.loadSystemSettings_Success(appSettings.noAuthSettings));\r\n }\r\n } catch (err: unknown) {\r\n yield put(\r\n actions.loadError({\r\n message: 'fail -' + (err as AxiosError)?.response?.status,\r\n }),\r\n );\r\n }\r\n}\r\nfunction* getAuthenticatedUser(action: PayloadAction) {\r\n const requestURL = '/api/v3/appsettings/authenticateduser';\r\n try {\r\n const response = yield call(httpClient.get, requestURL);\r\n const user = response as IAuthenticatedUser;\r\n user.LoginType = LoginTypes.Password;\r\n yield put(actions.getAuthenticatedUser_Success(user));\r\n if (user.Roles.indexOf(Roles.LargeAnimalsOperatingRoomTechnician) >= 0) {\r\n yield put(internalIdLoginActions.success(user));\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n const status = (err as AxiosError)?.response?.status;\r\n if (status === 401 || !status || action.payload) {\r\n yield put(actions.setIsAuthenticated(false));\r\n } else {\r\n window.location.replace(toRootedURL('/login'));\r\n }\r\n yield put(actions.getAuthenticatedUser_Error('auth get fail'));\r\n }\r\n}\r\nfunction* doSetIsAuthenticated(action: PayloadAction) {\r\n yield put(actions.IsAuthenticatedChanged(action.payload));\r\n}\r\nfunction* setLanguage(action: PayloadAction) {\r\n if (action.payload === null) {\r\n return;\r\n }\r\n try {\r\n const locale: string = action.payload;\r\n const [language] = locale?.split('-');\r\n\r\n const systemFirstDayOfWeek: number = yield select(\r\n selectSystemFirstDayOfWeek,\r\n );\r\n\r\n yield all([\r\n call(l => i18next.changeLanguage(l), language),\r\n call(l => dateUtils.setLocale(l, systemFirstDayOfWeek), locale),\r\n ]);\r\n yield put(actions.languageChanged(i18next.language));\r\n } catch (err) {\r\n console.error('setLanguage', err);\r\n }\r\n}\r\nfunction* getSiteMapSource() {\r\n const requestURL = '/api/v3/siteMapSettings';\r\n try {\r\n const siteMap = yield call(httpClient.get, requestURL);\r\n yield put(actions.loadSiteMapSettings_Success(siteMap));\r\n } catch (err) {\r\n console.debug(err);\r\n yield put(actions.loadSiteMapSettings_Error('site map loding error'));\r\n }\r\n}\r\nfunction* doNavigate(action: PayloadAction) {\r\n if (\r\n typeof action.payload === 'string' &&\r\n action.payload.indexOf('.aspx') > 0\r\n ) {\r\n window.location.href = toRootedURL(action.payload);\r\n } else {\r\n yield put(push(action.payload));\r\n }\r\n}\r\nfunction* getEventsCount() {\r\n const requestURL = '/api/v3/eventsCount';\r\n try {\r\n const count = yield call(httpClient.get, requestURL);\r\n yield put(actions.loadEventsCount_Success(count));\r\n } catch (err) {\r\n console.debug(err);\r\n yield put(actions.loadEventsCount_Error('events count loading error'));\r\n }\r\n}\r\nfunction* getUserProfileSettings() {\r\n yield delay(500);\r\n const requestURL = '/api/v3/userProfile';\r\n try {\r\n const settings = yield call(httpClient.get, requestURL);\r\n yield put(actions.loadUserProfile_Success(settings));\r\n } catch (err) {\r\n console.debug(err);\r\n yield put(\r\n actions.loadUserProfile_Error('user profile settings loading error'),\r\n );\r\n }\r\n}\r\nfunction* getSystemSettings() {\r\n yield delay(500);\r\n try {\r\n const settings = yield call(SettingsApi.getAlowedSystemSetting);\r\n yield put(actions.loadSystemSettings_Success(settings));\r\n } catch (err) {\r\n console.debug(err);\r\n yield put(\r\n actions.loadSystemSettings_Error('user profile settings loading error'),\r\n );\r\n }\r\n}\r\nfunction* getLoginSystemSettings() {\r\n try {\r\n const settings = yield call(SettingsApi.getLoginSystemSettings);\r\n yield put(actions.loadLoginSystemSettings_Success(settings));\r\n } catch (err) {\r\n console.debug(err);\r\n yield put(\r\n actions.loadLoginSystemSettings_Error('Login settings loading error'),\r\n );\r\n }\r\n}\r\nfunction* updateUserProfileSettings(\r\n action: PayloadAction<{\r\n key: string;\r\n model: UserProfileSettings;\r\n withDelay?: boolean;\r\n }>,\r\n) {\r\n if (action.payload.withDelay) {\r\n yield delay(500);\r\n }\r\n const sett: UserProfile = yield select(selectUserProfileSettings);\r\n let item = sett.GetSettingByKeyOrDefault(\r\n action.payload.key,\r\n ) as UserProfileSettings;\r\n const payload = Object.assign({}, item, action.payload.model);\r\n const requestURL = `/api/v3/userProfile/update?key=${action.payload.key}`;\r\n try {\r\n const data = yield call(httpClient.put, requestURL, payload);\r\n yield put(actions.updateUserProfile_Success(data));\r\n } catch (err) {\r\n console.debug(err);\r\n yield put(\r\n actions.updateUserProfile_Error('user profile settings loading error'),\r\n );\r\n }\r\n}\r\nfunction* doUpdateExpandedState(action: PayloadAction) {\r\n const sett: UserProfile = yield select(selectUserProfileSettings);\r\n let item = sett.GetSettingByKeyOrDefault(\r\n 'SideBarExpanded',\r\n ) as UserProfileSettings;\r\n const payload = Object.assign({}, item, { Enabled: action.payload });\r\n const requestURL = `/api/v3/userProfile/update?key=SideBarExpanded`;\r\n try {\r\n const data = yield call(httpClient.put, requestURL, payload);\r\n yield put(actions.updateExpandedState_Success(data));\r\n } catch (err) {\r\n console.debug(err);\r\n yield put(\r\n actions.updateExpandedState_Error('user profile settings loading error'),\r\n );\r\n }\r\n}\r\n// function* doUpdateExpandedState_Local(action: PayloadAction) {\r\n// yield put(actions.setExpandedState_Local(action.payload));\r\n// }\r\nfunction* doLoadGlobalServiceGroupFilter() {\r\n try {\r\n const url = '/api/odata/v4/servicegroups/GetGlobalServiceGroupsFilter';\r\n const params = { $select: 'Id,Name,SidebarQuickAction' };\r\n const data = yield call(httpClient.get, url, params);\r\n yield put(actions.loadGlobalServiceGroupFilter_Success(data.value));\r\n } catch {\r\n //noop\r\n }\r\n}\r\nfunction* doSaveGlobalServiceGroupFilter(\r\n action: PayloadAction[]>,\r\n) {\r\n try {\r\n const url = '/api/odata/v4/servicegroups/SetGlobalServiceGroupsFilter';\r\n const data = { selection: action.payload.map(f => f.Id) };\r\n yield call(httpClient.post, url, data);\r\n yield put(actions.loadGlobalServiceGroupFilter_Success(action.payload));\r\n\r\n if (action.payload.length <= 3) {\r\n yield put(\r\n actions.addNotification({\r\n key: 'topServiceGroups',\r\n variant: 'success',\r\n message: `${i18next.t(translations.SwitchedTo)} ${action.payload\r\n .map(f => f.Name)\r\n .join(', ')}`,\r\n }),\r\n );\r\n } else {\r\n yield put(\r\n actions.addNotification({\r\n key: 'topServiceGroups',\r\n variant: 'success',\r\n message: `${i18next.t(translations.SwitchedTo)} ${\r\n action.payload[0].Name\r\n } and + ${action.payload.length - 1} more`,\r\n }),\r\n );\r\n }\r\n } catch {\r\n //noop\r\n }\r\n}\r\nfunction* doSaveUserProfileSetting(action: SaveUserProfileSettingAction) {\r\n try {\r\n // save the filter in the backend\r\n const url = `/api/v3/userProfile/update`;\r\n const httpPaload: Partial = {\r\n Value: action.payload.Value,\r\n Enabled: action.payload.Enabled,\r\n };\r\n\r\n yield call(httpClient.put, url, httpPaload, {\r\n params: { key: action.payload.Key },\r\n });\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n}\r\nfunction* doSaveFilter(\r\n action: PayloadAction<{\r\n key: string;\r\n location: Location;\r\n search: string;\r\n }>,\r\n) {\r\n try {\r\n // push new search to browser history\r\n const search = action.payload.search;\r\n const noChangeInURL = new URLSearchParamsCI(search).equals(\r\n new URLSearchParamsCI(action.payload.location.search),\r\n );\r\n if (!noChangeInURL) {\r\n if (\r\n action.payload.location.search !== search ||\r\n (action.payload.location.search === '' && search === '')\r\n ) {\r\n yield put(\r\n actions.navigate({\r\n search: search,\r\n }),\r\n );\r\n }\r\n }\r\n\r\n const authenticatedUser: AuthenticatedUser = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n yield* doSaveUserProfileSetting({\r\n type: action.type,\r\n payload: {\r\n Key: action.payload.key,\r\n Value: search.toString(),\r\n UserName: authenticatedUser.Id,\r\n Enabled: true,\r\n },\r\n });\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n}\r\n\r\nfunction* doSavePageSize(\r\n action: PayloadAction<{ key: string; value: number }>,\r\n) {\r\n try {\r\n const url = `/api/v3/userProfile/update`;\r\n const httpPaload: Partial = {\r\n Value: action.payload.value.toString(),\r\n };\r\n\r\n yield call(httpClient.put, url, httpPaload, {\r\n params: { key: action.payload.key },\r\n });\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n}\r\nfunction* doSaveCardsMode(\r\n action: PayloadAction<{ key: string; value: boolean }>,\r\n) {\r\n try {\r\n const url = `/api/v3/userProfile/update`;\r\n const httpPaload: Partial = {\r\n Value: action.payload.value.toString(),\r\n };\r\n\r\n yield call(httpClient.put, url, httpPaload, {\r\n params: { key: action.payload.key },\r\n });\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n}\r\nfunction* doUpdateMyListSelected(\r\n action: PayloadAction,\r\n) {\r\n yield put(actions.updateMyList(action.payload));\r\n}\r\n\r\n/**\r\n * Handle barcode scans\r\n * @param action action raised by barcode scanner middleware\r\n */\r\nfunction* doBarcodeScan(action: PayloadAction<{ data: string }>) {\r\n const MIN_LENGTH_DEFAULT = 6;\r\n const minBarcodeLengthString: string | undefined = yield select(state =>\r\n selectGlobalSetting(state, AllowedSettings.MinBarcodeLength),\r\n );\r\n const MinBarcodeLength =\r\n tryParseInt(minBarcodeLengthString) ?? MIN_LENGTH_DEFAULT;\r\n // prevent accidental barcode detection on fast user input\r\n if (action.payload.data.length < MinBarcodeLength) {\r\n return;\r\n }\r\n const scannTarget: ScanTarget | undefined = yield select(\r\n selectBarcodeScanTarget,\r\n );\r\n if (scannTarget !== undefined && scannTarget !== ScanTarget.All) {\r\n return;\r\n }\r\n const appSettings: AppSettings = yield select(selectAppSettings);\r\n yield put(\r\n actions.addNotification({\r\n variant: 'info',\r\n message:\r\n i18next.t(translations.BarcodeScanModalBody) +\r\n ' ' +\r\n action.payload.data,\r\n }),\r\n );\r\n try {\r\n // // in case and the barcode is a valid internal url - it should be opened in the current window\r\n // const path = parseBarcodeURL(action, appSettings);\r\n // if (path !== undefined) {\r\n // // perform full navigation since not all target pages are react compatible\r\n // // replace with yeild put(push(path)) when asset details + search are converted to react\r\n // globalThis.window.location.href = toRootedURL(path);\r\n // return;\r\n // }\r\n\r\n // // first lookup room by it's external barcode\r\n // let roomId = yield call(getRoomByExternalBarcode, action.payload.data);\r\n // if (roomId !== undefined) {\r\n // window.location.href = toRootedURL('/Assets/default.aspx', {\r\n // roomid: roomId,\r\n // });\r\n // return;\r\n // }\r\n const scanResult = parseBarcode(action.payload.data, appSettings);\r\n if (scanResult === undefined) {\r\n yield put(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.BarcodeNotFoundEx),\r\n }),\r\n );\r\n return;\r\n } else {\r\n switch (scanResult.type) {\r\n case ScanTemplateResult.Asset:\r\n yield put(push(''));\r\n yield put(replace(`Assets/Details?id=${scanResult.InternalCode}`));\r\n return;\r\n case ScanTemplateResult.Internal:\r\n let roomId = yield call(\r\n getRoomByExternalBarcode,\r\n scanResult.InternalCode ?? action.payload.data,\r\n );\r\n if (roomId !== undefined) {\r\n window.location.href = toRootedURL('/Assets/Public', {\r\n roomid: roomId,\r\n });\r\n return;\r\n }\r\n break;\r\n case ScanTemplateResult.External:\r\n console.error(\r\n `${action.type}`,\r\n action.payload,\r\n 'scanned external URL',\r\n );\r\n yield put(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: 'Error: Scanned external URL',\r\n }),\r\n );\r\n return;\r\n }\r\n }\r\n\r\n // TODO: add other barcode lookups below\r\n\r\n yield put(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.BarcodeNotFoundEx),\r\n }),\r\n );\r\n } catch (error) {\r\n console.error(`${action.type}`, action.payload, error);\r\n }\r\n}\r\nasync function getRoomByExternalBarcode(barcode: string) {\r\n try {\r\n var response: IODataQueryResponse = await httpClient.get(\r\n '/api/odata/v4/rooms',\r\n {\r\n $top: 1,\r\n $select: 'Id',\r\n $filter: new Condition(\r\n 'ExternalBarcode',\r\n ODataOperators.Equals,\r\n barcode,\r\n ).toString(),\r\n },\r\n );\r\n var roomId = response.value[0]?.Id;\r\n return roomId;\r\n } catch (error) {}\r\n}\r\n// function parseBarcodeURL(action, appSettings) {\r\n// try {\r\n// const publicBaseURL = new URL(appSettings.PublicBaseUrl);\r\n// var url = new URL(action.payload.data);\r\n// var isLocal = url\r\n// .toString()\r\n// .toLowerCase()\r\n// .startsWith(appSettings.PublicBaseUrl.toLowerCase());\r\n// if (!isLocal) {\r\n// console.error(`${action.type}`, action.payload, 'scanned external URL');\r\n// return;\r\n// }\r\n// const path = toRelative(publicBaseURL, url);\r\n// return path;\r\n// } catch (error) {\r\n// return undefined;\r\n// }\r\n// }\r\nfunction* handleFullScreenChange() {\r\n const isFullScreen = document.fullscreenElement !== null;\r\n if (isFullScreen) {\r\n yield put(actions.enterFullScreen_Success());\r\n } else {\r\n yield put(actions.exitFullScreen_Success());\r\n }\r\n}\r\nfunction* doEnterFullScreen(action: PayloadAction<{ selector?: string }>) {\r\n const log = getLogger('doEnterFullScreen');\r\n const selector = action.payload.selector;\r\n const x =\r\n selector === undefined\r\n ? document.documentElement\r\n : document.querySelector(selector);\r\n const fullScreenElement = x ?? document.documentElement;\r\n try {\r\n yield call;\r\n fullScreenElement.requestFullscreen();\r\n yield put(actions.enterFullScreen_Success());\r\n log.info('Entered FullScreen', fullScreenElement);\r\n } catch (error) {\r\n log.info('Error entering full screen mode', error);\r\n yield put(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: 'Failed to enter full screen mode. ' + String(error),\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doExitFullScreen() {\r\n if (document.fullscreenElement !== null) {\r\n document.exitFullscreen();\r\n }\r\n yield put(actions.exitFullScreen_Success());\r\n}\r\nfunction* doSetBarcodeScannigTarget(\r\n action: PayloadAction,\r\n) {\r\n yield put(actions.barcodeScannigTarget_Success(action.payload));\r\n}\r\nfunction* doShowAllCores(action: PayloadAction) {\r\n yield put(actions.setShowAllCores(action.payload));\r\n}\r\nfunction* doCollapseSubBar(action: PayloadAction) {\r\n yield put(actions.setCollapseSubBar(action.payload));\r\n}\r\n\r\nexport function* getAppSettingsFromSaga() {\r\n yield takeLatest(actions.loadAppSettings.type, getAppSettings);\r\n yield takeLatest(actions.getAuthenticatedUser.type, getAuthenticatedUser);\r\n yield takeLatest(actions.loadSiteMapSettings.type, getSiteMapSource);\r\n yield takeLatest(actions.changeLanguage.type, setLanguage);\r\n yield takeLatest(actions.loadEventsCount.type, getEventsCount);\r\n yield takeLatest(\r\n actions.loadUserProfileSettings.type,\r\n getUserProfileSettings,\r\n );\r\n yield takeLatest(\r\n actions.updateUserProfileSettings.type,\r\n updateUserProfileSettings,\r\n );\r\n yield takeLatest(actions.setIsAuthenticated.type, doSetIsAuthenticated);\r\n yield takeLatest(actions.updateExpandedState.type, doUpdateExpandedState);\r\n // yield takeLatest(\r\n // actions.updateExpandedState_Local.type,\r\n // doUpdateExpandedState_Local,\r\n // );\r\n yield takeLatest(actions.navigate.type, doNavigate);\r\n yield takeLatest(\r\n actions.loadGlobalServiceGroupFilter.type,\r\n doLoadGlobalServiceGroupFilter,\r\n );\r\n yield takeLatest(\r\n actions.saveGlobalServiceGroupFilter.type,\r\n doSaveGlobalServiceGroupFilter,\r\n );\r\n yield takeLatest(\r\n actions.saveUserProfileSetting.type,\r\n doSaveUserProfileSetting,\r\n );\r\n yield takeLatest(actions.saveFilter.type, doSaveFilter);\r\n yield takeLatest(actions.loadSystemSettings.type, getSystemSettings);\r\n yield takeLatest(\r\n actions.loadLoginSystemSettings.type,\r\n getLoginSystemSettings,\r\n );\r\n // currently prefetch only depends on the modules (appSettings), so it made sense to fire those immediately after the modules availability\r\n yield takeLatest(\r\n actions.appSettingsLoaded.type,\r\n doPrefetchConfigurableColumns,\r\n );\r\n yield takeLatest(actions.savePageSize.type, doSavePageSize);\r\n yield takeLatest(\r\n actions.updateMyListSelected_Local.type,\r\n doUpdateMyListSelected,\r\n );\r\n yield takeLatest(BARCODE_SCANNED, doBarcodeScan);\r\n yield takeLatest(actions.saveCardsMode.type, doSaveCardsMode);\r\n const fullScreenChannel = eventChannel(emitter => {\r\n document.addEventListener('fullscreenchange', emitter);\r\n return () => document.removeEventListener('fullscreenchange', emitter);\r\n });\r\n yield takeEvery(fullScreenChannel, handleFullScreenChange);\r\n yield takeLeading(actions.enterFullScreen, doEnterFullScreen);\r\n yield takeLeading(actions.exitFullScreen, doExitFullScreen);\r\n yield takeLatest(\r\n actions.setBarcodeScannigTarget.type,\r\n doSetBarcodeScannigTarget,\r\n );\r\n yield takeLatest(actions.showAllCores.type, doShowAllCores);\r\n yield takeLatest(actions.collapseSubBar.type, doCollapseSubBar);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { AppSettings, AppSettingsErrorType } from 'types/AppSettings';\r\nimport { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { Entity } from 'types/common';\r\nimport { Notification } from 'types/Notification';\r\nimport { SiteMapSettings } from 'types/SiteMapSettings';\r\nimport { UserProfileSettings } from 'types/UserProfileSettings';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { SettingModel } from 'utils/globalSettings/SettingModel';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { getAppSettingsFromSaga } from './saga';\r\nimport {\r\n AppSettingsState,\r\n LoginSettingsModel,\r\n LoginTypes,\r\n SaveUserProfileSettingAction,\r\n ScanTarget,\r\n} from './types';\r\nimport * as H from 'history';\r\nimport { SavedViewSelected } from 'app/pages/SavedViewsPage/SavedViewPage/slice/types';\r\n\r\nexport const initialState: AppSettingsState = {\r\n error: null,\r\n loadingAppSettings: true,\r\n loadingAuthenticatedUser: false,\r\n loadingSiteMapSettings: false,\r\n loadingEventsCount: false,\r\n loadingUserProfileSettings: false,\r\n appSettings: null,\r\n notifications: [],\r\n siteMapSettings: null,\r\n siteMapProvider: null,\r\n eventsCount: 0,\r\n userProfileSettings: [],\r\n updatedUserProfileSettings: false,\r\n isExpanded: false,\r\n globalServiceGroupFilter: undefined,\r\n showGlobalServiceGroupFilter: false,\r\n systemSettings: [],\r\n loadingSystemSettings: false,\r\n isAuthenticated: undefined,\r\n showGlobalServiceGroupsAsList: false,\r\n isFullScreen: false,\r\n barcodeScanTarget: ScanTarget.All,\r\n showAllCores: false,\r\n subBarCollapsed: undefined,\r\n updatedExpandState: undefined,\r\n};\r\n\r\nlet notificationsCount = 1;\r\nconst slice = createSlice({\r\n name: 'appSettings',\r\n initialState,\r\n reducers: {\r\n loadAppSettings(state, action: PayloadAction) {\r\n state.loadingAppSettings = true;\r\n },\r\n appSettingsLoaded(state, action: PayloadAction) {\r\n const appSettings = action.payload;\r\n state.appSettings = appSettings;\r\n state.loadingAppSettings = false;\r\n },\r\n loadError(state, action: PayloadAction) {\r\n //TODO: process error state - show feedback?\r\n state.error = action.payload.message;\r\n state.loadingAppSettings = false;\r\n },\r\n getAuthenticatedUser(state, action: PayloadAction) {\r\n state.loadingAuthenticatedUser = true;\r\n state.authenticatedUser = undefined;\r\n },\r\n getAuthenticatedUser_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n const LoginType = LoginTypes.Password;\r\n state.loadingAuthenticatedUser = false;\r\n state.isAuthenticated = true;\r\n state.authenticatedUser = { ...action.payload, LoginType };\r\n state.currentLanguage = action.payload.Language;\r\n },\r\n getAuthenticatedUser_Error(state, action: PayloadAction) {\r\n state.loadingAuthenticatedUser = false;\r\n },\r\n setIsAuthenticated(state, action: PayloadAction) {},\r\n IsAuthenticatedChanged(state, action: PayloadAction) {\r\n state.isAuthenticated = action.payload;\r\n },\r\n changeLanguage(state, action: PayloadAction) {},\r\n languageChanged(state, action: PayloadAction) {\r\n state.currentLanguage = action.payload;\r\n },\r\n addNotification(state, action: PayloadAction) {\r\n // remove notification with the same key if exists\r\n const key = action.payload.key ?? notificationsCount++;\r\n const index = state.notifications.findIndex(x => x.key === key);\r\n if (index >= 0) {\r\n state.notifications.splice(index, 1);\r\n }\r\n // add new notification\r\n state.notifications.push({\r\n key: key,\r\n ...action.payload,\r\n });\r\n },\r\n addNotifications(state, action: PayloadAction) {\r\n action.payload.forEach(item =>\r\n state.notifications.push({\r\n key: notificationsCount++,\r\n ...item,\r\n }),\r\n );\r\n },\r\n removeNotification(state, action: PayloadAction) {\r\n const index = state.notifications.findIndex(\r\n x => x.key === action.payload,\r\n );\r\n if (index >= 0) {\r\n state.notifications.splice(index, 1);\r\n }\r\n },\r\n loadSiteMapSettings(state) {\r\n state.loadingSiteMapSettings = true;\r\n },\r\n loadSiteMapSettings_Success(state, action: PayloadAction) {\r\n const siteMap = action.payload;\r\n state.siteMapSettings = siteMap;\r\n state.loadingSiteMapSettings = false;\r\n },\r\n loadSiteMapSettings_Error(state, action: PayloadAction) {\r\n state.error = action.payload;\r\n state.loadingSiteMapSettings = false;\r\n },\r\n saveUserProfileSetting(state, action: SaveUserProfileSettingAction) {\r\n function upsert(array: Array, item: T, keyFn: (T) => string) {\r\n const key = keyFn(item);\r\n const e = array.find(a => keyFn(a) === key);\r\n if (e === undefined) {\r\n return array.push(item);\r\n } else {\r\n Object.assign(e, item);\r\n }\r\n }\r\n upsert(\r\n state.userProfileSettings,\r\n {\r\n ...{\r\n Id: 0,\r\n Name: null,\r\n AdGroup: null,\r\n DefaultGroups: null,\r\n Enabled: true,\r\n IsMultiple: false,\r\n Selected: false,\r\n StaffEnabled: false,\r\n },\r\n ...action.payload,\r\n },\r\n f => f.Key?.toLowerCase(),\r\n );\r\n },\r\n saveFilter(\r\n state,\r\n action: PayloadAction<{\r\n key: string;\r\n location: H.LocationDescriptorObject;\r\n search: string;\r\n }>,\r\n ) {\r\n const itemIndex =\r\n state.userProfileSettings.findIndex(\r\n item => item.Key.toLowerCase() === action.payload.key.toLowerCase(),\r\n ) ?? -1;\r\n if (itemIndex >= 0) {\r\n let updatedItem = state.userProfileSettings.find(\r\n item => item.Key.toLowerCase() === action.payload.key.toLowerCase(),\r\n );\r\n if (!!updatedItem) {\r\n updatedItem.Value = action.payload.search;\r\n state.userProfileSettings.splice(itemIndex, 1);\r\n state.userProfileSettings.push(updatedItem);\r\n }\r\n } else {\r\n let item = {\r\n UserName: state.authenticatedUser?.DisplayName,\r\n Id: 0,\r\n Key: action.payload.key,\r\n Value: action.payload.search,\r\n } as UserProfileSettings;\r\n state.userProfileSettings.push(item);\r\n }\r\n // state.userProfileSettings.forEach(item => {\r\n // if (item.Key.toLowerCase() === action.payload.key.toLowerCase()) {\r\n // Object.assign({}, item, { Value: action.payload.search });\r\n // }\r\n // });\r\n // (\r\n // state.siteMapProvider ?? new SiteMapProvider(state.siteMapSettings)\r\n // ).updatePath(action.payload.location.pathname, action.payload.search);\r\n state.siteMapSettings?.userNodes\r\n .map(f => f.ChildNodes)\r\n .flat()\r\n .forEach(element => {\r\n if (element !== undefined) {\r\n const reactUrl = element.reactUrl;\r\n if (reactUrl !== undefined && reactUrl !== null) {\r\n const elementPath = reactUrl.split('?')[0] ?? reactUrl;\r\n if (elementPath === action.payload.location.pathname) {\r\n element.reactUrl = `${action.payload.location.pathname}?${action.payload.search}`;\r\n element.Url = `${action.payload.location.pathname}?${action.payload.search}`;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n savePageSize(state, action: PayloadAction<{ key: string; value: number }>) {\r\n const itemIndex =\r\n state.userProfileSettings.findIndex(\r\n item => item.Key.toLowerCase() === action.payload.key.toLowerCase(),\r\n ) ?? -1;\r\n if (itemIndex >= 0) {\r\n let updatedItem = state.userProfileSettings.find(\r\n item => item.Key.toLowerCase() === action.payload.key.toLowerCase(),\r\n );\r\n if (!!updatedItem) {\r\n updatedItem.Value = action.payload.value.toString();\r\n state.userProfileSettings.splice(itemIndex, 1);\r\n state.userProfileSettings.push(updatedItem);\r\n }\r\n } else {\r\n let item = {\r\n UserName: state.authenticatedUser?.DisplayName,\r\n Id: 0,\r\n Key: action.payload.key,\r\n Value: action.payload.value.toString(),\r\n } as UserProfileSettings;\r\n state.userProfileSettings.push(item);\r\n }\r\n },\r\n saveCardsMode(\r\n state,\r\n action: PayloadAction<{ key: string; value: boolean }>,\r\n ) {\r\n const itemIndex =\r\n state.userProfileSettings.findIndex(\r\n item => item.Key.toLowerCase() === action.payload.key.toLowerCase(),\r\n ) ?? -1;\r\n if (itemIndex >= 0) {\r\n let updatedItem = state.userProfileSettings.find(\r\n item => item.Key.toLowerCase() === action.payload.key.toLowerCase(),\r\n );\r\n if (!!updatedItem) {\r\n updatedItem.Value = action.payload.value.toString();\r\n state.userProfileSettings.splice(itemIndex, 1);\r\n state.userProfileSettings.push(updatedItem);\r\n }\r\n } else {\r\n let item = {\r\n UserName: state.authenticatedUser?.DisplayName,\r\n Id: 0,\r\n Key: action.payload.key,\r\n Value: action.payload.value.toString(),\r\n } as UserProfileSettings;\r\n state.userProfileSettings.push(item);\r\n }\r\n },\r\n loadEventsCount(state) {\r\n state.loadingEventsCount = true;\r\n },\r\n loadEventsCount_Success(state, action: PayloadAction) {\r\n state.eventsCount = action.payload;\r\n state.loadingEventsCount = false;\r\n },\r\n loadEventsCount_Error(state, action: PayloadAction) {\r\n state.error = action.payload;\r\n state.loadingEventsCount = false;\r\n },\r\n\r\n loadSystemSettings(state) {\r\n state.loadingSystemSettings = true;\r\n },\r\n loadSystemSettings_Success(state, action: PayloadAction) {\r\n let data: any = action.payload;\r\n state.systemSettings = !!data.value\r\n ? (data.value as SettingModel[])\r\n : (data as SettingModel[]); /* action.payload; */\r\n state.loadingSystemSettings = false;\r\n },\r\n loadSystemSettings_Error(state, action: PayloadAction) {\r\n state.error = action.payload;\r\n state.loadingSystemSettings = false;\r\n },\r\n\r\n loadLoginSystemSettings(state) {\r\n state.loadingSystemSettings = true;\r\n },\r\n\r\n loadLoginSystemSettings_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n let data: any = action.payload;\r\n data.settings.forEach(s => {\r\n let ss = state.systemSettings.find(f => f.Id === s.Id);\r\n if (ss !== undefined) {\r\n ss.Value = s.Value;\r\n } else {\r\n state.systemSettings.push(s);\r\n }\r\n });\r\n\r\n if (state.appSettings !== null) {\r\n data.Modules.forEach(m => {\r\n if (state.appSettings?.Modules.find(f => f === m) === undefined) {\r\n state.appSettings?.Modules.push(m);\r\n }\r\n });\r\n state.appSettings.LoginScreenCompanyLogo = data.LoginScreenCompanyLogo;\r\n state.appSettings.LoginScreenCompanyLogoLink =\r\n data.LoginScreenCompanyLogoLink;\r\n state.appSettings.LoginScreenCompanyLogoHeight =\r\n data.LoginScreenCompanyLogoHeight;\r\n state.appSettings.ShowForgotPassword = data.ShowForgotPassword;\r\n state.appSettings.Help_Login = data.Help_Login;\r\n } else {\r\n let settings = {} as AppSettings;\r\n settings.LoginScreenCompanyLogo = data.LoginScreenCompanyLogo;\r\n settings.LoginScreenCompanyLogoLink = data.LoginScreenCompanyLogoLink;\r\n settings.LoginScreenCompanyLogoHeight =\r\n data.LoginScreenCompanyLogoHeight;\r\n settings.ShowForgotPassword = data.ShowForgotPassword;\r\n settings.Help_Login = data.Help_Login;\r\n settings.Modules = data.Modules;\r\n settings.WebVersion = data.WebVersion;\r\n settings.LastCodeUpdate = data.LastCodeUpdate;\r\n state.appSettings = settings;\r\n }\r\n state.loadingSystemSettings = false;\r\n },\r\n loadLoginSystemSettings_Error(state, action: PayloadAction) {\r\n state.error = action.payload;\r\n state.loadingSystemSettings = false;\r\n },\r\n\r\n loadUserProfileSettings(state) {\r\n state.loadingUserProfileSettings = true;\r\n },\r\n loadUserProfile_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.userProfileSettings = action.payload;\r\n state.loadingUserProfileSettings = false;\r\n },\r\n loadUserProfile_Error(state, action: PayloadAction) {\r\n state.error = action.payload;\r\n state.loadingUserProfileSettings = false;\r\n },\r\n updateUserProfileSettings(\r\n state,\r\n action: PayloadAction<{ key: string; model: UserProfileSettings }>,\r\n ) {\r\n state.updatedUserProfileSettings = true;\r\n },\r\n updateUserProfile_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.updatedUserProfileSettings = false;\r\n const itemIndex =\r\n state.userProfileSettings.findIndex(\r\n item => item.Key === action.payload.Key,\r\n ) ?? -1;\r\n if (itemIndex >= 0) {\r\n state.userProfileSettings.splice(itemIndex, 1);\r\n state.userProfileSettings.push(action.payload);\r\n } else {\r\n state.userProfileSettings.push(action.payload);\r\n }\r\n },\r\n updateUserProfile_Error(state, action: PayloadAction) {\r\n state.updatedUserProfileSettings = false;\r\n },\r\n updateExpandedState(state, action: PayloadAction) {\r\n state.updatedExpandState = true;\r\n },\r\n updateExpandedState_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.updatedExpandState = false;\r\n const itemIndex =\r\n state.userProfileSettings.findIndex(\r\n item => item.Key === action.payload.Key,\r\n ) ?? -1;\r\n if (itemIndex >= 0) {\r\n state.userProfileSettings.splice(itemIndex, 1);\r\n state.userProfileSettings.push(action.payload);\r\n } else {\r\n state.userProfileSettings.push(action.payload);\r\n }\r\n },\r\n updateExpandedState_Error(state, action: PayloadAction) {\r\n state.updatedExpandState = false;\r\n },\r\n updateExpandedState_Local(state, action: PayloadAction) {\r\n state.isExpanded = action.payload;\r\n },\r\n // setExpandedState_Local(state, action: PayloadAction) {\r\n // state.isExpanded = action.payload;\r\n // },\r\n navigate(\r\n state,\r\n action: PayloadAction>,\r\n ) {},\r\n\r\n showGlobalServiceGroupFilter(state, action: PayloadAction) {\r\n state.showGlobalServiceGroupFilter = action.payload;\r\n },\r\n loadGlobalServiceGroupFilter(state, action: PayloadAction) {},\r\n loadGlobalServiceGroupFilter_Success(\r\n state,\r\n action: PayloadAction[]>,\r\n ) {\r\n state.globalServiceGroupFilter = action.payload;\r\n },\r\n saveGlobalServiceGroupFilter(\r\n state,\r\n action: PayloadAction[]>,\r\n ) {\r\n state.globalServiceGroupFilter = action.payload;\r\n },\r\n saveGlobalServiceGroupFilter_Success(\r\n state,\r\n action: PayloadAction[]>,\r\n ) {\r\n state.globalServiceGroupFilter = action.payload;\r\n },\r\n setShowGlobalServiceGroupsAsList(state, action: PayloadAction) {\r\n state.showGlobalServiceGroupsAsList = action.payload;\r\n },\r\n updateMyListSelected_Local(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n console.log('myListSelected', action.payload);\r\n },\r\n updateMyList(state, action: PayloadAction) {\r\n if (state.appSettings !== null) {\r\n // state.appSettings.myListSelected = action.payload;\r\n }\r\n },\r\n enterFullScreen(state, action: PayloadAction<{ selector?: string }>) {},\r\n exitFullScreen(state, action: PayloadAction) {},\r\n enterFullScreen_Success(state, action: PayloadAction) {\r\n state.isFullScreen = true;\r\n },\r\n exitFullScreen_Success(state, action: PayloadAction) {\r\n state.isFullScreen = false;\r\n },\r\n enterFullScreen_Error(\r\n state,\r\n action: PayloadAction<{ selector: string }>,\r\n ) {},\r\n exitFullScreen_Error(state, action: PayloadAction<{ selector: string }>) {},\r\n setBarcodeScannigTarget(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n barcodeScannigTarget_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.barcodeScanTarget = action.payload;\r\n },\r\n barcodeScannigTarget_Error(state, action: PayloadAction) {\r\n state.barcodeScanTarget = undefined;\r\n },\r\n showAllCores(state, action: PayloadAction) {},\r\n setShowAllCores(state, action: PayloadAction) {\r\n state.showAllCores = action.payload;\r\n },\r\n collapseSubBar(state, action: PayloadAction) {},\r\n setCollapseSubBar(state, action: PayloadAction) {\r\n state.subBarCollapsed = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: appSettingsActions } = slice;\r\n\r\nexport const useAppSettingsSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: getAppSettingsFromSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useAppSettingsSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import {\r\n Button as MatButton,\r\n ButtonProps as MatButtonProps,\r\n CircularProgress,\r\n} from '@material-ui/core/index';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { capitalize } from 'lodash';\r\nimport * as React from 'react';\r\n// import { generatePath, useHistory } from 'react-router-dom';\r\nimport { IPathAndQuery, toRootedURL } from 'utils/url-utils';\r\nimport clsx from 'clsx';\r\nimport { toLocationDescriptor } from 'app/components/BasicLinks/Link';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nexport type ButtonsVariant =\r\n | 'main'\r\n | 'gray'\r\n | 'accent'\r\n | 'white'\r\n | 'ghost'\r\n | 'ghostColor'\r\n | 'danger'\r\n | 'text'\r\n | 'textGray';\r\nexport interface ButtonProps extends Omit {\r\n processing?: boolean;\r\n /**\r\n * Variants overview:\r\n * main - Regular in figma — main color button, used for CTA (call-to-action) buttons\r\n * white - Secondary White in figma — White button with borders. Used as a button for secondary actions across all application.\r\n * ghost - Ghost Gray in figma — button that in the Resting state looks like a simple text , but it contains internal paddings and color background on hover and focus states\r\n * ghostColor - Ghost Color in figma — button that in the Resting state looks like a link/text button , but it contains internal paddings and color background on hover and focus states\r\n * accent - Accent in figma — Alternative button for the CTA actions, used on the screens that already contain several panels and too many primary buttons. However, this style is now barely used and is candidate to deprecation.\r\n * gray - Secondary Gray in figma — Gray button style that before used in filters. This style is now barely used and is candidate to deprecation.\r\n * danger - Primary Danger in figma — Red filled primary button that is used in the confirmation popups and screens only\r\n * warning - Primary Alert in figma — Alert filled button that is used to warn users on the section when we need to pay attention about some behavior in the component so user should click on it to fix some issue.\r\n * Currntly is used to warn about conflict in the Configurable columns, so user should resolve it.\r\n * text - Text Button in figma - Have similar behavior to Anchor Link.\r\n * textGray - Text Button in figma - The same as text varian only styled as grey text link.\r\n */\r\n variant?: ButtonsVariant;\r\n href?: string | IPathAndQuery;\r\n component?: React.ElementType;\r\n to?: string | IPathAndQuery;\r\n target?: string;\r\n}\r\n\r\nexport const Button = React.forwardRef(\r\n (\r\n {\r\n children,\r\n disabled,\r\n processing,\r\n size = 'medium',\r\n variant = 'main',\r\n href,\r\n component,\r\n title,\r\n to,\r\n ...props\r\n }: ButtonProps,\r\n ref,\r\n ) => {\r\n // const history = useHistory();\r\n const dispatch = useDispatch();\r\n const { actions: appActions } = useAppSettingsSlice();\r\n const absolutePath =\r\n href === undefined\r\n ? undefined\r\n : typeof href === 'string'\r\n ? toRootedURL(href)\r\n : toRootedURL(\r\n (href as IPathAndQuery).path,\r\n (href as IPathAndQuery).search,\r\n );\r\n const handleClick = (e: any) => {\r\n if (props.onClick) {\r\n props.onClick(e);\r\n }\r\n if (!!to) {\r\n let toto = typeof to === 'string' ? to : toLocationDescriptor(to);\r\n dispatch(appActions.navigate(toto));\r\n //history.push(toto);\r\n }\r\n };\r\n return title ? (\r\n <>\r\n {/**/}\r\n \r\n \r\n {\r\n handleClick(event);\r\n }}\r\n className={clsx(\r\n props.className,\r\n `variant${capitalize(variant)}${\r\n props.startIcon !== undefined ? ' hasStartIcon' : ''\r\n }${props.endIcon !== undefined ? ' hasEndIcon' : ''}`,\r\n )}\r\n href={absolutePath}\r\n {...props}\r\n >\r\n {children}\r\n\r\n {processing && }\r\n \r\n \r\n \r\n {/**/}\r\n \r\n ) : (\r\n {\r\n handleClick(event);\r\n }}\r\n className={clsx(\r\n props.className,\r\n `variant${capitalize(variant)}${\r\n props.startIcon !== undefined ? ' hasStartIcon' : ''\r\n }${props.endIcon !== undefined ? ' hasEndIcon' : ''}`,\r\n )}\r\n href={absolutePath}\r\n {...props}\r\n >\r\n {children}\r\n\r\n {processing && }\r\n \r\n );\r\n },\r\n);\r\n","import BasicTypography, { BasicTypographyProps } from './BasicTypography';\r\n\r\nexport function H1(props: BasicTypographyProps) {\r\n const { children, ...other } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\nexport function H2(props: BasicTypographyProps) {\r\n const { children, ...other } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\nexport function H3(props: BasicTypographyProps) {\r\n const { children, ...other } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\nexport function H4(props: BasicTypographyProps) {\r\n const { children, ...other } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\nexport interface SubTitleProps extends BasicTypographyProps {\r\n size?: 'small' | 'medium';\r\n children: React.ReactNode;\r\n}\r\nexport function SubTitle(props: SubTitleProps) {\r\n const { size, children, ...other } = props;\r\n const subtitleVarian = size === 'small' ? 'subtitle2' : 'subtitle1';\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport interface BodyProps extends BasicTypographyProps {\r\n size?: 'small' | 'medium' | 'large';\r\n bold?: boolean;\r\n children: React.ReactNode;\r\n}\r\nexport function Body(props: BodyProps) {\r\n const { size, bold, children, ...other } = props;\r\n const bodyVarian =\r\n size === 'large'\r\n ? bold\r\n ? 'boldL'\r\n : 'bodyL'\r\n : size === 'small'\r\n ? bold\r\n ? 'boldS'\r\n : 'bodyS'\r\n : bold\r\n ? 'boldM'\r\n : 'bodyM';\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport interface CaptionProps extends BasicTypographyProps {\r\n bold?: boolean;\r\n children: React.ReactNode;\r\n}\r\nexport function Caption(props: CaptionProps) {\r\n const { bold, children, ...other } = props;\r\n const captionVarian = bold ? 'captionBold' : 'captionRegular';\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\nexport interface UppercaseProps extends BasicTypographyProps {\r\n children: React.ReactNode;\r\n}\r\nexport function Uppercase(props: UppercaseProps) {\r\n const { children, ...other } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\nexport interface TipsProps extends BasicTypographyProps {\r\n bold?: boolean;\r\n children: React.ReactNode;\r\n}\r\nexport function Tips(props: TipsProps) {\r\n const { bold, children, ...other } = props;\r\n const tipsVarian = bold ? 'tipsBold' : 'tipsRegular';\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\nexport interface InputLabelProps extends BasicTypographyProps {\r\n size?: 'xs' | 'medium';\r\n children: React.ReactNode;\r\n}\r\nexport function InputLabel(props: InputLabelProps) {\r\n const { size, children, ...other } = props;\r\n const inputLabelVarian = size === 'xs' ? 'inputLabelXS' : 'inputLabelM';\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\nexport interface InputValueProps extends BasicTypographyProps {\r\n size?: 'small' | 'medium';\r\n children: React.ReactNode;\r\n}\r\nexport function InputValue(props: InputValueProps) {\r\n const { size, children, ...other } = props;\r\n const inputValueVarian = size === 'small' ? 'inputValueS' : 'inputValueM';\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport interface ButtonLabelProps extends BasicTypographyProps {\r\n size?: 'small' | 'medium';\r\n children: React.ReactNode;\r\n}\r\nexport function ButtonLabel(props: ButtonLabelProps) {\r\n const { size, children, ...other } = props;\r\n const buttonLabeVarian = size === 'small' ? 'buttonS' : 'buttonM';\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","import { trimEnd, trimStart } from 'lodash';\r\nimport * as H from 'history';\r\nimport { URLSearchParamsCI } from 'app/components/BasicTable/types/FilterParam';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectPublicUrl } from 'app/slice/selectors';\r\nimport fileDownload from 'js-file-download';\r\nimport axios from 'axios';\r\n\r\nconst PATH_SEPARATOR = '/';\r\nconst ASP_ROOT = '~';\r\nexport function isAbsoluteURL(urlString: string): boolean {\r\n const lowered = urlString.toLowerCase();\r\n return ['http://', 'https://'].some(schema => lowered.startsWith(schema));\r\n}\r\nfunction isRooted(path: string): boolean {\r\n return path.toLowerCase().startsWith(process.env.PUBLIC_URL.toLowerCase());\r\n}\r\nfunction tryCleanASPRoot(path: string): string {\r\n return path.startsWith(ASP_ROOT) ? path.replace(ASP_ROOT, '') : path;\r\n}\r\nexport function combine(basePath: string, path: string): string {\r\n var result =\r\n trimEnd(basePath, PATH_SEPARATOR) +\r\n PATH_SEPARATOR +\r\n trimStart(path, PATH_SEPARATOR);\r\n return result;\r\n}\r\n\r\n/**\r\n * convert relative path to host rooted, e.g. /reservations -> /bkt_webApp/reservations\r\n * @param path\r\n * @returns url usable in an href attribute\r\n */\r\nexport function toRootedURL(path: string, query?: Record): string {\r\n const cpath = tryCleanASPRoot(path);\r\n const alreadyRoot = isAbsoluteURL(cpath) || isRooted(cpath);\r\n const rootedpath = alreadyRoot\r\n ? cpath\r\n : combine(process.env.PUBLIC_URL, cpath);\r\n const fullPath =\r\n query === undefined ? rootedpath : `${rootedpath}?${toQueryString(query)}`;\r\n return fullPath;\r\n}\r\n\r\n/**\r\n * Converts Record values to string and add to URLSearchParams\r\n * @param p object representation of query string\r\n * @returns URLSearchParams\r\n */\r\nexport function toQueryString(p: Record): URLSearchParams {\r\n var result = new URLSearchParams();\r\n Object.entries(p)\r\n .filter(([key, value]) => value !== undefined)\r\n .forEach(([key, value]) => {\r\n result.append(key, value);\r\n });\r\n return result;\r\n}\r\n\r\nexport function buildURL(path: string, params: Record): string {\r\n var result = [toRootedURL(path), '?', toQueryString(params)].join('');\r\n return result;\r\n}\r\nexport function toRelative(root: URL, url: URL) {\r\n if (root.origin !== url.origin) {\r\n return undefined;\r\n }\r\n if (!url.pathname.toLowerCase().startsWith(root.pathname.toLowerCase())) {\r\n throw new Error('External path found.');\r\n }\r\n const rootPath = appendTrailingSlash(root.pathname);\r\n const pathStart = url.pathname.substr(rootPath.length - 1);\r\n const result = pathStart + url.search + url.hash;\r\n return result;\r\n}\r\nexport function appendTrailingSlash(pathname: string) {\r\n return pathname + (pathname.endsWith('/') ? '' : '/');\r\n}\r\nexport function removeLeadingSlash(pathname: string) {\r\n if (pathname.startsWith('/')) {\r\n return pathname.substring(1);\r\n } else {\r\n return pathname;\r\n }\r\n}\r\n\r\n/**\r\n * Provides absoluteURL (e.g. https://foo.bar/baz?foo) given the usual path & search parameters that can be shared/copied\r\n * @param path target pathName\r\n * @param params search parameters\r\n * @returns absolute url\r\n */\r\nexport function useAbsolute(path?: string, toPath?: string) {\r\n const publicUrl = useSelector(selectPublicUrl);\r\n if (toPath !== undefined) {\r\n path = toPath;\r\n }\r\n if (publicUrl === undefined) {\r\n return undefined;\r\n }\r\n if (path === undefined) {\r\n return undefined;\r\n }\r\n if (isAbsoluteURL(path)) {\r\n return path;\r\n }\r\n\r\n var baseURL = new URL(publicUrl);\r\n var targetURL = new URL(removeLeadingSlash(path), baseURL);\r\n return targetURL.toString();\r\n}\r\n\r\n/**\r\n * Converts odata api parameters to export query string\r\n * @param params odata api parameters\r\n * @returns\r\n */\r\nexport function getExportParameters(params: Record) {\r\n const result = { ...params, $format: 'application/xlsx' };\r\n delete result['$count'];\r\n delete result['$top'];\r\n delete result['$skip'];\r\n return result;\r\n}\r\nexport function getExportForImportParameters(params: Record) {\r\n const result = { ...params };\r\n delete result['$count'];\r\n delete result['$top'];\r\n delete result['$skip'];\r\n return result;\r\n}\r\nexport function openExportLinkOld(\r\n path: string,\r\n params?: Record,\r\n): void {\r\n const url = toRootedURL(path, params);\r\n window.open(url, '_blank');\r\n}\r\n\r\nexport async function openExportLink(\r\n path: string,\r\n params?: Record,\r\n): Promise {\r\n return new Promise(async resolve => {\r\n const url = path.replace(process.env.PUBLIC_URL, '');\r\n try {\r\n const response = await axios.get(url, {\r\n responseType: 'blob',\r\n timeout: undefined,\r\n params: params,\r\n });\r\n const cd = response.headers['content-disposition'];\r\n const filename: string =\r\n cd !== undefined ? cd.split('filename=')[1] : 'ExportFile.xlsx';\r\n fileDownload(response.data, filename);\r\n } catch {}\r\n resolve();\r\n });\r\n}\r\n\r\nexport const odataUrlPrefix = '/api/odata/v4/';\r\n\r\nexport type IPathAndQuery = { path: string; search: Record };\r\n\r\nexport function getReturnURL(\r\n location: H.Location,\r\n defaultReturnURL: string = '/',\r\n): string {\r\n try {\r\n const params = new URLSearchParamsCI(location.search);\r\n const returnURLKey = 'returnURL';\r\n const value = params.get(returnURLKey);\r\n return value ?? defaultReturnURL;\r\n } catch (error) {\r\n return defaultReturnURL;\r\n }\r\n}\r\n\r\n/**\r\n * Pipes content-disposition=attachments download links through client side\r\n * @param props\r\n */\r\nexport async function downloadFile(props: {\r\n path: string;\r\n defaultFileName?: string;\r\n}) {\r\n const response = await axios.get(props.path, {\r\n responseType: 'blob',\r\n });\r\n const cd = response.headers['content-disposition'];\r\n const [, filename] = cd?.split('=');\r\n fileDownload(\r\n response.data,\r\n decodeURIComponent(filename ?? props.defaultFileName),\r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { Entity } from 'types/common';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { Notification } from 'types/Notification';\r\nimport { SiteMapProvider, SiteMapSettings } from 'types/SiteMapSettings';\r\nimport { UserProfileSettings } from 'types/UserProfileSettings';\r\nimport { SettingModel } from 'utils/globalSettings/SettingModel';\r\nimport { buildURL } from 'utils/url-utils';\r\n/* --- STATE --- */\r\n\r\n/**\r\n * AppSettings state interface\r\n * TODO: auto generate based on bkt_webApp.Api.V4.Models.SettingsModel\r\n */\r\nexport interface AppSettingsState {\r\n error: string | null;\r\n loadingAppSettings: boolean;\r\n appSettings: AppSettings | null;\r\n loadingAuthenticatedUser: boolean;\r\n loadingSiteMapSettings: boolean;\r\n authenticatedUser?: IAuthenticatedUser;\r\n currentLanguage?: string;\r\n notifications: Notification[];\r\n siteMapSettings: SiteMapSettings | null;\r\n siteMapProvider: SiteMapProvider | null;\r\n eventsCount: number;\r\n loadingEventsCount: boolean;\r\n userProfileSettings: UserProfileSettings[];\r\n loadingUserProfileSettings: boolean;\r\n updatedUserProfileSettings: boolean;\r\n isExpanded: boolean;\r\n systemSettings: SettingModel[];\r\n loadingSystemSettings: boolean;\r\n isAuthenticated?: boolean;\r\n /**\r\n * List of Service Groups selected by the user in the global service group filter aka Top Sg filter\r\n */\r\n globalServiceGroupFilter: Entity[] | undefined;\r\n showGlobalServiceGroupFilter: boolean;\r\n showGlobalServiceGroupsAsList: boolean;\r\n isFullScreen: boolean;\r\n barcodeScanTarget?: ScanTarget;\r\n showAllCores?: boolean;\r\n subBarCollapsed?: boolean;\r\n updatedExpandState?: boolean;\r\n}\r\n\r\nexport type ContainerState = AppSettingsState;\r\n\r\n/**\r\n * User roles enum - local/Bookit.Data/Enums.cs\r\n */\r\n\r\nexport enum Roles {\r\n Administrators = 1,\r\n GroupAdministrators = 2,\r\n InstituteCoord = 3,\r\n HeadOfLab = 4,\r\n CagesAdministrators = 5,\r\n LabTech = 6,\r\n FinAdmin = 7,\r\n RepAdmin = 8,\r\n InventoryAdmin = 9,\r\n UserGroupCoord = 10,\r\n InstrumentEventsAdmin = 11,\r\n GroupBudgetsAdmin = 12,\r\n CalendarOnly = 13,\r\n Readonly = 14,\r\n LoanDeskManager = 15,\r\n EquipmentAdministrator = 16,\r\n UserInquiryAdmin = 17,\r\n ModelAdmin = 18,\r\n RoomOnly = 19,\r\n InvoicesReader = 20,\r\n KioskAdmin = 21,\r\n CustomRole = 22,\r\n BudgetAdmin = 23,\r\n GroupAdminAffiliated = 24,\r\n ServiceGroupBudgetsAdmin,\r\n AnimalAdmin = 25,\r\n /// \r\n /// Users in this role will unlock the large animals operating room pos\r\n /// \r\n LargeAnimalsOperatingRoomUser = 26,\r\n LargeAnimalsOperatingRoomTechnician = 27,\r\n LargeAnimalsOperatingRoomVeterinarian = 28,\r\n CoreBudgetsAdmin = 29,\r\n ConsumableKiosk = 30,\r\n CreateNewAssetsAdmin = 31,\r\n}\r\n\r\nexport enum LoginTypes {\r\n Password,\r\n InternalId,\r\n}\r\nexport type ISaveUserProfileSettingPayload = Pick<\r\n UserProfileSettings,\r\n 'Key' | 'Value' | 'UserName' | 'Enabled'\r\n>;\r\nexport type SaveUserProfileSettingAction = PayloadAction<\r\n ISaveUserProfileSettingPayload\r\n>;\r\nexport interface NoAuthSettings {\r\n defaultUserGroup?: Entity;\r\n registrationEnabled?: boolean;\r\n requiredUserProps: string[];\r\n hiddenUserProps: string[];\r\n}\r\nexport const anonimusUrls = [\r\n 'registeraccount',\r\n 'assets/public',\r\n 'assets/details',\r\n];\r\nexport enum ScanTarget {\r\n All,\r\n Consumables = 1,\r\n Asset = 2,\r\n Inventory = 3,\r\n Login = 4,\r\n}\r\nexport interface BarcodeData {\r\n data: string;\r\n key: ScanTarget;\r\n}\r\nexport interface LoginSettingsModel {\r\n Modules?: KnownModules[];\r\n settings?: SettingModel[];\r\n LoginScreenCompanyLogoLink?: string;\r\n LoginScreenCompanyLogo?: string;\r\n LoginScreenCompanyLogoHeight?: string;\r\n ShowForgotPassword?: boolean;\r\n Help_Login?: string;\r\n WebVersion?: string;\r\n LastCodeUpdate?: Date;\r\n}\r\nexport enum ScanTemplateResult {\r\n Asset,\r\n Room,\r\n Location,\r\n SubLocation,\r\n Plate,\r\n External,\r\n Internal,\r\n}\r\nexport interface BarcodeScanResult {\r\n url: string;\r\n type: ScanTemplateResult;\r\n InternalCode?: string;\r\n RoomId?: string;\r\n LocationId?: string;\r\n SubLocationId?: string;\r\n PlateId?: string;\r\n external?: boolean;\r\n}\r\nexport function parseAssetUrl(\r\n data: string,\r\n appSettings: AppSettings,\r\n): BarcodeScanResult | undefined {\r\n try {\r\n // const publicBaseURL = new URL(appSettings.PublicBaseUrl);\r\n const template =\r\n appSettings.AssetBarcodeRelativeUrlTemplate.indexOf('?') >= 0\r\n ? appSettings.AssetBarcodeRelativeUrlTemplate.split('?').join('/')\r\n : appSettings.AssetBarcodeRelativeUrlTemplate;\r\n\r\n const regExpTemplate = template.replace(/:([^\\\\}]+)/g, '(?<$1>\\\\d+)');\r\n\r\n var url = new URL(data);\r\n let toCompareUrl =\r\n url.pathname.indexOf('?') >= 0\r\n ? url.pathname.split('?').join('/')\r\n : url.pathname;\r\n let internalCode: string | undefined = undefined;\r\n let regObject = new RegExp(regExpTemplate).exec(toCompareUrl);\r\n if (regObject !== null) {\r\n let groups = regObject.groups;\r\n if (groups !== undefined) {\r\n internalCode = groups['internalCode'];\r\n }\r\n }\r\n if (internalCode !== undefined) {\r\n let resUrl = buildURL(`${appSettings.PublicBaseUrl}Assets/Details.aspx`, {\r\n InternalCode: internalCode,\r\n });\r\n return {\r\n type: ScanTemplateResult.Asset,\r\n url: resUrl,\r\n InternalCode: internalCode,\r\n } as BarcodeScanResult;\r\n }\r\n return undefined;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n}\r\nfunction parseRoomUrl(\r\n data: string,\r\n appSettings: AppSettings,\r\n): BarcodeScanResult | undefined {\r\n try {\r\n // const publicBaseURL = new URL(appSettings.PublicBaseUrl);\r\n const template =\r\n appSettings.RoomBarcodeRelativeUrlTemplate.indexOf('?') >= 0\r\n ? appSettings.RoomBarcodeRelativeUrlTemplate.split('?').join('/')\r\n : appSettings.RoomBarcodeRelativeUrlTemplate;\r\n\r\n const regExpTemplate = template.replace(\r\n /\\{\\{([^\\\\}]+)\\}\\}/g,\r\n '(?<$1>\\\\d+)',\r\n );\r\n\r\n var url = new URL(data);\r\n let toCompareUrl =\r\n url.pathname.indexOf('?') >= 0\r\n ? url.pathname.split('?').join('/')\r\n : url.pathname;\r\n let roomId: string | undefined = undefined;\r\n let regObject = new RegExp(regExpTemplate).exec(toCompareUrl);\r\n if (regObject !== null) {\r\n let groups = regObject.groups;\r\n if (groups !== undefined) {\r\n roomId = groups['Id'];\r\n }\r\n }\r\n if (roomId !== undefined) {\r\n let resUrl = buildURL(`${appSettings.PublicBaseUrl}Assets/Public`, {\r\n RoomId: roomId,\r\n });\r\n return {\r\n type: ScanTemplateResult.Room,\r\n url: resUrl,\r\n RoomId: roomId,\r\n } as BarcodeScanResult;\r\n }\r\n return undefined;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n}\r\nexport function parseLocationUrl(\r\n data: string,\r\n appSettings: AppSettings,\r\n): BarcodeScanResult | undefined {\r\n try {\r\n // const publicBaseURL = new URL(appSettings.PublicBaseUrl);\r\n const template =\r\n appSettings.LocationBarcodeRelativeUrlTemplate.indexOf('?') >= 0\r\n ? appSettings.LocationBarcodeRelativeUrlTemplate.split('?').join('/')\r\n : appSettings.LocationBarcodeRelativeUrlTemplate;\r\n\r\n const regExpTemplate = template.replace(\r\n /\\{\\{([^\\\\}]+)\\}\\}/g,\r\n '(?<$1>\\\\d+)',\r\n );\r\n\r\n var url = new URL(data);\r\n let toCompareUrl =\r\n url.pathname.indexOf('?') >= 0\r\n ? url.pathname.split('?').join('/')\r\n : url.pathname;\r\n let locationId: string | undefined = undefined;\r\n let roomId: string | undefined = undefined;\r\n let regObject = new RegExp(regExpTemplate).exec(toCompareUrl);\r\n if (regObject !== null) {\r\n let groups = regObject.groups;\r\n if (groups !== undefined) {\r\n locationId = groups['Id'];\r\n roomId = groups['RoomId'];\r\n }\r\n }\r\n if (locationId !== undefined && roomId !== undefined) {\r\n let resUrl = buildURL(`${appSettings.PublicBaseUrl}Assets/Public`, {\r\n RoomId: roomId,\r\n locationid: locationId,\r\n });\r\n return {\r\n type: ScanTemplateResult.Location,\r\n url: resUrl,\r\n RoomId: roomId,\r\n LocationId: locationId,\r\n } as BarcodeScanResult;\r\n }\r\n return undefined;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n}\r\nexport function parseSubLocationUrl(\r\n data: string,\r\n appSettings: AppSettings,\r\n): BarcodeScanResult | undefined {\r\n try {\r\n // const publicBaseURL = new URL(appSettings.PublicBaseUrl);\r\n const template =\r\n appSettings.SubLocationBarcodeRelativeUrlTemplate.indexOf('?') >= 0\r\n ? appSettings.SubLocationBarcodeRelativeUrlTemplate.split('?').join('/')\r\n : appSettings.SubLocationBarcodeRelativeUrlTemplate;\r\n\r\n const regExpTemplate = template.replace(\r\n /\\{\\{([^\\\\}]+)\\}\\}/g,\r\n '(?<$1>\\\\d+)',\r\n );\r\n\r\n var url = new URL(data);\r\n let toCompareUrl =\r\n url.pathname.indexOf('?') >= 0\r\n ? url.pathname.split('?').join('/')\r\n : url.pathname;\r\n let subLocationId: string | undefined = undefined;\r\n let locationId: string | undefined = undefined;\r\n let roomId: string | undefined = undefined;\r\n let regObject = new RegExp(regExpTemplate).exec(toCompareUrl);\r\n if (regObject !== null) {\r\n let groups = regObject.groups;\r\n if (groups !== undefined) {\r\n subLocationId = groups['Id'];\r\n locationId = groups['LocationListId'];\r\n roomId = groups['RoomId'];\r\n }\r\n }\r\n if (\r\n subLocationId !== undefined &&\r\n locationId !== undefined &&\r\n roomId !== undefined\r\n ) {\r\n let resUrl = buildURL(`${appSettings.PublicBaseUrl}Assets/Public`, {\r\n RoomId: roomId,\r\n locationid: locationId,\r\n sublocationid: subLocationId,\r\n });\r\n return {\r\n type: ScanTemplateResult.SubLocation,\r\n url: resUrl,\r\n RoomId: roomId,\r\n LocationId: locationId,\r\n SubLocationId: subLocationId,\r\n } as BarcodeScanResult;\r\n }\r\n return undefined;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport function parseBarcodeURL(\r\n data: string,\r\n appSettings: AppSettings,\r\n): BarcodeScanResult | undefined {\r\n try {\r\n let assetScanned = parseAssetUrl(data, appSettings);\r\n let subLocationScanned = parseSubLocationUrl(data, appSettings);\r\n let locationScanned = parseLocationUrl(data, appSettings);\r\n let roomScanned = parseRoomUrl(data, appSettings);\r\n if (!!assetScanned) {\r\n console.debug(assetScanned);\r\n return assetScanned;\r\n }\r\n if (!!subLocationScanned) {\r\n console.debug(subLocationScanned);\r\n return subLocationScanned;\r\n }\r\n if (!!locationScanned) {\r\n console.debug(locationScanned);\r\n return locationScanned;\r\n }\r\n if (!!roomScanned) {\r\n console.debug(roomScanned);\r\n return roomScanned;\r\n }\r\n return undefined;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n}\r\nexport function parseBarcode(\r\n data: string,\r\n appSettings: AppSettings,\r\n): BarcodeScanResult | undefined {\r\n try {\r\n // in case when barcode come as URL, try to create url...\r\n var url = new URL(data);\r\n var isLocal = url\r\n .toString()\r\n .toLowerCase()\r\n .startsWith(appSettings.PublicBaseUrl.toLowerCase());\r\n if (!isLocal) {\r\n console.debug({ InternalCode: data });\r\n return {\r\n url: url.toString(),\r\n type: ScanTemplateResult.External,\r\n InternalCode: data,\r\n external: true,\r\n };\r\n } else {\r\n return parseBarcodeURL(data, appSettings);\r\n }\r\n } catch (error) {\r\n console.debug({ InternalCode: data });\r\n return {\r\n url: buildURL(`${appSettings.PublicBaseUrl}Assets/Details.aspx`, {\r\n InternalCode: data,\r\n }),\r\n type: ScanTemplateResult.Internal,\r\n InternalCode: data,\r\n } as BarcodeScanResult;\r\n }\r\n}\r\n","import React, { lazy, Suspense } from 'react';\r\n\r\ninterface Opts {\r\n fallback: React.ReactNode;\r\n}\r\ntype Unpromisify = T extends Promise ? P : never;\r\n\r\nexport const lazyLoad = <\r\n T extends Promise,\r\n U extends React.ComponentType\r\n>(\r\n importFunc: () => T,\r\n selectorFunc?: (s: Unpromisify) => U,\r\n opts: Opts = { fallback: null },\r\n) => {\r\n let lazyFactory: () => Promise<{ default: U }> = importFunc;\r\n\r\n if (selectorFunc) {\r\n lazyFactory = () =>\r\n importFunc().then(module => ({ default: selectorFunc(module) }));\r\n }\r\n\r\n const LazyComponent = lazy(lazyFactory);\r\n\r\n return (props: React.ComponentProps): JSX.Element => (\r\n \r\n \r\n \r\n );\r\n};\r\n","import { LocationDetailsProps } from 'app/pages/LocationsPage/Details';\r\nimport { AssetPopUpProps } from 'app/pages/AssetPopUp';\r\nimport { QuizDetailsProps } from 'app/pages/QuizDetailsPage/QuizDetails';\r\nimport { StartQuizProps } from 'app/pages/QuizPage/StartQuiz';\r\nimport { TrainingDetailsProps } from 'app/pages/UserTrainings/TrainingDetailsPage/Details';\r\nimport { WorkOrderDetailsProps } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { PaymentProps } from 'app/pages/AddPaymentPage';\r\nimport { ChargeProps } from 'app/pages/AddChargePage';\r\nimport { InvoiceDetailsSidePanelProps } from 'app/pages/InvoiceDetails/InvoiceDetailsSidePanel';\r\nimport { BillingActionsDetailsProps } from 'app/pages/BillingActions/BillingActionsDetailsPage/Details';\r\nimport { SavedViewDetailsProps } from 'app/pages/SavedViewsPage/SavedViewPage/Details';\r\nimport { InstrumentRestrictionsProps } from 'app/pages/InstrumentRestrictionsPage/Details/InstrumentRestrictions';\r\nimport { ReservationDetailsProps } from 'app/pages/ReservationDetails/Details';\r\nimport { InvoiceTemplatePopUpProps } from 'app/pages/InvoiceTemplates/InvoiceTemplatePopUp';\r\nimport { OtherServiceDetailsProps } from 'app/pages/OtherServiceDetails/Details';\r\nimport { PricePeriodDetailsProps } from 'app/pages/PriceSheetPeriodDetails/Details';\r\nimport { CoreSelectionProps } from 'app/pages/CoreSelectionPage/CoreSelection';\r\nimport { AssetsSelectionProps } from 'app/pages/MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport { UserAttributesDetailsProps } from 'app/pages/UserAttributes/UserAttributesDetailsPage/Details';\r\nimport { ServiceRequestDetailsProps } from 'app/pages/Samples/RequestSamplesPage';\r\nimport { CalendarMessagesDetailsProps } from 'app/pages/CalendarMessages/CalendarMessagesDetails/Details';\r\nimport { ReportConsumablesProps } from 'app/pages/OtherServiceDetails/ReportConsumables';\r\nimport { ServiceRequestTicketDetailsProps } from 'app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails';\r\nimport { ServiceRequestMilestoneDetailsProps } from 'app/pages/Samples/components/ServiceRequestMilestoneDetails';\r\nimport { ServiceRequestMilestoneChargeDetailsProps } from 'app/pages/Samples/components/ServiceRequestMilestoneChargeDetails';\r\nimport { StockRenewalProps } from 'app/pages/OtherServiceDetails/StockRenewal';\r\nimport { RenewStockProps } from 'app/pages/OtherServiceDetails/RenewStock';\r\nimport { InventoryBatchProps } from 'app/pages/OtherServiceDetails/InventoryBatch';\r\nimport { InvoiceBatchesCommentsProps } from 'app/pages/InvoiceBatches/InvoiceBatchesComments';\r\nimport { InventoryLogProps } from 'app/pages/AssetsInventoryLog/InventoryLog';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { ArticleAssociationFormProps } from 'app/pages/ArticlesPage/ArticleAssociationForm';\r\n\r\nexport interface LayoutState {\r\n sidePanelState: SidePanelState;\r\n confirmState: ConfirmState;\r\n continueState: ContinueState;\r\n hasAnyNotSavedChanges: boolean;\r\n doRefreshTable: boolean;\r\n hideNavigation?: boolean;\r\n actionTableProcessing?: ProcessingData;\r\n upsnackbarIndex?: boolean;\r\n isMobileView?: boolean;\r\n adminPanelState: AdminPanelState;\r\n}\r\nexport interface SidePanelState {\r\n sidePanelOpen: boolean;\r\n pageType?: RenderPageType;\r\n pageProps?: PageTypeProps;\r\n expanded: boolean;\r\n coverOpen?: boolean;\r\n coverExpanded?: boolean;\r\n}\r\nexport interface ConfirmState {\r\n confirmOpen: boolean;\r\n approved: boolean;\r\n rejected: boolean;\r\n showLocalConfirm: boolean;\r\n continueToLink?: string;\r\n}\r\nexport interface ContinueState {\r\n pageType?: RenderPageType;\r\n pageProps?: PageTypeProps;\r\n expanded?: boolean;\r\n continueOnApprove: boolean;\r\n}\r\nexport interface AdminPanelState {\r\n adminPanelOpen: boolean;\r\n url?: string | IPathAndQuery;\r\n}\r\nexport interface ProcessingData {\r\n name: string;\r\n processing: boolean;\r\n}\r\nexport enum RenderPageType {\r\n TrainingDetails,\r\n QuizCreate,\r\n QuizzDetails,\r\n LocationDetails,\r\n AssetDetails,\r\n WorkOrderDetails,\r\n AddPayment,\r\n AddCharge,\r\n InvoiceDetails,\r\n AddBillingAction,\r\n SavedViewDetails,\r\n LabelType,\r\n LabelTypeEdit,\r\n OtherServiceDetails,\r\n RestrictionDetails,\r\n InvoiceTemplatePopUp,\r\n ReservationDetails,\r\n PricePeriodsDetails,\r\n Article,\r\n CoreSelection,\r\n AssetsSelection,\r\n ArticleNew,\r\n ArticleEdit,\r\n UserAttributesDetails,\r\n ServiceRequestDetails,\r\n CalendarMessagesDetails,\r\n ReportConsumables,\r\n ServiceRequestTicketDetails,\r\n ServiceRequestMilestone,\r\n ServiceRequestMilestoneCharge,\r\n StockRenewal,\r\n RenewStock,\r\n InventoryBatch,\r\n InvoiceBatchesComments,\r\n AssetInventoryLog,\r\n ArticleForm,\r\n}\r\nexport interface SidePanelContentProps {\r\n useSidePanel: boolean;\r\n}\r\nexport type PageTypeProps =\r\n | TrainingDetailsProps\r\n | StartQuizProps\r\n | QuizDetailsProps\r\n | LocationDetailsProps\r\n | AssetPopUpProps\r\n | WorkOrderDetailsProps\r\n | PaymentProps\r\n | ChargeProps\r\n | InvoiceDetailsSidePanelProps\r\n | BillingActionsDetailsProps\r\n | SavedViewDetailsProps\r\n | InvoiceTemplatePopUpProps\r\n | OtherServiceDetailsProps\r\n | InstrumentRestrictionsProps\r\n | ReservationDetailsProps\r\n | PricePeriodDetailsProps\r\n | CoreSelectionProps\r\n | AssetsSelectionProps\r\n | UserAttributesDetailsProps\r\n | ServiceRequestDetailsProps\r\n | ServiceRequestTicketDetailsProps\r\n | ReportConsumablesProps\r\n | CalendarMessagesDetailsProps\r\n | ServiceRequestMilestoneDetailsProps\r\n | ServiceRequestMilestoneChargeDetailsProps\r\n | StockRenewalProps\r\n | RenewStockProps\r\n | InventoryBatchProps\r\n | InvoiceBatchesCommentsProps\r\n | InventoryLogProps\r\n | ArticleAssociationFormProps;\r\n","import * as React from 'react';\r\nimport {\r\n IconButton as MatIconButton,\r\n IconButtonProps as MatIconButtonProps,\r\n Link,\r\n} from '@material-ui/core';\r\nimport clsx from 'clsx';\r\nimport { IPathAndQuery, toRootedURL } from 'utils/url-utils';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { capitalize } from 'lodash';\r\nimport { ButtonsVariant } from '../Button';\r\nimport { toLocationDescriptor } from 'app/components/BasicLinks/Link';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\n\r\nexport interface IconButtonPropsBase\r\n extends Omit {\r\n disabled?: boolean;\r\n children?: React.ReactNode;\r\n href?: string | IPathAndQuery;\r\n to?: string | IPathAndQuery;\r\n target?: string;\r\n icon?: IconProp;\r\n}\r\nexport interface IPrimaryIconStyleThemeProps {\r\n size?: 'large' | 'medium' | 'small' | 'xs';\r\n variant?: ButtonsVariant;\r\n shape?: 'circle' | 'square';\r\n}\r\nexport type IconButtonProps = IconButtonPropsBase & IPrimaryIconStyleThemeProps;\r\n\r\nexport function IconButton(props: IconButtonProps) {\r\n const {\r\n children,\r\n disabled,\r\n size = 'small',\r\n variant = 'main',\r\n shape = 'square',\r\n href,\r\n to,\r\n title,\r\n target,\r\n icon,\r\n ...other\r\n } = props;\r\n const dispatch = useDispatch();\r\n const { actions: appActions } = useAppSettingsSlice();\r\n const handleClick = (e: any) => {\r\n if (props.onClick) {\r\n props.onClick(e);\r\n }\r\n if (!!to) {\r\n let toto = typeof to === 'string' ? to : toLocationDescriptor(to);\r\n dispatch(appActions.navigate(toto));\r\n //history.push(toto);\r\n }\r\n };\r\n const absolutePath =\r\n href === undefined\r\n ? undefined\r\n : typeof href === 'string'\r\n ? toRootedURL(href)\r\n : toRootedURL(\r\n (href as IPathAndQuery).path,\r\n (href as IPathAndQuery).search,\r\n );\r\n\r\n return href ? (\r\n \r\n \r\n {\r\n event.stopPropagation();\r\n handleClick(event);\r\n }}\r\n {...other}\r\n >\r\n {!!children ? children : }\r\n \r\n \r\n \r\n ) : (\r\n \r\n {\r\n event.stopPropagation();\r\n handleClick(event);\r\n }}\r\n disabled={disabled}\r\n disableRipple\r\n {...other}\r\n >\r\n {!!children ? children : }\r\n \r\n \r\n );\r\n}\r\n\r\nexport function WithTitle({\r\n children,\r\n title,\r\n}: React.PropsWithChildren<{\r\n title?: string;\r\n}>) {\r\n if (title) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n } else {\r\n return <>{children};\r\n }\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { delay, put, select, takeLatest } from 'redux-saga/effects';\r\nimport { layoutActions as actions } from '.';\r\nimport { PageTypeProps, RenderPageType } from './type';\r\nimport {\r\n selectAdminPanelOpen,\r\n selectHasNotSavedChanges,\r\n selectSidePanelOpen,\r\n} from './selectors';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\n\r\n// export function* doInitSidePanel() {\r\n// yield put(actions.initLayoutState());\r\n// }\r\nexport function* doOpenSidePanel(\r\n action: PayloadAction<{\r\n type: RenderPageType | undefined;\r\n props: PageTypeProps | undefined;\r\n expanded: boolean | undefined;\r\n }>,\r\n) {\r\n const isChangesNotSaved: boolean = yield select(selectHasNotSavedChanges);\r\n const sidePanelOpen: boolean = yield select(selectSidePanelOpen);\r\n if (isChangesNotSaved) {\r\n yield put(\r\n actions.setContinueState({\r\n type: action.payload.type,\r\n props: action.payload.props,\r\n expanded: action.payload.expanded,\r\n continue: true,\r\n }),\r\n );\r\n yield put(actions.setConfirmOpen(true));\r\n } else {\r\n if (sidePanelOpen) {\r\n yield put(actions.resetSidePanel(true));\r\n yield delay(200);\r\n yield put(\r\n actions.setTuggleOpenState({\r\n expanded: !!action.payload.expanded,\r\n type: action.payload.type,\r\n props: action.payload.props,\r\n open: true,\r\n }),\r\n );\r\n } else {\r\n yield put(\r\n actions.setTuggleOpenState({\r\n expanded: !!action.payload.expanded,\r\n type: action.payload.type,\r\n props: action.payload.props,\r\n open: true,\r\n }),\r\n );\r\n }\r\n }\r\n}\r\nexport function* doOpenAdminPanel(\r\n action: PayloadAction<{\r\n url: string | IPathAndQuery;\r\n }>,\r\n) {\r\n const adminPanelOpen: boolean = yield select(selectAdminPanelOpen);\r\n if (adminPanelOpen) {\r\n yield put(actions.resetAdminPanel(true));\r\n yield delay(100);\r\n yield put(actions.setAdminPanelUrl(action.payload.url));\r\n } else {\r\n yield put(actions.setAdminPanelUrl(action.payload.url));\r\n yield put(actions.setAdminPanelOpen(true));\r\n }\r\n}\r\nexport function* layoutSaga() {\r\n yield takeLatest(actions.openSidePanel.type, doOpenSidePanel);\r\n yield takeLatest(actions.openAdminPanel.type, doOpenAdminPanel);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { layoutSaga } from './saga';\r\nimport {\r\n LayoutState,\r\n PageTypeProps,\r\n ProcessingData,\r\n RenderPageType,\r\n} from './type';\r\n\r\nexport const initialState: LayoutState = {\r\n sidePanelState: {\r\n sidePanelOpen: false,\r\n pageType: undefined,\r\n pageProps: undefined,\r\n expanded: false,\r\n coverOpen: false,\r\n coverExpanded: false,\r\n },\r\n confirmState: {\r\n confirmOpen: false,\r\n approved: false,\r\n rejected: false,\r\n showLocalConfirm: false,\r\n continueToLink: undefined,\r\n },\r\n hasAnyNotSavedChanges: false,\r\n doRefreshTable: false,\r\n continueState: {\r\n continueOnApprove: false,\r\n pageProps: undefined,\r\n pageType: undefined,\r\n expanded: undefined,\r\n },\r\n hideNavigation: undefined,\r\n actionTableProcessing: undefined,\r\n upsnackbarIndex: undefined,\r\n isMobileView: undefined,\r\n adminPanelState: {\r\n adminPanelOpen: false,\r\n url: undefined,\r\n },\r\n};\r\nexport interface IOpenSidePanelPayload {\r\n type: RenderPageType | undefined;\r\n props: PageTypeProps | undefined;\r\n expanded?: boolean;\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'layout',\r\n initialState,\r\n reducers: {\r\n toggleSidePanel(state, action: PayloadAction) {\r\n state.sidePanelState.sidePanelOpen = action.payload;\r\n },\r\n openSidePanel(state, action: PayloadAction) {},\r\n setTuggleOpenState(\r\n state,\r\n action: PayloadAction<{\r\n expanded: boolean;\r\n type: RenderPageType | undefined;\r\n props: PageTypeProps | undefined;\r\n open: boolean;\r\n }>,\r\n ) {\r\n state.sidePanelState.expanded = action.payload.expanded;\r\n state.sidePanelState.pageProps = action.payload.props;\r\n state.sidePanelState.pageType = action.payload.type;\r\n state.sidePanelState.sidePanelOpen = action.payload.open;\r\n },\r\n setPageType(state, action: PayloadAction) {\r\n state.sidePanelState.pageType = action.payload;\r\n },\r\n setPageProps(state, action: PayloadAction) {\r\n state.sidePanelState.pageProps = action.payload;\r\n },\r\n setExpanded(state, action: PayloadAction) {\r\n state.sidePanelState.expanded = action.payload;\r\n },\r\n resetSidePanel(state, action: PayloadAction) {\r\n state.sidePanelState.sidePanelOpen = action.payload || false;\r\n state.sidePanelState.pageProps = undefined;\r\n state.sidePanelState.pageType = undefined;\r\n state.sidePanelState.expanded = false;\r\n state.sidePanelState.coverExpanded = undefined;\r\n state.sidePanelState.coverOpen = undefined;\r\n state.confirmState = {\r\n confirmOpen: false,\r\n approved: false,\r\n rejected: false,\r\n showLocalConfirm: false,\r\n continueToLink: undefined,\r\n };\r\n state.hasAnyNotSavedChanges = false;\r\n state.upsnackbarIndex = undefined;\r\n },\r\n setConfirmOpen(state, action: PayloadAction) {\r\n state.confirmState.confirmOpen = action.payload;\r\n },\r\n resetConfirmState(state, action: PayloadAction) {\r\n state.confirmState = {\r\n confirmOpen: false,\r\n approved: false,\r\n rejected: false,\r\n showLocalConfirm: false,\r\n continueToLink: undefined,\r\n };\r\n },\r\n setConfirmApproved(state, action: PayloadAction) {\r\n state.confirmState.approved = action.payload;\r\n },\r\n setConfirmRejected(state, action: PayloadAction) {\r\n state.confirmState.rejected = action.payload;\r\n },\r\n setContinueToLink(state, action: PayloadAction) {\r\n state.confirmState.continueToLink = action.payload;\r\n },\r\n setNotSavedChanges(state, action: PayloadAction) {\r\n state.hasAnyNotSavedChanges = action.payload;\r\n },\r\n setRefreshTable(state, action: PayloadAction) {\r\n state.doRefreshTable = action.payload;\r\n },\r\n setActionTableProcessing(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.actionTableProcessing = action.payload;\r\n },\r\n setLocalConfirm(state, action: PayloadAction) {\r\n state.confirmState.showLocalConfirm = action.payload;\r\n },\r\n setContinueOnApprove(state, action: PayloadAction) {\r\n state.continueState.continueOnApprove = action.payload;\r\n },\r\n setHideNavigation(state, action: PayloadAction) {\r\n state.hideNavigation = action.payload;\r\n },\r\n setContinueState(\r\n state,\r\n action: PayloadAction<{\r\n type: RenderPageType | undefined;\r\n props: PageTypeProps | undefined;\r\n expanded: boolean | undefined;\r\n continue: boolean;\r\n }>,\r\n ) {\r\n state.continueState.continueOnApprove = action.payload.continue;\r\n state.continueState.pageProps = action.payload.props;\r\n state.continueState.pageType = action.payload.type;\r\n state.continueState.expanded = action.payload.expanded;\r\n },\r\n resetContinueState(state, action: PayloadAction) {\r\n state.continueState = {\r\n continueOnApprove: false,\r\n pageProps: undefined,\r\n pageType: undefined,\r\n expanded: undefined,\r\n };\r\n },\r\n setUpSnackBarIndex(state, action: PayloadAction) {\r\n state.upsnackbarIndex = action.payload;\r\n },\r\n setIsMobileView(state, action: PayloadAction) {\r\n state.isMobileView = action.payload;\r\n },\r\n setIsCoverOpen(state, action: PayloadAction) {\r\n state.sidePanelState.coverOpen = action.payload;\r\n },\r\n setIsCoverExpanded(state, action: PayloadAction) {\r\n state.sidePanelState.coverExpanded = action.payload;\r\n },\r\n openAdminPanel(\r\n state,\r\n action: PayloadAction<{ url: string | IPathAndQuery }>,\r\n ) {},\r\n resetAdminPanel(state, action: PayloadAction) {\r\n state.adminPanelState.adminPanelOpen = action.payload || false;\r\n state.adminPanelState.url = undefined;\r\n },\r\n setAdminPanelUrl(state, action: PayloadAction) {\r\n state.adminPanelState.url = action.payload;\r\n },\r\n setAdminPanelOpen(state, action: PayloadAction) {\r\n state.adminPanelState.adminPanelOpen = action.payload || false;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: layoutActions } = slice;\r\n\r\nexport const useLayoutSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: layoutSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import React from 'react';\r\nimport { Box as MuiBox, BoxProps as MuiBoxProps } from '@material-ui/core';\r\nexport interface BoxProps extends MuiBoxProps {\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Box({ children, ...props }: BoxProps) {\r\n return {children};\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from 'types/RootState';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => {\r\n return state.layout || initialState;\r\n};\r\nexport const selectSidePanelState = createSelector(\r\n [selectSlice],\r\n state => state.sidePanelState,\r\n);\r\nexport const selectSidePanelOpen = createSelector(\r\n [selectSlice],\r\n state => state.sidePanelState.sidePanelOpen,\r\n);\r\nexport const selectPageType = createSelector(\r\n [selectSlice],\r\n state => state.sidePanelState.pageType,\r\n);\r\nexport const selectExpandedSidePanel = createSelector(\r\n [selectSlice],\r\n state => state.sidePanelState.expanded,\r\n);\r\nexport const selectPageTypeProps = createSelector(\r\n [selectSlice],\r\n state => state.sidePanelState.pageProps,\r\n);\r\nexport const selectConfirmState = createSelector(\r\n [selectSlice],\r\n state => state.confirmState,\r\n);\r\nexport const selectConfirmOpen = createSelector(\r\n [selectSlice],\r\n state => state.confirmState.confirmOpen,\r\n);\r\nexport const selectConfirmApproved = createSelector(\r\n [selectSlice],\r\n state => state.confirmState.approved,\r\n);\r\nexport const selectConfirmRejected = createSelector(\r\n [selectSlice],\r\n state => state.confirmState.rejected,\r\n);\r\nexport const selectHasNotSavedChanges = createSelector(\r\n [selectSlice],\r\n state => state.hasAnyNotSavedChanges,\r\n);\r\nexport const selectDoRefreshTable = createSelector(\r\n [selectSlice],\r\n state => state.doRefreshTable,\r\n);\r\nexport const selectShowLocalConfirm = createSelector(\r\n [selectSlice],\r\n state => state.confirmState.showLocalConfirm,\r\n);\r\nexport const selectContinueOnApprove = createSelector(\r\n [selectSlice],\r\n state => state.continueState.continueOnApprove,\r\n);\r\nexport const selectContinueState = createSelector(\r\n [selectSlice],\r\n state => state.continueState,\r\n);\r\nexport const selectContinueToLink = createSelector(\r\n [selectSlice],\r\n state => state.confirmState.continueToLink,\r\n);\r\nexport const selectHideNavigation = createSelector(\r\n [selectSlice],\r\n state => state.hideNavigation,\r\n);\r\nexport const selectSnackBarIndex = createSelector(\r\n [selectSlice],\r\n state => state.upsnackbarIndex,\r\n);\r\nexport const selectIsMobileView = createSelector(\r\n [selectSlice],\r\n state => state.isMobileView,\r\n);\r\nexport const selectActionTableProcessing = createSelector(\r\n [selectSlice],\r\n state => state.actionTableProcessing,\r\n);\r\nexport const selectProcessingIndicator = createSelector(\r\n [selectActionTableProcessing],\r\n processing => (methodName: string) => {\r\n if (processing === undefined) {\r\n return undefined;\r\n } else if (methodName === processing.name) {\r\n return processing.processing;\r\n } else {\r\n return undefined;\r\n }\r\n },\r\n);\r\nexport const selectIsCoverOpen = createSelector(\r\n [selectSidePanelState],\r\n state => state.coverOpen,\r\n);\r\nexport const selectIsCoverExpanded = createSelector(\r\n [selectSidePanelState],\r\n state => state.coverExpanded,\r\n);\r\nexport const selectAdminPanelOpen = createSelector(\r\n [selectSlice],\r\n state => state.adminPanelState.adminPanelOpen,\r\n);\r\nexport const selectAdminPanelUrl = createSelector(\r\n [selectSlice],\r\n state => state.adminPanelState.url,\r\n);\r\n","import { Identifiable } from 'types/common';\r\n\r\nexport function isNullOrUndefined(\r\n value: T | null | undefined,\r\n): value is null | undefined {\r\n return value === null || value === undefined;\r\n}\r\n\r\nexport function isEmptyOrWhitespace(s: string | null | undefined): boolean {\r\n return s === null || s === undefined || s === '' || s.trim() === '';\r\n}\r\nexport function toUndefinedIfEmptyOrWhitespace(s: string | null | undefined) {\r\n return isEmptyOrWhitespace(s) ? undefined : s;\r\n}\r\nexport function toLowerCaseSafely(s: string | null | undefined): string | null {\r\n return s === null || s === undefined ? null : s.toLowerCase();\r\n}\r\n\r\nexport const valOrNull = (val: T | undefined | null) => {\r\n return val ?? null;\r\n};\r\n\r\n//for use in filter to mark all as not undefined\r\nexport const notUndefined = (val: T | undefined): val is T => {\r\n return val !== undefined;\r\n};\r\n\r\nexport type PartialExceptId> = Pick &\r\n Partial>;\r\n\r\nexport function toNumberOrNull(value: any): number | null {\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n if (typeof value === 'string') {\r\n if (isNaN(parseInt(value))) {\r\n return null;\r\n } else {\r\n return parseInt(value);\r\n }\r\n } else if (typeof value === 'number') {\r\n return value;\r\n } else {\r\n return null;\r\n }\r\n}\r\n","import { BudgetFields } from 'enums/BudgetFields';\r\nimport { AssetAttributes } from 'enums/AssetAttributes';\r\nimport { KnownModules } from './KnownModules';\r\nimport { Entity } from './common';\r\nimport { ImageSize } from 'app/components/AssetThumbImage/getAssetImageSrc';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { SettingModel } from 'utils/globalSettings/SettingModel';\r\n\r\nexport enum EnumAssetTypes {\r\n Equipment,\r\n TrainingProgram,\r\n LectureRoom,\r\n ServiceGroup,\r\n SuperGroup,\r\n Request,\r\n OfflineService,\r\n NotAvailable,\r\n}\r\nexport interface AppSettings {\r\n Globalization: CultureInfoModel;\r\n Modules: KnownModules[];\r\n UserInternalIdLength: number | null;\r\n InternalUserId2FieldLength: number | null;\r\n WebVersion: string;\r\n LastCodeUpdate: Date;\r\n UserGroupsProviderType: number;\r\n AssetFieldSettings: Record;\r\n PublicBaseUrl: string;\r\n UploadFileSizeLimit: number;\r\n MinimizedBookitlabLogo: boolean;\r\n ForbiddenFileExtensions: string[];\r\n BudgetFieldSettings: {\r\n BudgetField: BudgetFields;\r\n Disabled: Boolean;\r\n }[];\r\n TimeZone: ITimeZone;\r\n AssetBarcodeUrlTemplate: string;\r\n AssetBarcodeRelativeUrlTemplate: string;\r\n RoomBarcodeUrlTemplate: string;\r\n RoomBarcodeRelativeUrlTemplate: string;\r\n LocationBarcodeUrlTemplate: string;\r\n LocationBarcodeRelativeUrlTemplate: string;\r\n SubLocationBarcodeUrlTemplate: string;\r\n SubLocationBarcodeRelativeUrlTemplate: string;\r\n SamplePlateBarcodeUrlTemplate: string;\r\n SamplePlateBarcodeRelativeUrlTemplate: string;\r\n ConsumableTypeBarcodeUrlTemplate: string;\r\n ConsumableTypeBarcodeRelativeUrlTemplate: string;\r\n RequiredUserProps: string[];\r\n HideUserProps: string[];\r\n DefaultRegistrationGroup: Entity | null;\r\n UserRegistersToSpecificCores: number;\r\n TopCustomerLogoLink: string;\r\n TopCustomerLogo: string;\r\n FavIconImg: string;\r\n FavIconTitle: string;\r\n DTUOrbitWebServiceEnabled: boolean;\r\n PubMedWebServiceEnabled: boolean;\r\n EmailFromAddress: string;\r\n ShowRawErrors: boolean;\r\n ExistingImages: string[];\r\n Help_Login: string | null;\r\n LoginScreenCompanyLogoLink: string;\r\n LoginScreenCompanyLogo: string;\r\n LoginScreenCompanyLogoHeight: string;\r\n ShowForgotPassword: boolean;\r\n AdvancedAssetPublicSearchFilterAttributes: string;\r\n BrowseByUnitBy: number;\r\n noAuthSettings?: SettingModel[];\r\n}\r\n\r\nexport interface ITimeZone {\r\n Id: string;\r\n StandardName: string;\r\n TimezoneOffsetMinutes: number;\r\n DisplayName: string;\r\n}\r\n\r\nexport function IsBudgetFieldEnabled(\r\n setting: AppSettings | null,\r\n BudgetField: BudgetFields,\r\n): boolean {\r\n if (!!setting && setting.BudgetFieldSettings) {\r\n var result = setting.BudgetFieldSettings.find(bf => {\r\n return bf.BudgetField === BudgetField;\r\n });\r\n return result !== undefined ? result.Disabled === false : true;\r\n }\r\n return false;\r\n}\r\nexport interface CultureInfoModel {\r\n Locale: string;\r\n FirstDayOfWeek: number;\r\n UseAmPm: boolean;\r\n}\r\n\r\nexport interface AppSettingsErrorType {\r\n message: string;\r\n}\r\nexport function IsModuleEnabled(\r\n setting: AppSettings | null,\r\n module: KnownModules,\r\n): boolean {\r\n if (!!setting && setting.Modules) {\r\n return setting?.Modules.includes(module);\r\n }\r\n return false;\r\n}\r\nexport function IsAssetFieldEnabled(\r\n setting: AppSettings | null,\r\n AssetField: AssetAttributes,\r\n AssetAvailabilityType?: AssetTypes,\r\n): boolean {\r\n if (!!setting && setting.AssetFieldSettings && AssetField !== undefined) {\r\n const s = setting.AssetFieldSettings[AssetAttributes[AssetField]];\r\n if (s !== undefined) {\r\n if (AssetAvailabilityType !== undefined) {\r\n const id = EnumAssetTypes[AssetAvailabilityType];\r\n return s.AssetTypes.includes(id);\r\n } else {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nexport function IsAssetFieldIsPublic(\r\n setting: AppSettings | null,\r\n AssetField: AssetAttributes,\r\n AssetAvailabilityType?: AssetTypes,\r\n): boolean {\r\n if (!!setting && setting.AssetFieldSettings && AssetField !== undefined) {\r\n const s = setting.AssetFieldSettings[AssetAttributes[AssetField]];\r\n if (s !== undefined) {\r\n if (AssetAvailabilityType !== undefined) {\r\n const id = EnumAssetTypes[AssetAvailabilityType];\r\n return s.AssetTypes.includes(id) && s.IsPublic === true;\r\n } else {\r\n return s.IsPublic === true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nexport function IsAssetImageExist(\r\n settings: AppSettings | null,\r\n imageName: string | null,\r\n imageSize?: ImageSize,\r\n) {\r\n if (\r\n imageName === null ||\r\n settings === null ||\r\n !settings.ExistingImages ||\r\n (!!settings.ExistingImages && settings.ExistingImages.length < 1)\r\n ) {\r\n return false;\r\n }\r\n let result = false;\r\n result =\r\n !!settings.ExistingImages &&\r\n settings.ExistingImages.length > 0 &&\r\n settings.ExistingImages.some(f => f === imageName);\r\n // switch (imageSize) {\r\n // case 'full':\r\n // result =\r\n\r\n // break;\r\n // case 'thumb':\r\n // result =\r\n // !!settings.ExistingImages.ThumbImages &&\r\n // settings.ExistingImages.ThumbImages.length > 0 &&\r\n // settings.ExistingImages.ThumbImages.some(f => f === imageName);\r\n // break;\r\n // case 'vertical':\r\n // result =\r\n // !!settings.ExistingImages.CardVerticalImages &&\r\n // settings.ExistingImages.CardVerticalImages.length > 0 &&\r\n // settings.ExistingImages.CardVerticalImages.some(f => f === imageName);\r\n // break;\r\n // case 'horizontal':\r\n // result =\r\n // !!settings.ExistingImages.CardHorizontalImages &&\r\n // settings.ExistingImages.CardHorizontalImages.length > 0 &&\r\n // settings.ExistingImages.CardHorizontalImages.some(f => f === imageName);\r\n // break;\r\n // default:\r\n // result = false;\r\n // }\r\n return result;\r\n}\r\nexport function getOffsetDate(\r\n settings: AppSettings | null,\r\n date: Date | string | undefined | null,\r\n) {\r\n const systemOffset = settings?.TimeZone?.TimezoneOffsetMinutes ?? 0;\r\n let correctDate =\r\n date === null || date === undefined\r\n ? dateUtils.dateOrStringToDate(new Date())\r\n : dateUtils.dateOrStringToDate(date);\r\n const currentDateOffset = correctDate.getTimezoneOffset();\r\n const dateOrNow = dateUtils.addMinutes(\r\n correctDate,\r\n systemOffset + currentDateOffset,\r\n );\r\n return dateOrNow;\r\n}\r\n\r\nexport function GetAssetTypeFrom(\r\n availability: AvailabilityTypes,\r\n): AssetTypes | undefined {\r\n switch (availability) {\r\n case AvailabilityTypes.NotAvailable:\r\n case AvailabilityTypes.AvailableNotBookable:\r\n return 'NotAvailable';\r\n case AvailabilityTypes.FreelyBookable:\r\n case AvailabilityTypes.LoanableEquipment:\r\n return 'Equipment';\r\n case AvailabilityTypes.ServiceRelated:\r\n return 'OfflineService';\r\n case AvailabilityTypes.ServiceGroup:\r\n return 'ServiceGroup';\r\n case AvailabilityTypes.SuperGroup:\r\n return 'SuperGroup';\r\n case AvailabilityTypes.RequestRelated:\r\n return 'Request';\r\n case AvailabilityTypes.TrainingProgram:\r\n return 'TrainingProgram';\r\n case AvailabilityTypes.LectureRoom:\r\n return 'LectureRoom';\r\n default:\r\n return;\r\n }\r\n}\r\n\r\nexport type AssetTypes =\r\n | 'Equipment'\r\n | 'TrainingProgram'\r\n | 'LectureRoom'\r\n | 'ServiceGroup'\r\n | 'SuperGroup'\r\n | 'Request'\r\n | 'OfflineService'\r\n | 'NotAvailable';\r\nexport interface IAssetAttributeSettingDto {\r\n Name: string;\r\n AssetTypes: Array;\r\n AssetCats: Array;\r\n IsPublic: boolean;\r\n Enabled: boolean;\r\n DisplayName: string;\r\n Order: number;\r\n}\r\n","import { EnumType } from 'typescript';\r\nimport { AllowedSettings } from './AllowedSettings';\r\nimport { SettingModel } from './SettingModel';\r\n\r\nexport class GlobalSettings {\r\n settings: SettingModel[];\r\n constructor(sett: SettingModel[]) {\r\n this.settings = sett;\r\n }\r\n public TryGet(key: string): string | null {\r\n if (this.settings.length > 0) {\r\n let obj = this.settings.find((value, index) => value.Name === key);\r\n return obj === undefined ? null : obj.Value;\r\n } else {\r\n return null;\r\n }\r\n }\r\n //please dont forget to add key of the setting to the allowed list of the enum AllowedSettings\r\n public GetString(key: AllowedSettings): string {\r\n let keyValue = AllowedSettings[key];\r\n let res = this.TryGet(keyValue.toString());\r\n return res === null ? '' : res;\r\n }\r\n public GetNullableByKey(key: AllowedSettings): string | null {\r\n let keyValue = AllowedSettings[key];\r\n return this.TryGet(keyValue.toString());\r\n }\r\n public GetNullableString(key: string): string | null {\r\n return this.TryGet(key);\r\n }\r\n public GetBooleanByKey(key: AllowedSettings): boolean {\r\n let res = this.GetString(key);\r\n return res === '' ? false : res.toLowerCase() === 'true';\r\n }\r\n public GetBoolean(key: string): boolean {\r\n let res = this.TryGet(key);\r\n return res === null ? false : res.toLowerCase() === 'true';\r\n }\r\n public GetNullableBoolean(key: string): boolean | null {\r\n let res = this.TryGet(key);\r\n return res === null ? null : res.toLowerCase() === 'true';\r\n }\r\n public GetEnum(key: string, typeEnum: EnumType): EnumType {\r\n let res = this.TryGet(key);\r\n return res === null ? typeEnum.getDefault() : typeEnum[res];\r\n }\r\n public GetNullableEnum(key: string, typeEnum: EnumType): EnumType | null {\r\n let res = this.TryGet(key);\r\n return res === null ? null : typeEnum[res];\r\n }\r\n}\r\n","import { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport * as rdd from 'react-device-detect';\r\n\r\nexport function DetectIsMobile() {\r\n const { checkIsMobile } = useIsMobile();\r\n return checkIsMobile();\r\n}\r\nexport function GetBrowserInfo() {\r\n console.debug(`\r\n fullBrowserVersion: ${rdd.fullBrowserVersion};\r\n browserName: ${rdd.browserName};\r\n browserVersion: ${rdd.browserVersion};\r\n deviceType: ${rdd.deviceType};\r\n engineName: ${rdd.engineName};\r\n engineVersion: ${rdd.engineVersion};\r\n osName: ${rdd.osName};\r\n osVersion: ${rdd.osVersion};\r\n mobileModel: ${rdd.mobileModel};\r\n mobileVendor: ${rdd.mobileVendor};\r\n `);\r\n}\r\n","/**\r\n *\r\n * AutocompletePickerS2\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { CircularProgress, InputBaseComponentProps } from '@material-ui/core';\r\nimport Autocomplete from '@material-ui/lab/Autocomplete';\r\nimport { EntityType } from 'types/common';\r\nimport {\r\n autocompleteExtendStyles,\r\n autocompleteStyles,\r\n} from 'styles/MUIExtend/autocompleteStyles';\r\nimport BaseTextField from 'app/components/BasicInputs/BaseTextField';\r\nimport { CSSProperties } from 'styled-components';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport clsx from 'clsx';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport {\r\n extractDataFromResponse,\r\n IDisableable,\r\n loadDataAndPrepareOptions,\r\n OptionType,\r\n} from '../Utils/autoCompletePickerUtils';\r\nimport { FilterOptionsState } from '@material-ui/lab';\r\nimport { highlightSearchTerm } from '../BaseOptionsPicker/highlightSearchTerm';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\n\r\nexport interface AutocompletePickerProps {\r\n loadData: (\r\n searchTerm: string | null,\r\n predicates?: (string | Condition)[],\r\n ) => Promise;\r\n filterOptions?: (\r\n options: OptionType[],\r\n state: FilterOptionsState>,\r\n ) => OptionType[];\r\n value?: T | null;\r\n label?: string;\r\n onChange?: (value: T | null) => void;\r\n size?: 'medium' | 'small';\r\n mini?: boolean;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n isOpen?: boolean;\r\n disableClearable?: boolean;\r\n style?: CSSProperties;\r\n required?: boolean;\r\n fullWidth?: boolean;\r\n additionalItem?: T | null;\r\n disabled?: boolean;\r\n name?: string;\r\n placeholder?: string;\r\n onBlur?: React.FocusEventHandler;\r\n error?: boolean;\r\n helperText?: string;\r\n info?: string;\r\n noOptionsText?: React.ReactNode;\r\n defaultValue?: T | null;\r\n id?: string;\r\n select?: boolean;\r\n customData?: T | T[] | null;\r\n predicates?: (string | Condition)[];\r\n ariaLabel?: string;\r\n className?: string;\r\n title?: string;\r\n loading?: boolean;\r\n clearOnBlur?: boolean;\r\n freeSolo?: boolean;\r\n handleInputChange?: (value: string) => void;\r\n additionalSearchTerm?: string | null;\r\n onPickerOpen?: () => void;\r\n renderOptionName?: (option: OptionType) => string;\r\n getOptionLabelName?: (option: OptionType) => string;\r\n inputProps?: InputBaseComponentProps | undefined;\r\n autoFocus?: boolean;\r\n autoHighlight?: boolean;\r\n autoComplete?: boolean;\r\n autoSelect?: boolean;\r\n blurOnSelect?: 'touch' | 'mouse' | true | false;\r\n clearOnEscape?: boolean;\r\n includeInputInList?: boolean;\r\n selectOnFocus?: boolean;\r\n disableListWrap?: boolean;\r\n disableCloseOnSelect?: boolean;\r\n filterSelectedOptions?: boolean;\r\n openOnFocus?: boolean;\r\n setSomeOpen?: (open: boolean) => void;\r\n ListboxProps?: object;\r\n}\r\n\r\nexport function AutocompletePicker({\r\n label,\r\n loadData,\r\n filterOptions = options => options,\r\n value,\r\n onChange,\r\n size,\r\n mini,\r\n variant,\r\n isOpen,\r\n disableClearable,\r\n style,\r\n fullWidth = false,\r\n additionalItem,\r\n disabled,\r\n info,\r\n noOptionsText,\r\n id,\r\n select,\r\n required,\r\n predicates,\r\n ariaLabel,\r\n className,\r\n title,\r\n loading: propsLoading,\r\n freeSolo,\r\n handleInputChange,\r\n additionalSearchTerm,\r\n renderOptionName,\r\n getOptionLabelName,\r\n inputProps,\r\n autoFocus,\r\n autoHighlight = true,\r\n autoComplete,\r\n autoSelect = true,\r\n blurOnSelect,\r\n clearOnEscape,\r\n includeInputInList,\r\n selectOnFocus,\r\n disableListWrap,\r\n filterSelectedOptions,\r\n disableCloseOnSelect,\r\n openOnFocus,\r\n setSomeOpen,\r\n ListboxProps,\r\n ...props\r\n}: AutocompletePickerProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const classes = autocompleteStyles();\r\n const extClasses = autocompleteExtendStyles();\r\n const timerRef = React.useRef(null);\r\n //const miniClass = `${size === 'small' && mini ? 'miniDense' : ''}`;\r\n let firstOpen = isOpen;\r\n const [open, setOpen] = React.useState(firstOpen);\r\n const [options, setOptions] = React.useState<\r\n Array> | undefined\r\n >([]);\r\n const [searchTerm, setSearchTerm] = React.useState(\r\n additionalSearchTerm === undefined ? null : additionalSearchTerm,\r\n );\r\n const [hasSelected, setSelected] = React.useState(\r\n value !== undefined && value !== null,\r\n );\r\n const [firstMounted, setFirstMounted] = React.useState(\r\n true,\r\n );\r\n useEffectOnMount(() => {\r\n !!setSomeOpen && setSomeOpen(isOpen ?? false);\r\n });\r\n const handleSelectText = (\r\n event: React.FocusEvent,\r\n ) => {\r\n event.target.select();\r\n event.target.setSelectionRange(0, event.target.value.length);\r\n setFirstMounted(undefined);\r\n console.log('auto focus running');\r\n };\r\n React.useEffect(() => {\r\n return () => clearTimeout(timerRef.current);\r\n }, []);\r\n const [loading, setLoading] = React.useState(propsLoading ?? false);\r\n // update internal \"loading\" state when \"loading\" property changes it's value\r\n React.useEffect(() => {\r\n if (propsLoading !== undefined) {\r\n setLoading(propsLoading);\r\n }\r\n }, [propsLoading]);\r\n const doload = open && (options === undefined || options?.length === 0);\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const showShortView = isMobile || (sidePanelOpen && !sidePanelExpanded);\r\n\r\n React.useEffect(() => {\r\n let active = true;\r\n if (!doload) {\r\n return undefined;\r\n }\r\n (async () => {\r\n try {\r\n if (active) {\r\n setLoading(true);\r\n const rawResponse = await loadData(searchTerm, predicates);\r\n const response = extractDataFromResponse(rawResponse);\r\n const optionsData = loadDataAndPrepareOptions({\r\n response,\r\n additionalItem,\r\n t,\r\n });\r\n\r\n setOptions(optionsData);\r\n setLoading(false);\r\n }\r\n } catch {\r\n setOptions([]);\r\n setLoading(false);\r\n }\r\n })();\r\n\r\n return () => {\r\n active = false;\r\n };\r\n }, [additionalItem, doload, loadData, predicates, searchTerm, t]);\r\n\r\n React.useEffect(() => {\r\n if (!open) {\r\n setOptions(undefined);\r\n }\r\n }, [open]);\r\n\r\n return (\r\n {\r\n !disableClearable && setOptions(undefined);\r\n !selectOnFocus && setSearchTerm(null);\r\n setOpen(true);\r\n !!setSomeOpen && setSomeOpen(true);\r\n !!props.onPickerOpen && props.onPickerOpen();\r\n }}\r\n onClose={() => {\r\n setSearchTerm(null);\r\n setOpen(false);\r\n !!setSomeOpen && setSomeOpen(false);\r\n setLoading(false);\r\n }}\r\n onChange={(event, value, reason, details) => {\r\n if (\r\n value == null ||\r\n ((value as T)?.Id !== undefined &&\r\n ((value as unknown) as IDisableable)?.disabled !== true)\r\n ) {\r\n setSearchTerm(null);\r\n onChange?.(value as T);\r\n setSelected(value !== undefined && value !== null);\r\n }\r\n }}\r\n multiple={false}\r\n onInputChange={(event, newInputValue, reason) => {\r\n setOptions(undefined);\r\n if (reason === 'input') {\r\n let val =\r\n !!newInputValue && newInputValue !== null\r\n ? newInputValue.trimStart()\r\n : newInputValue;\r\n setSearchTerm(val);\r\n if (handleInputChange !== undefined) {\r\n handleInputChange(val);\r\n }\r\n }\r\n }}\r\n style={style}\r\n getOptionSelected={(option, value) =>\r\n (option as T)?.Id !== undefined &&\r\n (value as T)?.Id !== undefined &&\r\n (option as T)?.Id === (value as T)?.Id\r\n }\r\n getOptionDisabled={option =>\r\n ((option as unknown) as IDisableable)?.disabled ?? false\r\n }\r\n getOptionLabel={option => {\r\n if (!!getOptionLabelName) {\r\n return getOptionLabelName(option);\r\n } else {\r\n return option.Name ?? t(translations.NA);\r\n }\r\n }}\r\n renderOption={(option, state) =>\r\n highlightSearchTerm(\r\n !!renderOptionName ? renderOptionName(option) : option.Name,\r\n state.inputValue,\r\n )\r\n }\r\n options={(options as OptionType[]) ?? []}\r\n filterSelectedOptions={filterSelectedOptions}\r\n /**\r\n * filter is needed to be disabled in order to show server filterd items that might not contain the searchterm as is\r\n * or to show any other additional label like \"showing x records, please search fo more\"\r\n * */\r\n filterOptions={filterOptions}\r\n loading={loading}\r\n value={value ?? null}\r\n classes={{\r\n root: clsx(classes.root, showShortView ? 'shortView' : undefined),\r\n tag: classes.tag,\r\n tagSizeSmall: classes.tagSizeSmall,\r\n inputRoot: classes.inputRoot,\r\n input: classes.input,\r\n inputFocused: classes.inputFocused,\r\n endAdornment: classes.endAdornment,\r\n clearIndicator: classes.clearIndicator,\r\n popupIndicator: classes.popupIndicator,\r\n popupIndicatorOpen: classes.popupIndicatorOpen,\r\n paper: classes.paper,\r\n listbox: classes.listbox,\r\n loading: classes.loading,\r\n noOptions: classes.noOptions,\r\n option: classes.option,\r\n groupLabel: classes.groupLabel,\r\n groupUl: classes.groupUl,\r\n }}\r\n fullWidth={fullWidth}\r\n className={clsx(className, extClasses.extendRoot)}\r\n disableClearable={disableClearable}\r\n onBlur={props?.onBlur}\r\n size={size}\r\n popupIcon={}\r\n closeIcon={}\r\n freeSolo={freeSolo}\r\n selectOnFocus={selectOnFocus || (isMobile ? false : true)}\r\n renderInput={params => (\r\n event.target.select()}\r\n autoFocus={autoFocus}\r\n onFocus={event => {\r\n clearTimeout(timerRef.current);\r\n if (\r\n autoFocus &&\r\n value !== null &&\r\n value !== undefined &&\r\n selectOnFocus &&\r\n firstMounted\r\n ) {\r\n timerRef.current = setTimeout(handleSelectText, 100, event);\r\n }\r\n }}\r\n inputProps={{\r\n ...params.inputProps,\r\n ...inputProps,\r\n 'aria-label': `${\r\n label ? undefined : ariaLabel ? ariaLabel : 'search input'\r\n }`,\r\n // 'aria-labelledby': `${\r\n // label ? undefined : id ? `${id}_label` : undefined\r\n // }`,\r\n title: title,\r\n }}\r\n InputProps={{\r\n //autoFocus: firstOpen || autoFocus,\r\n classes: {\r\n root: clsx(showShortView ? 'shortView' : undefined),\r\n },\r\n ...params.InputProps,\r\n endAdornment: (\r\n \r\n {props.error}\r\n {loading ? (\r\n \r\n ) : info ? (\r\n \r\n ) : null}\r\n {params.InputProps.endAdornment}\r\n \r\n ),\r\n }}\r\n />\r\n )}\r\n autoHighlight={autoHighlight}\r\n autoComplete={autoComplete}\r\n autoSelect={autoSelect}\r\n blurOnSelect={blurOnSelect}\r\n clearOnEscape={clearOnEscape}\r\n includeInputInList={includeInputInList}\r\n disableListWrap={disableListWrap}\r\n openOnFocus={openOnFocus}\r\n disableCloseOnSelect={disableCloseOnSelect}\r\n ListboxProps={ListboxProps}\r\n />\r\n );\r\n}\r\n","import parse from 'autosuggest-highlight/parse';\r\nimport match from 'autosuggest-highlight/match';\r\n\r\nexport function highlightSearchTerm(text, highlight) {\r\n // Split on highlight term and include term into parts, ignore case\r\n const matches = match(text, highlight);\r\n const parts = parse(text, matches);\r\n\r\n return (\r\n \r\n {parts.map((part, index) =>\r\n part.highlight ? (\r\n {part.text}\r\n ) : (\r\n {part.text}\r\n ),\r\n )}\r\n \r\n );\r\n}\r\n","export enum KnownModules {\r\n Default = 0,\r\n Assets = 1,\r\n BudgetsSyncDoNotDeactivateMissingBudgets = 2,\r\n AccServices = 3,\r\n Quizzes = 4,\r\n AllowOngoingReservationModification = 5,\r\n AssetBarcodePrinting = 6,\r\n AssetDetailsDisplayContactsRelatedOnly = 7,\r\n AutomatedEndTimeUpdate = 8,\r\n AutomaticEmailSending = 9,\r\n AutomaticMonthlyPaymentLetter = 10,\r\n Billing = 11,\r\n Blitz = 12,\r\n WebRelayTm = 13,\r\n WebRelayX600m = 14,\r\n NiDAQmx = 15,\r\n KmTronicRelay = 16,\r\n Budgets = 17,\r\n BudgetCats = 18,\r\n BudgetLimits = 19,\r\n Cages = 20,\r\n Colonies = 21,\r\n ConfigurableColumns = 22,\r\n CoreWizard = 23,\r\n CostObjects = 24,\r\n CustmerBranding = 25,\r\n CreditByQuarter = 26,\r\n CustomFormLinks = 27,\r\n CustomRoles = 28,\r\n Dashboards = 29,\r\n DashboardAnnouncement = 30,\r\n DataStorage = 31,\r\n DataStoreCharge = 32,\r\n Departments = 33,\r\n Dictionaries = 34,\r\n Divisions = 35,\r\n Documents = 36,\r\n DoorAccess = 37,\r\n DoorAccessTibboController = 38,\r\n DoorAccessImport = 39,\r\n Eln /*Projects/Experiments*/ = 40,\r\n Experiment = 41,\r\n EmailCommunicationWithUsers = 42,\r\n EquipmentAssemblies = 43,\r\n EventsBillingByEndDate = 44,\r\n EventsBillingByStartDate = 45,\r\n Expenses = 46,\r\n Factors = 47,\r\n FactorsByInstTypes = 48,\r\n FactorsByUserGroups = 49,\r\n FinAdminRole = 50,\r\n FixedRate = 51,\r\n ForgotPassword = 52,\r\n Genomics = 53,\r\n GroupPermissions = 54,\r\n GroupTrainingBookings = 55,\r\n GoogleCalendar = 56,\r\n HideInstrumentsFromUntrainedUsers = 57,\r\n HideNonDefaultBudgets = 58,\r\n HeaderStyle = 59,\r\n IdleTimeOut = 60,\r\n InstituteCoordRole = 61,\r\n Instruments = 62,\r\n Invoices = 63,\r\n IpRelay = 64,\r\n JoinAdGroup = 65,\r\n //JoinAdGroupText = 66,\r\n JoinAdGroupGenerate = 67,\r\n LabTechRole = 68,\r\n LargeAnimals = 69,\r\n LocalApp = 70,\r\n LocationTracking = 71,\r\n MaintenanceAssets = 72,\r\n Messages = 73,\r\n MultipleAdGroups = 74,\r\n Newsletter = 75,\r\n OfflineFactors = 76,\r\n OfflineServiceWithReservation = 77,\r\n OfflineServices = 78,\r\n OnlineBudgets = 79,\r\n PaymentsByBudgets = 80,\r\n PaymentsManagement = 81,\r\n Plates = 82,\r\n PlatesProcessing = 83,\r\n Pricing = 84,\r\n ProjectQuotes = 85,\r\n Projects = 86,\r\n QuickbooksExport = 87,\r\n Quotes = 88,\r\n Relay = 89,\r\n RepAdminRole = 90,\r\n RequestedServiceLinesInwokradditionalstatuses = 91,\r\n RequestsLinesManagement = 92,\r\n RequireAssetRoomAndBuilding = 93,\r\n ResCancelNotifications = 94,\r\n ReservationNotification = 95,\r\n ReservationShrink = 96,\r\n ReservationTakeOver = 97,\r\n ReservationsCustomForm = 99,\r\n RetroReservations = 101,\r\n RetroReservationsAdminAsUser = 102,\r\n SAP_Billing = 103,\r\n SAP_NRC_Billing = 104,\r\n SAP_SFTP = 105,\r\n SampleManagementAutoProcessRequests = 106,\r\n SampleManagementTables = 107,\r\n SampleProcessing = 108,\r\n SampleRequestPrintLabels = 109,\r\n SampleRequestQuote = 110,\r\n SampleRequestResultFiles = 111,\r\n Sensors = 112,\r\n ServiceRequests = 113,\r\n RequestMilestones = 114,\r\n ShibbolethAuthentication = 115,\r\n ShibbolethExternalBudgets = 116,\r\n ShowLicenseScreen = 117,\r\n SkipPendingReservationCharge = 118,\r\n SkipReservationBudgetValidation = 119,\r\n SystemSettings = 120,\r\n OAuth = 121,\r\n Suppliers = 122,\r\n TempUsers = 123,\r\n TimeZone = 124,\r\n Timeline = 125,\r\n TrainingExpiration = 126,\r\n Tutoring = 127,\r\n TutoringHours = 128,\r\n Undergraduate = 129,\r\n UsageForm = 130,\r\n UsageTutoring = 131,\r\n UserBudgets = 132,\r\n UserCanExpire = 133,\r\n UserGroupCoordRole = 134,\r\n UserGroupSelfAssign = 135,\r\n UserGroupsAssignment = 136,\r\n UserPermission = 137,\r\n WS_Billing = 138,\r\n WeeklyCalendar = 139,\r\n WindowsAuthentication = 140,\r\n Workflows = 141,\r\n ShowAvailableNotBookableAssetsOnDashboard = 142,\r\n EnableWorkflowExperiments = 143,\r\n MultipleInstruments_AddRemoveOnEditReservation = 144,\r\n PriceSheetPricing = 145,\r\n PriceSheetFeeTypes = 146,\r\n BudgetExperiments = 147,\r\n Location = 148,\r\n ServiceGroupRegistration = 149,\r\n ReportsGenerator = 150,\r\n AssetDecommission = 151,\r\n //ShowBudgetsScreenFromUsers = 152,\r\n CloningInstrumentsAssets = 153,\r\n InstituteProjects = 154,\r\n OfflineServiceBookedBy = 155,\r\n TermsOfUseAgreement = 156,\r\n TrainingLevelPermissions = 157,\r\n TrainingPrograms = 158,\r\n SourceAndLabelSampleProccessing = 159,\r\n LocalAppRemoteControl = 160,\r\n LoanDesk = 161,\r\n VisualLogBook = 162,\r\n BiWeeklyWorkingHoursPeriods = 163,\r\n ReservationsImport = 164,\r\n ServiceRequestProjectsInReservations = 165,\r\n AllowSGAToControlSingleEquipment = 166,\r\n MultipleCustomForms = 167,\r\n UserInquiry = 168,\r\n ProjectJoinRequests = 169,\r\n DTUStudentCardIntergration = 170,\r\n AssetModels = 171,\r\n PriceSheetUserGroups = 172,\r\n PeopleSoftBilling = 173,\r\n DisableBillingEvents = 174,\r\n InstrumetServiceProjectCode = 175,\r\n RaspberryPi = 176,\r\n SamplesAutomation = 177,\r\n}\r\n","import {\r\n capitalize,\r\n Tooltip as MuiTooltip,\r\n TooltipProps as MuiTooltipProps,\r\n} from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { TFunctionResult } from 'i18next';\r\nimport * as React from 'react';\r\nexport type ThemeColor = 'dark' | 'light';\r\nexport interface TooltipsProps extends Omit {\r\n themeColor?: ThemeColor;\r\n /**\r\n * Tooltip title. redefined here to include TFunctionResult\r\n */\r\n title: React.ReactNode | TFunctionResult;\r\n headTitle?: React.ReactNode | TFunctionResult;\r\n}\r\n\r\nexport function Tooltip({\r\n children,\r\n themeColor = 'dark',\r\n title,\r\n headTitle,\r\n arrow = true,\r\n interactive,\r\n ...props\r\n}: TooltipsProps) {\r\n return (\r\n \r\n {!!headTitle && (\r\n \r\n {headTitle}\r\n \r\n )}\r\n \r\n {title}\r\n \r\n \r\n ) : (\r\n ''\r\n )\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * auto generated interface for Bookit.Data.AvailabilityTypes\r\n *\r\n */\r\n\r\nexport enum AvailabilityTypes {\r\n NotAvailable = 0,\r\n AvailableNotBookable = 1,\r\n FreelyBookable = 2,\r\n //BookableWApproval = 3,\r\n ServiceRelated = 4,\r\n ServiceGroup = 5,\r\n SuperGroup = 6,\r\n //FreelyBookableBillable = 7,\r\n //ApprovalRequiredBillable = 8,\r\n RequestRelated = 9,\r\n TrainingProgram = 10,\r\n LoanableEquipment = 11,\r\n LectureRoom = 12,\r\n}\r\nexport type AvailabilityTypesUnion = keyof typeof AvailabilityTypes;\r\nexport const AvailabilityTypesUnionArray: Array = [\r\n 'NotAvailable',\r\n 'AvailableNotBookable',\r\n 'FreelyBookable',\r\n //'BookableWApproval',\r\n 'ServiceRelated',\r\n 'ServiceGroup',\r\n 'SuperGroup',\r\n //'FreelyBookableBillable',\r\n //'ApprovalRequiredBillable',\r\n 'RequestRelated',\r\n 'TrainingProgram',\r\n 'LoanableEquipment',\r\n 'LectureRoom',\r\n];\r\n","export enum AssetAttributes {\r\n NotActive,\r\n AssetAccessories,\r\n AssetCat,\r\n AssetCatGroup,\r\n AccountingId,\r\n NickName,\r\n OtherNames,\r\n Type2Counter,\r\n Brand,\r\n Model,\r\n ModelID,\r\n ModelNumber,\r\n Building,\r\n Room,\r\n Experts,\r\n Contacts,\r\n Public,\r\n Raac,\r\n MainSpecRange,\r\n FunctionalCharacteristics,\r\n ElectricalSpecs,\r\n WebLink,\r\n Tags,\r\n Suppliers,\r\n BrandCode,\r\n InternalCode,\r\n POnumber,\r\n Campus,\r\n LifeDate,\r\n ExtraText0,\r\n ExtraText1,\r\n ExtraText2,\r\n ExtraText3,\r\n ExtraText4,\r\n ExtraText5,\r\n ExtraText6,\r\n ExtraText7,\r\n ExtraText8,\r\n ExtraText9,\r\n ExtraText10,\r\n ExtraText11,\r\n ExtraText12,\r\n ExtraText13,\r\n ExtraText14,\r\n ExtraText15,\r\n ExtraInt0,\r\n ExtraInt1,\r\n ExtraInt2,\r\n ExtraInt3,\r\n ExtraInt4,\r\n ExtraDec0,\r\n ExtraDec1,\r\n ExtraDec2,\r\n ExtraDec3,\r\n ExtraDec4,\r\n ExtraBool0,\r\n ExtraBool1,\r\n ExtraBool2,\r\n ExtraBool3,\r\n ExtraBool4,\r\n ExtraUrl0,\r\n ExtraUrl1,\r\n ExtraUrl2,\r\n ExtraUrl3,\r\n ExtraUrl4,\r\n ExtraRichText0,\r\n ExtraRichText1,\r\n ExtraRichText2,\r\n ExtraRichText3,\r\n ExtraRichText4,\r\n ExtraDDL0,\r\n ExtraDDL1,\r\n ExtraDDL2,\r\n ExtraDDL3,\r\n ExtraDDL4,\r\n ExtraDDL5,\r\n ExtraDDL6,\r\n ExtraDDL7,\r\n ExtraDDL8,\r\n ExtraDDL9,\r\n ExtraDDL10,\r\n ExtraDDL11,\r\n ExtraDDL12,\r\n ExtraDDL13,\r\n ExtraDDL14,\r\n ExtraDDL15,\r\n ExtraDate0,\r\n ExtraDate1,\r\n ExtraDate2,\r\n ExtraDate3,\r\n ExtraDate4,\r\n ExtraDate5,\r\n ExtraDate6,\r\n ExtraDate7,\r\n ExtraDate8,\r\n ExtraDate9,\r\n UnderOriginalWarranty,\r\n WarrantyEndDate,\r\n ServiceContract,\r\n GasSource,\r\n ImageName,\r\n Description,\r\n ShortDescription,\r\n // not present on asset search results\r\n LocationsList,\r\n // not present on asset search results\r\n Range,\r\n ExportLicense,\r\n ForceTutoring,\r\n SubLocationsList,\r\n Details,\r\n Classification,\r\n Location,\r\n SectionContacts,\r\n Identifiers,\r\n AdditionalInfo,\r\n SectionLabel7,\r\n SectionLabel8,\r\n SectionLabel9,\r\n SectionLabel10,\r\n Status,\r\n ServiceGroup,\r\n Division,\r\n AvailabilityType,\r\n DOI,\r\n}\r\n","export enum ServiceType {\r\n Online = 1,\r\n Offline = 2,\r\n Sample = 3,\r\n Workflow = 4,\r\n}\r\n\r\nexport type ServiceTypeUnion = keyof typeof ServiceType;\r\n","import {\r\n BookitTypographyVariant,\r\n FontStyleOptions,\r\n TypographyStyleOptions,\r\n Variant,\r\n} from '@material-ui/core/styles/createTypography';\r\nimport { CSSProperties } from '@material-ui/styles';\r\nexport const h1: CSSProperties = {\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '40px',\r\n fontStyle: 'normal',\r\n fontWeight: 700,\r\n lineHeight: '141%',\r\n letterSpacing: '-0.4px' /* 56.4px */,\r\n};\r\nexport const h2: CSSProperties = {\r\n //styleName: Bkt/Header 2;\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '32px',\r\n fontStyle: 'normal',\r\n fontWeight: 700,\r\n lineHeight: '146%', ///* 46.72px */\r\n letterSpacing: '-0.4px',\r\n};\r\nexport const h3: CSSProperties = {\r\n //styleName: Bkt/Header 3;\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '24px',\r\n fontStyle: 'normal',\r\n fontWeight: 700,\r\n lineHeight: '160%' /* 38.4px */,\r\n letterSpacing: '-0.2px',\r\n};\r\nexport const h4: CSSProperties = {\r\n //styleName: Bkt/Header 4:\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '20px',\r\n fontStyle: 'normal',\r\n fontWeight: 700,\r\n lineHeight: '160%' /* 32px */,\r\n letterSpacing: '-0.1px',\r\n};\r\nexport const subtitle1: CSSProperties = {\r\n /* Bkt/Subtitle 1 */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '24px',\r\n fontStyle: 'normal',\r\n lineHeight: '160%' /* 38.4px */,\r\n fontWeight: 400,\r\n};\r\nexport const subtitle2: CSSProperties = {\r\n /* Bkt/Subtitle 2 */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '20px',\r\n fontStyle: 'normal',\r\n lineHeight: '160%' /* 32px */,\r\n fontWeight: 400,\r\n};\r\nexport const boldL: CSSProperties = {\r\n /* Bkt/Bold L */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '18px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 25.38px */,\r\n fontWeight: 700,\r\n letterSpacing: '0px',\r\n};\r\nexport const boldM: CSSProperties = {\r\n /* Bkt/Bold M */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '16px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 25.38px */,\r\n fontWeight: 700,\r\n letterSpacing: '0px',\r\n};\r\nexport const boldS: CSSProperties = {\r\n /* Bkt/Bold S */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '14px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 19.74px */,\r\n fontWeight: 700,\r\n letterSpacing: '0.1px',\r\n};\r\nexport const bodyL: CSSProperties = {\r\n /* Bkt/Body L */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '18px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 22.56px */,\r\n fontWeight: 400,\r\n letterSpacing: '0px',\r\n};\r\nexport const bodyM: CSSProperties = {\r\n /* Bkt/Body M */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '16px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 22.56px */,\r\n fontWeight: 400,\r\n letterSpacing: '0px',\r\n};\r\nexport const bodyS: CSSProperties = {\r\n /* Bkt/Body S */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '14px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 19.74px */,\r\n fontWeight: 400,\r\n letterSpacing: '0.1px',\r\n};\r\n\r\nexport const captionBold: CSSProperties = {\r\n /* Bkt/Caption Bold */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '12px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 16.92px */,\r\n fontWeight: 700,\r\n letterSpacing: '0.2px',\r\n};\r\nexport const captionRegular: CSSProperties = {\r\n /* Bkt/Caption */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '12px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 16.92px */,\r\n fontWeight: 400,\r\n letterSpacing: '0.2px',\r\n};\r\nexport const uppercase: CSSProperties = {\r\n /* Bkt/UPPERCASE */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '12px',\r\n fontStyle: 'normal',\r\n lineHeight: '160%' /* 19.2px */,\r\n fontWeight: 400,\r\n letterSpacing: '0.1px',\r\n textTransform: 'uppercase',\r\n};\r\nexport const tipsBold: CSSProperties = {\r\n /* Bkt/Tips Bold */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '10px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 19.2px */,\r\n fontWeight: 700,\r\n letterSpacing: '0.2px',\r\n};\r\nexport const tipsRegular: CSSProperties = {\r\n /* Bkt/Tips Regular */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '10px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 19.2px */,\r\n fontWeight: 400,\r\n letterSpacing: '0.2px',\r\n};\r\n\r\nexport const inputLabelM: CSSProperties = {\r\n /* Components Styles/Input Label - M */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '16px',\r\n fontStyle: 'normal',\r\n lineHeight: '20px' /* 125% */,\r\n fontWeight: 400,\r\n letterSpacing: '0px',\r\n};\r\nexport const inputLabelXS: CSSProperties = {\r\n /* Components Styles/Input Label - XS */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '12px',\r\n fontStyle: 'normal',\r\n lineHeight: '16px' /* 133.333% */,\r\n fontWeight: 400,\r\n letterSpacing: '0px',\r\n};\r\nexport const inputValueM: CSSProperties = {\r\n /* Components Styles/Input - Value M */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '16px',\r\n fontStyle: 'normal',\r\n lineHeight: '20px' /* 125% */,\r\n fontWeight: 400,\r\n letterSpacing: '0.2px',\r\n};\r\nexport const inputValueS: CSSProperties = {\r\n /* Components Styles/Input - Value S */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '14px',\r\n fontStyle: 'normal',\r\n lineHeight: '20px' /* 142.857% */,\r\n fontWeight: 400,\r\n letterSpacing: '0.2px',\r\n};\r\nexport const buttonM: CSSProperties = {\r\n /* Components Styles/Button - M */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '16px',\r\n fontStyle: 'normal',\r\n lineHeight: '20px' /* 125% */,\r\n fontWeight: 600,\r\n letterSpacing: '0.2px',\r\n};\r\nexport const buttonS: CSSProperties = {\r\n /* Components Styles/Button - S */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '14px',\r\n fontStyle: 'normal',\r\n lineHeight: '20px' /* 142.857% */,\r\n fontWeight: 600,\r\n letterSpacing: '0.2px',\r\n};\r\n\r\nexport const bookitTypography: BookitTypographyOptions = {\r\n h1: h1,\r\n h2: h2,\r\n h3: h3,\r\n h4: h4,\r\n subtitle1: subtitle1,\r\n subtitle2: subtitle2,\r\n boldL: boldL,\r\n boldM: boldM,\r\n boldS: boldS,\r\n bodyL: bodyL,\r\n bodyM: bodyM,\r\n bodyS: bodyS,\r\n captionBold: captionBold,\r\n captionRegular: captionRegular,\r\n uppercase: uppercase,\r\n tipsBold: tipsBold,\r\n tipsRegular: tipsRegular,\r\n inputLabelM: inputLabelM,\r\n inputLabelXS: inputLabelXS,\r\n inputValueM: inputValueM,\r\n inputValueS: inputValueS,\r\n buttonM: buttonM,\r\n buttonS: buttonS,\r\n};\r\n\r\nexport const defaultVariantMapping: Partial> = {\r\n h1: 'h1',\r\n h2: 'h2',\r\n h3: 'h3',\r\n h4: 'h4',\r\n h5: 'h5',\r\n h6: 'h6',\r\n subtitle1: 'h6',\r\n subtitle2: 'h6',\r\n body1: 'p',\r\n body2: 'p',\r\n button: 'label',\r\n caption: 'label',\r\n overline: 'label',\r\n};\r\nexport const typographyComponentMapping: Partial> = {\r\n h1: 'h1',\r\n h2: 'h2',\r\n h3: 'h3',\r\n h4: 'h4',\r\n bodyL: 'p',\r\n bodyM: 'p',\r\n bodyS: 'p',\r\n boldL: 'p',\r\n boldM: 'p',\r\n boldS: 'p',\r\n buttonM: 'label',\r\n buttonS: 'label',\r\n captionRegular: 'label',\r\n captionBold: 'label',\r\n inputLabelM: 'label',\r\n inputLabelXS: 'label',\r\n inputValueM: 'span',\r\n inputValueS: 'span',\r\n subtitle1: 'p',\r\n subtitle2: 'p',\r\n tipsBold: 'label',\r\n tipsRegular: 'label',\r\n uppercase: 'p',\r\n};\r\nexport const typographyNameMapping: Partial> = {\r\n h1: 'Header 1',\r\n h2: 'Header 2',\r\n h3: 'Header 3',\r\n h4: 'Header 4',\r\n bodyL: 'Body L',\r\n bodyM: 'Body M',\r\n bodyS: 'Body S',\r\n boldL: 'Bold L',\r\n boldM: 'Bold M',\r\n boldS: 'Bold S',\r\n buttonM: 'Button M',\r\n buttonS: 'Button S',\r\n captionRegular: 'Caption Regular',\r\n captionBold: 'Caption Bold',\r\n inputLabelM: 'Input Label M',\r\n inputLabelXS: 'Input Label XS',\r\n inputValueM: 'Input Value M',\r\n inputValueS: 'Input Value S',\r\n subtitle1: 'Subtitle 1',\r\n subtitle2: 'Subtitle 2',\r\n tipsBold: 'Tips Bold',\r\n tipsRegular: 'Tips Regular',\r\n uppercase: 'UPPERCASE',\r\n};\r\n\r\nexport interface TypographyOptionMeta {\r\n Name: string;\r\n variant: BookitTypographyVariant;\r\n style: CSSProperties;\r\n}\r\nexport const getTypographyMeta = (): TypographyOptionMeta[] => {\r\n const data: TypographyOptionMeta[] = Object.entries(bookitTypography).map(\r\n ent => {\r\n return {\r\n Name: typographyNameMapping[ent[0]] as string,\r\n style: ent[1] as CSSProperties,\r\n variant: ent[0] as BookitTypographyVariant,\r\n };\r\n },\r\n );\r\n return data;\r\n};\r\nexport interface BookitTypographyOptions\r\n extends Partial<\r\n Record & FontStyleOptions\r\n > {}\r\n","import {\r\n useInjectReducer as useReducer,\r\n useInjectSaga as useSaga,\r\n} from 'redux-injectors';\r\nimport {\r\n InjectReducerParams,\r\n InjectSagaParams,\r\n RootStateKeyType,\r\n} from './types/injector-typings';\r\n\r\n/* Wrap redux-injectors with stricter types */\r\n\r\nexport function useInjectReducer(\r\n params: InjectReducerParams,\r\n) {\r\n return useReducer(params);\r\n}\r\n\r\nexport function useInjectSaga(params: InjectSagaParams) {\r\n return useSaga(params);\r\n}\r\n","import { Typography, TypographyProps } from '@material-ui/core';\r\nimport { BookitTypographyVariant } from '@material-ui/core/styles/createTypography';\r\nimport { capitalize } from 'lodash';\r\nimport * as React from 'react';\r\nimport { typographyComponentMapping } from 'styles/typography/bookitTypography';\r\nimport clsx from 'clsx';\r\n\r\nexport interface BasicTypographyProps extends Omit {\r\n variant?: BookitTypographyVariant;\r\n component?: React.ElementType;\r\n italic?: boolean;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\nexport const BasicTypography = (props: BasicTypographyProps) => {\r\n const {\r\n children,\r\n variant = 'bodyM',\r\n italic,\r\n component,\r\n color,\r\n style,\r\n className,\r\n ...other\r\n } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\nexport default BasicTypography;\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { EntityType, INamedEntity } from 'types/common';\r\nimport {\r\n Condition,\r\n escapeODataValue,\r\n ODataFilterBuilder,\r\n} from 'api/odata/ODataFilter';\r\nimport { translations } from 'locales/translations';\r\nimport { TFunction } from 'i18next';\r\nimport { uniq } from 'lodash';\r\n\r\n/**\r\n * Sets maximum limit of rows to fetch from the server for autocomplete picker.\r\n * Fetching all at once significantly slows down UI on slow connections.\r\n */\r\nconst MAX_TOP = 200;\r\n\r\ninterface loadDataParams {\r\n url: string;\r\n idPropertyName?: keyof TEntity;\r\n DisplaynamePropertyName?: keyof TEntity;\r\n predicates?: (string | Condition)[];\r\n select?: Array;\r\n globalServiceGroupFilter?: Condition[];\r\n expand?: string;\r\n isOptionalServiceGroup?: boolean;\r\n transformModel?: (item: TEntity) => TEntity;\r\n useSearchOrPredicate?: boolean;\r\n queryString?: Record;\r\n maxTop?: number;\r\n}\r\nexport interface autocompleteLoadDataResult {\r\n value: TEntity[];\r\n more: boolean;\r\n limit?: number;\r\n}\r\nexport const getAutoCompleteLoadDataFn = ({\r\n url,\r\n idPropertyName = 'Id',\r\n DisplaynamePropertyName = 'Name',\r\n select = [idPropertyName, DisplaynamePropertyName],\r\n predicates: basePredicates = [],\r\n globalServiceGroupFilter = [],\r\n isOptionalServiceGroup = undefined,\r\n expand = undefined,\r\n transformModel = undefined,\r\n useSearchOrPredicate = undefined,\r\n queryString,\r\n maxTop,\r\n}: loadDataParams) => async (\r\n searchTerm: string | null,\r\n dynamicPredicates?: (string | Condition)[],\r\n) => {\r\n const params = {\r\n ...queryString,\r\n ...{\r\n $orderby: `${String(DisplaynamePropertyName)} asc`,\r\n $select: uniq(select).join(','),\r\n $top: (maxTop ?? MAX_TOP) + 1,\r\n $filter:\r\n useSearchOrPredicate && searchTerm !== null\r\n ? `(${String(DisplaynamePropertyName)} eq ${\r\n \"'\" + escapeODataValue(searchTerm) + \"'\"\r\n })`\r\n : new ODataFilterBuilder({\r\n predicates: dynamicPredicates\r\n ? [...(dynamicPredicates ?? [])]\r\n : basePredicates,\r\n stringColumns: [DisplaynamePropertyName],\r\n stringSearch: searchTerm ?? undefined,\r\n globalServiceGroupFilter: globalServiceGroupFilter,\r\n isOptionalServiceGroup: isOptionalServiceGroup,\r\n }).toString(),\r\n $expand: expand,\r\n },\r\n };\r\n\r\n const response = await httpClient.get(url, params);\r\n const value = !!transformModel\r\n ? (response.value as TEntity[]).map(f => transformModel(f))\r\n : (response.value as TEntity[]);\r\n\r\n return {\r\n value: value.slice(0, maxTop ?? MAX_TOP),\r\n more: value.length > (maxTop ?? MAX_TOP),\r\n limit: maxTop ?? MAX_TOP,\r\n };\r\n};\r\nexport const extractDataFromResponse = (\r\n response: T[] | autocompleteLoadDataResult,\r\n) => {\r\n if (Array.isArray(response)) {\r\n return { value: response, more: false };\r\n } else {\r\n return response as autocompleteLoadDataResult;\r\n }\r\n};\r\n\r\nexport const loadDataAndPrepareOptions = ({\r\n t,\r\n response,\r\n additionalItem,\r\n}: {\r\n t: TFunction;\r\n response: autocompleteLoadDataResult;\r\n additionalItem?: T | null;\r\n}) => {\r\n const value = response.value;\r\n if (additionalItem !== null && additionalItem !== undefined) {\r\n value.unshift(additionalItem);\r\n }\r\n const nonSelectableOptions: NonSelectableOption[] = response.more\r\n ? [\r\n {\r\n disabled: true,\r\n Name: t(translations.ShowingFirstXRecords, {\r\n maxRecordsLimit: MAX_TOP,\r\n }),\r\n },\r\n ]\r\n : [];\r\n return [...value, ...nonSelectableOptions];\r\n};\r\n\r\nexport interface IDisableable {\r\n disabled: boolean;\r\n}\r\nexport interface IRemoveable {\r\n noremoved: boolean;\r\n}\r\nexport interface IInfoOption {\r\n titleInfo?: string;\r\n}\r\nexport interface IColored {\r\n Color?: string;\r\n}\r\n\r\nexport type NonSelectableOption = INamedEntity & IDisableable;\r\nexport type NonRemoveableOption = INamedEntity & IRemoveable;\r\nexport type InfoOption = INamedEntity & IInfoOption;\r\nexport type ColoredOption = INamedEntity &\r\n NonSelectableOption &\r\n NonRemoveableOption &\r\n InfoOption &\r\n IColored;\r\nexport type OptionType =\r\n | T\r\n | NonSelectableOption\r\n | NonRemoveableOption\r\n | InfoOption\r\n | ColoredOption;\r\n","import i18next, { TFunction } from 'i18next';\r\nimport { Entity, INamedEntity } from 'types/common';\r\n\r\nconst isNumber = (x: string | number): x is number => !isNaN(+x);\r\nconst onlyNumbersReducer = (nums: number[], x: string | number): number[] =>\r\n isNumber(x) ? [...nums, x] : nums;\r\nconst onlyStringReducer = (nums: string[], x: string | number): string[] =>\r\n isNumber(x) ? nums : [...nums, x];\r\n\r\ntype Descripted = {\r\n [K in keyof T]: {\r\n readonly id: T[K];\r\n readonly description: string;\r\n };\r\n}[keyof T];\r\n\r\ntype NonFunctional = T extends Function ? never : T;\r\nexport interface EnumEntity extends Entity {\r\n OriginalName: string;\r\n}\r\n/**\r\n * Helper function to map with a TypeScript enum\r\n * This returns an array of numbers (e.g. [0,1,2,...])\r\n * corresponding to the enum, so you can create arrays that the enum can index.\r\n * @param keys TypeScript enum\r\n */\r\nexport const enumKeys = (keys: unknown): number[] =>\r\n Object.keys(keys as string[]).reduce(onlyNumbersReducer, []);\r\n\r\nexport const enumStringKeys = (keys: unknown): string[] =>\r\n Object.keys(keys as string[]).reduce(onlyStringReducer, []);\r\n\r\n/**\r\n * Helper to produce an array of enum descriptors.\r\n * @param enumeration Enumeration object.\r\n * @param separatorRegex Regex that would catch the separator in your enum key.\r\n */\r\nexport function enumToDescriptedArray(\r\n enumeration: T,\r\n): Descripted[] {\r\n return (Object.keys(enumeration) as Array)\r\n .filter(key => isNaN(Number(key)))\r\n .filter(\r\n key =>\r\n typeof enumeration[key] === 'number' ||\r\n typeof enumeration[key] === 'string',\r\n )\r\n .map(key => ({\r\n id: enumeration[key],\r\n description: String(key),\r\n }));\r\n}\r\n\r\n/**\r\n * TFunction may throw an error if called before i18next has been initialized.\r\n * There's really good point to try and use localization before it's been localized but it's used this way in a couple of places already\r\n * @param key localizaiton key\r\n * @param t TFunction\r\n * @returns localized value or null\r\n */\r\nfunction tryGetName(key: string, t?: TFunction): string {\r\n try {\r\n const tFunction = t ?? GetTFunction();\r\n return tFunction?.(key) ?? key;\r\n } catch (error) {\r\n return key;\r\n }\r\n}\r\n/**\r\n * Gets TFunction from i18next instance\r\n * @returns TFunction\r\n */\r\nconst GetTFunction: () => TFunction | undefined = () => {\r\n const i18n = i18next;\r\n if (i18n.isInitialized) {\r\n const defaultNS = 'translation';\r\n return i18n.getFixedT(\r\n null,\r\n i18n.options.ns ?? i18n.options.defaultNS ?? defaultNS,\r\n );\r\n }\r\n return undefined;\r\n};\r\nexport function toEntityEnumArray(\r\n enumeration: T,\r\n t?: TFunction,\r\n prefixKey?: string,\r\n): EnumEntity[] {\r\n return Object.keys(enumeration)\r\n .filter(key => isNaN(Number(key)))\r\n .filter(\r\n key =>\r\n typeof enumeration[key] === 'number' ||\r\n typeof enumeration[key] === 'string',\r\n )\r\n .map(key => {\r\n return {\r\n Id: enumeration[key],\r\n Name: !!prefixKey\r\n ? tryGetName(prefixKey + String(key), t)\r\n : tryGetName(String(key), t),\r\n OriginalName: String(key),\r\n };\r\n });\r\n}\r\nexport function enumToEntityArray(\r\n enumeration: T,\r\n t?: TFunction,\r\n prefixKey?: string,\r\n): Entity[] {\r\n return Object.keys(enumeration)\r\n .filter(key => isNaN(Number(key)))\r\n .filter(\r\n key =>\r\n typeof enumeration[key] === 'number' ||\r\n typeof enumeration[key] === 'string',\r\n )\r\n .map(key => {\r\n return {\r\n Id: enumeration[key],\r\n Name: !!prefixKey\r\n ? tryGetName(prefixKey + String(key), t)\r\n : tryGetName(String(key), t),\r\n };\r\n });\r\n}\r\nexport function GetOptionsFilterFunction(\r\n items: Array,\r\n customSearch?: (value: TItem, search: string) => boolean,\r\n) {\r\n return (searchTerm: string | null) => {\r\n if (searchTerm !== null && searchTerm !== '' && searchTerm !== undefined) {\r\n return items.filter(\r\n f =>\r\n f.Name.toLowerCase().startsWith(searchTerm.toLowerCase()) ||\r\n f.Name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1 ||\r\n (!!customSearch && customSearch(f, searchTerm)),\r\n );\r\n }\r\n return items;\r\n };\r\n}\r\n\r\n/**\r\n * Helper to produce an array of enum values.\r\n * @param enumeration Enumeration object.\r\n */\r\nexport function enumToArray(\r\n enumeration: T,\r\n): NonFunctional[] {\r\n return Object.keys(enumeration)\r\n .filter(key => isNaN(Number(key)))\r\n .map(key => enumeration[key])\r\n .filter(val => typeof val === 'number' || typeof val === 'string');\r\n}\r\n\r\nexport class EnumHelpers {\r\n static getNamesAndValues(e: any) {\r\n return EnumHelpers.getNames(e).map(n => ({ name: n, value: e[n] as T }));\r\n }\r\n\r\n static getNames(e: any) {\r\n return EnumHelpers.getObjValues(e).filter(\r\n v => typeof v === 'string',\r\n ) as string[];\r\n }\r\n\r\n static getValues(e: any) {\r\n return EnumHelpers.getObjValues(e).filter(\r\n v => typeof v === 'number',\r\n ) as T[];\r\n }\r\n\r\n static getSelectList(\r\n e: any,\r\n stringConverter: (arg: U) => string,\r\n ) {\r\n const selectList = new Map();\r\n this.getValues(e).forEach(val =>\r\n selectList.set(val as T, stringConverter((val as unknown) as U)),\r\n );\r\n return selectList;\r\n }\r\n\r\n static getSelectListAsArray(\r\n e: any,\r\n stringConverter: (arg: U) => string,\r\n ) {\r\n return Array.from(this.getSelectList(e, stringConverter), value => ({\r\n value: value[0] as T,\r\n presentation: value[1],\r\n }));\r\n }\r\n\r\n private static getObjValues(e: any): (number | string)[] {\r\n return Object.keys(e).map(k => e[k]);\r\n }\r\n}\r\n","import * as React from 'react';\r\nexport const useEffectOnMount = (effect: React.EffectCallback) => {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n React.useEffect(effect, []);\r\n};\r\nexport const useLayoutEffectOnMount = (effect: React.EffectCallback) => {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n React.useLayoutEffect(effect, []);\r\n};\r\n","import { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { ICustomFormDto } from 'api/odata/generated/entities/ICustomFormDto';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { ITrainingSessionDto } from 'api/odata/generated/entities/ITrainingSessionDto';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { SqlDayOfWeek } from 'api/odata/generated/enums/SqlDayOfWeek';\r\nimport { CheckEntity } from 'app/components/CheckBoxGroup';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { FieldHandlerProps } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { RepetitiveOptions } from 'enums/RepetitiveOptions';\r\nimport { AsyncDataState, Entity } from 'types/common';\r\nimport { IRepetitiveDto } from 'types/IRepetitiveDto';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IReservationAssemblyPartDto } from 'api/odata/generated/entities/IReservationAssemblyPartDto';\r\n\r\n/* --- STATE --- */\r\nexport interface ReservationState {\r\n detailsState: AsyncDataState;\r\n reservationSettingsState?: ReservationSettingsState;\r\n equipmentsSettingsState?: ServiceSettingsState;\r\n confirmAssistedReservations?: boolean;\r\n trainingsData: UserTrainingReservationData | null;\r\n processing: boolean;\r\n valueHandler?: FieldHandlerProps;\r\n requestedValueFor?: keyof ReservationDetailsState;\r\n requestedValue?: any;\r\n equipmentChangeResultState?: ReservationEquipmentsChangeResult;\r\n isChangeCompleted?: boolean;\r\n transferState: TransferState;\r\n creditState: AsyncDataState;\r\n hasCharges?: boolean;\r\n savedOfflineServices: IOtherServices[];\r\n refeshOfflineService?: boolean;\r\n terminationState: TerminationState;\r\n cloneReservation?: boolean;\r\n reservationDtoState?: IReservationDto;\r\n isEdit: boolean;\r\n asyncChangeLoading?: boolean;\r\n submitCredit?: boolean;\r\n ByApprovalErrors?: Array;\r\n refreshWorkOrderLink?: boolean;\r\n}\r\nexport interface ReservationQueryStringParameters {\r\n uid?: string;\r\n id?: string;\r\n selectedIds?: string;\r\n Start?: string;\r\n End?: string;\r\n proj?: string;\r\n tsid?: string;\r\n remarks?: string;\r\n accid?: string;\r\n singleClick?: string;\r\n duration?: string;\r\n ug?: string;\r\n un?: string;\r\n ft?: string;\r\n /**\r\n * Service Request ID\r\n */\r\n srid?: number;\r\n /**\r\n * ServiceRequest row ID\r\n */\r\n srrid?: string;\r\n /**\r\n * Service request sample IDs (comma separated)\r\n */\r\n srsid?: string;\r\n /**\r\n * Service request samples run ID\r\n */\r\n sampleRunId?: string;\r\n Edit?: string;\r\n defaultMulti?: string;\r\n resIdTransferredFrom?: string;\r\n source?: string;\r\n UpdateToNow?: string;\r\n terminated?: string;\r\n Shrink?: string;\r\n resourceChanged?: string;\r\n staffEquipmentId?: string;\r\n staffUser?: string;\r\n}\r\n// Model to Save Reservation - mutch Server Model\r\nexport interface ReservationEquipment {\r\n EquipmentId: number;\r\n EquipmentName: string;\r\n AccServiceIds: number[];\r\n AssemblyId: number | null;\r\n\r\n ReservationId: number | null;\r\n}\r\nexport interface ReservationBudgetModel {\r\n id: number;\r\n text: string;\r\n percent: number | null;\r\n ReservationId: number | null;\r\n}\r\nexport interface CustomFormValueModel {\r\n FieldId: number;\r\n Value?: string;\r\n DisplayValue?: string;\r\n}\r\nexport interface ReservationPartModel {\r\n StarTime: Date | string;\r\n EquipmentId: number;\r\n Id: number;\r\n BudgetId: number | null;\r\n}\r\nexport enum FundingTypes {\r\n Internal = 0,\r\n External = 1,\r\n}\r\nexport enum ReservationStatus {\r\n Approved = 1,\r\n Pending = 2,\r\n Cancelled = 3,\r\n AllStatus = 4,\r\n CancelledByAdmin = 5,\r\n Done = 6,\r\n NotDone = 7,\r\n DoneWOBooking = 8,\r\n ApprovedOnce = 9,\r\n PendingCoord = 10,\r\n Tentative = 11,\r\n Draft = 12,\r\n}\r\nexport type ReservationStatusUnion = keyof typeof ReservationStatus;\r\nexport enum RecurringReservationUpdateOptions {\r\n CurrentReservation = 1,\r\n Following = 2,\r\n All = 3,\r\n}\r\nexport enum ReservationRepeatPeriods {\r\n Daily = 1,\r\n Weekly = 2,\r\n Monthly = 3,\r\n}\r\nexport enum ReservationRepeatMonthlyTypes {\r\n SameDate = 1,\r\n SameWeekDay = 2,\r\n}\r\nexport interface ReservationRepeatModel {\r\n RepeatsEveryNum: number | null;\r\n RepeatsEveryType: ReservationRepeatPeriods | null;\r\n RepeatsOn: SqlDayOfWeek[];\r\n RepeatsBy: ReservationRepeatMonthlyTypes;\r\n RepeatOption: RepetitiveOptions;\r\n RepeatEndTime: Date | string;\r\n Repeat_Period: number | null;\r\n}\r\n\r\nexport interface ReservationModel {\r\n Id: number;\r\n Services: ReservationEquipment[];\r\n StartTime: Date | string;\r\n EndTime: Date | string;\r\n Username: string;\r\n UserGroupId: string;\r\n Collaborators: string[];\r\n BudgetId: number | null;\r\n BudgetExperimentId: number | null;\r\n InstituteProjectId: number | null;\r\n WorkflowBooking: Entity | null;\r\n ExternalCustomerId: number | null;\r\n FundingTypeId: FundingTypes | null;\r\n StaffUser: string | null;\r\n PurchaseOrder: string | null;\r\n Reference: string | null;\r\n Tutoring: boolean;\r\n TrainingSignUp: boolean;\r\n TrainingSessionId: number | null;\r\n Status: ReservationStatus;\r\n AllStartTimes: (Date | string)[];\r\n InsertedAt: Date | string | null;\r\n InsertedBy: string | null;\r\n UpdatedAt: Date | string | null;\r\n UpdatedBy: string | null;\r\n CancelledAt: Date | string | null;\r\n UserRequestedByApproval: boolean;\r\n Remarks: string | null;\r\n TutorName: string | null;\r\n PartialAttendance: boolean;\r\n PartialAttendanceStart: number | null;\r\n PartialAttendanceEnd: number | null;\r\n CustomFormValues: CustomFormValueModel[];\r\n Name: string;\r\n TransferFromId: number | null;\r\n TransferInProgress: boolean;\r\n TransferredTo: string | null;\r\n WaitingTransferApproval: boolean;\r\n Parts: ReservationPartModel[];\r\n RecurringUpdateOption: RecurringReservationUpdateOptions;\r\n BudgetIds: ReservationBudgetModel[];\r\n OfflineServices: OfflineservicesModel[];\r\n Terminated: boolean;\r\n TotalCost: number;\r\n SavedForLater: boolean;\r\n FullDayReservation: boolean;\r\n SampleRunId: number | null;\r\n}\r\nexport interface ReservationInsertModel extends ReservationModel {\r\n Repeat: ReservationRepeatModel | null;\r\n AssignToServiceRequestId: number | null;\r\n AssignToServiceRequestRowIds: number[];\r\n AssignToServiceRequestSampleIds: number[];\r\n}\r\nexport interface ReservationUpdateModel extends ReservationModel {}\r\nexport interface OfflineservicesModel {\r\n ServiceTypeName: string;\r\n Quantity: number;\r\n UnitsName: string;\r\n Remarks: string;\r\n Factor: number;\r\n OfflineServiceTypeId: number;\r\n InventoryBatchId: number | null;\r\n BudgetId: number | null;\r\n BudgetExperimentId: number | null;\r\n UserGroup: string | null;\r\n}\r\n// react side Model\r\n\r\nexport interface IMandatoryEquipmentsDto extends CheckEntity {\r\n Id: number;\r\n ParentName: string;\r\n Name: string;\r\n AssetId: number | null;\r\n AccServices: IEquipmentAccServiceDto[];\r\n AssemblyId: number | null;\r\n HasAssemblyParts: boolean;\r\n HideProjects: boolean;\r\n AllowPartialProjectCharges: boolean;\r\n AllowPartialSingleProjectCharges: boolean;\r\n TrainingSignUpApproval: number;\r\n HideTrainingSession: boolean;\r\n HasAttendance: boolean;\r\n ForceTutoring: boolean;\r\n IsEquipmentTutoring: boolean;\r\n NotAllowReservations: boolean;\r\n AllowOneAccSerOnly: boolean;\r\n AllowReservationCollaborators: number;\r\n ForceFullDayReservations: boolean;\r\n IsAdmin: boolean;\r\n Color: string;\r\n ServiceGroupId: number;\r\n ServiceGroupName: string;\r\n ReservationOfflineServicesEnabled: boolean | null;\r\n RestrictReservationToTimeSlots: boolean;\r\n MinOrderHours: number;\r\n DefaultReservationDuration: number;\r\n DefaultAccServiceId: number | null;\r\n BudgetsTurnedOn: boolean;\r\n Billable: boolean;\r\n OfflineServices: IEquipmentOfflineServiceTypeDto[];\r\n FirstCustomFormId: number | null;\r\n CustomFormId: number | null;\r\n CustomForms: ICustomFormDto[];\r\n LoanTypeId: number;\r\n AllowModification: boolean;\r\n AllowExtendReservation: boolean;\r\n AllowUsersToShortenReservations: boolean;\r\n AllowedToTransfer: boolean;\r\n AllowedToTransferAll: boolean;\r\n EnforceReservationRestrictions: boolean;\r\n LimitlessReservationAllowed: boolean | null;\r\n checked: boolean;\r\n disabled: boolean;\r\n MaxOrderHours: number;\r\n MinOrderGap: number;\r\n RestrictDurationUnitsAmount: number | null;\r\n RestrictDurationUnitType: number | null;\r\n StaffUserSelectionVisible: boolean | null;\r\n StaffUserSelectionRequired: boolean | null;\r\n StaffUserSelection: IUserFilterDto[];\r\n RequireUserGroupCoordApproval: boolean;\r\n DraftReservationsTypeId: number;\r\n}\r\nexport interface IReservationEquipmentDto extends Entity {\r\n Id: number;\r\n Name: string;\r\n AssetId: number | null;\r\n AccServices: IEquipmentAccServiceDto[];\r\n AssemblyId: number | null;\r\n HasAssemblyParts: boolean;\r\n ReservationId?: number;\r\n HideProjects: boolean;\r\n AllowPartialProjectCharges: boolean;\r\n AllowPartialSingleProjectCharges: boolean;\r\n TrainingSignUpApproval: number;\r\n HideTrainingSession: boolean;\r\n HasAttendance: boolean;\r\n ForceTutoring: boolean;\r\n IsEquipmentTutoring: boolean;\r\n NotAllowReservations: boolean;\r\n AllowOneAccSerOnly: boolean;\r\n AllowReservationCollaborators: number;\r\n ForceFullDayReservations: boolean;\r\n BudgetExperimentSettings: boolean;\r\n Color: string;\r\n ServiceGroupId: number;\r\n ServiceGroupName: string;\r\n ReservationOfflineServicesEnabled: boolean | null;\r\n RestrictReservationToTimeSlots: boolean;\r\n MinOrderHours: number;\r\n DefaultReservationDuration: number;\r\n DefaultAccServiceId: number | null;\r\n BudgetsTurnedOn: boolean;\r\n Billable: boolean;\r\n MandatoriesEquipments: IMandatoryEquipmentsDto[];\r\n OptionalsEquipments: IMandatoryEquipmentsDto[];\r\n OfflineServices: IEquipmentOfflineServiceTypeDto[];\r\n FirstCustomFormId: number | null;\r\n CustomFormId: number | null;\r\n CustomForms: ICustomFormDto[];\r\n LoanTypeId: number;\r\n AllowModification: boolean;\r\n AllowExtendReservation: boolean;\r\n AllowUsersToShortenReservations: boolean;\r\n AllowedToTransfer: boolean;\r\n AllowedToTransferAll: boolean;\r\n EnforceReservationRestrictions: boolean;\r\n LimitlessReservationAllowed: boolean | null;\r\n MaxOrderHours: number;\r\n MinOrderGap: number;\r\n RestrictDurationUnitsAmount: number | null;\r\n RestrictDurationUnitType: number | null;\r\n StaffUserSelectionVisible: boolean | null;\r\n StaffUserSelectionRequired: boolean | null;\r\n StaffUserSelection: IUserFilterDto[];\r\n RequireUserGroupCoordApproval: boolean;\r\n DraftReservationsTypeId: number;\r\n}\r\nexport interface IEquipmentOfflineServiceTypeDto extends Entity {\r\n Id: number;\r\n Name: string;\r\n EquipmentId: number;\r\n Mandatory: boolean;\r\n HideProject: boolean;\r\n}\r\n/**\r\n * Represents an entity connected to a budget (e.g. Reservation)\r\n */\r\nexport interface IWithBudget {\r\n Budget: Entity | null; //IBudgetFilterDto | null;\r\n}\r\nexport interface ReservationDetailsState extends IWithBudget {\r\n Id: number;\r\n EquipmentsData: Entity[];\r\n\r\n TrainingSession: ITrainingSessionDto | null;\r\n StaffUser: Entity | null; //IUserFilterDto | null;\r\n BookedBy: Entity | null; //IUserFilterDto | null;\r\n Remarks?: string | null;\r\n StartTime: Date | string;\r\n EndTime: Date | string;\r\n Tutoring: boolean;\r\n Status?: Entity | null;\r\n TrainingSignUp: boolean;\r\n ADGroup?: Entity | null;\r\n DisplayName?: string | null;\r\n InstituteProject: Entity | null;\r\n WorkflowBooking?: Entity | null;\r\n ExternalCustomer?: Entity | null;\r\n FundingType?: Entity | null;\r\n PurchaseOrder?: string | null;\r\n Reference?: string | null;\r\n BudgetExperiment?: Entity | null;\r\n SampleIds: number[];\r\n PartialAttendance: boolean;\r\n PartialAttendanceStart?: number | null;\r\n PartialAttendanceEnd?: number | null;\r\n TransferredTo: Entity | null;\r\n WaitingTransferApproval: boolean;\r\n TransferFromId: number | null;\r\n SampleRunId?: number | null;\r\n AccServices: Entity[]; //IAccServiceDto[];\r\n FormValues: IFormValueDto[];\r\n CollaboratedUsers: Entity[]; //IUserFilterDto[];\r\n OptionalsEquipments: CheckEntity[];\r\n FullDayReservation: boolean;\r\n AssemblyParts?: IReservationAssemblyPartDto[] | null;\r\n}\r\nexport interface ReservationSettingsState {\r\n BaseEquipment: IReservationEquipmentDto | null;\r\n FatherId: number | null;\r\n Repeat_Period: number | null;\r\n TrainingSessionOnly: boolean;\r\n SessionId: number | null;\r\n RecordDate: Date | string | null;\r\n LastUpdateDate: Date | string | null;\r\n Entered: Date | string | null;\r\n Cancelled: Date | string | null;\r\n LastUpdateAdmin: Entity | null;\r\n RepeatEndTime: Date | string | null;\r\n Repeat: boolean;\r\n HasCharges: boolean;\r\n FundingTypeId: number | null;\r\n ParentAssemblyReservationId: number | null;\r\n TopAssemblyReservationId: number | null;\r\n TransferInProgress: boolean;\r\n HasOfflineServices: boolean;\r\n HasTrainingSession: boolean;\r\n NextReservationTime: string | null;\r\n PartReservations: IReservationPartDto[];\r\n AssignToServiceRequestId: number | null;\r\n AssignToServiceRequestRowIds: number[];\r\n AssignToServiceRequestSampleIds: number[];\r\n TutorName?: string | null;\r\n CustomForms: ICustomFormDto[];\r\n MandatoriesEquipments: IMandatoryEquipmentsDto[];\r\n OptionalsEquipments: IMandatoryEquipmentsDto[];\r\n FirstInitEquipments: number[];\r\n OfflineMandatory: IOtherServices[];\r\n OfflineOptional: IOtherServices[];\r\n //localSettings\r\n UserRequestedByApproval: boolean;\r\n RecurringUpdateOption: number | null;\r\n TerminateReservation: boolean;\r\n Owner: boolean;\r\n Ongoing: boolean;\r\n FutureReservation: boolean;\r\n PastReservation: boolean;\r\n IsForceTutoring: boolean;\r\n ForceFullDayReservations: boolean;\r\n StaffMandatoryEquipment: IReservationEquipmentDto | null;\r\n TotalCost?: number;\r\n SaveForLater: boolean;\r\n}\r\nexport interface IReservationDto {\r\n Id: number;\r\n EquipmentsData: IReservationEquipmentDto[];\r\n Budget: IBudgetFilterDto | null; //IBudgetFilterDto | null;\r\n TrainingSession: ITrainingSessionDto | null; //ITrainingSessionDto | null;\r\n StaffUser: IUserFilterDto | null; //IUserFilterDto | null;\r\n BookedBy: IUserFilterDto | null; //IUserFilterDto | null;\r\n Remarks?: string | null;\r\n StartTime: Date | string;\r\n EndTime: Date | string;\r\n Tutoring: boolean;\r\n FullDayReservation: boolean;\r\n TutorName?: string | null;\r\n StatusId: number;\r\n TrainingSignUp: boolean;\r\n ADGroup?: Entity | null;\r\n DisplayName?: string | null;\r\n InstituteProject: Entity | null;\r\n WorkflowBooking?: Entity | null;\r\n ExternalCustomer?: Entity | null;\r\n PurchaseOrder?: string | null;\r\n Reference?: string | null;\r\n BudgetExperiment?: Entity | null;\r\n TransferFromId: number | null;\r\n PartialAttendance: boolean;\r\n PartialAttendanceStart?: number | null;\r\n PartialAttendanceEnd?: number | null;\r\n TransferredTo: Entity | null;\r\n SampleRunId?: number | null;\r\n AccServiceId: number | null;\r\n AccSerIds: string | null;\r\n AccServices: IEquipmentAccServiceDto[]; //IAccServiceDto[];\r\n FormValues: IFormValueDto[];\r\n CollaboratedUsers: IUserFilterDto[]; //IUserFilterDto[];\r\n SampleIds: number[];\r\n PartReservations: IReservationPartDto[];\r\n BaseEquipment: IReservationEquipmentDto | null;\r\n FatherId: number | null;\r\n Repeat_Period: number | null;\r\n TrainingSessionOnly: boolean;\r\n SessionId: number | null;\r\n RecordDate: Date | string | null;\r\n LastUpdateDate: Date | string | null;\r\n Entered: Date | string | null;\r\n Cancelled: Date | string | null;\r\n LastUpdateAdmin: IUserFilterDto | null;\r\n RepeatEndTime: Date | string | null;\r\n Repeat: boolean;\r\n HasCharges: boolean;\r\n\r\n /**\r\n * This property is used to read the funding type from the server (initReservation)\r\n */\r\n FundingTypeId: number | null;\r\n ParentAssemblyReservationId: number | null;\r\n TopAssemblyReservationId: number | null;\r\n WaitingTransferApproval: boolean;\r\n TransferInProgress: boolean;\r\n HasOfflineServices: boolean;\r\n HasTrainingSession: boolean;\r\n NextReservationTime: string | null;\r\n AssignToServiceRequestId: number | null;\r\n AssignToServiceRequestRowIds: number[];\r\n AssignToServiceRequestSampleIds: number[];\r\n CustomForms: ICustomFormDto[];\r\n MandatoriesEquipments: IMandatoryEquipmentsDto[];\r\n OptionalsEquipments: IMandatoryEquipmentsDto[];\r\n TerminateReservation: boolean;\r\n FirstInitEquipments: number[];\r\n OfflineMandatory: IOtherServices[];\r\n IsForceTutoring: boolean;\r\n ForceFullDayReservations: boolean;\r\n ForceReservationSettingsState: boolean;\r\n IsFuture: boolean;\r\n IsPast: boolean;\r\n IsOngoing: boolean;\r\n StaffMandatoryEquipment: IReservationEquipmentDto | null;\r\n AssemblyParts: IReservationAssemblyPartDto[] | null;\r\n}\r\nexport interface IReservationPartDto {\r\n Id: number;\r\n Equipment: IReservationEquipmentDto;\r\n BudgetID: number | null;\r\n BudgetName: string | null;\r\n StartTime: Date | string;\r\n ParentAssemblyReservationId: number | null;\r\n TopAssemblyReservationId: number | null;\r\n AccServiceId: number | null;\r\n AccSerIds: string | null;\r\n Repeat_Period: number | null;\r\n}\r\nexport interface ReservationDetailsResponseModel extends IResponseType {\r\n Id: number | null;\r\n IsValid: boolean;\r\n model: IReservationDto;\r\n insertedModel: ReservationInsertModel;\r\n warnOnTrainingSession: boolean;\r\n ReservationIds: number[];\r\n FirstEquipmentId: number;\r\n userTrainingsApprovalData: UserTrainingReservationData | null;\r\n EquipmentChangeResult: ReservationEquipmentsChangeResult | null;\r\n credit: number | null;\r\n balance: number | null;\r\n /**\r\n * Permission validation errors that can be overcome through admin approval\r\n */\r\n ByApprovalErrors?: Array;\r\n}\r\nexport interface ReservationGlobalState {\r\n details: ReservationDetailsState;\r\n settings: ReservationSettingsState;\r\n customFormFiles: IFormFileValue[];\r\n RepetitiveOptions: IRepetitiveDto | null;\r\n offlineServices: IOtherServices[];\r\n}\r\nexport interface ServiceSettingsState {\r\n HasHideProjects: boolean;\r\n HasConflictProjects: boolean;\r\n HasMultipleProjects: boolean;\r\n HasPartialSingleProject: boolean;\r\n TrainingSignUpApproval?: number;\r\n HideTrainingSession: boolean;\r\n HasAttendance: boolean;\r\n ForceTutoring: boolean;\r\n ForceFullDayReservations: boolean;\r\n IsEquipmentTutoring: boolean;\r\n NotAllowReservations: boolean;\r\n AllowOneAccSerOnly: boolean;\r\n AllowReservationCollaborators: boolean;\r\n IsAllAdmin: boolean;\r\n AllOffServicesAllowed: boolean | null;\r\n\r\n RestrictReservationToTimeSlots: boolean;\r\n MinOrderHours: number;\r\n DefaultReservationDuration: number;\r\n DefaultAccServiceId: number | null;\r\n BudgetsTurnedOn: boolean;\r\n Billable: boolean;\r\n CustomForms: ICustomFormDto[];\r\n IsLoanDesc: boolean;\r\n AllowModification: boolean;\r\n AllowExtendReservation: boolean;\r\n AllowUsersToShortenReservations: boolean;\r\n AllowedToTransfer: boolean;\r\n AllowedToTransferAll: boolean;\r\n StartSlots: Date | string | null;\r\n EndSlots: Date | string | null;\r\n BudgetVisible: boolean;\r\n OfflineServicesVisible: boolean;\r\n Groups: number[];\r\n HasAccServices: boolean;\r\n MaxOrderHours: number;\r\n MinOrderGap: number;\r\n RestrictDurationUnitsAmount: number | null;\r\n RestrictDurationUnitType: number | null;\r\n StaffUserVisibleAllways: boolean;\r\n StaffUserVisibleOnPending: boolean;\r\n StaffUserRequiredAlwais: boolean;\r\n StaffUserRequiredOnPending: boolean;\r\n StaffUserSelection: IUserFilterDto[];\r\n RequireUserGroupCoordApproval: boolean;\r\n DraftForAll: boolean;\r\n DraftApprovalRequred: boolean;\r\n DraftSaveForLater: boolean;\r\n budgetExperimentVisible: boolean;\r\n EnforceReservationRestrictions: boolean;\r\n LimitlessReservationAllowed: boolean;\r\n OfflineServiceTypes: IEquipmentOfflineServiceTypeDto[];\r\n}\r\nexport interface EquipmentsChangeStateParameters {\r\n Equipments: number[];\r\n AccServices: number[];\r\n ReservationId: number | null;\r\n Start: Date | string;\r\n End: Date | string;\r\n BookedBy: string | null;\r\n ADGroup: string | null;\r\n Tutoring: boolean;\r\n FullDayReservation: boolean;\r\n Status: number;\r\n TrainingSignUp: boolean;\r\n FundingTypeId: number;\r\n TrainingSessionId: number | null;\r\n BudgetId: number | null;\r\n Remarks: string | null;\r\n CheckStatus: boolean;\r\n CheckSession: boolean;\r\n}\r\nexport interface EquipmentSlotParameters {\r\n EquipmentId: number;\r\n Start: Date | string;\r\n End: Date | string;\r\n}\r\n\r\nexport interface ReservationEquipmentsChangeResult {\r\n CustomForms?: CustomFormsResult;\r\n ErrorMessages: string[];\r\n WarningMessages: string[];\r\n DefaultBudget: IBudgetFilterDto | null;\r\n StatusChange: StatusChangeResult | null;\r\n TrainingSessionData: TrainingSessionResult | null;\r\n}\r\nexport interface ReservationValidationResult {\r\n ErrorMessages: string[];\r\n WarningMessages: string[];\r\n PermissionErrors: string[];\r\n PrerequisiteTrainings?: PrerequisitsResult;\r\n}\r\nexport interface AsyncEquipmentsChangeResult {\r\n StartSlots: Date | string | null;\r\n EndSlots: Date | string | null;\r\n}\r\nexport interface StatusChangeResult {\r\n Status: number;\r\n Tutoring: boolean;\r\n IsForceTutoring: boolean;\r\n ForceFullDayReservations: boolean;\r\n FullDayReservation: boolean;\r\n}\r\nexport interface TrainingSessionResult {\r\n TrainingSessionId: number | null;\r\n Start: Date | string;\r\n End: Date | string;\r\n HasTrainingSession: boolean;\r\n StaffUser: string | null;\r\n}\r\nexport interface PrerequisitsResult {\r\n PrerequisiteTrainings: Entity[];\r\n ErrorMessage: string;\r\n IsValid: boolean;\r\n}\r\nexport interface CustomFormsResult {\r\n CustomForms: ICustomFormDto[];\r\n ErrorMessages: string[];\r\n IsValid: boolean;\r\n}\r\nexport interface UserTrainingEquipments {\r\n ReservationId: number | null;\r\n EquipmentId: number;\r\n EquipmentName: string;\r\n TrainingRecordId: number | null;\r\n RequiresAdminApproval: boolean;\r\n NotShowPopup: boolean;\r\n}\r\nexport interface UserTrainingReservationData {\r\n UserName: string;\r\n StartTime: Date | string;\r\n EndTime: Date | string;\r\n Equipments: UserTrainingEquipments[];\r\n FatherId: number | null;\r\n ReservationId: number | null;\r\n Tutoring: boolean;\r\n}\r\nexport interface HasUsageEndRresult {\r\n HasUsage: boolean;\r\n OfflineServiceTypeIds: number[];\r\n}\r\nexport interface TransferToReservation {\r\n User: Entity;\r\n ReservtionId: number;\r\n}\r\nexport interface TransferState {\r\n User: Entity | null;\r\n ReservtionId?: number;\r\n WaitingTransferApproval?: boolean;\r\n transferProcessing?: boolean;\r\n transferStepCompleted?: boolean;\r\n}\r\nexport interface TerminationState {\r\n terminatProcessing?: boolean;\r\n terminateCompleted?: boolean;\r\n}\r\nexport const getSingleReservationStatus = (val: number): Entity => {\r\n return enumToEntityArray(ReservationStatus).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\nexport type createReservation_Success_Action = PayloadAction<\r\n {\r\n hasErrors: boolean;\r\n reservationIds: number[];\r\n insertModel?: ReservationInsertModel;\r\n } & Pick\r\n>;\r\nexport interface PricingState {\r\n credit: number;\r\n balance: number | null;\r\n}\r\n","import { useState, useMemo, SetStateAction } from 'react';\r\n\r\nexport type AsyncSetState = (\r\n nextState: SetStateAction | Promise>,\r\n cancelToken?: { mounted: boolean },\r\n) => void;\r\n\r\nexport type AsyncExtendState = (\r\n partialState:\r\n | SetStateAction>\r\n | Promise>>,\r\n) => void;\r\n\r\n/**\r\n * A hook similar to React's `useState` which allows you to also pass promises which resolve to the next state.\r\n *\r\n * Also returns an extra method which extends the current state, synchronously and/or asynchronously.\r\n * For the current state to be extended, it must first be a non-null value.\r\n *\r\n * Example:\r\n * ```ts\r\n * interface State {\r\n * foo: string\r\n * bar: string\r\n * }\r\n *\r\n * const [ state, setState, extendState ] = useAsyncExtendedState({\r\n * foo: 'foo',\r\n * bar: 'bar'\r\n * })\r\n *\r\n * // This works as usual.\r\n * setState({ foo: 'Hello', bar: 'World!' })\r\n * setState(state => ({ foo: 'Hello', bar: 'World!' }))\r\n *\r\n * // This also works.\r\n * const fetchState = () => API.client.get('data').then(response => {\r\n * return response.data\r\n *\r\n * // or return (state: State) => {\r\n * // return response.data\r\n * // }\r\n * })\r\n *\r\n * // The state will eventually be set to the asynchronously resolved value.\r\n * setState(fetchState())\r\n *\r\n * // Or extend the state immediately.\r\n * extendState({ foo: 'Hello' })\r\n * extendState(state => ({ bar: 'World!' }))\r\n *\r\n * // Or extend the state asynchronously.\r\n * const fetchPartialState = () => API.client.get>('data').then(response => {\r\n * return response.data\r\n *\r\n * // or return (state: State) => {\r\n * // return response.data\r\n * // }\r\n * })\r\n *\r\n * // The state will eventually be extended by the asynchronously resolved value.\r\n * extendState(fetchPartialState())\r\n * ```\r\n */\r\nexport const useAsyncExtendedState = (\r\n initialState: State,\r\n): [State, AsyncSetState, AsyncExtendState] => {\r\n const [state, setState] = useState(initialState);\r\n\r\n const asyncSetState: AsyncSetState = useMemo(\r\n () => async (nextState, cancelToken) => {\r\n const initialNextState = nextState;\r\n\r\n try {\r\n if (nextState instanceof Promise) {\r\n nextState = await nextState;\r\n\r\n if (nextState === initialNextState) {\r\n // there was an error but it was caught by something else - i.e., nextState.catch()\r\n throw new Error(`Uncatchable error.`);\r\n }\r\n }\r\n if (cancelToken && !cancelToken.mounted) return;\r\n\r\n setState(state => {\r\n if (typeof nextState === `function`) {\r\n nextState = (nextState as (state: State) => State)(state);\r\n }\r\n\r\n return nextState as State;\r\n });\r\n } catch (error) {}\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n\r\n const asyncExtendState: AsyncExtendState = useMemo(\r\n () => async partialState => {\r\n const initialExtendState = partialState;\r\n\r\n try {\r\n if (partialState instanceof Promise) {\r\n partialState = await partialState;\r\n\r\n if (partialState === initialExtendState) {\r\n // there was an error but it was caught by something else - i.e., partialState.catch()\r\n throw new Error(`Uncatchable error.`);\r\n }\r\n }\r\n\r\n setState(state => {\r\n if (typeof partialState === `function`) {\r\n partialState = (partialState as (state: State) => Partial)(\r\n state,\r\n );\r\n }\r\n\r\n return { ...state, ...partialState } as State;\r\n });\r\n } catch (err) {}\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n\r\n return [state, asyncSetState, asyncExtendState];\r\n};\r\n","/**\r\n * Formats string similar to .net string.Format\r\n * @param s format string\r\n * @param params interpolated values\r\n */\r\nexport function stringFormat(s, ...args: any) {\r\n return s.replace(/{(\\d+)}/g, function (match, number) {\r\n return typeof args[number] != 'undefined' ? args[number] : match;\r\n });\r\n}\r\n\r\n/**\r\n * Removes html tags and leaves only the text\r\n * @param value html text\r\n * @returns plain text without tags\r\n */\r\nexport function removeHtml(value: string) {\r\n return value.replace(/<[^>]+>/g, '');\r\n}\r\n\r\nexport function tryParseWithoutNaN(parse: (value: string) => number) {\r\n return (value: string) => {\r\n const x = parse(value);\r\n if (isNaN(x)) {\r\n return undefined;\r\n } else {\r\n return x;\r\n }\r\n };\r\n}\r\n\r\nexport function tryParse(\r\n parse: (value: string) => TResult,\r\n): (value: string | null | undefined) => TResult | undefined {\r\n return (value: string | null | undefined) => {\r\n if (value === null) {\r\n return undefined;\r\n }\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n try {\r\n const x = parse(value);\r\n return x;\r\n } catch {\r\n return undefined;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Tries to parse string-like value.\r\n * Usefull to reduce bloat when an integer value needs to be converted to number without resorting to null/undefined checks.\r\n * @param value string/null/undefined\r\n * @returns number if it's int-like or undefined otherwise\r\n */\r\nexport function tryParseInt(value: string | null | undefined) {\r\n return tryParse(tryParseWithoutNaN(parseInt))(value);\r\n}\r\n\r\nexport function tryParseFloat(value: string | null | undefined) {\r\n return tryParse(tryParseWithoutNaN(parseFloat))(value);\r\n}\r\nexport function tryParsePositiveFloat(value: string | null | undefined) {\r\n return tryParse(value => {\r\n const x = parseFloat(value);\r\n if (x > 0) {\r\n return x;\r\n }\r\n })(value);\r\n}\r\n\r\nexport function tryParseBool(value: string | null | undefined) {\r\n return tryParse(value => value.toLowerCase() === 'true')(value);\r\n}\r\nexport function isNumericPositive(value: string): boolean {\r\n let res = /^\\d+$/.test(value);\r\n return res === true;\r\n}\r\n","/**\r\n *\r\n * ExternalLink\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n Link as MuiLink,\r\n LinkBaseProps as MuiLinkProps,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { IPathAndQuery, toQueryString, toRootedURL } from 'utils/url-utils';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nexport interface ExternalLinkProps extends Omit {\r\n href: string | IPathAndQuery;\r\n /**\r\n * Show external URL icon with copy url functionality\r\n */\r\n showIcon?: boolean;\r\n /**\r\n * used in case when need to use URL without adding root of the installation so to avoid toRootedURL() method.\r\n */\r\n useInlineUrl?: boolean;\r\n to?: string | IPathAndQuery;\r\n}\r\n\r\n/**\r\n * External link - opens in a new tab/window\r\n * This should be used for all external links and should be clear that it leads to a resource outside of the system\r\n * @param props\r\n * @returns\r\n */\r\nexport const ExternalLink = React.forwardRef(function ExternalLink(\r\n props: ExternalLinkProps,\r\n ref,\r\n) {\r\n return ;\r\n});\r\n\r\n/**\r\n * Link to a resource inside the larger system but external to the React app\r\n * Renders ;\r\n}\r\n\r\n/**\r\n * Link that can accept forwarded ref prop. Usefull in the \"override component\" in the material ui\r\n * Usage example: (\r\n function LinkBehavior(props, ref) {\r\n const { href, to, useInlineUrl, ...rest } = props;\r\n const history = useHistory();\r\n const classes = useStyles();\r\n const emptyLink = href === '';\r\n const absolutePath =\r\n typeof href === 'string'\r\n ? useInlineUrl === true\r\n ? href\r\n : toRootedURL(href)\r\n : toRootedURL(\r\n (href as IPathAndQuery).path,\r\n (href as IPathAndQuery).search,\r\n );\r\n const localPath =\r\n to !== undefined\r\n ? typeof to === 'string'\r\n ? to\r\n : (to as IPathAndQuery).path +\r\n '?' +\r\n toQueryString((to as IPathAndQuery).search)\r\n : to;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const handleLocalPathClick = React.useCallback(() => {\r\n if (localPath !== undefined) {\r\n history.push('');\r\n history.replace(localPath);\r\n }\r\n }, [history, localPath]);\r\n const handleIconClick = () => {\r\n clipboardWrite(absolutePath).then(() =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'success',\r\n message: `${t(translations.URLCopied)} - ${absolutePath}`,\r\n }),\r\n ),\r\n );\r\n };\r\n if (props.showIcon === true) {\r\n return (\r\n \r\n {\r\n if (to !== undefined) {\r\n handleLocalPathClick();\r\n }\r\n if (!!props.onClick) {\r\n props.onClick(event);\r\n }\r\n }}\r\n {...rest}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n } else {\r\n return (\r\n {\r\n if (to !== undefined) {\r\n handleLocalPathClick();\r\n }\r\n if (!!props.onClick) {\r\n props.onClick(event);\r\n }\r\n }}\r\n {...rest}\r\n />\r\n );\r\n }\r\n },\r\n);\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n externalLinkRoot: {\r\n whiteSpace: 'nowrap',\r\n },\r\n link: { cursor: 'pointer' },\r\n externalLinkIcon: {\r\n display: 'inline',\r\n },\r\n}));\r\n\r\nconst permissionName = 'clipboard-write' as PermissionName;\r\nconst clipboardWriteEnabled = async () => {\r\n const result = await navigator.permissions.query({ name: permissionName });\r\n return result.state === 'granted' || result.state === 'prompt';\r\n};\r\nconst clipboardWrite = async (text: string) => {\r\n const enabled = await clipboardWriteEnabled();\r\n if (enabled) {\r\n const copyResult = await navigator.clipboard.writeText(text);\r\n return copyResult;\r\n }\r\n};\r\n","import { selectAppTimeZone } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport React from 'react';\r\n\r\nexport interface ISystemDate {\r\n newDate: () => Date;\r\n getOffsetDate: (date: Date | string | undefined | null) => Date;\r\n getOffset: (date: Date | undefined) => Date;\r\n systemOffset: number;\r\n currentTimezoneOffser: number;\r\n withoutOffset: (date: Date | string | undefined | null) => Date;\r\n getOffsetDateOrNull: (\r\n date: Date | string | number | object | undefined | null,\r\n ) => Date | null;\r\n}\r\n\r\nexport const useSystemDate = (): ISystemDate => {\r\n const appTimeZone = useSelector(selectAppTimeZone);\r\n const systemOffset = appTimeZone?.TimezoneOffsetMinutes ?? 0;\r\n const currentTimezoneOffser = new Date().getTimezoneOffset();\r\n const getOffset = React.useCallback(\r\n (date: Date | undefined): Date => {\r\n const currentDateOffset = (date || new Date()).getTimezoneOffset();\r\n const appNow = dateUtils.addMinutes(\r\n date || new Date(),\r\n systemOffset + currentDateOffset,\r\n );\r\n return appNow;\r\n },\r\n [systemOffset],\r\n );\r\n const newDate = React.useCallback(() => {\r\n return getOffset(undefined);\r\n }, [getOffset]);\r\n const getOffsetDate = React.useCallback(\r\n (date: Date | string | undefined | null) => {\r\n if (date === null || date === undefined) {\r\n return newDate();\r\n } else {\r\n let parsedDate = dateUtils.dateOrStringToDate(date);\r\n return getOffset(parsedDate);\r\n }\r\n },\r\n [getOffset, newDate],\r\n );\r\n const getOffsetDateOrNull = React.useCallback(\r\n (date: Date | string | number | object | undefined | null) => {\r\n if (date === null || date === undefined) {\r\n return null;\r\n } else {\r\n let localDate = dateUtils.dateFnsUtils.date(date);\r\n if (localDate === null) return null;\r\n let parsedDate = dateUtils.dateOrStringToDate(localDate);\r\n return getOffset(parsedDate);\r\n }\r\n },\r\n [getOffset],\r\n );\r\n const withoutOffset = React.useCallback(\r\n (date: Date | string | undefined | null) => {\r\n const withOffset =\r\n date === null || date === undefined\r\n ? newDate()\r\n : dateUtils.dateOrStringToDate(date);\r\n return dateUtils.addMinutes(\r\n withOffset,\r\n (withOffset.getTimezoneOffset() + systemOffset) * -1,\r\n );\r\n },\r\n [newDate, systemOffset],\r\n );\r\n return {\r\n newDate,\r\n getOffsetDate,\r\n getOffset,\r\n systemOffset,\r\n currentTimezoneOffser,\r\n withoutOffset,\r\n getOffsetDateOrNull,\r\n };\r\n};\r\n","import { Dialog } from '@material-ui/core';\r\nimport { ReactNode } from 'react';\r\nimport clsx from 'clsx';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectIsCoverExpanded } from '../../slice/selectors';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useLayoutSlice } from '../../slice';\r\n\r\nexport interface CoverWrapperProps {\r\n children: ReactNode;\r\n open: boolean;\r\n onClose?: (e: any) => void;\r\n}\r\n\r\nexport const CoverWrapper = ({\r\n children,\r\n open,\r\n onClose,\r\n}: CoverWrapperProps) => {\r\n const isMobile = DetectIsMobile();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const coverExpanded = useSelector(selectIsCoverExpanded);\r\n useEffectOnMount(() => {\r\n dispatch(actions.setIsCoverOpen(open));\r\n });\r\n return (\r\n
e.stopPropagation()}>\r\n {\r\n // console.log('cover backdrop click', e);\r\n // !!onClose && onClose(e);\r\n // }}\r\n >\r\n {children}\r\n \r\n
\r\n );\r\n};\r\n","/**\r\n *\r\n * LinearProgress\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n LinearProgress as MuiLinearProgress,\r\n LinearProgressProps as MuiLinearProgressProps,\r\n} from '@material-ui/core';\r\nimport styled from 'styled-components';\r\n\r\nexport interface LinearProgressProps\r\n extends MuiLinearProgressProps,\r\n AdditionalProps {}\r\ninterface AdditionalProps {\r\n /**\r\n * Show/hide the progress bar preventing layout shift.\r\n */\r\n visible: boolean | undefined;\r\n}\r\n\r\nfunction LinearProgress1({ visible = false, ...props }: LinearProgressProps) {\r\n return ;\r\n}\r\n\r\n/**\r\n * MUI's LinearProgress extension that helps to prevent layout shift when component is added/removed from the tree.\r\n */\r\nexport const LinearProgress = styled(LinearProgress1)`\r\n visibility: ${props => (props.visible === true ? 'visible' : 'hidden')};\r\n`;\r\n","import * as React from 'react';\r\nimport { LinearProgress } from 'app/components/LinearProgress';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Body } from 'app/components/Typography';\r\nimport { TitlePage } from './TitlePage';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { ActionRenderer } from '../PageActions/ActionRender';\r\nimport {\r\n SwitchActions,\r\n SwitchActionsProps,\r\n} from '../PageActions/SwitchActions';\r\nimport { SkeletonIfLoading } from './SkeletonIfLoading';\r\nimport { useTheme } from '@material-ui/core';\r\nimport styled from 'styled-components';\r\nimport clsx from 'clsx';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport interface HeadProps {\r\n closable: boolean | undefined;\r\n useSidePanel: boolean;\r\n closePanel: () => void;\r\n pageName: React.ReactNode;\r\n titlePage: string | undefined;\r\n pageLink: string | undefined;\r\n toPageLink?: string;\r\n titleTooltip: string | undefined;\r\n isMobile: boolean;\r\n disableExpandToggle: boolean | undefined;\r\n expandPanel: () => void;\r\n subTitlePage?: React.ReactNode;\r\n leftTopActions?: ActionRenderer[];\r\n rightTopActions?: ActionRenderer[];\r\n onSubmit?: () => void;\r\n switchState?: SwitchActionsProps;\r\n useSwithActions?: boolean;\r\n showProcessing?: boolean;\r\n loading: boolean;\r\n isCover?: boolean;\r\n rightTopActionsLength?: number;\r\n rightActionsLoading?: boolean;\r\n}\r\nconst TitleRoot = styled('div')(({ theme }) => ({\r\n '&.page-wrapper-title-root': {\r\n paddingTop: '24px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n width: '100%',\r\n gap: '24px',\r\n '.topIcons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-end',\r\n alignItems: 'center',\r\n alignSelf: 'end',\r\n padding: 0,\r\n gap: theme.spacing(1.25),\r\n '.topRightIcons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n position: 'absolute',\r\n padding: 0,\r\n gap: '12px',\r\n top: theme.spacing(2),\r\n },\r\n },\r\n '.titleContainer': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n //justifyContent: 'space-between',\r\n //alignItems: 'flex-end',\r\n alignItems: 'center',\r\n gap: '24px',\r\n padding: '0px 32px',\r\n width: '100%',\r\n alignSelf: 'stretch',\r\n //gap: theme.spacing(4.5),\r\n '.titleSubtitle': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n flex: '1 0 0',\r\n // flexDirection: 'column',\r\n // alignItems: 'flex-start',\r\n // padding: 0,\r\n '& .titleAndDescription': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: '4px',\r\n flex: '1 0 0',\r\n '& .titleContent': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'flex-start',\r\n gap: '8px',\r\n alignSelf: 'stretch',\r\n '& .iconAdjustment': {\r\n display: 'flex',\r\n paddingTop: '2px',\r\n alignItems: 'flex-start',\r\n gap: '10px',\r\n '& .textButton': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: '10px',\r\n },\r\n },\r\n '& .pageDescription': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n },\r\n '& .subPageDescription': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: '4px',\r\n flex: '1 0 0',\r\n },\r\n },\r\n },\r\n },\r\n '.rightControls': {\r\n display: 'flex',\r\n //flexDirection: 'row',\r\n alignItems: 'center',\r\n //padding: 0,\r\n gap: '8px',\r\n },\r\n },\r\n },\r\n}));\r\nexport function Head(props: HeadProps) {\r\n const { t } = useTranslation();\r\n const theme = useTheme();\r\n const {\r\n closable,\r\n useSidePanel,\r\n closePanel,\r\n pageName,\r\n titlePage,\r\n pageLink,\r\n titleTooltip,\r\n isMobile,\r\n disableExpandToggle,\r\n expandPanel,\r\n subTitlePage,\r\n leftTopActions,\r\n rightTopActions,\r\n onSubmit,\r\n showProcessing,\r\n loading,\r\n useSwithActions,\r\n switchState,\r\n isCover,\r\n rightTopActionsLength,\r\n rightActionsLoading,\r\n } = props;\r\n const actionsLength = React.useMemo(() => {\r\n if (rightTopActions !== undefined && rightTopActions.length > 0) {\r\n let res = rightTopActionsLength !== undefined ? rightTopActionsLength : 1;\r\n if (res > rightTopActions.length) {\r\n res = rightTopActions.length;\r\n }\r\n return res;\r\n } else return 0;\r\n }, [rightTopActions, rightTopActionsLength]);\r\n return (\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n {pageName && (\r\n
\r\n
\r\n \r\n ) : undefined\r\n }\r\n onClick={() =>\r\n !isMobile &&\r\n useSidePanel &&\r\n !disableExpandToggle &&\r\n expandPanel()\r\n }\r\n >\r\n {pageName}\r\n \r\n {/* \r\n {pageName}\r\n */}\r\n
\r\n
\r\n )}\r\n
\r\n {titlePage ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n {subTitlePage && (\r\n
\r\n {subTitlePage}\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n <>\r\n {!!leftTopActions &&\r\n leftTopActions?.length > 0 &&\r\n leftTopActions?.map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n {rightActionsLoading &&\r\n (!rightTopActions ||\r\n (!!rightTopActions && rightTopActions?.length === 0)) && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!!rightTopActions && rightTopActions?.length > 0 && (\r\n \r\n {rightTopActions\r\n .filter((t, index) => index < actionsLength)\r\n .map(f => (\r\n {f(onSubmit)}\r\n ))}\r\n ind >= actionsLength)\r\n .map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n keepOpen={false}\r\n >\r\n \r\n )}\r\n {useSwithActions && switchState && (\r\n \r\n \r\n \r\n )}\r\n {closable && useSidePanel && (\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n
\r\n
\r\n {showProcessing && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n
\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { TitlePage } from './TitlePage';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { ActionRenderer } from '../PageActions/ActionRender';\r\nimport {\r\n SwitchActions,\r\n SwitchActionsProps,\r\n} from '../PageActions/SwitchActions';\r\nimport styled from 'styled-components';\r\nimport { useTheme } from '@material-ui/core';\r\nimport clsx from 'clsx';\r\nimport { LinearProgress } from 'app/components/LinearProgress';\r\nimport { useAbsolute } from 'utils/url-utils';\r\n\r\nexport interface ShortHeadProps {\r\n closable: boolean | undefined;\r\n useSidePanel: boolean;\r\n closePanel: () => void;\r\n pageName: React.ReactNode;\r\n titlePage: string | undefined;\r\n pageLink: string | undefined;\r\n toPageLink?: string;\r\n titleTooltip: string | undefined;\r\n isMobile: boolean;\r\n disableExpandToggle: boolean | undefined;\r\n expandPanel: () => void;\r\n subTitlePage?: React.ReactNode;\r\n leftTopActions?: ActionRenderer[];\r\n rightTopActions?: ActionRenderer[];\r\n rightTopActionsAsMenu?: boolean;\r\n switchState?: SwitchActionsProps;\r\n useSwithActions?: boolean;\r\n onSubmit?: () => void;\r\n showProcessing?: boolean;\r\n loading: boolean;\r\n isCover?: boolean;\r\n useShortView?: boolean;\r\n hideMenu?: boolean;\r\n}\r\nconst ShortTitleRoot = styled('div')(({ theme }) => ({\r\n '&.page-wrapper-short-title-root': {\r\n padding: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n width: '100%',\r\n gap: theme.spacing(1.25),\r\n '.shortTitleContainer': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(2, 2, 1.5),\r\n alignItems: 'flex-start',\r\n width: '100%',\r\n gap: theme.spacing(0.5),\r\n '.iconAndTitle': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n width: '100%',\r\n gap: theme.spacing(1.5),\r\n alignSelf: 'center',\r\n },\r\n '.shortRightIcons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: '8px',\r\n },\r\n },\r\n '.shortSwithContainer': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n alignSelf: 'stretch',\r\n width: '100%',\r\n gap: 10,\r\n padding: theme.spacing(1, 3, 2),\r\n // '.shortSwithButtons': {\r\n // display: 'flex',\r\n // flexDirection: 'row',\r\n // alignItems: 'center',\r\n // width: '100%',\r\n // height: '32px',\r\n // border: `1px solid ${bookitColors.grayscale.graySelection}`,\r\n // background: bookitColors.base.white,\r\n // borderRadius: '6px',\r\n // //padding: theme.spacing(0.25, 0.25),\r\n // //gap: '12px',\r\n // justifyContent: 'stretch',\r\n // },\r\n },\r\n },\r\n}));\r\nexport function ShortHead(props: ShortHeadProps) {\r\n const { t } = useTranslation();\r\n const {\r\n closable,\r\n useSidePanel,\r\n closePanel,\r\n titlePage,\r\n pageLink,\r\n toPageLink,\r\n titleTooltip,\r\n isMobile,\r\n disableExpandToggle,\r\n expandPanel,\r\n rightTopActions,\r\n rightTopActionsAsMenu,\r\n onSubmit,\r\n useSwithActions,\r\n switchState,\r\n showProcessing,\r\n loading,\r\n isCover,\r\n useShortView,\r\n hideMenu,\r\n } = props;\r\n const theme = useTheme();\r\n const topIconsLength = React.useMemo(() => {\r\n return (\r\n (!isMobile && useSidePanel && !disableExpandToggle ? 1 : 0) +\r\n (closable && useSidePanel ? 1 : 0) +\r\n (rightTopActions !== undefined && rightTopActions.length > 0\r\n ? rightTopActions.length === 1 && !rightTopActionsAsMenu\r\n ? 1\r\n : rightTopActions.length === 2 && !rightTopActionsAsMenu\r\n ? 2\r\n : 1\r\n : 0)\r\n );\r\n }, [\r\n closable,\r\n disableExpandToggle,\r\n isMobile,\r\n rightTopActions,\r\n rightTopActionsAsMenu,\r\n useSidePanel,\r\n ]);\r\n const absolutePageLink = useAbsolute(pageLink, toPageLink);\r\n return (\r\n \r\n
\r\n
\r\n {loading ? (\r\n \r\n ) : (\r\n \r\n {titlePage && (\r\n \r\n )}\r\n \r\n )}\r\n
\r\n
\r\n {loading ? (\r\n \r\n ) : (\r\n \r\n {rightTopActions !== undefined && rightTopActions.length > 0 && (\r\n <>\r\n {rightTopActions.length === 1 && !rightTopActionsAsMenu ? (\r\n {rightTopActions[0](onSubmit)}\r\n ) : rightTopActions.length === 2 && !rightTopActionsAsMenu ? (\r\n \r\n {rightTopActions[0](onSubmit)}\r\n {rightTopActions[1](onSubmit)}\r\n \r\n ) : (\r\n (\r\n {item(onSubmit)}\r\n )),\r\n ].filter(v => !!v) as JSX.Element[]\r\n }\r\n >\r\n )}\r\n \r\n )}\r\n \r\n {!isMobile &&\r\n (useSidePanel || isCover) &&\r\n !disableExpandToggle && (\r\n {\r\n if (isCover) {\r\n if (!!absolutePageLink) {\r\n window.open(absolutePageLink, '_blank');\r\n }\r\n } else {\r\n expandPanel();\r\n }\r\n }}\r\n >\r\n \r\n \r\n )}\r\n {closable && useSidePanel && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n
\r\n
\r\n {useSwithActions && switchState && !loading && (\r\n
\r\n \r\n
\r\n )}\r\n {showProcessing && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const TopButtonsContainer = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n '.leftButtons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n width: 'auto',\r\n gap: theme.spacing(1),\r\n },\r\n '.rightButtons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n width: 'auto',\r\n gap: theme.spacing(1),\r\n },\r\n}));\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { ActionRenderer } from '../PageActions/ActionRender';\r\nimport { Body } from 'app/components/Typography';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useTheme } from '@material-ui/core';\r\nimport { TopButtonsContainer } from '../styled';\r\n\r\nexport interface ButtonsPanelProps {\r\n leftActions?: ActionRenderer[];\r\n rightActions?: ActionRenderer[];\r\n isMobile: boolean;\r\n sidePanelExpanded: boolean;\r\n disableExpandToggle: boolean | undefined;\r\n useSidePanel: boolean;\r\n onSubmit?: () => void;\r\n expandPanel: () => void;\r\n leftActionsMaxLength?: number;\r\n}\r\n\r\nexport function ButtonsPanel(props: ButtonsPanelProps) {\r\n const { t } = useTranslation();\r\n const {\r\n leftActions,\r\n rightActions,\r\n isMobile,\r\n sidePanelExpanded,\r\n disableExpandToggle,\r\n useSidePanel,\r\n onSubmit,\r\n expandPanel,\r\n leftActionsMaxLength = 1,\r\n } = props;\r\n const theme = useTheme();\r\n return (\r\n \r\n
\r\n \r\n {!!leftActions && leftActions?.length > 0 && (\r\n \r\n {leftActions.length > leftActionsMaxLength ? (\r\n \r\n {[...Array(leftActionsMaxLength).keys()].map(x => (\r\n {leftActions[x](onSubmit)}\r\n ))}\r\n {!isMobile && useSidePanel && !disableExpandToggle && (\r\n \r\n \r\n {sidePanelExpanded\r\n ? t(translations.ShowLess)\r\n : t(translations.MoreOptionsMobile)}\r\n \r\n \r\n )}\r\n index > leftActionsMaxLength - 1)\r\n .filter(item => item !== undefined)\r\n .map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n >\r\n \r\n ) : (\r\n \r\n {leftActions?.map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n {!isMobile && useSidePanel && !disableExpandToggle && (\r\n \r\n \r\n {sidePanelExpanded\r\n ? t(translations.ShowLess)\r\n : t(translations.MoreOptionsMobile)}\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n )}\r\n \r\n
\r\n
\r\n <>\r\n {!!rightActions &&\r\n rightActions?.length > 0 &&\r\n rightActions?.map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useTheme } from '@material-ui/core';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { ActionRenderer } from '../PageActions/ActionRender';\r\nimport styled from 'styled-components';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport interface TopButtonsPanelProps {\r\n rightTopActions?: ActionRenderer[];\r\n leftTopActions?: ActionRenderer[];\r\n maxLeftTopButtonsLength?: number;\r\n showShortView: boolean;\r\n onSubmit?: () => void;\r\n expandPanel: () => void;\r\n leftActionsLoading?: boolean;\r\n}\r\n\r\nconst TopButtonsContainer = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n paddingInline: theme.spacing(2, 0),\r\n '.leftButtons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n width: 'auto',\r\n gap: theme.spacing(1),\r\n },\r\n}));\r\nexport function TopButtonsPanel(props: TopButtonsPanelProps) {\r\n const {\r\n leftTopActions,\r\n showShortView,\r\n onSubmit,\r\n maxLeftTopButtonsLength = 2,\r\n leftActionsLoading,\r\n } = props;\r\n const theme = useTheme();\r\n return (\r\n \r\n
\r\n \r\n {leftActionsLoading &&\r\n (!leftTopActions ||\r\n (!!leftTopActions && leftTopActions?.length === 0)) && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!!leftTopActions && leftTopActions?.length > 0 && (\r\n \r\n {showShortView ? (\r\n \r\n {leftTopActions.length > maxLeftTopButtonsLength ? (\r\n \r\n {leftTopActions\r\n .filter((f, i) => i < maxLeftTopButtonsLength)\r\n .map((f, i) => (\r\n {f(onSubmit)}\r\n ))}\r\n {/* {leftTopActions[0](onSubmit)}\r\n {leftTopActions[1](onSubmit)} */}\r\n index >= maxLeftTopButtonsLength,\r\n )\r\n .map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n >\r\n \r\n ) : (\r\n \r\n {leftTopActions?.map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n \r\n )}\r\n \r\n ) : (\r\n \r\n {leftTopActions?.map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n \r\n )}\r\n \r\n )}\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import { useTheme } from '@material-ui/core';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport {\r\n FormLeftSection,\r\n FormRightSection,\r\n StyledFormFieldsContainer,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport React from 'react';\r\nimport { TopButtonsContainer } from '../styled';\r\n\r\nexport interface FormSkeletonProps {\r\n fullPage: boolean;\r\n}\r\nconst thingsCount = 15;\r\nconst getRandomWidth = () => {\r\n return (Math.random() * 40 + 50).toFixed(0).toString() + '%';\r\n};\r\nexport const ButtonsSkeleton = () => {\r\n const theme = useTheme();\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\nexport const FormSkeleton = (props: FormSkeletonProps) => {\r\n return (\r\n \r\n \r\n {[...Array(thingsCount).keys()].map(i => (\r\n 0.5 ? 'h1' : 'p'}\r\n />\r\n ))}\r\n \r\n \r\n {props.fullPage &&\r\n [...Array(thingsCount).keys()].map(i => (\r\n 0.5 ? 'h1' : 'p'}\r\n />\r\n ))}\r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { ActionRenderer } from './PageActions/ActionRender';\r\nimport { useLayoutSlice } from '../../slice';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectHideNavigation,\r\n selectIsCoverExpanded,\r\n selectIsCoverOpen,\r\n} from '../../slice/selectors';\r\nimport clsx from 'clsx';\r\nimport { CoverWrapper } from '../CoverWrapper';\r\nimport { Head } from './components/Head';\r\nimport { ShortHead } from './components/ShortHead';\r\nimport { ButtonsPanel } from './components/ButtonsPanel';\r\nimport { TopButtonsPanel } from './components/TopButtonsPanel';\r\nimport { SwitchActionsProps } from './PageActions/SwitchActions';\r\nimport { ButtonsSkeleton, FormSkeleton } from './components/FormSkeleton';\r\nimport styled from 'styled-components';\r\nimport { useTheme } from '@material-ui/styles';\r\nimport { bookitShadows } from 'styles/shadows/bookitShadow';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { selectIsSubBarCollapsed } from 'app/slice/selectors';\r\nexport type PageContentRenderer = () => React.ReactNode;\r\n\r\nexport interface PageWrapperProps extends CoverProps {\r\n children: React.ReactNode;\r\n pageName?: React.ReactNode;\r\n titlePage?: string;\r\n subTitlePage?: React.ReactNode;\r\n leftActions?: ActionRenderer[];\r\n rightActions?: ActionRenderer[];\r\n rightTopActions?: ActionRenderer[];\r\n leftTopActions?: ActionRenderer[];\r\n onSubmit?: () => void;\r\n onClose?: () => void;\r\n closeSidePanel?: () => void;\r\n closable?: boolean;\r\n useSidePanel: boolean;\r\n loading?: boolean;\r\n confirm?: JSX.Element;\r\n pageLink?: string;\r\n toPageLink?: string;\r\n cover?: React.ReactNode;\r\n disableExpandToggle?: boolean;\r\n titleTooltip?: string;\r\n switchState?: SwitchActionsProps;\r\n useSwitchActions?: boolean;\r\n topProcessing?: boolean;\r\n maxLeftTopButtonsLength?: number;\r\n rightTopActionsAsMenu?: boolean;\r\n hideTitleBar?: boolean;\r\n leftActionsMaxLength?: number;\r\n rightTopActionsLength?: number;\r\n leftActionsLoading?: boolean;\r\n rightActionsLoading?: boolean;\r\n useShortView?: boolean;\r\n hideMenu?: boolean;\r\n id?: string;\r\n}\r\n\r\nexport interface CoverProps {\r\n isCover?: boolean;\r\n closeCover?: () => void;\r\n coverClosed?: boolean;\r\n}\r\n\r\nconst PageWrapperRoot = styled('div')(({ theme }) => ({\r\n '&.page-wrapper-root': {\r\n background: bookitColors.grayscale.grayBackground,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n //minWidth: '360px',\r\n gap: 8,\r\n '.sidePanelRoot &': {\r\n background: bookitColors.base.white,\r\n },\r\n '&.covered': {\r\n filter: 'brightness(30%)',\r\n },\r\n '&.cover': {\r\n // height: '95vh',\r\n height: 'calc(100vh - 50px)',\r\n //height: '100vh',\r\n '& [class*=\"tableButtonsRootShort\"]': {\r\n maxWidth: '320px',\r\n },\r\n },\r\n '&.baseNavigationHeight': {\r\n height: '97vh',\r\n },\r\n '&.baseRootUsePanelHeight': {\r\n height: '99.9vh',\r\n },\r\n '&.baseRootUsePanelShortHeight': {\r\n // height: '97vh',\r\n height: 'calc(100vh - 50px)',\r\n minWidth: 'unset',\r\n },\r\n '&.baseRootHeight': {\r\n height: '91vh',\r\n '&.subBarExpanded': {\r\n height: '85vh',\r\n },\r\n },\r\n '.content': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n width: '100%',\r\n padding: '8px 0 0',\r\n '&.contentRoot': {\r\n justifyContent: 'space-between',\r\n height: '100%',\r\n overflow: 'hidden',\r\n },\r\n '&.contentMobRoot': {\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(1, 0, 0, 0),\r\n height: '100%',\r\n //height: '90%',\r\n //gap: theme.spacing(2),\r\n flex: '0 1 calc(100% - 50px)',\r\n overflow: 'hidden',\r\n '&.hideTitleBar': {\r\n padding: '0px',\r\n flex: '0 1 100%',\r\n },\r\n },\r\n '&.hideTitleBar': {\r\n padding: '0px',\r\n },\r\n '.contentContainer': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: 0,\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n overflowY: 'auto',\r\n gap: '32px',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n // '&&': {\r\n // background: 'yelow',\r\n // },\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n '&.showShortView': {\r\n gap: '16px',\r\n },\r\n },\r\n //TO DO: find a way to add a box-shadow to bottom toolbar in case when content is scrollable so it match to the Figma.\r\n '.bottomToolbar': {\r\n position: 'static',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n background: bookitColors.base.white,\r\n borderRadius: 'unset',\r\n padding: theme.spacing(2, 3, 2, 3),\r\n boxShadow: bookitShadows.shadowBorderTop,\r\n '&.showShortView': {\r\n gap: '8px',\r\n boxShadow: bookitShadows.shadowBorderTop,\r\n },\r\n },\r\n },\r\n },\r\n}));\r\n\r\nexport const PageWrapper = React.memo(function PageWrapper(\r\n props: PageWrapperProps,\r\n) {\r\n const {\r\n pageName,\r\n titlePage,\r\n subTitlePage,\r\n children,\r\n leftActions,\r\n rightActions,\r\n rightTopActions,\r\n leftTopActions,\r\n loading,\r\n onSubmit,\r\n onClose,\r\n closeSidePanel,\r\n closable,\r\n useSidePanel,\r\n confirm,\r\n pageLink,\r\n toPageLink,\r\n cover,\r\n closeCover,\r\n disableExpandToggle,\r\n titleTooltip,\r\n isCover,\r\n switchState,\r\n useSwitchActions: useSwithActions,\r\n topProcessing,\r\n maxLeftTopButtonsLength,\r\n rightTopActionsAsMenu,\r\n hideTitleBar,\r\n leftActionsMaxLength,\r\n rightTopActionsLength,\r\n leftActionsLoading,\r\n rightActionsLoading,\r\n useShortView,\r\n coverClosed,\r\n hideMenu,\r\n id,\r\n } = props;\r\n // const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const coverExpanded = useSelector(selectIsCoverExpanded);\r\n const hideNavigation = useSelector(selectHideNavigation);\r\n const isCoverOpen = useSelector(selectIsCoverOpen);\r\n const collapsedBar = useSelector(selectIsSubBarCollapsed);\r\n const isCovered = !!cover;\r\n const [isCoverClosed, setIsCoverClosed] = React.useState(\r\n coverClosed,\r\n );\r\n const showShortView = React.useMemo(() => {\r\n return (\r\n isMobile ||\r\n (useSidePanel && !sidePanelExpanded) ||\r\n (isCover && !coverExpanded) ||\r\n useShortView\r\n );\r\n }, [\r\n coverExpanded,\r\n isCover,\r\n isMobile,\r\n sidePanelExpanded,\r\n useShortView,\r\n useSidePanel,\r\n ]);\r\n\r\n const closePanel = () => {\r\n if (isCover) {\r\n closeCover?.();\r\n dispatch(actions.setIsCoverOpen(false));\r\n return;\r\n }\r\n if (closeSidePanel) {\r\n closeSidePanel();\r\n } else {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n const expandPanel = () => {\r\n if (isCover) {\r\n dispatch(actions.setIsCoverExpanded(!coverExpanded));\r\n } else {\r\n dispatch(actions.setExpanded(!sidePanelExpanded));\r\n }\r\n };\r\n const onCoveredClick = event => {\r\n if (\r\n isCovered &&\r\n isCoverOpen &&\r\n !!event.target.id &&\r\n event.target.id.indexOf('page-wrapper-root') > -1\r\n ) {\r\n closeCover?.();\r\n dispatch(actions.setIsCoverOpen(false));\r\n }\r\n };\r\n const theme = useTheme();\r\n React.useEffect(() => {\r\n setIsCoverClosed(coverClosed);\r\n }, [coverClosed]);\r\n React.useEffect(() => {\r\n if (isCoverOpen && isCover && isCoverClosed) {\r\n closeCover?.();\r\n dispatch(actions.setIsCoverOpen(false));\r\n setIsCoverClosed(undefined);\r\n }\r\n }, [actions, closeCover, isCoverClosed, dispatch, isCover, isCoverOpen]);\r\n return (\r\n \r\n \r\n {!hideTitleBar && (\r\n \r\n {showShortView ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n {loading ? (\r\n \r\n ) : (\r\n \r\n {showShortView &&\r\n ((leftTopActions && leftTopActions.length > 0) ||\r\n leftActionsLoading) && (\r\n \r\n )}\r\n {children}\r\n \r\n )}\r\n \r\n \r\n {confirm}\r\n {leftActions && leftActions?.length > 0 && (\r\n \r\n {/* {showShortView &&\r\n !isMobile &&\r\n useSidePanel &&\r\n !disableExpandToggle &&\r\n leftActions &&\r\n leftActions?.length > 1 && (\r\n \r\n {loading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n
\r\n \r\n \r\n {sidePanelExpanded\r\n ? t(translations.ShowLess)\r\n : t(translations.ShowMore)}\r\n \r\n \r\n
\r\n )}\r\n
\r\n )} */}\r\n {loading ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n
\r\n
\r\n \r\n {useSidePanel && !!cover && (\r\n \r\n {cover}\r\n \r\n )}\r\n \r\n
\r\n );\r\n});\r\n","/**\r\n * Compile time guard on Union Type switch\r\n * Usage example:\r\n * ```\r\n * type Union = 'apple' | 'banana' | 'orange';\r\n * function test(arg: Union) {\r\n * switch (arg) {\r\n * case 'apple':\r\n * ...\r\n * case 'banana':\r\n * ...\r\n * default:\r\n * // this will generate a comiple warning since 'orange' is not handled in the switch\r\n * assertExhaustive(arg);\r\n * }\r\n * }\r\n */\r\nexport function assertExhaustive(value: never, message?: string): never {\r\n throw new Error(\r\n message ?? `Reached unexpected case in exhaustive switch: ${value}`,\r\n );\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.offlineServiceState || initialState;\r\n\r\nexport const selectProcessing = createSelector(\r\n [selectSlice],\r\n state => state.processing,\r\n);\r\nexport const selectInitConsumablesProcessing = createSelector(\r\n [selectSlice],\r\n state => state.consumablesProcessing,\r\n);\r\nexport const selectService = createSelector(\r\n [selectSlice],\r\n state => state.detailsState,\r\n);\r\nexport const selectServiceProcessing = createSelector(\r\n [selectService],\r\n state => state.processing,\r\n);\r\nexport const selectServicenError = createSelector(\r\n [selectService],\r\n state => state.error,\r\n);\r\nexport const selectServiceHasError = createSelector(\r\n [selectService],\r\n state => state.hasErrors,\r\n);\r\nexport const selectServiceCompleted = createSelector(\r\n [selectService],\r\n state => state.completed,\r\n);\r\nexport const selectServiceData = createSelector(\r\n [selectService],\r\n state => state.data,\r\n);\r\nexport const selectConnectedInitState = createSelector(\r\n [selectSlice],\r\n state => state.connectedDataState,\r\n);\r\nexport const selectServiceChangeState = createSelector(\r\n [selectSlice],\r\n state => state.serviceChangeResultState,\r\n);\r\nexport const selectFieldHandler = createSelector(\r\n [selectSlice],\r\n state => state.valueHandler,\r\n);\r\nexport const selectCreditState = createSelector(\r\n [selectSlice],\r\n state => state.creditState,\r\n);\r\nexport const selectCredit = createSelector(\r\n [selectCreditState],\r\n state => state.data,\r\n);\r\nexport const selectCreditProcessing = createSelector(\r\n [selectCreditState],\r\n state => state.processing,\r\n);\r\nexport const selectCreditCompleted = createSelector(\r\n [selectCreditState],\r\n state => state.completed,\r\n);\r\nexport const selectHasCharges = createSelector(\r\n [selectSlice],\r\n state => state.hasCharges,\r\n);\r\nexport const selectConsumablesState = createSelector(\r\n [selectSlice],\r\n state => state.consumablesState,\r\n);\r\nexport const selectSavedReservationService = createSelector(\r\n [selectSlice],\r\n state => state.savedReservationService,\r\n);\r\nexport const selectConsumablesProcessing = createSelector(\r\n [selectConsumablesState],\r\n state => state.processing,\r\n);\r\nexport const selectConsumablesData = createSelector(\r\n [selectConsumablesState],\r\n state => state.data,\r\n);\r\nexport const selectConsumablesError = createSelector(\r\n [selectConsumablesState],\r\n state => state.error,\r\n);\r\nexport const selectConsumablesHasErrors = createSelector(\r\n [selectConsumablesState],\r\n state => state.hasErrors,\r\n);\r\nexport const selectConsumablesCompleted = createSelector(\r\n [selectConsumablesState],\r\n state => state.completed,\r\n);\r\nexport const selectConsumablesValueHandler = createSelector(\r\n [selectSlice],\r\n state => state.consumablesValueHandler,\r\n);\r\nexport const selectSelectedServiceType = createSelector(\r\n [selectSlice],\r\n state => state.selectedServiceTypes,\r\n);\r\nexport const selectEditCreatableService = createSelector(\r\n [selectSlice],\r\n state => state.editCreatableService,\r\n);\r\nexport const selectBarcodeScanned = createSelector(\r\n [selectSlice],\r\n state => state.barcodeScanned,\r\n);\r\nexport const selectRefreshConsumableServices = createSelector(\r\n [selectSlice],\r\n state => state.refeshOfflineServices,\r\n);\r\nexport const selectStockRenewalsState = createSelector(\r\n [selectSlice],\r\n state => state.stockRenewalState,\r\n);\r\nexport const selectStockRenewalProcessing = createSelector(\r\n [selectStockRenewalsState],\r\n state => state.processing,\r\n);\r\nexport const selectStockRenewalData = createSelector(\r\n [selectStockRenewalsState],\r\n state => state.data,\r\n);\r\nexport const selectStockRenewalError = createSelector(\r\n [selectStockRenewalsState],\r\n state => state.error,\r\n);\r\nexport const selectStockRenewalHasErrors = createSelector(\r\n [selectStockRenewalsState],\r\n state => state.hasErrors,\r\n);\r\nexport const selectStockRenewalCompleted = createSelector(\r\n [selectStockRenewalsState],\r\n state => state.completed,\r\n);\r\nexport const selectStockRenewalValueHandler = createSelector(\r\n [selectSlice],\r\n state => state.stockRenewalValueHandler,\r\n);\r\nexport const selectRenewStockState = createSelector(\r\n [selectSlice],\r\n state => state.renewStockState,\r\n);\r\nexport const selectRenewStockProcessing = createSelector(\r\n [selectRenewStockState],\r\n state => state.processing,\r\n);\r\nexport const selectRenewStockData = createSelector(\r\n [selectRenewStockState],\r\n state => state.data,\r\n);\r\nexport const selectRenewStockError = createSelector(\r\n [selectRenewStockState],\r\n state => state.error,\r\n);\r\nexport const selectRenewStockHasErrors = createSelector(\r\n [selectRenewStockState],\r\n state => state.hasErrors,\r\n);\r\nexport const selectRenewStockCompleted = createSelector(\r\n [selectRenewStockState],\r\n state => state.completed,\r\n);\r\nexport const selectRenewStockValueHandler = createSelector(\r\n [selectSlice],\r\n state => state.renewStockValueHandler,\r\n);\r\nexport const selectIsEdit = createSelector(\r\n [selectSlice],\r\n state => state.isEdit,\r\n);\r\n\r\nexport const selectInventoryBatchState = createSelector(\r\n [selectSlice],\r\n state => state.inventoryBatchState,\r\n);\r\nexport const selectInventoryBatchProcessing = createSelector(\r\n [selectInventoryBatchState],\r\n state => state.processing,\r\n);\r\nexport const selectInventoryBatchData = createSelector(\r\n [selectInventoryBatchState],\r\n state => state.data,\r\n);\r\nexport const selectInventoryBatchError = createSelector(\r\n [selectInventoryBatchState],\r\n state => state.error,\r\n);\r\nexport const selectInventoryBatchHasErrors = createSelector(\r\n [selectInventoryBatchState],\r\n state => state.hasErrors,\r\n);\r\nexport const selectInventoryBatchCompleted = createSelector(\r\n [selectInventoryBatchState],\r\n state => state.completed,\r\n);\r\nexport const selectInventoryBatchValueHandler = createSelector(\r\n [selectSlice],\r\n state => state.inventoryBatchValueHandler,\r\n);\r\nexport const selectInventoryBatchIsEdit = createSelector(\r\n [selectSlice],\r\n state => state.batchIsEdit,\r\n);\r\nexport const selectInventoryBatchEditable = createSelector(\r\n [selectSlice],\r\n state => state.inventoryBatchEditable,\r\n);\r\nexport const selectCreatableService = createSelector(\r\n [selectSlice],\r\n state => state.getCreatableService,\r\n);\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.reservation || initialState;\r\n\r\nexport const selectReservationState = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\nexport const selectProcessing = createSelector(\r\n [selectReservationState],\r\n state => state.processing,\r\n);\r\nexport const selectReservation = createSelector(\r\n [selectReservationState],\r\n state => state.detailsState,\r\n);\r\nexport const selectReservationProcessing = createSelector(\r\n [selectReservation],\r\n state => state.processing,\r\n);\r\nexport const selectReservationError = createSelector(\r\n [selectReservation],\r\n state => state.error,\r\n);\r\nexport const selectReservationHasError = createSelector(\r\n [selectReservation],\r\n state => state.hasErrors,\r\n);\r\nexport const selectReservationCompleted = createSelector(\r\n [selectReservation],\r\n state => state.completed,\r\n);\r\nexport const selectReservationData = createSelector(\r\n [selectReservation],\r\n state => state.data,\r\n);\r\nexport const selectReservationSettings = createSelector(\r\n [selectReservationState],\r\n state => state.reservationSettingsState,\r\n);\r\nexport const selectEquipmentsSettings = createSelector(\r\n [selectReservationState],\r\n state => state.equipmentsSettingsState,\r\n);\r\nexport const selectConfirmAssistedReservations = createSelector(\r\n [selectReservationState],\r\n state => state.confirmAssistedReservations,\r\n);\r\nexport const selectUserTrainingData = createSelector(\r\n [selectReservationState],\r\n state => state.trainingsData,\r\n);\r\nexport const selectFieldHandler = createSelector(\r\n [selectReservationState],\r\n state => state.valueHandler,\r\n);\r\nexport const selectRequestedValueFor = createSelector(\r\n [selectReservationState],\r\n state => state.requestedValueFor,\r\n);\r\nexport const selectRequestedValue = createSelector(\r\n [selectReservationState],\r\n state => state.requestedValue,\r\n);\r\nexport const selectEquipmentChangeState = createSelector(\r\n [selectReservationState],\r\n state => state.equipmentChangeResultState,\r\n);\r\nexport const selectEquipmentChangeCompleted = createSelector(\r\n [selectReservationState],\r\n state => state.isChangeCompleted,\r\n);\r\nexport const selectAsyncChangeLoading = createSelector(\r\n [selectReservationState],\r\n state => state.asyncChangeLoading,\r\n);\r\n\r\nexport const selectTransferState = createSelector(\r\n [selectReservationState],\r\n state => state.transferState,\r\n);\r\nexport const selectTransferProcessing = createSelector(\r\n [selectTransferState],\r\n state => state.transferProcessing,\r\n);\r\nexport const selectTransferStepCompleted = createSelector(\r\n [selectTransferState],\r\n state => state.transferStepCompleted,\r\n);\r\nexport const selectTransferToUser = createSelector(\r\n [selectTransferState],\r\n state => state.User,\r\n);\r\nexport const selectTransferReservation = createSelector(\r\n [selectTransferState],\r\n state => state.ReservtionId,\r\n);\r\nexport const selectTransferWaitingApproval = createSelector(\r\n [selectTransferState],\r\n state => state.WaitingTransferApproval,\r\n);\r\nexport const selectCreditState = createSelector(\r\n [selectSlice],\r\n state => state.creditState,\r\n);\r\nexport const selectCredit = createSelector(\r\n [selectCreditState],\r\n state => state.data,\r\n);\r\nexport const selectCreditProcessing = createSelector(\r\n [selectCreditState],\r\n state => state.processing,\r\n);\r\nexport const selectCreditCompleted = createSelector(\r\n [selectCreditState],\r\n state => state.completed,\r\n);\r\nexport const selectHasCharges = createSelector(\r\n [selectSlice],\r\n state => state.hasCharges,\r\n);\r\nexport const selectSavedOfflineServices = createSelector(\r\n [selectSlice],\r\n state => state.savedOfflineServices,\r\n);\r\nexport const selectRefreshOfflineServices = createSelector(\r\n [selectSlice],\r\n state => state.refeshOfflineService,\r\n);\r\nexport const selectTerminateState = createSelector(\r\n [selectSlice],\r\n state => state.terminationState,\r\n);\r\nexport const selectTerminateProcessing = createSelector(\r\n [selectTerminateState],\r\n state => state.terminatProcessing,\r\n);\r\nexport const selectTerminateCompleted = createSelector(\r\n [selectTerminateState],\r\n state => state.terminateCompleted,\r\n);\r\nexport const selectCloneReservations = createSelector(\r\n [selectSlice],\r\n state => state.cloneReservation,\r\n);\r\nexport const selectReservationDtoState = createSelector(\r\n [selectSlice],\r\n state => state.reservationDtoState,\r\n);\r\nexport const selectIsEdit = createSelector(\r\n [selectSlice],\r\n state => state.isEdit,\r\n);\r\nexport const selectSavedForLater = createSelector(\r\n [selectReservationSettings],\r\n state => state?.SaveForLater,\r\n);\r\nexport const selectIsCreditSubmited = createSelector(\r\n [selectSlice],\r\n state => state.submitCredit,\r\n);\r\nexport const selectByApprovalErrors = createSelector(\r\n [selectSlice],\r\n state => state.ByApprovalErrors,\r\n);\r\nexport const selectRefreshWorkOrderLink = createSelector(\r\n [selectSlice],\r\n state => state.refreshWorkOrderLink,\r\n);\r\n","import { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { CheckEntity } from 'app/components/CheckBoxGroup';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport * as Yup from 'yup';\r\n\r\nexport const EntityNumberSchema: Yup.SchemaOf> = Yup.object({\r\n Id: Yup.number().required(),\r\n Name: Yup.string().ensure(),\r\n});\r\nexport const EntityStringSchema: Yup.SchemaOf> = Yup.object({\r\n Id: Yup.string().required(),\r\n Name: Yup.string().ensure(),\r\n});\r\nexport const IdentifiableNumberSchema: Yup.SchemaOf> = Yup.object({\r\n Id: Yup.number().required(),\r\n});\r\nexport const IdentifiableStringSchema: Yup.SchemaOf> = Yup.object({\r\n Id: Yup.string().required(),\r\n});\r\nexport const CheckEntityShema: Yup.SchemaOf = Yup.object({\r\n Id: Yup.number().defined(),\r\n Name: Yup.string().ensure(),\r\n checked: Yup.boolean().default(false),\r\n disabled: Yup.boolean().default(undefined),\r\n});\r\nconst inventoryBatchesSchema = Yup.array().of(\r\n Yup.mixed() as Yup.SchemaOf,\r\n);\r\nexport const OfflineServiceTypeShema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().defined(),\r\n Name: Yup.string().ensure(),\r\n ServiceGroupId: Yup.number().defined(),\r\n ServiceTypeId: Yup.number().defined().default(2),\r\n Active: Yup.boolean().default(true),\r\n HideProjects: Yup.boolean().default(false),\r\n IntQuantityOnly: Yup.boolean().default(false),\r\n UnitTypeID: Yup.number().nullable().default(null),\r\n UnitTypeName: Yup.string().ensure(),\r\n AllowToUser: Yup.boolean().default(false),\r\n Inventory: Yup.number().defined().default(1),\r\n DefaultQuantity: Yup.number().nullable().notRequired().default(null),\r\n ReservationOverlappingInventory: Yup.number()\r\n .nullable()\r\n .notRequired()\r\n .default(null),\r\n IsAdmin: Yup.boolean().default(false),\r\n AllowedBudgets: Yup.array().of(Yup.number().required()),\r\n StaffOnly: Yup.boolean().default(false),\r\n BudgetsTurnedOn: Yup.boolean().default(false),\r\n NotLessThanZero: Yup.boolean().default(false),\r\n TrackInventory: Yup.boolean().default(false),\r\n InventoryBatchesEnabled: Yup.boolean().default(false),\r\n InventoryBatches: inventoryBatchesSchema,\r\n },\r\n);\r\nexport const ServiceGroupEntitySchema = EntityNumberSchema;\r\nexport const BudgetEntitySechema = EntityNumberSchema;\r\nexport const BudgetExperimentEntitySechema = EntityNumberSchema;\r\nexport const InstituteProjectEntitySechema = EntityNumberSchema;\r\nexport const PaymentMethodEntitySchema = EntityNumberSchema;\r\nexport const UserEntitySchema = EntityStringSchema;\r\nexport const OnlineServiceEntitySchema = EntityNumberSchema;\r\nexport const OfflineServiceTypeEntitySchema = EntityNumberSchema;\r\nexport const FeeTypeEntitySchema = EntityNumberSchema;\r\nexport const UserGroupEntitySchema = EntityStringSchema;\r\nexport const ServiceTypeSchema = EntityNumberSchema;\r\n","import { RootStateKeyType } from '../types/injector-typings';\r\nimport {\r\n createSlice as createSliceOriginal,\r\n SliceCaseReducers,\r\n CreateSliceOptions,\r\n} from '@reduxjs/toolkit';\r\n\r\n/* Wrap createSlice with stricter Name options */\r\n\r\n/* istanbul ignore next */\r\nexport const createSlice = <\r\n State,\r\n CaseReducers extends SliceCaseReducers,\r\n Name extends RootStateKeyType\r\n>(\r\n options: CreateSliceOptions,\r\n) => {\r\n return createSliceOriginal(options);\r\n};\r\n","/**\r\n *\r\n * DialogConfirm\r\n *\r\n */\r\nimport { DialogProps } from '@material-ui/core';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ActionButton } from '../BasicButtons/ActionButton';\r\nimport { BasicDialog } from '../BasicDialog';\r\nimport { DialogActionsRenderer } from '../BasicDialog/DialogActionsRender';\r\n\r\nexport interface DialogConfirmProps\r\n extends Omit {\r\n title?: string | React.ReactNode;\r\n subtitle?: React.ReactNode;\r\n body: React.ReactNode;\r\n confirmButtonLabel?: string;\r\n cancelButtonLabel?: string;\r\n onConfirm?: React.MouseEventHandler;\r\n onCancel?: () => void;\r\n onClose?: () => void;\r\n processing?: boolean;\r\n disabled?: boolean;\r\n isOpen: boolean;\r\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false;\r\n actions?: DialogActionsRenderer[];\r\n confirmTitle?: string;\r\n managedState?: boolean;\r\n}\r\n\r\nexport function DialogConfirm({\r\n title,\r\n body,\r\n confirmButtonLabel,\r\n cancelButtonLabel,\r\n onConfirm,\r\n onCancel,\r\n processing,\r\n isOpen,\r\n maxWidth,\r\n subtitle,\r\n disabled,\r\n actions,\r\n onClose,\r\n confirmTitle,\r\n managedState,\r\n ...props\r\n}: DialogConfirmProps) {\r\n const { t } = useTranslation();\r\n const [open, setOpen] = React.useState(isOpen);\r\n\r\n // const handleClickOpen = () => {\r\n // setOpen(true);\r\n // };\r\n React.useEffect(() => {\r\n setOpen(isOpen);\r\n }, [isOpen]);\r\n\r\n const handleClose = () => {\r\n onCancel?.();\r\n onClose?.();\r\n if (!managedState) {\r\n setOpen(false);\r\n }\r\n };\r\n const handleConfirm = event => {\r\n if (!!onConfirm) {\r\n onConfirm(event);\r\n }\r\n };\r\n const btnActions: DialogActionsRenderer[] = [];\r\n if (actions && actions.length > 0) {\r\n actions.forEach(a => btnActions.push(a));\r\n }\r\n if (!!onConfirm) {\r\n btnActions.push(() => (\r\n \r\n ));\r\n }\r\n if (!!onCancel) {\r\n btnActions.push(() => (\r\n \r\n ));\r\n }\r\n\r\n return (\r\n \r\n );\r\n}\r\n","export enum ConfigurableTypes {\r\n ColumnScreenConfig = 1,\r\n ColumnExportConfig = 2,\r\n ColumnFinExportConfig = 3,\r\n}\r\nexport enum ExportTypes {\r\n CSV = 1,\r\n XLS = 2,\r\n XLSX = 3,\r\n}\r\nexport enum ScreensId {\r\n // \"~/UsageHistory.aspx\"\r\n UsageHistory = 1,\r\n // \"~/History.aspx\"\r\n ReservationHistory = 2,\r\n // \"~/UsagePaymentReport.aspx\"\r\n UsagePaymentReport = 3,\r\n // \"~/Budgets.aspx\"\r\n Budgets = 4,\r\n // \"~/ServiceRequests.aspx\"\r\n ServiceRequests = 5,\r\n // \"~/UserTraining.aspx\"\r\n UserTraining = 6,\r\n // \"~/Alerts/default.aspx\"\r\n Alerts = 7,\r\n // \"~/Invoices/Default.aspx\"\r\n Invoices = 8,\r\n // \"~/Invoices/Default.aspx\"\r\n InvoicesList = 9,\r\n // \"~/ProjectPlanningReport.aspx\"\r\n ProjectPlanningReport = 10,\r\n // \"~/Assets/Default.aspx\"\r\n AssetSearch = 11,\r\n // \"~/Admin/Assets/Default.aspx\"\r\n AssetsList = 12,\r\n // \"~/Invoices/Create.aspx\"\r\n EstimatedInvoices = 13,\r\n // \"~/Alerts/UserTickets.aspx\"\r\n AlertsTickets = 14,\r\n // \"~/Alerts/AssignedToMe.aspx\"\r\n AlertsAssignedTo = 15,\r\n // \"~/Alerts/MyAssets.aspx\"\r\n MyAssets = 16,\r\n // \"~/TrainingProgramsList.aspx\"\r\n UpcomingTrainingSessions = 17,\r\n // \"~/CoresDirectory.aspx\"\r\n CoresDirectory = 18,\r\n // \"~/Maps/Buildings.aspx\"\r\n Buildings = 19,\r\n // \"~/Maps/Rooms.aspx\"\r\n Rooms = 20,\r\n // \"~/Reports/Default.aspx\"\r\n AdHocReports = 21,\r\n // \"~/Documents.aspx\"\r\n Documents = 22,\r\n // \"~/Messages.aspx\"\r\n CalendarMessages = 23,\r\n // \"~/TrainingWaitingList\"\r\n TrainingWaitingList = 24,\r\n // \"~/Users\"\r\n Users = 25,\r\n //~/EmailNotifications\r\n Email = 26,\r\n //~/Experiments/experimenttemplates\r\n ExperimentTemplate = 27,\r\n //~/UsersHistory\r\n UsersHistory = 28,\r\n // ~/Assets/Details.aspx?id=\r\n ShortAssetsList = 29,\r\n //~/Quizzes\r\n Quizzes = 30,\r\n //~/Submissions\r\n Submissions = 31,\r\n //~/UserTrainingHistory\r\n UserTrainingHistory = 32,\r\n //~/OtherServices\r\n OtherServices = 33,\r\n //~/Invoices/InvoiceLetterTemplates.aspx\r\n InvoiceLetters = 34,\r\n //~/Charges\r\n Charges = 35,\r\n //~/Locations\r\n Locations = 36,\r\n //~/Locations/Building\r\n BuildingRooms = 37,\r\n //~/Campuses.aspx\r\n Campuses = 38,\r\n //~/Areas.aspx\r\n Areas = 39,\r\n //~/LocationList.aspx\r\n LocationList = 40,\r\n //~/Categories.aspx\r\n Categories = 41,\r\n //~/CategoryGroups.aspx\r\n CategoryGroups = 42,\r\n //~/SendEmailToUsers\r\n SendEmailToUsers = 43,\r\n //~/OnlineBudgetsStatus\r\n OnlineBudgetsStatus = 366659,\r\n //~/InvoiceBatches\r\n InvoiceBatches = 44,\r\n //\"~/Invoices/Details\"\r\n InvoiceCharges = 45,\r\n //~/BillingActions\r\n BillingActions = 46,\r\n //~/LocationTypes\r\n LocationTypes = 47,\r\n //~/mylists\r\n SavedViews = 48,\r\n SubLocationList = 49,\r\n SubLocationTypes = 50,\r\n Schedule = 51,\r\n PricePeriod = 52,\r\n InvoiceTemplates = 53,\r\n Articles = 54,\r\n Expenses = 55,\r\n UserAttributes = 56,\r\n SampleRunsDetails = 57,\r\n SamplesList = 58,\r\n SampleRequests = 59,\r\n OfflineServiceTypes = 60,\r\n SampelsRunsList = 61,\r\n SamplesPlates = 62,\r\n SamplesModifications = 63,\r\n PublicAssets = 64,\r\n //~/Assets/Inventory/Log\r\n BarcodeScanLog = 65,\r\n ServiceRequestAuditTrailHistory = 66,\r\n // \"~/Maps/Areas/Default.aspx\"\r\n Floors = 67,\r\n // ~/Invoices/SubscriptionTypes/Default.aspx\r\n SubscriptionTypes = 68,\r\n // \"~/Experiments/Default.aspx\"\r\n BudgetExperiments = 69,\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IServiceRequestDto } from 'api/odata/generated/entities/IServiceRequestDto';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { TableState } from 'react-table';\r\nimport { Entity, IAsyncValue, Identifiable } from 'types/common';\r\nimport { PartialRecord } from 'types/PartialRecord';\r\nimport { RunTypesUnion } from '../../components/RunTypePicker';\r\nimport { IServiceRequestMilestoneDto } from 'api/odata/generated/entities/IServiceRequestMilestoneDto';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { ServiceRequestMilestoneChargeType } from '../../components/ServiceRequestMilestoneChargeDetails';\r\nimport { IUserBaseDto } from 'api/odata/generated/entities/IUserBaseDto';\r\nimport { ServiceRequestMilestoneStatusesUnion } from 'api/odata/generated/enums/ServiceRequestMilestoneStatuses';\r\nimport { IOpenSidePanelPayload } from 'app/Layout/FrontendLayout/slice';\r\nimport { IConsumableServiceDto } from 'api/odata/generated/entities/IConsumableServiceDto';\r\nimport { PromiseStatus } from 'app/hooks/usePromise';\r\nimport { IServiceRequestRowDto } from 'api/odata/generated/entities/IServiceRequestRowDto';\r\nimport { IServiceRequestRowValueDto } from 'api/odata/generated/entities/IServiceRequestRowValueDto';\r\nimport { Dictionary } from 'lodash';\r\nimport { CustomFormValueType } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { IFormFieldOptionDto } from 'api/odata/generated/entities/IFormFieldOptionDto';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { SpecialColumnTypesUnion } from 'api/odata/generated/enums/SpecialColumnTypes';\r\nimport { IServiceRequestRowStatusDto } from 'api/odata/generated/entities/IServiceRequestRowStatusDto';\r\n\r\n/* --- STATE --- */\r\nexport type ISampleListTableState = Partial<\r\n TableState & {\r\n searchColumns?: Array;\r\n customFilters: Array<\r\n Pick, 'fieldName' | 'operator' | 'value'>\r\n >;\r\n }\r\n>;\r\nexport type IFieldState = {\r\n status: PromiseStatus;\r\n};\r\n\r\nexport type ControlledTableState = Partial<\r\n TableState & {\r\n searchColumns?: Array;\r\n }\r\n>;\r\nexport type ServiceRequestRowsTableState = ControlledTableState<\r\n IServiceRequestRowDto\r\n>;\r\nexport interface RowsWithTotalCount {\r\n rows: TRow[];\r\n dataLength: number;\r\n}\r\nexport interface IControlledTableState {\r\n tableState: ControlledTableState;\r\n selectedRows: Array;\r\n data: IAsyncValue>;\r\n}\r\nexport interface IServiceRequestRowsTableState {}\r\nexport interface IRequestDetailsModel\r\n extends Omit,\r\n IServiceRequestDetailsFormModel {}\r\n/**\r\n * Represents interface to service request form data values.\r\n */\r\nexport interface IServiceRequestDetailsFormModel {\r\n Rows?: Array;\r\n FormValues?: Record;\r\n}\r\nexport interface IRequestSamplesState {\r\n RequestSamples: IAsyncValue<{ data: ISample[]; dataLength: number }>;\r\n RequestDetails: IAsyncValue;\r\n ServiceRequestStatuses: IAsyncValue>;\r\n ServiceRequestRowStatuses?: Array;\r\n SamplesTableState: ISampleListTableState;\r\n SamplesSelected: any[];\r\n ServiceRequestRows: IAsyncValue;\r\n serviceRequestId?: number;\r\n ImportState: {\r\n open: boolean;\r\n processing: boolean;\r\n };\r\n fieldsState: PartialRecord;\r\n milestoneProcessing?: boolean;\r\n milestoneChargeProcessing?: boolean;\r\n submitting?: boolean;\r\n SidePanel?: IOpenSidePanelPayload;\r\n createServiceRequestRowStatus?: PromiseStatus;\r\n}\r\n\r\nexport interface ISample extends Record {\r\n Id: number;\r\n ServiceRequestId: number;\r\n BudgetName: string | null;\r\n BudgetId: number | null;\r\n SourceRunIds: Array | null;\r\n TargetRunIds: Array | null;\r\n Status: number;\r\n StatusName: string | null;\r\n AnalyticalSampleId: string | null;\r\n BiologicalSampleId: string | null;\r\n TMT_Type: string | null;\r\n TMT_Label: string | null;\r\n TMT_Set: string | null;\r\n SubjectId: string | null;\r\n Concentration: number | null;\r\n Volume: number | null;\r\n SamplePlateId: string | null;\r\n Position: string | null;\r\n SampleType: string | null;\r\n TaxaId: string | null;\r\n}\r\n\r\nexport interface ITableState {\r\n pageIndex: number;\r\n pageSize: number;\r\n columnOrder: any;\r\n filters: any;\r\n globalFilter: any;\r\n}\r\n\r\nexport interface ISampleRun\r\n extends Record,\r\n ISampleTarget,\r\n ISample {\r\n Id: number;\r\n ServiceRequestId: number;\r\n Status: number;\r\n BudgetName: string | null;\r\n AnalyticalSampleId: string | null;\r\n RunId: number | null;\r\n\r\n TMT_Type: string | null;\r\n TMT_Label: string | null;\r\n TMT_Set: string | null;\r\n\r\n Concentration: number | null;\r\n Volume: number | null;\r\n SamplePlateId: string | null;\r\n Position: string | null;\r\n\r\n TargetConcentration: number | null;\r\n TargetVolume: number | null;\r\n TargetPlateId: string | null;\r\n TargetPosition: string | null;\r\n TargetTubeLabel: string | null;\r\n TargetSampleType: string | null;\r\n}\r\n\r\nexport interface IRunDetails {\r\n Id?: number;\r\n RunType: RunTypesUnion;\r\n Samples: ISampleTarget[];\r\n}\r\n\r\nexport interface ISampleTarget extends ISample {\r\n TargetConcentration: number | null;\r\n TargetVolume: number | null;\r\n TargetPlateId: string | null;\r\n TargetPosition: string | null;\r\n TargetTubeLabel: string | null;\r\n TargetSampleType: string | null;\r\n}\r\n\r\nexport interface ISamplesFilter {\r\n ServiceRequestId?: number;\r\n}\r\n\r\nexport type IServiceRequestUpdateStatusAction = PayloadAction<\r\n Pick & IReason\r\n>;\r\nexport type IServiceRequestUpdateBudgetAction = PayloadAction<\r\n Pick\r\n>;\r\n\r\nexport type IServiceRequestPatchAction = PayloadAction<\r\n Pick & Partial>\r\n>;\r\n\r\nexport type ILoadServiceRequestMilestonesAction = PayloadAction<\r\n Identifiable\r\n>;\r\nexport type ILoadServiceRequestMilestonesSuccessAction = PayloadAction<\r\n Array\r\n>;\r\n\r\nexport type ICancelServiceRequestPayloadAction = PayloadAction<\r\n {\r\n serviceRequestId: number;\r\n } & IReason\r\n>;\r\nexport type UpdateServiceRequestRowValueAction = PayloadAction<{\r\n serviceRequestId: number;\r\n serviceRequestValue: Pick<\r\n IServiceRequestRowValueDto,\r\n 'ColumnId' | 'RowId' | 'Value' | 'DisplayValue'\r\n >;\r\n}>;\r\n\r\nexport interface IRequestMilestoneManualChargeUserModel {\r\n Id: string;\r\n Title: string;\r\n display: string;\r\n}\r\n\r\nexport interface IRequestMilestoneManualChargeModel {\r\n OfflineServiceType: IConsumableServiceDto | null;\r\n Unit: Entity | null;\r\n Id: number;\r\n Name: string | null;\r\n Quantity: number | null;\r\n Rate: number | null;\r\n Remarks: string | null;\r\n Date: Timestamp | null;\r\n UpdatedBy: IRequestMilestoneManualChargeUserModel | null;\r\n}\r\n\r\nexport type InsertServiceRequestMilestoneChargeAction = PayloadAction<\r\n Partial & {\r\n ServiceRequestId: number;\r\n ServiceRequestMilestoneId: number;\r\n }\r\n>;\r\nexport type UpdateServiceRequestMilestoneChargeAction = PayloadAction<\r\n Pick &\r\n Partial & {\r\n ServiceRequestId: number;\r\n ServiceRequestMilestoneId: number;\r\n }\r\n>;\r\nexport interface IServiceRequestMilestoneChargeForm {\r\n Id?: number;\r\n Type?: ServiceRequestMilestoneChargeType;\r\n Name?: string;\r\n Service?: IConsumableServiceDto;\r\n Rate?: number;\r\n Date?: Date | null;\r\n Unit?: Entity;\r\n Quantity?: number;\r\n Remarks?: string;\r\n}\r\nexport interface IServiceRequestMilestoneForm {\r\n Id?: number;\r\n Name?: string;\r\n Assignees?: IUserBaseDto[];\r\n CompletionDate?: Date | null;\r\n TargetDate?: Date | null;\r\n Description?: string;\r\n Status?: ServiceRequestMilestoneStatusesUnion;\r\n}\r\n/** WebApi interface */\r\nexport interface ServiceRequestMilestoneInsertModel {\r\n Id?: number;\r\n ServiceRequestId: number;\r\n\r\n Name: string | null;\r\n Assignees: string | null;\r\n CompletionDate: Timestamp | null;\r\n TargetDate: Timestamp | null;\r\n Description: string | null;\r\n StatusId: number | null;\r\n}\r\n/** WebApi interface */\r\nexport type RequestMilestoneModel = Pick<\r\n ServiceRequestMilestoneInsertModel,\r\n 'CompletionDate' | 'StatusId'\r\n>;\r\nexport interface IReason {\r\n Reason?: string;\r\n}\r\n\r\n/**\r\n * UI column obj\r\n */\r\nexport interface IServiceRequestTableColumnModel\r\n extends Pick<\r\n IFormFieldDto,\r\n | 'Id'\r\n | 'Label'\r\n //| 'ColumnType'\r\n | 'Index'\r\n // | 'Options'\r\n // | 'OptionsSourceType'\r\n | 'Required'\r\n | 'ParentId'\r\n | 'SizeLimit'\r\n // | 'Active'\r\n | 'Description'\r\n | 'DisplayType'\r\n | 'IsMultiple'\r\n | 'CopyPrevValues'\r\n | 'CustomRoles'\r\n | 'UserSelectionType'\r\n | 'FixedRoles'\r\n > {\r\n IsColumn: true;\r\n Options?: IFormFieldOptionDto[];\r\n ColumnType: CustomFormColumnTypes;\r\n isRequired: boolean;\r\n}\r\n/**\r\n * UI interface of the service request row value\r\n * CustomFormValueType narrowed to include types supported on the custom form table\r\n */\r\nexport type IServiceRequestTableRowValueModel = Extract<\r\n CustomFormValueType,\r\n string | Date | number | boolean | Entity\r\n>;\r\n\r\n/**\r\n * UI interface of the service request table model\r\n */\r\nexport interface IServiceRequestTableRowModel\r\n extends Omit {\r\n Values: Dictionary;\r\n}\r\n\r\n// case 'Disclaimer':\r\n// case 'Dictionary':\r\n// case 'Index1':\r\n// case 'Index2':\r\n// case 'Label':\r\n// case 'Lane':\r\n// case 'Plate':\r\n// case 'PlateCell':\r\n// case 'RunLane':\r\n// case 'SequencingModes':\r\n// case 'Name':\r\n// case 'SourceAndLabel':\r\n// case 'Source':\r\n// case 'UserSelection':\r\n\r\ntype Extends = U;\r\n\r\n/**\r\n * List of the column types (SpecialColumnTypes) currently supported on the custom form table\r\n */\r\nexport type CustomFormColumnTypes = Extends<\r\n SpecialColumnTypesUnion,\r\n | 'CheckBox'\r\n | 'Date'\r\n | 'DropDownList'\r\n | 'ShortText'\r\n | 'Serial'\r\n | 'Email'\r\n | 'PositiveInteger'\r\n | 'Number'\r\n | 'PositiveDecimal'\r\n | 'UserSelection'\r\n>;\r\nexport const ColumnTypesArray: Array = [\r\n 'CheckBox',\r\n 'Date',\r\n 'DropDownList',\r\n 'ShortText',\r\n 'Serial',\r\n 'Email',\r\n 'PositiveInteger',\r\n 'Number',\r\n 'PositiveDecimal',\r\n 'UserSelection',\r\n];\r\n","import { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { IFormFieldOptionDto } from 'api/odata/generated/entities/IFormFieldOptionDto';\r\nimport { DisplayTypes } from 'api/odata/generated/enums/DisplayTypes';\r\nimport { UserSelectionTypeUnion } from 'api/odata/generated/enums/UserSelectionType';\r\nimport { createOptions } from 'app/components/CustomForm/CustomFormFields/CustomFormDropDown';\r\nimport { Dictionary, keyBy } from 'lodash';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport {\r\n ColumnTypesArray,\r\n CustomFormColumnTypes,\r\n IServiceRequestTableColumnModel,\r\n} from '../types';\r\n\r\nexport class ServiceRequestTableColumn\r\n implements IServiceRequestTableColumnModel {\r\n AssignParent(result: Dictionary): void {\r\n const parentFieldName = this.getParentFieldName();\r\n if (parentFieldName !== null) {\r\n const parent = result[parentFieldName];\r\n if (parent !== undefined) {\r\n this.Parent = parent;\r\n (parent.Children = parent.Children ?? []).push(this);\r\n }\r\n }\r\n }\r\n\r\n IsColumn: true = true;\r\n Options?: IFormFieldOptionDto[] | undefined;\r\n ColumnType: CustomFormColumnTypes;\r\n isRequired: boolean;\r\n Id: number;\r\n Label: string;\r\n Index: number;\r\n Required: 'Optional' | 'User' | 'Admin' | 'Conditional';\r\n ParentId: number | null;\r\n SizeLimit: number;\r\n Description: string | null;\r\n DisplayType: DisplayTypes;\r\n IsMultiple: boolean;\r\n CopyPrevValues: boolean;\r\n CustomRoles: string | null;\r\n UserSelectionType: UserSelectionTypeUnion | null;\r\n FixedRoles: string | null;\r\n\r\n Parent: ServiceRequestTableColumn | null = null;\r\n Children: Array | null = null;\r\n\r\n constructor(columnDto: IFormFieldDto, isAdmin?: boolean) {\r\n this.Id = columnDto.Id;\r\n // see null check above in filter\r\n this.ColumnType = (columnDto.ColumnType as CustomFormColumnTypes)!;\r\n this.Description = columnDto.Description;\r\n this.DisplayType = columnDto.DisplayType;\r\n this.Index = columnDto.Index;\r\n this.IsColumn = true;\r\n this.IsMultiple = columnDto.IsMultiple;\r\n this.Label = columnDto.Label;\r\n this.ParentId = columnDto.ParentId;\r\n this.Required = columnDto.Required;\r\n this.SizeLimit = columnDto.SizeLimit;\r\n this.Options =\r\n columnDto.ColumnType === 'DropDownList'\r\n ? createOptions(columnDto)\r\n : undefined;\r\n this.isRequired = this.isColumnRequired({\r\n Required: columnDto.Required,\r\n isAdmin: isAdmin ?? false,\r\n });\r\n this.CopyPrevValues = columnDto.CopyPrevValues;\r\n this.CustomRoles = columnDto.CustomRoles;\r\n this.UserSelectionType = columnDto.UserSelectionType;\r\n this.FixedRoles = columnDto.FixedRoles;\r\n }\r\n\r\n static getFieldName(columnId: number) {\r\n return `column_${String(columnId)}`;\r\n }\r\n getFieldName() {\r\n return ServiceRequestTableColumn.getFieldName(this.Id);\r\n }\r\n getParentFieldName() {\r\n if (this.ParentId === null) {\r\n return null;\r\n }\r\n return ServiceRequestTableColumn.getFieldName(this.ParentId);\r\n }\r\n\r\n private isColumnRequired = (\r\n props: Pick & { isAdmin: boolean },\r\n ) => {\r\n switch (props.Required) {\r\n case 'Optional': //optional\r\n return false;\r\n case 'User': //required for user (all users)\r\n return true;\r\n case 'Admin': //required for admin\r\n return props.isAdmin;\r\n case 'Conditional':\r\n // not supported on columns/table\r\n return false;\r\n default:\r\n assertExhaustive(props.Required);\r\n }\r\n };\r\n}\r\n\r\nexport class ServiceRequestTableColumnsCollection {\r\n columnsObj: Dictionary;\r\n constructor(columnsData, isAdmin: boolean, VisibleToAdminOnly?: boolean) {\r\n if (VisibleToAdminOnly === true && isAdmin !== true) {\r\n this.columnsObj = {};\r\n return;\r\n }\r\n const columns =\r\n columnsData\r\n ?.filter(f => f.Active === true)\r\n ?.filter(\r\n column =>\r\n column.IsColumn === true &&\r\n column.ColumnType !== null &&\r\n (ColumnTypesArray as string[]).includes(column.ColumnType),\r\n )\r\n ?.map(columnDto => new ServiceRequestTableColumn(columnDto, isAdmin)) ??\r\n [];\r\n const result = keyBy(columns, column => column.getFieldName());\r\n columns.forEach(column => column.AssignParent(result));\r\n this.columnsObj = result;\r\n }\r\n\r\n getArray() {\r\n return Object.values(this.columnsObj);\r\n }\r\n get(columnId: number) {\r\n return this.columnsObj[ServiceRequestTableColumn.getFieldName(columnId)];\r\n }\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\nimport { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\r\nimport { IServiceRequestDto } from 'api/odata/generated/entities/IServiceRequestDto';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { SpecialColumnTypesUnion } from 'api/odata/generated/enums/SpecialColumnTypes';\r\nimport { tryParseBool, tryParseFloat, tryParseInt } from 'utils/string-utils';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport {\r\n isEmptyOrWhitespace,\r\n toUndefinedIfEmptyOrWhitespace,\r\n} from 'utils/typeUtils';\r\nimport { ServiceRequestTableColumnsCollection } from './utils/ServiceRequestTableColumn';\r\nimport { IServiceRequestDetailsFormModel } from './types';\r\n\r\nconst selectSlice = (state: RootState) => state.requestSamples || initialState;\r\n\r\nexport const selectRequestSamples = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\nexport const selectServiceRequestStatuses = createSelector(\r\n [selectSlice],\r\n state => state.ServiceRequestStatuses,\r\n);\r\nexport const selectServiceRequestRowStatues = createSelector(\r\n [selectSlice],\r\n state => state.ServiceRequestRowStatuses,\r\n);\r\nexport const selectSubmitting = createSelector(\r\n [selectSlice],\r\n state => state.submitting,\r\n);\r\n\r\nexport const selectServiceRequestStatusesByInternalId = createSelector(\r\n [\r\n selectServiceRequestStatuses,\r\n (\r\n state,\r\n serviceRequestInternalStatus: InternalServiceRequestStatusesUnion,\r\n ) => serviceRequestInternalStatus,\r\n ],\r\n (state, serviceRequestInternalStatus: InternalServiceRequestStatusesUnion) =>\r\n state.value?.filter(\r\n status => status.InternalStatusId === serviceRequestInternalStatus,\r\n ),\r\n);\r\nexport const selectServiceRequestId = createSelector(\r\n [selectRequestSamples],\r\n state => state.serviceRequestId,\r\n);\r\nexport const selectRequestDetails = createSelector(\r\n [selectRequestSamples],\r\n state => state.RequestDetails,\r\n);\r\nexport const selectCommentIsInternal = createSelector(\r\n [selectRequestDetails],\r\n state => state.value?.CommentIsInternal,\r\n);\r\nexport const selectRequestDetailsData = createSelector(\r\n [selectRequestSamples],\r\n state => state.RequestDetails?.value,\r\n);\r\nexport const selectServiceRequestCustomForm = createSelector(\r\n [selectRequestDetailsData],\r\n state => state?.FormValues,\r\n);\r\nexport const selectServiceRequestCustomTable = createSelector(\r\n [selectRequestDetailsData],\r\n state => state?.Rows,\r\n);\r\nexport const selectServiceRequestFormData = createSelector(\r\n [selectServiceRequestCustomForm, selectServiceRequestCustomTable],\r\n (formValues, rows) => {\r\n const result: IServiceRequestDetailsFormModel = {\r\n FormValues: formValues,\r\n Rows: rows,\r\n };\r\n return result;\r\n },\r\n);\r\nexport const selectRequestDetailsFieldsState = createSelector(\r\n [selectRequestSamples],\r\n state => state.fieldsState,\r\n);\r\nexport const selectServiceRequestDetailsFieldState = createSelector(\r\n [\r\n selectRequestDetailsFieldsState,\r\n (state, fieldName: keyof IServiceRequestDto) => fieldName,\r\n ],\r\n (state, fieldName) => state[fieldName],\r\n);\r\nconst selectService = createSelector([selectRequestDetailsData], state => {\r\n return state?.Service;\r\n});\r\nconst selectStatus = createSelector([selectRequestDetailsData], state => {\r\n return state?.Status;\r\n});\r\nconst selectCreatedFor = createSelector([selectRequestDetailsData], state => {\r\n return state?.CreatedFor;\r\n});\r\nexport const selectIsServiceRequestAdmin = createSelector(\r\n [selectService, selectCreatedFor, selectStatus, selectAuthenticatedUser],\r\n (Service, CreatedFor, Status, authenticatedUser) => {\r\n let isAdmin = false;\r\n let isOwner = false;\r\n let isEditable = false;\r\n if (Service === undefined) {\r\n return { isAdmin, isOwner, isEditable };\r\n }\r\n if (authenticatedUser === undefined) {\r\n return { isAdmin, isOwner, isEditable };\r\n }\r\n if (authenticatedUser.Roles.includes(Roles.Administrators)) {\r\n return { isAdmin: true, isOwner: false, isEditable: true };\r\n }\r\n\r\n isAdmin = authenticatedUser.IsAdminOf({\r\n ServiceGroupId: Service.ServiceGroup.Id,\r\n ServiceId: Service.Id,\r\n ServiceTypeId: ServiceType.Sample,\r\n });\r\n\r\n isOwner = CreatedFor?.Id === authenticatedUser?.Id;\r\n const userEditableStatuses: Array = [\r\n 'Draft',\r\n 'ReturnedToUser',\r\n ];\r\n const internalStatusId = Status?.InternalStatusId;\r\n // todo: check equipment administrator permissions\r\n isEditable =\r\n isAdmin ||\r\n (isOwner &&\r\n internalStatusId !== undefined &&\r\n userEditableStatuses.includes(internalStatusId));\r\n return { isAdmin, isOwner, isEditable };\r\n },\r\n);\r\nexport const selectSamplesTableState = createSelector(\r\n [selectSlice],\r\n state => state.SamplesTableState,\r\n);\r\nexport const selectSamplesData = createSelector(\r\n [selectRequestSamples],\r\n state => state.RequestSamples,\r\n);\r\nexport const selectImportState = createSelector(\r\n [selectRequestSamples],\r\n state => state.ImportState,\r\n);\r\nexport const selectSelectedSamples = createSelector(\r\n [selectRequestSamples],\r\n state => state.SamplesSelected,\r\n);\r\nconst selectCustomForm = createSelector(\r\n [selectService],\r\n state => state?.CustomForm,\r\n);\r\nconst selectCustomFormFields = createSelector(\r\n [selectRequestDetailsData],\r\n state => state?.Service.CustomForm.FormFields,\r\n);\r\nexport const selectServiceRequestCustomFormColumns = createSelector(\r\n [selectCustomForm, selectCustomFormFields, selectIsServiceRequestAdmin],\r\n (customForm, state, isAdmin) => {\r\n return new ServiceRequestTableColumnsCollection(\r\n state,\r\n isAdmin.isAdmin,\r\n customForm?.VisibleToAdminOnly,\r\n );\r\n },\r\n);\r\n\r\nexport const selectServiceRequestCustomFormFields = createSelector(\r\n [selectRequestDetails],\r\n state =>\r\n state.value?.Service?.CustomForm?.FormFields?.filter(\r\n f => f.Active === true,\r\n )?.filter(column => column.IsColumn === false) ?? [],\r\n);\r\n\r\nexport const selectServiceRequestMilestones = createSelector(\r\n [selectRequestDetails],\r\n state => state.value?.Milestones,\r\n);\r\nexport const selectServiceRequestMilestoneProcessing = createSelector(\r\n [selectSlice],\r\n state => state.milestoneProcessing,\r\n);\r\n\r\nexport const selectServiceRequestSidePanel = createSelector(\r\n [selectSlice],\r\n state => state.SidePanel,\r\n);\r\n\r\nexport const selectServiceRequestRows = createSelector(\r\n [selectSlice],\r\n state => state.ServiceRequestRows,\r\n);\r\n\r\nexport function fromDtoValue(\r\n type: SpecialColumnTypesUnion,\r\n formValueDto:\r\n | Pick\r\n | null\r\n | undefined,\r\n) {\r\n if (formValueDto === null) {\r\n return null;\r\n }\r\n if (formValueDto === undefined) {\r\n return undefined;\r\n }\r\n switch (type) {\r\n case 'CheckBox':\r\n return tryParseBool(formValueDto.Value);\r\n case 'Date':\r\n return dateUtils.tryFormatIso(dateUtils.tryParse(formValueDto.Value));\r\n case 'Disclaimer':\r\n case 'Dictionary':\r\n case 'Index1':\r\n case 'Index2':\r\n case 'Label':\r\n case 'Lane':\r\n case 'Plate':\r\n case 'PlateCell':\r\n case 'RunLane':\r\n case 'SequencingModes':\r\n case 'Name':\r\n case 'SourceAndLabel':\r\n case 'Source':\r\n return undefined;\r\n case 'UserSelection':\r\n case 'DropDownList':\r\n if (isEmptyOrWhitespace(formValueDto.Value)) {\r\n return undefined;\r\n } else {\r\n return {\r\n Id: formValueDto.Value,\r\n Name:\r\n toUndefinedIfEmptyOrWhitespace(formValueDto.DisplayValue) ??\r\n formValueDto.Value,\r\n };\r\n }\r\n case 'ShortText':\r\n case 'Serial':\r\n case 'Email':\r\n return formValueDto.Value;\r\n case 'PositiveInteger':\r\n return tryParseInt(formValueDto.Value);\r\n case 'Number':\r\n case 'PositiveDecimal':\r\n return tryParseFloat(formValueDto.Value);\r\n\r\n default:\r\n assertExhaustive(type);\r\n }\r\n}\r\n\r\nexport const selectServiceRequestRowsForm = createSelector(\r\n [selectSlice],\r\n state => state.ServiceRequestRows?.value,\r\n);\r\n\r\nexport const selectServiceRequestRowInsertStatus = createSelector(\r\n [selectSlice],\r\n state => state.createServiceRequestRowStatus,\r\n);\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { TextFieldProps } from '../TextField';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { InfoIcon } from '../BasicIcons/InfoIcon';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport BaseTextField from '../BasicInputs/BaseTextField';\r\n\r\nexport const FormTextField = ({\r\n label,\r\n onChange,\r\n onBlur,\r\n value,\r\n name,\r\n error,\r\n helperText,\r\n ...props\r\n}: FieldHookConfig &\r\n Omit &\r\n IFieldProps) => {\r\n const [field, meta] = useField({ name, ...props });\r\n const handleChange = e => {\r\n if (onChange !== undefined) {\r\n onChange(e);\r\n }\r\n field.onChange(e);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n {props.info ? : null}\r\n {props.InputProps?.endAdornment}\r\n \r\n ),\r\n }}\r\n {...props}\r\n />\r\n );\r\n};\r\n","import { SidePanelRenderer } from 'app/Layout/FrontendLayout/components/SidePanel/SidePanelRenderer';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n selectContinueToLink,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n PageTypeProps,\r\n RenderPageType,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nexport interface SidePanelOpenState {\r\n renderPageType?: RenderPageType;\r\n renderPageProps?: PageTypeProps;\r\n useSidePanel?: boolean;\r\n isCover?: boolean;\r\n expanded?: boolean;\r\n}\r\nexport interface SidePanelCloseState {\r\n useSidePanel?: boolean;\r\n isCover?: boolean;\r\n onClose?: () => void;\r\n showConfirm?: boolean;\r\n}\r\n\r\nfunction useSidePanelState(\r\n onConfirm?: () => boolean,\r\n onReject?: () => void,\r\n isCover?: boolean,\r\n useSidePanel?: boolean,\r\n onClose?: () => void,\r\n) {\r\n const dispatch = useDispatch();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const continueToOther = useSelector(selectContinueState);\r\n const continueLink = useSelector(selectContinueToLink);\r\n const [cover, setCover] = React.useState(\r\n undefined,\r\n );\r\n const [coverClosed, setCoverClosed] = React.useState(\r\n undefined,\r\n );\r\n const closeCover = () => {\r\n setCover(undefined);\r\n };\r\n const onCloseCover = React.useCallback(() => {\r\n return closeCover();\r\n }, []);\r\n const closePanel = React.useCallback(\r\n (state: SidePanelCloseState) => {\r\n if (state.showConfirm) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n } else {\r\n if (state.isCover) {\r\n setCover(undefined);\r\n setCoverClosed(true);\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n if (!!state.onClose) {\r\n state.onClose();\r\n }\r\n }\r\n },\r\n [dispatch, layoutActions],\r\n );\r\n const openPanel = React.useCallback(\r\n (state: SidePanelOpenState) => {\r\n state.useSidePanel || state.isCover\r\n ? setCover(\r\n ,\r\n )\r\n : dispatch(\r\n layoutActions.openSidePanel({\r\n type: state.renderPageType,\r\n props: Object.assign({}, state.renderPageProps, {\r\n useSidePanel: true,\r\n }),\r\n expanded: state.expanded,\r\n }),\r\n );\r\n },\r\n [dispatch, layoutActions],\r\n );\r\n React.useEffect(() => {\r\n if (confirmApproved) {\r\n if (!!onConfirm) {\r\n let confirmed = onConfirm();\r\n if (confirmed) {\r\n if (continueToOther.continueOnApprove) {\r\n if (isCover) {\r\n setCover(undefined);\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n if (!!onClose) {\r\n onClose();\r\n }\r\n setTimeout(() => {\r\n useSidePanel || isCover\r\n ? setCover(\r\n ,\r\n )\r\n : dispatch(\r\n layoutActions.openSidePanel({\r\n type: continueToOther.pageType,\r\n props: continueToOther.pageProps,\r\n expanded: continueToOther.expanded,\r\n }),\r\n );\r\n dispatch(layoutActions.resetContinueState());\r\n }, 100);\r\n } else if (continueLink !== undefined) {\r\n dispatch(appSettingsActions.navigate(continueLink));\r\n if (isCover) {\r\n setCover(undefined);\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n if (!!onClose) {\r\n onClose();\r\n }\r\n } else {\r\n if (isCover) {\r\n setCover(undefined);\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n if (!!onClose) {\r\n onClose();\r\n }\r\n }\r\n } else {\r\n dispatch(layoutActions.resetConfirmState());\r\n }\r\n } else {\r\n if (continueToOther.continueOnApprove) {\r\n if (isCover) {\r\n setCover(undefined);\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n if (!!onClose) {\r\n onClose();\r\n }\r\n setTimeout(() => {\r\n useSidePanel || isCover\r\n ? setCover(\r\n ,\r\n )\r\n : dispatch(\r\n layoutActions.openSidePanel({\r\n type: continueToOther.pageType,\r\n props: continueToOther.pageProps,\r\n expanded: continueToOther.expanded,\r\n }),\r\n );\r\n dispatch(layoutActions.resetContinueState());\r\n }, 100);\r\n } else if (continueLink !== undefined) {\r\n dispatch(appSettingsActions.navigate(continueLink));\r\n if (isCover) {\r\n setCover(undefined);\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n if (!!onClose) {\r\n onClose();\r\n }\r\n } else {\r\n if (isCover) {\r\n setCover(undefined);\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n if (!!onClose) {\r\n onClose();\r\n }\r\n }\r\n }\r\n }\r\n if (confirmRejected) {\r\n dispatch(layoutActions.resetConfirmState());\r\n if (!!onReject) {\r\n onReject();\r\n }\r\n }\r\n\r\n return () => undefined;\r\n }, [\r\n appSettingsActions,\r\n confirmApproved,\r\n confirmRejected,\r\n continueLink,\r\n continueToOther.continueOnApprove,\r\n continueToOther.expanded,\r\n continueToOther.pageProps,\r\n continueToOther.pageType,\r\n dispatch,\r\n isCover,\r\n layoutActions,\r\n onClose,\r\n onConfirm,\r\n onReject,\r\n useSidePanel,\r\n ]);\r\n\r\n return { cover, openPanel, closePanel, coverClosed, onCloseCover };\r\n}\r\nexport default useSidePanelState;\r\n","import { useTranslation } from 'react-i18next';\r\nimport { dateUtils, WeekStartsOn } from 'utils/date-utils';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { WorkWeekDays } from './WorkWeekDays';\r\n\r\nexport enum RepetitiveOptions {\r\n DoNotRepeat,\r\n RepeatDaily,\r\n RepeatWeeklyOn,\r\n RepeatMonthlyOn,\r\n RepeatEveryWeekDay,\r\n RepeatCustom,\r\n}\r\nexport enum RepeatPeriod {\r\n Days = 1,\r\n Weeks = 2,\r\n Months = 3,\r\n}\r\nexport enum RepeatMonthlyBy {\r\n RepeatsBy_DayOfMonth = 1,\r\n RepeatsBy_DayOfWeek = 2,\r\n}\r\nexport function GetRepetitiveOptions(\r\n startDate: Date | null,\r\n firstDayOfWeek: number,\r\n) {\r\n let items = enumToEntityArray(RepetitiveOptions);\r\n let date = dateUtils.dateOrStringToDate(startDate ?? new Date());\r\n let dayName = dateUtils.getDayText(date);\r\n\r\n const { t } = useTranslation();\r\n let weekName = enumToEntityArray(WorkWeekDays, t).filter(\r\n f =>\r\n dateUtils.getWeekNumberOfMonth(date, firstDayOfWeek as WeekStartsOn) ===\r\n f.Id,\r\n )[0].Name;\r\n\r\n let weekDays = `${dateUtils.getLongDaysArray()[firstDayOfWeek]} - ${\r\n dateUtils.getLongDaysArray()[dateUtils.getLongDaysArray().length - 2]\r\n }`;\r\n\r\n items.forEach(item => {\r\n if (item.Id === RepetitiveOptions.RepeatWeeklyOn) {\r\n item.Name = item.Name.replace('{0}', dayName);\r\n }\r\n if (item.Id === RepetitiveOptions.RepeatMonthlyOn) {\r\n item.Name = item.Name.replace('{0}', weekName).replace('{1}', dayName);\r\n }\r\n if (item.Id === RepetitiveOptions.RepeatEveryWeekDay) {\r\n item.Name = item.Name.replace('{0}', weekDays);\r\n }\r\n });\r\n return items;\r\n}\r\n","import { IconProp } from 'app/AllIcons';\r\nimport * as React from 'react';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { ActionButton } from '../ActionButton';\r\nimport { ActionIconButton } from '../ActionIconButton';\r\nimport { ButtonsVariant } from '../Button';\r\n\r\nexport interface TopActionButtonProps {\r\n onClick?: React.MouseEventHandler;\r\n disabled?: boolean;\r\n startIcon?: IconProp;\r\n endIcon?: IconProp;\r\n icon: IconProp;\r\n text: string;\r\n title?: string;\r\n variant?: ButtonsVariant;\r\n size?: 'large' | 'medium' | 'small' | 'xs';\r\n shape?: 'circle' | 'square';\r\n customIcon?: React.ReactNode;\r\n href?: string | IPathAndQuery;\r\n to?: string;\r\n noChangeOnMobile?: boolean;\r\n target?: string;\r\n id?: string;\r\n fullWidth?: boolean;\r\n isIconButton?: boolean;\r\n processing?: boolean;\r\n}\r\n\r\nexport function TopActionButton(props: TopActionButtonProps) {\r\n const {\r\n onClick,\r\n disabled,\r\n startIcon,\r\n endIcon,\r\n icon,\r\n text,\r\n title,\r\n variant,\r\n size,\r\n shape,\r\n customIcon,\r\n noChangeOnMobile,\r\n id,\r\n isIconButton,\r\n fullWidth,\r\n processing,\r\n ...other\r\n } = props;\r\n const isMobile = DetectIsMobile();\r\n const action =\r\n (isMobile || isIconButton) && !noChangeOnMobile ? (\r\n \r\n ) : (\r\n \r\n );\r\n return action;\r\n}\r\n","import * as React from 'react';\r\nimport { EntityType } from 'types/common';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from '../AutocompletePicker';\r\nimport { createFilterOptions } from '@material-ui/lab';\r\n\r\nexport interface BaseOptionsPickerProps\r\n extends Omit, 'loadData'> {\r\n getOptions: (searchTerm: string | null) => T[];\r\n}\r\n\r\nexport function BaseOptionsPicker(\r\n props: BaseOptionsPickerProps,\r\n) {\r\n const { getOptions, ...other } = props;\r\n const loadData = async (searchTerm: string | null): Promise =>\r\n new Promise(resolve => {\r\n const opts = getOptions(searchTerm);\r\n resolve(opts);\r\n });\r\n return (\r\n option.Name,\r\n trim: true,\r\n })\r\n }\r\n {...other}\r\n />\r\n );\r\n}\r\n","import { FormValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { FieldHookConfig, useFormikContext } from 'formik';\r\nimport * as React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { FormFieldsSection, FormRow } from '../FormsLayout';\r\nimport {\r\n FormListenerProps,\r\n IFieldProps,\r\n IFormFieldSetting,\r\n} from './IFormFieldSetting';\r\nexport type IFieldRender = (item: JSX.Element) => React.ReactNode;\r\nexport type IFieldSectionRender = () => React.ReactNode;\r\nexport interface FieldsRendererProps {\r\n fields: FormFieldProps[];\r\n row?: T;\r\n}\r\nexport interface FormFieldProps extends IFormFieldSetting {\r\n component: React.FC & IFieldProps & any>;\r\n order: number;\r\n}\r\nexport interface IFieldRendererProps {\r\n fieldRow: React.FC>;\r\n row?: T;\r\n}\r\nexport interface IFieldSection {\r\n title?: string;\r\n fields: (FormFieldProps | JSX.Element)[];\r\n order: number;\r\n avoidRenderSection?: boolean;\r\n item: T;\r\n}\r\n\r\nexport function FormikField(props: FormFieldProps) {\r\n //const { component } = props;\r\n // const Field = React.memo(function Field(props: FormFieldProps) => {\r\n // return React.createElement(component, props);\r\n // });\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\nexport function FormikSection(props: IFieldSection) {\r\n const { title, fields, order, avoidRenderSection } = props;\r\n\r\n return fields.length > 0 ? (\r\n \r\n {avoidRenderSection ? (\r\n \r\n {fields.map((field, index) => (\r\n \r\n {'component' in field ? (\r\n \r\n ) : (\r\n field\r\n )}\r\n \r\n ))}\r\n \r\n ) : (\r\n \r\n {fields.map((field, index) => (\r\n \r\n {'component' in field ? (\r\n \r\n ) : (\r\n field\r\n )}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n );\r\n}\r\nexport function FormListener({\r\n onFormChange,\r\n fields,\r\n}: FormListenerProps) {\r\n const {\r\n values,\r\n setFieldValue,\r\n isValid,\r\n dirty,\r\n setFieldTouched,\r\n validateField,\r\n setFieldError,\r\n validate,\r\n } = useFormikContext();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n React.useEffect(() => {\r\n onFormChange(\r\n values,\r\n isValid,\r\n dirty,\r\n setFieldValue,\r\n setFieldTouched,\r\n validateField,\r\n setFieldError,\r\n validate,\r\n );\r\n return () => {};\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n ...fields.map(field => values[field]),\r\n isValid,\r\n dirty,\r\n ]);\r\n\r\n React.useEffect(() => {\r\n dispatch(actions.setNotSavedChanges(dirty));\r\n }, [actions, dirty, dispatch]);\r\n\r\n return null;\r\n}\r\nexport interface FieldChangeHandlerProps {\r\n key?: keyof T;\r\n value: any;\r\n shouldValidate?: boolean;\r\n}\r\nexport interface FieldHandlerProps {\r\n run?: boolean;\r\n fieldKey?: keyof T;\r\n fieldValue?: any;\r\n shouldValidate?: boolean;\r\n resetFieldState?: () => void;\r\n additionalFunc?: (value: any) => void;\r\n}\r\nexport function useFieldChangeHandler() {\r\n const { setFieldValue } = useFormikContext();\r\n const changeField = React.useCallback(\r\n (key, value, shouldValidate) => {\r\n if (key !== undefined) {\r\n setFieldValue(key.toString(), value, shouldValidate);\r\n }\r\n },\r\n [setFieldValue],\r\n );\r\n return [changeField];\r\n}\r\nexport function SubmittingHandler({\r\n value,\r\n resetSubmitting,\r\n}: {\r\n value: boolean;\r\n resetSubmitting: () => void;\r\n}) {\r\n const { setSubmitting } = useFormikContext();\r\n React.useEffect(() => {\r\n if (value) {\r\n setSubmitting(!value);\r\n resetSubmitting();\r\n }\r\n\r\n return () => {};\r\n }, [resetSubmitting, setSubmitting, value]);\r\n return null;\r\n}\r\nexport function FieldHandler({\r\n run,\r\n fieldKey,\r\n fieldValue,\r\n shouldValidate,\r\n resetFieldState,\r\n additionalFunc,\r\n}: FieldHandlerProps) {\r\n const [changeField] = useFieldChangeHandler();\r\n //const [doChange, setDoChange] = React.useState(run);\r\n React.useEffect(() => {\r\n if (run && fieldKey !== undefined) {\r\n changeField(fieldKey, fieldValue, shouldValidate);\r\n if (!!additionalFunc) additionalFunc({ [fieldKey]: fieldValue });\r\n if (!!resetFieldState) resetFieldState();\r\n //setDoChange(undefined);\r\n }\r\n return () => {};\r\n }, [\r\n changeField,\r\n run,\r\n fieldKey,\r\n shouldValidate,\r\n fieldValue,\r\n resetFieldState,\r\n additionalFunc,\r\n ]);\r\n return null;\r\n}\r\nexport interface SetValueProps {\r\n setValue?: (value: any) => void;\r\n resetValueKey?: () => void;\r\n fieldKey?: keyof T;\r\n}\r\nexport function FieldValue({\r\n setValue,\r\n resetValueKey,\r\n fieldKey,\r\n}: SetValueProps) {\r\n const { getFieldMeta } = useFormikContext();\r\n\r\n React.useEffect(() => {\r\n if (fieldKey !== undefined) {\r\n const meta = getFieldMeta(fieldKey.toString());\r\n if (!!setValue) setValue(meta.value);\r\n if (!!resetValueKey) resetValueKey();\r\n }\r\n return () => {};\r\n }, [fieldKey, getFieldMeta, setValue, resetValueKey]);\r\n return null;\r\n}\r\n","export enum AllowedSettings {\r\n 'DefaultQuickAssetSearchAction',\r\n 'UserFormatResult',\r\n 'InstrumentOptionsInCalender',\r\n 'CalendarPublicIntegrationFeed',\r\n 'AllowUsersToOpt_Out',\r\n 'InternalUserIdFieldLength',\r\n 'InternalUserId2FieldLength',\r\n 'ServiceGroupAdminsCanManageUsers',\r\n 'EnableServiceGroupAffilationManagment',\r\n 'FavIconImg',\r\n 'FavIconTitle',\r\n 'TopMenuBorder',\r\n 'TopCustomerLogo',\r\n 'TopCustomerLogoLink',\r\n 'DeleteEmailNotficationsMonth',\r\n\r\n 'AssetCatEnabled',\r\n 'TrainingActivationAllowedBySGAOnly',\r\n 'TrainingCreatedAsNotActiveByDefault',\r\n 'HideInstrumentRestrictions',\r\n 'EnableReservationSidePanel',\r\n 'PriceSheetBy',\r\n 'SGACreateProjects',\r\n 'UGFCreateProjects',\r\n 'HideRoomFloorTextBoxes',\r\n 'EnableInvoicePartialEvents',\r\n 'ISOCurrencySymbol',\r\n 'AccumulateNewChargesToExistingInvoice',\r\n 'CreateInovicesBy',\r\n 'CreateInvoiceSyncLimit',\r\n 'AllowMultiServiceGroupInvoices',\r\n 'ReservationUserGroupGroupByBudgetUserGroup',\r\n 'AllowedFeeTypes',\r\n 'InvoiceFromBatchScreenOnly',\r\n 'AllowExternalFundingInvoiceFinExport',\r\n 'AllowExternalFundingInvoicePdfExport',\r\n 'EnableFinAccountManagment',\r\n 'AllowUsersToViewCharges',\r\n 'GlobalInvoiceVAT',\r\n 'NamePrefixMandatory',\r\n 'AssetCatGroupEnabled',\r\n 'FinSystemInvoicesEnviroment',\r\n 'HideDymoPrinterMenu',\r\n 'WarnDefaultBudgetEnabled',\r\n 'DymoPrinterSupported',\r\n 'ZebraPrinterSupported',\r\n 'ShowDefaultBudgetOnUserProfile',\r\n 'BudgetLimited_ByUsers',\r\n 'AllowPartialMultipleProjectCharges',\r\n 'AllowPartialSingleProjectCharges',\r\n 'HideTrainingSessionsSettings',\r\n 'HideAssistedReservationsSettings',\r\n 'HideCalcPriceOnOfflineService',\r\n 'CrossInstrumentTraining',\r\n 'HideReferenceFieldInReservationDetails',\r\n 'MultipleInstrumentReservations',\r\n 'InstrumentAvailabilityDropDown',\r\n 'MinBarcodeLength',\r\n 'ShowDashboardAnnouncement',\r\n 'DashboardAnnouncement',\r\n 'RoomUserRoleEnabled',\r\n 'GlobalPriceSheetPeriods',\r\n 'AdvancedAssetSearchFilterAttributes',\r\n 'AdvancedAssetPublicSearchFilterAttributes',\r\n 'WarrantyEndDateVisibleAllUsers',\r\n 'OnlyAdminCanImportAssets',\r\n 'Help_Dashboard',\r\n 'AllowWorkflowBooking',\r\n 'MultipleTentativeReservationsUnderWorkflowBooking',\r\n 'CalendarTimelineEmptySlotClickSettings',\r\n 'NoDashboardRedirectOnCoreSelection',\r\n 'HideTopServiceGroupFilter',\r\n 'TerminateReservation',\r\n 'CalendarServicesPickerCapacity',\r\n 'MaximumTimelineRowsLimit',\r\n 'IntervalRefreshingCalendar',\r\n 'ShouldAllowCustomDashboards',\r\n 'EnableLegacyScheduler',\r\n 'EnableTwoDaysTimelineButton',\r\n 'AutomaticAssetNamings',\r\n 'EnableCustomDaysTimelineButton',\r\n 'DefaultCustomDaysTimelineValue',\r\n 'SkipCoreSelectionScreen',\r\n 'SchedulerReservationBodyTemplate',\r\n 'SchedulerReservationTooltipTemplate',\r\n 'AllowToRemoveFromMultipleReservation',\r\n 'DraftReservationsEnabled',\r\n 'UserReservationsRestricted',\r\n 'UsageKioskRoleEnabled',\r\n 'RequestMilestones',\r\n 'MandatoryOfflineServicesOnTrainingSignUps',\r\n 'NewUsersSignupForm',\r\n 'PurchaseOrderLengthSetting',\r\n 'HideLinkToRegistrationForm',\r\n 'SessionTimeout_Persistent',\r\n 'Help_Login',\r\n 'HideReservationCollaborators',\r\n 'LoginScreenCompanyLogo',\r\n 'LoginScreenCompanyLogoLink',\r\n 'LoginScreenCompanyLogoHeight',\r\n 'ShowForgotPassword',\r\n 'BrowseByUnit',\r\n 'MaxRecordsAllowedAssetImport',\r\n 'DoNotAllowReservationUserChangeByStaff',\r\n 'AssetImageSizeType',\r\n 'AllowToSwitchToOtherSites',\r\n 'ExternalSwitchTitle1',\r\n 'ExternalSwitchUrl1',\r\n 'ExternalSwitchTitle2',\r\n 'ExternalSwitchUrl2',\r\n 'ExternalSitesIcon',\r\n 'RequireSupplierExternalId',\r\n 'MaximumImagesPerOneUpload',\r\n 'MaxLoadedAssetImageMbSize',\r\n 'ModifyReservationNameForUsers',\r\n 'AllowLargeFilesUpload',\r\n 'AssetInventoryDaysWithoutVerification',\r\n 'QRCodeBaseLength', // Asset Related\r\n 'SideBarQuickActions',\r\n 'LimitServiceGroupLicenses',\r\n 'Help_ReservationHistory',\r\n 'Help_UsageHistory',\r\n 'Help_OtherServices',\r\n 'Help_Training',\r\n 'Help_Incidents',\r\n 'Help_ServiceGroupRegistration',\r\n /**\r\n * Returns True if the bool setting is turned on explicitly, otherwise returns false.\r\n * @param key\r\n * @returns boolean\r\n */\r\n}\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport * as React from 'react';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport clsx from 'clsx';\r\n\r\nexport interface InfoIconProps {\r\n title: NonNullable;\r\n className?: string;\r\n error?: boolean;\r\n}\r\n\r\nconst styles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n cursor: 'pointer',\r\n zIndex: 1,\r\n '&.tableInfo': {\r\n position: 'absolute',\r\n top: '15%',\r\n left: '0px',\r\n '&>svg': {\r\n width: 13,\r\n height: 13,\r\n },\r\n },\r\n },\r\n }),\r\n);\r\n// const StyledTooltip = styled(Tooltip)`\r\n// cursor: pointer;\r\n// z-index: 1;\r\n// &.tableInfo {\r\n// position: absolute;\r\n// top: 20%;\r\n// left: 0px;\r\n// }\r\n// `;\r\nexport const InfoIcon = (props: InfoIconProps) => {\r\n const { title, className, error } = props;\r\n const classes = styles();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * DatePeriods\r\n *\r\n */\r\nimport { Select, MenuItem, FormControl } from '@material-ui/core';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport StandardInput from '../BasicInputs/BaseInputs/StandardInput';\r\nimport { getPeriods } from '../pickers/DatePeriodsPicker';\r\n\r\n/**\r\n * The order of the values in this array does matter for backwards compatibility since there periods type picker used Integer Ids stored in a duplicate array and these might be saved in the saved query string filters for some users.\r\n *\r\n */\r\nexport const ALL_PERIOD_TYPES = [\r\n 'CustomDate',\r\n 'Today',\r\n 'TodayTomorrow',\r\n 'ThisWeek',\r\n 'NextWeek',\r\n 'ThisMonth',\r\n 'NextMonth',\r\n 'ThisQuarter',\r\n 'NextQuarter',\r\n 'ThisYear',\r\n 'NextYear',\r\n 'LastWeek',\r\n 'LastMonth',\r\n 'LastQuarter',\r\n 'LastYear',\r\n 'Tomorrow',\r\n 'Yesterday',\r\n] as const;\r\ntype PeriodTypesTyple = typeof ALL_PERIOD_TYPES;\r\nexport type PeriodTypes = PeriodTypesTyple[number];\r\nexport interface PeriodTypesEntity extends Entity {}\r\nexport const getPeriodTypesEntity = (\r\n valueType: PeriodTypes,\r\n): PeriodTypesEntity => {\r\n return getPeriods()\r\n .map(item => {\r\n return {\r\n Id: item.Id,\r\n Name: translations[item.Name],\r\n type: item.Name as PeriodTypes,\r\n };\r\n })\r\n .filter(value => {\r\n return value.type === valueType;\r\n })[0];\r\n};\r\nexport const getPeriodTypesEntityById = (\r\n id: PeriodTypes | number | undefined,\r\n): PeriodTypesEntity | undefined => {\r\n if (id === undefined) {\r\n return undefined;\r\n }\r\n const periodType: PeriodTypes | undefined =\r\n typeof id === 'number' ? ALL_PERIOD_TYPES[id] : id;\r\n\r\n return getPeriods()\r\n .map(item => {\r\n return {\r\n Id: item.Id,\r\n Name: translations[item.Name],\r\n type: item.Name as PeriodTypes,\r\n };\r\n })\r\n .filter(value => {\r\n return value.Id === periodType;\r\n })[0];\r\n};\r\nexport interface DatePeriodsProps {\r\n value: PeriodTypes;\r\n onChange: (value: PeriodTypes) => void;\r\n size?: 'medium' | 'small' | undefined;\r\n}\r\n\r\nexport function DatePeriods(props: DatePeriodsProps) {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n }\r\n value={props.value}\r\n onChange={e => props.onChange(e.target.value as PeriodTypes)}\r\n >\r\n {ALL_PERIOD_TYPES.map(key => (\r\n \r\n {t(key)}\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n","import * as Handlebar from 'handlebars';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport sanitizeHtml from 'sanitize-html';\r\n\r\nHandlebar.registerHelper('formatDate', (date, format) => {\r\n try {\r\n return dateUtils.format(date, format);\r\n } catch (error) {\r\n return error;\r\n }\r\n});\r\nHandlebar.registerHelper('sanitize', value => {\r\n try {\r\n return sanitizeHtml(value);\r\n } catch (error) {\r\n return error;\r\n }\r\n});\r\n\r\nconst customFormAst = Handlebar.parse(\r\n '{{#each CustomForm}}

{{Id}}: {{Value}}

{{/each}}',\r\n);\r\nexport const parse = (template: string | undefined) =>\r\n Handlebar.parse(template ?? '');\r\n/**\r\n * Compiles Handlebars template to be used in scheduler text templates.\r\n * * adds formatDate support\r\n * * adds support for {{CustomForm}} - by replacing it with the custom form - specific template\r\n * @param template user-input template text\r\n * @returns\r\n */\r\nexport const compileHandlebarsTemplate = (template?: string) => {\r\n if (template === undefined) {\r\n return undefined;\r\n }\r\n\r\n // first parse the template\r\n const ast = Handlebar.parse(template);\r\n\r\n // mutate - replace the CustomForm placeholder by expanding it using another AST\r\n new ReplaceMutatingVisitor('CustomForm', customFormAst).accept(ast);\r\n\r\n // finally compile the resulting AST\r\n const result = Handlebar.compile(ast);\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Mutates AST tree by replacing a given node.\r\n */\r\nclass ReplaceMutatingVisitor extends Handlebar.Visitor {\r\n _replacementStatement = null;\r\n _path = null;\r\n mutating = true;\r\n /**\r\n * Initializes the Visitor\r\n * @param path original Path name to replace the node at\r\n * @param replacementStatement replacement expression\r\n */\r\n constructor(path, replacementStatement) {\r\n super();\r\n this._path = path;\r\n this._replacementStatement = replacementStatement;\r\n }\r\n MustacheStatement(mustache: hbs.AST.MustacheStatement) {\r\n if ((mustache.path as hbs.AST.PathExpression)?.original === this._path) {\r\n return this._replacementStatement;\r\n }\r\n }\r\n}\r\n","import * as Handlebar from 'handlebars';\r\n\r\n/**\r\n * Extracts paths used in handlebars ast\r\n */\r\nexport class ExtractPathsVisitor extends Handlebar.Visitor {\r\n paths: string[] = [];\r\n MustacheStatement(mustache: hbs.AST.MustacheStatement) {\r\n // for our purpose the path can be either a direct property path or a handlebars helper function with property as a parameter\r\n const isHelperPath = mustache.params.length > 0;\r\n if (isHelperPath) {\r\n // extract all parameters that are PathExpression only (e.g. ignore LiteralExpression, etc.)\r\n const paths = mustache.params\r\n .filter(f => f.type === 'PathExpression')\r\n .map(f => (f as hbs.AST.PathExpression)?.original);\r\n this.paths.push(...paths);\r\n } else {\r\n this.paths.push((mustache.path as hbs.AST.PathExpression)?.original);\r\n }\r\n }\r\n}\r\n","import { IReservationHistoryDto } from 'api/odata/generated/entities/IReservationHistoryDto';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { intersection } from 'lodash';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n AuthenticatedUser,\r\n IIsAdminOrOwnerOfParams,\r\n} from 'types/AuthenticatedUser';\r\n\r\nexport function useReservationPermissions() {\r\n const user = useSelector(selectAuthenticatedUser);\r\n const roles: number[] | undefined = user?.Roles;\r\n\r\n const allowedToView = React.useCallback(\r\n (row: IReservationHistoryDto): boolean => {\r\n return canEditReservation(user, {\r\n ServiceGroupId: row.ServiceGroupId,\r\n ServiceId: row.EquipmentId,\r\n ServiceTypeId: ServiceType.Online,\r\n UserId: row.BookedById,\r\n });\r\n },\r\n [user],\r\n );\r\n const allowedroles = [\r\n Roles.Administrators,\r\n Roles.EquipmentAdministrator,\r\n Roles.GroupAdministrators,\r\n Roles.LabTech,\r\n ];\r\n const hasRolePermissions: boolean =\r\n intersection(roles, allowedroles).length > 0;\r\n return {\r\n hasRolePermissions,\r\n allowedToView,\r\n };\r\n}\r\n/**\r\n * Determines if current user has permissions to edit reservation\r\n * @param user authenticated user\r\n * @param row reservation like DTO\r\n * @returns true if current user is allowed to edit the reservation\r\n */\r\nexport function canEditReservation(\r\n user: AuthenticatedUser | undefined,\r\n row: IIsAdminOrOwnerOfParams,\r\n) {\r\n return user?.IsAdminOrOwnerOf(row) ?? false;\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { allowedToViewAlert } from 'app/permissions/WorkOrders/workOrdersPermissionUtils';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectGlobalServiceGroupFilter,\r\n selectglobalSettings,\r\n selectKnownModule,\r\n selectUserProfileSettings,\r\n} from 'app/slice/selectors';\r\nimport { RootState } from 'types';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { initialState } from '.';\r\nimport { getViewEndDate, getViewStartDate } from '../utils';\r\nimport { EventType, SchedulerState } from './types';\r\nimport { selectGlobalSetting } from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { MultipleInstrumentReservations } from 'enums/MultipleInstrumentReservations';\r\nimport { selectSelectedSavedView } from 'app/pages/SavedViewsPage/SavedViewPage/slice/selectors';\r\nimport { selectIsMobileView } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n compileHandlebarsTemplate,\r\n parse,\r\n} from '../components/event_text/handlebars';\r\nimport { ExtractPathsVisitor } from '../components/event_text/ExtractPathsVisitor';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { union } from 'lodash';\r\nimport { Identifiable } from 'types/common';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { canEditReservation } from 'app/permissions/Reservations/reservationPermissions';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IWorkingHoursDto } from 'api/odata/generated/entities/IWorkingHoursDto';\r\nimport { mapEvents } from '../utils/syncSchedulerEvents';\r\nimport { KnownModules } from 'types/KnownModules';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n (state.scheduler || initialState) as SchedulerState;\r\n\r\nexport const selectScheduler = createSelector([selectSlice], state => state);\r\n\r\nconst selectEvents = createSelector([selectScheduler], state => state.events);\r\n\r\nexport const selectSchedulerEvents = createSelector([selectScheduler], state =>\r\n state.viewState?.date === undefined\r\n ? undefined\r\n : state.events[state.viewState?.date],\r\n);\r\n\r\nexport const selectSchedulerOfflineHours = createSelector(\r\n [selectScheduler],\r\n state => state.offlineHours,\r\n);\r\nexport const selectTrainingSessions = createSelector(\r\n [selectScheduler],\r\n state => state.trainingSessions,\r\n);\r\n\r\nexport const selectSchedulerViewState = createSelector(\r\n [selectSlice],\r\n state => state.viewState,\r\n);\r\nexport const selectSchedulerDateTs = createSelector(\r\n [selectSchedulerViewState],\r\n state => state?.date,\r\n);\r\nexport const selectSchedulerViewType = createSelector(\r\n [selectSchedulerViewState],\r\n state => state?.viewType,\r\n);\r\n\r\nexport const selectSchedulerDate = createSelector(\r\n [selectSchedulerDateTs],\r\n state => (state === undefined ? undefined : dateUtils.parseISO(state)),\r\n);\r\n\r\nexport const selectNonWorkingHours = createSelector(\r\n [selectScheduler],\r\n state => state.nonWorkingHours,\r\n);\r\nexport const selectSchedulerTempEvents = createSelector(\r\n [selectSlice],\r\n state => state.tempReservations,\r\n);\r\n\r\nexport const selectLoadedServices = createSelector(\r\n [selectScheduler],\r\n state => state.selectedServices,\r\n);\r\nexport const selectSchedulerServicesLimit = createSelector(\r\n [selectLoadedServices, selectglobalSettings, selectSchedulerViewState],\r\n (services, globalSettings, viewState) => {\r\n const limitKey =\r\n viewState?.viewType === 'calendar'\r\n ? 'CalendarServicesPickerCapacity'\r\n : viewState?.viewType === 'timeline'\r\n ? 'MaximumTimelineRowsLimit'\r\n : undefined;\r\n const limitString =\r\n limitKey === undefined ? undefined : globalSettings.TryGet(limitKey);\r\n const limitNumber =\r\n limitString === undefined || limitString === null\r\n ? undefined\r\n : parseInt(limitString);\r\n return limitNumber;\r\n },\r\n);\r\nexport const selectSchedulerFilters = createSelector(\r\n [selectSlice],\r\n state => state.filters,\r\n);\r\nexport const selectWithReservationsOnly = createSelector(\r\n [selectSchedulerFilters],\r\n state =>\r\n (state?.['WithReservationsOnly']?.value as Identifiable)?.Id,\r\n);\r\nexport const selectSchedulerServicesLimitReached = createSelector(\r\n [selectLoadedServices, selectSchedulerServicesLimit],\r\n (services, limitNumber) =>\r\n services !== undefined &&\r\n limitNumber !== undefined &&\r\n services?.length > limitNumber,\r\n);\r\nexport const selectSchedulerSelectedServices = createSelector(\r\n [selectLoadedServices, selectSchedulerServicesLimit],\r\n (services, limitNumber) => {\r\n if (services === undefined) {\r\n return undefined;\r\n }\r\n if (limitNumber !== undefined && !isNaN(limitNumber)) {\r\n return services.slice(0, limitNumber);\r\n } else {\r\n return services;\r\n }\r\n },\r\n);\r\nexport const selectSchedulerDerivedServices = createSelector(\r\n [selectScheduler],\r\n state => state.derivedServices,\r\n);\r\n/**\r\n * map reservations in scheduler prasable format\r\n */\r\nconst selectMappedReservations = createSelector(\r\n [selectEvents, selectSchedulerDateTs],\r\n (items, date) =>\r\n date === undefined\r\n ? undefined\r\n : mapEvents('reservation', items[date], f => ({\r\n id: String(f.Id),\r\n reservation_id: f.Id,\r\n start_date: f.StartTime,\r\n end_date: f.EndTime,\r\n color: f.EquipmentColor ?? undefined,\r\n service_id: f.EquipmentId,\r\n service_name: f.EquipmentName,\r\n })),\r\n);\r\n/**\r\n * map offline hours in scheduler prasable format\r\n */\r\nconst selectMappedOfflineHours = createSelector(\r\n [selectSchedulerOfflineHours, selectSchedulerDateTs],\r\n (items, date) =>\r\n date === undefined\r\n ? undefined\r\n : mapEvents('offline', items[date], offline => ({\r\n id: `offline_${offline.Id}`,\r\n alert_id: offline.AlertId ?? undefined,\r\n\r\n start_date: offline.StartTime,\r\n end_date: offline.EndTime,\r\n service_id: offline.EquipmentId,\r\n service_name: offline.EquipmentName,\r\n offline_id: offline.Id,\r\n })),\r\n);\r\n/**\r\n * map training session in scheduler prasable format\r\n */\r\nconst selectMappedTrainingSessions = createSelector(\r\n [selectTrainingSessions, selectSchedulerDateTs],\r\n (items, date) =>\r\n date === undefined\r\n ? undefined\r\n : mapEvents('trainingsession', items[date], item => {\r\n const x = {\r\n id: `trainingsession_${item.Id}`,\r\n reservation_id: item.ReservationId ?? undefined,\r\n start_date: item.StartTime,\r\n end_date: item.EndTime,\r\n service_id: item.EquipmentId,\r\n service_name: item.EquipmentName,\r\n color: item.EquipmentColor ?? undefined,\r\n trainingsession_id: item.Id,\r\n };\r\n return x;\r\n }),\r\n);\r\n/**\r\n * combine all items shown as events\r\n */\r\nconst selectMapped = createSelector(\r\n [\r\n selectMappedReservations,\r\n selectMappedOfflineHours,\r\n selectMappedTrainingSessions,\r\n ],\r\n (a, b, c) =>\r\n a === undefined && b === undefined && c === undefined\r\n ? undefined\r\n : [...(a ?? []), ...(b ?? []), ...(c ?? [])],\r\n);\r\n/**\r\n * Selects combined reservations, training sessions & offline hours used to be parsed by the dhtmlx scheduler\r\n */\r\nexport const selectSchedulerParseEvents = createSelector(\r\n [selectMapped, selectAuthenticatedUser, selectSchedulerViewType],\r\n (mappedEvents, authenticatedUser, viewType) => {\r\n var items =\r\n viewType === 'calendar'\r\n ? mappedEvents?.filter(\r\n f =>\r\n !(\r\n f.type === 'reservation' &&\r\n (f.original as ICalendarReservationDto).TrainingSignUp === true\r\n ),\r\n )\r\n : mappedEvents;\r\n return items?.map(item => {\r\n const viewType = item.type;\r\n\r\n let readonly = true;\r\n let notClickable = false;\r\n switch (viewType) {\r\n case 'reservation':\r\n readonly =\r\n !canEditReservation(authenticatedUser, {\r\n ServiceId: item.original.EquipmentId ?? 0,\r\n ServiceTypeId: ServiceType.Online,\r\n ServiceGroupId: item.original.ServiceGroupId ?? 0,\r\n UserId: (item.original as ICalendarReservationDto).BookedById,\r\n }) ||\r\n (item.original as ICalendarReservationDto).Restricted === true ||\r\n (item.original as ICalendarReservationDto).TrainingSignUp === true;\r\n notClickable =\r\n !canEditReservation(authenticatedUser, {\r\n ServiceId: item.original.EquipmentId ?? 0,\r\n ServiceTypeId: ServiceType.Online,\r\n ServiceGroupId: item.original.ServiceGroupId ?? 0,\r\n UserId: (item.original as ICalendarReservationDto).BookedById,\r\n }) ||\r\n (item.original as ICalendarReservationDto).Restricted === true;\r\n break;\r\n case 'offline':\r\n readonly = notClickable = !allowedToViewAlert(authenticatedUser, {\r\n ReportedBy: (item.original as IWorkingHoursDto).BookedById,\r\n ServiceGroupId: (item.original as IWorkingHoursDto).ServiceGroupId,\r\n ServiceId: item.original.EquipmentId ?? 0,\r\n ServiceTypeId: ServiceType.Online,\r\n });\r\n }\r\n\r\n return {\r\n ...item,\r\n readonly: readonly,\r\n notClickable: notClickable,\r\n // disables start event resize on timeline view\r\n _no_resize_end: readonly,\r\n // disabled end event drag on timelene view\r\n _no_resize_start: readonly,\r\n // disables drag on matrix view\r\n _no_drag_move: readonly,\r\n };\r\n });\r\n },\r\n);\r\nexport const selectSchedulerServices = createSelector(\r\n [\r\n selectSchedulerSelectedServices,\r\n selectSchedulerDerivedServices,\r\n selectGlobalServiceGroupFilter,\r\n selectWithReservationsOnly,\r\n\r\n selectMapped,\r\n ],\r\n (\r\n selectedServices,\r\n derivedServices,\r\n serviceGroups,\r\n WithReservationsOnly,\r\n events,\r\n ) => {\r\n // use selectedServices if case a service have been selected\r\n // if no service was selected use the services of reservations returned by the filter\r\n const services =\r\n (selectedServices ?? []).length > 0 ? selectedServices : derivedServices;\r\n\r\n // show only services of the selected top service group filter if it has been applied\r\n const intermediate1 = filterServicesByServiceGroups(\r\n serviceGroups,\r\n services,\r\n );\r\n\r\n // applies WithReservationsOnly filter to the services\r\n const intermediate2 = filterServicesByEvents(\r\n events,\r\n intermediate1,\r\n WithReservationsOnly,\r\n );\r\n\r\n return intermediate2;\r\n },\r\n);\r\nexport const selectSchedulerPreviousViewState = createSelector(\r\n [selectSlice],\r\n state => state.previousViewState,\r\n);\r\nconst instrumentMultipleEnabled = state =>\r\n selectGlobalSetting(state, AllowedSettings.MultipleInstrumentReservations);\r\n\r\nexport const selectMultipleModeState = createSelector(\r\n [\r\n instrumentMultipleEnabled,\r\n selectSelectedSavedView,\r\n selectUserProfileSettings,\r\n ],\r\n (multipleInstrumentsSetting, currentSelected, userProfile) => {\r\n if (\r\n multipleInstrumentsSetting !== undefined &&\r\n MultipleInstrumentReservations[multipleInstrumentsSetting] !==\r\n MultipleInstrumentReservations.NotAllowed\r\n ) {\r\n // todo:\r\n\r\n const instrumentMultipleEnabled =\r\n userProfile.GetSettingValueBy(\r\n (f: { Key: string }) =>\r\n f.Key.toLowerCase() === 'BookMultipleInstruments'.toLowerCase(),\r\n )?.IsMultiple ?? undefined;\r\n if (!!currentSelected) {\r\n return currentSelected.Multiple;\r\n } else if (instrumentMultipleEnabled !== undefined) {\r\n return instrumentMultipleEnabled;\r\n } else {\r\n return (\r\n MultipleInstrumentReservations[multipleInstrumentsSetting] ===\r\n MultipleInstrumentReservations.AllowedDefaultMultiple\r\n );\r\n }\r\n } else {\r\n return undefined;\r\n }\r\n },\r\n);\r\n\r\nexport const selectSchedulerViewStartDate = createSelector(\r\n [selectSchedulerViewState],\r\n state =>\r\n state === undefined\r\n ? undefined\r\n : getViewStartDate(state.viewLength, state.date, state.customStart),\r\n);\r\nexport const selectSchedulerViewEndDate = createSelector(\r\n [selectSchedulerViewState],\r\n state =>\r\n state === undefined\r\n ? undefined\r\n : getViewEndDate(\r\n state.viewLength,\r\n state.date,\r\n state.customDays,\r\n state.customStart,\r\n ),\r\n);\r\nexport const selectSchedulerViewCustomDays = createSelector(\r\n [selectSchedulerViewState],\r\n state => state?.customDays,\r\n);\r\nexport const selectSchedulerViewCustomStart = createSelector(\r\n [selectSchedulerViewState],\r\n state => state?.customStart,\r\n);\r\nexport const selectNotUseLocation = createSelector(\r\n [selectSlice],\r\n state => state.notUseLocation,\r\n);\r\nexport const selectEmptySlotAdminClick = createSelector(\r\n [selectScheduler],\r\n state => state.emptySlotAdminClick,\r\n);\r\nexport const selectSchedulerNewEventServices = createSelector(\r\n [\r\n selectSchedulerViewState,\r\n selectSchedulerTempEvents,\r\n selectSchedulerSelectedServices,\r\n selectSchedulerDerivedServices,\r\n selectIsMobileView,\r\n ],\r\n (\r\n viewState,\r\n tempReservation,\r\n selectedServices,\r\n derivedServices,\r\n isMobileView,\r\n ) => {\r\n // timeline + daily calendar (unit) has separate row/column for each service\r\n // so in this state new event is placed directly on an instrument\r\n const singleServiceEvent =\r\n viewState?.viewType === 'timeline' ||\r\n (viewState?.viewType === 'calendar' &&\r\n viewState.viewLength === 'day' &&\r\n !isMobileView);\r\n\r\n const getSingleServiceEventServices = () => {\r\n // try looking up both directly selected services and services derived from the events shown on the calendar when no service is directly selected\r\n const s =\r\n selectedServices?.find(f => f.Id === tempReservation?.service_id) ??\r\n derivedServices?.find(f => f.Id === tempReservation?.service_id);\r\n if (s === undefined) {\r\n return [];\r\n } else {\r\n return [s];\r\n }\r\n };\r\n const services =\r\n (singleServiceEvent\r\n ? getSingleServiceEventServices()\r\n : selectedServices) ?? [];\r\n\r\n return services;\r\n },\r\n);\r\nexport const selectTwoDaysTimelineButtonEnabled = createSelector(\r\n [selectglobalSettings],\r\n globalSettings => {\r\n return globalSettings.GetBoolean('EnableTwoDaysTimelineButton');\r\n },\r\n);\r\nexport const selectCustomDaysTimelineButtonEnabled = createSelector(\r\n [selectglobalSettings],\r\n globalSettings => {\r\n return globalSettings.GetBoolean('EnableCustomDaysTimelineButton');\r\n },\r\n);\r\nexport const selectSelectedReservationEvents = createSelector(\r\n [selectSlice],\r\n state => state.selectedReservationEvents,\r\n);\r\n\r\nexport const selectDefaultCustomDaysTimelineValue = createSelector(\r\n [selectglobalSettings],\r\n globalSettings => {\r\n const daysString = globalSettings.TryGet('DefaultCustomDaysTimelineValue');\r\n const daysNumber =\r\n daysString === undefined || daysString === null\r\n ? undefined\r\n : parseInt(daysString);\r\n return daysNumber;\r\n },\r\n);\r\n\r\nexport const selectSchedulerReservationBodyTemplate = createSelector(\r\n [\r\n (state: RootState) =>\r\n selectGlobalSetting(\r\n state,\r\n AllowedSettings.SchedulerReservationBodyTemplate,\r\n ),\r\n ],\r\n f => compileHandlebarsTemplate(f),\r\n);\r\n\r\nexport const selectSchedulerReservationTooltipTemplate = createSelector(\r\n [\r\n (state: RootState) =>\r\n selectGlobalSetting(\r\n state,\r\n AllowedSettings.SchedulerReservationTooltipTemplate,\r\n ),\r\n ],\r\n f => compileHandlebarsTemplate(f),\r\n);\r\n\r\nexport const selectCalendarReservationColumns = createSelector(\r\n [\r\n (state: RootState) =>\r\n selectGlobalSetting(\r\n state,\r\n AllowedSettings.SchedulerReservationBodyTemplate,\r\n ),\r\n\r\n (state: RootState) =>\r\n selectGlobalSetting(\r\n state,\r\n AllowedSettings.SchedulerReservationTooltipTemplate,\r\n ),\r\n (state: RootState) =>\r\n selectKnownModule(state, KnownModules.EquipmentAssemblies),\r\n (state: RootState) =>\r\n selectGlobalSetting(state, AllowedSettings.AllowWorkflowBooking),\r\n ],\r\n (t1, t2, EquipmentAssemblies, workflowBooking) => {\r\n const y = new ExtractPathsVisitor();\r\n y.accept(parse(t1));\r\n y.accept(parse(t2));\r\n const reservationHistorySelectArray: Array<\r\n keyof ICalendarReservationDto\r\n > = [\r\n 'Id',\r\n 'StartTime',\r\n 'EndTime',\r\n 'EquipmentId',\r\n 'EquipmentName',\r\n 'ServiceGroupId',\r\n 'EquipmentColor',\r\n 'BookedBy',\r\n 'BookedById',\r\n 'StatusId',\r\n 'Tutoring',\r\n 'Restricted',\r\n 'TrainingSignUp',\r\n 'FullDayReservation',\r\n ];\r\n if (EquipmentAssemblies) {\r\n reservationHistorySelectArray.push('TopAssemblyReservationId');\r\n }\r\n if (workflowBooking) {\r\n reservationHistorySelectArray.push('WorkFlowBookingName');\r\n }\r\n const p = union(reservationHistorySelectArray, y.paths);\r\n return p;\r\n },\r\n);\r\nfunction filterServicesByServiceGroups(\r\n serviceGroups?: Identifiable[],\r\n services?: IServiceFilterDto[],\r\n) {\r\n const serviceGroupIds = (serviceGroups ?? [])?.map(f => f.Id);\r\n return serviceGroupIds.length === 0\r\n ? services\r\n : services?.filter(\r\n service =>\r\n service.ServiceGroupId === undefined ||\r\n serviceGroupIds.includes(service.ServiceGroupId),\r\n );\r\n}\r\n\r\nfunction filterServicesByEvents(\r\n events: Array<{ type: EventType; service_id: number }> | undefined,\r\n services: IServiceFilterDto[] | undefined,\r\n WithReservationsOnly: boolean | undefined,\r\n) {\r\n if (WithReservationsOnly === true) {\r\n const servicesWithEvents = new Set(\r\n events\r\n ?.filter(f => f.type === 'reservation' || f.type === 'trainingsession')\r\n .map(f => f.service_id),\r\n );\r\n\r\n const xx = services?.filter(service => servicesWithEvents.has(service.Id));\r\n return xx;\r\n } else {\r\n return services;\r\n }\r\n}\r\n\r\nexport const selectSchedulerLoadingEvents = createSelector(\r\n [selectSlice],\r\n state => state.loadingEvents,\r\n);\r\n\r\nexport const selectTimelineGroupBy = createSelector(\r\n [selectSchedulerViewState],\r\n state => state?.groupBy,\r\n);\r\n\r\nexport const selectExportToPDF = createSelector(\r\n [selectSlice],\r\n state => state.exportToPDF,\r\n);\r\n","/**\r\n * Represents Date with representation info - e.g. representation: 'complete' | 'date' | 'time'\r\n */\r\nexport class CustomDate extends Date {\r\n representation: DateType = 'date';\r\n constructor(value?: number | string | Date, type?: DateType) {\r\n super(value ?? new Date());\r\n this.representation = type ?? 'complete';\r\n }\r\n}\r\n\r\nexport type DateType = 'complete' | 'date' | 'time';\r\n","import { ListMessagesProps, OpenDetailsProps } from './Actions';\r\n\r\nexport enum SnackBarActionType {\r\n refreshTable = 1,\r\n}\r\nexport enum SnackBarMessageType {\r\n openSidepanelDetails = 1,\r\n showLinkMessage = 2,\r\n HTML = 3,\r\n messageList = 4,\r\n}\r\nexport type SnackBarMessageProps = OpenDetailsProps | ListMessagesProps;\r\n","/**\r\n *\r\n * auto generated interface for Bookit.Data.RequiredTypes\r\n *\r\n */\r\n\r\nexport enum RequiredTypes {\r\n Optional = 0,\r\n User = 1,\r\n Admin = 2,\r\n Conditional = 3,\r\n}\r\nexport type RequiredTypesUnion = keyof typeof RequiredTypes;\r\nexport const RequiredTypesUnionArray: Array = [\r\n 'Optional',\r\n 'User',\r\n 'Admin',\r\n 'Conditional',\r\n];\r\n","/**\r\n *\r\n * auto generated interface for Bookit.Data.DisplayTypes\r\n *\r\n */\r\n\r\nexport enum DisplayTypes {\r\n AlwaysVisible = 0,\r\n VisibleToAdminOnly = 1,\r\n VisibleToUserOnDoneRequest = 2,\r\n}\r\nexport type DisplayTypesUnion = keyof typeof DisplayTypes;\r\nexport const DisplayTypesUnionArray: Array = [\r\n 'AlwaysVisible',\r\n 'VisibleToAdminOnly',\r\n 'VisibleToUserOnDoneRequest',\r\n];\r\n","import { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport {\r\n createOptions,\r\n getDropDownInitValue,\r\n} from './CustomFormFields/CustomFormDropDown';\r\nimport * as Yup from 'yup';\r\nimport * as React from 'react';\r\nimport { ObjectShape } from 'yup/lib/object';\r\nimport { RequiredTypes } from 'api/odata/generated/enums/RequiredTypes';\r\nimport { Entity } from 'types/common';\r\nimport { DisplayTypes } from 'api/odata/generated/enums/DisplayTypes';\r\nimport { isEmptyOrWhitespace, isNullOrUndefined } from 'utils/typeUtils';\r\nimport { lookup } from 'mime-types';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectForbiddenFileExtensions,\r\n selectUploadFileSizeLimit,\r\n} from 'app/slice/selectors';\r\nimport { differenceWith } from 'lodash';\r\nimport {\r\n IServiceRequestTableColumnModel,\r\n IServiceRequestTableRowValueModel,\r\n} from 'app/pages/Samples/RequestSamplesPage/slice/types';\r\nimport { IFormFieldOptionDto } from 'api/odata/generated/entities/IFormFieldOptionDto';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\n\r\nexport interface IFormFileValue {\r\n Id: number;\r\n Value: string | null;\r\n DisplayValue?: string | null;\r\n Size: number | null;\r\n PostedFile: File | null;\r\n}\r\nexport function instanceOfIFormValueType(\r\n objects: any,\r\n): objects is IFormFileValue[] {\r\n const members = ['Id', 'Value', 'DisplayValue', 'Size', 'PostedFile'];\r\n return (\r\n Array.isArray(objects) &&\r\n objects.every(object => members.every(member => member in object))\r\n );\r\n}\r\nexport const formFileSchema: Yup.SchemaOf = Yup.object({\r\n Id: Yup.number().default(-1),\r\n Value: Yup.string().nullable().default(null),\r\n DisplayValue: Yup.string().nullable(),\r\n Size: Yup.number().nullable(true).default(0),\r\n PostedFile: Yup.mixed().nullable(true).default(null),\r\n});\r\nexport const formValueSchema: Yup.SchemaOf = Yup.object({\r\n Id: Yup.number().default(-1),\r\n Value: Yup.string().default('').nullable(),\r\n DisplayValue: Yup.string().nullable().default(null),\r\n FormFieldId: Yup.number().default(-1),\r\n Readonly: Yup.boolean().default(false),\r\n SourceValueId: Yup.number().nullable(true).notRequired().default(null),\r\n AlertId: Yup.number().nullable(true).notRequired().default(null),\r\n AlertTypeId: Yup.number().nullable(true).notRequired().default(null),\r\n CustomFormId: Yup.number().nullable().default(null),\r\n CustomFormName: Yup.string().nullable().default(null),\r\n RequestId: Yup.number().nullable().default(null),\r\n ReservationId: Yup.number().nullable().default(null),\r\n ExperimentItemId: Yup.number().nullable().default(null),\r\n BudgetExperimentId: Yup.number().nullable().default(null),\r\n ServiceGroupUserId: Yup.number().nullable().default(null),\r\n ServiceGroupId: Yup.number().nullable().default(null),\r\n});\r\n\r\nexport const ParseFormFieldEnums = (formFields: IFormFieldDto[]) =>\r\n formFields.forEach(ff => {\r\n ff.Required = RequiredTypes[ff.Required.toString()];\r\n });\r\nexport const DeserializeValue = (\r\n formField: IFormFieldDto,\r\n formValue: IFormValueDto | null,\r\n) => {\r\n switch (formField.Type) {\r\n case 'ShortText':\r\n case 'Email':\r\n case 'Number':\r\n case 'PositiveNumber':\r\n case 'RichText':\r\n case 'MultipleAnswersQuestion':\r\n case 'RadioButtons':\r\n if (\r\n formValue &&\r\n formValue.Value &&\r\n !isEmptyOrWhitespace(formValue.Value)\r\n ) {\r\n return formValue.Value;\r\n }\r\n return null;\r\n case 'Date':\r\n if (\r\n formValue &&\r\n formValue.Value &&\r\n !isEmptyOrWhitespace(formValue.Value)\r\n ) {\r\n return dateUtils.tryParse(formValue.Value);\r\n }\r\n return null;\r\n // case 'AlphanumericWithDashes':\r\n // return getAlphaNumericValue(formValue);\r\n case 'CheckBox':\r\n case 'Disclaimer':\r\n if (\r\n formValue &&\r\n formValue.Value &&\r\n !isEmptyOrWhitespace(formValue.Value)\r\n ) {\r\n return formValue.Value.toLowerCase() === 'true';\r\n }\r\n return false;\r\n case 'DropDownList':\r\n case 'UserSelection':\r\n if (\r\n formValue &&\r\n formValue.Value &&\r\n !isEmptyOrWhitespace(formValue.Value)\r\n ) {\r\n const options = createOptions(formField);\r\n let ddlValue = getDropDownInitValue(\r\n formValue.Value ?? undefined,\r\n formField.IsMultiple,\r\n options,\r\n );\r\n return formField.IsMultiple ? ddlValue : ddlValue[0];\r\n } else {\r\n return formField.IsMultiple ? [] : null;\r\n }\r\n case 'FormSection':\r\n return null;\r\n default:\r\n return null;\r\n }\r\n};\r\nexport type CustomFormValueType =\r\n | string\r\n | Date\r\n | number\r\n | boolean\r\n | IFormFileValue\r\n | Entity\r\n | Array>;\r\nexport const SerializeValue = (\r\n formField: IFormFieldDto,\r\n formValue: CustomFormValueType,\r\n): string | null => {\r\n if (formValue === null || formValue === undefined) {\r\n return null;\r\n }\r\n switch (formField.Type) {\r\n case 'CheckBox':\r\n case 'Disclaimer':\r\n return (formValue as boolean).toString();\r\n case 'Date':\r\n return (\r\n dateUtils.tryFormatIso(formValue, {\r\n format: 'basic',\r\n representation: 'date',\r\n }) ?? null\r\n );\r\n\r\n case 'Email':\r\n case 'Number':\r\n case 'PositiveNumber':\r\n case 'RichText':\r\n case 'ShortText':\r\n case 'MultipleAnswersQuestion':\r\n case 'RadioButtons':\r\n return typeof formValue === 'string' && isEmptyOrWhitespace(formValue)\r\n ? ''\r\n : formValue.toString();\r\n case 'File':\r\n if (instanceOfIFormValueType(formValue)) {\r\n let fileValue = formValue as IFormFileValue[];\r\n if (fileValue.length > 0) {\r\n return formField.IsMultiple\r\n ? fileValue\r\n .filter(f => f.Value !== null)\r\n .map(v => v.Value)\r\n .join(',')\r\n : fileValue[0].Value ?? '';\r\n } else {\r\n return '';\r\n }\r\n }\r\n break;\r\n case 'FormSection':\r\n return '';\r\n case 'DropDownList':\r\n case 'UserSelection':\r\n if (formValue === null || formValue === undefined) {\r\n return '';\r\n } else {\r\n if (Array.isArray(formValue)) {\r\n return (formValue as Entity[]).map(f => f.Id).join(',');\r\n } else {\r\n return (formValue as Entity).Id.toString();\r\n }\r\n }\r\n default:\r\n return '';\r\n }\r\n return null;\r\n};\r\nexport function getFieldSchema(\r\n formField: IFormFieldDto,\r\n isAdmin: boolean,\r\n fileSize: number,\r\n notAllowedExt: string[],\r\n) {\r\n switch (formField.Type) {\r\n case 'MultipleAnswersQuestion':\r\n let result = Yup.string()\r\n .nullable()\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.string()\r\n\r\n .required(`${formField.Label} answer is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: 'required',\r\n message: `${formField.Label} answer is required.`,\r\n test: (value, context) => {\r\n if (isEmptyOrWhitespace(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n return result;\r\n case 'RadioButtons':\r\n let radioButtons = Yup.string()\r\n .nullable()\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.string()\r\n\r\n .required(`${formField.Label} radio is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: 'required',\r\n message: `${formField.Label} radio is required.`,\r\n test: (value, context) => {\r\n if (isEmptyOrWhitespace(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n return radioButtons;\r\n case 'File':\r\n let resultFile = Yup.array()\r\n .nullable()\r\n .of(formFileSchema)\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.array()\r\n .of(formFileSchema)\r\n .required(`${formField.Label} file is required.`)\r\n .min(1, `${formField.Label} file is required.`),\r\n },\r\n )\r\n .test({\r\n name: 'required',\r\n message: `${formField.Label} file is required.`,\r\n test: (value, context) => {\r\n if (value === undefined || value === null || value.length === 0) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: true,\r\n })\r\n .test({\r\n name: 'size',\r\n message: `${formField.Label} file is to large.`,\r\n test: (value, context) => {\r\n if (value !== undefined && value !== null && value.length > 0) {\r\n let files = value as IFormFileValue[];\r\n if (files.length > 0) {\r\n return files.every(f => f.Size == null || f.Size <= fileSize);\r\n }\r\n }\r\n return true;\r\n },\r\n exclusive: true,\r\n })\r\n .test({\r\n name: 'type',\r\n message: `${formField.Label} file type is forbidden.`,\r\n test: (value, context) => {\r\n if (value !== undefined && value !== null && value.length > 0) {\r\n let files = value as IFormFileValue[];\r\n if (files.length > 0) {\r\n let blockedTypes = notAllowedExt.map(f => lookup(f));\r\n let allowedExt =\r\n formField.Options === null\r\n ? []\r\n : formField.Options.split(',').map(f => lookup(f));\r\n return files.every(f => {\r\n if (f.PostedFile !== null) {\r\n return (\r\n !blockedTypes.includes(f.PostedFile.type) &&\r\n (allowedExt.length === 0 ||\r\n allowedExt.includes(f.PostedFile.type))\r\n );\r\n } else {\r\n return true;\r\n }\r\n });\r\n }\r\n }\r\n return true;\r\n },\r\n exclusive: true,\r\n });\r\n return resultFile;\r\n case 'Date':\r\n let resultDate = getCustomFormDateSchema(formField, isAdmin);\r\n return resultDate;\r\n case 'Email':\r\n let resultEmail = Yup.string()\r\n .nullable()\r\n .email(`${formField.Label} - Email format is not valid`)\r\n .max(\r\n formField.SizeLimit,\r\n `Maximum length of this field is ${formField.SizeLimit}`,\r\n )\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.string()\r\n .max(\r\n formField.SizeLimit,\r\n `Maximum length of this field is ${formField.SizeLimit}`,\r\n )\r\n .required(`${formField.Label} email is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} email is required.`,\r\n test: (value, context) => {\r\n if (isEmptyOrWhitespace(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n return resultEmail;\r\n case 'ShortText':\r\n let resultText = Yup.string()\r\n .nullable()\r\n .max(\r\n formField.SizeLimit,\r\n `${formField.Label} must be ${formField.SizeLimit} characters long.`,\r\n )\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.string()\r\n .max(\r\n formField.SizeLimit,\r\n `${formField.Label} must be ${formField.SizeLimit} characters long.`,\r\n )\r\n .required(`${formField.Label} text is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} text is required.`,\r\n test: (value, context) => {\r\n if (isEmptyOrWhitespace(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n // if (formField.Required === 'Conditional') {\r\n // if (formField.RequiredFieldToCompare !== null) {\r\n // resultText.when((formField.RequiredFieldToCompare ?? formField.DependencyFieldId ?? 'N/A').toString(), {\r\n // is: value => isRequired(formField, isAdmin, groupAdmin, value),\r\n // then: Yup.string()\r\n // .max(\r\n // formField.SizeLimit,\r\n // `${formField.Label} must be ${formField.SizeLimit} characters long.`,\r\n // )\r\n // .required(`${formField.Label} text is required.`),\r\n // });\r\n // }\r\n // } else if (isRequired(formField, isAdmin, groupAdmin, null)) {\r\n // resultText = resultText.required(\r\n // `${formField.Label} text is required.`,\r\n // );\r\n // } else if (\r\n // formField.DependencyFieldId !== null &&\r\n // formField.DependencyValue !== null\r\n // ) {\r\n // resultText.when(formField.DependencyFieldId.toString(), {\r\n // is: value => requiredByDependency(formField, value),\r\n // then: Yup.string()\r\n // .max(\r\n // formField.SizeLimit,\r\n // `${formField.Label} must be ${formField.SizeLimit} characters long.`,\r\n // )\r\n // .required(`${formField.Label} text is required.`),\r\n // otherwise: Yup.string()\r\n // .nullable()\r\n // .max(\r\n // formField.SizeLimit,\r\n // `${formField.Label} must be ${formField.SizeLimit} characters long.`,\r\n // ),\r\n // });\r\n // } else {\r\n // resultText = resultText.notRequired();\r\n // }\r\n return resultText;\r\n case 'RichText':\r\n let resultRichText = Yup.string()\r\n .nullable()\r\n .max(\r\n formField.SizeLimit,\r\n `${formField.Label} must be ${formField.SizeLimit} characters long.`,\r\n )\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.string()\r\n .max(\r\n formField.SizeLimit,\r\n `${formField.Label} must be ${formField.SizeLimit} characters long.`,\r\n )\r\n .required(`${formField.Label} rich text is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} rich text is required.`,\r\n test: (value, context) => {\r\n if (isEmptyOrWhitespace(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n return resultRichText;\r\n case 'Number':\r\n let resultNumber = Yup.number()\r\n .nullable()\r\n .max(\r\n formField.SizeLimit,\r\n `${formField.Label} must be less than ${formField.SizeLimit} .`,\r\n )\r\n .min(\r\n -formField.SizeLimit,\r\n `${formField.Label} must be greater than ${formField.SizeLimit} .`,\r\n )\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.number()\r\n .max(\r\n formField.SizeLimit,\r\n `${formField.Label} must be less than ${formField.SizeLimit} .`,\r\n )\r\n .min(\r\n -formField.SizeLimit,\r\n `${formField.Label} must be greater than ${formField.SizeLimit} .`,\r\n )\r\n .required(`${formField.Label} number is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} number is required.`,\r\n test: (value, context) => {\r\n if (isNullOrUndefined(value) || isNaN(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n return resultNumber;\r\n case 'PositiveNumber':\r\n let resultPosNumber = Yup.number()\r\n .nullable()\r\n .max(\r\n formField.SizeLimit,\r\n `${formField.Label} must be less than ${formField.SizeLimit} .`,\r\n )\r\n .min(\r\n 0,\r\n `${formField.Label} must be greater than ${formField.SizeLimit} .`,\r\n )\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.number()\r\n .max(\r\n formField.SizeLimit,\r\n `${formField.Label} must be less than ${formField.SizeLimit} .`,\r\n )\r\n .min(\r\n 0,\r\n `${formField.Label} must be greater than ${formField.SizeLimit} .`,\r\n )\r\n .required(`${formField.Label} number is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} number is required.`,\r\n test: (value, context) => {\r\n if (isNullOrUndefined(value) || isNaN(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n return resultPosNumber;\r\n case 'Disclaimer':\r\n let resultDesc = Yup.boolean()\r\n .default(false)\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} check is required`,\r\n test: (value, context) => value === true,\r\n exclusive: true,\r\n });\r\n return resultDesc;\r\n case 'CheckBox':\r\n let resultCheck = Yup.boolean()\r\n .default(false)\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.boolean()\r\n .default(false)\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} check is required`,\r\n test: (value, context) => value === true,\r\n exclusive: true,\r\n }),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} rich text is required.`,\r\n test: (value, context) => {\r\n if (isNullOrUndefined(value) || value === false) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n return resultCheck;\r\n case 'DropDownList':\r\n case 'UserSelection':\r\n let singleResult = Yup.mixed()\r\n .nullable()\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.mixed()\r\n .required(`${formField.Label} select option is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} select option is required.`,\r\n test: (value, context) => {\r\n if (isNullOrUndefined(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n let multipleResult = Yup.array()\r\n .of(Yup.mixed())\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.array()\r\n .of(Yup.mixed())\r\n .min(1)\r\n .required(`${formField.Label} select option is required.`),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} select option is required.`,\r\n test: (value, context) => {\r\n if (isNullOrUndefined(value) || value.length === 0) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n // if (formField.Required === 'Conditional') {\r\n // if (formField.RequiredFieldToCompare !== null) {\r\n // if (formField.IsMultiple) {\r\n // multipleResult.when(formField.RequiredFieldToCompare.toString(), {\r\n // is: value =>\r\n // value !== null &&\r\n // value !== undefined &&\r\n // (value as Entity[]).some(\r\n // f => f.Id === formField.RequiredValueToCompare ?? '',\r\n // ),\r\n // then: Yup.array()\r\n // .of(Yup.mixed())\r\n // .required(`${formField.Label} select option is required.`),\r\n // otherwise: Yup.array()\r\n // .of(Yup.mixed())\r\n // .nullable(true)\r\n // .notRequired(),\r\n // });\r\n // } else {\r\n // singleResult.when(formField.RequiredFieldToCompare.toString(), {\r\n // is: value =>\r\n // value !== null &&\r\n // value !== undefined &&\r\n // ((value as Entity).Id ===\r\n // formField.RequiredValueToCompare ??\r\n // ''),\r\n // then: Yup.mixed().required(\r\n // `${formField.Label} select option is required.`,\r\n // ),\r\n // otherwise: Yup.mixed().nullable(true).notRequired(),\r\n // });\r\n // }\r\n // }\r\n // } else if (isRequired(formField, isAdmin, null)) {\r\n // if (formField.IsMultiple) {\r\n // multipleResult = multipleResult.required(\r\n // `${formField.Label} select option is required.`,\r\n // );\r\n // } else {\r\n // singleResult = singleResult.required(\r\n // `${formField.Label} select option is required.`,\r\n // );\r\n // }\r\n // } else if (\r\n // formField.DependencyFieldId !== null &&\r\n // formField.DependencyValue !== null\r\n // ) {\r\n // if (formField.IsMultiple) {\r\n // multipleResult.when(formField.DependencyFieldId.toString(), {\r\n // is: value => isDependencyVisible(formField, value),\r\n // then: Yup.array()\r\n // .of(Yup.mixed())\r\n // .required(`${formField.Label} select option is required.`),\r\n // otherwise: Yup.array().of(Yup.mixed()).nullable(true).notRequired(),\r\n // });\r\n // } else {\r\n // singleResult.when(formField.DependencyFieldId.toString(), {\r\n // is: value => isDependencyVisible(formField, value),\r\n // then: Yup.mixed().required(\r\n // `${formField.Label} select option is required.`,\r\n // ),\r\n // otherwise: Yup.mixed().nullable(true).notRequired(),\r\n // });\r\n // }\r\n // } else {\r\n // if (formField.IsMultiple) {\r\n // multipleResult = multipleResult.nullable(true).notRequired();\r\n // } else {\r\n // singleResult = singleResult.nullable(true).notRequired();\r\n // }\r\n // }\r\n if (formField.IsMultiple) {\r\n return multipleResult;\r\n } else {\r\n return singleResult;\r\n }\r\n }\r\n let def = Yup.string().nullable();\r\n return def;\r\n}\r\n\r\nfunction getCustomFormDateSchema(\r\n formField: Pick<\r\n IFormFieldDto,\r\n | 'Id'\r\n | 'Label'\r\n | 'Required'\r\n | 'DependencyFieldId'\r\n | 'DependencyValue'\r\n | 'DependencyMultiple'\r\n | 'DependencyVisibility'\r\n | 'RequiredFieldToCompare'\r\n | 'RequiredValueToCompare'\r\n >,\r\n isAdmin: boolean,\r\n) {\r\n return Yup.date()\r\n .nullable()\r\n .when(\r\n [\r\n (formField.RequiredFieldToCompare ?? 'NA').toString(),\r\n (formField.DependencyFieldId ?? 'NA').toString(),\r\n ],\r\n {\r\n is: value => isRequired(formField, isAdmin, value),\r\n then: Yup.date()\r\n .required(`${formField.Label} date is required.`)\r\n .nullable(),\r\n },\r\n )\r\n .test({\r\n name: formField.Id.toString(),\r\n message: `${formField.Label} date is required.`,\r\n test: (value, context) => {\r\n if (isNullOrUndefined(value)) {\r\n return isRequired(formField, isAdmin, null) === false;\r\n }\r\n return true;\r\n },\r\n exclusive: false,\r\n });\r\n}\r\n\r\nexport function isRequired(\r\n formField: Pick<\r\n IFormFieldDto,\r\n | 'Required'\r\n | 'DependencyFieldId'\r\n | 'DependencyValue'\r\n | 'DependencyMultiple'\r\n | 'DependencyVisibility'\r\n | 'RequiredFieldToCompare'\r\n | 'RequiredValueToCompare'\r\n >,\r\n isAdmin: boolean,\r\n value: any,\r\n): boolean {\r\n let required = false;\r\n let requiredType = RequiredTypes[formField.Required].toString();\r\n switch (requiredType) {\r\n case 'Optional':\r\n required = false;\r\n break;\r\n case 'User':\r\n required = true;\r\n break;\r\n case 'Admin':\r\n required = isAdmin;\r\n break;\r\n case 'Conditional':\r\n if (\r\n formField.RequiredFieldToCompare !== null &&\r\n formField.RequiredValueToCompare !== null &&\r\n !isNullOrUndefined(value)\r\n ) {\r\n let comparedValue = getParentValue(value);\r\n return formField.RequiredValueToCompare === comparedValue;\r\n }\r\n break;\r\n default:\r\n required = false;\r\n break;\r\n }\r\n if (required && formField.DependencyFieldId !== null) {\r\n required = isDependencyVisible(formField, value);\r\n }\r\n return required;\r\n}\r\nexport function isVisible(\r\n formField: IFormFieldDto,\r\n isAdmin: boolean,\r\n visibleOnComletion?: () => boolean,\r\n) {\r\n let visible = true;\r\n switch (formField.DisplayType) {\r\n case DisplayTypes.AlwaysVisible:\r\n visible = true;\r\n break;\r\n case DisplayTypes.VisibleToAdminOnly:\r\n visible = isAdmin;\r\n break;\r\n case DisplayTypes.VisibleToUserOnDoneRequest:\r\n if (visibleOnComletion) {\r\n visible = visibleOnComletion();\r\n }\r\n break;\r\n default:\r\n visible = true;\r\n }\r\n return visible;\r\n}\r\nexport function isDependencyVisible(\r\n formField: Pick<\r\n IFormFieldDto,\r\n | 'DependencyFieldId'\r\n | 'DependencyValue'\r\n | 'DependencyMultiple'\r\n | 'DependencyVisibility'\r\n | 'RequiredFieldToCompare'\r\n | 'RequiredValueToCompare'\r\n >,\r\n value: any,\r\n): boolean {\r\n if (\r\n formField.DependencyFieldId === null ||\r\n formField.DependencyValue === null\r\n ) {\r\n return true;\r\n }\r\n let valueTocompare = formField.DependencyValue;\r\n let parentValue = getParentValue(value);\r\n if (formField.DependencyMultiple) {\r\n if (parentValue === null) {\r\n return !(formField.DependencyVisibility === true);\r\n }\r\n let vp = valueTocompare.split(',');\r\n let pv = parentValue.split(',');\r\n let comparedRes = vp.filter(f => pv.filter(vf => vf === f).length > 0);\r\n let valid = comparedRes.length === vp.length;\r\n if (valid) {\r\n return formField.DependencyVisibility === true;\r\n } else {\r\n return !(formField.DependencyVisibility === true);\r\n }\r\n } else {\r\n if (valueTocompare === parentValue) {\r\n return formField.DependencyVisibility === true;\r\n } else {\r\n return !(formField.DependencyVisibility === true);\r\n }\r\n }\r\n}\r\nexport function getParentValue(value: any): string | null {\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n (Array.isArray(value) && value.length === 0)\r\n ) {\r\n return null;\r\n } else if (typeof value === 'string') {\r\n return value;\r\n } else if (Array.isArray(value)) {\r\n return (value as Entity[]).map(f => f.Id).join(',');\r\n } else if (value.hasOwnProperty('Id')) {\r\n return (value as Entity).Id;\r\n } else {\r\n return value.toString();\r\n }\r\n}\r\nexport const getFieldsVisibilities = (\r\n formFields: IFormFieldDto[],\r\n isAdmin: boolean,\r\n values: Record | undefined,\r\n visibleOnCompletion?: () => boolean,\r\n): Record | undefined => {\r\n if (values) {\r\n const visibilities: Record = {};\r\n formFields.forEach(field => {\r\n if (field.Active) {\r\n visibilities[field.Id] =\r\n isVisible(field, isAdmin, visibleOnCompletion) &&\r\n (field.DependencyFieldId === null ||\r\n (field.DependencyFieldId !== null &&\r\n isDependencyVisible(\r\n field,\r\n values[field.DependencyFieldId.toString()],\r\n )));\r\n }\r\n });\r\n return visibilities;\r\n }\r\n return undefined;\r\n};\r\nexport const useCustomFormSchema = (\r\n formFields: IFormFieldDto[],\r\n isAdmin: boolean,\r\n): Yup.SchemaOf => {\r\n const ForbiddenFileExtensions = useSelector(selectForbiddenFileExtensions);\r\n const UploadFileSizeLimit = useSelector(selectUploadFileSizeLimit);\r\n return React.useMemo(() => {\r\n const shape: ObjectShape = {};\r\n formFields.forEach(field => {\r\n if (field.Active) {\r\n shape[field.Id] = getFieldSchema(\r\n field,\r\n isAdmin,\r\n UploadFileSizeLimit,\r\n ForbiddenFileExtensions,\r\n );\r\n }\r\n });\r\n return Yup.object(shape);\r\n }, [ForbiddenFileExtensions, UploadFileSizeLimit, formFields, isAdmin]);\r\n};\r\nexport const getCustomFormInitialValues = (\r\n formFields: IFormFieldDto[],\r\n formValues?: IFormValueDto[],\r\n startQuiz?: boolean,\r\n): Record | undefined => {\r\n if (\r\n formValues === undefined &&\r\n (startQuiz === undefined || startQuiz === false)\r\n ) {\r\n return undefined;\r\n }\r\n const xx = formFields\r\n .map(formField => ({\r\n formField: formField,\r\n formValue: formValues?.find(\r\n formValue => formValue.FormFieldId === formField.Id,\r\n ),\r\n }))\r\n .map(item => ({\r\n formField: item.formField,\r\n value:\r\n item.formField.Type === 'File'\r\n ? item.formValue === null || item.formValue === undefined\r\n ? null\r\n : [item.formValue]\r\n : DeserializeValue(item.formField, item.formValue ?? null),\r\n }));\r\n\r\n const result =\r\n xx.reduce((initialValues, item) => {\r\n initialValues[item.formField.Id.toString()] = item.value ?? null;\r\n\r\n return initialValues;\r\n }, {}) ?? {};\r\n return result;\r\n};\r\nexport const orderFields = (item: IFormFieldDto, next: IFormFieldDto) => {\r\n return item.Index! - next.Index!;\r\n};\r\nexport const serializeValues = (\r\n formFields: IFormFieldDto[],\r\n value: Record,\r\n) => {\r\n const serialized: Record = {};\r\n let files: IFormFileValue[] = [];\r\n formFields.forEach(field => {\r\n if (field.Active) {\r\n serialized[field.Id] = SerializeValue(\r\n field,\r\n value[field.Id] as CustomFormValueType,\r\n );\r\n\r\n if (field.Type === 'File') {\r\n files = [...files, ...(value[field.Id] as IFormFileValue[])];\r\n }\r\n }\r\n });\r\n return { serialized, files };\r\n};\r\nexport const toFormValuesArray = (\r\n serialized: Record,\r\n formValues: IFormValueDto[],\r\n formFields: IFormFieldDto[],\r\n): IFormValueDto[] => {\r\n const ffs = RecordToFormValuesArray(formFields, formValues, serialized);\r\n const diff = differenceWith(\r\n ffs,\r\n formValues,\r\n (a, b) => a.FormFieldId === b.FormFieldId && a.Value === b.Value,\r\n ).filter(f => !(f.Value === null && f.Id === 0));\r\n return diff;\r\n};\r\nfunction RecordToFormValuesArray(\r\n formFields: IFormFieldDto[],\r\n formValues: IFormValueDto[],\r\n serialized: Record,\r\n): IFormValueDto[] {\r\n return formFields.map(formField => {\r\n const result = formValues.find(\r\n formValue => formValue.FormFieldId === formField.Id,\r\n ) ?? {\r\n Id: 0,\r\n FormFieldId: formField.Id,\r\n Value: null,\r\n DisplayValue: null,\r\n RequestId: null,\r\n ReservationId: null,\r\n ExperimentItemId: null,\r\n SourceValueId: null,\r\n Readonly: false,\r\n BudgetExperimentId: null,\r\n AlertId: null,\r\n AlertTypeId: null,\r\n ServiceGroupUserId: null,\r\n ServiceGroupId: null,\r\n CustomFormId: null,\r\n CustomFormName: null,\r\n };\r\n return { ...result, ...{ Value: serialized[formField.Id.toString()] } };\r\n });\r\n}\r\n\r\nexport function serializeCustomFormRowValue(\r\n value: IServiceRequestTableRowValueModel,\r\n): Pick {\r\n if (value == null) {\r\n return { Value: null, DisplayValue: null };\r\n } else if (typeof value === 'string') {\r\n return { Value: value, DisplayValue: null };\r\n } else if (typeof value === 'number') {\r\n return { Value: value.toString(), DisplayValue: null };\r\n } else if (typeof value === 'boolean') {\r\n return { Value: value.toString(), DisplayValue: null };\r\n } else if (value instanceof Date) {\r\n return {\r\n Value:\r\n dateUtils.tryFormatIso(value, {\r\n format: 'basic',\r\n representation: 'date',\r\n }) ?? null,\r\n DisplayValue: null,\r\n };\r\n } else {\r\n return {\r\n Value: value.Id,\r\n DisplayValue: value.Name,\r\n };\r\n }\r\n}\r\n\r\nexport function getCustomFormRowDisplay(\r\n value: IServiceRequestTableRowValueModel,\r\n) {\r\n if (value == null) {\r\n return '';\r\n } else if (typeof value === 'string') {\r\n return value;\r\n } else if (typeof value === 'number') {\r\n return value.toString();\r\n } else if (typeof value === 'boolean') {\r\n return value.toString();\r\n } else if (value instanceof Date) {\r\n return dateUtils.shortDateFormat(value);\r\n } else {\r\n return value.Name;\r\n }\r\n}\r\n\r\nexport function getCustomFormColumnSchema(\r\n props: Pick<\r\n IServiceRequestTableColumnModel,\r\n 'Label' | 'ColumnType' | 'isRequired' | 'Options' | 'SizeLimit'\r\n >,\r\n) {\r\n const baseSchema = getCustomFormColumnBaseSchema(props).label(props.Label);\r\n const result = props.isRequired ? baseSchema.required() : baseSchema;\r\n return result;\r\n}\r\nfunction getCustomFormColumnBaseSchema(\r\n props: Pick<\r\n IServiceRequestTableColumnModel,\r\n 'Label' | 'ColumnType' | 'Options' | 'SizeLimit'\r\n >,\r\n) {\r\n switch (props.ColumnType) {\r\n case 'CheckBox':\r\n return Yup.boolean().label(props.Label);\r\n case 'Date':\r\n return Yup.date().label(props.Label);\r\n case 'DropDownList':\r\n //TODO: validate selected option is present in the column options\r\n return Yup.mixed().label(props.Label);\r\n case 'UserSelection':\r\n return Yup.mixed>().label(props.Label);\r\n case 'Email':\r\n return Yup.string().label(props.Label).email();\r\n case 'Number':\r\n return Yup.number()\r\n .label(props.Label)\r\n .min(-props.SizeLimit)\r\n .max(props.SizeLimit);\r\n case 'PositiveDecimal':\r\n return Yup.number().label(props.Label).min(0).max(props.SizeLimit);\r\n case 'PositiveInteger':\r\n return Yup.number()\r\n .integer()\r\n .label(props.Label)\r\n .min(0)\r\n .max(props.SizeLimit);\r\n case 'ShortText':\r\n return Yup.string();\r\n case 'Serial':\r\n return Yup.string();\r\n\r\n default:\r\n assertExhaustive(props.ColumnType);\r\n }\r\n}\r\n","/**\r\n *\r\n * UserPicker\r\n *\r\n */\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport {\r\n Condition,\r\n ODataOperators,\r\n quoteODataValue,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity, Identifiable } from 'types/common';\r\n\r\nexport type UserUrl =\r\n | 'restricted'\r\n | 'full'\r\n | 'admin'\r\n | 'relevant'\r\n | 'budgetExperiments';\r\nexport interface UserPickerProps\r\n extends Omit, 'loadData'> {\r\n inputProps?: InputBaseComponentProps;\r\n selectArray?: Array;\r\n urlType?: UserUrl;\r\n}\r\n\r\nconst url = '/api/odata/v4/UserFilter';\r\nconst fullActiveUrl = '/api/odata/v4/UserFilter/GetUserSelections';\r\nconst adminsUrl = '/api/odata/v4/UserFilter/GetAdminUsers';\r\nconst relevantUrl = '/api/odata/v4/UserFilter/GetRelevantUsers';\r\nconst budgetExperimentsUrl =\r\n '/api/odata/v4/UserFilter/GetBudgetExperimentsUsers';\r\nexport const initUserData = (id: string, urlType?: UserUrl) => {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: new Condition('Id', ODataOperators.Equals, id).toString(),\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n urlType === 'full'\r\n ? fullActiveUrl\r\n : urlType === 'admin'\r\n ? adminsUrl\r\n : urlType === 'budgetExperiments'\r\n ? budgetExperimentsUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\n\r\nexport function UserPicker(props: UserPickerProps) {\r\n const { t } = useTranslation();\r\n const loadData = getAutoCompleteLoadDataFn({\r\n url:\r\n props.urlType === 'full'\r\n ? fullActiveUrl\r\n : props.urlType === 'admin'\r\n ? adminsUrl\r\n : props.urlType === 'relevant'\r\n ? relevantUrl\r\n : props.urlType === 'budgetExperiments'\r\n ? budgetExperimentsUrl\r\n : url,\r\n predicates: props.predicates,\r\n select: props.selectArray ?? [\r\n 'Id',\r\n 'Name',\r\n 'UserGroupId',\r\n 'UserGroupName',\r\n 'UserGroups',\r\n 'Budgets',\r\n 'IsAdminPanel',\r\n 'IsEquipmentAdmin',\r\n 'IsGroupAdmin',\r\n 'IsLabTech',\r\n 'ServiceGroupIds',\r\n 'Services',\r\n 'CustomRoles',\r\n 'UserGroupId',\r\n 'UserGroupName',\r\n 'UserRoles',\r\n 'StaffEquipmentId',\r\n ],\r\n expand: props.urlType === 'budgetExperiments' ? '' : 'Services,UserGroups',\r\n });\r\n return (\r\n \r\n );\r\n}\r\nexport function ServicesFilter(\r\n services: IServiceTypeFilterDto[],\r\n budgetExperimentEnabled: boolean,\r\n userGroupId?: string,\r\n budgetId?: number,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (userGroupId !== undefined) {\r\n predicates.push(\r\n `(${new Condition(\r\n 'UserGroups',\r\n ODataOperators.Any,\r\n userGroupId,\r\n 'Id',\r\n )} or ${new Condition(\r\n 'UserGroupId',\r\n ODataOperators.Equals,\r\n userGroupId,\r\n )})`,\r\n );\r\n }\r\n if (budgetId !== undefined) {\r\n predicates.push(\r\n new Condition('Budgets', ODataOperators.Any, budgetId),\r\n );\r\n }\r\n if (\r\n services.length > 0 &&\r\n budgetExperimentEnabled &&\r\n !services.some(f => f.HideProject)\r\n ) {\r\n //TODO: add filter by selected services\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\nexport function AdminServicesFilter(\r\n serviceItems: IServiceFilterDto[],\r\n): (string | Condition)[] {\r\n if (!serviceItems.length || serviceItems.length < 1) {\r\n return [];\r\n }\r\n let groups = [...new Set(serviceItems.map(f => f.ServiceGroupId))];\r\n let groupIds = groups.map(item => {\r\n return { Id: item };\r\n }) as Identifiable[];\r\n let services = serviceItems\r\n .map(f => {\r\n return {\r\n ServiceId: f.Id ?? 0,\r\n ServiceTypeId: f.ServiceTypeId ?? 0,\r\n };\r\n })\r\n .filter(f => f.ServiceId !== 0 && f.ServiceTypeId !== 0);\r\n let groupsF = `(${new Condition(\r\n 'ServiceGroupIds',\r\n ODataOperators.AnyIn,\r\n groupIds,\r\n ).toString()})`;\r\n // let groupsF = `(${groups\r\n // .map(a => new Condition('ServiceGroupIds', ODataOperators.AnyIn, groupIds).toString())\r\n // .join(' and ')})`;\r\n let servF = `(Services/any(s: s/Id in ${quoteODataValue(\r\n services.map(f => f.ServiceId),\r\n )}))`;\r\n\r\n return [`${groupsF} or ${servF}`];\r\n}\r\nexport const initAssigneeAdminUsers = (\r\n type: IWorkOrderTypeDto,\r\n serviceItems: IServiceFilterDto[],\r\n) => {\r\n const predicates: (string | Condition)[] = [];\r\n if (type.AssignedToCoreAdmin) {\r\n predicates.push(\r\n new Condition(\r\n 'IsGroupAdmin',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n }\r\n if (type.AssignedToInstrumentAdmin) {\r\n predicates.push(\r\n new Condition(\r\n 'IsEquipmentAdmin',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n }\r\n if (type.AssignedToLabTech) {\r\n predicates.push(\r\n new Condition('IsLabTech', ODataOperators.Equals, true),\r\n );\r\n }\r\n if (serviceItems.length < 1 || predicates.length < 1) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: `${\r\n AdminServicesFilter(serviceItems)[0]\r\n } and (${predicates.map(f => f.toString()).join(' or ')})`,\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { useState, useMemo, useEffect, useRef } from 'react';\r\n\r\nexport type PromiseStatus = `pending` | `resolved` | `rejected`;\r\nexport type CancelPromise = (message?: string) => void;\r\nexport type ResetPromiseState = (\r\n keys?: keyof PromiseState | Array>,\r\n) => void;\r\n\r\nexport interface PromiseState {\r\n status?: PromiseStatus;\r\n promise?: Promise;\r\n value?: T;\r\n error?: Error;\r\n cancel?: CancelPromise;\r\n}\r\n\r\nexport type PromiseStateWithReset = PromiseState & {\r\n reset: ResetPromiseState;\r\n};\r\n\r\n/**\r\n * A hook which accepts an asynchronous function (i.e., a function which returns a promise).\r\n *\r\n * Returns a new asynchronous function wrapping the original to be called as necessary,\r\n * along with the state of the promise as `status`, `promise`, `value`, `error`, `cancel()`,\r\n * and a `reset()` method to reset the state.\r\n *\r\n * Pairs well with the {@link hooks.useAsyncExtendedState | `useAsyncExtendedState`} hook.\r\n *\r\n * Example:\r\n * ```ts\r\n * interface State {\r\n * foo: string\r\n * bar: string\r\n * }\r\n *\r\n * const [ state, setState, extendState ] = useAsyncExtendedState({\r\n * foo: 'foo',\r\n * bar: 'bar'\r\n * })\r\n *\r\n * const read = (id: string) => API.client.get>(`things/${id}`).then(response => {\r\n * return response.data\r\n * })\r\n *\r\n * const [ readThingRequest, readThing ] = usePromise(read)\r\n *\r\n * const isPending = readThingRequest.status === 'pending'\r\n *\r\n * return (\r\n * <>\r\n *
\r\n * foo: {state.foo}\r\n *
\r\n *\r\n *
\r\n * bar: {state.bar}\r\n *
\r\n *\r\n * extendState(readThing('someId'))} disabled={isPending}>\r\n * \r\n * {isPending\r\n * ? 'Reading thing...'\r\n * : 'Read thing'\r\n * }\r\n * \r\n * \r\n *\r\n * \r\n * {readThingRequest.error}\r\n * \r\n * \r\n * )\r\n * ```\r\n */\r\nexport const usePromise = any>(\r\n asyncFunction: T,\r\n initialState?: PromiseState>,\r\n): [\r\n PromiseStateWithReset>,\r\n (...asyncFuncArgs: Parameters) => ReturnType,\r\n] => {\r\n const [state, setState] = useState>>(\r\n initialState || {},\r\n );\r\n const isCancelled = useRef(false);\r\n const isUnmounted = useRef(false);\r\n\r\n const callAsyncFunction = useMemo(\r\n () => (...args: Parameters): ReturnType => {\r\n const promise = asyncFunction(...args);\r\n const cancel: CancelPromise = message => {\r\n isCancelled.current = true;\r\n\r\n if (!isUnmounted.current) {\r\n setState(({ value }) => ({\r\n status: `rejected`,\r\n value,\r\n error: message ? new Error(message) : undefined,\r\n }));\r\n }\r\n };\r\n\r\n isCancelled.current = false;\r\n\r\n if (promise instanceof Promise) {\r\n return new Promise(resolve => {\r\n const fulfillPromise = async () => {\r\n try {\r\n const value: ReturnType = await promise;\r\n\r\n if (!isCancelled.current && !isUnmounted.current) {\r\n setState({ status: `resolved`, value });\r\n resolve(value);\r\n }\r\n } catch (error) {\r\n if (!isCancelled.current && !isUnmounted.current) {\r\n setState(({ value }) => ({\r\n status: `rejected`,\r\n value,\r\n error:\r\n error instanceof Error ? error : new Error(error as string),\r\n }));\r\n }\r\n }\r\n };\r\n\r\n setState(({ value }) => ({\r\n status: `pending`,\r\n value,\r\n promise,\r\n cancel,\r\n }));\r\n fulfillPromise();\r\n }) as ReturnType;\r\n } else {\r\n setState({ status: `resolved`, value: promise });\r\n return promise;\r\n }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [asyncFunction],\r\n );\r\n\r\n const reset: ResetPromiseState = useMemo(\r\n () => keys =>\r\n setState(state => {\r\n if (!keys) {\r\n return {};\r\n }\r\n\r\n const nextState = { ...state };\r\n\r\n if (Array.isArray(keys)) {\r\n for (const key of keys) {\r\n delete nextState[key];\r\n }\r\n } else {\r\n delete nextState[keys];\r\n }\r\n\r\n return nextState;\r\n }),\r\n [],\r\n );\r\n\r\n const stateWithReset: PromiseStateWithReset> = useMemo(\r\n () => ({ ...state, reset }),\r\n [state, reset],\r\n );\r\n\r\n useEffect(() => {\r\n return () => {\r\n isCancelled.current = true;\r\n isUnmounted.current = true;\r\n };\r\n }, []);\r\n\r\n return [stateWithReset, callAsyncFunction];\r\n};\r\n","import {\r\n getPeriodTypesEntity,\r\n PeriodTypes,\r\n PeriodTypesEntity,\r\n} from 'app/components/DatePeriods';\r\nimport { IPresetDatesRange } from './IPresetDatesRange';\r\nimport { DatesRange } from './DatesRange';\r\nimport { translations } from 'locales/translations';\r\nimport { TFunction } from 'i18next';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport class PresetDatesRange extends DatesRange implements IPresetDatesRange {\r\n constructor(t?: IPresetDatesRange) {\r\n super(t as IPresetDatesRange);\r\n this.type = (t as IPresetDatesRange)?.type ?? {\r\n Id: 'CustomDate',\r\n Name: `${translations.CustomDate}`,\r\n type: 'CustomDate',\r\n };\r\n }\r\n type: PeriodTypesEntity = {\r\n Id: 'CustomDate',\r\n Name: `${translations.CustomDate}`,\r\n };\r\n\r\n GetPresetDatesRangeDisplayString(t: TFunction): string {\r\n switch (this.type?.Id) {\r\n default:\r\n return t(this.type.Id);\r\n case 'CustomDate':\r\n return `${\r\n this.start === null\r\n ? t(translations.NA)\r\n : dateUtils.shortDateTimeFormat(this.start)\r\n } - ${\r\n this.end === null\r\n ? t(translations.NA)\r\n : dateUtils.shortDateTimeFormat(this.end)\r\n }`;\r\n }\r\n }\r\n static fromPreset(t: PeriodTypesEntity) {\r\n return new PresetDatesRange({\r\n type: t,\r\n ...DatesRange.fromPreset(t, null, null),\r\n });\r\n }\r\n static fromInitPreset(\r\n t: PeriodTypesEntity,\r\n start: Date | null,\r\n end: Date | null,\r\n ) {\r\n return new PresetDatesRange({\r\n type: t,\r\n ...DatesRange.fromPreset(t, start, end),\r\n });\r\n }\r\n static fromType(t: PeriodTypes, st: Date | null, et: Date | null) {\r\n const x = getPeriodTypesEntity(t);\r\n const y = DatesRange.fromPreset(x as PeriodTypesEntity, st, et);\r\n const z: IPresetDatesRange = {\r\n type: x,\r\n start: y.start,\r\n end: y.end,\r\n };\r\n return new PresetDatesRange(z);\r\n }\r\n\r\n static Custom(\r\n start: Date | undefined | null,\r\n end: Date | undefined | null,\r\n ): PresetDatesRange | undefined {\r\n return new PresetDatesRange({\r\n type: getPeriodTypesEntity('CustomDate'),\r\n start: start ?? null,\r\n end: end ?? null,\r\n });\r\n }\r\n}\r\n","/**\r\n *\r\n * AssetsPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport {\r\n AutocompleteMultiPickerEx,\r\n AutocompleteMultiPickerExProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\n\r\nexport type avTypes =\r\n | 'bookable'\r\n | 'serviceRelated'\r\n | 'serviceGroup'\r\n | 'bookableAndnotbookable'\r\n | 'workOrderRelated'\r\n | 'all';\r\n\r\nexport interface AssetsPickerProps\r\n extends Omit, 'loadData'> {\r\n inputProps?: InputBaseComponentProps;\r\n restrictByAvType?: avTypes;\r\n /**\r\n * Option to filter admin permissions. If set to true will return only the assets authenticated user is an admin of\r\n */\r\n admin?: boolean;\r\n /**\r\n * Fetches only Active assets/instruments if this property is set to true\r\n */\r\n showOnlyActiveAssets?: boolean;\r\n withoutServiceGroups?: boolean;\r\n}\r\nexport const bookable: Identifiable[] = [\r\n //{ Id: AvailabilityTypes.ApprovalRequiredBillable as number },\r\n //{ Id: AvailabilityTypes.BookableWApproval as number },\r\n { Id: AvailabilityTypes.FreelyBookable as number },\r\n //{ Id: AvailabilityTypes.FreelyBookableBillable as number },\r\n { Id: AvailabilityTypes.LectureRoom as number },\r\n { Id: AvailabilityTypes.LoanableEquipment as number },\r\n { Id: AvailabilityTypes.TrainingProgram as number },\r\n];\r\nexport const bookableAndnotbookable: Identifiable[] = bookable.concat([\r\n { Id: AvailabilityTypes.AvailableNotBookable as number },\r\n]);\r\nexport const servicesRelated: Identifiable[] = [\r\n //{ Id: AvailabilityTypes.ApprovalRequiredBillable as number },\r\n //{ Id: AvailabilityTypes.BookableWApproval as number },\r\n { Id: AvailabilityTypes.FreelyBookable as number },\r\n //{ Id: AvailabilityTypes.FreelyBookableBillable as number },\r\n { Id: AvailabilityTypes.LectureRoom as number },\r\n { Id: AvailabilityTypes.LoanableEquipment as number },\r\n { Id: AvailabilityTypes.TrainingProgram as number },\r\n { Id: AvailabilityTypes.AvailableNotBookable as number },\r\n { Id: AvailabilityTypes.NotAvailable as number },\r\n { Id: AvailabilityTypes.RequestRelated as number },\r\n { Id: AvailabilityTypes.ServiceRelated as number },\r\n];\r\nexport const initAssetsData = (\r\n initval: string | undefined,\r\n byService?: boolean,\r\n serviceTypes?: Identifiable[],\r\n admin?: boolean,\r\n) => {\r\n const url =\r\n admin === true\r\n ? '/api/odata/v4/AssetNames/AdminAssets'\r\n : '/api/odata/v4/AssetNames';\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n let ids = (initval.indexOf(',') !== -1\r\n ? initval.split(',')\r\n : initval.indexOf('|') !== -1\r\n ? initval.split('|')\r\n : [initval]\r\n ).map(item => {\r\n return { Id: parseInt(item) };\r\n }) as Identifiable[];\r\n let filters: string | undefined = undefined;\r\n if (ids.length > 0) {\r\n const predicates: string | Condition[] = [];\r\n\r\n if (byService) {\r\n predicates.push(\r\n new Condition('ServiceId', ODataOperators.Includes, ids),\r\n );\r\n let types =\r\n !!serviceTypes && serviceTypes.length > 0\r\n ? serviceTypes\r\n : [{ Id: 1 }];\r\n\r\n predicates.push(\r\n new Condition('ServiceTypeId', ODataOperators.Includes, types),\r\n );\r\n } else {\r\n predicates.push(new Condition('Id', ODataOperators.Includes, ids));\r\n }\r\n filters = predicates.map(f => f.toString()).join(' and ');\r\n }\r\n\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: filters,\r\n $skip: 0,\r\n $top: 10,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nexport function AssetsFilterForWorkOrder(\r\n orederType: IWorkOrderTypeDto | undefined,\r\n): Condition[] {\r\n const predicates: Condition[] = [];\r\n if (orederType !== undefined) {\r\n if (orederType.Groups && orederType.Groups.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n orederType.Groups.map(f => f.Id),\r\n ),\r\n );\r\n }\r\n if (orederType.AssetCats && orederType.AssetCats.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'AssetCatId',\r\n ODataOperators.Includes,\r\n orederType.AssetCats.map(f => f.Id),\r\n ),\r\n );\r\n }\r\n }\r\n\r\n predicates.push(\r\n new Condition('ServiceTypeId', ODataOperators.Includes, [\r\n { Id: 1 },\r\n { Id: 2 },\r\n // { Id: 3 },\r\n ]),\r\n );\r\n if (predicates.length > 0) {\r\n return predicates;\r\n } else {\r\n return [];\r\n }\r\n}\r\nexport function AssetsFilterForCalibrationWorkOrder(\r\n orederType: IWorkOrderTypeDto | undefined,\r\n selectedIds: number[],\r\n): Condition[] {\r\n const predicates: Condition[] = [];\r\n if (orederType !== undefined) {\r\n if (orederType.Groups && orederType.Groups.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n orederType.Groups,\r\n ),\r\n );\r\n }\r\n if (orederType.AssetCats && orederType.AssetCats.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'AssetCatId',\r\n ODataOperators.Includes,\r\n orederType.AssetCats,\r\n ),\r\n );\r\n }\r\n }\r\n if (selectedIds.length > 0) {\r\n predicates.push(\r\n new Condition('Id', ODataOperators.Excludes, selectedIds),\r\n );\r\n }\r\n\r\n predicates.push(\r\n new Condition('ServiceTypeId', ODataOperators.Includes, [\r\n { Id: 1 },\r\n { Id: 2 },\r\n { Id: 3 },\r\n ]),\r\n );\r\n if (predicates.length > 0) {\r\n return predicates;\r\n } else {\r\n return [];\r\n }\r\n}\r\nexport function AssetsFilterForSavedView(\r\n topServiceGroups: Entity[] | undefined,\r\n): Condition[] {\r\n const predicates: Condition[] = [];\r\n if (topServiceGroups !== undefined) {\r\n if (topServiceGroups.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n topServiceGroups,\r\n ),\r\n );\r\n }\r\n }\r\n predicates.push(\r\n new Condition('ServiceTypeId', ODataOperators.Includes, [\r\n { Id: 1 },\r\n //{ Id: 2 },\r\n //{ Id: 3 },\r\n ]),\r\n );\r\n if (predicates.length > 0) {\r\n return predicates;\r\n } else {\r\n return [];\r\n }\r\n}\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n admin?: boolean,\r\n withoutServiceGroups?: boolean,\r\n) => {\r\n const url =\r\n admin === true\r\n ? '/api/odata/v4/AssetNames/AdminAssets'\r\n : '/api/odata/v4/AssetNames';\r\n return getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'AssetCatId',\r\n 'Availability',\r\n // BookableAsset is not mapped (AssetNamesController)\r\n // 'BookableAsset',\r\n 'Image',\r\n 'ServiceGroupId',\r\n 'ServiceId',\r\n 'ServiceTypeId',\r\n 'ServiceGroupName',\r\n 'ServiceGroupAssetId',\r\n 'Color',\r\n ],\r\n globalServiceGroupFilter:\r\n (withoutServiceGroups === undefined || withoutServiceGroups === false) &&\r\n !!globalServiceGroupFilter &&\r\n globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\nexport function AssetsPicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n predicates,\r\n disabled,\r\n inputProps,\r\n restrictByAvType,\r\n showOnlyActiveAssets,\r\n admin,\r\n withoutServiceGroups,\r\n ...props\r\n}: AssetsPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n\r\n let avFilter =\r\n restrictByAvType === undefined ? undefined : getAvFilter(restrictByAvType);\r\n\r\n let filters =\r\n avFilter !== undefined\r\n ? predicates !== undefined\r\n ? [...predicates, avFilter]\r\n : [avFilter]\r\n : predicates;\r\n if (showOnlyActiveAssets === true) {\r\n filters?.push(\r\n new Condition('Active', ODataOperators.Equals, true),\r\n );\r\n }\r\n const innerLoadData = loadData(\r\n filters,\r\n globalServiceGroupFilter || [],\r\n admin,\r\n withoutServiceGroups,\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\nexport function ServiceGroupAssetsPicker(\r\n props: Omit,\r\n) {\r\n return ;\r\n}\r\nexport function InstrumentAssetsPicker(\r\n props: Omit,\r\n) {\r\n return ;\r\n}\r\nexport function getAvFilter(restrictByAvType: avTypes) {\r\n switch (restrictByAvType) {\r\n case 'bookable':\r\n return `(${new Condition(\r\n 'Availability/Id',\r\n ODataOperators.Includes,\r\n bookable,\r\n ).toString()})`;\r\n case 'bookableAndnotbookable':\r\n return `(${new Condition(\r\n 'Availability/Id',\r\n ODataOperators.Includes,\r\n bookableAndnotbookable,\r\n ).toString()})`;\r\n case 'serviceRelated':\r\n return `(${new Condition(\r\n 'Availability/Id',\r\n ODataOperators.Includes,\r\n servicesRelated,\r\n ).toString()})`;\r\n case 'workOrderRelated':\r\n return `(${new Condition(\r\n 'Availability/Id',\r\n ODataOperators.Includes,\r\n servicesRelated.filter(\r\n f => f.Id !== (AvailabilityTypes.RequestRelated as number),\r\n ),\r\n ).toString()})`;\r\n case 'serviceGroup':\r\n return `(${new Condition(\r\n 'Availability/Id',\r\n ODataOperators.Equals,\r\n AvailabilityTypes.ServiceGroup,\r\n ).toString()})`;\r\n case 'all':\r\n return undefined;\r\n default:\r\n assertExhaustive(restrictByAvType);\r\n }\r\n}\r\n","import {\r\n call,\r\n put,\r\n select,\r\n debounce,\r\n takeLeading,\r\n takeLatest,\r\n takeEvery,\r\n} from 'redux-saga/effects';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { requestSamplesActions as actions } from '.';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { PayloadAction } from '@reduxjs/toolkit';\r\nimport {\r\n InsertServiceRequestMilestoneChargeAction,\r\n ILoadServiceRequestMilestonesAction,\r\n IRequestMilestoneManualChargeModel,\r\n ISample,\r\n IServiceRequestPatchAction,\r\n IServiceRequestUpdateBudgetAction,\r\n IServiceRequestUpdateStatusAction,\r\n UpdateServiceRequestMilestoneChargeAction,\r\n ServiceRequestMilestoneInsertModel,\r\n ICancelServiceRequestPayloadAction,\r\n UpdateServiceRequestRowValueAction,\r\n IServiceRequestTableRowModel,\r\n IRequestDetailsModel,\r\n} from './types';\r\nimport { TableState } from 'react-table';\r\nimport { IRow } from 'app/components/BasicTable';\r\nimport { TableFilterBuilder } from 'app/components/BasicTable/TableFilterBuilder';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n selectRequestDetailsData,\r\n selectSamplesTableState,\r\n selectServiceRequestCustomFormColumns,\r\n selectServiceRequestCustomFormFields,\r\n selectServiceRequestId,\r\n} from './selectors';\r\nimport { AxiosError, AxiosResponse } from 'axios';\r\nimport fileDownload from 'js-file-download';\r\nimport { deleteSamples, IDeleteSamplesResult } from 'api/SamplesApi';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { IServiceRequestDto } from 'api/odata/generated/entities/IServiceRequestDto';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { Entity } from 'types/common';\r\nimport { takeLatestByKey } from 'utils/redux-saga';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectGlobalSettingBool,\r\n selectKnownModule,\r\n} from 'app/slice/selectors';\r\nimport { IServiceRequestMilestoneDto } from 'api/odata/generated/entities/IServiceRequestMilestoneDto';\r\nimport { IServiceRequestMilestoneChargeDto } from 'api/odata/generated/entities/IServiceRequestMilestoneChargeDto';\r\nimport { IConsumableServiceDto } from 'api/odata/generated/entities/IConsumableServiceDto';\r\nimport {\r\n ServiceRequestMilestoneStatuses,\r\n ServiceRequestMilestoneStatusesUnion,\r\n} from 'api/odata/generated/enums/ServiceRequestMilestoneStatuses';\r\nimport {\r\n IOpenSidePanelPayload,\r\n layoutActions,\r\n} from 'app/Layout/FrontendLayout/slice';\r\nimport { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { selectSidePanelState } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n RenderPageType,\r\n SidePanelState,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { push } from 'connected-react-router';\r\nimport { GetServiceRequestDetailsPath } from './path';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport { IServiceRequestRowDto } from 'api/odata/generated/entities/IServiceRequestRowDto';\r\nimport { getLogger } from 'loglevel';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { IServiceRequestRowStatusDto } from 'api/odata/generated/entities/IServiceRequestRowStatusDto';\r\nimport {\r\n prepareServiceRequestRowModel,\r\n serviceRequestModelToDto,\r\n} from './prepareServiceRequestRowModel';\r\nimport { omit } from 'lodash';\r\nimport { getCustomFormInitialValues } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\n\r\nconst log = getLogger('ServiceRequestDetails');\r\n\r\nfunction* doInit(action: PayloadAction) {\r\n try {\r\n const statuses: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n '/api/odata/v4/ServiceRequestStatusFilter',\r\n );\r\n yield put(actions.initServiceRequestStatuses_Success(statuses.value));\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n yield* doLoadServiceRequestRowStatuses();\r\n}\r\nfunction* doLoadRequestDetails(action: PayloadAction) {\r\n try {\r\n const requestDetails: IServiceRequestDto = yield call(\r\n httpClient.get,\r\n `api/odata/v4/ServiceRequests/${action.payload}`,\r\n {\r\n $expand: [\r\n 'Status',\r\n 'Service($expand=ServiceGroup,CustomForm)',\r\n 'CreatedBy($select=Id,Name)',\r\n 'CreatedFor($expand=UserGroup)',\r\n 'UpdatedBy($select=Id,Name)',\r\n 'SubmittedBy($select=Id,Name)',\r\n 'UserGroup($select=Id,Name)',\r\n 'Budget($select=Id,Name)',\r\n ].join(','),\r\n },\r\n );\r\n yield put(\r\n actions.loadRequestDetails_Success(\r\n omit(requestDetails, 'Rows', 'FormValues'),\r\n ),\r\n );\r\n\r\n if (\r\n requestDetails.Service.CustomForm.FormFields.some(\r\n f => f.Active && f.IsColumn === false,\r\n )\r\n ) {\r\n yield put(actions.loadFormValues(action.payload));\r\n }\r\n\r\n if (\r\n requestDetails.Service.CustomForm.FormFields.some(\r\n f => f.Active && f.IsColumn === true,\r\n )\r\n ) {\r\n yield* doLoadServiceRequestRows(requestDetails.Id);\r\n }\r\n\r\n // trigger loading the milestones if the request milestones are enabled both in the global settings and on the service settings\r\n const requestMilestones: boolean = yield select(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.RequestMilestones),\r\n );\r\n if (requestDetails.Service.MilestonesAddonsType !== 'NA') {\r\n if (requestMilestones === true) {\r\n yield put(actions.loadMilestones({ Id: action.payload }));\r\n }\r\n }\r\n if (requestDetails.InvoiceId !== null) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'warning',\r\n message: i18next.t(translations.requestblockedbyinvoice),\r\n }),\r\n );\r\n }\r\n } catch (error) {\r\n log.error(error);\r\n yield put(\r\n actions.loadRequestDetails_Error({\r\n response: {\r\n status: (error as AxiosError)?.response?.status,\r\n },\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doRefreshRequestDetails(action: PayloadAction) {\r\n try {\r\n const requestDetails = yield call(\r\n httpClient.get,\r\n `api/odata/v4/ServiceRequests/${action.payload}`,\r\n {\r\n $expand: [\r\n 'Status',\r\n 'Service($expand=ServiceGroup,CustomForm)',\r\n 'CreatedBy($select=Id,Name)',\r\n 'CreatedFor($expand=UserGroup)',\r\n 'UpdatedBy($select=Id,Name)',\r\n 'SubmittedBy($select=Id,Name)',\r\n 'UserGroup($select=Id,Name)',\r\n 'Budget($select=Id,Name)',\r\n ].join(','),\r\n },\r\n );\r\n yield put(actions.refreshRequestDetails_Success(requestDetails));\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n}\r\nfunction* doLoadFormValues(action: PayloadAction) {\r\n const url = `api/odata/v4/ServiceRequests(${action.payload})/FormValues`;\r\n const data: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n url,\r\n );\r\n\r\n const formFields = yield select(selectServiceRequestCustomFormFields);\r\n const valuesObject = getCustomFormInitialValues(formFields, data.value);\r\n if (valuesObject !== undefined) {\r\n yield put(actions.loadFormValues_Success(valuesObject));\r\n }\r\n}\r\nfunction* doSaveFormValue(\r\n action: PayloadAction<\r\n Pick &\r\n Pick & { Value: any }\r\n >,\r\n) {\r\n if (action.payload.RequestId === null) {\r\n log.warn('doSaveFormValue: requestId is empty');\r\n }\r\n try {\r\n if (action.payload.Type === 'File' && action.payload.Value?.length === 0) {\r\n action.payload.Value = null;\r\n }\r\n if (action.payload.Type === 'File' && action.payload.Value !== null) {\r\n const formData = new FormData();\r\n formData.append(\r\n 'file',\r\n action.payload.Value[0].PostedFile,\r\n action.payload.Value[0].DisplayName,\r\n );\r\n yield call(\r\n httpClient.post,\r\n `/api/requests/${action.payload.RequestId}/formvalues/${action.payload.FormFieldId}/file`,\r\n formData,\r\n {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n Accept: 'application/json',\r\n },\r\n },\r\n );\r\n } else {\r\n const url = `/api/odata/v4/ServiceRequests(${action.payload.RequestId})/FormValues`;\r\n const payload = action.payload;\r\n yield call(httpClient.post, url, omit(payload, 'Type'));\r\n }\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n}\r\nfunction* doLoadSamples(\r\n action: PayloadAction<\r\n Partial<\r\n Partial<\r\n TableState & {\r\n customFilters: IFilterSettings[];\r\n searchColumns: string[];\r\n }\r\n >\r\n >\r\n >,\r\n) {\r\n // todo: switch to odata v4: const url = `/api/odata/v4/ServiceRequests(${id})`;\r\n\r\n const serviceRequestId = yield select(selectServiceRequestId);\r\n const url = '/api/odata/v4/samples';\r\n\r\n const currentTableState = yield select(selectSamplesTableState);\r\n const filters = [\r\n '(not SourceRunIds/any())',\r\n new Condition(\r\n 'ServiceRequestId',\r\n ODataOperators.Equals,\r\n serviceRequestId,\r\n ),\r\n ];\r\n const params = {\r\n $count: true,\r\n $top: currentTableState.pageSize,\r\n $skip:\r\n (currentTableState.pageIndex ?? 1) * (currentTableState.pageSize ?? 5),\r\n $orderby:\r\n currentTableState.sortBy\r\n ?.map(f => `${f.id} ${f.desc ?? false ? 'desc' : 'asc'}`)\r\n .join(',') || undefined,\r\n\r\n $filter: TableFilterBuilder(\r\n currentTableState.customFilters,\r\n currentTableState.globalFilter,\r\n undefined,\r\n currentTableState.searchColumns,\r\n filters,\r\n ),\r\n };\r\n try {\r\n const data = yield call(httpClient.get, url, params);\r\n yield put(actions.loadSamples_Success(data));\r\n } catch (error) {\r\n yield put(\r\n actions.loadSamples_Error(i18next.t(translations.AnErrorOccurred)),\r\n );\r\n const forbidden = (error as AxiosError)?.response?.status === 403;\r\n if (forbidden) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.Forbidden),\r\n }),\r\n );\r\n }\r\n }\r\n}\r\nfunction* doLoadServiceRequestRows(id: number) {\r\n const url = `api/odata/v4/ServiceRequests(${id})/Rows`;\r\n const data: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n url,\r\n //TODO: bring back server side paging?\r\n //params,\r\n );\r\n const columns = yield select(selectServiceRequestCustomFormColumns);\r\n const model = prepareServiceRequestRowModel(data.value, columns);\r\n yield put(actions.loadServiceRequestRows_Success(model));\r\n}\r\nfunction* doLoadMilestones(action: ILoadServiceRequestMilestonesAction) {\r\n const url = `/api/odata/v4/ServiceRequests(${action.payload.Id})/Milestones`;\r\n const params = {\r\n $expand: [\r\n 'Assignees($select=Id,Name)',\r\n `ServiceRequestMilestoneCharges($expand=${[\r\n 'Service($select=Id,Name,Rate;$expand=UnitType($select=Id,Name))',\r\n 'UpdatedBy($select=Id,Name)',\r\n 'UnitType($select=Id,Name)',\r\n ].join(',')})`,\r\n ].join(','),\r\n };\r\n const data: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n url,\r\n params,\r\n );\r\n yield put(actions.loadMilestones_Success(data.value));\r\n}\r\nfunction* doCreateSample(action: PayloadAction) {\r\n try {\r\n const url = `/api/odata/v4/samples`;\r\n const response = yield call(httpClient.post, url, action.payload);\r\n yield put(actions.createSample_Success(response));\r\n } catch (error) {\r\n log.error('doCreateSample', error);\r\n yield put(actions.createSample_Error());\r\n const forbidden = (error as AxiosError)?.response?.status === 403;\r\n if (forbidden) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.Forbidden),\r\n }),\r\n );\r\n }\r\n }\r\n}\r\nfunction* doUpdateServiceRequestSampleField(\r\n action: PayloadAction>,\r\n) {\r\n const url = `/api/odata/v4/samples(${action.payload.Id})`;\r\n const payload: Omit, 'Id'> = action.payload;\r\n try {\r\n yield call(httpClient.patch, url, payload);\r\n yield put(actions.updateServiceRequestSampleField_Success());\r\n } catch (error) {\r\n log.error(error);\r\n yield put(actions.updateServiceRequestSampleField_Error());\r\n const forbidden = (error as AxiosError)?.response?.status === 403;\r\n if (forbidden) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.Forbidden),\r\n }),\r\n );\r\n return;\r\n }\r\n const msg = (error as AxiosError)?.response?.data?.error?.innererror\r\n ?.message;\r\n if (msg !== undefined) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'SamplesListPage.saga.updateField',\r\n variant: 'error',\r\n message: msg,\r\n }),\r\n );\r\n }\r\n yield put(actions.updateServiceRequestSampleField_Error());\r\n }\r\n}\r\n\r\nfunction* doUpdateServiceRequestRowValue(\r\n action: UpdateServiceRequestRowValueAction,\r\n) {\r\n // TODO: migrate value updates to the new api\r\n // const url = `/api/odata/v4/ServiceRequests(${action.payload.serviceRequestId})/Rows(${action.payload.serviceRequestValue.RowId})/Values`;\r\n const url = `/api/requests/${action.payload.serviceRequestId}/tabledata/${action.payload.serviceRequestValue.RowId}/${action.payload.serviceRequestValue.ColumnId}`;\r\n const payload =\r\n action.payload.serviceRequestValue.DisplayValue === null\r\n ? action.payload.serviceRequestValue.Value\r\n : {\r\n id: action.payload.serviceRequestValue.Value,\r\n text: action.payload.serviceRequestValue.DisplayValue,\r\n };\r\n\r\n try {\r\n yield call(httpClient.post, url, JSON.stringify(payload), {\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n yield put(actions.updateServiceRequestRowValue_Success());\r\n } catch (error) {\r\n log.error(error);\r\n yield put(actions.updateServiceRequestRowValue_Error());\r\n const forbidden = (error as AxiosError)?.response?.status === 403;\r\n if (forbidden) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.Forbidden),\r\n }),\r\n );\r\n return;\r\n }\r\n const msg = (error as AxiosError)?.response?.data?.error?.innererror\r\n ?.message;\r\n if (msg !== undefined) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'SamplesListPage.saga.updateField',\r\n variant: 'error',\r\n message: msg,\r\n }),\r\n );\r\n }\r\n yield put(actions.updateServiceRequestSampleField_Error());\r\n }\r\n}\r\n\r\nfunction* doImport(action: PayloadAction) {\r\n const file = action.payload.file;\r\n const serviceRequestId = action.payload.serviceRequestId;\r\n const url = `/api/SamplesImport/import?serviceRequestId=${serviceRequestId}`;\r\n try {\r\n const response = yield call(httpClient.uploadFile, url, file);\r\n const allRowsImportedSuccessfully = response.data?.size === 0;\r\n if (allRowsImportedSuccessfully) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.AllRowsImportedSuccessfully),\r\n }),\r\n );\r\n } else {\r\n yield call(fileDownload, response.data, 'import-result.xlsx');\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'warning',\r\n message: i18next.t(\r\n translations.OneOrMoreErrorOccurredDuringImportPleaseReviewOutputFile,\r\n ),\r\n }),\r\n );\r\n }\r\n yield put(actions.import_Success());\r\n } catch (error) {\r\n log.error(error);\r\n yield put(actions.import_Error());\r\n const forbidden = (error as AxiosError)?.response?.status === 403;\r\n if (forbidden) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.Forbidden),\r\n }),\r\n );\r\n return;\r\n }\r\n }\r\n}\r\n\r\nfunction* doDeleteSamples(action: PayloadAction) {\r\n let r: IDeleteSamplesResult = yield call(deleteSamples, action.payload);\r\n\r\n for (const error of r.errors) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: error.message,\r\n }),\r\n );\r\n }\r\n if (r.successCount > 0) {\r\n // reload table data\r\n const tableState = yield select(selectSamplesTableState);\r\n yield put(actions.loadSamples(tableState));\r\n\r\n // post success notification of deleted records\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.XRecordsWereBeDeleted, {\r\n x: r.successCount,\r\n }),\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doPatchRequestDetails(action: IServiceRequestPatchAction) {\r\n const url = `/api/odata/v4/ServiceRequests(${action.payload.Id})`;\r\n const payload = action.payload;\r\n try {\r\n yield call(httpClient.patch, url, payload);\r\n yield put(actions.patch_Success(action.payload));\r\n console.debug(payload);\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n}\r\nfunction* doUpdateStatus(action: IServiceRequestUpdateStatusAction) {\r\n const url = `/api/odata/v4/ServiceRequests(${action.payload.Id})/Status`;\r\n const payload = action.payload;\r\n try {\r\n const response = yield call(httpClient.post, url, {\r\n ...payload.Status,\r\n ...{ Reason: action.payload.Reason },\r\n });\r\n yield put(\r\n actions.updateStatus_Success({\r\n ...response,\r\n // old API returns Status in old format, override it here with IServiceRequestStatusDto\r\n Status: action.payload.Status,\r\n }),\r\n );\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.StatusUpdatedTo, action.payload.Status),\r\n variant: 'success',\r\n }),\r\n );\r\n console.debug(payload);\r\n } catch (error) {\r\n log.error(error);\r\n yield put(actions.updateStatus_Error(action.payload));\r\n const axiosError = error as AxiosError;\r\n const reason =\r\n axiosError?.response?.data?.error?.innererror?.message ??\r\n axiosError?.response?.data?.error?.message ??\r\n axiosError?.response?.data?.statusText ??\r\n i18next.t(translations.NA);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.ServiceRequestStatusUpdate_Error, {\r\n reason: reason,\r\n }),\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doUpdateServiceRequestRowStatus(\r\n action: PayloadAction<{\r\n serviceRequestId: number;\r\n serviceRequestRowId: number;\r\n status: IServiceRequestRowStatusDto | null;\r\n }>,\r\n) {\r\n try {\r\n yield call(\r\n httpClient.post,\r\n `api/requests/${action.payload.serviceRequestId}/tabledata/rows/${action.payload.serviceRequestRowId}/Status`,\r\n JSON.stringify(action.payload.status?.Id),\r\n {\r\n headers: { 'Content-Type': 'application/json' },\r\n },\r\n );\r\n yield put(actions.updateServiceRequestRowStatus_Success(action.payload));\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n}\r\n\r\nfunction* doUpdateBudget(action: IServiceRequestUpdateBudgetAction) {\r\n const url = `/api/odata/v4/ServiceRequests(${action.payload.Id})/Budget`;\r\n const payload = action.payload;\r\n try {\r\n const response: IServiceRequestDto = yield call(\r\n httpClient.post,\r\n url,\r\n payload.Budget,\r\n );\r\n yield put(actions.updateBudget_Success(response));\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.BudgetUpdatedTo, {\r\n Name: action.payload.Budget.Name,\r\n }),\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(actions.refreshRequestDetails(action.payload.Id));\r\n console.debug(payload);\r\n } catch (error) {\r\n log.error(error);\r\n yield put(actions.updateBudget_Error(action.payload));\r\n }\r\n}\r\n\r\nfunction* doSubmit(action: PayloadAction) {\r\n const url = `api/ServiceRequests/${action.payload.Id}/SubmitStep`;\r\n try {\r\n yield call(httpClient.post, url);\r\n yield put(actions.submitStep_success(action.payload));\r\n yield put(actions.refreshRequestDetails(action.payload.Id));\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.StepHasBeenSubmitted),\r\n variant: 'success',\r\n }),\r\n );\r\n } catch (error) {\r\n log.error(error);\r\n const errorMessages = getErrorMessages(error);\r\n yield* putErrorMessages(errorMessages);\r\n yield put(actions.submitStep_Error());\r\n }\r\n}\r\n\r\nfunction* putErrorMessages(errorMessages: Array | undefined) {\r\n if (errorMessages !== undefined) {\r\n for (const message of errorMessages) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: message,\r\n }),\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction getErrorMessages(error: unknown): Array | undefined {\r\n const axiosError = error as AxiosError;\r\n const isAxiosError = axiosError.isAxiosError;\r\n if (isAxiosError) {\r\n const dataErrorMessages = axiosError.response?.data?.ErrorMessages;\r\n if (\r\n Array.isArray(dataErrorMessages) &&\r\n dataErrorMessages.length > 0 &&\r\n typeof dataErrorMessages[0] === 'string'\r\n ) {\r\n return dataErrorMessages as Array;\r\n }\r\n }\r\n}\r\n\r\nfunction* doCancelServiceRequest(action: ICancelServiceRequestPayloadAction) {\r\n const url = `api/ServiceRequests/${action.payload}/CancelStep`;\r\n try {\r\n yield call(httpClient.post, url);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.RequestCancelled),\r\n }),\r\n );\r\n yield put(actions.refreshRequestDetails(action.payload.serviceRequestId));\r\n } catch (error) {\r\n log.error(error);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.err_OperationFailed),\r\n }),\r\n );\r\n }\r\n}\r\n\r\nfunction* doInsertMilestoneCharge(\r\n action: InsertServiceRequestMilestoneChargeAction,\r\n) {\r\n const serviceRequest: IServiceRequestDto = yield select(\r\n selectRequestDetailsData,\r\n );\r\n if (serviceRequest === undefined) {\r\n return;\r\n }\r\n try {\r\n const url = `/api/requests/${action.payload.ServiceRequestId}/ServiceRequestMilestone/${action.payload.ServiceRequestMilestoneId}/ServiceRequestMilestoneCharge`;\r\n\r\n const result: IRequestMilestoneManualChargeModel = yield call(\r\n httpClient.post,\r\n url,\r\n action.payload,\r\n );\r\n\r\n const charge: IServiceRequestMilestoneChargeDto = {\r\n Date: result.Date,\r\n Id: result.Id,\r\n Amount:\r\n (result.Rate ?? action.payload.OfflineServiceType?.Rate ?? 0) *\r\n (result.Quantity ?? 0),\r\n InvoiceId: null,\r\n Name: result.Name,\r\n //OfflineServiceTypeId: result.OfflineServiceType?.Id,\r\n Quantity: result.Quantity,\r\n OfflineServiceTypeId: result.OfflineServiceType?.Id ?? null,\r\n Rate: result.Rate,\r\n Remarks: result.Remarks,\r\n ServiceRequestMilestoneId: action.payload.ServiceRequestMilestoneId,\r\n Service:\r\n (action.payload.OfflineServiceType as IConsumableServiceDto) ?? null,\r\n UnitTypeId: null,\r\n\r\n UpdatedBy:\r\n result.UpdatedBy === null\r\n ? null\r\n : {\r\n Id: result.UpdatedBy?.Id,\r\n Name: result.UpdatedBy?.Title,\r\n },\r\n UnitType:\r\n (result.Unit as Entity) ??\r\n action.payload.OfflineServiceType?.UnitType ??\r\n null,\r\n };\r\n yield put(actions.insertMilestoneCharge_Success(charge));\r\n yield put(actions.closeSidePanel());\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.InsertSuccess),\r\n }),\r\n );\r\n } catch (error) {\r\n log.error(error);\r\n yield put(actions.insertMilestoneCharge_Error());\r\n }\r\n}\r\nfunction* doDeleteServiceRequestMilestoneCharge(\r\n action: PayloadAction,\r\n) {\r\n const serviceRequest: IServiceRequestDto = yield select(\r\n selectRequestDetailsData,\r\n );\r\n if (serviceRequest === undefined) {\r\n return;\r\n }\r\n try {\r\n const url = `api/requests/${serviceRequest.Id}/ServiceRequestMilestone/${action.payload.ServiceRequestMilestoneId}/ServiceRequestMilestoneCharge/${action.payload.Id}`;\r\n yield call(httpClient.delete, url);\r\n yield put(actions.deleteMilestoneCharge_Success(action.payload));\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.DeleteSuccess),\r\n }),\r\n );\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n}\r\nfunction* doUpdateMilestoneCharge(\r\n action: UpdateServiceRequestMilestoneChargeAction,\r\n) {\r\n const serviceRequest: IServiceRequestDto = yield select(\r\n selectRequestDetailsData,\r\n );\r\n if (serviceRequest === undefined) {\r\n return;\r\n }\r\n try {\r\n const url = `/api/requests/${action.payload.ServiceRequestId}/ServiceRequestMilestone/${action.payload.ServiceRequestMilestoneId}/ServiceRequestMilestoneCharge`;\r\n const authenticatedUser: IAuthenticatedUser = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n\r\n const result: IRequestMilestoneManualChargeModel = yield call(\r\n httpClient.put,\r\n url,\r\n action.payload,\r\n );\r\n\r\n const charge: IServiceRequestMilestoneChargeDto = {\r\n Date: result.Date,\r\n Id: result.Id,\r\n Amount:\r\n (result.Rate ?? action.payload.OfflineServiceType?.Rate ?? 0) *\r\n (result.Quantity ?? 0),\r\n InvoiceId: null,\r\n Name: result.Name,\r\n //OfflineServiceTypeId: result.OfflineServiceType?.Id,\r\n Quantity: result.Quantity,\r\n OfflineServiceTypeId: result.OfflineServiceType?.Id ?? null,\r\n Rate: result.Rate,\r\n Remarks: result.Remarks,\r\n ServiceRequestMilestoneId: action.payload.ServiceRequestMilestoneId,\r\n Service: result.OfflineServiceType as IConsumableServiceDto,\r\n UnitTypeId: action.payload.Unit?.Id ?? null,\r\n UpdatedBy:\r\n action.payload.UpdatedBy === null\r\n ? null\r\n : action.payload.UpdatedBy === undefined\r\n ? null\r\n : {\r\n Id: action.payload.UpdatedBy.Id,\r\n Name: action.payload.UpdatedBy.Title,\r\n } ?? authenticatedUser,\r\n UnitType:\r\n (result.Unit as Entity) ??\r\n action.payload.OfflineServiceType?.UnitType ??\r\n null,\r\n };\r\n yield put(actions.closeSidePanel());\r\n yield put(actions.updateMilestoneCharge_Success(charge));\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.UpdateSuccess),\r\n }),\r\n );\r\n } catch (error) {\r\n log.error(error);\r\n yield put(actions.updateMilestoneCharge_Error());\r\n }\r\n}\r\nfunction* doInsertMilestone(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n var url = `api/requests/${action.payload.ServiceRequestId}/ServiceRequestMilestones`;\r\n var data: Partial = {\r\n Name: action.payload.Name,\r\n CompletionDate: action.payload.CompletionDate,\r\n Assignees: action.payload.Assignees?.map(function (u) {\r\n return u.Id;\r\n }).join(','),\r\n };\r\n const response = yield call(httpClient.post, url, data);\r\n\r\n const p: IServiceRequestMilestoneDto = {\r\n Assignees: action.payload.Assignees,\r\n Charged: false,\r\n Id: response.Id,\r\n ServiceRequestMilestoneCharges: [],\r\n CompletionDate: response.CompletionDate,\r\n Name: response.Name,\r\n Description: response.Description,\r\n InvoiceId: null,\r\n ServiceRequestId: action.payload.ServiceRequestId,\r\n Status: action.payload.Status,\r\n TargetDate: response.TargetDate,\r\n };\r\n yield put(actions.insertMilestone_Success(p));\r\n yield put(actions.closeSidePanel());\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'foo',\r\n variant: 'success',\r\n message: i18next.t(translations.InsertSuccess),\r\n }),\r\n );\r\n } catch (error) {\r\n log.error(error);\r\n const msg = (error as AxiosError)?.message;\r\n if (msg !== undefined) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n key: 'foo',\r\n message: msg,\r\n }),\r\n );\r\n }\r\n yield put(actions.insertMilestone_Error());\r\n }\r\n}\r\nfunction* doDeleteMilestone(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n var url = `/api/requests/${action.payload.ServiceRequestId}/ServiceRequestMilestones/${action.payload.Id}`;\r\n yield call(httpClient.delete, url);\r\n yield put(actions.deleteMilestone_Success(action.payload));\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.DeleteSuccess),\r\n }),\r\n );\r\n } catch (error) {\r\n //todo\r\n log.error(error);\r\n }\r\n}\r\nfunction* doUpdateMilestone(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n var url = `/api/requests/${action.payload.ServiceRequestId}/ServiceRequestMilestones/${action.payload.Id}`;\r\n const requestPayload: ServiceRequestMilestoneInsertModel = {\r\n Assignees: action.payload.Assignees?.map(f => f.Id).join(','),\r\n\r\n Id: action.payload.Id,\r\n\r\n CompletionDate: action.payload.CompletionDate,\r\n Name: action.payload.Name,\r\n Description: action.payload.Description,\r\n ServiceRequestId: action.payload.ServiceRequestId,\r\n StatusId:\r\n ServiceRequestMilestoneStatuses[action.payload.Status ?? 'NotStarted'],\r\n TargetDate: action.payload.TargetDate,\r\n };\r\n const response: ServiceRequestMilestoneInsertModel = yield call(\r\n httpClient.put,\r\n url,\r\n requestPayload,\r\n );\r\n yield put(\r\n actions.updateMilestone_Success({\r\n ...action.payload,\r\n ...{\r\n Status:\r\n (response.StatusId === null\r\n ? undefined\r\n : (ServiceRequestMilestoneStatuses[\r\n response.StatusId\r\n ] as ServiceRequestMilestoneStatusesUnion)) ?? 'NotStarted',\r\n CompletionDate: response.CompletionDate,\r\n },\r\n }),\r\n );\r\n yield put(actions.closeSidePanel());\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.UpdateSuccess),\r\n }),\r\n );\r\n } catch (error) {\r\n //todo\r\n log.error(error);\r\n }\r\n}\r\nfunction* doOpenSidePanel(action: PayloadAction) {\r\n const sidePanelState: SidePanelState = yield select(selectSidePanelState);\r\n const isSidePanelOpen =\r\n sidePanelState.sidePanelOpen &&\r\n sidePanelState.pageType === RenderPageType.ServiceRequestDetails;\r\n if (!isSidePanelOpen) {\r\n yield put(layoutActions.openSidePanel(action.payload));\r\n } else {\r\n yield put(actions.setCover(action.payload));\r\n }\r\n}\r\nfunction* doCloseSidePanel(action: PayloadAction) {\r\n const sidePanelState: SidePanelState = yield select(selectSidePanelState);\r\n const isSidePanelOpen =\r\n sidePanelState.sidePanelOpen &&\r\n sidePanelState.pageType === RenderPageType.ServiceRequestDetails;\r\n if (isSidePanelOpen) {\r\n yield put(actions.setCover());\r\n } else {\r\n yield put(layoutActions.resetSidePanel());\r\n }\r\n}\r\nfunction* doCloneServiceRequest(action: PayloadAction) {\r\n try {\r\n const url = `api/ServiceRequests/${action.payload}/CopyStep`;\r\n const response: { NewRequestId: number } = yield call(httpClient.post, url);\r\n yield put(push(GetServiceRequestDetailsPath(response.NewRequestId)));\r\n } catch (error) {\r\n log.error(error);\r\n const axiosError = error as AxiosError;\r\n const messages = getv2ControllerErrorMessages(axiosError?.response);\r\n if (messages !== undefined && messages.length > 0) {\r\n appSettingsActions.addNotifications(\r\n messages.map(message => ({\r\n variant: 'error',\r\n message: message,\r\n })),\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction* doCreateServiceRequestRow(\r\n action: PayloadAction>,\r\n) {\r\n const messageKey = 'doCreateServiceRequestRow';\r\n try {\r\n if (action.payload.ServiceRequestId === undefined) {\r\n log.error(\r\n 'doCreateServiceRequestRow - ServiceRequestId is required',\r\n action.payload,\r\n );\r\n return;\r\n }\r\n const url = `api/odata/v4/ServiceRequests(${action.payload.ServiceRequestId})/Rows`;\r\n const columns = yield select(selectServiceRequestCustomFormColumns);\r\n const dto = serviceRequestModelToDto(action.payload, columns);\r\n const response: IServiceRequestRowDto = yield call(\r\n httpClient.post,\r\n url,\r\n dto,\r\n );\r\n yield put(\r\n actions.createServiceRequestRow_Success(\r\n prepareServiceRequestRowModel([response], columns),\r\n ),\r\n );\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n key: messageKey,\r\n message: i18next.t(\r\n translations.ServiceRequestRow_InsertSuccess,\r\n response,\r\n ),\r\n }),\r\n );\r\n } catch (error) {\r\n log.error(error);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n key: messageKey,\r\n message: i18next.t(translations.ServiceRequestRow_InsertError),\r\n }),\r\n );\r\n }\r\n}\r\n\r\nconst getv2ControllerErrorMessages = (\r\n response?: AxiosResponse,\r\n): string[] | undefined => {\r\n if (response === undefined) {\r\n return undefined;\r\n }\r\n const message: string[] = [];\r\n\r\n if (typeof response.data == 'string') {\r\n message.push(response.data);\r\n } else if (response.data.ExceptionMessage !== undefined) {\r\n message.push(response.data.ExceptionMessage);\r\n } else if (response.data.Message !== undefined) {\r\n message.push(response.data.Message);\r\n } else if (response.data.message !== undefined) {\r\n message.push(response.data.message);\r\n } else if (response.data.ErrorMessages) {\r\n for (var i = 0; i < response.data.ErrorMessages.length; i++) {\r\n message.push(response.data.ErrorMessages[i] as string);\r\n }\r\n }\r\n\r\n return message;\r\n};\r\n\r\nfunction* doLoadServiceRequestRowStatuses() {\r\n try {\r\n const SampleManagementTablesEnabled = yield select(state =>\r\n selectKnownModule(state, KnownModules.SampleManagementTables),\r\n );\r\n if (SampleManagementTablesEnabled) {\r\n const data: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n '/api/odata/v4/ServiceRequestRowStatuses',\r\n );\r\n yield put(actions.loadServiceRequestRowStatuses_Success(data.value));\r\n }\r\n } catch (error) {\r\n log.error('Error loading service request row statuses');\r\n }\r\n}\r\n\r\nexport function* requestSamplesSaga() {\r\n yield takeLeading(actions.init.type, doInit);\r\n yield takeLatest(actions.loadRequestDetails.type, doLoadRequestDetails);\r\n yield takeLatest(actions.refreshRequestDetails.type, doRefreshRequestDetails);\r\n yield takeLatest(actions.loadFormValues.type, doLoadFormValues);\r\n yield takeLatest(actions.loadMilestones.type, doLoadMilestones);\r\n yield takeLatest(actions.insertMilestoneCharge.type, doInsertMilestoneCharge);\r\n yield takeLatest(actions.updateMilestoneCharge.type, doUpdateMilestoneCharge);\r\n yield takeLatest(\r\n actions.deleteMilestoneCharge.type,\r\n doDeleteServiceRequestMilestoneCharge,\r\n );\r\n yield takeLatest(actions.openSidePanel.type, doOpenSidePanel);\r\n yield takeLatest(actions.closeSidePanel.type, doCloseSidePanel);\r\n\r\n yield takeLatest(actions.insertMilestone.type, doInsertMilestone);\r\n yield takeLatest(actions.updateMilestone.type, doUpdateMilestone);\r\n yield takeLatest(actions.deleteMilestone.type, doDeleteMilestone);\r\n\r\n yield takeLatest(actions.loadSamples.type, doLoadSamples);\r\n yield takeLatest(actions.patch.type, doPatchRequestDetails);\r\n yield takeLatest(actions.updateStatus.type, doUpdateStatus);\r\n yield takeLatest(\r\n actions.updateServiceRequestRowStatus.type,\r\n doUpdateServiceRequestRowStatus,\r\n );\r\n yield takeLatest(actions.updateBudget.type, doUpdateBudget);\r\n yield takeLatest(actions.submitStep.type, doSubmit);\r\n yield takeLatest(actions.cancelServiceRequest.type, doCancelServiceRequest);\r\n yield takeLatest(actions.createSample.type, doCreateSample);\r\n yield debounce(\r\n 100,\r\n actions.updateServiceRequestSampleField.type,\r\n doUpdateServiceRequestSampleField,\r\n );\r\n yield debounce(\r\n 100,\r\n actions.updateServiceRequestRowValue.type,\r\n doUpdateServiceRequestRowValue,\r\n );\r\n yield takeLatest(actions.import.type, doImport);\r\n yield takeLatest(actions.import_Success.type, doLoadSamples);\r\n yield takeLeading(actions.deleteSamples.type, doDeleteSamples);\r\n yield takeLeading(actions.cloneServiceRequest, doCloneServiceRequest);\r\n\r\n yield takeEvery(\r\n actions.createServiceRequestRow.type,\r\n doCreateServiceRequestRow,\r\n );\r\n\r\n // yield takeLatest(\r\n // actions.loadServiceRequestRows.type,\r\n // doLoadServiceRequestRows,\r\n // );\r\n\r\n yield takeLatestByKey(\r\n actions.saveFormValues.type,\r\n f => f?.FormFieldId,\r\n doSaveFormValue,\r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { IServiceRequestDto } from 'api/odata/generated/entities/IServiceRequestDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { requestSamplesSaga } from './saga';\r\nimport {\r\n ISample,\r\n ISampleListTableState,\r\n IRequestSamplesState,\r\n IServiceRequestPatchAction,\r\n IServiceRequestUpdateStatusAction,\r\n IServiceRequestUpdateBudgetAction,\r\n ILoadServiceRequestMilestonesAction,\r\n ILoadServiceRequestMilestonesSuccessAction,\r\n InsertServiceRequestMilestoneChargeAction,\r\n UpdateServiceRequestMilestoneChargeAction,\r\n ICancelServiceRequestPayloadAction,\r\n ServiceRequestRowsTableState,\r\n UpdateServiceRequestRowValueAction,\r\n IServiceRequestTableRowModel,\r\n IRequestDetailsModel,\r\n IServiceRequestDetailsFormModel,\r\n} from './types';\r\nimport { IServiceRequestMilestoneChargeDto } from 'api/odata/generated/entities/IServiceRequestMilestoneChargeDto';\r\nimport { merge, remove } from 'lodash';\r\nimport { IServiceRequestMilestoneDto } from 'api/odata/generated/entities/IServiceRequestMilestoneDto';\r\nimport { IOpenSidePanelPayload } from 'app/Layout/FrontendLayout/slice';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport { IServiceRequestRowDto } from 'api/odata/generated/entities/IServiceRequestRowDto';\r\nimport { IServiceRequestRowStatusDto } from 'api/odata/generated/entities/IServiceRequestRowStatusDto';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\n\r\nexport const initialState: IRequestSamplesState = {\r\n RequestSamples: {},\r\n ServiceRequestStatuses: {},\r\n ServiceRequestRows: {},\r\n fieldsState: {},\r\n SamplesTableState: {\r\n pageSize: 10,\r\n pageIndex: 0,\r\n sortBy: [{ id: 'Id', desc: true }],\r\n customFilters: [],\r\n globalFilter: '',\r\n },\r\n SamplesSelected: [],\r\n RequestDetails: {},\r\n ImportState: {\r\n open: false,\r\n processing: false,\r\n },\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'requestSamples',\r\n initialState,\r\n reducers: {\r\n init(state, action: PayloadAction) {},\r\n initServiceRequestStatuses_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.ServiceRequestStatuses = {\r\n status: 'resolved',\r\n value: action.payload,\r\n };\r\n },\r\n initServiceRequestStatuses_Error(state, action: PayloadAction) {\r\n state.ServiceRequestStatuses = {\r\n status: 'rejected',\r\n };\r\n },\r\n loadServiceRequestRowStatuses_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.ServiceRequestRowStatuses = action.payload;\r\n },\r\n loadRequestDetails(state, action: PayloadAction) {\r\n state.RequestDetails = { status: 'pending' };\r\n state.serviceRequestId = action.payload;\r\n },\r\n loadRequestDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.RequestDetails = {\r\n status: 'resolved',\r\n value: action.payload,\r\n };\r\n },\r\n loadRequestDetails_Error(state, action: PayloadAction) {\r\n state.RequestDetails = {\r\n status: 'rejected',\r\n error: action.payload,\r\n };\r\n },\r\n\r\n refreshRequestDetails(state, action: PayloadAction) {\r\n state.RequestDetails.status = 'pending';\r\n },\r\n refreshRequestDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n if (state.RequestDetails.value !== undefined) {\r\n state.RequestDetails.value = {\r\n ...state.RequestDetails.value,\r\n ...action.payload,\r\n };\r\n }\r\n state.RequestDetails.status = 'resolved';\r\n },\r\n\r\n loadFormValues(state, action: PayloadAction) {},\r\n loadFormValues_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n if (state.RequestDetails.value === undefined) {\r\n return;\r\n }\r\n state.RequestDetails.value.FormValues = action.payload;\r\n },\r\n\r\n updateStatus(state, action: IServiceRequestUpdateStatusAction) {\r\n state.fieldsState.Status = { status: 'pending' };\r\n },\r\n updateStatus_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n if (state.RequestDetails.value === undefined) {\r\n return;\r\n }\r\n merge(state.RequestDetails.value, action.payload);\r\n if (state.fieldsState.Status !== undefined) {\r\n state.fieldsState.Status.status = 'resolved';\r\n }\r\n },\r\n updateStatus_Error(state, action: IServiceRequestUpdateStatusAction) {\r\n if (state.RequestDetails.value === undefined) {\r\n return;\r\n }\r\n state.RequestDetails.value.Status = {\r\n ...state.RequestDetails.value.Status,\r\n };\r\n delete state.fieldsState.Status;\r\n },\r\n\r\n updateBudget(state, action: IServiceRequestUpdateBudgetAction) {\r\n state.fieldsState.Budget = { status: 'pending' };\r\n },\r\n updateBudget_Success(state, action: IServiceRequestUpdateBudgetAction) {\r\n if (state.RequestDetails.value === undefined) {\r\n return;\r\n }\r\n Object.assign(state.RequestDetails.value, action.payload);\r\n delete state.fieldsState.Budget;\r\n },\r\n updateBudget_Error(state, action: IServiceRequestUpdateBudgetAction) {\r\n if (state.RequestDetails.value === undefined) {\r\n return;\r\n }\r\n state.RequestDetails.value.Budget = {\r\n ...state.RequestDetails.value.Budget,\r\n };\r\n delete state.fieldsState.Budget;\r\n },\r\n\r\n submitStep(state, action: PayloadAction) {\r\n state.submitting = true;\r\n },\r\n submitStep_success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.submitting = false;\r\n if (state.RequestDetails.value !== undefined) {\r\n Object.assign(state.RequestDetails.value, action.payload);\r\n }\r\n },\r\n submitStep_Error(state, action: PayloadAction) {\r\n state.submitting = false;\r\n },\r\n cancelServiceRequest(state, action: ICancelServiceRequestPayloadAction) {},\r\n\r\n patch(state, action: IServiceRequestPatchAction) {\r\n // update state to processing of each field being updated\r\n const fields = (Object.keys(action.payload) as Array<\r\n keyof typeof action.payload\r\n >)\r\n .filter(f => f !== 'Id')\r\n .reduce((prev, current) => {\r\n prev[current] = { processing: true };\r\n return prev;\r\n }, {});\r\n Object.assign(state.fieldsState, fields);\r\n },\r\n patch_Success(state, action: IServiceRequestPatchAction) {\r\n if (state.RequestDetails.value === undefined) {\r\n return;\r\n }\r\n // release fields that were being processes\r\n Object.keys(action.payload).forEach(f => delete state.fieldsState[f]);\r\n Object.assign(state.RequestDetails.value, action.payload);\r\n },\r\n patch_Error(state, action: IServiceRequestPatchAction) {\r\n // release fields that were being processes\r\n Object.keys(action.payload).forEach(f => delete state.fieldsState[f]);\r\n },\r\n\r\n saveFormValues(\r\n state,\r\n action: PayloadAction<\r\n Pick &\r\n Pick & { Value: any }\r\n >,\r\n ) {},\r\n\r\n loadSamples(state, action: PayloadAction) {\r\n state.RequestSamples.status = 'pending';\r\n state.SamplesTableState = {\r\n pageSize: action.payload.pageSize,\r\n pageIndex: action.payload.pageIndex,\r\n sortBy: action.payload.sortBy,\r\n globalFilter: action.payload.globalFilter,\r\n searchColumns: action.payload.searchColumns,\r\n customFilters: action.payload.customFilters?.map(filter => ({\r\n fieldName: filter.fieldName,\r\n operator: filter.operator,\r\n value: filter.value,\r\n })),\r\n };\r\n },\r\n loadSamples_Success(state, action: PayloadAction) {\r\n state.RequestSamples = {\r\n status: 'resolved',\r\n value: {\r\n data: action.payload.value as ISample[],\r\n dataLength: action.payload['@odata.count'],\r\n },\r\n };\r\n },\r\n loadSamples_Error(state, action: PayloadAction) {\r\n state.RequestSamples.status = 'rejected';\r\n state.RequestSamples.error = action.payload;\r\n },\r\n\r\n loadServiceRequestRows(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.ServiceRequestRows.status = 'pending';\r\n },\r\n loadServiceRequestRows_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.ServiceRequestRows = {\r\n value: action.payload,\r\n\r\n status: 'resolved',\r\n };\r\n\r\n Object.assign(state.RequestDetails.value, { Rows: action.payload });\r\n },\r\n loadServiceRequestRows_Error(state, error: PayloadAction) {\r\n state.ServiceRequestRows = { error: true };\r\n },\r\n\r\n deleteServiceRequestRows(\r\n state,\r\n action: PayloadAction>,\r\n ) {},\r\n deleteServiceRequestRows_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n const id = action.payload.map(item => item.Id);\r\n state.ServiceRequestRows.value = state.ServiceRequestRows.value?.filter(\r\n item => !id.includes(item.Id),\r\n );\r\n },\r\n\r\n createServiceRequestRow(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n //state.RequestServiceRequestRows.processing = true;\r\n state.createServiceRequestRowStatus = 'pending';\r\n },\r\n createServiceRequestRow_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.ServiceRequestRows.value?.push(...action.payload);\r\n state.createServiceRequestRowStatus = 'resolved';\r\n },\r\n createServiceRequestRow_Error(state, action: PayloadAction) {\r\n state.createServiceRequestRowStatus = 'rejected';\r\n },\r\n\r\n loadMilestones(state, action: ILoadServiceRequestMilestonesAction) {},\r\n loadMilestones_Success(\r\n state,\r\n action: ILoadServiceRequestMilestonesSuccessAction,\r\n ) {\r\n if (state.RequestDetails.value !== undefined) {\r\n state.RequestDetails.value.Milestones = action.payload;\r\n }\r\n },\r\n\r\n insertMilestone(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.milestoneProcessing = true;\r\n },\r\n insertMilestone_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n const serviceRequest = state.RequestDetails.value;\r\n if (serviceRequest !== undefined) {\r\n serviceRequest.Milestones.push(action.payload);\r\n }\r\n state.milestoneProcessing = false;\r\n },\r\n insertMilestone_Error(state, action: PayloadAction) {\r\n state.milestoneProcessing = false;\r\n },\r\n updateMilestone(\r\n state,\r\n action: PayloadAction>>,\r\n ) {\r\n state.milestoneProcessing = true;\r\n },\r\n updateMilestone_Success(\r\n state,\r\n action: PayloadAction<\r\n Partial & Pick\r\n >,\r\n ) {\r\n const serviceRequest = state.RequestDetails.value;\r\n if (serviceRequest !== undefined) {\r\n const milestone = serviceRequest.Milestones.find(\r\n f => f.Id === action.payload.Id,\r\n );\r\n if (milestone !== undefined) {\r\n Object.assign(milestone, action.payload);\r\n }\r\n }\r\n state.milestoneProcessing = false;\r\n },\r\n updateMilestone_Error(state, action: PayloadAction) {\r\n state.milestoneProcessing = false;\r\n },\r\n deleteMilestone(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n deleteMilestone_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n const serviceRequest = state.RequestDetails.value;\r\n if (serviceRequest !== undefined) {\r\n remove(serviceRequest.Milestones, f => f.Id === action.payload.Id);\r\n }\r\n },\r\n\r\n insertMilestoneCharge(\r\n state,\r\n action: InsertServiceRequestMilestoneChargeAction,\r\n ) {\r\n state.milestoneChargeProcessing = true;\r\n },\r\n insertMilestoneCharge_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n if (state.RequestDetails.value !== undefined) {\r\n const milestone = state.RequestDetails.value.Milestones.find(\r\n f => f.Id === action.payload.ServiceRequestMilestoneId,\r\n );\r\n if (milestone !== undefined) {\r\n milestone.ServiceRequestMilestoneCharges.push(action.payload);\r\n }\r\n }\r\n state.milestoneChargeProcessing = false;\r\n },\r\n insertMilestoneCharge_Error(state, action: PayloadAction) {\r\n state.milestoneChargeProcessing = false;\r\n },\r\n openSidePanel(state, action: PayloadAction) {},\r\n closeSidePanel(state, action: PayloadAction) {},\r\n setCover(state, action: PayloadAction) {\r\n state.SidePanel = action.payload;\r\n },\r\n updateMilestoneCharge(\r\n state,\r\n action: UpdateServiceRequestMilestoneChargeAction,\r\n ) {\r\n state.milestoneChargeProcessing = true;\r\n },\r\n updateMilestoneCharge_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n if (state.RequestDetails.value !== undefined) {\r\n const milestone = state.RequestDetails.value.Milestones.find(\r\n f => f.Id === action.payload.ServiceRequestMilestoneId,\r\n );\r\n if (milestone !== undefined) {\r\n const charge = milestone.ServiceRequestMilestoneCharges.find(\r\n f => f.Id === action.payload.Id,\r\n );\r\n if (charge !== undefined) {\r\n Object.assign(charge, action.payload);\r\n }\r\n }\r\n }\r\n state.milestoneChargeProcessing = false;\r\n },\r\n updateMilestoneCharge_Error(state, action: PayloadAction) {\r\n state.milestoneChargeProcessing = false;\r\n },\r\n deleteMilestoneCharge(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n deleteMilestoneCharge_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n if (state.RequestDetails.value !== undefined) {\r\n const milestone = state.RequestDetails.value.Milestones.find(\r\n f => f.Id === action.payload.ServiceRequestMilestoneId,\r\n );\r\n if (milestone !== undefined) {\r\n remove(\r\n milestone.ServiceRequestMilestoneCharges,\r\n f => f.Id === action.payload.Id,\r\n );\r\n }\r\n }\r\n },\r\n setSelected(state, action: PayloadAction) {\r\n state.SamplesSelected = action.payload;\r\n },\r\n\r\n createSample(state, action: PayloadAction) {\r\n state.RequestSamples = { status: 'pending' };\r\n },\r\n createSample_Success(state, action: PayloadAction) {\r\n state.RequestSamples.value?.data?.push(action.payload);\r\n state.RequestSamples.status = 'resolved';\r\n if (state.RequestSamples.value !== undefined) {\r\n state.RequestSamples.value.dataLength =\r\n (state.RequestSamples.value.dataLength ?? 0) + 1;\r\n }\r\n },\r\n createSample_Error(state, action: PayloadAction) {\r\n state.RequestSamples.status = 'rejected';\r\n },\r\n\r\n updateServiceRequestSampleField(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n // update row in samples list\r\n const item = state.RequestSamples?.value?.data?.find(\r\n s => s.Id === action.payload.Id,\r\n );\r\n if (item !== undefined) {\r\n Object.assign(item, action.payload);\r\n }\r\n },\r\n updateServiceRequestSampleField_Success(state, action: PayloadAction) {},\r\n updateServiceRequestSampleField_Error(state, action: PayloadAction) {},\r\n\r\n updateServiceRequestRowValue(\r\n state,\r\n action: UpdateServiceRequestRowValueAction,\r\n ) {},\r\n updateServiceRequestRowValue_Success(state, action: PayloadAction) {\r\n // TODO: update internal state\r\n },\r\n updateServiceRequestRowValue_Error(state, action: PayloadAction) {\r\n // TODO: ??\r\n },\r\n\r\n updateServiceRequestRowStatus(\r\n state,\r\n action: PayloadAction<{\r\n serviceRequestId: number;\r\n serviceRequestRowId: number;\r\n status: IServiceRequestRowStatusDto | null;\r\n }>,\r\n ) {},\r\n updateServiceRequestRowStatus_Success(\r\n state,\r\n action: PayloadAction<{\r\n serviceRequestId: number;\r\n serviceRequestRowId: number;\r\n status: IServiceRequestRowStatusDto | null;\r\n }>,\r\n ) {\r\n if (action.payload.status !== null) {\r\n const row = state.ServiceRequestRows.value?.find(\r\n f => f.Id === action.payload.serviceRequestRowId,\r\n );\r\n if (row !== undefined) {\r\n row.Status = action.payload.status;\r\n row.StatusId = action.payload.status?.Id;\r\n }\r\n }\r\n },\r\n\r\n toggleImport(state, action: PayloadAction) {\r\n state.ImportState.open = action.payload;\r\n },\r\n\r\n import(state, action: PayloadAction) {\r\n state.ImportState.processing = true;\r\n },\r\n import_Success(state, action: PayloadAction) {\r\n state.ImportState.processing = false;\r\n state.ImportState.open = false;\r\n },\r\n import_Error(state, action: PayloadAction) {\r\n state.ImportState.processing = false;\r\n },\r\n\r\n setHasFiles(state, action: PayloadAction) {\r\n if (state.RequestDetails.value !== undefined) {\r\n state.RequestDetails.value.HasFiles = action.payload;\r\n }\r\n },\r\n\r\n deleteSamples(state, action: PayloadAction) {},\r\n cloneServiceRequest(state, action: PayloadAction) {},\r\n },\r\n});\r\n\r\nexport const { actions: requestSamplesActions } = slice;\r\n\r\nexport const useRequestSamplesSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: requestSamplesSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useRequestSamplesSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { ISamplePlateDto } from 'api/odata/generated/entities/ISamplePlateDto';\r\nimport { Entity } from 'types/common';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { toEntity } from 'utils/entity-utils';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { samplePlatesSaga } from './saga';\r\nimport {\r\n IBulkSamplePlateCreate,\r\n ISamplePlateCreate,\r\n SamplePlatesState,\r\n SamplePlatesTableState,\r\n} from './types';\r\n\r\nexport const initialState: SamplePlatesState = {\r\n data: { processing: false },\r\n create: { processing: false },\r\n bulckCreate: { processing: false },\r\n update: { processing: false },\r\n delete: { processing: false },\r\n tableState: {\r\n pageSize: 10,\r\n pageIndex: 0,\r\n sortBy: [{ id: 'Id', desc: true }],\r\n customFilters: [],\r\n globalFilter: '',\r\n },\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'samplePlates',\r\n initialState,\r\n reducers: {\r\n get(state, action: PayloadAction) {\r\n state.data.processing = true;\r\n state.tableState = {\r\n pageSize: action.payload.pageSize,\r\n pageIndex: action.payload.pageIndex,\r\n sortBy: action.payload.sortBy,\r\n globalFilter: action.payload.globalFilter,\r\n serviceGroups:\r\n action.payload.serviceGroups?.length !== 0\r\n ? action.payload.serviceGroups\r\n : undefined,\r\n visibleColumns: action.payload.visibleColumns,\r\n customFilters: action.payload.customFilters?.map(filter => ({\r\n fieldName: filter.fieldName,\r\n operator: filter.operator,\r\n value: filter.value,\r\n })),\r\n };\r\n },\r\n get_Success(state, action: PayloadAction) {\r\n state.data.processing = false;\r\n state.data.error = undefined;\r\n state.data.data = action.payload.value;\r\n state.data.dataLength = action.payload['@odata.count'];\r\n },\r\n get_Error(state, action: PayloadAction) {},\r\n\r\n export(state, action: PayloadAction) {},\r\n\r\n getPlateTypes_Success(state, action: PayloadAction[]>) {\r\n state.plateTypes = action.payload;\r\n },\r\n\r\n showCreate(\r\n state,\r\n action: PayloadAction<{ serviceGroups: Entity[] }>,\r\n ) {\r\n state.create.open = true;\r\n state.create.initialValues = {\r\n IsRack: false,\r\n ServiceGroup:\r\n action.payload.serviceGroups.length === 1\r\n ? action.payload.serviceGroups[0]\r\n : undefined,\r\n SamplePlateType: state.plateTypes?.[0],\r\n Active: true,\r\n };\r\n },\r\n showBulkCreate(\r\n state,\r\n action: PayloadAction<{ serviceGroups: Entity[] }>,\r\n ) {\r\n state.bulckCreate.open = true;\r\n state.bulckCreate.initialValues = {\r\n IsRack: false,\r\n ServiceGroup:\r\n action.payload.serviceGroups.length === 1\r\n ? action.payload.serviceGroups[0]\r\n : undefined,\r\n SamplePlateType: state.plateTypes?.[0],\r\n Active: true,\r\n };\r\n },\r\n hideCreate(state, action: PayloadAction) {\r\n state.create.processing = false;\r\n state.create.open = false;\r\n },\r\n hideBulkCreate(state, action: PayloadAction) {\r\n state.bulckCreate.processing = false;\r\n state.bulckCreate.open = false;\r\n },\r\n create(state, action: PayloadAction) {\r\n state.create.processing = true;\r\n },\r\n bulkCreate(state, action: PayloadAction) {\r\n state.bulckCreate.processing = true;\r\n },\r\n bulkCreate_SetProgress(state, action: PayloadAction) {\r\n state.bulckCreate.progress = action.payload;\r\n },\r\n create_Success(state, action: PayloadAction) {\r\n state.create.processing = false;\r\n state.create.open = false;\r\n },\r\n bulkCreate_Success(state, action: PayloadAction) {\r\n state.bulckCreate.processing = false;\r\n state.bulckCreate.open = false;\r\n },\r\n create_Error(state, action: PayloadAction) {},\r\n bulkCreate_Error(state, action: PayloadAction) {},\r\n\r\n hideUpdate(state, action: PayloadAction) {\r\n state.update.processing = false;\r\n state.update.open = false;\r\n },\r\n edit(state, action: PayloadAction) {\r\n state.update.processing = false;\r\n state.update.open = true;\r\n state.update.initialValues = {\r\n Id: action.payload.Id,\r\n Location: toEntity(\r\n action.payload.LocationId,\r\n action.payload.LocationName,\r\n ),\r\n Room: toEntity(action.payload.RoomId, action.payload.RoomName),\r\n SamplePlateType: toEntity(\r\n action.payload.SamplePlateTypeId,\r\n action.payload.SamplePlateTypeName,\r\n ),\r\n ServiceGroup: toEntity(\r\n action.payload.ServiceGroupId,\r\n action.payload.ServiceGroupName,\r\n ),\r\n IsRack: action.payload.IsRack,\r\n Active: action.payload.Active,\r\n };\r\n },\r\n update(\r\n state,\r\n action: PayloadAction<{\r\n original: ISamplePlateCreate;\r\n current: Partial;\r\n }>,\r\n ) {\r\n state.update.processing = true;\r\n },\r\n update_Success(state, action: PayloadAction>) {\r\n state.update.processing = false;\r\n state.update.open = false;\r\n state.update.initialValues = undefined;\r\n },\r\n update_Error(state, action: PayloadAction) {},\r\n\r\n delete(state, action: PayloadAction) {\r\n state.delete.processing = true;\r\n },\r\n delete_Success(state, action: PayloadAction) {},\r\n delete_Error(state, action: PayloadAction) {},\r\n\r\n deactivatePlates(state, action: PayloadAction) {},\r\n deactivatePlates_Success(state, action: PayloadAction) {},\r\n deactivatePlates_Error(state, action: PayloadAction) {},\r\n\r\n deletePlates(state, action: PayloadAction) {},\r\n deletePlates_Success(state, action: PayloadAction) {},\r\n deletePlates_Error(state, action: PayloadAction) {},\r\n },\r\n});\r\n\r\nexport const { actions: samplePlatesActions } = slice;\r\n\r\nexport const useSamplePlatesSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: samplePlatesSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useSamplePlatesSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { Entity } from 'types/common';\r\n\r\n/**\r\n * Combines Id & Name into an object that represents an entity\r\n * @param id Entity Id\r\n * @param name Entity Name\r\n * @returns Entity with Id & Name populated\r\n */\r\nexport function toEntity(\r\n id: T | null | undefined,\r\n name?: string | null,\r\n): Entity | null {\r\n if (id == null || id === undefined || name == null || name === undefined) {\r\n return null;\r\n } else {\r\n return { Id: id, Name: name ?? id };\r\n }\r\n}\r\n","import { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { Link as MuiLink } from '@material-ui/core';\r\nimport { translations } from 'locales/translations';\r\n\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { PrimaryActionDynamic } from 'app/components/BasicTable/components/TableCard/PrimaryAction';\r\nimport { ServiceTypeUnion } from 'enums/ServiceTypes';\r\n\r\nexport const AssetLink = (props: {\r\n id?: number;\r\n serviceId?: number;\r\n serviceType?: ServiceTypeUnion;\r\n children: React.ReactNode;\r\n title?: string;\r\n useSidePanel?: boolean;\r\n openPanelWithCover?: (state: SidePanelOpenState) => void;\r\n}) => {\r\n const { t } = useTranslation();\r\n const openAsset = useOpenAssetPopUp();\r\n const open = () => {\r\n openAsset(\r\n {\r\n Id: props.id,\r\n serviceId: props.serviceId,\r\n serviceType: props.serviceType,\r\n useSidePanel: props.useSidePanel,\r\n },\r\n props.openPanelWithCover,\r\n );\r\n };\r\n return (\r\n \r\n open()}\r\n color=\"textPrimary\"\r\n >\r\n {props.children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport const useOpenAssetPopUp = () => {\r\n const { openPanel } = useSidePanelState();\r\n return React.useCallback(\r\n (\r\n props: {\r\n Id?: number;\r\n serviceId?: number;\r\n serviceType?: ServiceTypeUnion;\r\n useSidePanel?: boolean;\r\n },\r\n openPanelWithCover?: (state: SidePanelOpenState) => void,\r\n ) => {\r\n const panelState = {\r\n renderPageType: RenderPageType.AssetDetails,\r\n renderPageProps: props,\r\n expanded: false,\r\n useSidePanel: props.useSidePanel,\r\n isCover: props.useSidePanel,\r\n } as SidePanelOpenState;\r\n if (!!openPanelWithCover) {\r\n openPanelWithCover(panelState);\r\n } else {\r\n openPanel({\r\n renderPageType: RenderPageType.AssetDetails,\r\n renderPageProps: props,\r\n expanded: false,\r\n useSidePanel: false,\r\n isCover: false,\r\n } as SidePanelOpenState);\r\n }\r\n },\r\n [openPanel],\r\n );\r\n};\r\n\r\n//used for Dashboard tadles\r\nexport const OpenAssetPrimaryAction: PrimaryActionDynamic<{\r\n Id?: number;\r\n serviceId?: number;\r\n serviceType?: ServiceTypeUnion;\r\n}> = (openPanel, row, toggle, user, useSidePanel) => {\r\n openPanel({\r\n renderPageType: RenderPageType.AssetDetails,\r\n renderPageProps: {\r\n Id: row.original.Id,\r\n serviceId: row.original.serviceId,\r\n serviceType: row.original.serviceType,\r\n useSidePanel: true,\r\n },\r\n useSidePanel: useSidePanel,\r\n expanded: false,\r\n isCover: useSidePanel,\r\n });\r\n};\r\n","import {\r\n Box,\r\n FormControl,\r\n FormHelperText,\r\n FormLabel,\r\n styled,\r\n} from '@material-ui/core';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { Body } from '../Typography';\r\nimport { InfoIcon } from '../BasicIcons/InfoIcon';\r\nimport { RichTextEditor, RichTextEditorProps } from '../RichTextEditor';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { FormControlProps } from './FormControls/FormControl';\r\n\r\nexport const FormRichTextField = ({\r\n onChange,\r\n onBlur,\r\n value,\r\n hasMentions,\r\n onChangeMentions,\r\n autoFocus,\r\n additionalButtons,\r\n isInvoiceTemplateEditor,\r\n extendedMode,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps &\r\n Omit) => {\r\n const [field, meta, helpers] = useField({ ...props });\r\n const handleChange = (value: string | undefined | null) => {\r\n // formik is not happy with neither undefined nor null\r\n const formikValue = value ?? '';\r\n field.onChange(formikValue);\r\n helpers.setValue(formikValue, true);\r\n onChange?.(value);\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\nexport interface RichTextFieldProps\r\n extends RichTextEditorProps,\r\n Pick {\r\n error?: string;\r\n label?: string;\r\n info?: string;\r\n\r\n helperText?: string;\r\n}\r\nexport function RichTextField({\r\n className,\r\n error,\r\n fullWidth,\r\n disabled,\r\n label,\r\n info,\r\n variant = 'outlined',\r\n helperText,\r\n ...props\r\n}: RichTextFieldProps) {\r\n const StyledInfo = styled(InfoIcon)(({ theme }) => ({\r\n marginLeft: theme.spacing(1),\r\n }));\r\n return (\r\n <>\r\n \r\n {label && (\r\n \r\n \r\n {label}\r\n {info && }\r\n \r\n \r\n )}\r\n\r\n \r\n {error !== undefined ||\r\n (!!helperText && (\r\n \r\n {error || helperText}\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n","export enum RestrictDurationUnitTypes {\r\n LimitMinutes = 1,\r\n LimitHours = 2,\r\n LimitDays = 3,\r\n LimitWeeks = 4,\r\n LimitMonths = 5,\r\n}\r\n","import { dateUtils } from 'utils/date-utils';\r\nimport { IViewState, ViewLengths, ViewModes, ViewTypes } from '../slice/types';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport {\r\n getPeriodTypesEntity,\r\n getPeriodTypesEntityById,\r\n PeriodTypes,\r\n PeriodTypesEntity,\r\n} from 'app/components/DatePeriods';\r\nimport { DatesRange } from 'types/DatesRange';\r\nimport {\r\n SchedulerDatePositionArray,\r\n SchedulerDatePositionUnion,\r\n} from 'app/components/BasicTable/Filters/DatesPeriodFilter';\r\nimport { serializeSchedulerDate } from './formatSchedulerDateOrUndefined';\r\nimport { RestrictDurationUnitTypes } from 'enums/RestrictDurationUnitTypes';\r\nimport { isSameMonth, isSameYear } from 'date-fns';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { IEquipmentWorkingHoursDto } from 'api/odata/generated/entities/IEquipmentWorkingHoursDto';\r\nimport { orderBy } from 'lodash';\r\n\r\n/**\r\n * Returns view length (day/week/etc.) for a given view mode\r\n * @param viewMode scheduler viewMode\r\n * @returns view length\r\n */\r\nexport function getViewLength(viewMode: ViewModes) {\r\n return viewMode.split('_')[0] as ViewLengths;\r\n}\r\n\r\n/**\r\n * Returns the view type part of the viewmode e.g. week_timeline -> timeline\r\n * @param viewMode scheduler viewMode\r\n * @returns view type\r\n */\r\nexport function getViewType(viewMode: ViewModes) {\r\n const parts = viewMode.split('_');\r\n if (parts.length === 1) {\r\n return 'calendar';\r\n } else if (parts[1] === 'unit') {\r\n return 'calendar';\r\n } else {\r\n return parts[1] as ViewTypes;\r\n }\r\n}\r\n\r\n/**\r\n * Returns parsed viewMode\r\n * @param viewMode scheduler viewmode\r\n * @returns\r\n */\r\nexport function parseViewMode(viewMode: ViewModes) {\r\n return {\r\n viewType: getViewType(viewMode),\r\n viewLength: getViewLength(viewMode),\r\n };\r\n}\r\nexport function getNextViewLength(\r\n length: ViewLengths,\r\n customDaysEnabled?: boolean,\r\n twoDaysEnabled?: boolean,\r\n): ViewLengths {\r\n switch (length) {\r\n case 'day':\r\n return twoDaysEnabled\r\n ? 'twodays'\r\n : customDaysEnabled\r\n ? 'customdays'\r\n : 'week';\r\n case 'twodays':\r\n return customDaysEnabled ? 'customdays' : 'week';\r\n case 'customdays':\r\n return 'week';\r\n case 'week':\r\n return 'month';\r\n case 'month':\r\n return 'quarter';\r\n case 'quarter':\r\n return 'year';\r\n default:\r\n return length;\r\n }\r\n}\r\nexport function getPrevViewLength(\r\n length: ViewLengths,\r\n customDaysEnabled?: boolean,\r\n twoDaysEnabled?: boolean,\r\n): ViewLengths {\r\n switch (length) {\r\n case 'twodays':\r\n return 'day';\r\n case 'customdays':\r\n return twoDaysEnabled ? 'twodays' : 'day';\r\n case 'week':\r\n return customDaysEnabled\r\n ? 'customdays'\r\n : twoDaysEnabled\r\n ? 'twodays'\r\n : 'day';\r\n case 'month':\r\n return 'week';\r\n case 'quarter':\r\n return 'month';\r\n case 'year':\r\n return 'quarter';\r\n default:\r\n return length;\r\n }\r\n}\r\n/**\r\n * Combines view mode and view type into scheduler view mode e.g. 'weekly' & 'calendar' -> 'weekly'\r\n * @param param0 view mode and view type\r\n * @returns\r\n */\r\nexport const getSchedulerViewMode = (\r\n viewType: 'calendar' | 'timeline',\r\n viewlength: ViewLengths,\r\n isMobile: boolean,\r\n): ViewModes => {\r\n switch (viewType) {\r\n case 'calendar':\r\n switch (viewlength) {\r\n case 'day':\r\n case 'twodays':\r\n case 'customdays':\r\n return isMobile ? 'day' : 'day_unit';\r\n case 'week':\r\n return 'week';\r\n case 'month':\r\n return 'month';\r\n case 'quarter':\r\n return 'quarter';\r\n case 'year':\r\n return 'year';\r\n case 'customPeriod':\r\n return 'day_unit';\r\n default:\r\n assertExhaustive(viewlength);\r\n }\r\n break;\r\n case 'timeline':\r\n return `${viewlength}_${viewType}`;\r\n default:\r\n assertExhaustive(viewType);\r\n }\r\n};\r\n/**\r\n * Gets the schedulr view type\r\n * @param viewType view type\r\n * @param viewlength view length\r\n * @param isMobile mobile\r\n * @returns\r\n */\r\nexport const getSchedulerViewType = (\r\n viewType: 'calendar' | 'timeline',\r\n viewlength: ViewLengths,\r\n isMobile: boolean,\r\n): 'calendar' | 'unit' | 'timeline' => {\r\n switch (viewType) {\r\n case 'calendar':\r\n switch (viewlength) {\r\n case 'day':\r\n case 'twodays':\r\n case 'customdays':\r\n return isMobile ? 'calendar' : 'unit';\r\n case 'week':\r\n case 'month':\r\n return viewType;\r\n case 'quarter':\r\n case 'year':\r\n return 'timeline';\r\n case 'customPeriod':\r\n return viewType === 'calendar' ? 'unit' : 'timeline';\r\n default:\r\n assertExhaustive(viewlength);\r\n }\r\n break;\r\n case 'timeline':\r\n return viewType;\r\n default:\r\n assertExhaustive(viewType);\r\n }\r\n};\r\n/**\r\n * Gets the start of the displayed period\r\n * @param viewLength view length\r\n * @param datets date\r\n * @returns start of the period\r\n */\r\nexport const getViewStartDate = (\r\n viewLength: ViewLengths,\r\n datets?: Timestamp,\r\n customStart?: boolean,\r\n) => {\r\n const date = datets === undefined ? undefined : dateUtils.parseISO(datets);\r\n if (date === undefined) {\r\n return undefined;\r\n }\r\n\r\n switch (viewLength) {\r\n case 'day':\r\n case 'twodays':\r\n case 'customdays':\r\n return dateUtils.startOfDay(date);\r\n case 'week':\r\n return customStart\r\n ? dateUtils.startOfDay(date)\r\n : dateUtils.startOfWeek(date);\r\n case 'month':\r\n return customStart\r\n ? dateUtils.startOfDay(date)\r\n : dateUtils.startOfMonth(date);\r\n case 'quarter':\r\n return customStart\r\n ? dateUtils.startOfDay(date)\r\n : dateUtils.startOfQuarter(date);\r\n case 'year':\r\n return customStart\r\n ? dateUtils.startOfDay(date)\r\n : dateUtils.startOfYear(date);\r\n }\r\n};\r\n/**\r\n * Gets the view end date\r\n * @param viewLength\r\n * @param datets\r\n * @returns\r\n */\r\nexport const getViewEndDate = (\r\n viewLength: ViewLengths,\r\n datets?: Timestamp,\r\n days?: number,\r\n customStart?: boolean,\r\n) => {\r\n const date = datets === undefined ? undefined : dateUtils.parseISO(datets);\r\n if (date === undefined) {\r\n return undefined;\r\n }\r\n switch (viewLength) {\r\n case 'day':\r\n return dateUtils.endOfDay(date);\r\n case 'twodays':\r\n return dateUtils.addDays(dateUtils.endOfDay(date), 1);\r\n case 'customdays':\r\n return dateUtils.addDays(dateUtils.endOfDay(date), !!days ? days - 1 : 2);\r\n case 'week':\r\n return customStart\r\n ? dateUtils.addDays(dateUtils.startOfDay(date), 6)\r\n : dateUtils.endOfWeek(date);\r\n case 'month':\r\n return customStart\r\n ? dateUtils.addMonths(date, 1)\r\n : dateUtils.endOfMonth(date);\r\n case 'quarter':\r\n return customStart\r\n ? dateUtils.addQuarters(date, 1)\r\n : dateUtils.endOfQuarter(date);\r\n case 'year':\r\n return customStart\r\n ? dateUtils.addYears(date, 1)\r\n : dateUtils.endOfYear(date);\r\n }\r\n};\r\n/**\r\n * Returns a display label for the dates period display\r\n * @param viewLength view length\r\n * @param date view date\r\n * @returns display label\r\n */\r\nexport const getPeriodDisplayLabel = (\r\n viewLength: ViewLengths,\r\n date: Timestamp,\r\n compact: boolean,\r\n customDays?: number,\r\n customStart?: boolean,\r\n) => {\r\n const start = getViewStartDate(viewLength, date, customStart);\r\n const end = getViewEndDate(viewLength, date, customDays, customStart);\r\n if (start === undefined || end === undefined) {\r\n return undefined;\r\n }\r\n switch (viewLength) {\r\n case 'year':\r\n return `${dateUtils.format(start, 'yyyy')}`;\r\n case 'quarter':\r\n if (isSameYear(start, end)) {\r\n return `${dateUtils.format(start, 'MMM')} - ${dateUtils.format(\r\n end,\r\n 'MMM yyyy',\r\n )}`;\r\n } else {\r\n return `${dateUtils.format(start, 'MMM yyyy')} - ${dateUtils.format(\r\n end,\r\n 'MMM yyyy',\r\n )}`;\r\n }\r\n case 'month':\r\n if (isSameYear(start, end)) {\r\n if (isSameMonth(start, end)) {\r\n return dateUtils.format(date, 'MMM');\r\n } else {\r\n return `${dateUtils.format(start, 'MMM dd')} - ${dateUtils.format(\r\n end,\r\n 'MMM dd yyyy',\r\n )}`;\r\n }\r\n } else {\r\n return `${dateUtils.format(start, 'MMM dd yyyy')} - ${dateUtils.format(\r\n end,\r\n 'MMM dd yyyy',\r\n )}`;\r\n }\r\n case 'day':\r\n return dateUtils.format(date, compact ? 'MMM dd' : 'MMM dd, yyyy');\r\n case 'week':\r\n if (isSameMonth(start, end)) {\r\n return `${dateUtils.format(start, 'MMM dd')} - ${dateUtils.format(\r\n end,\r\n 'dd',\r\n )}`;\r\n } else {\r\n return `${dateUtils.format(start, 'MMM dd')} - ${dateUtils.format(\r\n end,\r\n 'MMM dd',\r\n )}`;\r\n }\r\n case 'twodays':\r\n case 'customdays':\r\n case 'customPeriod':\r\n return `${dateUtils.format(\r\n start,\r\n compact ? 'MMM dd' : 'MMM dd, yyyy',\r\n )} - ${dateUtils.format(end, compact ? 'dd' : 'MMM dd')}`;\r\n default:\r\n assertExhaustive(viewLength);\r\n }\r\n};\r\n\r\nexport const periodTypeToLengthType = (\r\n periodType: PeriodTypes,\r\n): ViewLengths | undefined => {\r\n switch (periodType) {\r\n case 'Today':\r\n case 'Yesterday':\r\n case 'Tomorrow':\r\n return 'day';\r\n case 'TodayTomorrow':\r\n return 'twodays';\r\n case 'ThisWeek':\r\n case 'LastWeek':\r\n case 'NextWeek':\r\n return 'week';\r\n case 'LastMonth':\r\n case 'ThisMonth':\r\n case 'NextMonth':\r\n return 'month';\r\n case 'LastQuarter':\r\n case 'ThisQuarter':\r\n case 'NextQuarter':\r\n return 'quarter';\r\n case 'LastYear':\r\n case 'ThisYear':\r\n case 'NextYear':\r\n return 'year';\r\n default:\r\n return undefined;\r\n }\r\n};\r\nexport const lengthTypeToPeriodType = (\r\n lengthType: ViewLengths,\r\n): PeriodTypes | undefined => {\r\n switch (lengthType) {\r\n case 'day':\r\n return 'Today';\r\n case 'twodays':\r\n return 'TodayTomorrow';\r\n case 'week':\r\n return 'ThisWeek';\r\n case 'month':\r\n return 'ThisMonth';\r\n case 'customdays':\r\n return 'CustomDate';\r\n case 'quarter':\r\n return 'ThisQuarter';\r\n case 'year':\r\n return 'ThisYear';\r\n default:\r\n return undefined;\r\n }\r\n};\r\nexport const viewStateFromFilter = (\r\n periodType: PeriodTypesEntity | SchedulerDatePositionUnion,\r\n): Pick | undefined => {\r\n const periodTypeUnion =\r\n (periodType as PeriodTypesEntity)?.Id ??\r\n (periodType as SchedulerDatePositionUnion);\r\n const schedulerPreset:\r\n | SchedulerDatePositionUnion\r\n | undefined = SchedulerDatePositionArray.find(\r\n f => f.toLowerCase() === periodTypeUnion.toLowerCase(),\r\n );\r\n if (schedulerPreset === undefined) {\r\n return undefined;\r\n }\r\n const x = DatesRange.fromPreset(\r\n { Id: schedulerPreset as PeriodTypes, Name: '' },\r\n null,\r\n null,\r\n );\r\n\r\n if (x.start === null) {\r\n return undefined;\r\n }\r\n const length = periodTypeToLengthType(periodTypeUnion);\r\n if (length === undefined) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n preset: schedulerPreset,\r\n viewLength: length,\r\n date: serializeSchedulerDate(x.start),\r\n };\r\n};\r\nexport const getPeriodFromViewLength = (\r\n length: ViewLengths,\r\n date: Date,\r\n customDays?: number,\r\n) => {\r\n let value = Object.assign(\r\n new PresetDatesRange(),\r\n {\r\n type:\r\n (getPeriodTypesEntityById(\r\n lengthTypeToPeriodType(length),\r\n ) as PeriodTypesEntity) ??\r\n (getPeriodTypesEntity('CustomDate') as PeriodTypesEntity),\r\n },\r\n DatesRange.fromPreset(\r\n (getPeriodTypesEntityById(\r\n lengthTypeToPeriodType(length),\r\n ) as PeriodTypesEntity) ??\r\n (getPeriodTypesEntity('CustomDate') as PeriodTypesEntity),\r\n length === 'customdays' ? date : date,\r\n length === 'customdays'\r\n ? dateUtils.addDays(date, (customDays ?? 3) - 1)\r\n : dateUtils.parseISO(date),\r\n ),\r\n );\r\n return value;\r\n};\r\nexport function timelineColumnWidth(isMobile: boolean) {\r\n return isMobile ? 100 : 300;\r\n}\r\nexport const MatchUnitSlotToEnd = (\r\n startTime: Timestamp,\r\n endTime: Timestamp,\r\n unitType: RestrictDurationUnitTypes,\r\n amount: number,\r\n) => {\r\n const start = dateUtils.parseISO(startTime);\r\n const end = dateUtils.parseISO(endTime);\r\n let dateSt = start;\r\n let slotLength = 0;\r\n let lastCorrectEnd = new Date();\r\n let diffDuration = amount;\r\n switch (unitType) {\r\n case RestrictDurationUnitTypes.LimitMinutes:\r\n while (dateSt < end) {\r\n dateSt = dateUtils.addMinutes(dateSt, amount);\r\n slotLength++;\r\n }\r\n lastCorrectEnd = dateUtils.addMinutes(dateSt, -amount);\r\n diffDuration = dateUtils.getMinutesDiff(end, dateSt);\r\n let newMinutesEnd =\r\n slotLength > 1\r\n ? diffDuration <= amount / 2\r\n ? dateSt\r\n : lastCorrectEnd\r\n : dateSt;\r\n return newMinutesEnd;\r\n case RestrictDurationUnitTypes.LimitHours:\r\n while (dateSt < end) {\r\n dateSt = dateUtils.addHours(dateSt, amount);\r\n slotLength++;\r\n }\r\n lastCorrectEnd = dateUtils.addHours(dateSt, -amount);\r\n diffDuration = dateUtils.getHoursDiff(end, dateSt);\r\n let newHoursEnd =\r\n slotLength > 1\r\n ? diffDuration <= amount / 2\r\n ? dateSt\r\n : lastCorrectEnd\r\n : dateSt;\r\n return newHoursEnd;\r\n case RestrictDurationUnitTypes.LimitDays:\r\n while (dateSt < end) {\r\n dateSt = dateUtils.addDays(dateSt, amount);\r\n slotLength++;\r\n }\r\n lastCorrectEnd = dateUtils.addDays(dateSt, -amount);\r\n diffDuration = dateUtils.getDaysDiff(end, dateSt);\r\n let newDaysEnd =\r\n slotLength > 1\r\n ? diffDuration <= amount / 2\r\n ? dateSt\r\n : lastCorrectEnd\r\n : dateSt;\r\n return newDaysEnd;\r\n case RestrictDurationUnitTypes.LimitWeeks:\r\n while (dateSt < end) {\r\n dateSt = dateUtils.addWeeks(dateSt, amount);\r\n slotLength++;\r\n }\r\n lastCorrectEnd = dateUtils.addWeeks(dateSt, -amount);\r\n diffDuration = dateUtils.differenceInWeeks(end, dateSt);\r\n let newWeekEnd =\r\n slotLength > 1\r\n ? diffDuration <= amount / 2\r\n ? dateSt\r\n : lastCorrectEnd\r\n : dateSt;\r\n return newWeekEnd;\r\n case RestrictDurationUnitTypes.LimitMonths:\r\n while (dateSt < end) {\r\n dateSt = dateUtils.addMonths(dateSt, amount);\r\n slotLength++;\r\n }\r\n lastCorrectEnd = dateUtils.addMonths(dateSt, -amount);\r\n diffDuration = dateUtils.getMonthDiff(end, dateSt);\r\n let newMonthEnd =\r\n slotLength > 1\r\n ? diffDuration <= amount / 2\r\n ? dateSt\r\n : lastCorrectEnd\r\n : dateSt;\r\n return newMonthEnd;\r\n }\r\n};\r\nexport const fix_date = (date: Timestamp, duration: number) => {\r\n let start = dateUtils.parseISO(date);\r\n return dateUtils.addHours(start, duration);\r\n};\r\nexport function adjustToTimeSlot(\r\n startTime: Date,\r\n endTime: Date,\r\n workingHours: Array,\r\n minDuration?: number,\r\n) {\r\n let result = {\r\n start: startTime,\r\n end: endTime,\r\n };\r\n if (workingHours.length > 0) {\r\n // let correctEnd = endTime > correctStart ? endTime : correctStart;\r\n let weekStartDay = dateUtils.getDay(startTime);\r\n let slots = workingHours.map(f => {\r\n return {\r\n StartTime: dateUtils.dateFnsUtils.mergeDateAndTime(\r\n startTime,\r\n dateUtils.parseISO(f.StartTime),\r\n ),\r\n EndTime: dateUtils.dateFnsUtils.mergeDateAndTime(\r\n endTime,\r\n dateUtils.parseISO(f.EndTime),\r\n ),\r\n DayOfWeek: f.DayOfWeek,\r\n };\r\n });\r\n // .filter(f => f.StartTime < correctEnd && f.EndTime > startTime);\r\n let startSlots = slots.filter(\r\n s => s.DayOfWeek === weekStartDay && s.StartTime <= startTime,\r\n );\r\n if (startSlots.length > 0) {\r\n let startOrdered = orderBy(startSlots, f => f.StartTime, 'desc');\r\n result.start = startOrdered[0].StartTime;\r\n }\r\n let correctEnd =\r\n !!minDuration &&\r\n minDuration > 0 &&\r\n dateUtils.differenceInMinutes(endTime, result.start) < minDuration\r\n ? dateUtils.addMinutes(result.start, minDuration)\r\n : endTime;\r\n let weekEndDay = dateUtils.getDay(correctEnd);\r\n let endSlots = slots.filter(\r\n s => s.DayOfWeek === weekEndDay && s.EndTime >= correctEnd,\r\n );\r\n if (endSlots.length > 0) {\r\n let endOrdered = orderBy(endSlots, f => f.EndTime, 'asc');\r\n result.end = endOrdered[0].EndTime;\r\n }\r\n return result;\r\n } else {\r\n return result;\r\n }\r\n}\r\n","import { IBudgetExperimentsFilterDto } from 'api/odata/generated/entities/IBudgetExperimentsFilterDto';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { FieldHandlerProps } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { getSingleInvoiceFundingType } from 'app/components/pickers/StaticOptionsPickers/FundingTypeIdPicker';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { AsyncDataState, Entity } from 'types/common';\r\nimport { IConnectedFiltersDto } from 'types/IConnectedFiltersDto';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { toEntity } from 'utils/entity-utils';\r\nimport { PricingState } from 'app/pages/ReservationDetails/Details/slice/types';\r\n\r\n/* --- STATE --- */\r\n\r\nexport interface OfflineServiceState {\r\n detailsState: AsyncDataState;\r\n connectedDataState: IConnectedFiltersDto;\r\n processing: boolean;\r\n consumablesProcessing: boolean;\r\n valueHandler?: FieldHandlerProps;\r\n serviceChangeResultState?: OfflineServiceTypeChangeResult;\r\n creditState: AsyncDataState;\r\n hasCharges?: boolean;\r\n savedReservationService?: IOtherServices;\r\n consumablesState: AsyncDataState;\r\n consumablesValueHandler?: FieldHandlerProps;\r\n selectedServiceTypes: Array;\r\n editCreatableService?: IOtherServices;\r\n barcodeScanned?: boolean;\r\n refeshOfflineServices?: boolean;\r\n stockRenewalState: AsyncDataState;\r\n stockRenewalValueHandler?: FieldHandlerProps;\r\n renewStockState: AsyncDataState;\r\n renewStockValueHandler?: FieldHandlerProps;\r\n inventoryBatchState: AsyncDataState;\r\n inventoryBatchValueHandler?: FieldHandlerProps;\r\n inventoryBatchEditable?: IInventoryBatchDto;\r\n isEdit?: boolean;\r\n batchIsEdit?: boolean;\r\n getCreatableService?: IOtherServices;\r\n}\r\nexport interface OfflineServiceQueryStringParameters {\r\n id?: string;\r\n ipid?: string;\r\n user?: string;\r\n bid?: string;\r\n be?: string;\r\n ecid?: string;\r\n po?: string;\r\n reference?: string;\r\n remarks?: string;\r\n factor?: string;\r\n amount?: string;\r\n adg?: string;\r\n stid?: string;\r\n ReservationId?: string;\r\n UsageId?: string;\r\n servicedate?: string;\r\n batchId?: string;\r\n}\r\nexport interface StockRenewalParams {\r\n stid?: string;\r\n servicedate?: string;\r\n}\r\nexport interface RenewStockParams {\r\n id?: string;\r\n stid?: string;\r\n servicedate?: string;\r\n remarks?: string;\r\n amount?: string;\r\n batchId?: string;\r\n}\r\nexport interface InventoryBatchParams {\r\n id?: string;\r\n name?: string;\r\n stid?: string;\r\n purchasedate?: string;\r\n lot?: string;\r\n inventory?: string;\r\n}\r\nexport interface OtherServiceDetailsState {\r\n Id: number;\r\n ServiceType: IOfflineServiceFilterDto | null;\r\n DiscountFactor?: number | null;\r\n Quantity?: number | null;\r\n ReservationId?: number | null;\r\n UsageId?: number | null;\r\n Remarks?: string | null;\r\n SyncReservation?: boolean | null;\r\n SyncUsage?: boolean | null;\r\n InventoryBatch?: IInventoryBatchDto | null;\r\n\r\n // ServiceDate: Date | string;\r\n // BookedBy: Entity | null;\r\n // UserGroup: Entity | null;\r\n // Budget: Entity | null;\r\n // InstituteProject: Entity | null;\r\n // ExternalCustomer?: Entity | null;\r\n // FundingType?: Entity | null;\r\n // PurchaseOrder?: string | null;\r\n // Reference?: string | null;\r\n // BudgetExperiment?: Entity | null;\r\n}\r\nexport interface ReportConsumablesState {\r\n Services: IOtherServices[];\r\n}\r\nexport interface RenewStockState {\r\n Id: number;\r\n ServiceType: IOfflineServiceFilterDto | null;\r\n DateReceived: Date | string;\r\n InventoryBatch?: IInventoryBatchDto | null;\r\n Quantity?: number | null;\r\n Remarks?: string | null;\r\n}\r\nexport interface InventoryBatchState {\r\n Id: number;\r\n Name: string;\r\n ServiceType: IOfflineServiceFilterDto | null;\r\n PurchaseDate?: Date | string | null;\r\n ExpirationDate?: Date | string | null;\r\n Inventory: number;\r\n Lot?: string | null;\r\n PurchasePricePerUnit: number | null;\r\n}\r\nexport interface StockRenewalState {\r\n Services: IOtherServices[];\r\n DateReceived: Date | string;\r\n AutoGenerateNewBatches?: boolean | null;\r\n}\r\nexport interface OfflineServicesResponse extends IResponseType {\r\n Id: number | null;\r\n data: IOtherServices | null;\r\n serviceType: Entity;\r\n IsValid: boolean;\r\n}\r\nexport interface InventoryBatchResponse extends IResponseType {\r\n Id: number | null;\r\n data: IInventoryBatchDto | null;\r\n serviceType: Entity;\r\n IsValid: boolean;\r\n}\r\nexport interface ConsumableServicesResponse extends IResponseType {\r\n Id: number[];\r\n data: IOtherServices[];\r\n IsValid: boolean;\r\n}\r\n\r\nexport interface ServiceChangeStateParameters {\r\n ServiceTypes: number[];\r\n ReservationId: number | null;\r\n UsageId: number | null;\r\n Start: Date | string;\r\n BookedBy: string | null;\r\n ADGroup: string | null;\r\n BudgetId: number | null;\r\n FundingTypeId: number;\r\n}\r\nexport interface ErrorServices {\r\n id: number;\r\n error?: string;\r\n}\r\nexport interface OfflineServiceTypeChangeResult {\r\n ErrorMessages: string[];\r\n DefaultBudget: IBudgetFilterDto | null;\r\n DefaultExperiment: IBudgetExperimentsFilterDto | null;\r\n}\r\nexport const ConvertDtoToModel = (\r\n service: IOtherServices,\r\n serviceType: IOfflineServiceFilterDto | null,\r\n): OtherServiceDetailsState => {\r\n let model = {\r\n Id: service.Id,\r\n ServiceType: serviceType,\r\n ServiceTypeId: ServiceType.Offline,\r\n DiscountFactor: service.DiscountFactor,\r\n Quantity: service.Quantity ?? service.DefaultQuantity,\r\n Remarks: service.Remarks,\r\n ReservationId: service.ReservationId,\r\n UsageId: service.UsageId,\r\n InventoryBatch:\r\n service.InventoryBatchId === null\r\n ? null\r\n : ({\r\n Id: service.InventoryBatchId,\r\n Name: service.InventoryBatchName,\r\n Inventory: service.InventoryBatchAmount,\r\n } as IInventoryBatchDto),\r\n } as OtherServiceDetailsState;\r\n return model;\r\n};\r\nexport const ConvertConsumablesToModel = (\r\n services: IOtherServices[],\r\n): ReportConsumablesState => {\r\n return { Services: services } as ReportConsumablesState;\r\n};\r\nexport const ConvertConsumablesToRenewalModel = (\r\n services: IOtherServices[],\r\n date: Date | string,\r\n): StockRenewalState => {\r\n return {\r\n Services: services,\r\n DateReceived: dateUtils.formatISO(dateUtils.dateOrStringToDate(date)),\r\n AutoGenerateNewBatches: true,\r\n } as StockRenewalState;\r\n};\r\nexport const ConvertRenewStockToModel = (\r\n service: IOtherServices,\r\n serviceType: IOfflineServiceFilterDto | null,\r\n): RenewStockState => {\r\n let model = {\r\n Id: service.Id,\r\n ServiceType: serviceType,\r\n // service.ServiceTypeID > 0\r\n // ? ({\r\n // Id: service.ServiceTypeID,\r\n // Name: service.ServiceType,\r\n // Active: true,\r\n // AllowToUser: service.AllowToUser,\r\n // DefaultQuantity: service.DefaultQuantity,\r\n // HideProjects: service.HideProjects,\r\n // IntQuantityOnly: service.IntQuantityOnly,\r\n // Inventory: service.Inventory,\r\n // ReservationOverlappingInventory:\r\n // service.ReservationOverlappingInventory,\r\n // ServiceGroupId: service.ServiceGroupId,\r\n // ServiceTypeId: 2,\r\n // StaffOnly: service.StaffOnly,\r\n // UnitTypeID: service.UnitTypeId,\r\n // UnitTypeName: service.Units,\r\n // NotLessThanZero: service.NotLessThanZero,\r\n // TrackInventory: service.TrackInventory,\r\n // InventoryBatchesEnabled: service.InventoryBatchesEnabled,\r\n // } as IOfflineServiceFilterDto)\r\n // : null,\r\n Quantity: service.Quantity ?? service.DefaultQuantity,\r\n Remarks: service.Remarks,\r\n InventoryBatch:\r\n service.InventoryBatchId === null\r\n ? null\r\n : ({\r\n Id: service.InventoryBatchId,\r\n Name: service.InventoryBatchName,\r\n Inventory: service.InventoryBatchAmount,\r\n } as IInventoryBatchDto),\r\n DateReceived: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(service.ServiceDate),\r\n ),\r\n } as RenewStockState;\r\n return model;\r\n};\r\nexport const ConvertInventoryBatchToModel = (\r\n batch: IInventoryBatchDto,\r\n serviceType: IOfflineServiceFilterDto | null,\r\n newDate: Date | string,\r\n): InventoryBatchState => {\r\n let model = {\r\n Id: batch.Id,\r\n ServiceType: serviceType,\r\n Inventory: batch.Inventory,\r\n Name: batch.Name,\r\n PurchasePricePerUnit: batch.PurchasePricePerUnit,\r\n ExpirationDate: batch.ExpirationDate,\r\n Lot: batch.Lot,\r\n PurchaseDate: dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(batch.PurchaseDate || newDate),\r\n ),\r\n } as InventoryBatchState;\r\n return model;\r\n};\r\nexport const ConvertDtoToConnectedModel = (\r\n service: IOtherServices,\r\n): IConnectedFiltersDto => {\r\n let model = {\r\n User: toEntity(service.BookedBy, service.UserDisplayName),\r\n UserGroup: toEntity(service.UserGroup, service.UserGroupName),\r\n Budget: toEntity(service.BudgetID, service.Budget),\r\n InstituteProject: toEntity(\r\n service.InstituteProjectId,\r\n service.InstituteProjectName,\r\n ),\r\n StartTime: dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(service.ServiceDate),\r\n ),\r\n BudgetExperiment: toEntity(\r\n service.BudgetExperimentId,\r\n service.BudgetExperimentName,\r\n ),\r\n ExternalCustomer: toEntity(\r\n service.ExternalCustomerId,\r\n service.ExternalCustomerName,\r\n ),\r\n FundingType: getSingleInvoiceFundingType(service.FundingType ?? 0),\r\n PurchaseOrder: service.PurchaseOrder,\r\n Reference: service.Reference,\r\n } as IConnectedFiltersDto;\r\n return model;\r\n};\r\nexport const ConvertModelToInsertEntity = (\r\n model: OtherServiceDetailsState,\r\n connectedModel: IConnectedFiltersDto,\r\n) => {\r\n let data = {\r\n Id: model.Id,\r\n BudgetID: connectedModel.Budget?.Id || null,\r\n Budget: connectedModel.Budget?.Name,\r\n UserGroup: connectedModel.UserGroup?.Id || null,\r\n UserGroupName: connectedModel.UserGroup?.Name,\r\n BookedBy: connectedModel.User?.Id,\r\n UserDisplayName: connectedModel.User?.Name,\r\n ServiceTypeID: model.ServiceType?.Id,\r\n ServiceType: model.ServiceType?.Name,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(connectedModel.StartTime),\r\n ),\r\n Quantity: model.Quantity,\r\n DiscountFactor: model.DiscountFactor,\r\n Remarks: model.Remarks,\r\n FundingType: connectedModel.FundingType?.Id,\r\n BudgetExperimentId: connectedModel.BudgetExperiment?.Id,\r\n BudgetExperimentName: connectedModel.BudgetExperiment?.Name,\r\n ReservationId: model.ReservationId,\r\n UsageId: model.UsageId,\r\n ExternalCustomerId: connectedModel.ExternalCustomer?.Id,\r\n ExternalCustomerName: connectedModel.ExternalCustomer?.Name,\r\n SyncReservation: false,\r\n SyncUsage: false,\r\n StaffOnly: model.ServiceType?.StaffOnly || false,\r\n InstituteProjectId: connectedModel.InstituteProject?.Id,\r\n InstituteProjectName: connectedModel.InstituteProject?.Name,\r\n PurchaseOrder: connectedModel.PurchaseOrder,\r\n Reference: connectedModel.Reference,\r\n BudgetsTurnedOn: model.ServiceType?.BudgetsTurnedOn,\r\n DefaultQuantity: model.ServiceType?.DefaultQuantity,\r\n HideProjects: model.ServiceType?.HideProjects,\r\n IntQuantityOnly: model.ServiceType?.IntQuantityOnly,\r\n ServiceGroupId: model.ServiceType?.ServiceGroupId,\r\n AllowToUser: model.ServiceType?.AllowToUser,\r\n UnitTypeId: model.ServiceType?.UnitTypeID,\r\n Units: model.ServiceType?.UnitTypeName,\r\n TrackInventory: model.ServiceType?.TrackInventory,\r\n InventoryBatchesEnabled: model.ServiceType?.InventoryBatchesEnabled,\r\n InventoryBatchId: model.InventoryBatch?.Id,\r\n InventoryBatchName: model.InventoryBatch?.Name,\r\n InventoryBatchAmount: model.InventoryBatch?.Inventory,\r\n NotLessThanZero: model.ServiceType?.NotLessThanZero,\r\n } as IOtherServices;\r\n return data;\r\n};\r\nexport const ConvertModelToUpdateEntity = (\r\n model: OtherServiceDetailsState,\r\n original: OtherServiceDetailsState,\r\n connectedModel: IConnectedFiltersDto,\r\n) => {\r\n let data = {\r\n Id: original.Id,\r\n BudgetID: connectedModel.Budget?.Id || null,\r\n Budget: connectedModel.Budget?.Name,\r\n UserGroup: connectedModel.UserGroup?.Id || null,\r\n UserGroupName: connectedModel.UserGroup?.Name,\r\n BookedBy: connectedModel.User?.Id,\r\n UserDisplayName: connectedModel.User?.Name,\r\n ServiceTypeID: model.ServiceType?.Id,\r\n ServiceType: model.ServiceType?.Name,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(connectedModel.StartTime),\r\n ),\r\n Quantity: model.Quantity,\r\n DiscountFactor: model.DiscountFactor,\r\n Remarks: model.Remarks,\r\n FundingType: connectedModel.FundingType?.Id,\r\n BudgetExperimentId: connectedModel.BudgetExperiment?.Id,\r\n BudgetExperimentName: connectedModel.BudgetExperiment?.Name,\r\n ReservationId: model.ReservationId,\r\n UsageId: model.UsageId,\r\n ExternalCustomerId: connectedModel.ExternalCustomer?.Id,\r\n ExternalCustomerName: connectedModel.ExternalCustomer?.Name,\r\n SyncReservation: false,\r\n SyncUsage: false,\r\n StaffOnly: model.ServiceType?.StaffOnly || false,\r\n InstituteProjectId: connectedModel.InstituteProject?.Id,\r\n InstituteProjectName: connectedModel.InstituteProject?.Name,\r\n PurchaseOrder: connectedModel.PurchaseOrder,\r\n Reference: connectedModel.Reference,\r\n BudgetsTurnedOn: model.ServiceType?.BudgetsTurnedOn,\r\n DefaultQuantity: model.ServiceType?.DefaultQuantity,\r\n HideProjects: model.ServiceType?.HideProjects,\r\n IntQuantityOnly: model.ServiceType?.IntQuantityOnly,\r\n ServiceGroupId: model.ServiceType?.ServiceGroupId,\r\n AllowToUser: model.ServiceType?.AllowToUser,\r\n UnitTypeId: model.ServiceType?.UnitTypeID,\r\n Units: model.ServiceType?.UnitTypeName,\r\n TrackInventory: model.ServiceType?.TrackInventory,\r\n InventoryBatchesEnabled: model.ServiceType?.InventoryBatchesEnabled,\r\n InventoryBatchId: model.InventoryBatch?.Id,\r\n InventoryBatchName: model.InventoryBatch?.Name,\r\n InventoryBatchAmount: model.InventoryBatch?.Inventory,\r\n NotLessThanZero: model.ServiceType?.NotLessThanZero,\r\n } as IOtherServices;\r\n return data;\r\n};\r\nexport const ConvertModelToUpdateRenewStockEntity = (\r\n model: RenewStockState,\r\n original: RenewStockState,\r\n autoGenerateBatch?: boolean,\r\n) => {\r\n let data = {\r\n Id: original.Id,\r\n ServiceTypeID: model.ServiceType?.Id,\r\n ServiceType: model.ServiceType?.Name,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.DateReceived),\r\n ),\r\n Quantity: model.Quantity,\r\n Remarks: model.Remarks,\r\n DefaultQuantity: model.ServiceType?.DefaultQuantity,\r\n IntQuantityOnly: model.ServiceType?.IntQuantityOnly,\r\n ServiceGroupId: model.ServiceType?.ServiceGroupId,\r\n InventoryBatchId: model.InventoryBatch?.Id,\r\n InventoryBatchName: model.InventoryBatch?.Name,\r\n InventoryBatchesEnabled: model.ServiceType?.InventoryBatchesEnabled,\r\n RenewStockInventory: true,\r\n TrackInventory: model.ServiceType?.TrackInventory,\r\n NotLessThanZero: model.ServiceType?.NotLessThanZero,\r\n AutoGenerateNewBatches: autoGenerateBatch,\r\n } as IOtherServices;\r\n return data;\r\n};\r\nexport const getDefaultService = (\r\n user: AuthenticatedUser | undefined,\r\n date: Date | string,\r\n) => {\r\n return {\r\n Id: 0,\r\n BookedBy: user?.Id,\r\n UserDisplayName: user?.Name,\r\n BudgetID: null,\r\n Budget: null,\r\n BudgetExperimentId: null,\r\n BudgetExperimentName: null,\r\n AllowToUser: true,\r\n DiscountFactor: null,\r\n Quantity: null,\r\n DefaultQuantity: null,\r\n ExternalCustomerId: null,\r\n ExternalCustomerName: null,\r\n FundingType: 0,\r\n HideProjects: false,\r\n InstituteProjectId: null,\r\n InstituteProjectName: null,\r\n IntQuantityOnly: true,\r\n Mandatory: false,\r\n Remarks: null,\r\n ReservationId: null,\r\n ServiceDate: date,\r\n ServiceTypeID: 0,\r\n ServiceType: null,\r\n ServiceGroupId: 0,\r\n Units: null,\r\n UnitTypeId: null,\r\n UserGroup: null,\r\n UserGroupName: null,\r\n StaffOnly: false,\r\n Reference: null,\r\n PurchaseOrder: null,\r\n UsageId: null,\r\n HasCharges: false,\r\n TrackInventory: false,\r\n InventoryBatchesEnabled: false,\r\n NotLessThanZero: true,\r\n ReservationOverlappingInventory: null,\r\n BudgetsTurnedOn: false,\r\n InventoryBatchId: null,\r\n InventoryBatchName: null,\r\n ServiceGroup: null,\r\n } as IOtherServices;\r\n};\r\nexport const getDefaultBatch = (date: Date | string) => {\r\n return {\r\n Id: 0,\r\n Name: dateUtils.shortDateFormat(date) ?? '',\r\n ExpirationDate: null,\r\n Inventory: 0,\r\n Lot: null,\r\n OfflineServiceTypeId: 0,\r\n OfflineServiceTypeName: '',\r\n PurchaseDate: date,\r\n PurchasePricePerUnit: null,\r\n } as IInventoryBatchDto;\r\n};\r\nexport const ConvertConsumablesToInsertEntity = (\r\n services: IOtherServices[],\r\n connectedModel: IConnectedFiltersDto,\r\n) => {\r\n return services.map(f => {\r\n return {\r\n Id: f.Id,\r\n BudgetID: connectedModel.Budget?.Id || null,\r\n Budget: connectedModel.Budget?.Name,\r\n UserGroup: connectedModel.UserGroup?.Id || null,\r\n UserGroupName: connectedModel.UserGroup?.Name,\r\n BookedBy: connectedModel.User?.Id,\r\n UserDisplayName: connectedModel.User?.Name,\r\n ServiceTypeID: f.ServiceTypeID,\r\n ServiceType: f.ServiceType,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(connectedModel.StartTime),\r\n ),\r\n Quantity: f.Quantity,\r\n DiscountFactor: f.DiscountFactor,\r\n Remarks: f.Remarks,\r\n FundingType: connectedModel.FundingType?.Id,\r\n BudgetExperimentId: connectedModel.BudgetExperiment?.Id,\r\n BudgetExperimentName: connectedModel.BudgetExperiment?.Name,\r\n ReservationId: f.ReservationId,\r\n UsageId: f.UsageId,\r\n ExternalCustomerId: connectedModel.ExternalCustomer?.Id,\r\n ExternalCustomerName: connectedModel.ExternalCustomer?.Name,\r\n SyncReservation: false,\r\n SyncUsage: false,\r\n StaffOnly: f.StaffOnly || false,\r\n InstituteProjectId: connectedModel.InstituteProject?.Id,\r\n InstituteProjectName: connectedModel.InstituteProject?.Name,\r\n PurchaseOrder: connectedModel.PurchaseOrder,\r\n Reference: connectedModel.Reference,\r\n BudgetsTurnedOn: f.BudgetsTurnedOn,\r\n DefaultQuantity: f.DefaultQuantity,\r\n HideProjects: f.HideProjects,\r\n IntQuantityOnly: f.IntQuantityOnly,\r\n ServiceGroupId: f.ServiceGroupId,\r\n AllowToUser: f.AllowToUser,\r\n UnitTypeId: f.UnitTypeId,\r\n Units: f.Units,\r\n TrackInventory: f.TrackInventory,\r\n InventoryBatchesEnabled: f.InventoryBatchesEnabled,\r\n InventoryBatchId: f.InventoryBatchId,\r\n InventoryBatchName: f.InventoryBatchName,\r\n InventoryBatchAmount: f.InventoryBatchAmount,\r\n NotLessThanZero: f.NotLessThanZero,\r\n } as IOtherServices;\r\n });\r\n};\r\nexport const ConvertRenewStockToInsertEntity = (\r\n model: RenewStockState,\r\n autoGenerateBatch?: boolean,\r\n) => {\r\n let data = {\r\n Id: model.Id,\r\n ServiceTypeID: model.ServiceType?.Id,\r\n ServiceType: model.ServiceType?.Name,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.DateReceived),\r\n ),\r\n Quantity: model.Quantity,\r\n Remarks: model.Remarks,\r\n InventoryBatchesEnabled: model.ServiceType?.InventoryBatchesEnabled,\r\n InventoryBatchId: model.InventoryBatch?.Id,\r\n InventoryBatchName: model.InventoryBatch?.Name,\r\n DefaultQuantity: model.ServiceType?.DefaultQuantity,\r\n IntQuantityOnly: model.ServiceType?.IntQuantityOnly,\r\n ServiceGroupId: model.ServiceType?.ServiceGroupId,\r\n TrackInventory: model.ServiceType?.TrackInventory,\r\n NotLessThanZero: model.ServiceType?.NotLessThanZero,\r\n AutoGenerateNewBatches: autoGenerateBatch,\r\n RenewStockInventory: true,\r\n } as IOtherServices;\r\n return data;\r\n};\r\nexport const ConvertInventoryBatchToEntity = (model: InventoryBatchState) => {\r\n let data = {\r\n Id: model.Id,\r\n Name: model.Name,\r\n OfflineServiceTypeId: model.ServiceType?.Id,\r\n OfflineServiceTypeName: model.ServiceType?.Name,\r\n PurchaseDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.PurchaseDate ?? new Date()),\r\n ),\r\n ExpirationDate:\r\n model.ExpirationDate === null || model.ExpirationDate === undefined\r\n ? null\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.ExpirationDate),\r\n ),\r\n Inventory: 0, // model.Inventory,\r\n Lot: model.Lot,\r\n PurchasePricePerUnit: model.PurchasePricePerUnit,\r\n } as IInventoryBatchDto;\r\n return data;\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects';\r\nimport { offlineServiceStateActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { OtherServicesApi as api } from 'api/OtherServicesApi';\r\nimport {\r\n ConsumableServicesResponse,\r\n ConvertConsumablesToInsertEntity,\r\n ConvertDtoToConnectedModel,\r\n ConvertInventoryBatchToEntity,\r\n ConvertModelToInsertEntity,\r\n ConvertModelToUpdateEntity,\r\n ConvertModelToUpdateRenewStockEntity,\r\n ConvertRenewStockToInsertEntity,\r\n getDefaultBatch,\r\n getDefaultService,\r\n InventoryBatchParams,\r\n InventoryBatchResponse,\r\n InventoryBatchState,\r\n OfflineServiceQueryStringParameters,\r\n OfflineServicesResponse,\r\n OfflineServiceTypeChangeResult,\r\n OtherServiceDetailsState,\r\n RenewStockParams,\r\n RenewStockState,\r\n ReportConsumablesState,\r\n ServiceChangeStateParameters,\r\n StockRenewalParams,\r\n StockRenewalState,\r\n} from './types';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { OtherServiceDetailsProps } from '..';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { AxiosError } from 'axios';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport {\r\n ConnectedFiltersInit,\r\n IConnectedFiltersDto,\r\n} from 'types/IConnectedFiltersDto';\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { connectedFiltersActions } from 'app/components/Forms/FormConnectedFilters/slice';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { selectConnectedFiltersData } from 'app/components/Forms/FormConnectedFilters/slice/selectors';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectBarcodeScanTarget,\r\n selectGlobalSetting,\r\n selectOffsetDate,\r\n} from 'app/slice/selectors';\r\nimport { toEntity } from 'utils/entity-utils';\r\nimport { MultiDetailsProps } from 'app/Layout/FrontendLayout/components/Snackbar/Actions';\r\nimport { BARCODE_SCANNED } from 'react-usb-barcode-scanner';\r\nimport { parseBarcode, ScanTarget } from 'app/slice/types';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { IMyAssetsRow } from 'app/pages/MyAssetsPage/IMyAssetsRow';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { InventoryBatchProps } from '../../InventoryBatch';\r\nimport { RenewStockProps } from '../../RenewStock';\r\nimport { v4 as uuid } from 'uuid';\r\n\r\nfunction* doInitDetails(\r\n action: PayloadAction<{\r\n query: OfflineServiceQueryStringParameters;\r\n service?: IOtherServices;\r\n globalSettings: GlobalSettingsType;\r\n editCreatable?: boolean;\r\n }>,\r\n) {\r\n try {\r\n let data: IOtherServices | null = action.payload.service || null;\r\n const date = yield select(state => selectOffsetDate(state, new Date()));\r\n let hasError: boolean = false;\r\n const user: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n let serviceType: IOfflineServiceFilterDto | null = null;\r\n if (data === null) {\r\n const result = yield call(api.initOfflineService, action.payload.query);\r\n console.debug('service result: ', result);\r\n let response = result as OfflineServicesResponse;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: `initOfflineErr_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: `initOfflineWarn_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n key: `initOfflineSucc_${uuid()}`,\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n data =\r\n response.data ??\r\n getDefaultService(\r\n user,\r\n dateUtils.formatISO(dateUtils.dateOrStringToDate(date)),\r\n );\r\n hasError = !response.IsValid;\r\n serviceType = response.serviceType as IOfflineServiceFilterDto;\r\n }\r\n if (serviceType === null && data.ServiceTypeID > 0) {\r\n serviceType = yield call(\r\n api.getServiceType,\r\n data.ServiceTypeID,\r\n 'public',\r\n );\r\n }\r\n yield put(\r\n connectedFiltersActions.extendSettingsState({\r\n services:\r\n data.ServiceTypeID > 0\r\n ? [\r\n {\r\n Id: data.ServiceTypeID,\r\n Name: data.ServiceType,\r\n ServiceGroupId: data.ServiceGroupId,\r\n ServiceTypeId: ServiceType.Offline,\r\n Active: true,\r\n BudgetsTurnedOn: data.BudgetsTurnedOn,\r\n HideProject: data.HideProjects,\r\n } as IServiceTypeFilterDto,\r\n ]\r\n : [],\r\n globalSettings: action.payload.globalSettings,\r\n isEdit: (tryParseInt(action.payload.query.id) ?? 0) > 0,\r\n settings: {},\r\n data: ConvertDtoToConnectedModel(data),\r\n }),\r\n );\r\n yield put(\r\n connectedFiltersActions.saveState(ConvertDtoToConnectedModel(data)),\r\n );\r\n yield put(\r\n actions.initDetails_Success({\r\n hasErrors: hasError,\r\n hasCharges: data.HasCharges,\r\n data: data,\r\n isEdit: (tryParseInt(action.payload.query.id) ?? 0) > 0,\r\n serviceType: serviceType,\r\n }),\r\n );\r\n if (\r\n data.ServiceTypeID > 0 &&\r\n !(data.Id > 0) &&\r\n !action.payload.editCreatable\r\n ) {\r\n const parameters = {\r\n ServiceTypes: [data.ServiceTypeID],\r\n ReservationId: data.ReservationId,\r\n UsageId: data.UsageId,\r\n BookedBy: data.BookedBy,\r\n ADGroup: data.UserGroup,\r\n Start: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(data.ServiceDate),\r\n ),\r\n BudgetId: data.BudgetID,\r\n FundingTypeId: data.FundingType ?? 0,\r\n } as ServiceChangeStateParameters;\r\n yield put(actions.initServiceChangeStateData(parameters));\r\n }\r\n } catch (error: unknown) {\r\n yield put(actions.initDetails_Error(error));\r\n }\r\n}\r\nfunction* doInitServiceChangeStateData(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n let res = yield call(api.getServiceChangeState, action.payload);\r\n let response = res as OfflineServiceTypeChangeResult;\r\n\r\n yield put(actions.initServiceChangeStateData_Success(response));\r\n } catch (error: unknown) {\r\n yield put(actions.initServiceChangeStateData_Error());\r\n }\r\n}\r\nfunction* doCreate(\r\n action: PayloadAction<{\r\n model: OtherServiceDetailsState;\r\n saveCreatable?: boolean;\r\n }>,\r\n) {\r\n const connectedModel: IConnectedFiltersDto = yield select(\r\n selectConnectedFiltersData,\r\n );\r\n const httpPayloads: IOtherServices = ConvertModelToInsertEntity(\r\n action.payload.model,\r\n connectedModel,\r\n );\r\n try {\r\n const result = yield call(api.insertOtherService, httpPayloads);\r\n let response = result as OfflineServicesResponse;\r\n let responseErrors = response.ErrorMessages;\r\n let responseWarnings = response.WarningMessages;\r\n let responseSuccess = response.SuccessMessages;\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors.map(item => {\r\n return {\r\n key: `serviceInsertError_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (responseSuccess.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceInsertSuccess_${uuid()}`,\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: true,\r\n itemName: i18next.t(translations.OfflineService),\r\n detailsType: RenderPageType.OtherServiceDetails,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n initialService: response.data,\r\n } as OtherServiceDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: `serviceInsertWarning_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = responseErrors.length > 0;\r\n if (action.payload.saveCreatable === true && !hasErrors) {\r\n yield put(actions.setReservationService(response.data ?? undefined));\r\n }\r\n yield put(\r\n actions.createService_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceInsert_${uuid()}`,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createService_Error(Error));\r\n }\r\n}\r\nfunction* doUpdate(\r\n action: PayloadAction<{\r\n current: OtherServiceDetailsState;\r\n original: OtherServiceDetailsState;\r\n saveCreatable?: boolean;\r\n }>,\r\n) {\r\n const connectedModel: IConnectedFiltersDto = yield select(\r\n selectConnectedFiltersData,\r\n );\r\n let updatedService = ConvertModelToUpdateEntity(\r\n action.payload.current,\r\n action.payload.original,\r\n connectedModel,\r\n );\r\n let hasErrors = false;\r\n try {\r\n if (action.payload.saveCreatable) {\r\n yield put(actions.setReservationService(updatedService));\r\n } else {\r\n const results = yield call(\r\n api.updateOtherService,\r\n updatedService,\r\n action.payload.current.Id,\r\n );\r\n let response = results as OfflineServicesResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: `serviceUpdateErr_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceUpdateSuccess_${uuid()}`,\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: false,\r\n itemName: i18next.t(translations.OfflineService),\r\n detailsType: RenderPageType.OtherServiceDetails,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n initialService: response.data,\r\n } as OtherServiceDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: `serviceUpdateWarn_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n hasErrors = response.ErrorMessages.length > 0;\r\n }\r\n yield put(\r\n actions.updateService_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceUpdateErr_${uuid()}`,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateService_Error(Error));\r\n }\r\n}\r\nfunction* doSetAnyValue(\r\n action: PayloadAction<{\r\n fieldKey: keyof OtherServiceDetailsState;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setAnyValueSuccess(action.payload));\r\n}\r\nfunction* doSetConsumableValue(\r\n action: PayloadAction<{\r\n fieldKey: keyof ReportConsumablesState;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setConsumableValueSuccess(action.payload));\r\n}\r\nfunction* doSetRenewalValue(\r\n action: PayloadAction<{\r\n fieldKey: keyof StockRenewalState;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setStockRenewalValueSuccess(action.payload));\r\n}\r\nfunction* doGetCredit(action: PayloadAction) {\r\n const connectedModel: IConnectedFiltersDto = yield select(\r\n selectConnectedFiltersData,\r\n );\r\n const httpPayloads: IOtherServices = ConvertModelToInsertEntity(\r\n action.payload,\r\n connectedModel,\r\n );\r\n try {\r\n const result = yield call(api.calculateCredit, httpPayloads);\r\n yield put(\r\n actions.getCredit_Success({\r\n credit: result.TotalCost,\r\n balance: result.Balance,\r\n }),\r\n );\r\n } catch {\r\n yield put(actions.getCredit_Success({ credit: 0, balance: null }));\r\n }\r\n}\r\nfunction* doGetTotalCredit(action: PayloadAction) {\r\n const connectedModel: IConnectedFiltersDto = yield select(\r\n selectConnectedFiltersData,\r\n );\r\n const httpPayloads: IOtherServices[] = ConvertConsumablesToInsertEntity(\r\n action.payload,\r\n connectedModel,\r\n );\r\n try {\r\n const result = yield call(api.calculateTotalCredit, httpPayloads);\r\n yield put(\r\n actions.getTotalCredit_Success({\r\n credit: result.TotalCost,\r\n balance: result.Balance,\r\n }),\r\n );\r\n } catch {\r\n yield put(actions.getTotalCredit_Success({ credit: 0, balance: null }));\r\n }\r\n}\r\nfunction* doInitConsumables(\r\n action: PayloadAction<{\r\n query: OfflineServiceQueryStringParameters;\r\n globalSettings: GlobalSettingsType;\r\n services?: IOtherServices[];\r\n }>,\r\n) {\r\n try {\r\n let data: IOtherServices[] = !!action.payload.services\r\n ? action.payload.services\r\n : [];\r\n const user: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n if (data.length < 1) {\r\n const result = yield call(\r\n api.initConsumableServices,\r\n action.payload.query,\r\n );\r\n let response = result as ConsumableServicesResponse;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: `initOfflineErr_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: `initOfflineWarn_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n key: `initOfflineSucc_${uuid()}`,\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n data = response.data;\r\n }\r\n yield put(\r\n connectedFiltersActions.extendSettingsState({\r\n services:\r\n data.length > 0\r\n ? data.map(f => {\r\n return {\r\n Id: f.ServiceTypeID,\r\n Name: f.ServiceType,\r\n ServiceGroupId: f.ServiceGroupId,\r\n ServiceTypeId: ServiceType.Offline,\r\n Active: true,\r\n BudgetsTurnedOn: f.BudgetsTurnedOn,\r\n HideProject: f.HideProjects,\r\n } as IServiceTypeFilterDto;\r\n })\r\n : [],\r\n globalSettings: action.payload.globalSettings,\r\n isEdit: false,\r\n settings: {},\r\n data:\r\n data.length > 0\r\n ? ConvertDtoToConnectedModel(data[0])\r\n : ConnectedFiltersInit(\r\n undefined,\r\n undefined,\r\n toEntity(user?.Id, user?.Name),\r\n ),\r\n }),\r\n );\r\n yield put(\r\n connectedFiltersActions.saveState(\r\n data.length > 0\r\n ? ConvertDtoToConnectedModel(data[0])\r\n : ConnectedFiltersInit(\r\n undefined,\r\n undefined,\r\n toEntity(user?.Id, user?.Name),\r\n ),\r\n ),\r\n );\r\n yield put(\r\n actions.initConsumables_Success({\r\n data: data,\r\n user: toEntity(user?.Id, user?.Name),\r\n }),\r\n );\r\n if (data.length > 0) {\r\n const parameters = {\r\n ServiceTypes: data.map(f => f.ServiceTypeID),\r\n ReservationId: null,\r\n UsageId: null,\r\n BookedBy: data[0].BookedBy,\r\n ADGroup: data[0].UserGroup,\r\n Start: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(data[0].ServiceDate),\r\n ),\r\n BudgetId: data[0].BudgetID,\r\n FundingTypeId: data[0].FundingType ?? 0,\r\n } as ServiceChangeStateParameters;\r\n yield put(actions.initServiceChangeStateData(parameters));\r\n }\r\n } catch (error: unknown) {\r\n yield put(actions.initConsumables_Error(error));\r\n }\r\n}\r\nfunction* doCreateConsumables(action: PayloadAction) {\r\n const connectedModel: IConnectedFiltersDto = yield select(\r\n selectConnectedFiltersData,\r\n );\r\n const httpPayloads: IOtherServices[] = ConvertConsumablesToInsertEntity(\r\n action.payload.Services,\r\n connectedModel,\r\n );\r\n try {\r\n const result = yield call(api.insertConsumableServices, httpPayloads);\r\n let response = result as ConsumableServicesResponse;\r\n let responseErrors = response.ErrorMessages;\r\n let responseWarnings = response.WarningMessages;\r\n let responseSuccess = response.SuccessMessages;\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors.map(item => {\r\n return {\r\n key: `serviceInsertError_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (responseSuccess.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceInsertSuccess_${uuid()}`,\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: undefined,\r\n created: true,\r\n multiple: true,\r\n itemName: i18next.t(translations.OfflineService),\r\n itemEndName: 'logged',\r\n multiDetails: response.data.map(f => {\r\n return {\r\n Id: f.Id,\r\n detailsType: RenderPageType.OtherServiceDetails,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + f.Id ?? -1,\r\n },\r\n initialService: f,\r\n } as OtherServiceDetailsProps,\r\n } as MultiDetailsProps;\r\n }),\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: `serviceInsertWarning_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = responseErrors.length > 0;\r\n yield put(\r\n actions.createConsumables_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceInsert_${uuid()}`,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createConsumables_Error(Error));\r\n }\r\n}\r\nasync function getAssetByInternalCode(barcode: string) {\r\n try {\r\n var response: IODataQueryResponse = await httpClient.get(\r\n '/api/odata/v4/MyAssets',\r\n {\r\n $top: 1,\r\n $select: 'ServiceId',\r\n $filter: `${new Condition(\r\n 'InternalCode',\r\n ODataOperators.Equals,\r\n barcode,\r\n ).toString()} and ${new Condition(\r\n 'ServiceTypeId',\r\n ODataOperators.Equals,\r\n 2,\r\n ).toString()}`,\r\n },\r\n );\r\n var serviceTypeId = response.value[0]?.ServiceId;\r\n return serviceTypeId;\r\n } catch (error) {}\r\n}\r\nfunction* doBarcodeScan(action: PayloadAction<{ data: string }>) {\r\n const MIN_LENGTH_DEFAULT = 6;\r\n const minBarcodeLengthString: string | undefined = yield select(state =>\r\n selectGlobalSetting(state, AllowedSettings.MinBarcodeLength),\r\n );\r\n const MinBarcodeLength =\r\n tryParseInt(minBarcodeLengthString) ?? MIN_LENGTH_DEFAULT;\r\n // prevent accidental barcode detection on fast user input\r\n if (action.payload.data.length < MinBarcodeLength) {\r\n return;\r\n }\r\n const scannTarget: ScanTarget | undefined = yield select(\r\n selectBarcodeScanTarget,\r\n );\r\n if (scannTarget === undefined || scannTarget !== ScanTarget.Consumables) {\r\n return;\r\n }\r\n const appSettings: AppSettings = yield select(selectAppSettings);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'info',\r\n message:\r\n i18next.t(translations.BarcodeScanModalBody) +\r\n ' ' +\r\n action.payload.data,\r\n }),\r\n );\r\n try {\r\n // in case and the barcode is a valid internal url - get InternalCode\r\n let scanedBarcode = parseBarcode(action.payload.data, appSettings);\r\n\r\n let internalId = action.payload.data;\r\n if (scanedBarcode !== undefined) {\r\n internalId = scanedBarcode.InternalCode ?? action.payload.data;\r\n }\r\n if (internalId === undefined || internalId === null) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.BarcodeNotFoundEx),\r\n }),\r\n );\r\n } else {\r\n const serviceId = yield call(getAssetByInternalCode, internalId);\r\n if (serviceId !== undefined) {\r\n yield put(actions.setSelectedServiceType([serviceId]));\r\n yield put(actions.setBarcodeScanned(true));\r\n\r\n return;\r\n }\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.BarcodeNotFoundEx),\r\n }),\r\n );\r\n }\r\n } catch (error) {\r\n console.error(`${action.type}`, action.payload, error);\r\n }\r\n}\r\nfunction* doSetIsBarcodeScanned(action: PayloadAction) {\r\n yield put(actions.setBarcodeScanned_Success(action.payload));\r\n}\r\nfunction* doInitStockRenewal(\r\n action: PayloadAction<{\r\n query: StockRenewalParams;\r\n services?: IOtherServices[];\r\n }>,\r\n) {\r\n try {\r\n let data: IOtherServices[] = !!action.payload.services\r\n ? action.payload.services\r\n : [];\r\n const date = yield select(state => selectOffsetDate(state, new Date()));\r\n if (data.length < 1) {\r\n const result = yield call(\r\n api.initStockRenewalServices,\r\n action.payload.query,\r\n );\r\n let response = result as ConsumableServicesResponse;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: `initOfflineErr_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: `initOfflineWarn_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n key: `initOfflineSucc_${uuid()}`,\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n data = response.data;\r\n }\r\n yield put(\r\n actions.initStockRenewal_Success({\r\n data: data,\r\n date: dateUtils.formatISO(dateUtils.dateOrStringToDate(date)),\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n yield put(actions.initStockRenewal_Error(error));\r\n }\r\n}\r\nfunction* doCreateStockRenewals(action: PayloadAction) {\r\n const httpPayloads: IOtherServices[] = action.payload.Services;\r\n try {\r\n const result = yield call(api.insertStockRenewalServices, httpPayloads);\r\n let response = result as ConsumableServicesResponse;\r\n let responseErrors = response.ErrorMessages;\r\n let responseWarnings = response.WarningMessages;\r\n let responseSuccess = response.SuccessMessages;\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors.map(item => {\r\n return {\r\n key: `stockrenewalInsertError_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (responseSuccess.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `stockrenewalInsertSuccess_${uuid()}`,\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: undefined,\r\n created: true,\r\n multiple: true,\r\n itemName: i18next.t(translations.RenewStock),\r\n multiDetails: response.data.map(f => {\r\n return {\r\n Id: f.Id,\r\n detailsType: RenderPageType.RenewStock,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + f.Id ?? -1,\r\n },\r\n initialService: f,\r\n } as RenewStockProps,\r\n } as MultiDetailsProps;\r\n }),\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: `stockrenewalInsertWarning_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = responseErrors.length > 0;\r\n yield put(\r\n actions.createStockRenewals_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `stockrenewalInsert_${uuid()}`,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createStockRenewals_Error(Error));\r\n }\r\n}\r\nfunction* doInitRenewStock(\r\n action: PayloadAction<{\r\n query: RenewStockParams;\r\n service?: IOtherServices;\r\n }>,\r\n) {\r\n try {\r\n let data: IOtherServices | null = action.payload.service || null;\r\n let hasError: boolean = false;\r\n const date = yield select(state => selectOffsetDate(state, new Date()));\r\n const user: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n let serviceType: IOfflineServiceFilterDto | null = null;\r\n if (data === null) {\r\n const result = yield call(\r\n api.initRenewStockService,\r\n action.payload.query,\r\n );\r\n console.debug('service result: ', result);\r\n let response = result as OfflineServicesResponse;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: `initOfflineErr_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: `initOfflineWarn_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n key: `initOfflineSucc_${uuid()}`,\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n data =\r\n response.data ??\r\n getDefaultService(\r\n user,\r\n dateUtils.formatISO(dateUtils.dateOrStringToDate(date)),\r\n );\r\n hasError = !response.IsValid;\r\n serviceType = response.serviceType as IOfflineServiceFilterDto;\r\n }\r\n if (serviceType === null && data.ServiceTypeID > 0) {\r\n serviceType = yield call(api.getServiceType, data.ServiceTypeID);\r\n }\r\n yield put(\r\n actions.initRenewStock_Success({\r\n hasErrors: hasError,\r\n data: data,\r\n isEdit: (tryParseInt(action.payload.query.id) ?? 0) > 0,\r\n serviceType: serviceType,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n yield put(actions.initRenewStock_Error(error));\r\n }\r\n}\r\nfunction* doCreateRenewStock(\r\n action: PayloadAction<{\r\n model: RenewStockState;\r\n editCreatable: boolean;\r\n preventRefreshTable?: boolean;\r\n autoGenerateBatch?: boolean;\r\n saveCreatable?: boolean;\r\n }>,\r\n) {\r\n const httpPayloads: IOtherServices = ConvertRenewStockToInsertEntity(\r\n action.payload.model,\r\n action.payload.autoGenerateBatch,\r\n );\r\n if (action.payload.editCreatable) {\r\n yield put(actions.setEditCreatableService(httpPayloads));\r\n yield put(\r\n actions.createRenewStock_Success({\r\n hasErrors: false,\r\n }),\r\n );\r\n } else {\r\n try {\r\n const result = yield call(api.insertOtherService, httpPayloads);\r\n let response = result as OfflineServicesResponse;\r\n let responseErrors = response.ErrorMessages;\r\n let responseWarnings = response.WarningMessages;\r\n let responseSuccess = response.SuccessMessages;\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors.map(item => {\r\n return {\r\n key: `RenewStockInsertError_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (responseSuccess.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `RenewStockInsertSuccess_${uuid()}`,\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: true,\r\n itemName: i18next.t(translations.RenewStock),\r\n detailsType: RenderPageType.RenewStock,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n initialService: response.data,\r\n } as RenewStockProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: `RenewStockInsertWarning_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (!action.payload.preventRefreshTable) {\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n let hasErrors = responseErrors.length > 0;\r\n yield put(\r\n actions.createRenewStock_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n if (action.payload.saveCreatable) {\r\n yield put(actions.getCreatableService(response.data ?? undefined));\r\n }\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `RenewStockInsert_${uuid()}`,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createRenewStock_Error(Error));\r\n }\r\n }\r\n}\r\nfunction* doUpdateRenewStock(\r\n action: PayloadAction<{\r\n current: RenewStockState;\r\n original: RenewStockState;\r\n editCreatable: boolean;\r\n autoGenerateBatch?: boolean;\r\n }>,\r\n) {\r\n let updatedService = ConvertModelToUpdateRenewStockEntity(\r\n action.payload.current,\r\n action.payload.original,\r\n action.payload.autoGenerateBatch,\r\n );\r\n if (action.payload.editCreatable) {\r\n yield put(actions.setEditCreatableService(updatedService));\r\n yield put(\r\n actions.updateRenewStock_Success({\r\n hasErrors: false,\r\n }),\r\n );\r\n } else {\r\n try {\r\n const results = yield call(\r\n api.updateOtherService,\r\n updatedService,\r\n action.payload.current.Id,\r\n );\r\n let response = results as OfflineServicesResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: `serviceUpdateErr_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceUpdateSuccess_${uuid()}`,\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: false,\r\n itemName: i18next.t(translations.RenewStock),\r\n detailsType: RenderPageType.RenewStock,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n initialService: response.data,\r\n } as RenewStockProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: `serviceUpdateWarn_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.updateRenewStock_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceUpdateErr_${uuid()}`,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateRenewStock_Error(Error));\r\n }\r\n }\r\n}\r\nfunction* doInitInventoryBatch(\r\n action: PayloadAction<{\r\n query: InventoryBatchParams;\r\n batch?: IInventoryBatchDto;\r\n }>,\r\n) {\r\n try {\r\n let data: IInventoryBatchDto | null = action.payload.batch || null;\r\n let hasError: boolean = false;\r\n const newDate = yield select(state => selectOffsetDate(state, new Date()));\r\n let serviceType: IOfflineServiceFilterDto | null = null;\r\n if (data === null) {\r\n const result = yield call(api.initInventoryBatch, action.payload.query);\r\n let response = result as InventoryBatchResponse;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: `initBatchErr_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: `initBatchWarn_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n key: `initBatchSucc_${uuid()}`,\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n data =\r\n response.data ??\r\n getDefaultBatch(\r\n dateUtils.formatISO(dateUtils.dateOrStringToDate(newDate)),\r\n );\r\n hasError = !response.IsValid;\r\n serviceType = response.serviceType as IOfflineServiceFilterDto;\r\n }\r\n if (serviceType === null && data.OfflineServiceTypeId > 0) {\r\n serviceType = yield call(api.getServiceType, data.OfflineServiceTypeId);\r\n }\r\n yield put(\r\n actions.initInventoryBatch_Success({\r\n hasErrors: hasError,\r\n data: data,\r\n isEdit: (tryParseInt(action.payload.query.id) ?? 0) > 0,\r\n serviceType: serviceType,\r\n newDate: dateUtils.formatISO(dateUtils.dateOrStringToDate(newDate)),\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n yield put(actions.initInventoryBatch_Error(error));\r\n }\r\n}\r\nfunction* doCreateInventoryBatch(\r\n action: PayloadAction<{\r\n model: InventoryBatchState;\r\n saveCreatable?: boolean;\r\n preventRefreshTable?: boolean;\r\n }>,\r\n) {\r\n const httpPayloads: IInventoryBatchDto = ConvertInventoryBatchToEntity(\r\n action.payload.model,\r\n );\r\n\r\n try {\r\n const result = yield call(api.insertInventoryBatch, httpPayloads);\r\n let response = result as InventoryBatchResponse;\r\n let responseErrors = response.ErrorMessages;\r\n let responseWarnings = response.WarningMessages;\r\n let responseSuccess = response.SuccessMessages;\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors.map(item => {\r\n return {\r\n key: `batchInsertError_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (responseSuccess.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `batchInsertSuccess_${uuid()}`,\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: true,\r\n itemName: i18next.t(translations.InventoryBatch),\r\n detailsType: RenderPageType.InventoryBatch,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n initialBatch: response.data,\r\n } as InventoryBatchProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: `batchInsertWarning_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n }\r\n let hasErrors = responseErrors.length > 0;\r\n if (action.payload.saveCreatable === true) {\r\n yield put(actions.setInventoryBatchEditable(response.data ?? undefined));\r\n } else {\r\n if (!action.payload.preventRefreshTable) {\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n yield put(\r\n actions.createInventoryBatch_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `batchInsert_err_${uuid()}`,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createInventoryBatch_Error(Error));\r\n }\r\n}\r\nfunction* doUpdateInventoryBatch(\r\n action: PayloadAction<{\r\n current: InventoryBatchState;\r\n original: InventoryBatchState;\r\n saveCreatable?: boolean;\r\n preventRefreshTable?: boolean;\r\n }>,\r\n) {\r\n let updatedService = ConvertInventoryBatchToEntity(action.payload.current);\r\n\r\n try {\r\n const results = yield call(\r\n api.updateInventoryBatch,\r\n updatedService,\r\n action.payload.current.Id,\r\n );\r\n let response = results as InventoryBatchResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: `batchUpdateErr_${uuid()}`,\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `batchUpdateSuccess_${uuid()}`,\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: false,\r\n itemName: i18next.t(translations.InventoryBatch),\r\n detailsType: RenderPageType.InventoryBatch,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n initialBatch: response.data,\r\n } as InventoryBatchProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: `batchUpdateWarn_${uuid()}`,\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n //yield put(layoutActions.setRefreshTable(true));\r\n }\r\n if (action.payload.saveCreatable === true) {\r\n yield put(actions.setInventoryBatchEditable(response.data ?? undefined));\r\n } else {\r\n if (!action.payload.preventRefreshTable) {\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.updateInventoryBatch_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `serviceUpdateErr_${uuid()}`,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateInventoryBatch_Error(Error));\r\n }\r\n}\r\nfunction* doSetRenewStockValue(\r\n action: PayloadAction<{\r\n fieldKey: keyof RenewStockState;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setRenewStockValueSuccess(action.payload));\r\n}\r\nfunction* doSetInventoryBatchValue(\r\n action: PayloadAction<{\r\n fieldKey: keyof InventoryBatchState;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setInventoryBatchValueSuccess(action.payload));\r\n}\r\nexport function* offlineServiceStateSaga() {\r\n yield takeLatest(actions.initDetails.type, doInitDetails);\r\n yield takeLatest(actions.createService.type, doCreate);\r\n yield takeLatest(actions.updateService.type, doUpdate);\r\n yield takeLatest(actions.setAnyValue.type, doSetAnyValue);\r\n yield takeLatest(actions.setConsumableValue.type, doSetConsumableValue);\r\n yield takeLatest(actions.createConsumables.type, doCreateConsumables);\r\n yield takeLatest(actions.getCredit.type, doGetCredit);\r\n yield takeLatest(actions.getTotalCredit.type, doGetTotalCredit);\r\n yield takeLatest(\r\n actions.initServiceChangeStateData.type,\r\n doInitServiceChangeStateData,\r\n );\r\n yield takeLatest(actions.initConsumables.type, doInitConsumables);\r\n yield takeLatest(actions.setStockRenewalValue.type, doSetRenewalValue);\r\n yield takeLatest(actions.setRenewStockValue.type, doSetRenewStockValue);\r\n yield takeLatest(\r\n actions.setInventoryBatchValue.type,\r\n doSetInventoryBatchValue,\r\n );\r\n yield takeLatest(actions.initStockRenewal.type, doInitStockRenewal);\r\n yield takeLatest(actions.createStockRenewals.type, doCreateStockRenewals);\r\n yield takeLatest(actions.initRenewStock.type, doInitRenewStock);\r\n yield takeLatest(actions.createRenewStock.type, doCreateRenewStock);\r\n yield takeLatest(actions.updateRenewStock.type, doUpdateRenewStock);\r\n yield takeLatest(actions.initInventoryBatch.type, doInitInventoryBatch);\r\n yield takeLatest(actions.createInventoryBatch.type, doCreateInventoryBatch);\r\n yield takeLatest(actions.updateInventoryBatch.type, doUpdateInventoryBatch);\r\n yield takeLatest(BARCODE_SCANNED, doBarcodeScan);\r\n yield takeLatest(actions.setBarcodeScanned.type, doSetIsBarcodeScanned);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { PricingState } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { Entity } from 'types/common';\r\nimport { ConnectedFiltersInit } from 'types/IConnectedFiltersDto';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { offlineServiceStateSaga } from './saga';\r\nimport {\r\n ConvertConsumablesToRenewalModel,\r\n ConvertConsumablesToModel,\r\n ConvertDtoToConnectedModel,\r\n ConvertDtoToModel,\r\n OfflineServiceQueryStringParameters,\r\n OfflineServiceState,\r\n OfflineServiceTypeChangeResult,\r\n OtherServiceDetailsState,\r\n ReportConsumablesState,\r\n ServiceChangeStateParameters,\r\n StockRenewalState,\r\n StockRenewalParams,\r\n RenewStockState,\r\n RenewStockParams,\r\n ConvertRenewStockToModel,\r\n InventoryBatchState,\r\n InventoryBatchParams,\r\n ConvertInventoryBatchToModel,\r\n} from './types';\r\n\r\nexport const initialState: OfflineServiceState = {\r\n detailsState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n },\r\n processing: false,\r\n consumablesProcessing: false,\r\n valueHandler: undefined,\r\n connectedDataState: ConnectedFiltersInit(),\r\n serviceChangeResultState: undefined,\r\n creditState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n },\r\n hasCharges: undefined,\r\n savedReservationService: undefined,\r\n consumablesState: {\r\n data: {\r\n Services: [],\r\n },\r\n completed: undefined,\r\n dataLength: undefined,\r\n error: undefined,\r\n hasErrors: undefined,\r\n processing: undefined,\r\n },\r\n consumablesValueHandler: undefined,\r\n selectedServiceTypes: [],\r\n editCreatableService: undefined,\r\n barcodeScanned: undefined,\r\n refeshOfflineServices: undefined,\r\n stockRenewalState: {\r\n data: undefined,\r\n completed: undefined,\r\n dataLength: undefined,\r\n error: undefined,\r\n hasErrors: undefined,\r\n processing: undefined,\r\n },\r\n stockRenewalValueHandler: undefined,\r\n renewStockState: {\r\n data: undefined,\r\n completed: undefined,\r\n dataLength: undefined,\r\n error: undefined,\r\n hasErrors: undefined,\r\n processing: undefined,\r\n },\r\n renewStockValueHandler: undefined,\r\n inventoryBatchState: {\r\n data: undefined,\r\n completed: undefined,\r\n dataLength: undefined,\r\n error: undefined,\r\n hasErrors: undefined,\r\n processing: undefined,\r\n },\r\n inventoryBatchValueHandler: undefined,\r\n isEdit: undefined,\r\n batchIsEdit: undefined,\r\n inventoryBatchEditable: undefined,\r\n getCreatableService: undefined,\r\n};\r\nconst slice = createSlice({\r\n name: 'offlineServiceState',\r\n initialState,\r\n reducers: {\r\n initDetails(\r\n state,\r\n action: PayloadAction<{\r\n query: OfflineServiceQueryStringParameters;\r\n globalSettings: GlobalSettingsType;\r\n service?: IOtherServices;\r\n editCreatable?: boolean;\r\n }>,\r\n ) {\r\n state.processing = true;\r\n state.detailsState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.valueHandler = undefined;\r\n if (!action.payload.editCreatable) {\r\n state.connectedDataState = ConnectedFiltersInit();\r\n }\r\n state.serviceChangeResultState = undefined;\r\n },\r\n initDetails_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n hasCharges: boolean;\r\n data: IOtherServices;\r\n isEdit: boolean;\r\n serviceType: IOfflineServiceFilterDto | null;\r\n }>,\r\n ) {\r\n state.processing = false;\r\n state.detailsState.data = ConvertDtoToModel(\r\n action.payload.data,\r\n action.payload.serviceType,\r\n );\r\n state.connectedDataState = ConvertDtoToConnectedModel(\r\n action.payload.data,\r\n );\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n state.hasCharges = action.payload.hasCharges;\r\n state.isEdit = action.payload.isEdit;\r\n },\r\n initDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n resetDetailsState(state, action: PayloadAction) {\r\n state.detailsState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.processing = false;\r\n state.valueHandler = undefined;\r\n if (action.payload !== true) {\r\n state.connectedDataState = ConnectedFiltersInit();\r\n state.serviceChangeResultState = undefined;\r\n }\r\n state.isEdit = undefined;\r\n },\r\n createService(\r\n state,\r\n action: PayloadAction<{\r\n model: OtherServiceDetailsState;\r\n saveCreatable?: boolean;\r\n }>,\r\n ) {\r\n state.detailsState.processing = true;\r\n state.detailsState.completed = undefined;\r\n state.detailsState.hasErrors = undefined;\r\n },\r\n createService_Success(\r\n state,\r\n action: PayloadAction<{ hasErrors: boolean }>,\r\n ) {\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n state.detailsState.completed = true;\r\n },\r\n createService_Error(state, action: PayloadAction) {\r\n state.detailsState.processing = false;\r\n state.detailsState.completed = true;\r\n state.detailsState.hasErrors = true;\r\n },\r\n updateService(\r\n state,\r\n action: PayloadAction<{\r\n current: OtherServiceDetailsState;\r\n original: OtherServiceDetailsState;\r\n saveCreatable?: boolean;\r\n }>,\r\n ) {\r\n state.detailsState.processing = true;\r\n state.detailsState.completed = undefined;\r\n state.detailsState.hasErrors = undefined;\r\n },\r\n updateService_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n state.detailsState.completed = true;\r\n },\r\n updateService_Error(state, action: PayloadAction) {\r\n state.detailsState.processing = false;\r\n state.detailsState.completed = true;\r\n state.detailsState.hasErrors = true;\r\n },\r\n setAnyValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof OtherServiceDetailsState;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setAnyValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof OtherServiceDetailsState;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.valueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetValueHandler(state, action: PayloadAction) {\r\n state.valueHandler = undefined;\r\n },\r\n initServiceChangeStateData(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n initServiceChangeStateData_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.serviceChangeResultState = action.payload;\r\n },\r\n initServiceChangeStateData_Error(state, action: PayloadAction) {\r\n state.serviceChangeResultState = undefined;\r\n },\r\n resetServiceChangeState(state, action: PayloadAction) {\r\n state.serviceChangeResultState = undefined;\r\n },\r\n getCredit(state, action: PayloadAction) {\r\n state.creditState.processing = true;\r\n state.creditState.completed = undefined;\r\n state.creditState.hasErrors = undefined;\r\n },\r\n getCredit_Success(state, action: PayloadAction) {\r\n state.creditState.processing = false;\r\n state.creditState.completed = true;\r\n state.creditState.data = action.payload;\r\n },\r\n getCredit_Error(state, action: PayloadAction) {\r\n state.creditState.processing = false;\r\n state.creditState.completed = true;\r\n state.creditState.data = undefined;\r\n },\r\n resetCreditState(state, action: PayloadAction) {\r\n state.creditState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n getTotalCredit(state, action: PayloadAction) {\r\n state.creditState.processing = true;\r\n state.creditState.completed = undefined;\r\n state.creditState.hasErrors = undefined;\r\n },\r\n getTotalCredit_Success(state, action: PayloadAction) {\r\n state.creditState.processing = false;\r\n state.creditState.completed = true;\r\n state.creditState.data = action.payload;\r\n },\r\n getTotalCredit_Error(state, action: PayloadAction) {\r\n state.creditState.processing = false;\r\n state.creditState.completed = true;\r\n state.creditState.data = undefined;\r\n },\r\n resetTotalCreditState(state, action: PayloadAction) {\r\n state.creditState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n setReservationService(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.savedReservationService = action.payload;\r\n },\r\n setConsumableValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof ReportConsumablesState;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setConsumableValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof ReportConsumablesState;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.consumablesValueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetConsumableValueHandler(state, action: PayloadAction) {\r\n state.consumablesValueHandler = undefined;\r\n },\r\n initConsumables(\r\n state,\r\n action: PayloadAction<{\r\n query: OfflineServiceQueryStringParameters;\r\n globalSettings: GlobalSettingsType;\r\n services?: IOtherServices[];\r\n }>,\r\n ) {\r\n state.consumablesProcessing = true;\r\n state.consumablesState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.consumablesValueHandler = undefined;\r\n },\r\n initConsumables_Success(\r\n state,\r\n action: PayloadAction<{\r\n data: IOtherServices[];\r\n user?: Entity | null;\r\n }>,\r\n ) {\r\n state.consumablesProcessing = false;\r\n state.consumablesState.data = ConvertConsumablesToModel(\r\n action.payload.data,\r\n );\r\n state.connectedDataState =\r\n action.payload.data.length > 0\r\n ? ConvertDtoToConnectedModel(action.payload.data[0])\r\n : ConnectedFiltersInit(undefined, undefined, action.payload.user);\r\n },\r\n initConsumables_Error(state, action: PayloadAction) {\r\n state.consumablesProcessing = false;\r\n },\r\n extendConsumablesData(state, action: PayloadAction) {\r\n state.consumablesState.data = { Services: action.payload };\r\n },\r\n createConsumables(state, action: PayloadAction) {\r\n state.consumablesState.processing = true;\r\n state.consumablesState.completed = undefined;\r\n state.consumablesState.hasErrors = undefined;\r\n },\r\n createConsumables_Success(\r\n state,\r\n action: PayloadAction<{ hasErrors: boolean }>,\r\n ) {\r\n state.consumablesState.processing = false;\r\n state.consumablesState.hasErrors = action.payload.hasErrors;\r\n state.consumablesState.completed = true;\r\n },\r\n createConsumables_Error(state, action: PayloadAction) {\r\n state.consumablesState.processing = false;\r\n state.consumablesState.completed = true;\r\n state.consumablesState.hasErrors = true;\r\n },\r\n resetConsumablesState(state, action: PayloadAction) {\r\n state.consumablesState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n dataLength: undefined,\r\n };\r\n state.consumablesProcessing = false;\r\n state.consumablesValueHandler = undefined;\r\n state.connectedDataState = ConnectedFiltersInit();\r\n state.serviceChangeResultState = undefined;\r\n state.selectedServiceTypes = [];\r\n state.barcodeScanned = undefined;\r\n state.refeshOfflineServices = undefined;\r\n },\r\n resetSelectedServiceType(state, action: PayloadAction) {\r\n state.selectedServiceTypes = [];\r\n },\r\n setSelectedServiceType(state, action: PayloadAction>) {\r\n state.selectedServiceTypes = action.payload;\r\n },\r\n setEditCreatableService(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.editCreatableService = action.payload;\r\n },\r\n getCreatableService(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.getCreatableService = action.payload;\r\n },\r\n setBarcodeScanned(state, action: PayloadAction) {},\r\n setBarcodeScanned_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.barcodeScanned = action.payload;\r\n },\r\n setRefreshConsumableOfflineServices(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.refeshOfflineServices = action.payload;\r\n },\r\n\r\n setStockRenewalValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof StockRenewalState;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setStockRenewalValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof StockRenewalState;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.stockRenewalValueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetStockRenewalValueHandler(state, action: PayloadAction) {\r\n state.stockRenewalValueHandler = undefined;\r\n },\r\n initStockRenewal(\r\n state,\r\n action: PayloadAction<{\r\n query: StockRenewalParams;\r\n services?: IOtherServices[];\r\n }>,\r\n ) {\r\n state.stockRenewalState = {\r\n data: undefined,\r\n processing: true,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.stockRenewalValueHandler = undefined;\r\n },\r\n initStockRenewal_Success(\r\n state,\r\n action: PayloadAction<{\r\n data: IOtherServices[];\r\n date: Date | string;\r\n }>,\r\n ) {\r\n state.stockRenewalState.processing = false;\r\n state.stockRenewalState.data = ConvertConsumablesToRenewalModel(\r\n action.payload.data,\r\n action.payload.date,\r\n );\r\n },\r\n initStockRenewal_Error(state, action: PayloadAction) {\r\n state.stockRenewalState.processing = false;\r\n },\r\n createStockRenewals(state, action: PayloadAction) {\r\n state.stockRenewalState.processing = true;\r\n state.stockRenewalState.completed = undefined;\r\n state.stockRenewalState.hasErrors = undefined;\r\n },\r\n createStockRenewals_Success(\r\n state,\r\n action: PayloadAction<{ hasErrors: boolean }>,\r\n ) {\r\n state.stockRenewalState.processing = false;\r\n state.stockRenewalState.hasErrors = action.payload.hasErrors;\r\n state.stockRenewalState.completed = true;\r\n },\r\n createStockRenewals_Error(state, action: PayloadAction) {\r\n state.stockRenewalState.processing = false;\r\n state.stockRenewalState.completed = true;\r\n state.stockRenewalState.hasErrors = true;\r\n },\r\n resetStockRenewalState(state, action: PayloadAction) {\r\n state.stockRenewalState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n dataLength: undefined,\r\n };\r\n state.processing = false;\r\n state.stockRenewalValueHandler = undefined;\r\n state.selectedServiceTypes = [];\r\n state.barcodeScanned = undefined;\r\n state.refeshOfflineServices = undefined;\r\n },\r\n\r\n setRenewStockValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof RenewStockState;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setRenewStockValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof RenewStockState;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.renewStockValueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetRenewStockValueHandler(state, action: PayloadAction) {\r\n state.renewStockValueHandler = undefined;\r\n },\r\n initRenewStock(\r\n state,\r\n action: PayloadAction<{\r\n query: RenewStockParams;\r\n service?: IOtherServices;\r\n }>,\r\n ) {\r\n state.renewStockState = {\r\n data: undefined,\r\n processing: true,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n };\r\n state.renewStockValueHandler = undefined;\r\n },\r\n initRenewStock_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n data: IOtherServices;\r\n isEdit: boolean;\r\n serviceType: IOfflineServiceFilterDto | null;\r\n }>,\r\n ) {\r\n state.renewStockState.processing = false;\r\n state.renewStockState.data = ConvertRenewStockToModel(\r\n action.payload.data,\r\n action.payload.serviceType,\r\n );\r\n state.isEdit = action.payload.isEdit;\r\n },\r\n initRenewStock_Error(state, action: PayloadAction) {\r\n state.renewStockState.processing = false;\r\n },\r\n createRenewStock(\r\n state,\r\n action: PayloadAction<{\r\n model: RenewStockState;\r\n editCreatable: boolean;\r\n preventRefreshTable?: boolean;\r\n autoGenerateBatch?: boolean;\r\n saveCreatable?: boolean;\r\n }>,\r\n ) {\r\n state.renewStockState.processing = true;\r\n state.renewStockState.completed = undefined;\r\n state.renewStockState.hasErrors = undefined;\r\n },\r\n createRenewStock_Success(\r\n state,\r\n action: PayloadAction<{ hasErrors: boolean }>,\r\n ) {\r\n state.renewStockState.processing = false;\r\n state.renewStockState.hasErrors = action.payload.hasErrors;\r\n state.renewStockState.completed = true;\r\n },\r\n createRenewStock_Error(state, action: PayloadAction) {\r\n state.renewStockState.processing = false;\r\n state.renewStockState.completed = true;\r\n state.renewStockState.hasErrors = true;\r\n },\r\n updateRenewStock(\r\n state,\r\n action: PayloadAction<{\r\n current: OtherServiceDetailsState;\r\n original: OtherServiceDetailsState;\r\n editCreatable: boolean;\r\n autoGenerateBatch?: boolean;\r\n }>,\r\n ) {\r\n state.renewStockState.processing = true;\r\n state.renewStockState.completed = undefined;\r\n state.renewStockState.hasErrors = undefined;\r\n },\r\n updateRenewStock_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.renewStockState.processing = false;\r\n state.renewStockState.hasErrors = action.payload.hasErrors;\r\n state.renewStockState.completed = true;\r\n },\r\n updateRenewStock_Error(state, action: PayloadAction) {\r\n state.renewStockState.processing = false;\r\n state.renewStockState.completed = true;\r\n state.renewStockState.hasErrors = true;\r\n },\r\n resetRenewStockState(state, action: PayloadAction) {\r\n state.renewStockState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n dataLength: undefined,\r\n };\r\n state.processing = false;\r\n state.renewStockValueHandler = undefined;\r\n state.isEdit = undefined;\r\n },\r\n setInventoryBatchValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof InventoryBatchState;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setInventoryBatchValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof InventoryBatchState;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.inventoryBatchValueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetInventoryBatchValueHandler(state, action: PayloadAction) {\r\n state.inventoryBatchValueHandler = undefined;\r\n },\r\n initInventoryBatch(\r\n state,\r\n action: PayloadAction<{\r\n query: InventoryBatchParams;\r\n batch?: IInventoryBatchDto;\r\n }>,\r\n ) {\r\n state.inventoryBatchState = {\r\n data: undefined,\r\n processing: true,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n };\r\n state.inventoryBatchValueHandler = undefined;\r\n },\r\n initInventoryBatch_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n data: IInventoryBatchDto;\r\n isEdit: boolean;\r\n serviceType: IOfflineServiceFilterDto | null;\r\n newDate: Date | string;\r\n }>,\r\n ) {\r\n state.inventoryBatchState.processing = false;\r\n state.inventoryBatchState.data = ConvertInventoryBatchToModel(\r\n action.payload.data,\r\n action.payload.serviceType,\r\n action.payload.newDate,\r\n );\r\n state.batchIsEdit = action.payload.isEdit;\r\n },\r\n initInventoryBatch_Error(state, action: PayloadAction) {\r\n state.inventoryBatchState.processing = false;\r\n },\r\n createInventoryBatch(\r\n state,\r\n action: PayloadAction<{\r\n model: InventoryBatchState;\r\n saveCreatable?: boolean;\r\n preventRefreshTable?: boolean;\r\n }>,\r\n ) {\r\n state.inventoryBatchState.processing = true;\r\n state.inventoryBatchState.completed = undefined;\r\n state.inventoryBatchState.hasErrors = undefined;\r\n },\r\n createInventoryBatch_Success(\r\n state,\r\n action: PayloadAction<{ hasErrors: boolean }>,\r\n ) {\r\n state.inventoryBatchState.processing = false;\r\n state.inventoryBatchState.hasErrors = action.payload.hasErrors;\r\n state.inventoryBatchState.completed = true;\r\n },\r\n createInventoryBatch_Error(state, action: PayloadAction) {\r\n state.inventoryBatchState.processing = false;\r\n state.inventoryBatchState.completed = true;\r\n state.inventoryBatchState.hasErrors = true;\r\n },\r\n updateInventoryBatch(\r\n state,\r\n action: PayloadAction<{\r\n current: InventoryBatchState;\r\n original: InventoryBatchState;\r\n saveCreatable?: boolean;\r\n preventRefreshTable?: boolean;\r\n }>,\r\n ) {\r\n state.inventoryBatchState.processing = true;\r\n state.inventoryBatchState.completed = undefined;\r\n state.inventoryBatchState.hasErrors = undefined;\r\n },\r\n updateInventoryBatch_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.inventoryBatchState.processing = false;\r\n state.inventoryBatchState.hasErrors = action.payload.hasErrors;\r\n state.inventoryBatchState.completed = true;\r\n },\r\n updateInventoryBatch_Error(state, action: PayloadAction) {\r\n state.inventoryBatchState.processing = false;\r\n state.inventoryBatchState.completed = true;\r\n state.inventoryBatchState.hasErrors = true;\r\n },\r\n resetInventoryBatchState(state, action: PayloadAction) {\r\n state.inventoryBatchState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n dataLength: undefined,\r\n };\r\n state.processing = false;\r\n state.inventoryBatchValueHandler = undefined;\r\n state.batchIsEdit = undefined;\r\n },\r\n setInventoryBatchEditable(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.inventoryBatchEditable = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: offlineServiceStateActions } = slice;\r\n\r\nexport const useOfflineServiceStateSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: offlineServiceStateSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useOfflineServiceStateSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import * as React from 'react';\r\nimport { CircularProgress } from '@material-ui/core';\r\n\r\nexport interface ProgressProps {\r\n inProgress: boolean;\r\n size: number;\r\n}\r\nexport function Progress({ inProgress, size }: ProgressProps) {\r\n return (\r\n \r\n {inProgress ? (\r\n \r\n ) : null}\r\n \r\n );\r\n}\r\n","import { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { LoginTypes, Roles } from 'app/slice/types';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { intersection } from 'lodash';\r\nimport { enumToArray, enumToDescriptedArray } from 'utils/enumKeys';\r\nimport { Entity } from './common';\r\n\r\nexport interface IAuthenticatedUser extends Entity {\r\n Language?: string;\r\n CultureName?: string;\r\n Roles: number[];\r\n LoginType: LoginTypes;\r\n UserGroups: Entity[];\r\n ActiveUserGroup?: Entity;\r\n DisplayName?: string;\r\n AdminEquipments?: AuthServiceDto[];\r\n AdminServiceGroups?: AuthServiceGroupDto[];\r\n InstrumentEventsGroups?: AuthServiceGroupDto[];\r\n CreatableGroups?: Entity[];\r\n HasRegisterableServiceGroups?: boolean;\r\n FormatedName?: string;\r\n HasNotifications?: boolean;\r\n HasOptOutCoreSelection: boolean;\r\n CalendarType: number;\r\n RequireUserGroupCoordApproval: boolean;\r\n HasSignedTermsOfUse: boolean;\r\n IsActiveDirectory: boolean;\r\n}\r\nexport interface AuthServiceDto extends Entity {\r\n Id: number;\r\n Name: string;\r\n ServiceTypeId: number;\r\n ServiceGroupId: number;\r\n IsLabTech: boolean;\r\n}\r\nexport interface AuthServiceGroupDto extends Entity {\r\n Id: number;\r\n Name: string;\r\n IsLabTech: boolean;\r\n}\r\nexport interface IIsAdminOfParams {\r\n ServiceTypeId: ServiceType;\r\n ServiceId: number;\r\n ServiceGroupId: number;\r\n}\r\nexport interface IIsAdminOrOwnerOfParams extends IIsAdminOfParams {\r\n UserId: string | null;\r\n}\r\n\r\nexport class AuthenticatedUser implements IAuthenticatedUser {\r\n // Entity members\r\n Id: string;\r\n Name: string;\r\n // IAuthenticatedUser members\r\n Language?: string;\r\n CultureName?: string;\r\n Roles: number[];\r\n LoginType: LoginTypes;\r\n UserGroups: Entity[];\r\n ActiveUserGroup?: Entity;\r\n DisplayName?: string;\r\n AdminEquipments: AuthServiceDto[];\r\n AdminServiceGroups: AuthServiceGroupDto[];\r\n InstrumentEventsGroups: AuthServiceGroupDto[];\r\n CreatableGroups: Entity[];\r\n HasRegisterableServiceGroups?: boolean;\r\n FormatedName?: string;\r\n HasNotifications?: boolean;\r\n HasOptOutCoreSelection: boolean;\r\n CalendarType: number;\r\n RequireUserGroupCoordApproval: boolean;\r\n HasSignedTermsOfUse: boolean;\r\n IsActiveDirectory: boolean;\r\n\r\n //constructor\r\n constructor(data: IAuthenticatedUser) {\r\n this.Id = data.Id;\r\n this.Name = data.Name;\r\n this.Language = data.Language;\r\n this.CultureName = data.CultureName;\r\n this.Roles = data.Roles;\r\n this.LoginType = data.LoginType;\r\n this.UserGroups = data.UserGroups;\r\n this.ActiveUserGroup = data.ActiveUserGroup;\r\n this.DisplayName = data.DisplayName;\r\n this.AdminEquipments = data.AdminEquipments ?? [];\r\n this.AdminServiceGroups = data.AdminServiceGroups ?? [];\r\n this.InstrumentEventsGroups = data.InstrumentEventsGroups ?? [];\r\n this.CreatableGroups = data.CreatableGroups ?? [];\r\n this.HasRegisterableServiceGroups = data.HasRegisterableServiceGroups;\r\n this.FormatedName = data.FormatedName;\r\n this.HasNotifications = data.HasNotifications;\r\n this.HasOptOutCoreSelection = data.HasOptOutCoreSelection;\r\n this.CalendarType = data.CalendarType;\r\n this.RequireUserGroupCoordApproval = data.RequireUserGroupCoordApproval;\r\n this.HasSignedTermsOfUse = data.HasSignedTermsOfUse;\r\n this.IsActiveDirectory = data.IsActiveDirectory;\r\n }\r\n /**\r\n * Generic permissions check on a partial DTO:\r\n * either it is a user created object\r\n * @param row Dto partial object\r\n * @returns true if current user has permissions\r\n */\r\n public IsAdminOf(row: IIsAdminOfParams) {\r\n return (\r\n this.HasAdminGroupPermissions(row?.ServiceGroupId) ||\r\n this.HasLabTechGroupPermissions(row?.ServiceGroupId) ||\r\n this.HasAdminServicePermissions(row.ServiceTypeId, row.ServiceId) ||\r\n this.HasLabTechServicePermissions(row.ServiceTypeId, row.ServiceId)\r\n );\r\n }\r\n /**\r\n * Determines if current user is an Admin or Owner of an object\r\n * @param row some partial DTO\r\n * @returns\r\n */\r\n public IsAdminOrOwnerOf(row: IIsAdminOrOwnerOfParams) {\r\n const result = this.IsAdminOf(row) || row.UserId === this.Id;\r\n return result;\r\n }\r\n\r\n public HasAdminGroupPermissions(serviceGroupId?: number): boolean {\r\n if (serviceGroupId === undefined) {\r\n return this.Roles.includes(Roles.Administrators);\r\n }\r\n if (this.Roles.includes(Roles.Administrators)) {\r\n return true;\r\n }\r\n if (this.Roles.includes(Roles.GroupAdministrators)) {\r\n return this.AdminServiceGroups.some(\r\n f => f.Id === serviceGroupId && f.IsLabTech === false,\r\n );\r\n }\r\n return false;\r\n }\r\n public HasAdminServicePermissions(\r\n serviceTypeId: number,\r\n serviceId?: number,\r\n ): boolean {\r\n if (serviceId === undefined) {\r\n return this.Roles.includes(Roles.Administrators);\r\n }\r\n if (this.Roles.includes(Roles.Administrators)) {\r\n return true;\r\n }\r\n if (\r\n this.Roles.includes(Roles.GroupAdministrators) ||\r\n this.Roles.includes(Roles.EquipmentAdministrator)\r\n ) {\r\n return this.AdminEquipments.some(\r\n item =>\r\n item.Id === serviceId &&\r\n item.ServiceTypeId === serviceTypeId &&\r\n item.IsLabTech === false,\r\n );\r\n }\r\n return false;\r\n }\r\n public HasCreateAdminGroupPermissions(serviceGroupId?: number): boolean {\r\n if (serviceGroupId === undefined) {\r\n return this.Roles.includes(Roles.Administrators);\r\n }\r\n if (this.Roles.includes(Roles.Administrators)) {\r\n return true;\r\n }\r\n if (this.Roles.includes(Roles.CreateNewAssetsAdmin)) {\r\n return this.CreatableGroups.map(item => item.Id).includes(serviceGroupId);\r\n }\r\n return false;\r\n }\r\n public HasAdminGroupOnlyPermissions(serviceGroupId?: number): boolean {\r\n if (serviceGroupId === undefined) {\r\n return false;\r\n }\r\n if (this.Roles.includes(Roles.GroupAdministrators)) {\r\n return this.AdminServiceGroups.some(\r\n f => f.Id === serviceGroupId && f.IsLabTech === false,\r\n );\r\n }\r\n return false;\r\n }\r\n public HasAdminServiceOnlyPermissions(\r\n serviceTypeId: number,\r\n serviceId?: number,\r\n ): boolean {\r\n if (serviceId === undefined) {\r\n return false;\r\n }\r\n if (\r\n this.Roles.includes(Roles.GroupAdministrators) ||\r\n this.Roles.includes(Roles.EquipmentAdministrator)\r\n ) {\r\n return this.AdminEquipments.some(\r\n item =>\r\n item.Id === serviceId &&\r\n item.ServiceTypeId === serviceTypeId &&\r\n item.IsLabTech === false,\r\n );\r\n } else {\r\n return false;\r\n }\r\n }\r\n public HasLabTechGroupPermissions(serviceGroupId?: number): boolean {\r\n if (serviceGroupId === undefined) {\r\n return false;\r\n }\r\n if (!this.Roles.includes(Roles.LabTech)) {\r\n return false;\r\n } else {\r\n return this.AdminServiceGroups.some(\r\n f => f.Id === serviceGroupId && f.IsLabTech === true,\r\n );\r\n }\r\n }\r\n public HasLabTechServicePermissions(\r\n serviceTypeId: number,\r\n serviceId?: number,\r\n ): boolean {\r\n if (serviceId === undefined) {\r\n return false;\r\n }\r\n if (!this.Roles.includes(Roles.LabTech)) {\r\n return false;\r\n } else {\r\n return this.AdminEquipments.some(\r\n item =>\r\n item.Id === serviceId &&\r\n item.ServiceTypeId === serviceTypeId &&\r\n item.IsLabTech === true,\r\n );\r\n }\r\n }\r\n public HasInstrumentEventsGroupPermissions(serviceGroupId?: number): boolean {\r\n if (serviceGroupId === undefined) {\r\n return false;\r\n }\r\n if (!this.Roles.includes(Roles.InventoryAdmin)) {\r\n return false;\r\n } else {\r\n return this.InstrumentEventsGroups.some(f => f.Id === serviceGroupId);\r\n }\r\n }\r\n public IsAllAdminGroupPermissions(serviceGroups?: number[]): boolean {\r\n if (serviceGroups === undefined || serviceGroups.length < 1) {\r\n return this.Roles.includes(Roles.Administrators);\r\n }\r\n if (this.Roles.includes(Roles.Administrators)) {\r\n return true;\r\n }\r\n if (this.Roles.includes(Roles.GroupAdministrators)) {\r\n return serviceGroups.every(f =>\r\n this.AdminServiceGroups.some(g => g.Id === f && g.IsLabTech === false),\r\n );\r\n }\r\n return false;\r\n }\r\n public IsAllServicesAdmin(services?: IServiceTypeFilterDto[]): boolean {\r\n if (services === undefined || services.length < 1) {\r\n return this.Roles.includes(Roles.Administrators);\r\n }\r\n if (this.Roles.includes(Roles.Administrators)) {\r\n return true;\r\n }\r\n if (\r\n this.Roles.includes(Roles.GroupAdministrators) ||\r\n this.Roles.includes(Roles.EquipmentAdministrator)\r\n ) {\r\n return services.every(f =>\r\n this.AdminEquipments.some(\r\n s =>\r\n s.Id === f.Id &&\r\n s.ServiceTypeId === f.ServiceTypeId &&\r\n s.IsLabTech === false,\r\n ),\r\n );\r\n }\r\n return false;\r\n }\r\n public HasSomeAdminGroupPermissions(serviceGroups?: number[]): boolean {\r\n if (serviceGroups === undefined || serviceGroups.length < 1) {\r\n return this.Roles.includes(Roles.Administrators);\r\n }\r\n if (this.Roles.includes(Roles.Administrators)) {\r\n return true;\r\n }\r\n if (this.Roles.includes(Roles.GroupAdministrators)) {\r\n return serviceGroups.some(f =>\r\n this.AdminServiceGroups.some(g => g.Id === f && g.IsLabTech === false),\r\n );\r\n }\r\n return false;\r\n }\r\n public HasSomeAdminServicesPermissions(\r\n services?: IServiceTypeFilterDto[],\r\n ): boolean {\r\n if (services === undefined || services.length < 1) {\r\n return this.Roles.includes(Roles.Administrators);\r\n }\r\n if (this.Roles.includes(Roles.Administrators)) {\r\n return true;\r\n }\r\n if (\r\n this.Roles.includes(Roles.GroupAdministrators) ||\r\n this.Roles.includes(Roles.EquipmentAdministrator)\r\n ) {\r\n return services.some(f =>\r\n this.AdminEquipments.some(\r\n s =>\r\n s.Id === f.Id &&\r\n s.ServiceTypeId === f.ServiceTypeId &&\r\n s.IsLabTech === false,\r\n ),\r\n );\r\n }\r\n return false;\r\n }\r\n public HasSomeLabTechGroupPermissions(serviceGroups?: number[]): boolean {\r\n if (serviceGroups === undefined || serviceGroups.length < 1) {\r\n return false;\r\n }\r\n if (this.Roles.includes(Roles.LabTech)) {\r\n return serviceGroups.some(f =>\r\n this.AdminServiceGroups.some(g => g.Id === f && g.IsLabTech === true),\r\n );\r\n }\r\n return false;\r\n }\r\n public HasSomeLabTechServicesPermissions(\r\n services?: IServiceTypeFilterDto[],\r\n ): boolean {\r\n if (services === undefined || services.length < 1) {\r\n return false;\r\n }\r\n if (this.Roles.includes(Roles.LabTech)) {\r\n return services.some(f =>\r\n this.AdminEquipments.some(\r\n s =>\r\n s.Id === f.Id &&\r\n s.ServiceTypeId === f.ServiceTypeId &&\r\n s.IsLabTech === true,\r\n ),\r\n );\r\n }\r\n return false;\r\n }\r\n public IsAllLabTechGroupPermissions(serviceGroups?: number[]): boolean {\r\n if (serviceGroups === undefined || serviceGroups.length < 1) {\r\n return false;\r\n }\r\n if (this.Roles.includes(Roles.LabTech)) {\r\n return serviceGroups.every(f =>\r\n this.AdminServiceGroups.some(g => g.Id === f && g.IsLabTech === true),\r\n );\r\n }\r\n return false;\r\n }\r\n public IsAllServicesLabTech(services?: IServiceTypeFilterDto[]): boolean {\r\n if (services === undefined || services.length < 1) {\r\n return false;\r\n }\r\n if (this.Roles.includes(Roles.LabTech)) {\r\n return services.every(f =>\r\n this.AdminEquipments.some(\r\n s =>\r\n s.Id === f.Id &&\r\n s.ServiceTypeId === f.ServiceTypeId &&\r\n s.IsLabTech === true,\r\n ),\r\n );\r\n }\r\n return false;\r\n }\r\n public IsAllGroupOrLabTechAdmin(\r\n serviceGroups?: number[],\r\n services?: IServiceTypeFilterDto[],\r\n ): boolean {\r\n return (\r\n this.IsAllAdminGroupPermissions(serviceGroups) ||\r\n this.IsAllServicesAdmin(services) ||\r\n this.IsAllLabTechGroupPermissions(serviceGroups) ||\r\n this.IsAllServicesLabTech(services)\r\n );\r\n }\r\n public IsAllInstrumentEventsGroupPermissions(\r\n serviceGroups?: number[],\r\n ): boolean {\r\n if (serviceGroups === undefined || serviceGroups.length < 1) {\r\n return false;\r\n }\r\n\r\n if (this.Roles.includes(Roles.InventoryAdmin)) {\r\n return serviceGroups.every(f =>\r\n this.InstrumentEventsGroups.some(g => g.Id === f),\r\n );\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nexport function isInRole(\r\n user: IAuthenticatedUser | undefined,\r\n role: string | Roles,\r\n): boolean {\r\n if (user && user.Roles.length > 0) {\r\n let baseRoles = enumToArray(Roles);\r\n let odjRoles = enumToDescriptedArray(Roles);\r\n if (intersection(user.Roles, baseRoles).length > 0) {\r\n if (typeof role === 'string') {\r\n return (\r\n odjRoles.filter(\r\n item =>\r\n item.description.toLowerCase() === (role as string).toLowerCase(),\r\n ).length > 0\r\n );\r\n } else {\r\n return user.Roles.includes(role as Roles);\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n// export function isServiseGroupAdmin(\r\n// user: IAuthenticatedUser | undefined,\r\n// ServiceGroups: Identifiable[] | undefined,\r\n// ): boolean {\r\n// if (\r\n// user &&\r\n// ServiceGroups &&\r\n// ServiceGroups.length > 0 &&\r\n// user.Roles.indexOf(Roles.GroupAdministrators) >= 0\r\n// ) {\r\n// const sg = user.AdminServiceGroups;\r\n// if (sg) {\r\n// for (var i = 0; i < sg.length; i++) {\r\n// const Id = sg[i].Id;\r\n// if (ServiceGroups.some(item => item.Id === Id)) {\r\n// return true;\r\n// }\r\n// }\r\n// return false;\r\n// } else {\r\n// return false;\r\n// }\r\n// } else {\r\n// return false;\r\n// }\r\n// }\r\n// export function isAllServiseGroupAdmin(\r\n// user: IAuthenticatedUser | undefined,\r\n// ServiceGroups: Entity[] | undefined,\r\n// ): boolean {\r\n// if (\r\n// user &&\r\n// ServiceGroups &&\r\n// ServiceGroups.length > 0 &&\r\n// user.Roles.indexOf(Roles.GroupAdministrators) >= 0\r\n// ) {\r\n// const sg = user.AdminServiceGroups;\r\n// if (sg) {\r\n// if (ServiceGroups.every(item => sg.some(g => g.Id === item.Id))) {\r\n// return true;\r\n// }\r\n// return false;\r\n// } else {\r\n// return false;\r\n// }\r\n// } else {\r\n// return false;\r\n// }\r\n// }\r\n// export function isServiceGroupOrLabTechAdmin(\r\n// user: IAuthenticatedUser | undefined,\r\n// Services: number[] | undefined,\r\n// ServiceGroups: number[] | undefined,\r\n// ): boolean {\r\n// let result = false;\r\n// if (user !== undefined) {\r\n// if (\r\n// ServiceGroups !== undefined &&\r\n// user.Roles.includes(Roles.GroupAdministrators)\r\n// ) {\r\n// const sg = user.AdminServiceGroups;\r\n// if (\r\n// sg !== undefined &&\r\n// ServiceGroups.every(item => sg.some(g => g.Id === item))\r\n// ) {\r\n// result = true;\r\n// }\r\n// } else if (user.Roles.includes(Roles.LabTech)) {\r\n// const sg = user.AdminServiceGroups;\r\n// const eqs = user.AdminEquipments;\r\n// let isLabAdmin = false;\r\n// let isEqAdmin = false;\r\n// if (ServiceGroups !== undefined) {\r\n// if (\r\n// sg !== undefined &&\r\n// ServiceGroups.every(item => sg.some(g => g.Id === item))\r\n// ) {\r\n// isLabAdmin = true;\r\n// }\r\n// }\r\n// if (Services !== undefined) {\r\n// if (\r\n// eqs !== undefined &&\r\n// Services.every(item => eqs.some(eq => eq === item))\r\n// ) {\r\n// isEqAdmin = true;\r\n// }\r\n// }\r\n// result = isLabAdmin || isEqAdmin;\r\n// } else if (user.Roles.includes(Roles.EquipmentAdministrator)) {\r\n// if (Services !== undefined) {\r\n// const eqs = user.AdminEquipments;\r\n// if (\r\n// eqs !== undefined &&\r\n// Services.every(item => eqs.some(eq => eq === item))\r\n// ) {\r\n// result = true;\r\n// }\r\n// }\r\n// }\r\n// }\r\n// return result;\r\n// }\r\n// export function isOnlineServicesAdmin(\r\n// user: IAuthenticatedUser | undefined,\r\n// Services: Entity[] | undefined,\r\n// ): boolean {\r\n// if (\r\n// user &&\r\n// Services &&\r\n// Services.length > 0 &&\r\n// (user.Roles.indexOf(Roles.Administrators) >= 0 ||\r\n// user.Roles.indexOf(Roles.GroupAdministrators) >= 0 ||\r\n// user.Roles.indexOf(Roles.LabTech) >= 0 ||\r\n// user.Roles.indexOf(Roles.EquipmentAdministrator) >= 0)\r\n// ) {\r\n// const eqs: IServiceTypeFilterDto[] | undefined = user.AllAdminEquipments;\r\n// if (!!eqs && eqs.length > 0) {\r\n// let result = eqs\r\n// .filter(f => f.ServiceTypeId === 1)\r\n// .filter(f => Services.some(item => item.Id === f.Id));\r\n// return result.length > 0;\r\n// } else {\r\n// return false;\r\n// }\r\n// } else {\r\n// return false;\r\n// }\r\n// }\r\n// export function isServiceAdmin(\r\n// user: IAuthenticatedUser | undefined,\r\n// Service: number | undefined,\r\n// ServiceTypeId: ServiceType,\r\n// ): boolean {\r\n// if (\r\n// user &&\r\n// Service &&\r\n// (user.Roles.indexOf(Roles.Administrators) >= 0 ||\r\n// user.Roles.indexOf(Roles.GroupAdministrators) >= 0 ||\r\n// user.Roles.indexOf(Roles.LabTech) >= 0 ||\r\n// user.Roles.indexOf(Roles.EquipmentAdministrator) >= 0)\r\n// ) {\r\n// if (\r\n// user.AllAdminEquipments?.some(\r\n// item => item.Id === Service && item.ServiceTypeId === ServiceTypeId,\r\n// )\r\n// ) {\r\n// return true;\r\n// }\r\n// return false;\r\n// } else {\r\n// return false;\r\n// }\r\n// }\r\n// export function isAllServiceAdmin(\r\n// user: IAuthenticatedUser | undefined,\r\n// Services: IServiceTypeFilterDto[],\r\n// ): boolean {\r\n// if (\r\n// user &&\r\n// Services.length > 0 &&\r\n// (user.Roles.indexOf(Roles.Administrators) >= 0 ||\r\n// user.Roles.indexOf(Roles.GroupAdministrators) >= 0 ||\r\n// user.Roles.indexOf(Roles.LabTech) >= 0 ||\r\n// user.Roles.indexOf(Roles.EquipmentAdministrator) >= 0)\r\n// ) {\r\n// if (\r\n// user.AllAdminEquipments?.some(item =>\r\n// Services.some(\r\n// f => f.Id === item.Id && f.ServiceTypeId === item.ServiceTypeId,\r\n// ),\r\n// )\r\n// ) {\r\n// return true;\r\n// }\r\n// return false;\r\n// } else {\r\n// return false;\r\n// }\r\n// }\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IRow } from 'app/components/BasicTable/IRow';\r\nimport { BasicTableRefreshEventHandler } from 'app/components/BasicTable/ControlledTable/ControlledTableProps';\r\nimport { Identifiable } from 'types/common';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { RunTypesUnion } from '../../components/RunTypePicker';\r\nimport { RUN_TYPES } from '../../components/RunTypePicker';\r\nimport { ISampleCreateBase } from '../../SamplePlatesPage/slice/types';\r\nimport { samplesListSaga } from './saga';\r\nimport {\r\n IRunDetails,\r\n ISample,\r\n ISampleListTableState,\r\n ISampleRun,\r\n ISampleRunUpdate,\r\n ISampleRunUpdateResponse,\r\n ISamplesListState,\r\n ISampleTarget,\r\n} from './types';\r\n\r\nexport const initialState: ISamplesListState = {\r\n SamplesList: {\r\n processing: false,\r\n },\r\n SamplesListTableState: {\r\n pageSize: 10,\r\n pageIndex: 0,\r\n sortBy: [{ id: 'Id', desc: true }],\r\n customFilters: [],\r\n globalFilter: '',\r\n },\r\n EditMode: false,\r\n SamplesSelected: [],\r\n ShowRunDialog: false,\r\n ImportStarted: false,\r\n ImportFinished: false,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'samplesList',\r\n initialState,\r\n reducers: {\r\n loadSamplesList(state, action: PayloadAction) {\r\n state.SamplesList.processing = true;\r\n state.SamplesListTableState = {\r\n pageSize: action.payload.pageSize,\r\n pageIndex: action.payload.pageIndex,\r\n sortBy: action.payload.sortBy,\r\n globalFilter: action.payload.globalFilter,\r\n searchColumns: action.payload.searchColumns,\r\n customFilters: action.payload.customFilters?.map(filter => ({\r\n fieldName: filter.fieldName,\r\n operator: filter.operator,\r\n value: filter.value,\r\n })),\r\n serviceGroups:\r\n action.payload.serviceGroups?.length !== 0\r\n ? action.payload.serviceGroups\r\n : undefined,\r\n };\r\n },\r\n export(state, action: PayloadAction) {},\r\n loadSamplesList_Success(state, action: PayloadAction) {\r\n state.SamplesList.processing = false;\r\n state.SamplesList.error = undefined;\r\n state.SamplesList.data = action.payload.value as ISample[];\r\n state.SamplesList.dataLength = action.payload['@odata.count'];\r\n },\r\n loadSamplesList_Error(state, action: PayloadAction) {\r\n state.SamplesList.processing = false;\r\n state.SamplesList.error = action.payload;\r\n },\r\n setSelectedSamples(state, action: PayloadAction) {\r\n state.SamplesSelected = action.payload;\r\n },\r\n loadAllFilteredSamples(state, action: PayloadAction) {},\r\n loadAllFilteredSamples_Success(state, action: PayloadAction) {},\r\n\r\n deleteSamples(\r\n state,\r\n action: PayloadAction<{\r\n selectedRows: ISample[];\r\n refresh: BasicTableRefreshEventHandler | undefined;\r\n }>,\r\n ) {},\r\n\r\n updateField(state, action: PayloadAction>) {\r\n // update row in samples list\r\n const item = state.SamplesList?.data?.find(\r\n s => s.Id === action.payload.Id,\r\n );\r\n if (item !== undefined) {\r\n Object.assign(item, action.payload);\r\n }\r\n },\r\n updateField_Success(state, action: PayloadAction) {},\r\n updateField_Error(state, action: PayloadAction) {},\r\n\r\n loadRunDetqails(\r\n state,\r\n action: PayloadAction<{\r\n id: number;\r\n columns: Array | undefined;\r\n }>,\r\n ) {},\r\n loadRunDetqails_Success(state, action: PayloadAction) {\r\n state.RunDetails = action.payload;\r\n },\r\n\r\n runSelectedSamples(\r\n state,\r\n action: PayloadAction<{\r\n runType?: RunTypesUnion;\r\n samples: ISample[] | undefined;\r\n }>,\r\n ) {\r\n state.SelectedRunType = action.payload.runType;\r\n },\r\n runSelectedSamples_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n updateRunSampleValue(state, action: PayloadAction>) {\r\n const item = state.RunDetails?.Samples?.find(\r\n s => s.Id === action.payload.Id,\r\n );\r\n if (item !== undefined) {\r\n // set updated properties on original row\r\n Object.assign(item, action.payload);\r\n\r\n // in case of the Labeling run all of the Target* properties should be the same\r\n // for all of the samples with the same ServiceRequest and same TMT_Set\r\n // as these are combined into a singel sample upon run completionc\r\n const rt = Object.keys(RUN_TYPES).find(k => k === 'Labeling');\r\n if (state.RunDetails?.RunType === rt) {\r\n const props: (keyof ISampleTarget)[] = [\r\n 'TargetConcentration',\r\n 'TargetPlateId',\r\n 'TargetPosition',\r\n 'TargetVolume',\r\n 'TargetTubeLabel',\r\n 'TargetSampleType',\r\n ];\r\n props.forEach(prop => {\r\n if (action.payload[prop] !== undefined) {\r\n const payloadWithoutId = {};\r\n payloadWithoutId[prop] = item[prop];\r\n state.RunDetails?.Samples?.filter(\r\n s =>\r\n s.TMT_Set === item.TMT_Set &&\r\n s.ServiceRequestId === item.ServiceRequestId,\r\n ).forEach(s => Object.assign(s, payloadWithoutId));\r\n }\r\n });\r\n }\r\n }\r\n },\r\n\r\n setShowRunDialog(state, action: PayloadAction) {\r\n state.ShowRunDialog = action.payload;\r\n },\r\n setRunType(state, action: PayloadAction) {\r\n state.SelectedRunType = action.payload;\r\n if (action.payload === undefined) {\r\n return;\r\n }\r\n const runType = RUN_TYPES[action.payload];\r\n switch (runType) {\r\n case RUN_TYPES.StandardRun:\r\n break;\r\n case RUN_TYPES.MassSpec:\r\n break;\r\n case RUN_TYPES.Labeling:\r\n break;\r\n }\r\n },\r\n setShowImportDialog(state, action: PayloadAction) {\r\n state.ImportStarted = action.payload;\r\n state.ImportFinished = false;\r\n },\r\n readImportFile(\r\n state,\r\n action: PayloadAction<{ file: File; plate: ISampleCreateBase | null }>,\r\n ) {},\r\n readImportFile_Success(\r\n state,\r\n action: PayloadAction & ISampleTarget>>,\r\n ) {\r\n action.payload.forEach(record => {\r\n const sample = state.RunDetails?.Samples?.find(\r\n sample => sample.Id === record.Id,\r\n );\r\n if (sample !== undefined) {\r\n sample.TargetPosition = record.TargetPosition;\r\n sample.TargetPlateId = record.TargetPlateId;\r\n\r\n sample.TargetTubeLabel = record.TargetTubeLabel;\r\n sample.TargetSampleType = record.TargetSampleType;\r\n\r\n sample.TargetConcentration = record.TargetConcentration;\r\n sample.TargetVolume = record.TargetVolume;\r\n }\r\n });\r\n state.ImportStarted = false;\r\n state.ImportFinished = true;\r\n },\r\n\r\n completeRun(state, aciton: PayloadAction>) {},\r\n completeRun_Success(state, aciton: PayloadAction) {},\r\n completeRun_Error(state, aciton: PayloadAction) {},\r\n updateRun(state, aciton: PayloadAction) {},\r\n updateRun_Success(\r\n state,\r\n aciton: PayloadAction,\r\n ) {\r\n if (state.RunDetails !== undefined && aciton.payload !== undefined) {\r\n state.RunDetails.Gradient = aciton.payload.Gradient;\r\n state.RunDetails.Instrument = aciton.payload.Instrument;\r\n state.RunDetails.SecondaryInstrument =\r\n aciton.payload.SecondaryInstrument;\r\n state.RunDetails.ACQUISITION_TYPE = aciton.payload.ACQUISITION_TYPE;\r\n }\r\n },\r\n updateRun_Error(state, aciton: PayloadAction) {},\r\n\r\n exportRun(state, action: PayloadAction) {},\r\n toggleEditMode(state, action: PayloadAction) {\r\n state.EditMode = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: samplesListActions } = slice;\r\n\r\nexport const useSamplesListSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: samplesListSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useSamplesListSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { Menu, MenuProps } from '@material-ui/core';\r\nimport { ReactNode, useState } from 'react';\r\nimport { Button, ButtonProps } from '../BasicButtons/Button';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport * as React from 'react';\r\n\r\nexport interface DropDownProps extends ButtonProps {\r\n menuChildren: (onClose: () => void) => ReactNode | ReactNode[];\r\n addChevron?: boolean;\r\n menuProps?: Omit;\r\n id?: string;\r\n onOpen?: () => void;\r\n onHandleClose?: () => void;\r\n iconButton?: boolean;\r\n disablePortal?: boolean;\r\n}\r\n\r\nexport const DropDown = ({\r\n onClick,\r\n onMouseDown,\r\n children,\r\n menuChildren,\r\n menuProps,\r\n addChevron,\r\n id,\r\n title,\r\n onOpen,\r\n onHandleClose,\r\n iconButton,\r\n disablePortal,\r\n endIcon,\r\n ...other\r\n}: DropDownProps) => {\r\n const [open, setOpen] = useState(false);\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const { marginThreshold, anchorOrigin, onClose, ...rest } = menuProps ?? {};\r\n const handleOpen = e => {\r\n setAnchorEl(e.currentTarget);\r\n setOpen(!open);\r\n if (!!onOpen) {\r\n onOpen();\r\n }\r\n };\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n setOpen(false);\r\n if (onHandleClose) {\r\n onHandleClose();\r\n }\r\n };\r\n return (\r\n <>\r\n \r\n {iconButton ? (\r\n {\r\n handleOpen(e);\r\n onClick?.(e);\r\n }}\r\n onMouseDown={e => {\r\n handleOpen(e);\r\n onMouseDown?.(e);\r\n }}\r\n aria-haspopup=\"true\"\r\n // endIcon={\r\n // addChevron ? (\r\n // \r\n // ) : undefined\r\n // }\r\n {...other}\r\n >\r\n {children}\r\n \r\n ) : (\r\n {\r\n handleOpen(e);\r\n onClick?.(e);\r\n }}\r\n onMouseDown={e => {\r\n handleOpen(e);\r\n onMouseDown?.(e);\r\n }}\r\n aria-haspopup=\"true\"\r\n endIcon={\r\n \r\n {addChevron && !!endIcon ? (\r\n \r\n \r\n {endIcon}\r\n \r\n ) : (\r\n \r\n {addChevron && (\r\n \r\n )}\r\n {!!endIcon && endIcon}\r\n \r\n )}\r\n \r\n }\r\n {...other}\r\n >\r\n {children}\r\n \r\n )}\r\n \r\n\r\n {\r\n handleClose();\r\n onClose && onClose(e, r);\r\n }}\r\n anchorOrigin={\r\n anchorOrigin ?? {\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n }\r\n }\r\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\r\n {...rest}\r\n >\r\n {open && menuChildren(handleClose)}\r\n \r\n \r\n );\r\n};\r\n","import { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { CellProps, Renderer } from 'react-table';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport const DateRenderer: Renderer>> = ({\r\n value,\r\n}) => {\r\n const { t } = useTranslation();\r\n return value === null || value === undefined ? (\r\n <>{t(translations.NA)}\r\n ) : (\r\n <>{dateUtils.shortDateFormat(value)}\r\n );\r\n};\r\nexport default DateRenderer;\r\n","export enum ArticleStatus {\r\n AwaitingApproval,\r\n Approved,\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.connectedFilters || initialState;\r\n\r\nexport const selectConnectedFilters = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n\r\nexport const selectConnectedFiltersProcessing = createSelector(\r\n [selectConnectedFilters],\r\n state => state.processing,\r\n);\r\n\r\nexport const selectConnectedFiltersError = createSelector(\r\n [selectConnectedFilters],\r\n state => state.error,\r\n);\r\n\r\nexport const selectConnectedFiltersData = createSelector(\r\n [selectConnectedFilters],\r\n state => state.data,\r\n);\r\nexport const selectConnectedFieldHandler = createSelector(\r\n [selectConnectedFilters],\r\n state => state.connectedValueHandler,\r\n);\r\nexport const selectConnectedSettings = createSelector(\r\n [selectConnectedFilters],\r\n state => state.connectedSettings,\r\n);\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { InfoIcon } from '../BasicIcons/InfoIcon';\r\nimport BaseTextField from '../BasicInputs/BaseTextField';\r\nimport { BaseFieldProps } from '../BasicInputs/BaseTextField/BaseFieldDefinition';\r\n\r\nexport const FormNumberField = ({\r\n label,\r\n onChange,\r\n onBlur,\r\n value,\r\n name,\r\n helperText,\r\n noWarnOnNuN,\r\n ...props\r\n}: FieldHookConfig &\r\n BaseFieldProps &\r\n IFieldProps & { noWarnOnNuN?: boolean }) => {\r\n const [field, meta] = useField({ name, ...props });\r\n // const handleChange = e => {\r\n // var number = parseFloat(e.target.value);\r\n // if (isNaN(number)) {\r\n // if (noWarnOnNuN) {\r\n // onChange?.(e);\r\n // field.onChange(e);\r\n // } else {\r\n // console.warn(\r\n // `NaN value (\"${e.target.value}\") encountered in FormNumberField`,\r\n // );\r\n // }\r\n // } else {\r\n // onChange?.(e);\r\n // field.onChange(e);\r\n // }\r\n // };\r\n const handleChange = e => {\r\n if (onChange !== undefined) {\r\n onChange(e);\r\n }\r\n field.onChange(e);\r\n };\r\n return (\r\n \r\n {props.info ? : null}\r\n {props.InputProps?.endAdornment}\r\n \r\n ),\r\n }}\r\n variant=\"filled\"\r\n fullWidth\r\n autoFocus={props.autoFocus}\r\n inputProps={{\r\n ...props.inputProps,\r\n type: 'number',\r\n min: 0,\r\n 'aria-label': `${label ? undefined : 'number input'}`,\r\n }}\r\n value={field.value || ''}\r\n onChange={handleChange}\r\n onBlur={field?.onBlur}\r\n id={props.id || 'numberfieldId'}\r\n label={label}\r\n name={name}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error ?? helperText}\r\n {...props}\r\n />\r\n );\r\n};\r\n","/**\r\n * Defines what the comment is referencing.\r\n * Keep synchronized with enum in backend when changing.\r\n */\r\nexport enum CommentReferenceTypes {\r\n Alerts = 1,\r\n Invoice = 2,\r\n UserTraining = 3,\r\n Budget = 4,\r\n ServiceRequest = 5,\r\n ServiceRequestTicket = 6,\r\n ServiceRequestRow = 7,\r\n batches = 8,\r\n Article = 9,\r\n Assets = 10,\r\n}\r\n","import { FormControl, FormLabel, styled } from '@material-ui/core';\r\nimport { FieldHookConfig } from 'formik';\r\nimport * as React from 'react';\r\nimport { Body } from '../Typography';\r\nimport { InfoIcon } from '../BasicIcons/InfoIcon';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport interface FormLabelTextProps {\r\n text?: React.ReactNode;\r\n id?: string;\r\n}\r\nexport function FormLabelText({\r\n label,\r\n text,\r\n html,\r\n info,\r\n fullWidth = true,\r\n ...props\r\n}: FieldHookConfig & IFieldProps & FormLabelTextProps) {\r\n const StyledInfo = styled(InfoIcon)(({ theme }) => ({\r\n marginLeft: theme.spacing(1),\r\n }));\r\n return (\r\n \r\n {label && (\r\n \r\n <>\r\n {label} {info && }\r\n \r\n \r\n )}\r\n {text && (\r\n \r\n {text}\r\n \r\n )}\r\n {html}\r\n \r\n );\r\n}\r\n// const StyledFormLabel = styled(FormLabel)(({ theme }) => ({\r\n// color: theme.palette.common.graySubtitle,\r\n// fontFamily: `'Lato', sans-serif`,\r\n// fontStyle: 'normal',\r\n// fontWeight: 400,\r\n// fontSize: '12px',\r\n// lineHeight: '141%',\r\n// letterSpacing: '0.2px',\r\n// '.Mui-focused &': {\r\n// color: theme.palette.common.graySubtitle,\r\n// },\r\n// }));\r\n","export enum TrainingState {\r\n SignedUp = 1,\r\n UnderMinimum = 2,\r\n Available = 3,\r\n Maximum = 4,\r\n}\r\n\r\nexport type TrainingStateUnion = keyof typeof TrainingState;\r\n","import {\r\n OfflineServiceTypeUrl,\r\n loadOfflineServiceData,\r\n} from 'app/components/pickers/AutocompletePickers/OfflineServiceTypePicker';\r\nimport {\r\n InventoryBatchParams,\r\n InventoryBatchResponse,\r\n OfflineServiceQueryStringParameters,\r\n OfflineServicesResponse,\r\n RenewStockParams,\r\n ServiceChangeStateParameters,\r\n StockRenewalParams,\r\n} from 'app/pages/OtherServiceDetails/Details/slice/types';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { httpClient } from './HttpClient';\r\nimport { IInventoryBatchDto } from './odata/generated/entities/IInventoryBatchDto';\r\nimport { quoteODataValue } from './odata/ODataFilter';\r\n\r\nexport const OtherServicesApi = {\r\n initOfflineService: (payload: OfflineServiceQueryStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/OtherServices/InitService`;\r\n return httpClient.post(url, data);\r\n },\r\n insertOtherService: (otherService: IOtherServices) => {\r\n const url = '/api/odata/v4/OtherServices';\r\n return httpClient.post(url, otherService);\r\n },\r\n insertConsumableServices: (otherServices: IOtherServices[]) => {\r\n const url = '/api/odata/v4/OtherServices/CreateConsumables';\r\n const data = {\r\n params: otherServices,\r\n };\r\n return httpClient.post(url, data);\r\n },\r\n insertStockRenewalServices: (otherServices: IOtherServices[]) => {\r\n const url = '/api/odata/v4/OtherServices/CreateStockRenewals';\r\n const data = {\r\n params: otherServices,\r\n };\r\n return httpClient.post(url, data);\r\n },\r\n updateOtherService: (otherService: IOtherServices, rowId: number) => {\r\n const url = '/api/odata/v4/OtherServices';\r\n return httpClient.put(\r\n url + '(' + rowId + ')',\r\n otherService,\r\n );\r\n },\r\n deleteService: (Id: number) => {\r\n const url = `/api/odata/v4/OtherServices/${Id}`;\r\n return httpClient.deleteCustom(url);\r\n },\r\n isBudgetsTurnedOn: (offlineServiceTypeId: number) => {\r\n const url = '/api/odata/v4/OtherServices/IsBudgetsTurnedOn';\r\n const data = {\r\n offlineServiceTypeId,\r\n };\r\n return httpClient.post(url, data);\r\n },\r\n calculateCredit: (calculateCreditModel: IOtherServices) => {\r\n const url = '/api/odata/v4/OtherServices/CalculateCredit';\r\n const data = {\r\n params: calculateCreditModel,\r\n };\r\n return httpClient.post(url, data);\r\n },\r\n calculateTotalCredit: (calculateCreditModel: IOtherServices[]) => {\r\n const url = '/api/odata/v4/OtherServices/CalculateTotalCredit';\r\n const data = {\r\n params: calculateCreditModel,\r\n };\r\n return httpClient.post(url, data);\r\n },\r\n getServiceChangeState: (payload: ServiceChangeStateParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/OtherServices/GetServiceChangeState`;\r\n return httpClient.post(url, data);\r\n },\r\n getReservationOfflineServices: (reservationId: number, repeat?: boolean) => {\r\n const url =\r\n repeat === true\r\n ? `/api/odata/v4/OtherServices/ReservationOfflineServices(key=${reservationId})`\r\n : `/api/odata/v4/OtherServices/ReservationOfflineServicesWithParts(key=${reservationId})`;\r\n return httpClient.get(url);\r\n },\r\n initConsumableServices: (payload: OfflineServiceQueryStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/OtherServices/InitConsumableServices`;\r\n return httpClient.post(url, data);\r\n },\r\n initStockRenewalServices: (payload: StockRenewalParams) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/OtherServices/InitStockRenewalServices`;\r\n return httpClient.post(url, data);\r\n },\r\n initRenewStockService: (payload: RenewStockParams) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/OtherServices/InitRenewStock`;\r\n return httpClient.post(url, data);\r\n },\r\n initInventoryBatch: (payload: InventoryBatchParams) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/InventoryBatches/InitInventoryBatch`;\r\n return httpClient.post(url, data);\r\n },\r\n insertInventoryBatch: (batch: IInventoryBatchDto) => {\r\n const url = '/api/odata/v4/InventoryBatches';\r\n return httpClient.post(url, batch);\r\n },\r\n updateInventoryBatch: (batch: IInventoryBatchDto, rowId: number) => {\r\n const url = '/api/odata/v4/InventoryBatches';\r\n return httpClient.put(url + '(' + rowId + ')', batch);\r\n },\r\n deleteInventoryBatch: (batch: IInventoryBatchDto) => {\r\n const url = `/api/odata/v4/InventoryBatches/${batch.Id}`;\r\n return httpClient.deleteCustom(url);\r\n },\r\n getServiceType: (\r\n payload: number | null,\r\n urlType?: OfflineServiceTypeUrl,\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n if (payload === null || payload < 1) {\r\n resolve(null);\r\n } else {\r\n try {\r\n const data = await loadOfflineServiceData(\r\n [`Id eq ${quoteODataValue(payload)}`],\r\n 'public',\r\n [],\r\n undefined,\r\n 'InventoryBatches',\r\n )(null, undefined);\r\n resolve(data.value[0] || null);\r\n } catch (error) {\r\n resolve(null);\r\n }\r\n }\r\n });\r\n },\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.workOrder || initialState;\r\n\r\nexport const selectWorkOrder = createSelector([selectSlice], state => state);\r\n\r\nexport const selectWorkOrderProcessing = createSelector(\r\n [selectWorkOrder],\r\n state => state.processing,\r\n);\r\nexport const selectCreateWorkOrderProcessing = createSelector(\r\n [selectWorkOrder],\r\n state => state.createState.processing,\r\n);\r\nexport const selectUpdateWorkOrderProcessing = createSelector(\r\n [selectWorkOrder],\r\n state => state.updateState.processing,\r\n);\r\n\r\nexport const selectCreateWorkOrder = createSelector(\r\n [selectWorkOrder],\r\n state => state.createState.data,\r\n);\r\nexport const selectUpdateWorkOrder = createSelector(\r\n [selectWorkOrder],\r\n state => state.updateState.data,\r\n);\r\nexport const selectCreateWorkOrderCompleted = createSelector(\r\n [selectWorkOrder],\r\n state => state.createState.completed,\r\n);\r\nexport const selectUpdateWorkOrderCompleted = createSelector(\r\n [selectWorkOrder],\r\n state => state.updateState.completed,\r\n);\r\nexport const selectCreateWorkOrderHasError = createSelector(\r\n [selectWorkOrder],\r\n state => state.createState.hasErrors,\r\n);\r\nexport const selectUpdateWorkOrderHasError = createSelector(\r\n [selectWorkOrder],\r\n state => state.updateState.hasErrors,\r\n);\r\nexport const selectSendEmailOnResOffline = createSelector(\r\n [selectWorkOrder],\r\n state => state.sendEmailOnOffline,\r\n);\r\nexport const selectReservationOffline = createSelector(\r\n [selectWorkOrder],\r\n state => state.reservationOffline,\r\n);\r\nexport const selectFieldHandler = createSelector(\r\n [selectWorkOrder],\r\n state => state.valueHandler,\r\n);\r\nexport const selectReservationOfflineData = createSelector(\r\n [selectReservationOffline],\r\n state => state.data,\r\n);\r\nexport const selectReservationOfflineProcessing = createSelector(\r\n [selectReservationOffline],\r\n state => state.processing,\r\n);\r\nexport const selectReservationOfflineCompleted = createSelector(\r\n [selectReservationOffline],\r\n state => state.completed,\r\n);\r\nexport const selectReservationOfflineHasErrors = createSelector(\r\n [selectReservationOffline],\r\n state => state.hasErrors,\r\n);\r\nexport const selectReadonlyWorkOrder = createSelector(\r\n [selectWorkOrder],\r\n state => state.readonlyState,\r\n);\r\nexport const selectUpdateAllRecurrent = createSelector(\r\n [selectWorkOrder],\r\n state => state.updateAllRecurrent,\r\n);\r\nexport const selectOfflineEventStart = createSelector(\r\n [selectWorkOrder],\r\n state => state.OfflineEventStart,\r\n);\r\nexport const selectOfflineEventEnd = createSelector(\r\n [selectWorkOrder],\r\n state => state.OfflineEventEnd,\r\n);\r\nexport const selectSaveNewComments = createSelector(\r\n [selectWorkOrder],\r\n state => state.doSaveNewComments,\r\n);\r\nexport const selectCreatedOrders = createSelector(\r\n [selectWorkOrder],\r\n state => state.createdOrders,\r\n);\r\nexport const selectSavedLinkedOrders = createSelector(\r\n [selectWorkOrder],\r\n state => state.savedLinkedOrders,\r\n);\r\n\r\nexport const selectCalibrationsChanged = createSelector(\r\n [selectWorkOrder],\r\n state => state.calibrationsChanged,\r\n);\r\nexport const selectLinksProcessing = createSelector(\r\n [selectWorkOrder],\r\n state => state.linksProcessing,\r\n);\r\nexport const selectDowntimeOverlaps = createSelector(\r\n [selectWorkOrder],\r\n state => state.downtimeOverlaps,\r\n);\r\n","export interface ImportData {\r\n ScreenId: number;\r\n Columns: ImportColumn[];\r\n AddOnly: boolean;\r\n BudgetType?: number;\r\n Iad?: ImportAdditionalData;\r\n ImportAssetImageFiles: boolean;\r\n AutoGenerateAssetNamesBasedOn?: number;\r\n UpdateQRCode: boolean;\r\n}\r\nexport enum ImportAdditionalData {\r\n none,\r\n AssetRanges,\r\n OfflineServiceTypes,\r\n SampleTypes,\r\n}\r\nexport interface ImportColumn {\r\n Include: boolean;\r\n ExcelName: string | undefined;\r\n Name: string | undefined;\r\n}\r\n\r\nexport enum ImportResult {\r\n success,\r\n error,\r\n failed,\r\n default,\r\n}\r\n\r\nexport interface ImportResponseData {\r\n Result: number;\r\n Rows: number;\r\n InsertedRows: number;\r\n UpdatedRows: number;\r\n Errors: number;\r\n}\r\n\r\nexport interface TemplateColumns {\r\n Id: string;\r\n DisplayName: string;\r\n}\r\n","import { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport {\r\n initUnitTypeData,\r\n UnitType,\r\n UnitTypePicker,\r\n} from 'app/components/pickers/AutocompletePickers/UnitTypePicker';\r\nimport { IMyAssetsRow } from 'app/pages/MyAssetsPage/IMyAssetsRow';\r\nimport { translations } from 'locales/translations';\r\nimport { debounce } from 'lodash';\r\nimport { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { valOrNull } from 'utils/typeUtils';\r\nimport { FilterValueType } from '../../BasicFilter/FilterValueType';\r\nimport { IFilterSettings } from '../../BasicFilter/IFilterSettings';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport interface AssetRangeType {\r\n value: number | null;\r\n unitType: UnitType | null;\r\n}\r\n\r\nexport function isAssetRangeType(\r\n entity: FilterValueType | undefined,\r\n): entity is AssetRangeType {\r\n if (valOrNull(entity) === null) return false;\r\n return (\r\n valOrNull((entity as AssetRangeType).value) !== null &&\r\n valOrNull((entity as AssetRangeType).unitType) !== null\r\n );\r\n}\r\n\r\nexport const initAssetRangeData = async (item: FilterValueType) => {\r\n if (!isAssetRangeType(item) || valOrNull(item.unitType) === null) {\r\n return Promise.resolve(item);\r\n }\r\n const id = item.unitType?.Id;\r\n const val = item.value;\r\n try {\r\n const data = await initUnitTypeData(id?.toString());\r\n return {\r\n value: val,\r\n unitType: data.length > 0 ? data[0] : null,\r\n } as AssetRangeType;\r\n } catch (error) {\r\n return { value: val, unitType: null } as AssetRangeType;\r\n }\r\n};\r\n\r\nexport const assetRangeCustomFilter = (\r\n value: FilterValueType,\r\n settings: IFilterSettings,\r\n) => {\r\n if (!isAssetRangeType(value)) return '';\r\n const name = settings.fieldName;\r\n const val = value.value ?? 1;\r\n let predicates: string[] = [];\r\n let filterBySelectedUnit = `${name}/any(g: g/UnitTypeId eq ${\r\n value.unitType!.Id\r\n } and g/MinValue le ${val} and g/MaxValue ge ${val})`;\r\n predicates.push(filterBySelectedUnit);\r\n if (value.unitType!.SourceUnits.length > 0) {\r\n let sourceFilter = `${name}/any(g: ${value\r\n .unitType!.SourceUnits.map(unit => {\r\n const rate =\r\n val / (unit.ConversionRate === 0 ? 1 : unit.ConversionRate);\r\n return `(g/UnitTypeId eq ${unit.TargetId} and g/MinValue le ${rate} and g/MaxValue ge ${rate})`;\r\n })\r\n .join(' or ')})`;\r\n predicates.push(sourceFilter);\r\n }\r\n if (value.unitType!.TargetUnits.length > 0) {\r\n let targetFilter = `${name}/any(g: ${value\r\n .unitType!.TargetUnits.map(unit => {\r\n const rate =\r\n val * (unit.ConversionRate === 0 ? 1 : unit.ConversionRate);\r\n return `(g/UnitTypeId eq ${unit.TargetId} and g/MinValue le ${rate} and g/MaxValue ge ${rate})`;\r\n })\r\n .join(' or ')})`;\r\n predicates.push(targetFilter);\r\n }\r\n // if (value.unitType!.SourceUnits.length === 0) {\r\n // res = `${name}/any(g: g/UnitTypeId eq ${\r\n // value.unitType!.Id\r\n // } and g/MinValue le ${val} and g/MaxValue ge ${val})`;\r\n // } else {\r\n // const sourceConvert1 = value.unitType!.SourceUnits[0];\r\n // const unitId1 = sourceConvert1.TargetId;\r\n // const convert1 = sourceConvert1.ConversionRate || 1;\r\n // const sourceConvert2 = value.unitType!.SourceUnits[1] ?? sourceConvert1;\r\n // const unitId2 = sourceConvert2.TargetId;\r\n // const convert2 = sourceConvert2.ConversionRate || 1;\r\n // res = `${name}/any(g: (g/UnitTypeId eq ${\r\n // value.unitType!.Id\r\n // } and g/MinValue le ${val} and g/MaxValue ge ${val}) or (g/UnitTypeId eq ${unitId1} and g/MinValue le ${\r\n // val / convert1\r\n // } and g/MaxValue ge ${\r\n // val / convert1\r\n // }) or (g/UnitTypeId eq ${unitId2} and g/MinValue le ${\r\n // val / convert2\r\n // } and g/MaxValue ge ${val * convert2}))`;\r\n // }\r\n\r\n // res += ') or (';\r\n\r\n // if (value.unitType!.TargetUnits.length === 0) {\r\n // res += `${name}/any(g: g/UnitTypeId eq ${\r\n // value.unitType!.Id\r\n // } and g/MinValue le ${val} and g/MaxValue ge ${val})`;\r\n // } else {\r\n // const targetConvert1 = value.unitType!.TargetUnits[0];\r\n // const unitId1 = targetConvert1.TargetId;\r\n // const convert1 = targetConvert1.ConversionRate || 1;\r\n // const sourceConvert2 = value.unitType!.TargetUnits[1] ?? targetConvert1;\r\n // const unitId2 = sourceConvert2.TargetId;\r\n // const convert2 = sourceConvert2.ConversionRate || 1;\r\n // res += `${name}/any(g: (g/UnitTypeId eq ${\r\n // value.unitType!.Id\r\n // } and g/MinValue le ${val} and g/MaxValue ge ${val}) or (g/UnitTypeId eq ${unitId1} and g/MinValue le ${\r\n // val * convert1\r\n // } and g/MaxValue ge ${\r\n // val * convert1\r\n // }) or (g/UnitTypeId eq ${unitId2} and g/MinValue le ${\r\n // val * convert2\r\n // } and g/MaxValue ge ${val * convert2}))`;\r\n // }\r\n\r\n return '(' + predicates.join(' or ') + ')';\r\n};\r\n\r\nexport const assetRangeDisplay = (val: FilterValueType | undefined) => {\r\n if (!isAssetRangeType(val)) return null;\r\n return `${val.value} ${val.unitType?.Name}`;\r\n};\r\n\r\n/**\r\n * must recieve CustomData as number else wont work\r\n */\r\nexport const AssetRangeFilter = ({\r\n value,\r\n onChange,\r\n customData,\r\n ...props\r\n}: IFilterComponentProps) => {\r\n const { t } = useTranslation();\r\n const [stateValue, setValue] = useState(value);\r\n const handleValChange: React.ChangeEventHandler<\r\n HTMLTextAreaElement | HTMLInputElement\r\n > = event => {\r\n const newState = {\r\n unitType: stateValue?.unitType ?? null,\r\n value: +event.target.value ?? null,\r\n };\r\n setValue(newState);\r\n if (\r\n valOrNull(newState.unitType) !== null &&\r\n valOrNull(newState.value) !== null\r\n ) {\r\n handleOnChange(newState);\r\n }\r\n // setValue(oldValue => {\r\n // const newState = {\r\n // unitType: oldValue?.unitType ?? null,\r\n // value: +event.target.value ?? null,\r\n // };\r\n // handleOnChange(newState);\r\n // return newState;\r\n // });\r\n };\r\n const handleTypeChange = (val: UnitType | null) => {\r\n const newState = {\r\n unitType: val,\r\n value: stateValue?.value ?? null,\r\n };\r\n setValue(newState);\r\n if (\r\n valOrNull(newState.unitType) !== null &&\r\n valOrNull(newState.value) !== null\r\n ) {\r\n handleOnChange(newState);\r\n }\r\n // setValue(oldVal => {\r\n // const newState = {\r\n // unitType: val,\r\n // value: stateValue?.value ?? null,\r\n // };\r\n // handleOnChange(newState);\r\n // return newState;\r\n // });\r\n };\r\n const handleOnChange = debounce(onChange, 250);\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { isMobile, useMobileOrientation } from 'react-device-detect';\r\nimport { Theme, useTheme } from '@material-ui/core';\r\nexport interface IMobileDetector {\r\n checkIsMobile: () => boolean;\r\n orientation: 'portrait' | 'landscape';\r\n isLandscape: boolean;\r\n isPortrait: boolean;\r\n isMobile: boolean;\r\n}\r\nexport const useIsMobile = (): IMobileDetector => {\r\n const theme: Theme = useTheme();\r\n const { orientation, isLandscape, isPortrait } = useMobileOrientation();\r\n //const [mobile, setMobile] = React.useState(false);\r\n\r\n const checkIsMobile = React.useCallback((): boolean => {\r\n return (\r\n (isMobile && window.innerWidth < theme.breakpoints.values.md) ||\r\n window.innerWidth < theme.breakpoints.values.md\r\n );\r\n }, [theme.breakpoints.values.md]);\r\n\r\n // React.useEffect(() => {\r\n // console.log('deviceDetect: ', data);\r\n // setMobile(() => {\r\n // return (\r\n // (isMobile && window.innerWidth < theme.breakpoints.values.sm) ||\r\n // window.innerWidth < theme.breakpoints.values.sm\r\n // );\r\n // });\r\n // }, [data, theme.breakpoints.values.sm]);\r\n return { checkIsMobile, orientation, isLandscape, isPortrait, isMobile };\r\n};\r\n","/**\r\n *\r\n * OnlineServicePicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport {\r\n AutocompleteMultiPickerEx,\r\n AutocompleteMultiPickerExProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { AutocompletePicker } from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { splitFilterValue } from 'app/components/BasicTable/types/FilterParam';\r\nexport type ServiceUrl = 'base' | 'admin' | 'reserved';\r\nexport interface OnlineServicePickerProps\r\n extends Omit, 'loadData'> {\r\n inputProps?: InputBaseComponentProps;\r\n urlType?: ServiceUrl;\r\n}\r\n\r\nconst url = '/api/odata/v4/ServiceFilter';\r\nconst adminUrl = '/api/odata/v4/ServiceFilter/AdminEquipments';\r\nconst reservableUrl = '/api/odata/v4/ServiceFilter/ReservableEquipments';\r\nexport const initOnlineServicesData = (\r\n initval: string | undefined,\r\n sourceurl?: ServiceUrl,\r\n separator?: string,\r\n serviceGroups?: Identifiable[],\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n let ids = splitFilterValue(initval).map(item => {\r\n return { Id: parseInt(item) };\r\n }) as Identifiable[];\r\n\r\n let foo: string | undefined = undefined;\r\n const predicates: string | Condition[] = [];\r\n if (ids.length > 0) {\r\n predicates.push(new Condition('Id', ODataOperators.Includes, ids));\r\n }\r\n // apply only global service group filter related items filter\r\n // items not related to one of the selected cores are discarded\r\n if (serviceGroups !== undefined && serviceGroups?.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n serviceGroups.map(f => f.Id),\r\n ),\r\n );\r\n }\r\n foo = predicates.map(f => f.toString()).join(' and ');\r\n\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n $expand: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: foo,\r\n $skip: 0,\r\n $top: 10,\r\n $expand: 'WorkingHours',\r\n };\r\n let initUrl =\r\n sourceurl === undefined\r\n ? url\r\n : sourceurl === 'reserved'\r\n ? reservableUrl\r\n : sourceurl === 'admin'\r\n ? adminUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n urlType: ServiceUrl | undefined,\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url:\r\n urlType === 'reserved'\r\n ? reservableUrl\r\n : urlType === 'admin'\r\n ? adminUrl\r\n : url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'ServiceGroupId',\r\n 'ServiceTypeId',\r\n 'UseServiceGroupTrainingLevels',\r\n 'Color',\r\n 'ImageName',\r\n 'ServiceGroupName',\r\n 'RestrictDurationUnitsAmount',\r\n 'RestrictDurationUnitType',\r\n 'DefaultDuration',\r\n 'ForceFullDayReservations',\r\n 'AssemblyId',\r\n 'TopAssemblyId',\r\n 'AssetCatId',\r\n 'AssetCatName',\r\n 'RestrictReservationToTimeSlots',\r\n 'MinOrderHours',\r\n 'WorkingHours',\r\n ],\r\n expand: 'WorkingHours',\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n\r\nexport function OnlineServiceMultiPicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n predicates,\r\n disabled,\r\n inputProps,\r\n urlType,\r\n ...props\r\n}: OnlineServicePickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(\r\n predicates,\r\n globalServiceGroupFilter || [],\r\n urlType,\r\n );\r\n return (\r\n \r\n );\r\n}\r\nexport function OnlineServiceSinglePicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n predicates,\r\n disabled,\r\n inputProps,\r\n urlType,\r\n ...props\r\n}: OnlineServicePickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(\r\n predicates,\r\n globalServiceGroupFilter || [],\r\n urlType,\r\n );\r\n return (\r\n {\r\n if (!!onChange) {\r\n if (value !== null) {\r\n return onChange([value]);\r\n } else {\r\n return onChange([]);\r\n }\r\n }\r\n }}\r\n disabled={disabled}\r\n info={info}\r\n id={id || 'online-service-single-filter'}\r\n helperText={helperText}\r\n required={required}\r\n className={className}\r\n onBlur={props.onBlur}\r\n placeholder={placeholder}\r\n defaultValue={\r\n !!defaultValue\r\n ? defaultValue.length > 0\r\n ? (defaultValue[0] as IServiceFilterDto | undefined | null)\r\n : undefined\r\n : undefined\r\n }\r\n label={label}\r\n value={\r\n !!value\r\n ? value.length > 0\r\n ? (value[0] as IServiceFilterDto | undefined | null)\r\n : undefined\r\n : undefined\r\n }\r\n ariaLabel={'Equipment search'}\r\n {...props}\r\n error={props.error}\r\n />\r\n );\r\n}\r\n\r\nexport function RestrictedByAdminFilter(\r\n admin?: IUserFilterDto,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (!!admin) {\r\n if (!!admin.ServiceGroupIds && admin.ServiceGroupIds.length > 0) {\r\n let ids = admin.ServiceGroupIds.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n ids,\r\n ),\r\n );\r\n }\r\n if (!!admin.Services && admin.Services.length > 0) {\r\n let ids = admin.Services.filter(\r\n f => f.ServiceTypeId === (ServiceType.Online as number),\r\n ).map(f => {\r\n return { Id: f.Id } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition('Id', ODataOperators.Includes, ids),\r\n );\r\n }\r\n if (predicates.length > 0) {\r\n return [predicates.map(f => f.toString()).join(' or ')];\r\n } else {\r\n if (admin.IsAdminPanel) {\r\n return [];\r\n } else {\r\n return [\r\n new Condition('Id', ODataOperators.Equals, 0),\r\n ];\r\n }\r\n }\r\n } else {\r\n return [];\r\n }\r\n}\r\nexport function ServiceGroupFilter(\r\n serviceGroupId?: number,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (!!serviceGroupId) {\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Equals,\r\n serviceGroupId,\r\n ),\r\n );\r\n return predicates;\r\n } else {\r\n return [];\r\n }\r\n}\r\n","import { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nexport enum RenderTypes {\r\n AddToList = 0,\r\n AddWorkOrder,\r\n DownWorkOrder,\r\n BringBackUp,\r\n OpenCalendar,\r\n OpenTimeline,\r\n OpenWorkOrder,\r\n OpenWorkOrders,\r\n NewReservation,\r\n CloneEquipments,\r\n DownloadImages,\r\n ExportQRCodes,\r\n PrintAssetLabels,\r\n ExportForImport,\r\n}\r\n\r\nexport const AllowedToRender = (\r\n user: AuthenticatedUser | undefined,\r\n renderType: RenderTypes,\r\n asset: IAssetDto,\r\n) => {\r\n return (\r\n AllowedByRolePermissions(user, renderType, asset) &&\r\n AvailableByServiceType(asset.ServiceTypeId ?? -1, renderType) &&\r\n AvailableByAvailabilityType(\r\n asset.Availability !== undefined ? asset.Availability.Id : -1,\r\n renderType,\r\n )\r\n );\r\n};\r\nexport const AllowedByRolePermissions = (\r\n user: AuthenticatedUser | undefined,\r\n renderType: RenderTypes,\r\n asset: IAssetDto,\r\n) => {\r\n switch (renderType) {\r\n case RenderTypes.AddToList:\r\n case RenderTypes.AddWorkOrder:\r\n case RenderTypes.OpenCalendar:\r\n case RenderTypes.OpenTimeline:\r\n case RenderTypes.OpenWorkOrder:\r\n case RenderTypes.OpenWorkOrders:\r\n case RenderTypes.NewReservation:\r\n return true;\r\n case RenderTypes.DownWorkOrder:\r\n case RenderTypes.BringBackUp:\r\n case RenderTypes.ExportQRCodes:\r\n case RenderTypes.PrintAssetLabels:\r\n if (!user) {\r\n return false;\r\n }\r\n return (\r\n user.HasAdminGroupPermissions(asset.ServiceGroupId ?? undefined) ||\r\n user.HasAdminServicePermissions(\r\n asset.ServiceTypeId ?? 0,\r\n asset.ServiceId ?? undefined,\r\n ) ||\r\n user.HasLabTechGroupPermissions(asset.ServiceGroupId ?? undefined)\r\n );\r\n case RenderTypes.CloneEquipments:\r\n case RenderTypes.DownloadImages:\r\n case RenderTypes.ExportForImport:\r\n if (!user) {\r\n return false;\r\n }\r\n return (\r\n user.HasAdminGroupPermissions(asset.ServiceGroupId ?? undefined) ||\r\n user.HasAdminServicePermissions(\r\n asset.ServiceTypeId ?? 0,\r\n asset.ServiceId ?? 0,\r\n )\r\n );\r\n default:\r\n return false;\r\n }\r\n};\r\n\r\nexport const AvailableByServiceType = (\r\n serviceType: number,\r\n renderType: RenderTypes,\r\n) => {\r\n if (serviceType === -1) {\r\n return false;\r\n }\r\n let serType = serviceType as ServiceType;\r\n switch (renderType) {\r\n case RenderTypes.AddToList:\r\n case RenderTypes.AddWorkOrder:\r\n case RenderTypes.BringBackUp:\r\n case RenderTypes.OpenCalendar:\r\n case RenderTypes.OpenTimeline:\r\n case RenderTypes.OpenWorkOrder:\r\n case RenderTypes.OpenWorkOrders:\r\n case RenderTypes.DownWorkOrder:\r\n case RenderTypes.NewReservation:\r\n case RenderTypes.CloneEquipments:\r\n return serType === ServiceType.Online;\r\n case RenderTypes.DownloadImages:\r\n case RenderTypes.ExportForImport:\r\n return (\r\n serType === ServiceType.Online ||\r\n serType === ServiceType.Offline ||\r\n serType === ServiceType.Sample\r\n );\r\n case RenderTypes.ExportQRCodes:\r\n case RenderTypes.PrintAssetLabels:\r\n return serType === ServiceType.Online || serType === ServiceType.Offline;\r\n default:\r\n return false;\r\n }\r\n};\r\nexport const AvailableByAvailabilityType = (\r\n availabilityType: number,\r\n renderType: RenderTypes,\r\n) => {\r\n if (availabilityType === -1) {\r\n return false;\r\n }\r\n let avType = availabilityType as AvailabilityTypes;\r\n switch (renderType) {\r\n case RenderTypes.AddToList:\r\n case RenderTypes.AddWorkOrder:\r\n case RenderTypes.BringBackUp:\r\n case RenderTypes.OpenWorkOrder:\r\n case RenderTypes.OpenWorkOrders:\r\n case RenderTypes.DownWorkOrder:\r\n case RenderTypes.ExportQRCodes:\r\n case RenderTypes.PrintAssetLabels:\r\n return [\r\n //AvailabilityTypes.FreelyBookableBillable,\r\n //AvailabilityTypes.ApprovalRequiredBillable,\r\n AvailabilityTypes.FreelyBookable,\r\n //AvailabilityTypes.BookableWApproval,\r\n AvailabilityTypes.TrainingProgram,\r\n AvailabilityTypes.LoanableEquipment,\r\n AvailabilityTypes.LectureRoom,\r\n AvailabilityTypes.AvailableNotBookable,\r\n AvailabilityTypes.NotAvailable,\r\n ].includes(avType);\r\n case RenderTypes.OpenCalendar:\r\n case RenderTypes.OpenTimeline:\r\n case RenderTypes.NewReservation:\r\n case RenderTypes.CloneEquipments:\r\n return [\r\n //AvailabilityTypes.FreelyBookableBillable,\r\n //AvailabilityTypes.ApprovalRequiredBillable,\r\n AvailabilityTypes.FreelyBookable,\r\n //AvailabilityTypes.BookableWApproval,\r\n AvailabilityTypes.TrainingProgram,\r\n AvailabilityTypes.LoanableEquipment,\r\n AvailabilityTypes.LectureRoom,\r\n ].includes(avType);\r\n case RenderTypes.DownloadImages:\r\n return true;\r\n case RenderTypes.ExportForImport:\r\n return [\r\n //AvailabilityTypes.FreelyBookableBillable,\r\n //AvailabilityTypes.ApprovalRequiredBillable,\r\n AvailabilityTypes.FreelyBookable,\r\n //AvailabilityTypes.BookableWApproval,\r\n AvailabilityTypes.TrainingProgram,\r\n AvailabilityTypes.LoanableEquipment,\r\n AvailabilityTypes.LectureRoom,\r\n AvailabilityTypes.AvailableNotBookable,\r\n AvailabilityTypes.NotAvailable,\r\n AvailabilityTypes.ServiceRelated,\r\n AvailabilityTypes.RequestRelated,\r\n ].includes(avType);\r\n default:\r\n return false;\r\n }\r\n};\r\n","import * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n selectUserProfileSettings,\r\n} from 'app/slice/selectors';\r\nimport {\r\n BasicTableProps,\r\n IBasicTableState,\r\n IRow,\r\n} from 'app/components/BasicTable';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { routerActions } from 'connected-react-router';\r\nimport { useMemo } from 'react';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\nimport {\r\n defaultSerializer,\r\n findIsfilterInversed,\r\n setisInversedForUrl,\r\n URLSearchParamsCI,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { GetPageFilters } from './BasicFilter/GetPageFilters';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { parseInt, trimEnd } from 'lodash';\r\nimport { SavedViewSelected } from 'app/pages/SavedViewsPage/SavedViewPage/slice/types';\r\nimport { FilterValueType } from './BasicFilter/FilterValueType';\r\nimport { getDependencyFilters } from './BasicFilter';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { TableSavedListSettings } from './BasicTableProps';\r\nimport { useProfileSetting } from './useProfileSetting';\r\nimport { parseProfileUrl } from './useProfileSetting/parseProfileUrl';\r\nimport { getNextFilter } from './getNextFilter';\r\nimport { getFilterValue } from './getFilterValue';\r\nimport { SAVEDVIEW_SEARCH_KEY } from './BasicFilter/SavedListsDropDown';\r\nimport { useSavedViewSlice } from 'app/pages/SavedViewsPage/SavedViewPage/slice';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { initFilterData } from './initFilterData';\r\n\r\nexport function toURLSearchParams(\r\n items: Array<\r\n Pick<\r\n IFilterSettings,\r\n 'queryStringSerializer' | 'value' | 'isInversed'\r\n >\r\n >,\r\n) {\r\n var result = new URLSearchParams();\r\n const serializableItems = items.filter(\r\n element => element.queryStringSerializer !== undefined,\r\n );\r\n serializableItems.forEach(element => {\r\n var value = element.value;\r\n\r\n if (value !== undefined) {\r\n const serializer =\r\n typeof element.queryStringSerializer == 'string'\r\n ? defaultSerializer(element.queryStringSerializer)\r\n : element.queryStringSerializer;\r\n const stringValue = serializer?.(value);\r\n if (stringValue !== undefined) {\r\n if (stringValue instanceof URLSearchParams) {\r\n (stringValue as URLSearchParams).forEach((v, n) =>\r\n result.set(n, setisInversedForUrl(v, !!element.isInversed)),\r\n );\r\n }\r\n }\r\n }\r\n });\r\n return result;\r\n}\r\n/**\r\n *\r\n * @param savedFilterKey a key to save/load \"saved filters\" by\r\n * @param GetFiltersDefinition filters settings provider\r\n * @param getDefaultFilter default filters settlings\r\n * @param reservedQueryStringParameterNames query string parameter names to ignore\r\n * @param getRequiredFilter required filter settings provider\r\n * @param getSelectedViewFilter ??? something to do with ListId,AssetId\r\n * @param enableSavedLists adds a dropdown with \"saved list\" of instruments\r\n * @param useSyncSearch controls syncing of the filters state into the url's search parameter\r\n * @returns\r\n */\r\nexport function useFilters(\r\n savedFilterKey: string,\r\n GetFiltersDefinition: GetPageFilters,\r\n getDefaultFilter?: (user: IAuthenticatedUser) => URLSearchParams,\r\n reservedQueryStringParameterNames?: string[],\r\n getRequiredFilter?: (\r\n search: string,\r\n appSettings?: AppSettings | null,\r\n ) => string | undefined,\r\n getSelectedViewFilter?: (\r\n search: string,\r\n view: SavedViewSelected,\r\n ) => string | undefined,\r\n enableSavedLists?: boolean,\r\n savedListSettings?: TableSavedListSettings,\r\n useCardsByDefault?: boolean,\r\n /**\r\n * Indicates wether filters should return partial results or only return fully loaded filters.\r\n * By default this will first return Identifiable e.g. {Id:1} and after that the full entity e.g. {Id:1,Name:'Name'} when it'll be ready\r\n */\r\n getPartialResults?: boolean,\r\n useSyncSearch: boolean = true,\r\n) {\r\n const dispatch = useDispatch();\r\n const { actions: savedViewActions } = useSavedViewSlice();\r\n const { actions: appActions } = useAppSettingsSlice();\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const location = useLocation();\r\n const showFiltersFn = React.useCallback(visibleFiltersFilter, []);\r\n const rowsKey = savedFilterKey + '_rows';\r\n const useCardsKey = savedFilterKey + '_useCardsMode';\r\n const {\r\n savedValue: savedUrl,\r\n updateValue: updateSavedFilterValue,\r\n } = useProfileSetting({\r\n profileSettingKey: (savedFilterKey ?? location.pathname).toLowerCase(),\r\n });\r\n const { search: savedFilterValue } = parseProfileUrl(savedUrl);\r\n\r\n React.useEffect(\r\n () => {\r\n if (authenticatedUser === undefined) {\r\n return;\r\n }\r\n\r\n const defaultSearch = getPresetFilter(\r\n savedFilterValue,\r\n authenticatedUser,\r\n );\r\n const isDefault =\r\n defaultSearch === undefined || (savedFilterValue ?? '') === '';\r\n\r\n let search = isEmptyOrWhitespace(location.search)\r\n ? defaultSearch ?? ''\r\n : location.search;\r\n const requiredSearch =\r\n getRequiredFilter !== null && getRequiredFilter !== undefined\r\n ? getRequiredFilter(search, appSettings)\r\n : undefined;\r\n search = requiredSearch === undefined ? search : requiredSearch ?? '';\r\n\r\n const savedViewId = tryParseInt(\r\n new URLSearchParamsCI(search).get(SAVEDVIEW_SEARCH_KEY),\r\n );\r\n dispatch(savedViewActions.selectSavedView(savedViewId));\r\n\r\n // get the filters\r\n const localizedFilters = getLocalizedFilters(search);\r\n let visibleFilters = localizedFilters\r\n ?.map(f =>\r\n isDefault\r\n ? mapDefaultFilters({\r\n ...f,\r\n isInversed: findIsfilterInversed(\r\n search,\r\n f.urlKey ??\r\n (typeof f.queryStringSerializer === 'string'\r\n ? f.queryStringSerializer\r\n : undefined),\r\n ),\r\n })\r\n : {\r\n ...f,\r\n isInversed: findIsfilterInversed(\r\n search,\r\n f.urlKey ??\r\n (typeof f.queryStringSerializer === 'string'\r\n ? f.queryStringSerializer\r\n : undefined),\r\n ),\r\n },\r\n )\r\n .filter(showFiltersFn);\r\n let depFilters = getDependencyFilters(visibleFilters);\r\n if (getPartialResults !== true) {\r\n setAppliedFilters(depFilters);\r\n }\r\n setAppliedFilters(initFilterData(depFilters, globalServiceGroupFilter));\r\n if (!isEmptyOrWhitespace(search) && search !== location.search) {\r\n dispatch(\r\n routerActions.replace({\r\n pathname: trimEnd(location.pathname, '?'),\r\n search: search,\r\n }),\r\n );\r\n }\r\n\r\n const defaultRows = parseInt(\r\n userProfileSettings.GetSettingByKeyOrDefault(rowsKey).Value ?? '',\r\n );\r\n setPageSize(isNaN(defaultRows) ? 10 : defaultRows);\r\n if (useCardsByDefault !== undefined) {\r\n const defaultCardsMode =\r\n userProfileSettings.GetSettingByKeyOrDefault(useCardsKey).Value ?? '';\r\n setCardsMode(\r\n defaultCardsMode === ''\r\n ? !!useCardsByDefault\r\n : defaultCardsMode === true.toString(),\r\n );\r\n }\r\n },\r\n // globalServiceGroupFilter dependency has been added to reload the filters after globalServiceGroupFilter change. This is needed to remove/add service group related filter items from already loaded filters. e.g. a service that does not belong to newly selected service group/s\r\n // other dependencies are excluded for backwards compatibility (this was previously executed in useEffectOnMount). This should probably changed some time later when there's no prod release around the corner\r\n // location.pathname, location.search are needed to react for their changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [globalServiceGroupFilter, location.pathname, location.search],\r\n );\r\n\r\n const userProfileSettings = useSelector(selectUserProfileSettings);\r\n\r\n const removeEmptyFilters = (\r\n filter: string | undefined,\r\n ): string | undefined => {\r\n if (filter === undefined && filter === null) {\r\n return undefined;\r\n } else {\r\n const params = new URLSearchParams(filter);\r\n let newParams = new URLSearchParams();\r\n for (const [name, value] of params) {\r\n if (value !== undefined) {\r\n newParams.append(name, value);\r\n }\r\n }\r\n return newParams.toString();\r\n }\r\n };\r\n function getPresetFilter(\r\n savedFilter: string | undefined | null,\r\n user: IAuthenticatedUser,\r\n ): string | undefined {\r\n const result =\r\n savedFilter !== undefined && savedFilter !== null\r\n ? removeEmptyFilters(savedFilter)\r\n : getDefaultFilter !== undefined && getDefaultFilter !== null\r\n ? getDefaultFilter(user)?.toString()\r\n : undefined;\r\n return result;\r\n }\r\n\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const getLocalizedFilters = useMemo(() => {\r\n const result = GetFiltersDefinition(\r\n t,\r\n appSettings,\r\n authenticatedUser ?? null,\r\n settings,\r\n );\r\n return result;\r\n }, [GetFiltersDefinition, appSettings, authenticatedUser, settings, t]);\r\n\r\n const allFilters = useMemo(() => {\r\n var result = isEmptyOrWhitespace(location.search)\r\n ? getLocalizedFilters('')\r\n : getLocalizedFilters(location.search);\r\n return result;\r\n }, [getLocalizedFilters, location.search]);\r\n\r\n const [appliedFilters, setAppliedFilters] = useAsyncExtendedState<\r\n IFilterSettings[] | undefined\r\n >(undefined);\r\n\r\n const [pageSize, setPageSize] = React.useState();\r\n const [pageIndex, setPageIndex] = React.useState();\r\n\r\n const [cardsMode, setCardsMode] = React.useState(\r\n !!useCardsByDefault,\r\n );\r\n\r\n const syncSearch = React.useCallback(\r\n (newState: Array>) => {\r\n const currentSearch = getNextFilter(\r\n newState,\r\n location.search,\r\n reservedQueryStringParameterNames,\r\n );\r\n const originalSearch = new URLSearchParamsCI(location.search);\r\n\r\n // clear saved view selection when instrument selection changes\r\n if (enableSavedLists && savedListSettings !== undefined) {\r\n if (savedListSettings?.savedListSerializedKey !== undefined) {\r\n const currentInstrumentSelection = currentSearch.get(\r\n savedListSettings?.savedListSerializedKey,\r\n );\r\n const originalInstrumentSelection = originalSearch.get(\r\n savedListSettings?.savedListSerializedKey,\r\n );\r\n if (currentInstrumentSelection !== originalInstrumentSelection) {\r\n // remove the selection from the search\r\n currentSearch.delete(SAVEDVIEW_SEARCH_KEY);\r\n // clear redux state\r\n dispatch(savedViewActions.selectMyList());\r\n }\r\n }\r\n }\r\n\r\n // push current filter state to the URL search if it's not equivalent\r\n if (!originalSearch.equals(currentSearch)) {\r\n const currentSearchString = currentSearch.toString();\r\n // trim the question mark in case and for any reason the double question marks ended up saved in the \"saved filter\"\r\n // in this case the search part will be OK, but the pathname will end with the question mark\r\n // e.g. /reservations??eid=2 => pathName = \"/reservations?\"\r\n const pathName = trimEnd(location.pathname, '?');\r\n const url = pathName + '?' + currentSearchString;\r\n updateSavedFilterValue(url);\r\n dispatch(\r\n routerActions.push({\r\n pathname: location.pathname,\r\n search: currentSearchString,\r\n }),\r\n );\r\n }\r\n },\r\n [\r\n dispatch,\r\n enableSavedLists,\r\n location.pathname,\r\n location.search,\r\n reservedQueryStringParameterNames,\r\n savedListSettings,\r\n savedViewActions,\r\n updateSavedFilterValue,\r\n ],\r\n );\r\n\r\n const handleFilterChange: (\r\n items: IFilterSettings[],\r\n ) => void = React.useCallback(\r\n items => {\r\n const newState = [...items.filter(showFiltersFn)];\r\n\r\n setAppliedFilters(getDependencyFilters(newState));\r\n if (useSyncSearch) {\r\n syncSearch(newState);\r\n }\r\n },\r\n [setAppliedFilters, showFiltersFn, syncSearch, useSyncSearch],\r\n );\r\n const setFilterValueCallback = React.useCallback(\r\n (id: string, value: FilterValueType) => {\r\n if (allFilters === undefined) {\r\n return;\r\n }\r\n const filter = allFilters?.find(f => f.id === id);\r\n // in cases when applied filter is not defined call to setAppliedFilters will just only mutate appliedFilters array and cause duplicate/unnecessary invocation of hooks that have appliedFilters as a dependency\r\n if (filter !== undefined) {\r\n filter.value = value;\r\n const x = allFilters\r\n .map(f => (f === filter ? { ...filter, ...{ value: value } } : f))\r\n .filter(showFiltersFn);\r\n handleFilterChange(x);\r\n }\r\n },\r\n [allFilters, handleFilterChange, showFiltersFn],\r\n );\r\n const getFilterValueCallback = React.useCallback(\r\n (id: string) => {\r\n const f = getFilterValue(appliedFilters, id);\r\n return f;\r\n },\r\n [appliedFilters],\r\n );\r\n\r\n const handelPageSizeChange = (size: number) => {\r\n if (!isNaN(size) && pageSize !== size && size > 0) {\r\n setPageSize(size);\r\n dispatch(appActions.savePageSize({ key: rowsKey, value: size }));\r\n }\r\n };\r\n const handelPageIndexChange = (index: number) => {\r\n if (!isNaN(index) && pageIndex !== index && index >= 0) {\r\n setPageIndex(index);\r\n }\r\n };\r\n\r\n const handleCardsModeChange = (isCardsMode: boolean) => {\r\n if (cardsMode !== isCardsMode) {\r\n setCardsMode(isCardsMode);\r\n dispatch(\r\n appActions.saveCardsMode({ key: useCardsKey, value: isCardsMode }),\r\n );\r\n }\r\n };\r\n const [defaultFilters, setDefaultFilters] = useAsyncExtendedState<\r\n IFilterSettings[]\r\n >([]);\r\n React.useEffect(() => {\r\n const defaults = getDependencyFilters(\r\n getLocalizedFilters(\r\n getDefaultFilter?.(\r\n authenticatedUser as IAuthenticatedUser,\r\n )?.toString() ?? '',\r\n )\r\n .map(mapDefaultFilters)\r\n .filter(showFiltersFn),\r\n );\r\n setDefaultFilters(defaults);\r\n setDefaultFilters(initFilterData(defaults, globalServiceGroupFilter));\r\n }, [\r\n authenticatedUser,\r\n getDefaultFilter,\r\n getLocalizedFilters,\r\n globalServiceGroupFilter,\r\n setDefaultFilters,\r\n showFiltersFn,\r\n ]);\r\n const getDefaultFilters = React.useCallback(() => {\r\n return defaultFilters;\r\n }, [defaultFilters]);\r\n\r\n return {\r\n allfilters: allFilters,\r\n appliedFilters,\r\n handleFilterChange,\r\n handelPageSizeChange,\r\n pageSize,\r\n handelPageIndexChange,\r\n pageIndex,\r\n getFilterValue: getFilterValueCallback,\r\n setFilterValue: setFilterValueCallback,\r\n cardsMode,\r\n onModeChange: handleCardsModeChange,\r\n getDefaultFilters,\r\n };\r\n}\r\n/**\r\n * Filter function to determine if the filter is needs to be shown\r\n * @param item\r\n * @returns\r\n */\r\nexport function visibleFiltersFilter(item: IFilterSettings) {\r\n return item.value !== undefined || item.notNullable; //|| item.visible === true,\r\n}\r\n\r\nexport function mapDefaultFilters(\r\n item: IFilterSettings,\r\n): IFilterSettings {\r\n return { ...item, value: !item.notDefault ? item.value ?? null : item.value };\r\n}\r\nexport interface IWithSavedHistoryComponentProps {\r\n /**\r\n * Innitial State of the filters container (close / open)\r\n */\r\n filterOpen?: boolean;\r\n /**\r\n * List of applicable filters\r\n */\r\n availableFilters?: IFilterSettings[];\r\n\r\n /**\r\n * List of applicable filters\r\n */\r\n appliedFilters?: IFilterSettings[];\r\n /**\r\n * Enables data export. On by default.\r\n */\r\n onFilterChange?: (items: IFilterSettings[]) => void;\r\n\r\n /**\r\n * Initial table state. Part of the react-table API\r\n * Example: \r\n * {\r\n sortBy: [{ id: 'Name', desc: false }],\r\n }\r\n */\r\n initialState?: IBasicTableState;\r\n /**\r\n * Id of the screen that table related to. Required!\r\n */\r\n screenId?: ScreensId;\r\n /**\r\n * Saved List settings\r\n */\r\n savedListSettings?: TableSavedListSettings;\r\n /**\r\n * Retrieves curent value set in a filter\r\n */\r\n getFilterValue?: (id: string) => FilterValueType | undefined;\r\n /**\r\n * Updates the value of a filter\r\n */\r\n setFilterValue?: (id: string, value: FilterValueType) => void;\r\n /**\r\n * should use cards mode by default\r\n */\r\n useCardsByDefault?: boolean;\r\n /**\r\n * updates the card mode\r\n */\r\n onModeChange?: (isCardsMode: boolean) => void;\r\n /**\r\n * gets this pages default filters\r\n */\r\n getDefaultFilters?: () => IFilterSettings[];\r\n}\r\n/**\r\n *\r\n * @param Component\r\n * @param savedFilterKey\r\n * @returns\r\n */\r\nexport function withSavedHistoryT<\r\n TRow extends IRow,\r\n TProps extends IWithSavedHistoryComponentProps = BasicTableProps\r\n>(\r\n Component: React.FC,\r\n savedFilterKey: string,\r\n GetFiltersDefinition: GetPageFilters,\r\n getDefaultFilter?: (user: IAuthenticatedUser) => URLSearchParams,\r\n reservedQueryStringParameterNames?: string[],\r\n getRequiredFilter?: (\r\n search: string,\r\n appSettings?: AppSettings | null,\r\n ) => string | undefined,\r\n getSelectedViewFilter?: (\r\n search: string,\r\n view: SavedViewSelected,\r\n ) => string | undefined,\r\n enableSavedLists?: boolean,\r\n useCardsByDefault?: boolean,\r\n): React.FC {\r\n return ({\r\n onFilterChange,\r\n availableFilters,\r\n initialState,\r\n ...props\r\n }: TProps) => {\r\n const {\r\n allfilters,\r\n appliedFilters,\r\n handleFilterChange,\r\n handelPageSizeChange,\r\n pageSize,\r\n handelPageIndexChange,\r\n pageIndex,\r\n getFilterValue,\r\n setFilterValue,\r\n cardsMode,\r\n onModeChange,\r\n getDefaultFilters,\r\n } = useFilters(\r\n savedFilterKey,\r\n GetFiltersDefinition,\r\n getDefaultFilter,\r\n reservedQueryStringParameterNames,\r\n getRequiredFilter,\r\n getSelectedViewFilter,\r\n enableSavedLists,\r\n props.savedListSettings,\r\n useCardsByDefault,\r\n );\r\n return (\r\n <>\r\n {appliedFilters !== undefined && (\r\n \r\n )}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport function getIgnoredSearch(search: string, ignore: string[]) {\r\n var p = new URLSearchParams(search);\r\n [...p.keys()].forEach(key => {\r\n if (!ignore.includes(key)) {\r\n p.delete(key);\r\n }\r\n });\r\n\r\n return p;\r\n}\r\nexport function combineSearch(search: string, other?: string) {\r\n if (other === undefined) {\r\n return search;\r\n } else {\r\n let p = new URLSearchParams(search);\r\n let o = new URLSearchParams(other);\r\n for (const key of o.keys()) {\r\n if (!p.has(key)) {\r\n const val = o.get(key);\r\n if (val !== null) {\r\n p.set(key, val);\r\n }\r\n }\r\n }\r\n return p.toString();\r\n }\r\n}\r\n","import { Theme } from '@material-ui/core/styles';\r\nimport { makeStyles } from '@material-ui/styles';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n}));\r\n","import { Theme } from '@material-ui/core/styles';\r\nimport { MenuItem, MenuItemProps } from '@material-ui/core';\r\nimport styled from 'styled-components';\r\n\r\n// export const StyledMenuItem = withStyles({\r\n// root: {\r\n// '&:hover': {\r\n// backgroundColor: 'transparent',\r\n// },\r\n// },\r\n// })(MenuItem);\r\nexport const StyledMenuItem = styled(\r\n ({\r\n button,\r\n theme,\r\n children,\r\n ...other\r\n }: {\r\n button: true | false;\r\n theme: Theme;\r\n children: React.ReactNode;\r\n } & MenuItemProps) => (\r\n \r\n {children}\r\n \r\n ),\r\n)`\r\n &:hover {\r\n background-color: 'transparent';\r\n }\r\n &.hidden-if-empty:empty {\r\n display: none;\r\n }\r\n`;\r\n","import * as React from 'react';\r\nimport {\r\n bindHover,\r\n bindMenu,\r\n usePopupState,\r\n anchorRef,\r\n} from 'material-ui-popup-state/hooks';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport HoverMenu from 'material-ui-popup-state/HoverMenu';\r\nimport { ReactActionsProps } from '.';\r\nimport { useStyles } from './useStyles';\r\nimport { StyledMenuItem } from './StyledMenuItem';\r\nimport { useTheme } from '@material-ui/core';\r\n\r\nexport const HoverActions = React.forwardRef(\r\n function HoverActions(props, ref) {\r\n const { id, items, size, iconVariant } = props;\r\n const classes = useStyles();\r\n const popupState = usePopupState({\r\n variant: 'popover',\r\n popupId: id,\r\n });\r\n const theme = useTheme();\r\n const buttons = items.filter(a => a !== undefined);\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n {buttons.map((item, index) => {\r\n return (\r\n popupState.close()}\r\n {...props}\r\n >\r\n {item}\r\n \r\n );\r\n })}\r\n \r\n
\r\n
\r\n );\r\n },\r\n);\r\n","import {\r\n bindMenu,\r\n usePopupState,\r\n bindTrigger,\r\n anchorRef,\r\n} from 'material-ui-popup-state/hooks';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport * as React from 'react';\r\nimport { Menu, useTheme } from '@material-ui/core';\r\nimport { useStyles } from './useStyles';\r\nimport { StyledMenuItem } from './StyledMenuItem';\r\nimport { ReactActionsProps } from './index';\r\n\r\nexport const ClickableActions = React.forwardRef(\r\n function ClickableActions(props, ref) {\r\n const { id, items, size, iconVariant, icon } = props;\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const popupState = usePopupState({\r\n variant: 'popper',\r\n popupId: id,\r\n });\r\n const buttons = React.useMemo(() => {\r\n return items.filter(\r\n f =>\r\n f !== null &&\r\n f !== false &&\r\n f !== undefined &&\r\n f !== true &&\r\n f !== '',\r\n );\r\n }, [items]);\r\n return (\r\n
\r\n \r\n \r\n \r\n\r\n popupState.close()}\r\n >\r\n {buttons.map((item, index) => {\r\n return !!item ? (\r\n {\r\n if (!props.keepOpen) {\r\n popupState.close();\r\n }\r\n }}\r\n >\r\n {item}\r\n \r\n ) : (\r\n <>\r\n );\r\n })}\r\n \r\n
\r\n );\r\n },\r\n);\r\n","import * as React from 'react';\r\nimport { ButtonsVariant } from '../BasicButtons/Button';\r\nimport { HoverActions } from './HoverActions';\r\nimport { ClickableActions } from './ClickableActions';\r\nimport { IconProp } from 'app/AllIcons';\r\n\r\nexport interface ReactActionsProps {\r\n id: string;\r\n items: Array;\r\n size?: 'large' | 'medium' | 'small' | 'xs';\r\n iconVariant?: ButtonsVariant;\r\n hoverMenu?: boolean;\r\n icon?: IconProp;\r\n /**\r\n * Keeps menu open after clicking the menu item.\r\n */\r\n keepOpen?: boolean;\r\n /**\r\n * Disables ripple on all menu items. Useful for menu items containing more advanced components like drop down.\r\n */\r\n disableRipple?: boolean;\r\n}\r\nexport function ReactActions(props: ReactActionsProps) {\r\n const { hoverMenu, items } = props;\r\n // filter items that will render something\r\n const nonEmptyItems = React.useMemo(() => {\r\n return items.filter(\r\n f =>\r\n f !== null && f !== false && f !== undefined && f !== true && f !== '',\r\n );\r\n }, [items]);\r\n // if there's nothing to show in the menu then there's no point to show the menu itself\r\n if (nonEmptyItems.length === 0) {\r\n return <>;\r\n }\r\n return (\r\n \r\n {hoverMenu ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { InputAdornment, InputBaseComponentProps } from '@material-ui/core';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { omit } from 'lodash';\r\nimport * as React from 'react';\r\nimport BaseTextField from '../BaseTextField';\r\nimport { BaseInputFieldProps } from '../BaseTextField/BaseFieldDefinition';\r\nimport clsx from 'clsx';\r\n\r\nexport interface TextControlFieldProps extends BaseInputFieldProps {\r\n info?: string;\r\n onBlur?: React.FocusEventHandler;\r\n onChange?: React.ChangeEventHandler;\r\n onFocus?: React.FocusEventHandler;\r\n startIcon?: React.ReactNode;\r\n endIcon?: React.ReactNode;\r\n autoFocus?: boolean;\r\n variant?: 'standard' | 'outlined' | 'filled';\r\n type?: React.InputHTMLAttributes['type'];\r\n min?: number;\r\n max?: number;\r\n className?: string;\r\n inputProps?: InputBaseComponentProps;\r\n}\r\n\r\nexport function TextControlField({\r\n info,\r\n startIcon,\r\n endIcon,\r\n onBlur,\r\n onChange,\r\n onFocus,\r\n autoFocus,\r\n variant,\r\n type,\r\n inputProps,\r\n className,\r\n ...props\r\n}: TextControlFieldProps) {\r\n const startIconComponent = startIcon && (\r\n {startIcon}\r\n );\r\n\r\n const endIconComponent = (\r\n {endIcon}\r\n );\r\n return (\r\n ) || (endIcon && endIconComponent),\r\n }}\r\n className={clsx(className, {\r\n startIcon: !!startIcon,\r\n endIcon: !!endIcon,\r\n })}\r\n {...omit(props, 'DialogProps')}\r\n >\r\n );\r\n}\r\n","import {\r\n EquipmentsChangeStateParameters,\r\n EquipmentSlotParameters,\r\n ReservationInsertModel,\r\n ReservationModel,\r\n ReservationQueryStringParameters,\r\n TransferToReservation,\r\n} from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { IStatusReservations } from 'app/pages/ReservationHistoryPage/IStatusReservations';\r\nimport { ITrainingReservations } from 'app/pages/ReservationHistoryPage/ITrainingReservations';\r\nimport { GroupedEquipments } from 'types/Equipments/types';\r\nimport { httpClient } from './HttpClient';\r\n\r\nimport { ISharedReservations } from 'app/pages/ReservationHistoryPage/ISharedReservations';\r\nimport { EndUsageData } from 'app/components/EndUsageConfirm';\r\nimport { IResponseType } from 'types/ResponseType';\r\n\r\nexport const ReservationsApi = {\r\n initReservation: (payload: ReservationQueryStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/InitReservation`;\r\n return httpClient.post(url, data);\r\n },\r\n insertReservation: (payload: ReservationInsertModel) => {\r\n const url = `/api/odata/v4/Reservations`;\r\n return httpClient.post(url, payload);\r\n },\r\n updateReservation: (payload: ReservationModel) => {\r\n const url = `/api/odata/v4/Reservations(${payload.Id})`;\r\n return httpClient.put(url, payload);\r\n },\r\n getReservation: (id: number, params: object) => {\r\n const url = `/api/odata/v4/reservations/${id}`;\r\n return httpClient.get(url, params);\r\n },\r\n hasAnyFirstReservations: (\r\n ids: string,\r\n user: string,\r\n reservationId: number,\r\n ) => {\r\n const url = `/api/odata/v4/Reservations/HasAnyFirstReservation`;\r\n return httpClient.post(url, { ids: ids, user: user, id: reservationId });\r\n },\r\n getEquipmentsChangeState: (payload: EquipmentsChangeStateParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = '/api/odata/v4/Reservations/GetEquipmentsChangeState';\r\n return httpClient.post(url, data);\r\n },\r\n getValidationState: (payload: EquipmentsChangeStateParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/GetReservationValidationState`;\r\n return httpClient.post(url, data);\r\n },\r\n getReservationSlots: (payload: EquipmentSlotParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/GetReservationSlots`;\r\n return httpClient.post(url, data);\r\n },\r\n validateDuration: (payload: EquipmentsChangeStateParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/ValidateDuration`;\r\n return httpClient.post(url, data);\r\n },\r\n validatePrerequisite: (payload: EquipmentsChangeStateParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/ValidatePrerequisite`;\r\n return httpClient.post(url, data);\r\n },\r\n validatePermissions: (payload: EquipmentsChangeStateParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/ValidatePermissions`;\r\n return httpClient.post(url, data);\r\n },\r\n changeStatus: (payload: EquipmentsChangeStateParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/ChangeStatus`;\r\n return httpClient.post(url, data);\r\n },\r\n getEquipmentsData: (payload: {\r\n q?: string;\r\n value?: string;\r\n ids?: string;\r\n sgid?: string;\r\n avaEqu: boolean;\r\n resStart?: string;\r\n resEnd?: string;\r\n budgetId?: number;\r\n budgetExperimentId?: number;\r\n mandatoryIds?: string;\r\n init?: boolean;\r\n }) => {\r\n const url = '/api/scheduler/reservationEquipments';\r\n return httpClient.get(url, payload);\r\n },\r\n createTraining: (payload: ITrainingReservations[]) => {\r\n const data = {\r\n reservations: payload,\r\n };\r\n const url = '/api/odata/v4/ReservationHistory/CreateTraining';\r\n return httpClient.post(url, data);\r\n },\r\n updateStatus: (payload: IStatusReservations[]) => {\r\n const data = {\r\n reservations: payload,\r\n };\r\n const url = '/api/odata/v4/ReservationHistory/UpdateStatus';\r\n return httpClient.post(url, data);\r\n },\r\n HasFutureReservationsHttp: (equipmentNames: ISharedReservations[]) => {\r\n const data = {\r\n reservations: equipmentNames,\r\n };\r\n // '/api/odata/v4/ReservationHistory/HasEquipmentFutureReservations'\r\n // /api/ICalController/HasFutureReservations\r\n const url = '/api/odata/v4/ReservationHistory/HasFutureReservations';\r\n return httpClient.get(url, data);\r\n },\r\n transferReservation: (payload: TransferToReservation) => {\r\n const data = {\r\n params: {\r\n User: payload.User.Id,\r\n ReservationId: payload.ReservtionId,\r\n },\r\n };\r\n const url = `/api/odata/v4/Reservations/TransferReservation`;\r\n return httpClient.post(url, data);\r\n },\r\n sendTransferNotification: (payload: TransferToReservation) => {\r\n const data = {\r\n params: {\r\n User: payload.User.Id,\r\n ReservationId: payload.ReservtionId,\r\n },\r\n };\r\n const url = `/api/odata/v4/Reservations/SendTranserNotification`;\r\n return httpClient.post(url, data);\r\n },\r\n sendCancelTransferNotification: (payload: TransferToReservation) => {\r\n const data = {\r\n params: {\r\n User: payload.User.Id,\r\n ReservationId: payload.ReservtionId,\r\n },\r\n };\r\n const url = `/api/odata/v4/Reservations/SendCancelTranserNotification`;\r\n return httpClient.post(url, data);\r\n },\r\n cancelTransferReservation: (payload: number) => {\r\n const url = `/api/odata/v4/Reservations/CancelTranser`;\r\n return httpClient.post(url, { id: payload });\r\n },\r\n sendTerminateNotification: (payload: number[]) => {\r\n const data = {\r\n ReservationIds: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/SendTerminateNotification`;\r\n return httpClient.post(url, data);\r\n },\r\n hasUsage: (payload: { resId: number; eqId: number }) => {\r\n const url = `/api/odata/v4/Reservations/HasUsage`;\r\n return httpClient.post(url, { id: payload.resId, eqid: payload.eqId });\r\n },\r\n endUsage: (id: number, data: EndUsageData): Promise => {\r\n const url = `/api/odata/v4/Reservations/EndReservationUsage`;\r\n const params = {\r\n id: id,\r\n remarks: data.remarks ?? '',\r\n sids:\r\n data.services.map(s => s.service?.Id + ':' + s.quantity).join(',') ??\r\n '',\r\n };\r\n return httpClient.post(url, params);\r\n },\r\n userCanBookEquipment: (payload: number) => {\r\n const data = {\r\n equipmentid: payload,\r\n };\r\n const url = `/api/odata/v4/Reservations/UserCanBookEquipment`;\r\n return httpClient.post(url, data);\r\n },\r\n\r\n // calculateCredit: (payload: ReservationCreditModel) => {\r\n // const url = `/api/odata/v4/Reservations/CalculateReservationCredit`;\r\n // // const data = {\r\n // // Id: payload.Id,\r\n // // Services: payload.Services,\r\n // // //AccServices: payload.AccServices,\r\n // // Username: payload.Username,\r\n // // UserGroupId: payload.UserGroupId,\r\n // // BudgetId: payload.BudgetId,\r\n // // Tutoring: payload.Tutoring,\r\n // // TrainingSignUp: payload.TrainingSignUp,\r\n // // BudgetPercent: payload.BudgetPercent,\r\n // // };\r\n // return httpClient.post(url, payload);\r\n // },\r\n};\r\n","/**\r\n * This function has two roles:\r\n * 1) If the `id` is empty it assings something so does i18next doesn't throw error. Typescript should prevent this anyway\r\n * 2) It has a hand-picked name `_t` (to be short) and should only be used while using objects instead of strings for translation keys\r\n * `internals/extractMessages/stringfyTranslations.js` script converts this to `t('a.b.c')` style before `i18next-scanner` scans the file contents\r\n * so that our json objects can also be recognized by the scanner.\r\n */\r\nexport const _t = (id: string, ...rest: any[]): [string, ...any[]] => {\r\n if (!id) {\r\n id = '_NOT_TRANSLATED_';\r\n }\r\n return [id, ...rest];\r\n};\r\n","import * as React from 'react';\r\nimport { Box, MenuItem } from '@material-ui/core';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { IFilterSettings } from './IFilterSettings';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { FilterValueType } from './FilterValueType';\r\n//hide for now all the expressions between the field name and its value (mainly “is”) ? We will go back to these once we implement additional expressions and not just one per each filter\r\n//import { operatorToString } from 'api/odata/ODataFilter';\r\nimport { ButtonLabel } from 'app/components/Typography';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Entity, EntityType } from 'types/common';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { isArray } from 'lodash';\r\nimport {\r\n Directions,\r\n FilterBox,\r\n} from 'app/components/BasicTable/BasicFilter/FilterBox';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { BasicTypography } from 'app/components/Typography/BasicTypography';\r\n\r\nexport interface AppliedFilterComponentProps {\r\n item: IFilterSettings;\r\n onRemove: (item: IFilterSettings) => void;\r\n onApply: (item: IFilterSettings) => void;\r\n direction: Directions;\r\n}\r\n\r\nexport function IsEntity(\r\n entity: FilterValueType | undefined,\r\n): entity is Entity {\r\n if (entity === undefined || entity === null) {\r\n return false;\r\n }\r\n if ((entity as Entity).Id !== undefined) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function IsEntityType(\r\n entity: FilterValueType | undefined,\r\n): entity is EntityType {\r\n if (entity === undefined || entity === null) {\r\n return false;\r\n }\r\n return (entity as EntityType).Id !== undefined;\r\n}\r\n\r\nexport function IsEntityArray(entity: FilterValueType | undefined) {\r\n if (entity === undefined || entity === null) {\r\n return false;\r\n }\r\n if (!isArray(entity)) {\r\n return false;\r\n }\r\n if ((entity as Entity[])?.some(f => f.Id !== undefined)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function IsEntityString(\r\n entity: FilterValueType | undefined,\r\n): entity is Entity {\r\n if (entity === undefined || entity === null) {\r\n return false;\r\n }\r\n if ((entity as Entity).Id !== undefined) {\r\n return typeof (entity as Entity).Id == 'string';\r\n }\r\n return false;\r\n}\r\n\r\nexport function IsEmptyArray(entity: FilterValueType | undefined): boolean {\r\n return Array.isArray(entity) && !entity.length;\r\n}\r\n\r\nexport function IsNotEmptyArray(\r\n entity: FilterValueType | undefined,\r\n): entity is Extract {\r\n return Array.isArray(entity) && !!entity.length;\r\n}\r\n\r\nfunction PureAppliedFilterComponent({\r\n item,\r\n onRemove,\r\n onApply,\r\n direction = 'vertical',\r\n}: AppliedFilterComponentProps) {\r\n const { checkIsMobile, isLandscape } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const showShortView = React.useMemo(() => {\r\n return isMobile || (sidePanelOpen && !sidePanelExpanded);\r\n }, [isMobile, sidePanelExpanded, sidePanelOpen]);\r\n const { t } = useTranslation();\r\n const [value, setValue] = React.useState(\r\n item.value,\r\n );\r\n React.useEffect(() => {\r\n setValue(item.value);\r\n }, [item.value]);\r\n\r\n const [open, setOpen] = React.useState(item.open);\r\n const [predict, setPredict] = React.useState<(string | Condition)[]>(\r\n !!item.filterData && item.filterData.length > 0 && !!item.filterPredicates\r\n ? item.filterData.map(f =>\r\n !!item.filterPredicates\r\n ? item.filterPredicates(f.depValue, f.depKey)[0]\r\n : '',\r\n )\r\n : [],\r\n );\r\n const onOpen = () => {\r\n setPredict(() =>\r\n !!item.filterData && item.filterData.length > 0 && !!item.filterPredicates\r\n ? item.filterData.map(f =>\r\n !!item.filterPredicates\r\n ? item.filterPredicates(f.depValue, f.depKey)[0]\r\n : '',\r\n )\r\n : [],\r\n );\r\n };\r\n\r\n const handleChange = value => {\r\n setValue(value);\r\n applyItem(value);\r\n };\r\n\r\n const applyItem = value => {\r\n setOpen(false);\r\n onApply({\r\n ...item,\r\n ...{ value: value },\r\n ...{ open: false },\r\n });\r\n };\r\n\r\n const handleRemoveClick = () => {\r\n onRemove(item);\r\n };\r\n //const handleClickAway = () => {};\r\n\r\n const labelFunc =\r\n value instanceof PresetDatesRange\r\n ? (date: MaterialUiPickersDate, invalidLabel: string) => {\r\n const res = dateUtils.shortDateTimeFormat(date);\r\n return res === null ? invalidLabel : res;\r\n }\r\n : undefined;\r\n const canHaveInversed = React.useMemo(() => {\r\n return !item.customFilter && !item.inversionDisabled;\r\n }, [item.customFilter, item.inversionDisabled]);\r\n const toggleInversed = React.useCallback(\r\n (isInversed: boolean) => {\r\n if (!!item.isInversed === isInversed) return;\r\n onApply({ ...item, isInversed: !item.isInversed });\r\n },\r\n [item, onApply],\r\n );\r\n return (isMobile || showShortView) && !isLandscape ? (\r\n \r\n \r\n \r\n \r\n {item.displayName}\r\n \r\n \r\n \r\n \r\n \r\n \r\n [\r\n {\r\n toggleInversed(false);\r\n close();\r\n }}\r\n selected={!item.isInversed}\r\n >\r\n {'Is'}\r\n ,\r\n {\r\n toggleInversed(true);\r\n close();\r\n }}\r\n selected={!!item.isInversed}\r\n >\r\n {'Is not'}\r\n ,\r\n ]}\r\n >\r\n {item.isInversed ? 'Is not' : 'Is'}\r\n \r\n\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n {/* */}\r\n \r\n \r\n {item.displayName}\r\n \r\n [\r\n {\r\n toggleInversed(false);\r\n close();\r\n }}\r\n selected={!item.isInversed}\r\n >\r\n {'Is'}\r\n ,\r\n {\r\n toggleInversed(true);\r\n close();\r\n }}\r\n selected={!!item.isInversed}\r\n >\r\n {'Is not'}\r\n ,\r\n ]}\r\n >\r\n {item.isInversed ? 'Is not' : 'Is'}\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\nexport const AppliedFilterComponent = React.memo(\r\n PureAppliedFilterComponent,\r\n (prevProps, nextProps) => {\r\n const x = props =>\r\n JSON.stringify({\r\n fieldName: props.item.fieldName,\r\n fieldName1: props.item.fieldName1,\r\n value: props.item.value,\r\n predicates: props.item.predicetes,\r\n isInversed: props.item.isInversed,\r\n });\r\n var result = x(prevProps) === x(nextProps);\r\n\r\n return result;\r\n },\r\n) as typeof PureAppliedFilterComponent;\r\n","/**\r\n *\r\n * EditableCell\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Row } from 'react-table';\r\nimport { IRow } from 'app/components/BasicTable';\r\nimport { FieldProps } from 'formik';\r\n\r\nexport interface EditableCellProps {\r\n value: TValue;\r\n row: Row;\r\n column: TColumn;\r\n updateMyData: any; // This is a custom function that we supplied to our table instance\r\n}\r\n\r\nexport interface BaseInputProps {\r\n onChange: (value: TValue) => void;\r\n name?: string;\r\n value: TValue;\r\n onBlur: React.FocusEventHandler;\r\n error?: boolean;\r\n helperText?: string;\r\n}\r\n\r\nexport function withPPP(\r\n Component: React.FunctionComponent>,\r\n) {\r\n return ({\r\n field,\r\n form,\r\n meta,\r\n ...props\r\n }: React.PropsWithChildren & FieldProps>) => {\r\n const {\r\n onChange: formikOnChange,\r\n multiple,\r\n checked,\r\n ...fieldProps\r\n } = field;\r\n const { onChange: componentOnChange, ...compProps } = props;\r\n const handleChange = value => {\r\n componentOnChange?.(value);\r\n formikOnChange?.({\r\n target: {\r\n name: field.name,\r\n value: value,\r\n },\r\n });\r\n };\r\n return ;\r\n };\r\n}\r\n\r\nexport interface EditorProps {\r\n value: TValue;\r\n onChange: (value: TValue) => void;\r\n onBlur: (event: React.FocusEvent) => void;\r\n id?: string;\r\n label?: string;\r\n name: string;\r\n error?: boolean;\r\n helperText?: string;\r\n parentValue?: any;\r\n info?: string;\r\n autoFocus?: boolean;\r\n}\r\n\r\nexport function EditableCell(\r\n WrappedComponent: React.FunctionComponent>,\r\n) {\r\n return function Comp({\r\n value: initialValue,\r\n row,\r\n column: { id },\r\n updateMyData, // This is a custom function that we supplied to our table instance\r\n ...props\r\n }: EditableCellProps) {\r\n const [value, setValue] = React.useState(initialValue);\r\n const onChange = event => {\r\n const value = event.target.value;\r\n setValue(value);\r\n const payload = { Id: row.original.Id };\r\n payload[id] = value;\r\n updateMyData(payload);\r\n };\r\n\r\n // We'll only update the external data when the input is blurred\r\n const onBlur = React.useCallback(() => {\r\n if (value !== initialValue) {\r\n const payload = { Id: row.original.Id };\r\n payload[id] = value;\r\n // updateMyData(payload);\r\n }\r\n }, [id, initialValue, row.original.Id, value]);\r\n // If the initialValue is changed external, sync it up with our state\r\n React.useEffect(() => {\r\n setValue(initialValue);\r\n }, [initialValue]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n );\r\n };\r\n}\r\n","/**\r\n *\r\n * SelectedRowsActionIconButton\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { useState } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { ActionIconButton } from '../../../BasicButtons/ActionIconButton';\r\nimport { DialogConfirm } from '../../../DialogConfirm';\r\nimport { ActionButton } from 'app/components/BasicButtons/ActionButton';\r\nimport { DialogTypeVariants } from 'app/components/DialogComponents/DialogTypes';\r\nimport { IResponseType, IResponseTypeWithLink } from 'types/ResponseType';\r\nimport { Notification } from 'types/Notification';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { ICanRaiseBasicTableRefreshEvent } from '../../ControlledTable/ControlledTableProps';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface IRowsActionComponent {\r\n rows: TRow[];\r\n}\r\nexport interface SelectedRowsActionIconButtonProps\r\n extends IRowsActionComponent,\r\n ICanRaiseBasicTableRefreshEvent {\r\n icon?: IconProp;\r\n title: string;\r\n subtitle?: React.ReactNode;\r\n text?: string;\r\n action: () => Promise;\r\n snackBarMessageType?: SnackBarMessageType;\r\n confirm?: boolean;\r\n update?: boolean;\r\n confirmTitle?: string | React.ReactNode;\r\n confirmBody?: React.ReactNode;\r\n confirmButtonLabel?: string;\r\n cancelButtonLabel?: string;\r\n variantButton?: 'button' | 'icon';\r\n updateDialogVariant?: DialogTypeVariants;\r\n validConfirm?: boolean;\r\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false;\r\n onHandleClose?: () => void;\r\n disabled?: boolean;\r\n toggleAllRowsSelected?: (value?: boolean) => void;\r\n}\r\n\r\nexport function SelectedRowsActionIconButton({\r\n rows,\r\n title,\r\n action,\r\n snackBarMessageType,\r\n onRefresh,\r\n confirm,\r\n confirmTitle,\r\n confirmBody,\r\n confirmButtonLabel,\r\n cancelButtonLabel,\r\n variantButton,\r\n icon,\r\n text,\r\n updateDialogVariant,\r\n subtitle,\r\n validConfirm,\r\n maxWidth,\r\n onHandleClose,\r\n disabled,\r\n toggleAllRowsSelected,\r\n ...rest\r\n}: SelectedRowsActionIconButtonProps) {\r\n const { t } = useTranslation();\r\n const [busy, setBusy] = useState(false);\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const [showConfirm, setShowConfirm] = React.useState(false);\r\n\r\n const handleAction = async () => {\r\n setBusy(true);\r\n try {\r\n const response = await action();\r\n setShowConfirm(false);\r\n if (onHandleClose !== undefined) {\r\n onHandleClose();\r\n }\r\n if (response?.Id !== undefined && response.link !== undefined) {\r\n let resp = response as IResponseTypeWithLink;\r\n const key = response.link;\r\n var Notification = {\r\n key: key,\r\n persist: true,\r\n variant:\r\n resp.ErrorMessages.length > 0\r\n ? 'error'\r\n : resp.WarningMessages.length > 0\r\n ? 'warning'\r\n : resp.SuccessMessages.length > 0\r\n ? 'success'\r\n : 'default',\r\n message:\r\n resp.ErrorMessages.length > 0\r\n ? resp.ErrorMessages[0]\r\n : resp.WarningMessages.length > 0\r\n ? resp.WarningMessages[0]\r\n : resp.SuccessMessages.length > 0\r\n ? resp.SuccessMessages[0]\r\n : '',\r\n messageType: SnackBarMessageType.showLinkMessage,\r\n messageTypeProps: {\r\n Id: 0,\r\n created: true,\r\n itemName:\r\n resp.ErrorMessages.length > 0\r\n ? resp.ErrorMessages[0]\r\n : resp.WarningMessages.length > 0\r\n ? resp.WarningMessages[0]\r\n : resp.SuccessMessages.length > 0\r\n ? resp.SuccessMessages[0]\r\n : '',\r\n linkUrl: resp.link,\r\n linkText: resp.Id?.toString(),\r\n detailsType: undefined,\r\n detailsTypeProps: undefined,\r\n },\r\n } as Notification;\r\n if (key !== undefined) {\r\n Notification = Object.assign(Notification, { key: key });\r\n }\r\n dispatch(actions.addNotification(Notification));\r\n } else {\r\n let respm = response as IResponseType;\r\n if (respm.ErrorMessages.length > 0) {\r\n respm.ErrorMessages.forEach(errmsg =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: errmsg,\r\n messageType: snackBarMessageType,\r\n }),\r\n ),\r\n );\r\n }\r\n if (respm.SuccessMessages.length > 0) {\r\n respm.SuccessMessages.forEach(sccmsg =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'success',\r\n message: sccmsg,\r\n messageType: snackBarMessageType,\r\n }),\r\n ),\r\n );\r\n }\r\n if (respm.WarningMessages.length > 0) {\r\n respm.WarningMessages.forEach(wrnmsg =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'warning',\r\n message: wrnmsg,\r\n messageType: snackBarMessageType,\r\n }),\r\n ),\r\n );\r\n }\r\n }\r\n setBusy(false);\r\n toggleAllRowsSelected?.(false);\r\n onRefresh?.();\r\n } catch (error) {\r\n setShowConfirm(false);\r\n if (onHandleClose !== undefined) {\r\n onHandleClose();\r\n }\r\n\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message:\r\n typeof error === 'string' ? error : t(translations.AnErrorOccurred),\r\n }),\r\n );\r\n\r\n setBusy(false);\r\n }\r\n };\r\n const handleClick = () => {\r\n if (confirm) {\r\n setShowConfirm(() => true);\r\n } else {\r\n handleAction();\r\n }\r\n };\r\n const handleConfirmClick = () => {\r\n handleAction();\r\n };\r\n const handleCloseClick = () => {\r\n setShowConfirm(false);\r\n if (onHandleClose !== undefined) {\r\n onHandleClose();\r\n }\r\n };\r\n\r\n return (\r\n \r\n {showConfirm && (\r\n {'Are you sure?'}\r\n }\r\n confirmButtonLabel={confirmButtonLabel || 'Ok'}\r\n cancelButtonLabel={cancelButtonLabel || 'Cancel'}\r\n onConfirm={handleConfirmClick}\r\n onCancel={handleCloseClick}\r\n isOpen={showConfirm}\r\n processing={busy}\r\n disabled={busy || !validConfirm}\r\n />\r\n )}\r\n {variantButton === 'icon' && icon ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * BooleanPickerFilter\r\n *\r\n */\r\nimport { BooleanPicker } from 'app/components/BooleanPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport function BooleanPickerFilter(\r\n props: IFilterComponentProps & {\r\n trueName?: string;\r\n falseName?: string;\r\n info?: string;\r\n },\r\n) {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n}\r\nexport default BooleanPickerFilter;\r\n","/**\r\n *\r\n * ActionButton\r\n *\r\n */\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport * as React from 'react';\r\nimport { Button, ButtonsVariant } from '../Button';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { PropTypes } from '@material-ui/core';\r\n\r\nexport interface ActionButtonProps {\r\n onClick?: React.MouseEventHandler;\r\n disabled?: boolean;\r\n starticon?: IconProp;\r\n endicon?: IconProp;\r\n text: string;\r\n title?: string;\r\n variant?: ButtonsVariant;\r\n size?: 'large' | 'medium' | 'small';\r\n autoFocus?: boolean;\r\n processing?: boolean;\r\n type?: 'button' | 'submit' | 'reset';\r\n target?: string;\r\n id?: string;\r\n href?: string | IPathAndQuery;\r\n color?: PropTypes.Color;\r\n fullWidth?: boolean;\r\n}\r\nexport function ActionButton({\r\n disabled,\r\n onClick,\r\n title,\r\n starticon,\r\n endicon,\r\n text,\r\n variant,\r\n size,\r\n processing,\r\n fullWidth,\r\n id,\r\n ...other\r\n}: ActionButtonProps) {\r\n return title ? (\r\n \r\n \r\n }\r\n endIcon={endicon && }\r\n id={id}\r\n fullWidth={fullWidth}\r\n processing={processing}\r\n {...other}\r\n >\r\n <>{text}\r\n \r\n \r\n \r\n ) : (\r\n }\r\n endIcon={endicon && }\r\n id={id}\r\n processing={processing}\r\n fullWidth={fullWidth}\r\n {...other}\r\n >\r\n <>{text}\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { StandardInput } from '../BaseInputs/StandardInput';\r\nimport clsx from 'clsx';\r\nimport {\r\n FormControl,\r\n FormHelperText,\r\n InputLabel,\r\n Select,\r\n withStyles,\r\n} from '@material-ui/core';\r\nimport { BaseFieldProps } from './BaseFieldDefinition';\r\nimport FilledInput from '../BaseInputs/FilledInput';\r\nimport { capitalize } from 'lodash';\r\n\r\nexport const styles = {\r\n /* Styles applied to the root element. */\r\n root: {\r\n '&.startIcon': {\r\n '& > label': {\r\n marginLeft: '24px',\r\n },\r\n },\r\n },\r\n};\r\nconst variantComponent = {\r\n standard: StandardInput,\r\n filled: FilledInput,\r\n outlined: StandardInput,\r\n};\r\nexport const BaseField = React.forwardRef(function (\r\n props,\r\n ref,\r\n) {\r\n const {\r\n autoComplete,\r\n autoFocus = false,\r\n children,\r\n classes,\r\n className,\r\n color = 'primary',\r\n defaultValue,\r\n disabled = false,\r\n error = false,\r\n FormHelperTextProps,\r\n fullWidth = false,\r\n helperText,\r\n hiddenLabel,\r\n id,\r\n InputLabelProps,\r\n inputProps,\r\n InputProps,\r\n inputRef,\r\n focused,\r\n label,\r\n multiline = false,\r\n name,\r\n onBlur,\r\n onChange,\r\n onFocus,\r\n placeholder,\r\n required = false,\r\n rows,\r\n rowsMax,\r\n rowsMin,\r\n select = false,\r\n SelectProps,\r\n type,\r\n value,\r\n variant = 'filled',\r\n info,\r\n size = 'large',\r\n ...other\r\n } = props;\r\n\r\n let inputMore: any = {};\r\n if (variant === 'outlined') {\r\n if (InputLabelProps && typeof InputLabelProps.shrink !== 'undefined') {\r\n inputMore.notched = InputLabelProps.shrink;\r\n }\r\n if (label) {\r\n const displayRequired = InputLabelProps?.required ?? required;\r\n inputMore.label = (\r\n \r\n {label}\r\n {displayRequired && '\\u00a0*'}\r\n \r\n );\r\n }\r\n }\r\n // if (info) {\r\n // InputProps?.endAdornment = ;\r\n // }\r\n if (select) {\r\n // unset defaults from textbox inputs\r\n if (!SelectProps || !SelectProps.native) {\r\n inputMore.id = undefined;\r\n }\r\n inputMore['aria-describedby'] = undefined;\r\n }\r\n const requiredPlaseholder = placeholder !== undefined && required && !label;\r\n const helperTextId = helperText && id ? `${id}-helper-text` : undefined;\r\n const inputLabelId = label && id ? `${id}-label` : undefined;\r\n const InputComponent = variantComponent[variant];\r\n const sizeClass = `inputSize${capitalize(size ?? 'large')}`;\r\n const InputElement = (\r\n \r\n );\r\n const LabelElement = (\r\n \r\n {label}\r\n \r\n );\r\n return (\r\n \r\n {label && LabelElement}\r\n\r\n {select ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n InputElement\r\n )}\r\n\r\n {helperText && (\r\n \r\n {typeof helperText === 'string'\r\n ? helperText\r\n : JSON.stringify(helperText, null, 2)}\r\n \r\n )}\r\n \r\n );\r\n});\r\nexport default withStyles(styles, { name: 'BaseTextField' })(BaseField);\r\n//export default function BaseField(props: BaseFieldProps): JSX.Element;\r\n","import * as React from 'react';\r\n\r\nexport interface BooleanRenderProps {\r\n value?: boolean | null;\r\n}\r\n\r\nexport const BooleanRender = (props: BooleanRenderProps) => {\r\n return {props.value === true ? 'Yes' : 'No'};\r\n};\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { CheckColor } from '.';\r\n\r\nexport const useStyles = makeStyles<\r\n Theme,\r\n {\r\n size?: 'medium' | 'small';\r\n color?: CheckColor;\r\n withPadding?: boolean;\r\n danger?: boolean;\r\n }\r\n>((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n '&[class*=\"PrivateSwitchBase-root\"]': {\r\n padding: props => (props.withPadding ? 9 : 0),\r\n },\r\n '&:hover': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n icon: {\r\n borderRadius: 4,\r\n width: props => (props.size === 'medium' ? 20 : 16),\r\n height: props => (props.size === 'medium' ? 20 : 16),\r\n boxShadow: props =>\r\n props.danger\r\n ? `inset 0 0 0 1px ${bookitColors.danger.borders}, inset 0 -1px 0 ${bookitColors.danger.borders}`\r\n : `inset 0 0 0 1px ${bookitColors.grayscale.grayBorders}, inset 0 -1px 0 ${bookitColors.grayscale.grayBorders}`,\r\n //border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n backgroundColor: bookitColors.base.white,\r\n backgroundImage:\r\n 'linear-gradient(180deg,hsla(0,0%,100%,.8),hsla(0,0%,100%,0))',\r\n '$root.Mui-focusVisible &': {\r\n // outline: `1px auto ${blackGray.colorGrayComponentsLight}`,\r\n // outlineOffset: 1,\r\n boxShadow: props =>\r\n props.danger\r\n ? `inset 0 0 0 2px ${bookitColors.danger.componentsLight}, inset 0 -1px 0 ${bookitColors.danger.componentsLight}`\r\n : `inset 0 0 0 2px ${bookitColors.grayscale.grayComponentsLight}, inset 0 -1px 0 ${bookitColors.grayscale.grayComponentsLight}`,\r\n },\r\n 'input:hover ~ &': {\r\n // backgroundColor: '#ebf1f5',\r\n //border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n boxShadow: props =>\r\n props.danger\r\n ? `inset 0 0 0 1px ${bookitColors.danger.borders}, inset 0 -1px 0 ${bookitColors.danger.borders}`\r\n : `inset 0 0 0 1px ${bookitColors.grayscale.grayBorders}, inset 0 -1px 0 ${bookitColors.grayscale.grayBorders}`,\r\n },\r\n 'input:disabled ~ &': {\r\n boxShadow: props =>\r\n props.danger\r\n ? `inset 0 0 0 1px ${bookitColors.danger.disabled}, inset 0 -1px 0 ${bookitColors.danger.disabled}`\r\n : `inset 0 0 0 1px ${bookitColors.grayscale.graySelection}, inset 0 -1px 0 ${bookitColors.grayscale.graySelection}`,\r\n background: props =>\r\n props.danger\r\n ? bookitColors.danger.background\r\n : bookitColors.grayscale.grayBackground,\r\n },\r\n },\r\n checkedIcon: {\r\n boxShadow: 'unset',\r\n backgroundColor: props =>\r\n props.danger\r\n ? bookitColors.danger.regular\r\n : // : props.color === 'secondary'\r\n // ? bookitColors.success.regular\r\n bookitColors.primary.regular,\r\n backgroundImage:\r\n 'linear-gradient(180deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,0))',\r\n '&:before': {\r\n display: 'block',\r\n width: props => (props.size === 'medium' ? 20 : 16),\r\n height: props => (props.size === 'medium' ? 20 : 16),\r\n backgroundImage:\r\n \"url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath\" +\r\n \" fill-rule='evenodd' clip-rule='evenodd' d='M12 5c-.28 0-.53.11-.71.29L7 9.59l-2.29-2.3a1.003 \" +\r\n \"1.003 0 00-1.42 1.42l3 3c.18.18.43.29.71.29s.53-.11.71-.29l5-5A1.003 1.003 0 0012 5z' fill='%23fff'/%3E%3C/svg%3E\\\")\",\r\n content: '\"\"',\r\n },\r\n 'input:hover ~ &': {\r\n backgroundColor: props =>\r\n props.danger\r\n ? bookitColors.danger.hover\r\n : // : props.color === 'secondary'\r\n // ? bookitColors.success.hover\r\n bookitColors.primary.hover,\r\n boxShadow: 'unset',\r\n },\r\n 'input:disabled ~ &': {\r\n boxShadow: 'unset', //`inset 0 0 0 1px ${blackGray.colorDividers}, inset 0 -1px 0 ${blackGray.colorDividers}`,\r\n background: props =>\r\n props.danger\r\n ? bookitColors.danger.disabled\r\n : // : props.color === 'secondary'\r\n // ? bookitColors.success.disabled\r\n bookitColors.primary.disabled,\r\n },\r\n },\r\n indeterminateIcon: {\r\n boxShadow: 'unset',\r\n backgroundColor: props =>\r\n props.danger\r\n ? bookitColors.danger.regular\r\n : // : props.color === 'secondary'\r\n // ? bookitColors.success.regular\r\n bookitColors.primary.regular,\r\n backgroundImage:\r\n 'linear-gradient(180deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,0))',\r\n '&:before': {\r\n display: 'block',\r\n width: props => (props.size === 'medium' ? 20 : 16),\r\n height: props => (props.size === 'medium' ? 20 : 16),\r\n backgroundImage:\r\n \"url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-54 -24 516 560'%3E%3Cpath\" +\r\n \" fill-rule='evenodd' clip-rule='evenodd' d='M400 288h-352c-17.69 \" +\r\n \"0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z' fill='%23fff'/%3E%3C/svg%3E\\\")\",\r\n content: '\"\"',\r\n },\r\n 'input:hover ~ &': {\r\n backgroundColor: props =>\r\n props.danger\r\n ? bookitColors.danger.hover\r\n : // : props.color === 'secondary'\r\n // ? bookitColors.success.hover\r\n bookitColors.primary.hover,\r\n boxShadow: 'unset',\r\n },\r\n 'input:disabled ~ &': {\r\n boxShadow: 'unset', //`inset 0 0 0 1px ${blackGray.colorDividers}, inset 0 -1px 0 ${blackGray.colorDividers}`,\r\n background: props =>\r\n props.danger\r\n ? bookitColors.danger.disabled\r\n : // : props.color === 'secondary'\r\n // ? bookitColors.success.disabled\r\n bookitColors.primary.disabled,\r\n },\r\n },\r\n }),\r\n);\r\n","import { Checkbox, CheckboxProps } from '@material-ui/core';\r\nimport clsx from 'clsx';\r\nimport { useStyles } from './styles';\r\n\r\nexport type CheckColor = 'primary';\r\n\r\nexport interface CheckProps extends Omit {\r\n color?: CheckColor;\r\n checkicon?: React.ReactNode;\r\n uncheckicon?: React.ReactNode;\r\n indetermicon?: React.ReactNode;\r\n withPadding?: boolean;\r\n danger?: boolean;\r\n label?: string;\r\n}\r\n\r\nexport function Check(props: CheckProps) {\r\n const {\r\n color,\r\n checkicon,\r\n uncheckicon,\r\n indetermicon,\r\n label,\r\n withPadding = true,\r\n danger,\r\n size = 'medium',\r\n ...other\r\n } = props;\r\n const classes = useStyles({\r\n size: size,\r\n color: color,\r\n withPadding: withPadding,\r\n danger: danger,\r\n });\r\n return (\r\n \r\n )\r\n }\r\n icon={!!uncheckicon ? uncheckicon : }\r\n indeterminateIcon={\r\n !!indetermicon ? (\r\n indetermicon\r\n ) : (\r\n \r\n )\r\n }\r\n inputProps={{ 'aria-label': !!label ? label : 'decorative checkbox' }}\r\n size={size}\r\n color={'default'}\r\n {...other}\r\n />\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n BookitDatePicker,\r\n BookitDatePickerProps,\r\n} from 'app/components/BookitDatePicker';\r\nimport { IFieldProps } from '../FormRender/IFormFieldSetting';\r\n\r\n/**\r\n * TODO:\r\n * A non-serializable value was detected in an action, in the path: `payload.ReceivedAt`. Value: \r\nDate Sun May 02 2021 14:58:00 GMT+0300 (Israel Daylight Time)\r\n \r\nTake a look at the logic that dispatched this action: \r\nObject { type: \"animals/insertItem\", payload: {…} }\r\n \r\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string…t-least-serializable-why-should-my-action-types-be-constants) \r\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)\r\n * */\r\n\r\nexport const FormBookitDatePicker = ({\r\n label,\r\n disableFuture,\r\n disablePast,\r\n ...props\r\n}: FieldHookConfig &\r\n Pick<\r\n BookitDatePickerProps,\r\n | 'endTime'\r\n | 'truncateTime'\r\n | 'minDate'\r\n | 'maxDate'\r\n | 'labelFunc'\r\n | 'clearable'\r\n | 'fullScreen'\r\n > &\r\n IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n fullWidth={true}\r\n helperText={meta.error}\r\n labelFunc={props.labelFunc}\r\n info={props.info}\r\n disabled={props.disabled}\r\n clearable={props.clearable}\r\n fullScreen={props.fullScreen}\r\n endTime={props.endTime}\r\n truncateTime={props.truncateTime}\r\n variant=\"date\"\r\n autoFocus={props.autoFocus}\r\n minDate={props.minDate}\r\n maxDate={props.maxDate}\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * DatesRangeFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IFilterComponentProps } from 'app/components/BasicTable/Filters/IFilterComponentProps';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport {\r\n getPeriodTypesEntity,\r\n PeriodTypes,\r\n PeriodTypesEntity,\r\n} from 'app/components/DatePeriods';\r\nimport { DatesRange } from 'types/DatesRange';\r\nimport { DatePeriodsPicker } from 'app/components/pickers/DatePeriodsPicker';\r\nimport { BookitDateTimePicker } from 'app/components/BookitDatePicker/BookitDateTimePicker';\r\n\r\n/**\r\n * Date picker to be used as a BasicTable filter component\r\n */\r\nconst allPeriods: Array = [\r\n 'CustomDate',\r\n 'Today',\r\n 'TodayTomorrow',\r\n 'ThisWeek',\r\n 'NextWeek',\r\n 'ThisMonth',\r\n 'NextMonth',\r\n 'ThisQuarter',\r\n 'NextQuarter',\r\n 'ThisYear',\r\n 'NextYear',\r\n 'LastWeek',\r\n 'LastMonth',\r\n 'LastQuarter',\r\n 'LastYear',\r\n];\r\nconst noFuturePeriods: Array = [\r\n 'CustomDate',\r\n 'ThisWeek',\r\n 'ThisMonth',\r\n 'ThisQuarter',\r\n 'ThisYear',\r\n 'LastWeek',\r\n 'LastMonth',\r\n 'LastQuarter',\r\n 'LastYear',\r\n];\r\n\r\nexport interface DatesRangeFilterProps extends IFilterComponentProps {\r\n noFuturePeriods?: boolean;\r\n}\r\nexport const DatesRangeFilter = (props: DatesRangeFilterProps) => {\r\n const { t } = useTranslation();\r\n const [value, setValue] = React.useState(\r\n props.value !== undefined ? props.value : new PresetDatesRange(),\r\n );\r\n const handleStartOnChange = (date: MaterialUiPickersDate) => {\r\n const changedValue = Object.assign(new PresetDatesRange(), value, {\r\n start: date,\r\n });\r\n setValue(changedValue);\r\n if (props.onChange !== undefined) {\r\n props.onChange(changedValue);\r\n }\r\n };\r\n const handleEndOnChange = (date: MaterialUiPickersDate) => {\r\n const changedValue = Object.assign(new PresetDatesRange(), value, {\r\n end: date,\r\n });\r\n setValue(changedValue);\r\n if (props.onChange !== undefined) {\r\n props.onChange(changedValue);\r\n }\r\n };\r\n\r\n const handleTypeChange = (periodValue: PeriodTypesEntity | null) => {\r\n let changedValue = Object.assign(\r\n new PresetDatesRange(),\r\n {\r\n type:\r\n (periodValue as PeriodTypesEntity) ??\r\n (getPeriodTypesEntity('CustomDate') as PeriodTypesEntity),\r\n },\r\n DatesRange.fromPreset(\r\n (periodValue as PeriodTypesEntity) ??\r\n (getPeriodTypesEntity('CustomDate') as PeriodTypesEntity),\r\n null,\r\n null,\r\n ),\r\n );\r\n setValue(state => changedValue);\r\n props.onChange(changedValue);\r\n };\r\n return (\r\n <>\r\n {value !== undefined && (\r\n \r\n \r\n {/* */}\r\n {value !== undefined &&\r\n value !== null &&\r\n value?.type !== undefined &&\r\n value.type.Id === 'CustomDate' && (\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\nexport default DatesRangeFilter;\r\n","import { DependencyList, useEffect, useState } from 'react';\r\n\r\nexport const useAsyncGetWthEffect = (\r\n load: () => Promise,\r\n defaultVal: T,\r\n deps?: DependencyList,\r\n setBusy?: (busy: boolean) => void,\r\n) => {\r\n const [val, setVal] = useState(defaultVal);\r\n useEffect(() => {\r\n let mounted = true;\r\n setBusy?.(true);\r\n (async () => {\r\n try {\r\n const res = await load();\r\n if (mounted) {\r\n setVal(() => res);\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n if (mounted) {\r\n setBusy?.(false);\r\n }\r\n } finally {\r\n if (mounted) {\r\n setBusy?.(false);\r\n }\r\n }\r\n })();\r\n return () => {\r\n mounted = false;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps);\r\n return val;\r\n};\r\n","import { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\n\r\nexport type OfflineServiceTypeUrl = 'base' | 'public';\r\nexport interface OfflineServiceTypePickerProps\r\n extends Omit, 'loadData'> {\r\n urlType: OfflineServiceTypeUrl;\r\n}\r\n\r\nconst url = '/api/odata/v4/OfflineServiceFilter';\r\nconst publicUrl = '/api/odata/v4/OfflineServiceFilter/AllOfflineServices';\r\n\r\nexport const loadOfflineServiceData = (\r\n predicates: (string | Condition)[] | undefined,\r\n urlType: OfflineServiceTypeUrl,\r\n globalServiceGroupFilter: Entity[],\r\n select?: (keyof IOfflineServiceFilterDto)[],\r\n expand?: keyof Pick,\r\n) => {\r\n const sourceUrl = urlType === 'public' ? publicUrl : url;\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // TODO: narrow down used properties list\r\n select:\r\n !!select && select.length > 0\r\n ? select\r\n : [\r\n 'Id',\r\n 'Name',\r\n 'ServiceGroupId',\r\n 'ServiceTypeId',\r\n 'Active',\r\n 'IntQuantityOnly',\r\n 'HideProjects',\r\n 'UnitTypeID',\r\n 'UnitTypeName',\r\n 'AllowToUser',\r\n 'Inventory',\r\n 'DefaultQuantity',\r\n 'ReservationOverlappingInventory',\r\n 'BudgetsTurnedOn',\r\n 'IsAdmin',\r\n 'StaffOnly',\r\n 'NotLessThanZero',\r\n 'TrackInventory',\r\n 'InventoryBatchesEnabled',\r\n ],\r\n expand: expand,\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\n\r\nexport function OfflineServiceTypePicker(props: OfflineServiceTypePickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadOfflineServiceData(\r\n props.predicates,\r\n props.urlType,\r\n globalServiceGroupFilter || [],\r\n );\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport function UsageRelatedFilter(\r\n Ids: number[],\r\n excludedIds: number[],\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (Ids.length > 0) {\r\n let ids = Ids.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n ids,\r\n ),\r\n );\r\n }\r\n if (excludedIds.length > 0) {\r\n let ids = excludedIds.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Excludes,\r\n ids,\r\n ),\r\n );\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n\r\nexport function ReservationsRelatedFilter(\r\n equipmentGroups: number[],\r\n optionalServiceTypes: Array>,\r\n hideProject?: boolean,\r\n allServicesAllowed?: boolean,\r\n budgetId?: number,\r\n budgetServiceGroupServicesAllowed?: boolean,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(\r\n new Condition(\r\n 'Active',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n if (equipmentGroups.length > 0) {\r\n let ids = equipmentGroups.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n ids,\r\n ),\r\n );\r\n }\r\n if (!!hideProject) {\r\n predicates.push(\r\n new Condition(\r\n 'HideProjects',\r\n ODataOperators.Equals,\r\n hideProject,\r\n ),\r\n );\r\n }\r\n let byAdmin = new Condition(\r\n 'IsAdmin',\r\n ODataOperators.Equals,\r\n true,\r\n );\r\n let byUser = new Condition(\r\n 'StaffOnly',\r\n ODataOperators.Equals,\r\n false,\r\n );\r\n predicates.push(`(${byAdmin} or ${byUser})`);\r\n if (!!budgetId && budgetId > 0 && !budgetServiceGroupServicesAllowed) {\r\n predicates.push(\r\n new Condition(\r\n 'AllowedBudgets',\r\n ODataOperators.Any,\r\n budgetId,\r\n ),\r\n );\r\n }\r\n if (!allServicesAllowed) {\r\n if (optionalServiceTypes.length > 0) {\r\n let ids = optionalServiceTypes.map(f => {\r\n return { Id: f.Id } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n ids,\r\n ),\r\n );\r\n }\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n\r\nexport function OfflineServiceRelatedFilter(\r\n relatedGroups: number[],\r\n hideProject?: boolean,\r\n budgetId?: number,\r\n budgetServiceGroupServicesAllowed?: boolean,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(\r\n new Condition(\r\n 'Active',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'ServiceTypeId',\r\n ODataOperators.Equals,\r\n 2,\r\n ),\r\n );\r\n if (relatedGroups.length > 0) {\r\n let ids = relatedGroups.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n ids,\r\n ),\r\n );\r\n }\r\n if (!!hideProject) {\r\n predicates.push(\r\n new Condition(\r\n 'HideProjects',\r\n ODataOperators.Equals,\r\n hideProject,\r\n ),\r\n );\r\n }\r\n let byAdmin = new Condition(\r\n 'IsAdmin',\r\n ODataOperators.Equals,\r\n true,\r\n );\r\n let byUser = `(${new Condition(\r\n 'StaffOnly',\r\n ODataOperators.Equals,\r\n false,\r\n )} and ${new Condition(\r\n 'AllowToUser',\r\n ODataOperators.Equals,\r\n true,\r\n )})`;\r\n predicates.push(`(${byAdmin} or ${byUser})`);\r\n if (!!budgetId && budgetId > 0 && !budgetServiceGroupServicesAllowed) {\r\n predicates.push(\r\n new Condition(\r\n 'AllowedBudgets',\r\n ODataOperators.Any,\r\n budgetId,\r\n ),\r\n );\r\n }\r\n\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n\r\nexport function RenewStockRelatedFilter(): (\r\n | string\r\n | Condition\r\n)[] {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(\r\n new Condition(\r\n 'Active',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'ServiceTypeId',\r\n ODataOperators.Equals,\r\n 2,\r\n ),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'TrackInventory',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n\r\nexport function InventoryBatchRelatedFilter(): (\r\n | string\r\n | Condition\r\n)[] {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(\r\n new Condition(\r\n 'Active',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'ServiceTypeId',\r\n ODataOperators.Equals,\r\n 2,\r\n ),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'TrackInventory',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'InventoryBatchesEnabled',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.articles || initialState;\r\n\r\nexport const selectArticles = createSelector([selectSlice], state => state);\r\n\r\nexport const selectArticlesExternalSearchResults = createSelector(\r\n [selectArticles],\r\n state => state.externalSearchResults,\r\n);\r\n\r\nexport const selectArticlesExternalSearchForm = createSelector(\r\n [selectArticles],\r\n state => state.externalSearchFormDetails,\r\n);\r\nexport const selectArticlesExternalSearchPageIndex = createSelector(\r\n [selectArticles],\r\n state => state.externalSearchPageIndex,\r\n);\r\nexport const selectArticlesExternalSearchPageSize = createSelector(\r\n [selectArticles],\r\n state => state.externalSearchPageSize,\r\n);\r\nexport const selectArticlesExternalSearchPageData = createSelector(\r\n [selectArticlesExternalSearchResults, selectArticlesExternalSearchPageIndex],\r\n (results, page) => results.data?.[page],\r\n);\r\nexport const selectArticleDetails = createSelector(\r\n [selectArticles],\r\n state => state.articleDetails,\r\n);\r\nexport const selectRefreshEditArticleAssociation = createSelector(\r\n [selectArticles],\r\n state => state.refreshEditArticleAssociation,\r\n);\r\nexport const selectArticleDetailsBusy = createSelector(\r\n [selectArticles],\r\n state => state.articleDetailsBusy,\r\n);\r\nexport const selectEditArticleAssociationBusy = createSelector(\r\n [selectArticles],\r\n state => state.editArticleAssociationBusy,\r\n);\r\n\r\nexport const selectArticleDetailsForm = createSelector(\r\n [selectArticleDetails],\r\n state => ({\r\n ...state,\r\n ...{\r\n ServiceGroupAssets:\r\n state?.Assets?.filter(\r\n f => f.Availability?.Id === AvailabilityTypes.ServiceGroup,\r\n ) ?? [],\r\n InstrumentAssets:\r\n state?.Assets?.filter(f => f.ServiceTypeId === ServiceType.Online) ??\r\n [],\r\n },\r\n }),\r\n);\r\n","import { IUtils } from '@date-io/core/IUtils';\r\nimport { validate } from '@material-ui/pickers';\r\nimport { ParsableDate } from '@material-ui/pickers/constants/prop-types';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport { DateDropDownValidationProps } from 'app/components/BookitDatePicker/DateDropDown';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport const validateError = (\r\n date: MaterialUiPickersDate | ParsableDate,\r\n propss: any,\r\n utils: IUtils,\r\n) => {\r\n let error = validate(date, utils, propss);\r\n if (error === '') {\r\n return undefined;\r\n }\r\n return error;\r\n};\r\nexport const validateDate = (\r\n day: number,\r\n month: number,\r\n year: number,\r\n props: DateDropDownValidationProps,\r\n utils: IUtils,\r\n currentDate?: Date | string | null,\r\n): React.ReactNode | undefined => {\r\n if (currentDate !== null && currentDate !== undefined) {\r\n let date = dateUtils.truncateTime(\r\n dateUtils.dateOrStringToDate(currentDate),\r\n );\r\n let opDate = dateUtils.set(date, {\r\n year: year,\r\n month: month,\r\n });\r\n let maxMonthDays = dateUtils.getDaysInMonth(opDate);\r\n if (day > maxMonthDays) {\r\n return `Invalid Date: The day can not be longer than ${maxMonthDays}.`;\r\n } else {\r\n let finalDate = dateUtils.set(opDate, { date: day });\r\n return validateError(\r\n finalDate,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n );\r\n }\r\n } else {\r\n return undefined;\r\n }\r\n};\r\nexport const validateTime = (\r\n hours: number,\r\n minutes: number,\r\n props: DateDropDownValidationProps,\r\n utils: IUtils,\r\n currentDate?: Date | string | null,\r\n ampm?: boolean,\r\n): React.ReactNode | undefined => {\r\n if (currentDate !== null && currentDate !== undefined) {\r\n let date = dateUtils.dateOrStringToDate(currentDate);\r\n let opDate = dateUtils.set(date, {\r\n hours: hours,\r\n minutes: minutes,\r\n });\r\n let finalDate = dateUtils.convertToMeridiem(\r\n opDate,\r\n dateUtils.getMeridiem(date),\r\n ampm ?? false,\r\n );\r\n return validateError(\r\n finalDate,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n};\r\nexport const checkDateInput = (\r\n dateStart: 'day' | 'month' | 'year',\r\n val?: string | null,\r\n) => {\r\n if (val === null || val === undefined) {\r\n return true;\r\n }\r\n //eslint-disable-next-line\r\n const regexDDMMYYYY = RegExp(\r\n //eslint-disable-next-line\r\n '^(((0[1-9]|[12][0-9]|30)[-/]?(0[13-9]|1[012])|31[-/]?(0[13578]|1[02])|(0[1-9]|1[0-9]|2[0-8])[-/]?02)[-/]?[0-9]{4}|29[-/]?02[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$',\r\n );\r\n const regexYYYYMMdd = RegExp(\r\n //eslint-disable-next-line\r\n '^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00)[-/]?02[-/]?29)$',\r\n );\r\n const regexMMDDYYYY = RegExp(\r\n //eslint-disable-next-line\r\n `^(((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))[-/]?[0-9]{4}|02[-/]?29[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$`,\r\n );\r\n let res =\r\n dateStart === 'day'\r\n ? regexDDMMYYYY.test(val)\r\n : dateStart === 'month'\r\n ? regexMMDDYYYY.test(val)\r\n : regexYYYYMMdd.test(val);\r\n return res;\r\n};\r\n","import { Column } from 'react-table';\r\nimport { IRow } from '../IRow';\r\n\r\nexport type ColumnWithDep = Column & {\r\n deps?: (keyof TRow)[];\r\n notShowTitle?: boolean;\r\n};\r\n\r\nexport const hasDeps = (\r\n column: Column,\r\n): column is ColumnWithDep => {\r\n return column['deps'] !== undefined && Array.isArray(column['deps']);\r\n};\r\n","import { Column, SortingRule } from 'react-table';\r\nimport { Entity } from 'types/common';\r\nimport { IRow } from '..';\r\n\r\nexport function SortByComparer(\r\n prev: readonly [SortingRule[] | undefined],\r\n next: readonly [SortingRule[] | undefined],\r\n) {\r\n if (prev[0] === undefined && next[0] === undefined) {\r\n return true;\r\n } else if (prev[0] === undefined && next[0] !== undefined) {\r\n return false;\r\n } else if (next[0] === undefined && prev[0] !== undefined) {\r\n return false;\r\n } else {\r\n if (prev[0]?.length === next[0]?.length) {\r\n if (prev[0]?.length === 0 && next[0]?.length === 0) {\r\n return true;\r\n } else {\r\n if (\r\n prev[0]?.some(\r\n f => !next[0]?.some(n => n.id === f.id && n.desc === f.desc),\r\n )\r\n ) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n}\r\nexport function ServiceGroupsComparer(\r\n prev: readonly [Entity[]],\r\n next: readonly [Entity[]],\r\n) {\r\n if (!!prev[0]) {\r\n if (prev[0].length === next[0].length) {\r\n if (prev[0].length === 0 && next[0].length === 0) {\r\n return true;\r\n } else {\r\n if (prev[0].some(f => !next[0].some(n => n.Id === f.Id))) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n return false;\r\n}\r\nexport function columnsComparer(\r\n prev: readonly [Column[]],\r\n next: readonly [Column[]],\r\n) {\r\n if (!!prev[0]) {\r\n if (prev[0].length === next[0].length) {\r\n if (prev[0].length === 0 && next[0].length === 0) {\r\n return true;\r\n } else {\r\n if (prev[0].some(f => !next[0].some(n => n.accessor === f.accessor))) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n return false;\r\n}\r\nexport function ColumnAccesorsComparer(\r\n prev: readonly [(keyof TRow)[] | undefined],\r\n next: readonly [(keyof TRow)[] | undefined],\r\n) {\r\n if (prev[0] === undefined && next[0] === undefined) {\r\n return true;\r\n } else if (prev[0] === undefined && next[0] !== undefined) {\r\n return false;\r\n } else if (next[0] === undefined && prev[0] !== undefined) {\r\n return false;\r\n } else {\r\n if (prev[0]?.length === next[0]?.length) {\r\n if (prev[0]?.length === 0 && next[0]?.length === 0) {\r\n return true;\r\n } else {\r\n if (prev[0]?.some(f => !next[0]?.some(n => n === f))) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n}\r\n","/**\r\n *\r\n * BasicTable\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n UseSortByState,\r\n UsePaginationState,\r\n SortingRule,\r\n TableState,\r\n UseGroupByState,\r\n Column,\r\n UseRowSelectState,\r\n UseGlobalFiltersState,\r\n} from 'react-table';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { CancelToken } from 'axios';\r\nimport { BasicTableProps } from './BasicTableProps';\r\nimport { IRow } from './IRow';\r\nimport { IFilterSettings } from './BasicFilter/IFilterSettings';\r\nimport {\r\n getExportParameters,\r\n buildURL,\r\n openExportLink,\r\n IPathAndQuery,\r\n getExportForImportParameters,\r\n} from 'utils/url-utils';\r\nimport { Entity } from 'types/common';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n//import { Progress } from '../LoadingIndicator';\r\nimport { buildParams } from 'api/odata/ODataParamsBuilder';\r\nimport { useConfigurableColumns } from './useConfigurableColumns';\r\nimport { ControlledTable } from './ControlledTable';\r\nimport { useMemoFilters } from './useMemoFilters';\r\nimport { selectDoRefreshTable } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { Box } from '../basic/Wrappers/Box';\r\nimport { TableSkeleton } from './components/TableSkeleton';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { hasDeps } from './types/ColumnWithDeps';\r\nimport { notUndefined } from 'utils/typeUtils';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { getColumnAccessors, TryGetExportColumns } from './ConfigurableColumns';\r\nimport { BasicTableRefreshEventHandler } from './ControlledTable/ControlledTableProps';\r\nimport { useCustomCompareMemo } from 'use-custom-compare';\r\nimport {\r\n ColumnAccesorsComparer,\r\n columnsComparer,\r\n ServiceGroupsComparer,\r\n SortByComparer,\r\n} from './Comparers';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\n\r\nexport type { IRow };\r\nexport type { BasicTableProps };\r\n\r\ntype IPartialTableState = Partial<\r\n UseSortByState &\r\n UsePaginationState &\r\n UseGroupByState &\r\n UseRowSelectState &\r\n UseGlobalFiltersState\r\n>;\r\n\r\nconst REQUEST_CANCELLED_MESSAGE = 'Request cancelled (race condition)';\r\n/**\r\n * Interface to the (initial) table state\r\n */\r\nexport interface IBasicTableState\r\n extends IPartialTableState {}\r\n\r\ninterface IDataState {\r\n data?: TRow[];\r\n dataLength?: number;\r\n controlledPageCount?: number;\r\n loading?: boolean;\r\n initComplete: boolean;\r\n}\r\n\r\nconst defaultRowIdAccessor = (row: TRow): string =>\r\n row.Id?.toString();\r\n/**\r\n * Server side driven Table component that will be reused in most of the pages\r\n * @param param0\r\n * @returns\r\n */\r\nexport function BasicTable({\r\n id,\r\n columns,\r\n initialState,\r\n api,\r\n additionalColumns,\r\n getRowId = defaultRowIdAccessor,\r\n searchColumns,\r\n useExport = true,\r\n rowActions,\r\n inlineRowActions,\r\n pageActions,\r\n screenName,\r\n selectedRowsActions,\r\n filterOpen = false,\r\n screenId,\r\n serviceGroups = [],\r\n customParams,\r\n useImportLink,\r\n importLink,\r\n importHandler,\r\n needRefresh,\r\n ServiceGroupsOptional,\r\n topAlertMessage,\r\n expandedColumns,\r\n onPageSizeChanged,\r\n onPageIndexChanged,\r\n savedListSettings,\r\n floatingTabSettings,\r\n useExportForImport,\r\n customEmptyTableSettings,\r\n exportForImportFilterKey,\r\n printing,\r\n ...props\r\n}: BasicTableProps) {\r\n const isMobile = DetectIsMobile();\r\n\r\n // data received from the server and displayed on the table\r\n const [dataState, setDataState, extendDataState] = useAsyncExtendedState<\r\n IDataState\r\n >({ initComplete: false });\r\n // reference to the show/hide filters button\r\n // data length - total number of the records\r\n //const [dataLength, setDataLength] = React.useState(0);\r\n // page count derived from total number of the records\r\n // this is passed to the react-table hook\r\n //const [controlledPageCount, setControlledPageCount] = React.useState(0);\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const dispatch = useDispatch();\r\n const doRefresh = useSelector(selectDoRefreshTable);\r\n\r\n const [tableState, setTableState] = React.useState>>(\r\n {\r\n pageIndex: initialState?.pageIndex ?? 0,\r\n pageSize:\r\n printing !== undefined && printing.printing === true\r\n ? 10000\r\n : initialState?.pageSize ?? 10,\r\n //sortBy, which is set to undefined, is subsequently changed to [], causing re-rendering.\r\n //Assigning sortBy a value equal to [] is preventing re-rendering.\r\n sortBy: initialState?.sortBy !== undefined ? initialState?.sortBy : [],\r\n globalFilter: initialState?.globalFilter,\r\n },\r\n );\r\n const handleChangeState = React.useCallback(state => {\r\n setTableState(state);\r\n }, []);\r\n // custom useMemo Hook with deps comparision, the service groups array is changed even their contant is the same;\r\n // to do: make a generic comparer.\r\n const serviceGroupsCompared = useCustomCompareMemo(\r\n () => {\r\n return serviceGroups;\r\n },\r\n [serviceGroups],\r\n ServiceGroupsComparer,\r\n );\r\n const additionalColumnsCompared = useCustomCompareMemo(\r\n () => {\r\n return additionalColumns;\r\n },\r\n [additionalColumns],\r\n ColumnAccesorsComparer,\r\n );\r\n const columnsCompared = useCustomCompareMemo(\r\n () => {\r\n return columns;\r\n },\r\n [columns],\r\n columnsComparer,\r\n );\r\n // take care of configurable columns\r\n const {\r\n configurableColumns,\r\n handleConfigurableColumns,\r\n configCompleted,\r\n refreshConfigurableColumns,\r\n } = useConfigurableColumns({\r\n screenId: screenId,\r\n columns: columnsCompared,\r\n });\r\n\r\n const getDisplayColumns = React.useCallback(\r\n ({\r\n screenId,\r\n configurableColumns,\r\n configCompleted,\r\n columns,\r\n }): Column[] | undefined => {\r\n if (screenId === undefined) {\r\n return columns;\r\n } else if (configCompleted) {\r\n return configurableColumns;\r\n } else {\r\n return undefined;\r\n }\r\n },\r\n [],\r\n );\r\n\r\n //columnAccessors is changed several times on load Effect, so transformed to a function to control their content changed.\r\n // const columnAccessors = React.useMemo(() => {\r\n // if (!configCompleted) {\r\n // return undefined;\r\n // }\r\n // const columnAccessors = getDisplayColumns({\r\n // screenId,\r\n // configurableColumns,\r\n // configCompleted,\r\n // columns,\r\n // });\r\n // const result =\r\n // columnAccessors === undefined\r\n // ? undefined\r\n // : getColumnAccessors(columnAccessors);\r\n // return result;\r\n // // eslint-disable-next-line react-hooks/exhaustive-deps\r\n // }, [configCompleted, screenId, configurableColumns, columns]);\r\n const calculateColumnAccessors = React.useCallback(\r\n (\r\n columns: Column[],\r\n completed?: boolean,\r\n screenId?: ScreensId,\r\n configurableColumns?: Column[],\r\n ) => {\r\n if (!completed) {\r\n return undefined;\r\n }\r\n const columnAccessors = getDisplayColumns({\r\n screenId,\r\n configurableColumns,\r\n configCompleted,\r\n columns,\r\n });\r\n const result =\r\n columnAccessors === undefined\r\n ? undefined\r\n : getColumnAccessors(columnAccessors);\r\n return result;\r\n },\r\n [configCompleted, getDisplayColumns],\r\n );\r\n const getAllAdditionalColumns = React.useCallback(\r\n (\r\n columns: Column[],\r\n additionalColumns?: (keyof TRow)[],\r\n completed?: boolean,\r\n screenId?: ScreensId,\r\n configurableColumns?: Column[],\r\n ) => {\r\n if (!completed) {\r\n return undefined;\r\n }\r\n const res = getDisplayColumns({\r\n screenId,\r\n configurableColumns,\r\n configCompleted,\r\n columns,\r\n })\r\n ?.filter(hasDeps)\r\n .flatMap(c => c.deps)\r\n .filter(notUndefined);\r\n return [...(additionalColumns ?? []), ...(res ?? [])];\r\n },\r\n [configCompleted, getDisplayColumns],\r\n );\r\n //allAdditionalColumns is changed several times on load Effect, so transformed to a function to control their content changed.\r\n // const allAdditionalColumns = React.useMemo(() => {\r\n // // early return in case and the config is not ready yet to prevent unnecessary fires of effects below that depend on this\r\n // if (!configCompleted) {\r\n // return undefined;\r\n // }\r\n // const res = getDisplayColumns({\r\n // screenId,\r\n // configurableColumns,\r\n // configCompleted,\r\n // columns,\r\n // })\r\n // ?.filter(hasDeps)\r\n // .flatMap(c => c.deps)\r\n // .filter(notUndefined);\r\n // return [...(additionalColumns ?? []), ...(res ?? [])];\r\n // }, [\r\n // additionalColumns,\r\n // columns,\r\n // configCompleted,\r\n // configurableColumns,\r\n // getDisplayColumns,\r\n // screenId,\r\n // ]);\r\n\r\n // memo cleaned up filters without the Name which is loaded independently of the filter value and only affects appearance of the filter\r\n const customFilter = useMemoFilters({ appliedFilters: props.appliedFilters });\r\n\r\n const handleFilterChange = React.useCallback(\r\n items => {\r\n if (props.onFilterChange !== undefined) {\r\n props.onFilterChange(items);\r\n }\r\n },\r\n [props],\r\n );\r\n\r\n /**\r\n * Fetch data method that retrieves the data according to the current table state\r\n */\r\n const fetchData = React.useCallback(\r\n async (\r\n state: {\r\n api: string | IPathAndQuery;\r\n predicates: Array | string>;\r\n pageSize: number;\r\n pageIndex: number;\r\n sortBy?: SortingRule[] | null;\r\n globalFilterValue?: string;\r\n customFilter: IFilterSettings[];\r\n serviceGroups: Entity[];\r\n isOptionalServiceGroup: boolean;\r\n columns: Array;\r\n additionalColumns: Array;\r\n },\r\n cancelToken: CancelToken,\r\n ) => {\r\n extendDataState({ loading: true });\r\n try {\r\n // todo: add support for object notation accessors like 'foo.bar'\r\n // todo: add support for accessor of type Function(originalRow, rowIndex) => any\r\n const oDataParams = buildParams(\r\n {\r\n ...state,\r\n select: state.columns,\r\n serviceGroups: state.serviceGroups,\r\n expandedColumns: expandedColumns,\r\n },\r\n searchColumns,\r\n customParams,\r\n );\r\n var { url, params } = getUrlAndParams(state.api, oDataParams);\r\n const response = await httpClient.get(url, params, cancelToken);\r\n\r\n const newState: IDataState = {\r\n loading: false,\r\n initComplete: true,\r\n data: response.value,\r\n dataLength: response['@odata.count'],\r\n controlledPageCount: Math.ceil(\r\n response['@odata.count'] / state.pageSize,\r\n ),\r\n };\r\n setDataState(newState);\r\n } catch (error: unknown) {\r\n // todo: show error message\r\n const requestCancelled =\r\n (error as any)?.message === REQUEST_CANCELLED_MESSAGE;\r\n if (!requestCancelled) {\r\n // console.error(error);\r\n extendDataState({ loading: false, initComplete: true });\r\n }\r\n }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [httpClient],\r\n );\r\n\r\n const pageIndex = React.useMemo(() => {\r\n return tableState.pageIndex!;\r\n }, [tableState.pageIndex]);\r\n const pageSize = React.useMemo(() => {\r\n return tableState.pageSize!;\r\n }, [tableState.pageSize]);\r\n // const sortBy = React.useMemo(() => {\r\n // return tableState.sortBy!;\r\n // }, [tableState.sortBy]);\r\n const sortBy = useCustomCompareMemo(\r\n () => {\r\n return tableState.sortBy!;\r\n },\r\n [tableState.sortBy],\r\n SortByComparer,\r\n );\r\n const globalFilter = React.useMemo(() => {\r\n return tableState.globalFilter;\r\n }, [tableState.globalFilter]);\r\n const titleKey = React.useMemo(() => {\r\n const columnAccessors = calculateColumnAccessors(\r\n columnsCompared,\r\n configCompleted,\r\n screenId,\r\n configurableColumns,\r\n );\r\n return props.titleKey ?? columnAccessors?.[0] ?? '';\r\n }, [\r\n calculateColumnAccessors,\r\n columnsCompared,\r\n configCompleted,\r\n configurableColumns,\r\n props.titleKey,\r\n screenId,\r\n ]);\r\n // connect table state changes to server data fetch side effect\r\n\r\n React.useEffect(() => {\r\n const cancelTokenSource = httpClient.cancelToken.source();\r\n const allAdditionalColumns = getAllAdditionalColumns(\r\n columnsCompared,\r\n additionalColumnsCompared,\r\n configCompleted,\r\n screenId,\r\n configurableColumns,\r\n );\r\n const columnAccessors = calculateColumnAccessors(\r\n columnsCompared,\r\n configCompleted,\r\n screenId,\r\n configurableColumns,\r\n );\r\n const columnsConfig = isFetchReady(\r\n columnAccessors,\r\n allAdditionalColumns,\r\n configCompleted,\r\n );\r\n if (columnsConfig === false) {\r\n return;\r\n }\r\n try {\r\n fetchData(\r\n {\r\n api,\r\n predicates: props.predicates ?? [],\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilterValue: globalFilter as string,\r\n customFilter: customFilter ?? [],\r\n serviceGroups: serviceGroupsCompared,\r\n isOptionalServiceGroup: ServiceGroupsOptional || false,\r\n ...columnsConfig,\r\n },\r\n cancelTokenSource.token,\r\n );\r\n } catch (error) {\r\n } finally {\r\n }\r\n return () => {\r\n cancelTokenSource.cancel(REQUEST_CANCELLED_MESSAGE);\r\n };\r\n }, [\r\n ServiceGroupsOptional,\r\n additionalColumnsCompared,\r\n api,\r\n calculateColumnAccessors,\r\n columnsCompared,\r\n configCompleted,\r\n configurableColumns,\r\n customFilter,\r\n fetchData,\r\n getAllAdditionalColumns,\r\n globalFilter,\r\n pageIndex,\r\n pageSize,\r\n props.predicates,\r\n screenId,\r\n serviceGroupsCompared,\r\n sortBy,\r\n ]);\r\n const handleExportClick = async () => {\r\n try {\r\n /**\r\n * export configurable columns should have been preloaded at this point and available immediately\r\n * otherwise this could take a bit of the time to refetch columns data from the server\r\n * */\r\n const exportColumnAccessors = await TryGetExportColumns(\r\n screenId,\r\n columnsCompared,\r\n // isAuthenticated,\r\n );\r\n\r\n const { $top, $skip, ...tableParams } = buildParams(\r\n {\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilterValue: globalFilter as string,\r\n customFilter: customFilter ?? [],\r\n select: exportColumnAccessors ?? [],\r\n additionalColumns: additionalColumnsCompared,\r\n serviceGroups: serviceGroupsCompared,\r\n isOptionalServiceGroup: ServiceGroupsOptional || false,\r\n expandedColumns: expandedColumns,\r\n predicates: props.predicates ?? [],\r\n },\r\n undefined,\r\n undefined,\r\n true,\r\n );\r\n\r\n //BKT-7579\r\n if (tableParams.$filter?.startsWith('() and ')) {\r\n tableParams.$filter = tableParams.$filter.replace('() and ', '');\r\n }\r\n\r\n var oDataParams = getExportParameters(tableParams);\r\n var { url, params } = getUrlAndParams(api, oDataParams);\r\n if (screenId === undefined) {\r\n params['unConfigured'] = true;\r\n }\r\n const exporturl = buildURL(url, params);\r\n await openExportLink(exporturl);\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n };\r\n const getAllFilteredRows = async (prop: keyof TRow) => {\r\n return new Promise((resolve, reject) => {\r\n const { $top, $skip, ...tableParams } = buildParams(\r\n {\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilterValue: globalFilter as string,\r\n customFilter: customFilter ?? [],\r\n select: [prop],\r\n additionalColumns: additionalColumnsCompared,\r\n serviceGroups: serviceGroupsCompared,\r\n isOptionalServiceGroup: ServiceGroupsOptional || false,\r\n expandedColumns: undefined,\r\n predicates: props.predicates ?? [],\r\n },\r\n undefined,\r\n undefined,\r\n true,\r\n );\r\n if (tableParams.$filter?.startsWith('() and ')) {\r\n tableParams.$filter = tableParams.$filter.replace('() and ', '');\r\n }\r\n\r\n var oDataParams = getExportForImportParameters(tableParams);\r\n var { url, params } = getUrlAndParams(api, oDataParams);\r\n httpClient.get(url, params).then(response => {\r\n resolve(response.value);\r\n });\r\n // try {\r\n // const response = await httpClient.get(url, params);\r\n // const rows: TRow[] = response.value;\r\n // resolve(rows.map(f => f.Id as number));\r\n // } catch (error: unknown) {\r\n // resolve([]);\r\n // }\r\n });\r\n };\r\n\r\n const [allRowsSelected, setAllRowsSelected] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const toggleAllRowsSelected = React.useCallback((value?: boolean) => {\r\n setAllRowsSelected(value);\r\n\r\n //resets to undefined if false so that the useEffect will notice a change when next changed to false\r\n // if (!value) {\r\n // setAllRowsSelected(undefined);\r\n // }\r\n }, []);\r\n\r\n /**\r\n * Reloads the table and unselects all rows\r\n */\r\n const handleRefresh = React.useCallback(\r\n event => {\r\n const allAdditionalColumns = getAllAdditionalColumns(\r\n columnsCompared,\r\n additionalColumnsCompared,\r\n configCompleted,\r\n screenId,\r\n configurableColumns,\r\n );\r\n const columnAccessors = calculateColumnAccessors(\r\n columnsCompared,\r\n configCompleted,\r\n screenId,\r\n configurableColumns,\r\n );\r\n const columnsConfig = isFetchReady(\r\n columnAccessors,\r\n allAdditionalColumns,\r\n configCompleted,\r\n );\r\n if (columnsConfig === false) {\r\n return;\r\n }\r\n if (event?.reloadConfigurableColumns === true && screenId !== undefined) {\r\n refreshConfigurableColumns();\r\n return;\r\n }\r\n if (props.useRowSelect && !initialState?.selectedRowIds) {\r\n toggleAllRowsSelected(false);\r\n }\r\n fetchData(\r\n {\r\n api,\r\n predicates: props.predicates ?? [],\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilterValue: globalFilter as string,\r\n customFilter: customFilter ?? [],\r\n serviceGroups: serviceGroupsCompared,\r\n isOptionalServiceGroup: ServiceGroupsOptional || false,\r\n ...columnsConfig,\r\n },\r\n httpClient.cancelToken.source().token,\r\n );\r\n },\r\n [\r\n ServiceGroupsOptional,\r\n additionalColumnsCompared,\r\n api,\r\n calculateColumnAccessors,\r\n columnsCompared,\r\n configCompleted,\r\n configurableColumns,\r\n customFilter,\r\n fetchData,\r\n getAllAdditionalColumns,\r\n globalFilter,\r\n initialState?.selectedRowIds,\r\n pageIndex,\r\n pageSize,\r\n props.predicates,\r\n props.useRowSelect,\r\n refreshConfigurableColumns,\r\n screenId,\r\n serviceGroupsCompared,\r\n sortBy,\r\n toggleAllRowsSelected,\r\n ],\r\n );\r\n\r\n const refreshFromState = React.useCallback(() => {\r\n dispatch(layoutActions.setRefreshTable(false));\r\n handleRefresh();\r\n }, [dispatch, layoutActions, handleRefresh]);\r\n\r\n React.useEffect(() => {\r\n if (needRefresh !== undefined && needRefresh === true) {\r\n handleRefresh();\r\n }\r\n if (doRefresh === true) {\r\n refreshFromState();\r\n }\r\n }, [doRefresh, needRefresh, handleRefresh, refreshFromState]);\r\n\r\n React.useEffect(() => {\r\n onPageSizeChanged?.(pageSize);\r\n }, [onPageSizeChanged, pageSize]);\r\n\r\n React.useEffect(() => {\r\n onPageIndexChanged?.(pageIndex);\r\n }, [onPageIndexChanged, pageIndex]);\r\n\r\n const loading = dataState?.loading ?? true;\r\n\r\n if (dataState.initComplete !== true) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n );\r\n}\r\nfunction getUrlAndParams(\r\n api: string | IPathAndQuery,\r\n oDataParams: {\r\n $skip?: number;\r\n $top?: number;\r\n $count?: boolean;\r\n $select?: string;\r\n $orderby?: string | undefined;\r\n $filter?: string | undefined;\r\n $format?: string;\r\n $expand?: string;\r\n },\r\n) {\r\n var url = typeof api === 'string' ? api : (api as IPathAndQuery).path;\r\n var search = (api as IPathAndQuery).search;\r\n const params = { ...oDataParams, ...search };\r\n return { url, params };\r\n}\r\n\r\n/**\r\n * Determines if fetchData function is ready to be called\r\n * @param configCompleted configCompleted - sourced from the configurable columns\r\n * @param columnAccessors column accessors used to fetch data\r\n * @param allAdditionalColumns additional column accessors used to fetch data\r\n * @returns returns either false in the case and configurable columns will return a bit later, or non-undefined accessors that can be used in the fetchData function\r\n */\r\nfunction isFetchReady(\r\n columnAccessors: Array | undefined,\r\n allAdditionalColumns: Array | undefined,\r\n configCompleted: boolean,\r\n):\r\n | false\r\n | {\r\n columns: Array;\r\n additionalColumns: Array;\r\n } {\r\n if (!configCompleted) {\r\n return false;\r\n } else if (columnAccessors === undefined) {\r\n return false;\r\n } else if (allAdditionalColumns === undefined) {\r\n return false;\r\n } else {\r\n return {\r\n columns: columnAccessors,\r\n additionalColumns: allAdditionalColumns,\r\n };\r\n }\r\n}\r\n","/**\r\n *\r\n * BudgetPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport {\r\n IBudgetFilterDto,\r\n IBudgetMembersDto,\r\n} from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport {\r\n Condition,\r\n ODataOperators,\r\n quoteODataValue,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { CustomDate } from 'types/CustomDate';\r\n\r\nexport interface BudgetPickerProps\r\n extends Omit, 'loadData'> {\r\n name?: string;\r\n placeholder?: string;\r\n onBlur?: React.FocusEventHandler;\r\n error?: boolean;\r\n helperText?: string;\r\n allActiveBudgets?: boolean;\r\n useSearchOrPredicate?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/Budgets';\r\nexport const initBudgetData = (\r\n initval: string | undefined,\r\n select?: (keyof IBudgetFilterDto)[],\r\n expand?: (keyof Pick<\r\n IBudgetFilterDto,\r\n | 'AllowedServices'\r\n | 'AdGroupUsers'\r\n | 'ApprovedUsers'\r\n | 'DefaultBudgetsUsers'\r\n | 'ServiceGroupIds'\r\n >)[],\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n $select: string;\r\n $expand?: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n $select: !!select\r\n ? select.join(',')\r\n : [\r\n 'Id',\r\n 'Name',\r\n 'UserGroupId',\r\n 'UserGroupName',\r\n 'Active',\r\n 'IsDefault',\r\n 'HideExperiments',\r\n 'FundingTypeId',\r\n 'PurchaseOrderOptionId',\r\n 'ServiceGroupServicesAllowed',\r\n 'UserGroupBudgetMembersAllowed',\r\n 'StartDate',\r\n 'EndDate',\r\n 'Type',\r\n 'ApprovedUsers',\r\n 'DefaultBudgetsUsers',\r\n 'ServiceGroupIds',\r\n 'AllowedServices',\r\n 'AdGroupUsers',\r\n 'Confidential',\r\n ].join(','),\r\n $expand: !!expand ? expand.join(',') : 'AllowedServices,ApprovedUsers',\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n queryUrl?: string,\r\n useSearchOrPredicate?: boolean,\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url: url ?? queryUrl,\r\n predicates: predicates,\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'UserGroupId',\r\n 'UserGroupName',\r\n 'Active',\r\n 'IsDefault',\r\n 'HideExperiments',\r\n 'FundingTypeId',\r\n 'PurchaseOrderOptionId',\r\n 'ServiceGroupServicesAllowed',\r\n 'UserGroupBudgetMembersAllowed',\r\n 'StartDate',\r\n 'EndDate',\r\n 'Type',\r\n 'ApprovedUsers',\r\n 'DefaultBudgetsUsers',\r\n 'ServiceGroupIds',\r\n 'AllowedServices',\r\n 'AdGroupUsers',\r\n 'Confidential',\r\n ],\r\n expand: 'AllowedServices,ApprovedUsers',\r\n useSearchOrPredicate: useSearchOrPredicate,\r\n });\r\nexport function BudgetPicker(props: BudgetPickerProps) {\r\n const innerLoadData = (predicates, queryUrl) =>\r\n loadData(props.predicates, queryUrl, props.useSearchOrPredicate);\r\n const queryUrl = props.allActiveBudgets\r\n ? '/api/odata/v4/Budgets/AllBudgets'\r\n : '/api/odata/v4/Budgets';\r\n\r\n return (\r\n \r\n );\r\n}\r\nexport const BudgetByUserGroupFilter = (value: FilterValueType) => {\r\n if (value !== undefined && value !== null) {\r\n return [\r\n `${new Condition(\r\n 'UserGroupId',\r\n ODataOperators.Equals,\r\n null,\r\n ).toString()} or ${new Condition(\r\n 'UserGroupId',\r\n ODataOperators.Equals,\r\n (value as Entity).Id,\r\n ).toString()}`,\r\n ];\r\n }\r\n return [];\r\n};\r\nconst memberTimeFilter = (start?: Date, end?: Date): string => {\r\n let query = '';\r\n if (start === undefined && end === undefined) {\r\n return query;\r\n } else {\r\n if (start !== undefined) {\r\n query += ` and (u/${new Condition(\r\n 'ExpairedDate',\r\n ODataOperators.Equals,\r\n null,\r\n )} or u/${new Condition(\r\n 'ExpairedDate',\r\n ODataOperators.GreaterThanEqual,\r\n new CustomDate(new Date(start), 'date'),\r\n )})`;\r\n }\r\n if (end !== undefined) {\r\n query += ` and (u/${new Condition(\r\n 'ExpairedDate',\r\n ODataOperators.Equals,\r\n null,\r\n )} or u/${new Condition(\r\n 'ExpairedDate',\r\n ODataOperators.GreaterThanEqual,\r\n new CustomDate(new Date(end), 'date'),\r\n )})`;\r\n }\r\n }\r\n return query;\r\n};\r\nexport const loadBudgets = loadData;\r\nexport interface restrictedBudgetFilterProps {\r\n budgetLimitedByUsers: boolean;\r\n isBudgetsWithoutUserGroup: boolean;\r\n userGroupId?: string;\r\n serviceGroupId?: number;\r\n services?: IServiceTypeFilterDto[];\r\n startTime?: Date;\r\n endTime?: Date;\r\n user?: string;\r\n defaultBudgetEnabled?: boolean;\r\n userDefaultBudgetEnabled?: boolean;\r\n hideNonDefaultBudgets?: boolean;\r\n fundingType?: Entity | null;\r\n}\r\nexport function restrictedBudgetFilter({\r\n budgetLimitedByUsers,\r\n isBudgetsWithoutUserGroup,\r\n userGroupId,\r\n serviceGroupId,\r\n services,\r\n startTime,\r\n endTime,\r\n user,\r\n defaultBudgetEnabled,\r\n userDefaultBudgetEnabled,\r\n hideNonDefaultBudgets,\r\n fundingType,\r\n}: restrictedBudgetFilterProps): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (!!budgetLimitedByUsers && user !== undefined) {\r\n /**\r\n * when UserGroupBudgetMembersAllowed, it should give a pass for:\r\n * - all users in case and budget/usergroup field is turned off\r\n * - budgets/s user group users if the field is turned on and populated, all users otherwise\r\n * */\r\n\r\n let UserGroupBudgetMembersAllowed = new Condition(\r\n 'UserGroupBudgetMembersAllowed',\r\n ODataOperators.Equals,\r\n true,\r\n ).toString();\r\n\r\n const budgetUserGroupMembers = isBudgetsWithoutUserGroup\r\n ? undefined\r\n : `${new Condition(\r\n 'UserGroupId',\r\n ODataOperators.Equals,\r\n null,\r\n )} or ${new Condition(\r\n 'AdGroupUsers',\r\n ODataOperators.Any,\r\n user,\r\n )}`;\r\n const u = [UserGroupBudgetMembersAllowed, budgetUserGroupMembers]\r\n .filter(f => f !== undefined)\r\n .join(' and ');\r\n\r\n let usrFilter = `((${u}) or (ApprovedUsers/any(u: u/UserName eq ${quoteODataValue(\r\n user,\r\n )} ${memberTimeFilter(startTime, endTime)})))`;\r\n predicates.push(usrFilter);\r\n }\r\n if (!isBudgetsWithoutUserGroup && userGroupId !== undefined) {\r\n predicates.push(\r\n new Condition(\r\n 'UserGroupId',\r\n ODataOperators.Equals,\r\n userGroupId,\r\n ),\r\n );\r\n }\r\n const fundingTypeId = fundingType?.Id ?? undefined;\r\n if (fundingTypeId !== undefined) {\r\n predicates.push(\r\n new Condition(\r\n 'FundingTypeId',\r\n ODataOperators.Equals,\r\n fundingTypeId,\r\n ),\r\n );\r\n }\r\n\r\n if (startTime !== undefined || (endTime !== undefined && false)) {\r\n let startFilter = start =>\r\n `(${new Condition(\r\n 'StartDate',\r\n ODataOperators.Equals,\r\n null,\r\n )} or ${new Condition(\r\n 'StartDate',\r\n ODataOperators.LessThanEqual,\r\n start,\r\n )}) and (${new Condition(\r\n 'EndDate',\r\n ODataOperators.Equals,\r\n null,\r\n )} or ${new Condition(\r\n 'EndDate',\r\n ODataOperators.GreaterThanEqual,\r\n start,\r\n )})`;\r\n let endFilter = end =>\r\n `(${new Condition(\r\n 'StartDate',\r\n ODataOperators.Equals,\r\n null,\r\n )} or ${new Condition(\r\n 'StartDate',\r\n ODataOperators.LessThanEqual,\r\n end,\r\n )}) and (${new Condition(\r\n 'EndDate',\r\n ODataOperators.Equals,\r\n null,\r\n )} or ${new Condition(\r\n 'EndDate',\r\n ODataOperators.GreaterThanEqual,\r\n end,\r\n )})`;\r\n if (!!startTime && endTime === undefined) {\r\n predicates.push(startFilter(new CustomDate(new Date(startTime), 'date')));\r\n } else if (!!endTime && startTime === undefined) {\r\n predicates.push(endFilter(new CustomDate(new Date(endTime), 'date')));\r\n } else if (!!startTime && !!endTime) {\r\n predicates.push(\r\n `(${startFilter(\r\n new CustomDate(new Date(startTime), 'date'),\r\n )} and ${endFilter(new CustomDate(new Date(endTime), 'date'))})`,\r\n );\r\n }\r\n }\r\n if (serviceGroupId !== undefined) {\r\n let groupFilter = `${new Condition(\r\n 'ServiceGroupServicesAllowed',\r\n ODataOperators.Equals,\r\n true,\r\n ).toString()} or ${new Condition(\r\n 'ServiceGroupIds',\r\n ODataOperators.Any,\r\n serviceGroupId,\r\n ).toString()}`;\r\n predicates.push(groupFilter);\r\n }\r\n if (services !== undefined && services.length > 0) {\r\n let list = services\r\n .map(f => {\r\n return `(AllowedServices/any(s: s/Id eq ${quoteODataValue(\r\n f.Id,\r\n )} and s/ServiceTypeId eq ${\r\n f.ServiceTypeId\r\n }) or ServiceGroupIds/any(g: g eq ${quoteODataValue(\r\n f.ServiceGroupId,\r\n )}))`;\r\n })\r\n .join(' and ');\r\n let servFilter = `(${new Condition(\r\n 'ServiceGroupServicesAllowed',\r\n ODataOperators.Equals,\r\n true,\r\n ).toString()} or (${list}))`;\r\n predicates.push(servFilter);\r\n }\r\n // if (isDefault) {\r\n // predicates.push(\r\n // new Condition('IsDefault', ODataOperators.Equals, true),\r\n // );\r\n // }\r\n if (hideNonDefaultBudgets) {\r\n let deffFilter: (string | Condition)[] = [];\r\n if (defaultBudgetEnabled) {\r\n deffFilter.push(\r\n new Condition(\r\n 'IsDefault',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n }\r\n if (userDefaultBudgetEnabled && user !== undefined) {\r\n deffFilter.push(\r\n new Condition(\r\n 'DefaultBudgetsUsers',\r\n ODataOperators.Any,\r\n user,\r\n ),\r\n );\r\n }\r\n if (deffFilter.length > 0) {\r\n predicates.push(deffFilter.map(f => f.toString()).join(' or '));\r\n }\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n","export enum PriceSheetBy {\r\n InstrumentsAndServices = 1,\r\n InstrumentCategoryAndProjectCategory = 2,\r\n}\r\n\r\nexport enum BudgetType {\r\n Regular = 1,\r\n Expanses = 2,\r\n}\r\nexport enum UserRegistersToSpecificCoresType {\r\n UserRegistersToSpecificCores_NA = 1,\r\n UserRegistersToSpecificCores_Optional = 2,\r\n UserRegistersToSpecificCores_Mandatory = 3,\r\n}\r\n\r\nexport enum AutomaticAssetNamings {\r\n No,\r\n Cat,\r\n Nick,\r\n}\r\nexport enum UserReservationsRestricted {\r\n NotRestricted = 0,\r\n UserGroupRestricted = 1,\r\n UserOwnRestricted = 2,\r\n}\r\nexport enum SideBarQuickActionsEnum {\r\n NA = 0,\r\n CreateReservation = 1,\r\n CreateWorkOrder = 2,\r\n}\r\n","export enum DraftReservationTypes {\r\n DraftReservationTypes_SaveForLater = 0,\r\n DraftReservationTypes_ApprovalRequired = 1,\r\n DraftReservationTypes_AllUser = 2,\r\n}\r\n","/**\r\n *\r\n * auto generated interface for Bookit.Data.Enums.AllowReservationCollaboratorsTypes\r\n *\r\n */\r\n\r\nexport enum AllowReservationCollaboratorsTypes {\r\n None = 1,\r\n NotAllowedToStartUsage = 0,\r\n AllowedToStartUsage = 2,\r\n}\r\nexport const AllowReservationCollaboratorsTypesArray = [\r\n 'None',\r\n 'NotAllowedToStartUsage',\r\n 'AllowedToStartUsage',\r\n];\r\nexport type AllowReservationCollaboratorsTypesUnion = keyof typeof AllowReservationCollaboratorsTypes;\r\n","import { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nimport { DraftReservationTypes } from 'enums/DraftReservationTypes';\r\nimport { GlobalSettingsType } from '../components/useGlobalSettingsHook';\r\nimport {\r\n IMandatoryEquipmentsDto,\r\n IReservationEquipmentDto,\r\n ServiceSettingsState,\r\n} from './types';\r\nimport { combineOfflineServiceTypes } from './combineOfflineServiceTypes';\r\nimport { AllowReservationCollaboratorsTypes } from 'api/odata/generated/enums/AllowReservationCollaboratorsTypes';\r\nimport { getBudgetVisible } from './getBudgetVisible';\r\nimport { groupBy, values } from 'lodash';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\n\r\nexport function mapSettingsFromServices(\r\n equipments: IReservationEquipmentDto[],\r\n accServices: IEquipmentAccServiceDto[],\r\n globalSettings: GlobalSettingsType,\r\n authenticatedUser: AuthenticatedUser,\r\n settings?: ServiceSettingsState,\r\n): ServiceSettingsState {\r\n const p: Partial = {\r\n HasHideProjects: equipments.every(f => f.HideProjects),\r\n HasConflictProjects:\r\n equipments.some(f => f.HideProjects === true) &&\r\n equipments.some(f => f.HideProjects === false),\r\n HasMultipleProjects:\r\n globalSettings.allowPartialProjectCharges &&\r\n equipments.every(f => f.AllowPartialProjectCharges === true),\r\n HasPartialSingleProject:\r\n globalSettings.allowPartialSingleProjectCharges &&\r\n equipments.every(f => f.AllowPartialSingleProjectCharges === true),\r\n AllOffServicesAllowed: equipments.every(\r\n f => f.ReservationOfflineServicesEnabled === null,\r\n ),\r\n OfflineServicesVisible: equipments.every(\r\n f =>\r\n f.ReservationOfflineServicesEnabled === true ||\r\n f.ReservationOfflineServicesEnabled === null,\r\n ),\r\n AllowReservationCollaborators:\r\n globalSettings.hideReservationCollaborators !== true &&\r\n equipments.every(f =>\r\n [\r\n AllowReservationCollaboratorsTypes.AllowedToStartUsage,\r\n AllowReservationCollaboratorsTypes.NotAllowedToStartUsage,\r\n ].includes(f.AllowReservationCollaborators),\r\n ),\r\n budgetExperimentVisible:\r\n globalSettings.budgetExperimentModuleEnabled &&\r\n equipments.some(f => f.BudgetExperimentSettings),\r\n TrainingSignUpApproval:\r\n equipments.length === 1\r\n ? equipments[0].TrainingSignUpApproval ?? 1\r\n : undefined,\r\n HideTrainingSession: equipments.every(f => f.HideTrainingSession === true),\r\n HasAttendance: equipments.every(f => f.HasAttendance === true),\r\n ForceTutoring: equipments.some(\r\n f =>\r\n f.ForceTutoring === true &&\r\n authenticatedUser.IsAdminOf({\r\n ServiceGroupId: f.ServiceGroupId,\r\n ServiceId: f.Id,\r\n ServiceTypeId: ServiceType.Online,\r\n }) === false,\r\n ),\r\n ForceFullDayReservations: equipments.some(f => f.ForceFullDayReservations),\r\n IsEquipmentTutoring: equipments.some(f => f.IsEquipmentTutoring === true),\r\n NotAllowReservations: equipments.some(f => f.NotAllowReservations === true),\r\n AllowOneAccSerOnly: equipments.some(f => f.AllowOneAccSerOnly === true),\r\n IsAllAdmin: equipments.every(\r\n f =>\r\n authenticatedUser.IsAdminOf({\r\n ServiceGroupId: f.ServiceGroupId,\r\n ServiceId: f.Id,\r\n ServiceTypeId: ServiceType.Online,\r\n }) === true,\r\n ),\r\n RestrictReservationToTimeSlots: equipments.every(\r\n f => f.RestrictReservationToTimeSlots === true,\r\n ),\r\n DefaultReservationDuration:\r\n equipments.length > 0\r\n ? equipments\r\n .map(f => f.DefaultReservationDuration)\r\n .sort((a, b) => a - b)[0]\r\n : 1,\r\n MinOrderHours:\r\n equipments.length > 0\r\n ? equipments.map(f => f.MinOrderHours).sort((a, b) => a - b)[\r\n equipments.length - 1\r\n ]\r\n : 1,\r\n MaxOrderHours:\r\n equipments.length > 0\r\n ? accServices.length > 0 &&\r\n accServices.some(f => f.MaxOrderDuration !== null)\r\n ? accServices\r\n .map(f => f.MaxOrderDuration ?? 0)\r\n .sort((a, b) => a - b)[0]\r\n : equipments.map(f => f.MaxOrderHours).sort((a, b) => a - b)[0]\r\n : equipments.map(f => f.MaxOrderHours).sort((a, b) => a - b)[0],\r\n\r\n MinOrderGap:\r\n equipments.length > 0\r\n ? accServices.length > 0 &&\r\n accServices.some(f => f.MinOrderGap !== null)\r\n ? accServices.map(f => f.MinOrderGap ?? 0).sort((a, b) => a - b)[0]\r\n : equipments.map(f => f.MinOrderGap).sort((a, b) => a - b)[0]\r\n : equipments.map(f => f.MinOrderGap).sort((a, b) => a - b)[0],\r\n RestrictDurationUnitsAmount:\r\n equipments.length > 0\r\n ? equipments\r\n .map(f => f.RestrictDurationUnitsAmount ?? 0)\r\n .filter(f => f !== 0)\r\n .sort((a, b) => a - b)[equipments.length - 1]\r\n : null,\r\n RestrictDurationUnitType:\r\n equipments.length > 0\r\n ? equipments\r\n .map(f => f.RestrictDurationUnitType ?? 0)\r\n .filter(f => f !== 0)\r\n .sort((a, b) => a - b)[equipments.length - 1]\r\n : null,\r\n DefaultAccServiceId:\r\n equipments.length > 0\r\n ? equipments.every(\r\n f =>\r\n f.DefaultAccServiceId === equipments[0].DefaultAccServiceId ?? -1,\r\n )\r\n ? equipments[0].DefaultAccServiceId || null\r\n : null\r\n : null,\r\n BudgetsTurnedOn: equipments.some(f => f.BudgetsTurnedOn === true),\r\n Billable: equipments.some(f => f.Billable === true),\r\n IsLoanDesc: equipments.some(f => f.LoanTypeId === 1),\r\n AllowModification: globalSettings.allowOngoingReservationModificationEnabled\r\n ? equipments\r\n .filter(f => f.NotAllowReservations === false)\r\n .every(f => f.AllowModification === true)\r\n : false,\r\n AllowExtendReservation: globalSettings.allowOngoingReservationModificationEnabled\r\n ? equipments\r\n .filter(f => f.NotAllowReservations === false)\r\n .every(f => f.AllowExtendReservation === true)\r\n : false,\r\n AllowUsersToShortenReservations: equipments.every(\r\n f => f.AllowUsersToShortenReservations === true,\r\n ),\r\n AllowedToTransfer: equipments.every(f => f.AllowedToTransfer === true),\r\n AllowedToTransferAll: equipments.every(\r\n f => f.AllowedToTransferAll === true,\r\n ),\r\n EnforceReservationRestrictions: equipments.every(\r\n f => f.EnforceReservationRestrictions === true,\r\n ),\r\n LimitlessReservationAllowed: equipments.every(\r\n f => f.LimitlessReservationAllowed === true,\r\n ),\r\n BudgetVisible: getBudgetVisible(globalSettings, equipments),\r\n OfflineServiceTypes: combineOfflineServiceTypes(equipments),\r\n\r\n Groups:\r\n equipments.length > 0\r\n ? equipments\r\n .filter((item, index, arr) => {\r\n return (\r\n arr.findIndex(t => t.ServiceGroupId === item.ServiceGroupId) ===\r\n index\r\n );\r\n })\r\n .map(f => f.ServiceGroupId)\r\n : [],\r\n HasAccServices:\r\n equipments.length > 0 && equipments.some(f => f.AccServices?.length > 0),\r\n StaffUserVisibleAllways:\r\n equipments.length > 0 &&\r\n equipments.some(f => f.StaffUserSelectionVisible === true),\r\n StaffUserVisibleOnPending:\r\n equipments.length > 0 &&\r\n equipments.some(f => f.StaffUserSelectionVisible === false),\r\n StaffUserRequiredAlwais:\r\n equipments.length > 0 &&\r\n equipments.some(f => f.StaffUserSelectionRequired === true),\r\n StaffUserRequiredOnPending:\r\n equipments.length > 0 &&\r\n equipments.some(f => f.StaffUserSelectionRequired === false),\r\n StaffUserSelection:\r\n equipments.length > 0 &&\r\n equipments.some(f => f.StaffUserSelection?.length > 0)\r\n ? equipments\r\n .filter(d => d.StaffUserSelection?.length > 0)\r\n .reduce((acc, next) => {\r\n return acc.concat(\r\n next.StaffUserSelection?.filter(\r\n f => !acc.some(c => c.Id === f.Id),\r\n ),\r\n );\r\n }, equipments.filter(d => d.StaffUserSelection?.length > 0)[0].StaffUserSelection)\r\n : [],\r\n RequireUserGroupCoordApproval:\r\n equipments.length > 0 &&\r\n equipments.some(f => f.RequireUserGroupCoordApproval === true),\r\n DraftForAll:\r\n equipments.length > 0 &&\r\n equipments.every(\r\n f =>\r\n f.DraftReservationsTypeId ===\r\n DraftReservationTypes.DraftReservationTypes_AllUser,\r\n ),\r\n DraftApprovalRequred:\r\n equipments.length > 0 &&\r\n equipments.every(\r\n f =>\r\n f.DraftReservationsTypeId ===\r\n DraftReservationTypes.DraftReservationTypes_ApprovalRequired,\r\n ),\r\n DraftSaveForLater:\r\n equipments.length > 0 &&\r\n equipments.every(\r\n f =>\r\n f.DraftReservationsTypeId ===\r\n DraftReservationTypes.DraftReservationTypes_SaveForLater,\r\n ),\r\n };\r\n const result = Object.assign({}, settings, p);\r\n return result;\r\n}\r\nexport function combineOptionalEquipments(\r\n services: IMandatoryEquipmentsDto[] | undefined,\r\n): IMandatoryEquipmentsDto[] | undefined {\r\n if (services === undefined) {\r\n return undefined;\r\n }\r\n return values(groupBy(services, f => f.Id)).map(f => {\r\n return f[0];\r\n });\r\n}\r\n","import { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport {\r\n ReservationDetailsState,\r\n ReservationSettingsState,\r\n ReservationEquipment,\r\n CustomFormValueModel,\r\n ReservationUpdateModel,\r\n OfflineservicesModel,\r\n} from './types';\r\n\r\nexport function ConvertModelToUpdateEntity(\r\n original: ReservationDetailsState,\r\n current: ReservationDetailsState,\r\n settings: ReservationSettingsState | undefined,\r\n offlineServices: IOtherServices[],\r\n user: AuthenticatedUser | undefined,\r\n terminate?: boolean,\r\n) {\r\n let entity = {\r\n Id: original.Id,\r\n Services: current.EquipmentsData.map(item => {\r\n return {\r\n EquipmentId: item.Id,\r\n EquipmentName: item.Name,\r\n AccServiceIds:\r\n current.AccServices.length > 0\r\n ? current.AccServices.filter(\r\n a => (a as IEquipmentAccServiceDto).EquipmentId === item.Id,\r\n ).map(a => a.Id)\r\n : [],\r\n AssemblyId: null,\r\n ReservationId: original.Id,\r\n } as ReservationEquipment;\r\n }),\r\n StartTime: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(current.StartTime),\r\n ),\r\n EndTime: dateUtils.formatISO(dateUtils.dateOrStringToDate(current.EndTime)),\r\n Remarks: current.Remarks || null,\r\n SampleRunId: current.SampleRunId,\r\n SampleIds: current.SampleIds,\r\n BudgetId: current.Budget?.Id,\r\n BudgetExperimentId: current.BudgetExperiment?.Id,\r\n Collaborators: current.CollaboratedUsers.map(f => f.Id),\r\n ExternalCustomerId: current.ExternalCustomer?.Id,\r\n FundingTypeId: current.FundingType?.Id ?? 0,\r\n InstituteProjectId: current.InstituteProject?.Id,\r\n Name: current.DisplayName,\r\n PartialAttendance: current.PartialAttendance,\r\n PartialAttendanceStart: current.PartialAttendanceStart || null,\r\n PartialAttendanceEnd: current.PartialAttendanceEnd || null,\r\n Tutoring: current.Tutoring,\r\n FullDayReservation: current.FullDayReservation,\r\n Username: current.BookedBy?.Id,\r\n StaffUser: current.StaffUser?.Id,\r\n UserGroupId: current.ADGroup?.Id,\r\n TrainingSignUp: current.TrainingSignUp,\r\n TrainingSessionId: current.TrainingSession?.Id,\r\n PurchaseOrder: current.PurchaseOrder,\r\n Reference: current.Reference,\r\n Status: current.Status?.Id,\r\n TransferFromId: current.TransferFromId,\r\n UserRequestedByApproval: settings?.UserRequestedByApproval,\r\n TransferredTo: current.TransferredTo?.Id,\r\n WorkflowBooking: current.WorkflowBooking || null,\r\n RecurringUpdateOption: settings?.RecurringUpdateOption || 1,\r\n AllStartTimes: [],\r\n BudgetIds: [],\r\n OfflineServices: offlineServices.map(f => {\r\n return {\r\n OfflineServiceTypeId: f.ServiceTypeID,\r\n ServiceTypeName: f.ServiceType,\r\n UnitsName: f.Units,\r\n Factor: f.DiscountFactor,\r\n Quantity: f.Quantity,\r\n Remarks: f.Remarks,\r\n InventoryBatchId: f.InventoryBatchId,\r\n BudgetId: f.BudgetID,\r\n BudgetExperimentId: f.BudgetExperimentId,\r\n UserGroup: f.UserGroup,\r\n } as OfflineservicesModel;\r\n }),\r\n TransferInProgress: settings?.TransferInProgress,\r\n WaitingTransferApproval: current.WaitingTransferApproval,\r\n InsertedAt: settings?.Entered,\r\n InsertedBy: settings?.RecordDate,\r\n UpdatedAt: new Date(),\r\n UpdatedBy: user?.Id,\r\n CancelledAt: settings?.Cancelled,\r\n CustomFormValues: current.FormValues.map(f => {\r\n return {\r\n FieldId: f.FormFieldId,\r\n Value: f.Value,\r\n DisplayValue: f.DisplayValue,\r\n } as CustomFormValueModel;\r\n }),\r\n Parts: [],\r\n TutorName: settings?.TutorName,\r\n Terminated: terminate ?? false,\r\n TotalCost: settings?.TotalCost ?? 0,\r\n SavedForLater: settings?.SaveForLater,\r\n } as ReservationUpdateModel;\r\n return entity;\r\n}\r\n","import { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nimport { ITrainingSessionDto } from 'api/odata/generated/entities/ITrainingSessionDto';\r\nimport { RepetitiveOptions } from 'enums/RepetitiveOptions';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport {\r\n ReservationGlobalState,\r\n ReservationEquipment,\r\n ReservationStatus,\r\n RecurringReservationUpdateOptions,\r\n ReservationBudgetModel,\r\n CustomFormValueModel,\r\n OfflineservicesModel,\r\n ReservationRepeatModel,\r\n ReservationInsertModel,\r\n} from './types';\r\n\r\nexport function ConvertModelToInsertEntity(\r\n state: ReservationGlobalState,\r\n user: AuthenticatedUser | undefined,\r\n) {\r\n const entity = {\r\n Id: state.details.Id,\r\n Services: state.details.EquipmentsData.map(item => {\r\n return {\r\n EquipmentId: item.Id,\r\n EquipmentName: item.Name,\r\n AccServiceIds:\r\n state.details.AccServices.length > 0\r\n ? state.details.AccServices.filter(\r\n a => (a as IEquipmentAccServiceDto).EquipmentId === item.Id,\r\n ).map(a => a.Id)\r\n : [],\r\n AssemblyId: null,\r\n ReservationId: state.details.Id,\r\n } as ReservationEquipment;\r\n }),\r\n StartTime: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(\r\n state.details.TrainingSession !== null\r\n ? (state.details.TrainingSession as ITrainingSessionDto).StartDate ??\r\n state.details.StartTime\r\n : state.details.StartTime,\r\n ),\r\n ),\r\n EndTime: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(\r\n state.details.TrainingSession !== null\r\n ? (state.details.TrainingSession as ITrainingSessionDto).EndDate ??\r\n state.details.EndTime\r\n : state.details.EndTime,\r\n ),\r\n ),\r\n Remarks: state.details.Remarks || null,\r\n SampleRunId: state.details.SampleRunId,\r\n BudgetId: state.details.Budget?.Id,\r\n BudgetExperimentId: state.details.BudgetExperiment?.Id,\r\n Collaborators: state.details.CollaboratedUsers.map(f => f.Id),\r\n ExternalCustomerId: state.details.ExternalCustomer?.Id,\r\n FundingTypeId: state.details.FundingType?.Id ?? 0,\r\n InstituteProjectId: state.details.InstituteProject?.Id,\r\n Name: state.details.DisplayName,\r\n PartialAttendance: state.details.PartialAttendance,\r\n PartialAttendanceStart: state.details.PartialAttendanceStart || null,\r\n PartialAttendanceEnd: state.details.PartialAttendanceEnd || null,\r\n Tutoring: state.details.Tutoring,\r\n FullDayReservation: state.details.FullDayReservation,\r\n Username: state.details.BookedBy?.Id,\r\n StaffUser: state.details.StaffUser?.Id,\r\n UserGroupId: state.details.ADGroup?.Id,\r\n TrainingSignUp: state.details.TrainingSignUp,\r\n TrainingSessionId: state.details.TrainingSession?.Id,\r\n PurchaseOrder: state.details.PurchaseOrder,\r\n Reference: state.details.Reference,\r\n Status: (state.details.Status?.Id || 1) as ReservationStatus,\r\n TransferFromId: state.details.TransferFromId,\r\n UserRequestedByApproval: state.settings.UserRequestedByApproval,\r\n TransferredTo: state.details.TransferredTo?.Id,\r\n WorkflowBooking: state.details.WorkflowBooking || null,\r\n RecurringUpdateOption: (state.settings.RecurringUpdateOption ||\r\n 1) as RecurringReservationUpdateOptions,\r\n AllStartTimes: [],\r\n BudgetIds: state.settings.PartReservations.map(f => {\r\n return {\r\n id: f.BudgetID,\r\n text: f.BudgetName,\r\n ReservationId: f.Id,\r\n } as ReservationBudgetModel;\r\n }),\r\n TransferInProgress: false,\r\n WaitingTransferApproval: state.details.WaitingTransferApproval,\r\n InsertedAt: dateUtils.formatISO(new Date()),\r\n InsertedBy: user?.Id,\r\n UpdatedAt: dateUtils.formatISO(new Date()),\r\n UpdatedBy: user?.Id,\r\n CancelledAt: null,\r\n CustomFormValues: state.details.FormValues.map(f => {\r\n return {\r\n FieldId: f.FormFieldId,\r\n Value: f.Value,\r\n DisplayValue: f.DisplayValue,\r\n } as CustomFormValueModel;\r\n }),\r\n Parts: [],\r\n OfflineServices: state.offlineServices.map(f => {\r\n return {\r\n OfflineServiceTypeId: f.ServiceTypeID,\r\n ServiceTypeName: f.ServiceType,\r\n UnitsName: f.Units,\r\n Factor: f.DiscountFactor,\r\n Quantity: f.Quantity,\r\n Remarks: f.Remarks,\r\n InventoryBatchId: f.InventoryBatchId,\r\n BudgetId: f.BudgetID,\r\n BudgetExperimentId: f.BudgetExperimentId,\r\n UserGroup: f.UserGroup,\r\n } as OfflineservicesModel;\r\n }),\r\n TutorName: state.settings.TutorName,\r\n AssignToServiceRequestId: state.settings.AssignToServiceRequestId,\r\n AssignToServiceRequestRowIds: state.settings.AssignToServiceRequestRowIds,\r\n AssignToServiceRequestSampleIds:\r\n state.settings.AssignToServiceRequestSampleIds,\r\n Repeat:\r\n state?.RepetitiveOptions?.RecurringEvents?.Id &&\r\n state?.RepetitiveOptions?.RecurringEvents?.Id !==\r\n (RepetitiveOptions.DoNotRepeat as number)\r\n ? ({\r\n RepeatsEveryType: state.RepetitiveOptions?.RepeatsEveryPeriod?.Id,\r\n RepeatsEveryNum: state.RepetitiveOptions?.RepeatsEveryDay?.Id,\r\n RepeatEndTime: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(\r\n state.RepetitiveOptions?.RecurringEndDate ??\r\n dateUtils.addDays(new Date(), 7),\r\n ),\r\n ),\r\n RepeatOption: state.RepetitiveOptions?.RecurringEvents?.Id || 0,\r\n Repeat_Period: state.settings.Repeat_Period,\r\n RepeatsBy: state.RepetitiveOptions?.RepeatsMonthlyBy?.Id,\r\n RepeatsOn: state.RepetitiveOptions?.RepeatsOnDays.filter(\r\n d => d.checked === true,\r\n ).map(f => f.Id),\r\n } as ReservationRepeatModel)\r\n : null,\r\n Terminated: false,\r\n TotalCost: state.settings.TotalCost ?? 0,\r\n SavedForLater: state.settings.SaveForLater,\r\n } as ReservationInsertModel;\r\n if (state.settings.MandatoriesEquipments.length > 0) {\r\n entity.Services = [\r\n ...entity.Services,\r\n ...state.settings.MandatoriesEquipments.map(item => {\r\n return {\r\n EquipmentId: item.Id,\r\n EquipmentName: item.Name,\r\n AccServiceIds:\r\n state.details.AccServices.length > 0\r\n ? state.details.AccServices.filter(\r\n a => (a as IEquipmentAccServiceDto).EquipmentId === item.Id,\r\n ).map(a => a.Id)\r\n : [],\r\n } as ReservationEquipment;\r\n }),\r\n ];\r\n }\r\n if (state.details.OptionalsEquipments.length > 0) {\r\n if (state.details.OptionalsEquipments.some(f => f.checked === true)) {\r\n entity.Services = [\r\n ...entity.Services,\r\n ...state.details.OptionalsEquipments.filter(\r\n f => f.checked === true,\r\n ).map(item => {\r\n return {\r\n EquipmentId: item.Id,\r\n EquipmentName: item.Name,\r\n AccServiceIds:\r\n state.details.AccServices.length > 0\r\n ? state.details.AccServices.filter(\r\n a => (a as IEquipmentAccServiceDto).EquipmentId === item.Id,\r\n ).map(a => a.Id)\r\n : [],\r\n } as ReservationEquipment;\r\n }),\r\n ];\r\n }\r\n }\r\n return entity;\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport {\r\n fork,\r\n call,\r\n put,\r\n select,\r\n takeLatest,\r\n takeLeading,\r\n} from 'redux-saga/effects';\r\nimport { reservationActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { ReservationsApi as api } from 'api/ReservationsApi';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport {\r\n EquipmentsChangeStateParameters,\r\n IMandatoryEquipmentsDto,\r\n IReservationDto,\r\n IReservationEquipmentDto,\r\n ReservationDetailsResponseModel,\r\n ReservationDetailsState,\r\n ReservationEquipmentsChangeResult,\r\n ReservationGlobalState,\r\n ReservationInsertModel,\r\n ReservationQueryStringParameters,\r\n ReservationSettingsState,\r\n ReservationUpdateModel,\r\n ServiceSettingsState,\r\n TransferToReservation,\r\n} from './types';\r\nimport { mapSettingsFromServices } from './mapSettingsFromServices';\r\nimport { ConvertModelToUpdateEntity } from './ConvertModelToUpdateEntity';\r\nimport { ConvertModelToInsertEntity } from './ConvertModelToInsertEntity';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectGlobalSettingBool,\r\n selectOffsetDate,\r\n} from 'app/slice/selectors';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport i18next from 'i18next';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { translations } from 'locales/translations';\r\nimport { ReservationDetailsProps } from '..';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { AxiosError } from 'axios';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { FileTypes } from 'api/odata/generated/enums/FileTypes';\r\nimport { CustomFormTypeEnum } from 'enums/CustomFormType';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { FileStoreApi } from 'api/fileStoreApi';\r\nimport { getFilesModel, UpdateFilesModel } from 'utils/fileStoreHelper';\r\nimport { GlobalSettingsType } from '../components/useGlobalSettingsHook';\r\nimport { Entity } from 'types/common';\r\nimport { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport {\r\n selectCloneReservations,\r\n selectReservationDtoState,\r\n} from './selectors';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { OtherServicesApi } from 'api/OtherServicesApi';\r\nimport { ConsumableServicesResponse } from 'app/pages/OtherServiceDetails/Details/slice/types';\r\nimport { tryParseBool, tryParseInt } from 'utils/string-utils';\r\nimport { repetitiveActions } from 'app/components/Forms/FormRepetitive/slice';\r\nimport { newDate } from '../components/utils';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\n\r\nfunction* doInitReservation(\r\n action: PayloadAction<{\r\n query: ReservationQueryStringParameters;\r\n globalSettings: GlobalSettingsType;\r\n prevState?: ReservationDetailsState;\r\n }>,\r\n) {\r\n try {\r\n const user: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n if (action.payload.query.id !== undefined) {\r\n yield* doInitReservationEdit({\r\n type: action.type,\r\n payload: {\r\n id: parseInt(action.payload.query.id),\r\n globalSettings: action.payload.globalSettings,\r\n UpdateToNow: tryParseBool(action.payload.query.UpdateToNow) ?? false,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n const result = yield call(api.initReservation, action.payload.query);\r\n console.debug('reseration result: ', result);\r\n let isChange = action.payload.query.resourceChanged === 'true';\r\n let response = result as ReservationDetailsResponseModel;\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n key: 'initReservationSucc',\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n let equipments =\r\n response.model.EquipmentsData.length > 0\r\n ? response.model.EquipmentsData\r\n : !!response.model.BaseEquipment\r\n ? [response.model.BaseEquipment]\r\n : [];\r\n if (equipments.length > 0) {\r\n yield put(\r\n actions.extendEquipmentSettingsState({\r\n equipments: equipments,\r\n mandatories: response.model.MandatoriesEquipments,\r\n accServices: response.model.AccServices,\r\n globalSettings: action.payload.globalSettings,\r\n settings: {} as ServiceSettingsState,\r\n }),\r\n );\r\n }\r\n if (!isChange) {\r\n if (action.payload.query.Start !== undefined) {\r\n response.model.StartTime = dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.query.Start),\r\n );\r\n }\r\n if (action.payload.query.End !== undefined) {\r\n response.model.EndTime = dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.query.End),\r\n );\r\n }\r\n // copy query options to the model\r\n if (action.payload.query.id === undefined) {\r\n // set reservation's sample run id to requested value so that it will be later sent to the server during reservation insert\r\n const sampleRunId = tryParseInt(action.payload.query.sampleRunId);\r\n if (sampleRunId !== undefined) {\r\n response.model.SampleRunId = sampleRunId;\r\n }\r\n }\r\n }\r\n\r\n yield put(\r\n actions.initReservation_Success({\r\n hasErrors: response.ErrorMessages.length > 0,\r\n model: response.model,\r\n isChanged: isChange,\r\n isEdit: response.model.Id > 0,\r\n globalSettings: action.payload.globalSettings,\r\n userTrainigData: response.userTrainingsApprovalData,\r\n }),\r\n );\r\n if (equipments.length > 0 && !(response.model.Id > 0)) {\r\n let allEquipments = [\r\n ...response.model.EquipmentsData,\r\n ...((response.model.MandatoriesEquipments as Entity<\r\n number\r\n >[]) as IReservationEquipmentDto[]),\r\n ];\r\n const parameters: EquipmentsChangeStateParameters = {\r\n AccServices:\r\n response.model.AccServices.length > 0\r\n ? response.model.AccServices.map(f => f.Id)\r\n : [],\r\n Equipments: allEquipments.map(f => f.Id),\r\n ReservationId: (response.model.Id ?? 0) > 0 ? response.model.Id : null,\r\n Start:\r\n // preserve requested start time\r\n dateUtils.tryFormatIso(action.payload.query.Start) ??\r\n // use the server value if time was not requested\r\n dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(response.model.StartTime),\r\n { representation: 'complete' },\r\n ),\r\n End:\r\n // preserve requested end time\r\n dateUtils.tryFormatIso(action.payload.query.End) ??\r\n // use the server value if time was not requested\r\n dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(response.model.EndTime),\r\n { representation: 'complete' },\r\n ),\r\n BookedBy: response.model.BookedBy?.Id || user?.Id || null,\r\n Status: response.model.StatusId,\r\n TrainingSignUp: response.model.TrainingSignUp,\r\n Tutoring: response.model.Tutoring,\r\n ADGroup:\r\n response.model.ADGroup?.Id || user?.ActiveUserGroup?.Id || null,\r\n FundingTypeId: response.model.FundingTypeId || 0,\r\n CheckStatus: false,\r\n TrainingSessionId: response.model.TrainingSession?.Id || null,\r\n Remarks: response.model.Remarks || null,\r\n SampleRunId: action.payload.query.srrid,\r\n BudgetId:\r\n response.model.Budget?.Id ||\r\n (isChange &&\r\n !!action.payload.prevState &&\r\n !!action.payload.prevState.Budget)\r\n ? action.payload?.prevState?.Budget?.Id ?? null\r\n : null,\r\n CheckSession: false,\r\n FullDayReservation: response.model.FullDayReservation,\r\n } as EquipmentsChangeStateParameters;\r\n yield put(\r\n actions.initValidationData({\r\n parameters: parameters,\r\n warnings: response.WarningMessages,\r\n errors: response.ErrorMessages,\r\n }),\r\n );\r\n }\r\n } catch (error: unknown) {\r\n yield put(actions.initReservation_Error(error));\r\n }\r\n}\r\nfunction* doInitReservationEdit(\r\n action: PayloadAction<{\r\n id: number;\r\n globalSettings: GlobalSettingsType;\r\n UpdateToNow: boolean;\r\n }>,\r\n) {\r\n try {\r\n var s: AppSettings = yield select(selectAppSettings);\r\n\r\n const AllowWorkflowBooking = yield select(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.AllowWorkflowBooking),\r\n );\r\n const expand: Array = [\r\n action.payload.globalSettings.budgetModuleEnabled && 'Budget',\r\n action.payload.globalSettings.trainingSessionEnabled && 'TrainingSession',\r\n 'StaffUser',\r\n 'BookedBy',\r\n 'ADGroup',\r\n action.payload.globalSettings.instituteProjectsEnabled &&\r\n 'InstituteProject',\r\n // 'WorkflowBooking',\r\n //ExternalCustomer\r\n action.payload.globalSettings.budgetExperimentModuleEnabled &&\r\n 'BudgetExperiment',\r\n 'TransferredTo',\r\n !action.payload.globalSettings.hideReservationCollaborators &&\r\n 'CollaboratedUsers',\r\n s.Modules.includes(KnownModules.SamplesAutomation) && 'SampleIds',\r\n 'LastUpdateAdmin',\r\n 'FormValues',\r\n //'BaseEquipment',\r\n `EquipmentsData($expand=${[\r\n action.payload.globalSettings.accServicesEnabled && 'AccServices',\r\n 'OfflineServices',\r\n 'CustomForms',\r\n 'StaffUserSelection',\r\n ]\r\n .filter(f => typeof f === 'string')\r\n .join(',')})`,\r\n AllowWorkflowBooking && 'WorkflowBooking',\r\n ];\r\n const result: IReservationDto = yield call(\r\n api.getReservation,\r\n action.payload.id,\r\n {\r\n $expand: expand.filter(f => typeof f === 'string').join(','),\r\n },\r\n );\r\n console.debug('reseration result: ', result);\r\n\r\n result.TerminateReservation = action.payload.UpdateToNow;\r\n if (result.TerminateReservation) {\r\n result.EndTime = dateUtils.formatISO(newDate(null));\r\n }\r\n\r\n result.OfflineMandatory = [];\r\n\r\n yield put(\r\n actions.initReservation_Success({\r\n hasErrors: false,\r\n model: result,\r\n isChanged: false,\r\n isEdit: true,\r\n globalSettings: action.payload.globalSettings,\r\n userTrainigData: null,\r\n }),\r\n );\r\n\r\n const equipments: IReservationEquipmentDto[] =\r\n result.EquipmentsData.length > 0\r\n ? result.EquipmentsData\r\n : !!result.BaseEquipment\r\n ? [result.BaseEquipment]\r\n : [];\r\n if (equipments.length > 0) {\r\n yield put(\r\n actions.extendEquipmentSettingsState({\r\n equipments: equipments,\r\n mandatories: result.MandatoriesEquipments ?? [],\r\n accServices: result.AccServices ?? [],\r\n globalSettings: action.payload.globalSettings,\r\n settings: {} as ServiceSettingsState,\r\n }),\r\n );\r\n }\r\n\r\n if (\r\n action.payload.globalSettings.accServicesEnabled &&\r\n (result.AccServiceId !== null ||\r\n !isEmptyOrWhitespace(result.AccServiceId))\r\n ) {\r\n try {\r\n var AccServices: Array = yield call(\r\n getReservationProperty,\r\n result.Id,\r\n 'AccServices',\r\n );\r\n if (AccServices.length > 0) {\r\n yield put(\r\n actions.setAnyValue({\r\n fieldKey: 'AccServices',\r\n fieldValue: AccServices,\r\n }),\r\n );\r\n yield put(\r\n actions.extendEquipmentSettingsState({\r\n equipments: equipments,\r\n mandatories: result.MandatoriesEquipments ?? [],\r\n accServices: result.AccServices ?? [],\r\n globalSettings: action.payload.globalSettings,\r\n settings: {} as ServiceSettingsState,\r\n }),\r\n );\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n\r\n if (s.Modules.includes(KnownModules.OfflineServices)) {\r\n yield fork(doInitReservationEdit_Load_OfflineMandatory, result);\r\n }\r\n } catch (error: unknown) {\r\n console.error(error);\r\n yield put(actions.initReservation_Error(error));\r\n }\r\n\r\n function* doInitReservationEdit_Load_OfflineMandatory(\r\n result: IReservationDto,\r\n ) {\r\n try {\r\n var OfflineMandatory = yield call(\r\n getReservationProperty,\r\n result.Id,\r\n 'OfflineMandatory',\r\n );\r\n yield put(\r\n actions.extendReservationSettings({\r\n OfflineMandatory: OfflineMandatory,\r\n }),\r\n );\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n}\r\n\r\nfunction* getReservationProperty(\r\n result: number,\r\n fieldName: keyof IReservationDto,\r\n) {\r\n return yield call(\r\n httpClient.get,\r\n `/api/odata/v4/reservations/${result}/${fieldName}`,\r\n );\r\n}\r\n\r\nfunction* doCreate(\r\n action: PayloadAction<{\r\n state: ReservationGlobalState;\r\n calcCredit?: boolean;\r\n }>,\r\n) {\r\n const user: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n const newDate = yield select(state => selectOffsetDate(state, new Date()));\r\n const isCloned = yield select(selectCloneReservations);\r\n const httpPayloads: ReservationInsertModel = ConvertModelToInsertEntity(\r\n action.payload.state,\r\n user,\r\n );\r\n if (action.payload.calcCredit === true) {\r\n httpPayloads.Remarks = 'CalculateCredit';\r\n }\r\n const customFormFiles = action.payload.state.customFormFiles;\r\n try {\r\n const result = yield call(api.insertReservation, httpPayloads);\r\n let response = result as ReservationDetailsResponseModel;\r\n let responseErrors = response.ErrorMessages;\r\n let responseWarnings = response.WarningMessages;\r\n let responseSuccess = response.SuccessMessages;\r\n if (responseErrors.length === 0 && !action.payload.calcCredit) {\r\n if (customFormFiles.length > 0) {\r\n let data = getFilesModel(\r\n [],\r\n customFormFiles,\r\n FileTypes.ReservationFile,\r\n response.Id || -1,\r\n CustomFormTypeEnum.Reservation,\r\n httpPayloads.RecurringUpdateOption,\r\n null,\r\n null,\r\n null,\r\n );\r\n const fileRes = yield call(FileStoreApi.saveFormFiles, data);\r\n let fileResponse = fileRes as IResponseType;\r\n if (fileResponse.ErrorMessages.length > 0) {\r\n responseErrors = [...responseErrors, ...fileResponse.ErrorMessages];\r\n }\r\n }\r\n }\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors\r\n .filter((value, index, self) => self.indexOf(value) === index)\r\n .map(item => {\r\n return {\r\n key: 'reservationInsertError',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n if (isCloned) {\r\n yield put(actions.setCloneReservation(false));\r\n }\r\n if (action.payload.calcCredit) {\r\n yield put(actions.getCredit_Success({ credit: 0, balance: null }));\r\n }\r\n } else {\r\n if (action.payload.calcCredit) {\r\n yield put(\r\n actions.getCredit_Success({\r\n credit: response.credit ?? 0,\r\n balance: response.balance,\r\n }),\r\n );\r\n } else {\r\n if (responseSuccess.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: responseSuccess[0],\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'reservationInsertSuccess',\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: true,\r\n itemName: i18next.t(translations.ReservationDetails),\r\n detailsType: RenderPageType.ReservationDetails,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n } as ReservationDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: 'reservationInsertWarning',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.warnOnTrainingSession) {\r\n let linkUrl = `/trainingsessions?eqid=${response.FirstEquipmentId}&nextonly=true`;\r\n let linkText = i18next.t(translations.ClickHere) as string;\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'warnOnTrainingSession',\r\n persist: true,\r\n message: '',\r\n messageType: SnackBarMessageType.showLinkMessage,\r\n messageTypeProps: {\r\n Id: 0,\r\n created: true,\r\n itemName: i18next.t(translations.UpcomingTrainingSessions),\r\n linkUrl: linkUrl,\r\n linkText: linkText,\r\n afterLinkText: i18next.t(\r\n translations.res_futureTrainingSession_LinkTitle,\r\n ),\r\n detailsType: undefined,\r\n detailsTypeProps: undefined,\r\n },\r\n variant: 'warning',\r\n }),\r\n );\r\n }\r\n yield put(\r\n repetitiveActions.resetState(\r\n dateUtils.formatISO(dateUtils.dateOrStringToDate(newDate)),\r\n ),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n if (!action.payload.calcCredit) {\r\n let hasErrors = responseErrors.length > 0;\r\n if (!isCloned) {\r\n yield put(layoutActions.setNotSavedChanges(false));\r\n }\r\n\r\n yield put(\r\n actions.createReservation_Success({\r\n hasErrors: hasErrors,\r\n reservationIds: response.ReservationIds,\r\n insertModel: response.insertedModel,\r\n ByApprovalErrors: response.ByApprovalErrors,\r\n }),\r\n );\r\n }\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'reservationInsert',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createReservation_Error(Error));\r\n }\r\n}\r\nfunction* doUpdate(\r\n action: PayloadAction<{\r\n current: ReservationDetailsState;\r\n original: ReservationDetailsState;\r\n currentCustomFormFiles: IFormFileValue[];\r\n originalCustomFormFiles: IFormFileValue[];\r\n offlineServices: IOtherServices[];\r\n settings: ReservationSettingsState | undefined;\r\n terminate?: boolean;\r\n }>,\r\n) {\r\n const user: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n const isCloned = yield select(selectCloneReservations);\r\n const reservationDto = yield select(selectReservationDtoState);\r\n const reccurentUpdateOption =\r\n action.payload.settings?.RecurringUpdateOption || 1;\r\n const httpPayloads: ReservationUpdateModel = ConvertModelToUpdateEntity(\r\n action.payload.original,\r\n action.payload.current,\r\n action.payload.settings,\r\n action.payload.offlineServices,\r\n user,\r\n action.payload.terminate,\r\n );\r\n let filesData: UpdateFilesModel[] = [];\r\n if (\r\n action.payload.originalCustomFormFiles.length > 0 ||\r\n action.payload.currentCustomFormFiles.length > 0\r\n ) {\r\n filesData = getFilesModel(\r\n action.payload.originalCustomFormFiles,\r\n action.payload.currentCustomFormFiles,\r\n FileTypes.ReservationFile,\r\n action.payload.current.Id,\r\n CustomFormTypeEnum.Reservation,\r\n reccurentUpdateOption,\r\n null,\r\n null,\r\n null,\r\n );\r\n }\r\n try {\r\n const results = yield call(api.updateReservation, httpPayloads);\r\n let response = results as ReservationDetailsResponseModel;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length === 0) {\r\n if (filesData.length > 0) {\r\n let fileRes = yield call(FileStoreApi.updateFormFiles, filesData);\r\n let fileResponses = fileRes as IResponseType;\r\n if (fileResponses.ErrorMessages.length > 0) {\r\n respErrors = [...respErrors, ...fileResponses.ErrorMessages];\r\n }\r\n }\r\n }\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: 'reservationUpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n if (isCloned) {\r\n yield put(actions.setCloneReservation(false));\r\n }\r\n if (action.payload.terminate) {\r\n yield put(actions.terminateReservation_error());\r\n }\r\n } else {\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'reservationUpdateSuccess',\r\n message:\r\n action.payload.terminate === true\r\n ? i18next.t(translations.Succes_ReservationTerminated)\r\n : response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: false,\r\n itemName: i18next.t(translations.ReservationDetails),\r\n detailsType: RenderPageType.ReservationDetails,\r\n itemEndName: action.payload.terminate\r\n ? ' end time updated'\r\n : undefined,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id,\r\n },\r\n } as ReservationDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n if (action.payload.terminate === true) {\r\n yield call(api.sendTerminateNotification, response.ReservationIds);\r\n yield put(actions.terminateReservation_success());\r\n }\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'reservationUpdateWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.userTrainingsApprovalData === null) {\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n if (\r\n action.payload.offlineServices.length > 0 &&\r\n action.payload.offlineServices.some(f => f.Id < 1)\r\n ) {\r\n const offRes = yield call(\r\n OtherServicesApi.insertConsumableServices,\r\n action.payload.offlineServices.filter(f => f.Id < 1),\r\n );\r\n let offResponse = offRes as ConsumableServicesResponse;\r\n let offErrors = offResponse.ErrorMessages;\r\n let offWarnings = offResponse.WarningMessages;\r\n if (offErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n offErrors.map(item => {\r\n return {\r\n key: 'serviceInsertError',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (offWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n offWarnings.map(item => {\r\n return {\r\n key: 'serviceInsertWarning',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n yield put(layoutActions.setNotSavedChanges(false));\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n\r\n if (isCloned) {\r\n yield put(\r\n actions.initClonedReservation_Success({\r\n model: reservationDto,\r\n reservation: action.payload.current,\r\n settings: action.payload.settings,\r\n }),\r\n );\r\n }\r\n yield put(\r\n actions.updateReservation_Success({\r\n hasErrors: hasErrors,\r\n userTrainigData: response.userTrainingsApprovalData,\r\n insertModel: response.insertedModel,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'reservationUpdateErr',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateReservation_Error(Error));\r\n if (action.payload.terminate) {\r\n yield put(actions.terminateReservation_error());\r\n }\r\n }\r\n}\r\nfunction* doUpdateSettigs(action: PayloadAction) {\r\n yield put(actions.updateReservationSettings(action.payload));\r\n}\r\nfunction* doUpdateEquipmentSettigs(\r\n action: PayloadAction<{\r\n equipments: IReservationEquipmentDto[];\r\n mandatories: IMandatoryEquipmentsDto[];\r\n accServices: IEquipmentAccServiceDto[];\r\n globalSettings: GlobalSettingsType;\r\n settings?: ServiceSettingsState;\r\n }>,\r\n) {\r\n try {\r\n let allEquipments = [\r\n ...action.payload.equipments,\r\n ...((action.payload.mandatories as Entity<\r\n number\r\n >[]) as IReservationEquipmentDto[]),\r\n ];\r\n const authenticatedUser = yield select(selectAuthenticatedUser);\r\n let newSettings = mapSettingsFromServices(\r\n allEquipments,\r\n action.payload.accServices,\r\n action.payload.globalSettings,\r\n authenticatedUser,\r\n action.payload.settings,\r\n );\r\n yield put(actions.updateEquipmentSettingsState(newSettings));\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\nfunction* doLoadValidationData(\r\n action: PayloadAction<{\r\n parameters: EquipmentsChangeStateParameters;\r\n warnings: string[];\r\n errors: string[];\r\n }>,\r\n) {\r\n try {\r\n let res = yield call(\r\n api.getEquipmentsChangeState,\r\n action.payload.parameters,\r\n );\r\n let response = res as ReservationEquipmentsChangeResult;\r\n if (!!response?.CustomForms) {\r\n if (response?.CustomForms?.IsValid) {\r\n yield put(\r\n actions.extendReservationSettings({\r\n CustomForms: response.CustomForms.CustomForms || [],\r\n }),\r\n );\r\n }\r\n }\r\n if (!!response.StatusChange && response.StatusChange !== null) {\r\n yield put(\r\n actions.extendReservationSettings({\r\n IsForceTutoring: response.StatusChange.IsForceTutoring,\r\n }),\r\n );\r\n }\r\n response.WarningMessages = [\r\n ...response.WarningMessages,\r\n ...action.payload.warnings,\r\n ];\r\n response.ErrorMessages = [\r\n ...response.ErrorMessages,\r\n ...action.payload.errors,\r\n ];\r\n yield put(actions.initValidationData_Success(response));\r\n } catch (error: unknown) {\r\n yield put(actions.initValidationData_Error());\r\n }\r\n}\r\nfunction* doSetStart(action: PayloadAction) {\r\n yield put(\r\n actions.setStartSuccess(\r\n dateUtils.formatQueryStringDate(dateUtils.parseISO(action.payload)),\r\n ),\r\n );\r\n}\r\nfunction* doSetEnd(action: PayloadAction) {\r\n yield put(\r\n actions.setEndSuccess(\r\n dateUtils.formatQueryStringDate(dateUtils.parseISO(action.payload)),\r\n ),\r\n );\r\n}\r\nfunction* doSetAny(\r\n action: PayloadAction<{\r\n fieldKey: keyof ReservationDetailsState;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setAnyValueSuccess(action.payload));\r\n}\r\nfunction* doTransferReservation(action: PayloadAction) {\r\n try {\r\n let res = yield call(api.transferReservation, action.payload);\r\n let response = res as IResponseType;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: 'transferError',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n yield put(actions.transferReservation_Error(response.ErrorMessages[0]));\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'transferSuccess',\r\n message: response.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n yield* doSetAny({\r\n payload: {\r\n fieldKey: 'WaitingTransferApproval',\r\n fieldValue: true,\r\n },\r\n type: action.type,\r\n });\r\n yield* doSetAny({\r\n payload: {\r\n fieldKey: 'TransferredTo',\r\n fieldValue: action.payload.User,\r\n },\r\n type: action.type,\r\n });\r\n yield put(layoutActions.setNotSavedChanges(false));\r\n yield put(actions.transferReservation_Success(action.payload));\r\n yield call(api.sendTransferNotification, action.payload);\r\n }\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'transferError',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.transferReservation_Error(Error));\r\n }\r\n}\r\nfunction* doCancelTransferReservation(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n let res = yield call(\r\n api.cancelTransferReservation,\r\n action.payload.ReservtionId,\r\n );\r\n let response = res as IResponseType;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: 'transferError',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n yield put(actions.cancelTransfer_Error(response.ErrorMessages[0]));\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'transferSuccess',\r\n message: response.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n yield* doSetAny({\r\n payload: {\r\n fieldKey: 'WaitingTransferApproval',\r\n fieldValue: false,\r\n },\r\n type: action.type,\r\n });\r\n yield* doSetAny({\r\n payload: {\r\n fieldKey: 'TransferredTo',\r\n fieldValue: null,\r\n },\r\n type: action.type,\r\n });\r\n yield put(layoutActions.setNotSavedChanges(false));\r\n yield put(actions.cancelTransfer_Success());\r\n yield call(api.sendCancelTransferNotification, action.payload);\r\n }\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'transferError',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.cancelTransfer_Error(Error));\r\n }\r\n}\r\nfunction* doTerminateReservation(\r\n action: PayloadAction<{\r\n current: ReservationDetailsState;\r\n original: ReservationDetailsState;\r\n currentCustomFormFiles: IFormFileValue[];\r\n originalCustomFormFiles: IFormFileValue[];\r\n settings: ReservationSettingsState | undefined;\r\n }>,\r\n) {\r\n yield* doUpdate({\r\n payload: {\r\n current: action.payload.current,\r\n original: action.payload.original,\r\n currentCustomFormFiles: action.payload.currentCustomFormFiles,\r\n originalCustomFormFiles: action.payload.originalCustomFormFiles,\r\n offlineServices: [],\r\n settings: action.payload.settings,\r\n terminate: true,\r\n },\r\n type: action.type,\r\n });\r\n}\r\nexport function* reservationSaga() {\r\n yield takeLeading(actions.initReservation.type, doInitReservation);\r\n yield takeLatest(actions.createReservation.type, doCreate);\r\n yield takeLatest(actions.updateReservation.type, doUpdate);\r\n yield takeLatest(actions.extendReservationSettings.type, doUpdateSettigs);\r\n yield takeLatest(\r\n actions.extendEquipmentSettingsState.type,\r\n doUpdateEquipmentSettigs,\r\n );\r\n yield takeLatest(actions.initValidationData.type, doLoadValidationData);\r\n yield takeLatest(actions.setStartDate.type, doSetStart);\r\n yield takeLatest(actions.setEndDate.type, doSetEnd);\r\n yield takeLatest(actions.setAnyValue.type, doSetAny);\r\n yield takeLatest(actions.transferReservation.type, doTransferReservation);\r\n yield takeLatest(actions.cancelTransfer.type, doCancelTransferReservation);\r\n yield takeLatest(actions.terminateReservation.type, doTerminateReservation);\r\n}\r\n","import { IReservationEquipmentDto } from './types';\r\n\r\nexport function TryDisableRemoveableEquipments(\r\n equipments: IReservationEquipmentDto[],\r\n condition: (item: IReservationEquipmentDto) => boolean,\r\n title?: string,\r\n): IReservationEquipmentDto[] {\r\n let disabled = equipments\r\n .filter(f => condition(f) === true)\r\n .map(f =>\r\n Object.assign({}, f, {\r\n noremoved: true,\r\n titleInfo: title,\r\n }),\r\n );\r\n let other = equipments.filter(f => condition(f) === false);\r\n return [...disabled, ...other];\r\n}\r\n","import { CheckEntity } from 'app/components/CheckBoxGroup';\r\nimport { generateTrainingSessionName } from 'app/components/pickers/AutocompletePickers/TrainingSessionPicker';\r\nimport { getSingleInvoiceFundingType } from 'app/components/pickers/StaticOptionsPickers/FundingTypeIdPicker';\r\nimport { Entity } from 'types/common';\r\nimport { GlobalSettingsType } from '../components/useGlobalSettingsHook';\r\nimport { combineOptionalEquipments } from './mapSettingsFromServices';\r\nimport { TryDisableRemoveableEquipments } from './TryDisableRemoveableEquipments';\r\nimport {\r\n IReservationDto,\r\n getSingleReservationStatus,\r\n ReservationDetailsState,\r\n} from './types';\r\n\r\nexport function ConvertDtoToModel(\r\n dto: IReservationDto,\r\n globalSettings?: GlobalSettingsType,\r\n) {\r\n let equipments =\r\n dto.EquipmentsData.length > 0\r\n ? dto.EquipmentsData\r\n : dto.BaseEquipment === null\r\n ? []\r\n : [dto.BaseEquipment];\r\n if (dto.Id > 0) {\r\n if (dto.StaffMandatoryEquipment !== null) {\r\n equipments = TryDisableRemoveableEquipments(\r\n equipments,\r\n f => f.Id === dto.StaffMandatoryEquipment?.Id,\r\n `Mandatory instrument for ${dto.StaffUser?.Name}`,\r\n );\r\n }\r\n if (!globalSettings?.allowToRemoveFromMultipleReservation) {\r\n equipments = TryDisableRemoveableEquipments(\r\n equipments,\r\n f => f.Id > 0,\r\n `Not removeable service`,\r\n );\r\n }\r\n }\r\n let model: ReservationDetailsState = {\r\n Id: dto.Id,\r\n BookedBy: dto.BookedBy as Entity,\r\n AccServices: (dto.AccServices as Entity[]) || [],\r\n Budget: dto.Budget as Entity,\r\n CollaboratedUsers: (dto.CollaboratedUsers as Entity[]) || [],\r\n EndTime: dto.EndTime,\r\n EquipmentsData: equipments as Entity[],\r\n FormValues: dto.FormValues,\r\n InstituteProject: (dto.InstituteProject as Entity) || null,\r\n PartialAttendance: dto.PartialAttendance,\r\n SampleIds: dto.SampleIds,\r\n StaffUser: (dto.StaffUser as Entity) || null,\r\n StartTime: dto.StartTime,\r\n TrainingSession:\r\n dto.TrainingSession === null\r\n ? null\r\n : generateTrainingSessionName(dto.TrainingSession),\r\n TrainingSignUp: dto.TrainingSignUp,\r\n TransferredTo: (dto.TransferredTo as Entity) || null,\r\n WaitingTransferApproval: dto.WaitingTransferApproval,\r\n TransferFromId: dto.TransferFromId,\r\n Tutoring: dto.Tutoring,\r\n FullDayReservation: dto.FullDayReservation,\r\n ADGroup: (dto.ADGroup as Entity) || null,\r\n BudgetExperiment: (dto.BudgetExperiment as Entity) || null,\r\n DisplayName: dto.DisplayName,\r\n ExternalCustomer: (dto.ExternalCustomer as Entity) || null,\r\n FundingType: getSingleInvoiceFundingType(dto.FundingTypeId || 0),\r\n PartialAttendanceEnd: dto.PartialAttendanceEnd,\r\n PartialAttendanceStart: dto.PartialAttendanceStart,\r\n PurchaseOrder: dto.PurchaseOrder,\r\n Reference: dto.Reference,\r\n Remarks: dto.Remarks,\r\n SampleRunId: dto.SampleRunId,\r\n Status: getSingleReservationStatus(dto.StatusId),\r\n WorkflowBooking: (dto.WorkflowBooking as Entity) || null,\r\n OptionalsEquipments: (\r\n combineOptionalEquipments(dto.OptionalsEquipments) ?? []\r\n ).map(op => {\r\n if (dto.EquipmentsData.some(f => f.Id === op.Id)) {\r\n return Object.assign({}, op, { disabled: true, checked: false });\r\n } else {\r\n return Object.assign({}, op, { disabled: false, checked: false });\r\n }\r\n }) as CheckEntity[],\r\n AssemblyParts: dto.AssemblyParts,\r\n };\r\n return model;\r\n}\r\n","import {\r\n IReservationDto,\r\n RecurringReservationUpdateOptions,\r\n ReservationSettingsState,\r\n} from './types';\r\n\r\nexport function getReservationSettings(dto: IReservationDto) {\r\n let settings = {\r\n BaseEquipment: dto.BaseEquipment,\r\n FatherId: dto.FatherId,\r\n Repeat_Period: dto.Repeat_Period,\r\n TrainingSessionOnly: dto.TrainingSessionOnly,\r\n SessionId: dto.SessionId,\r\n RecordDate: dto.RecordDate,\r\n LastUpdateDate: dto.LastUpdateDate,\r\n Entered: dto.Entered,\r\n Cancelled: dto.Cancelled,\r\n LastUpdateAdmin: dto.LastUpdateAdmin,\r\n RepeatEndTime: dto.RepeatEndTime,\r\n Repeat: dto.Repeat,\r\n HasCharges: dto.HasCharges,\r\n FundingTypeId: dto.FundingTypeId,\r\n ParentAssemblyReservationId: dto.ParentAssemblyReservationId,\r\n TopAssemblyReservationId: dto.TopAssemblyReservationId,\r\n TransferInProgress: dto.TransferInProgress,\r\n HasOfflineServices: dto.HasOfflineServices,\r\n HasTrainingSession: dto.HasTrainingSession,\r\n NextReservationTime: dto.NextReservationTime,\r\n PartReservations: dto.PartReservations,\r\n AssignToServiceRequestId: dto.AssignToServiceRequestId,\r\n AssignToServiceRequestRowIds: dto.AssignToServiceRequestRowIds,\r\n AssignToServiceRequestSampleIds: dto.AssignToServiceRequestSampleIds,\r\n TutorName: dto.TutorName,\r\n UserRequestedByApproval: false,\r\n RecurringUpdateOption: RecurringReservationUpdateOptions.CurrentReservation,\r\n CustomForms: dto.CustomForms,\r\n MandatoriesEquipments: dto.MandatoriesEquipments,\r\n OptionalsEquipments: dto.OptionalsEquipments,\r\n TerminateReservation: dto.TerminateReservation,\r\n FirstInitEquipments: dto.FirstInitEquipments,\r\n OfflineMandatory: dto.OfflineMandatory,\r\n IsForceTutoring: dto.IsForceTutoring,\r\n ForceFullDayReservations: dto.ForceFullDayReservations,\r\n FutureReservation: dto.IsFuture,\r\n Ongoing: dto.IsOngoing,\r\n PastReservation: dto.IsPast,\r\n StaffMandatoryEquipment: dto.StaffMandatoryEquipment,\r\n } as ReservationSettingsState;\r\n\r\n return settings;\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { GlobalSettingsType } from '../components/useGlobalSettingsHook';\r\nimport { reservationSaga } from './saga';\r\nimport {\r\n createReservation_Success_Action,\r\n EquipmentsChangeStateParameters,\r\n IMandatoryEquipmentsDto,\r\n IReservationDto,\r\n IReservationEquipmentDto,\r\n PricingState,\r\n ReservationDetailsState,\r\n ReservationEquipmentsChangeResult,\r\n ReservationGlobalState,\r\n ReservationInsertModel,\r\n ReservationQueryStringParameters,\r\n ReservationSettingsState,\r\n ReservationState,\r\n ServiceSettingsState,\r\n TransferToReservation,\r\n UserTrainingReservationData,\r\n} from './types';\r\nimport { ConvertDtoToModel } from './ConvertDtoToModel';\r\nimport { getReservationSettings } from './getReservationSettings';\r\n\r\nexport const initialState: ReservationState = {\r\n detailsState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n isEdit: false,\r\n confirmAssistedReservations: undefined,\r\n processing: false,\r\n reservationSettingsState: undefined,\r\n equipmentsSettingsState: undefined,\r\n trainingsData: null,\r\n valueHandler: undefined,\r\n requestedValueFor: undefined,\r\n requestedValue: undefined,\r\n equipmentChangeResultState: undefined,\r\n isChangeCompleted: undefined,\r\n transferState: {\r\n User: null,\r\n ReservtionId: undefined,\r\n WaitingTransferApproval: undefined,\r\n transferProcessing: undefined,\r\n transferStepCompleted: undefined,\r\n },\r\n creditState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n },\r\n hasCharges: undefined,\r\n savedOfflineServices: [],\r\n refeshOfflineService: undefined,\r\n terminationState: {\r\n terminatProcessing: undefined,\r\n terminateCompleted: undefined,\r\n },\r\n cloneReservation: undefined,\r\n reservationDtoState: undefined,\r\n asyncChangeLoading: undefined,\r\n submitCredit: undefined,\r\n refreshWorkOrderLink: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'reservation',\r\n initialState,\r\n reducers: {\r\n /**\r\n * Resets reservation details to it's initial state\r\n * @param state\r\n * @param action\r\n */\r\n reset(state, action: PayloadAction) {\r\n Object.assign(state, initialState);\r\n },\r\n initReservation(\r\n state,\r\n action: PayloadAction<{\r\n query: ReservationQueryStringParameters;\r\n globalSettings: GlobalSettingsType;\r\n prevState?: ReservationDetailsState;\r\n }>,\r\n ) {\r\n let isChange = action.payload.query.resourceChanged === 'true';\r\n state.processing = isChange ? false : true;\r\n if (isChange) {\r\n state.detailsState = Object.assign(state.detailsState, {\r\n processing: true,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n });\r\n state.isChangeCompleted = false;\r\n } else {\r\n state.detailsState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.equipmentsSettingsState = undefined;\r\n }\r\n state.confirmAssistedReservations = undefined;\r\n state.reservationSettingsState = undefined;\r\n state.trainingsData = null;\r\n },\r\n initReservation_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n model: IReservationDto;\r\n isChanged: boolean;\r\n isEdit: boolean;\r\n globalSettings: GlobalSettingsType;\r\n userTrainigData: UserTrainingReservationData | null;\r\n }>,\r\n ) {\r\n state.processing = false;\r\n state.detailsState.data = ConvertDtoToModel(\r\n action.payload.model,\r\n action.payload.globalSettings,\r\n );\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n state.reservationSettingsState = getReservationSettings(\r\n action.payload.model,\r\n );\r\n state.isChangeCompleted =\r\n action.payload.isChanged === true ? true : undefined;\r\n state.transferState.WaitingTransferApproval =\r\n action.payload.model.WaitingTransferApproval;\r\n state.transferState.ReservtionId = action.payload.model.Id;\r\n state.transferState.User = action.payload.model.TransferredTo;\r\n state.reservationDtoState = action.payload.model;\r\n state.isEdit = action.payload.isEdit;\r\n state.trainingsData = action.payload.userTrainigData;\r\n if (action.payload.isEdit) {\r\n state.savedOfflineServices = [];\r\n }\r\n },\r\n initClonedReservation_Success(\r\n state,\r\n action: PayloadAction<{\r\n model: IReservationDto;\r\n reservation: ReservationDetailsState;\r\n settings?: ReservationSettingsState;\r\n }>,\r\n ) {\r\n state.processing = false;\r\n state.detailsState.data = ConvertDtoToModel(action.payload.model); //action.payload.reservation;\r\n state.detailsState.processing = false;\r\n state.reservationSettingsState = getReservationSettings(\r\n action.payload.model,\r\n );\r\n state.isEdit = false;\r\n state.refeshOfflineService = true;\r\n },\r\n initReservation_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.isChangeCompleted = undefined;\r\n },\r\n initValidationData(\r\n state,\r\n action: PayloadAction<{\r\n parameters: EquipmentsChangeStateParameters;\r\n warnings: string[];\r\n errors: string[];\r\n }>,\r\n ) {\r\n state.asyncChangeLoading = true;\r\n },\r\n initValidationData_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.equipmentChangeResultState = action.payload;\r\n state.asyncChangeLoading = undefined;\r\n },\r\n initValidationData_Error(state, action: PayloadAction) {\r\n state.equipmentChangeResultState = undefined;\r\n state.asyncChangeLoading = undefined;\r\n },\r\n resetDetailsState(state, action: PayloadAction) {\r\n state.detailsState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.reservationSettingsState = undefined;\r\n state.confirmAssistedReservations = undefined;\r\n state.equipmentsSettingsState = undefined;\r\n state.trainingsData = null;\r\n state.transferState = {\r\n User: null,\r\n ReservtionId: undefined,\r\n WaitingTransferApproval: undefined,\r\n transferProcessing: undefined,\r\n };\r\n state.reservationDtoState = undefined;\r\n state.savedOfflineServices = [];\r\n state.submitCredit = undefined;\r\n state.ByApprovalErrors = undefined;\r\n state.refreshWorkOrderLink = undefined;\r\n },\r\n resetOperateState(state, action: PayloadAction) {\r\n state.detailsState.hasErrors = false;\r\n state.detailsState.completed = false;\r\n },\r\n createReservation(\r\n state,\r\n action: PayloadAction<{\r\n state: ReservationGlobalState;\r\n calcCredit?: boolean;\r\n ByApproval?: boolean;\r\n }>,\r\n ) {\r\n if (action.payload.calcCredit === true) {\r\n state.creditState.processing = true;\r\n state.creditState.completed = undefined;\r\n state.creditState.hasErrors = undefined;\r\n } else {\r\n state.detailsState.processing = true;\r\n state.detailsState.completed = false;\r\n state.detailsState.hasErrors = false;\r\n }\r\n },\r\n createReservation_Success(state, action: createReservation_Success_Action) {\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n state.ByApprovalErrors = action.payload.ByApprovalErrors;\r\n state.detailsState.completed = true;\r\n if (!action.payload.hasErrors) {\r\n state.savedOfflineServices = [];\r\n }\r\n },\r\n createReservation_Error(state, action: PayloadAction) {\r\n state.detailsState.processing = false;\r\n state.detailsState.completed = true;\r\n state.detailsState.hasErrors = true;\r\n state.cloneReservation = false;\r\n },\r\n updateReservation(\r\n state,\r\n action: PayloadAction<{\r\n current: ReservationDetailsState;\r\n original: ReservationDetailsState;\r\n currentCustomFormFiles: IFormFileValue[];\r\n originalCustomFormFiles: IFormFileValue[];\r\n offlineServices: IOtherServices[];\r\n settings: ReservationSettingsState | undefined;\r\n terminate?: boolean;\r\n }>,\r\n ) {\r\n state.detailsState.processing = true;\r\n state.detailsState.completed = undefined;\r\n state.detailsState.hasErrors = undefined;\r\n },\r\n updateReservation_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n userTrainigData: UserTrainingReservationData | null;\r\n insertModel: ReservationInsertModel;\r\n }>,\r\n ) {\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n state.detailsState.completed = true;\r\n state.confirmAssistedReservations =\r\n action.payload.userTrainigData !== null;\r\n state.trainingsData = action.payload.userTrainigData;\r\n if (!action.payload.hasErrors) {\r\n state.savedOfflineServices = [];\r\n }\r\n },\r\n updateReservation_Error(state, action: PayloadAction) {\r\n state.detailsState.processing = false;\r\n state.detailsState.completed = true;\r\n state.detailsState.hasErrors = true;\r\n },\r\n extendReservationSettings(\r\n state,\r\n action: PayloadAction>,\r\n ) {},\r\n updateReservationSettings(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.reservationSettingsState = Object.assign(\r\n {},\r\n state.reservationSettingsState,\r\n action.payload,\r\n );\r\n },\r\n extendEquipmentSettingsState(\r\n state,\r\n action: PayloadAction<{\r\n equipments: IReservationEquipmentDto[];\r\n mandatories: IMandatoryEquipmentsDto[];\r\n accServices: IEquipmentAccServiceDto[];\r\n globalSettings: GlobalSettingsType;\r\n settings?: ServiceSettingsState;\r\n }>,\r\n ) {\r\n state.asyncChangeLoading = true;\r\n },\r\n updateEquipmentSettingsState(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.equipmentsSettingsState = action.payload;\r\n state.asyncChangeLoading = undefined;\r\n },\r\n resetAssisteTrainingData(state, action: PayloadAction) {\r\n state.confirmAssistedReservations = undefined;\r\n state.trainingsData = null;\r\n },\r\n resetEquipmentChangeState(state, action: PayloadAction) {\r\n state.equipmentChangeResultState = undefined;\r\n },\r\n setStartDate(state, action: PayloadAction) {},\r\n setStartSuccess(state, action: PayloadAction) {\r\n state.valueHandler = {\r\n run: true,\r\n fieldKey: 'StartTime',\r\n fieldValue: action.payload,\r\n shouldValidate: true,\r\n };\r\n },\r\n setEndDate(state, action: PayloadAction) {},\r\n setEndSuccess(state, action: PayloadAction) {\r\n state.valueHandler = {\r\n run: true,\r\n fieldKey: 'EndTime',\r\n fieldValue: action.payload,\r\n shouldValidate: true,\r\n };\r\n },\r\n setAnyValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof ReservationDetailsState;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setAnyValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof ReservationDetailsState;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.valueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetValueHandler(state, action: PayloadAction) {\r\n state.valueHandler = undefined;\r\n },\r\n getAnyValue(state, action: PayloadAction) {\r\n state.requestedValueFor = action.payload;\r\n },\r\n getAnyValueSuccess(state, action: PayloadAction) {\r\n state.requestedValue = action.payload;\r\n },\r\n resetRequestedFor(state, action: PayloadAction) {\r\n state.requestedValueFor = undefined;\r\n },\r\n transferReservation(state, action: PayloadAction) {\r\n state.transferState.transferProcessing = true;\r\n state.transferState.transferStepCompleted = undefined;\r\n },\r\n transferReservation_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.transferState.transferProcessing = false;\r\n state.transferState.User = action.payload.User;\r\n state.transferState.ReservtionId = action.payload.ReservtionId;\r\n state.transferState.WaitingTransferApproval = true;\r\n state.transferState.transferStepCompleted = true;\r\n },\r\n transferReservation_Error(state, action: PayloadAction) {\r\n state.transferState.transferProcessing = false;\r\n state.transferState.transferStepCompleted = false;\r\n },\r\n resetTransferState(state, action: PayloadAction) {\r\n state.transferState.transferProcessing = undefined;\r\n state.transferState.User = null;\r\n state.transferState.ReservtionId = undefined;\r\n state.transferState.WaitingTransferApproval = undefined;\r\n state.transferState.transferStepCompleted = undefined;\r\n },\r\n cancelTransfer(state, action: PayloadAction) {\r\n state.transferState.transferProcessing = true;\r\n state.transferState.transferStepCompleted = undefined;\r\n },\r\n cancelTransfer_Success(state, action: PayloadAction) {\r\n state.transferState.transferProcessing = false;\r\n state.transferState.User = null;\r\n state.transferState.WaitingTransferApproval = false;\r\n state.transferState.ReservtionId = undefined;\r\n state.transferState.transferStepCompleted = true;\r\n },\r\n cancelTransfer_Error(state, action: PayloadAction) {\r\n state.transferState.transferProcessing = false;\r\n state.transferState.transferStepCompleted = false;\r\n },\r\n getCredit(state, action: PayloadAction) {\r\n state.creditState.processing = true;\r\n state.creditState.completed = undefined;\r\n state.creditState.hasErrors = undefined;\r\n state.submitCredit = undefined;\r\n },\r\n getCredit_Success(state, action: PayloadAction) {\r\n state.creditState.processing = false;\r\n state.creditState.completed = true;\r\n state.creditState.data = action.payload;\r\n },\r\n getCredit_Error(state, action: PayloadAction) {\r\n state.creditState.processing = false;\r\n state.creditState.completed = true;\r\n state.creditState.data = undefined;\r\n },\r\n resetCreditState(state, action: PayloadAction) {\r\n state.creditState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.submitCredit = undefined;\r\n },\r\n setSavedOfflineServices(state, action: PayloadAction) {\r\n state.savedOfflineServices = action.payload;\r\n },\r\n setRefreshOfflineServices(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.refeshOfflineService = action.payload;\r\n },\r\n terminateReservation(\r\n state,\r\n action: PayloadAction<{\r\n current: ReservationDetailsState;\r\n original: ReservationDetailsState;\r\n currentCustomFormFiles: IFormFileValue[];\r\n originalCustomFormFiles: IFormFileValue[];\r\n settings: ReservationSettingsState | undefined;\r\n }>,\r\n ) {\r\n state.terminationState.terminatProcessing = true;\r\n state.terminationState.terminateCompleted = undefined;\r\n },\r\n terminateReservation_success(state, action: PayloadAction) {\r\n state.terminationState.terminatProcessing = false;\r\n state.terminationState.terminateCompleted = true;\r\n },\r\n terminateReservation_error(state, action: PayloadAction) {\r\n state.terminationState.terminatProcessing = false;\r\n state.terminationState.terminateCompleted = true;\r\n },\r\n resetTerminateState(state, action: PayloadAction) {\r\n state.terminationState = {\r\n terminatProcessing: undefined,\r\n terminateCompleted: undefined,\r\n };\r\n },\r\n setCloneReservation(state, action: PayloadAction) {\r\n state.cloneReservation = action.payload;\r\n },\r\n setAsyncChangeLoading(state, action: PayloadAction) {\r\n state.asyncChangeLoading = action.payload;\r\n },\r\n setSubmitCredit(state, action: PayloadAction) {\r\n state.submitCredit = action.payload;\r\n },\r\n setByApprovalErrors(\r\n state,\r\n action: PayloadAction | undefined>,\r\n ) {\r\n state.ByApprovalErrors = action.payload;\r\n },\r\n setRefreshWorkOrderLink(state, action: PayloadAction) {\r\n state.refreshWorkOrderLink = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: reservationActions } = slice;\r\n\r\nexport const useReservationSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: reservationSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useReservationSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { FormLabel } from '@material-ui/core';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport FormControl from 'app/components/Forms/FormControls/FormControl';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport clsx from 'clsx';\r\n\r\nexport interface GhostInputProps {\r\n label?: React.ReactNode;\r\n valueHtml?: React.ReactNode;\r\n valueText?: React.ReactNode;\r\n id?: string;\r\n fullWidth?: boolean;\r\n info?: string;\r\n labelBolder?: boolean;\r\n}\r\nexport function GhostInput(props: GhostInputProps) {\r\n const {\r\n label,\r\n valueHtml,\r\n valueText,\r\n info,\r\n labelBolder,\r\n fullWidth = true,\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n {label && (\r\n \r\n {label} {info && }\r\n \r\n )}\r\n {valueText && (\r\n \r\n {valueText}\r\n \r\n )}\r\n {valueHtml}\r\n \r\n \r\n );\r\n}\r\n","import {\r\n Chip,\r\n ChipProps,\r\n darken,\r\n fade,\r\n Theme,\r\n withStyles,\r\n} from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { WithStylesOptions } from '@material-ui/styles';\r\nimport { inputLabelM, inputLabelXS } from 'styles/typography/bookitTypography';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { Check } from '../BasicInputs/Check';\r\n\r\nexport interface BookitChipProps extends ChipProps {\r\n customcolor?: string;\r\n custombgcolor?: string;\r\n customiconcolor?: string;\r\n fullwidth?: boolean;\r\n customwidth?: number | string;\r\n shape?: 'squar' | 'circle';\r\n customsize?: 'xs' | 'small' | 'medium';\r\n notremoved?: boolean;\r\n}\r\nexport interface BookitChipWithInfoProps extends BookitChipProps {\r\n info?: React.ReactNode;\r\n}\r\nconst StyledChip = withStyles<\r\n | 'root'\r\n | 'disabled'\r\n | 'label'\r\n | 'labelSmall'\r\n | 'clickable'\r\n | 'sizeSmall'\r\n | 'deleteIcon',\r\n WithStylesOptions,\r\n {\r\n shape?: 'squar' | 'circle';\r\n custombgcolor?: string;\r\n customsize?: 'xs' | 'small' | 'medium';\r\n customcolor?: string;\r\n customiconcolor?: string;\r\n fullwidth?: boolean;\r\n customwidth?: number | string;\r\n notremoved?: boolean;\r\n size?: 'small' | 'medium';\r\n disabled?: boolean;\r\n }\r\n>((theme: Theme) => ({\r\n root: {\r\n justifyContent: 'space-around',\r\n borderRadius: props =>\r\n props.shape === 'squar' ? 4 : props.shape === 'circle' ? 50 : 4,\r\n backgroundColor: props => props.custombgcolor ?? theme.palette.primary.main,\r\n height: props =>\r\n props.customsize === 'xs'\r\n ? 20\r\n : props.customsize === 'small'\r\n ? 24\r\n : props.customsize === 'medium'\r\n ? 32\r\n : 24,\r\n color: props => props.customcolor ?? theme.palette.common.white,\r\n gap: 4,\r\n paddingBlock: props =>\r\n props.customsize === 'xs'\r\n ? '2px'\r\n : props.customsize === 'small'\r\n ? '6px'\r\n : props.customsize === 'medium'\r\n ? '8px'\r\n : '4px',\r\n '&$disabled': {\r\n opacity: 1,\r\n backgroundColor: theme.palette.common.grayComponents,\r\n color: theme.palette.common.white,\r\n pointerEvents: 'visible',\r\n },\r\n '&:hover, &:focus': {\r\n backgroundColor: props =>\r\n props.custombgcolor === undefined\r\n ? theme.palette.primary.dark\r\n : darken(props.custombgcolor, 0.2),\r\n color: props =>\r\n props.customcolor === undefined\r\n ? theme.palette.common.white\r\n : props.customcolor,\r\n },\r\n width: props =>\r\n props.fullwidth\r\n ? '100%'\r\n : props.customwidth\r\n ? props.customwidth\r\n : undefined,\r\n maxWidth: props => (props.notremoved ? '100%' : 'calc(100% - 6px)'),\r\n },\r\n disabled: {\r\n backgroundColor: theme.palette.common.grayComponents,\r\n color: theme.palette.common.white,\r\n },\r\n label: inputLabelM,\r\n labelSmall: inputLabelXS,\r\n clickable: {\r\n backgroundColor: props => props.custombgcolor ?? theme.palette.primary.main,\r\n color: props => props.customcolor ?? theme.palette.common.white,\r\n },\r\n sizeSmall: {\r\n height: 20,\r\n },\r\n deleteIcon: {\r\n color: props =>\r\n props.customiconcolor === undefined\r\n ? theme.palette.primary.contrastText\r\n : props.customiconcolor,\r\n height: 16,\r\n width: 16,\r\n margin: props =>\r\n props.size === 'small' ? '0 4px 0 -4px' : '0 12px 0 -12px',\r\n display: props => (props.notremoved ? 'none' : 'inline-block'),\r\n '&:hover': {\r\n color: props =>\r\n props.customiconcolor === undefined\r\n ? fade(theme.palette.primary.contrastText, 0.8)\r\n : fade(props.customiconcolor, 0.8),\r\n },\r\n pointerEvents: props => (props.disabled ? 'none' : 'auto'),\r\n },\r\n}))(Chip);\r\n\r\nexport const BookitChip = (props: BookitChipProps) => {\r\n const {\r\n deleteIcon,\r\n notremoved,\r\n fullwidth,\r\n disabled,\r\n customcolor,\r\n custombgcolor,\r\n customiconcolor,\r\n customwidth,\r\n shape,\r\n customsize,\r\n ...other\r\n } = props;\r\n return (\r\n \r\n )\r\n }\r\n onDelete={event => {\r\n notremoved\r\n ? event.preventDefault()\r\n : !!props.onDelete && props.onDelete(event);\r\n }}\r\n fullwidth={fullwidth}\r\n custombgcolor={custombgcolor}\r\n customiconcolor={customiconcolor}\r\n shape={shape}\r\n customsize={customsize}\r\n customwidth={customwidth}\r\n customcolor={customcolor}\r\n disabled={disabled}\r\n notremoved={notremoved}\r\n {...other}\r\n />\r\n );\r\n};\r\nexport interface BookitChipWithCheckProps extends BookitChipProps {\r\n onChange?: (event: React.ChangeEvent) => void;\r\n color?: 'primary' | 'secondary' | 'default';\r\n checked?: boolean;\r\n checkid?: string;\r\n checkname?: string;\r\n label?: string;\r\n info?: string;\r\n}\r\nexport const BookitChipWithCheck = (props: BookitChipWithCheckProps) => {\r\n return (\r\n \r\n }\r\n label={props.label}\r\n fullwidth={props.fullwidth}\r\n info={props.info}\r\n notremoved={props.notremoved}\r\n custombgcolor={props.custombgcolor}\r\n customcolor={props.customcolor}\r\n customiconcolor={props.customiconcolor}\r\n customsize={props.customsize}\r\n customwidth={props.customwidth}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nexport const BookitChipWithInfo = (props: BookitChipWithInfoProps) => {\r\n const {\r\n info,\r\n fullwidth,\r\n customcolor,\r\n custombgcolor,\r\n customiconcolor,\r\n customwidth,\r\n shape,\r\n customsize,\r\n notremoved,\r\n ...other\r\n } = props;\r\n return info ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n }\r\n fullwidth={fullwidth}\r\n customcolor={customcolor}\r\n custombgcolor={custombgcolor}\r\n customiconcolor={customiconcolor}\r\n customwidth={customwidth}\r\n shape={shape}\r\n customsize={customsize}\r\n notremoved={notremoved}\r\n {...other}\r\n />\r\n );\r\n};\r\n","export function* largeFilesUploadSaga() {}\r\n","import { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { LargeFilesUploadState } from './types';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { largeFilesUploadSaga } from './saga';\r\nimport { PayloadAction } from '@reduxjs/toolkit';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\n\r\nexport const initialState: LargeFilesUploadState = {\r\n selectedFiles: 0,\r\n canUpload: false,\r\n uploading: false,\r\n targetId: 0,\r\n startedToUpload: false,\r\n files: [],\r\n currentNumberOfUploadedFiles: 0,\r\n numberOfUploadedFiles: 0,\r\n commentType: undefined,\r\n referenceId: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'largeFilesUpload',\r\n initialState,\r\n reducers: {\r\n setSeletedFiles(state, action: PayloadAction) {\r\n state.selectedFiles = action.payload;\r\n },\r\n setCommentProperties(\r\n state,\r\n action: PayloadAction<{\r\n commentType: CommentReferenceTypes;\r\n referenceId: number;\r\n }>,\r\n ) {\r\n state.commentType = action.payload.commentType;\r\n state.referenceId = action.payload.referenceId;\r\n },\r\n setCanUpload(state, action: PayloadAction) {\r\n if (action.payload > 0) {\r\n state.targetId = action.payload;\r\n state.canUpload = true;\r\n state.startedToUpload = false;\r\n state.uploading = false;\r\n state.currentNumberOfUploadedFiles = 0;\r\n state.numberOfUploadedFiles = 0;\r\n } else {\r\n state.canUpload = false;\r\n state.startedToUpload = false;\r\n state.uploading = false;\r\n state.targetId = 0;\r\n state.files = [];\r\n state.currentNumberOfUploadedFiles = 0;\r\n state.numberOfUploadedFiles = 0;\r\n }\r\n },\r\n addFile(state, action: PayloadAction) {\r\n state.files.push(action.payload);\r\n if (state.canUpload && state.files.length === 1) {\r\n state.startedToUpload = true;\r\n state.currentNumberOfUploadedFiles = 0;\r\n state.numberOfUploadedFiles = 0;\r\n state.selectedFiles = 0;\r\n }\r\n state.uploading = state.canUpload && state.files.length > 0;\r\n },\r\n removeFile(state, action: PayloadAction) {\r\n const index = state.files.findIndex(item => item === action.payload);\r\n if (index >= 0) {\r\n state.files.splice(index, 1);\r\n state.currentNumberOfUploadedFiles++;\r\n }\r\n if (state.files.length === 0 && state.uploading) {\r\n state.numberOfUploadedFiles = state.currentNumberOfUploadedFiles;\r\n state.currentNumberOfUploadedFiles = 0;\r\n state.uploading = false;\r\n }\r\n },\r\n resetNumberOfUploadedFiles(state) {\r\n state.selectedFiles = 0;\r\n state.numberOfUploadedFiles = 0;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: largeFilesUploadActions } = slice;\r\n\r\nexport const useLargeFilesUploadSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: largeFilesUploadSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import {\r\n IComment,\r\n NewComment,\r\n} from 'app/components/CommentsContainer/IComment';\r\nimport { httpClient } from './HttpClient';\r\nconst url = '/api/odata/v4/Comments';\r\nexport const CommentsApi = {\r\n GetComments: (type: number, reference: number, Id?: number) => {\r\n return httpClient\r\n .get(url, {\r\n reference,\r\n type,\r\n $filter: Id !== undefined ? 'Id eq ' + Id?.toString() : undefined,\r\n $expand: ['Files', 'CreatedBy'].join(','),\r\n })\r\n .then(v => v.value as IComment[]);\r\n },\r\n SendComment: (\r\n typeId: number,\r\n referenceId: number,\r\n { Files, Text, IsInternal }: Omit,\r\n ) => {\r\n const form = new FormData();\r\n for (let i = 0; !!Files && i < Files?.length; i++) {\r\n let item = Files?.item(i);\r\n if (!!item) {\r\n form.append('file' + i, item);\r\n }\r\n }\r\n form.append('TypeId', typeId as any);\r\n form.append('ReferenceId', referenceId as any);\r\n form.append('Text', Text ?? '');\r\n form.append('IsInternal', !!IsInternal as any);\r\n\r\n return httpClient.post(url, form);\r\n },\r\n removeFile: (id: string) => {\r\n const delteUrl = `/odata.svc/Files(guid'${id}')`;\r\n return httpClient.delete(delteUrl);\r\n },\r\n};\r\n","import { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { PurchaseOrderOptions } from 'api/odata/generated/enums/PurchaseOrderOptions';\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { getBudgetVisible } from 'app/pages/ReservationDetails/Details/slice/getBudgetVisible';\r\nimport { FundingTypes } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { Roles } from 'app/slice/types';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { AsyncDataState } from 'types/common';\r\nimport { IConnectedFiltersDto } from 'types/IConnectedFiltersDto';\r\nimport { FieldHandlerProps } from '../../FormRender/FormRenderer';\r\n\r\n/* --- STATE --- */\r\nexport interface ConnectedFiltersState\r\n extends AsyncDataState {\r\n connectedValueHandler?: FieldHandlerProps;\r\n connectedSettings: ConnectedFiltersSettings;\r\n}\r\nexport interface ConnectedFiltersSettings {\r\n startTimeVisible?: boolean;\r\n endTimeVisible?: boolean;\r\n budgetVisible?: boolean;\r\n userVisible?: boolean;\r\n userGroupVisible?: boolean;\r\n fundingTypeVisible?: boolean;\r\n budgetExpirementVisible?: boolean;\r\n instProjVisible?: boolean;\r\n extCustomerVisible?: boolean;\r\n purchaseOrderVisible?: boolean;\r\n referenceVisible?: boolean;\r\n onlyOwnUserGroupsAllowed?: boolean;\r\n ReservationUserGroupGroupByBudgetUserGroup?: boolean;\r\n budgetLimitedByUsers?: boolean;\r\n isBudgetsWithoutUserGroup?: boolean;\r\n hideProject?: boolean;\r\n isServiceAdmin?: boolean;\r\n isUserGroupCoordinator?: boolean;\r\n chargesViewAllowed?: boolean;\r\n hasConflictProjects?: boolean;\r\n}\r\nexport function mapSettings(\r\n services: IServiceTypeFilterDto[],\r\n globalSettings: GlobalSettingsType,\r\n settings: ConnectedFiltersSettings,\r\n isEditMode: boolean,\r\n user: AuthenticatedUser | undefined,\r\n data?: IConnectedFiltersDto,\r\n): ConnectedFiltersSettings {\r\n let budgetEnabled = getBudgetVisible(\r\n globalSettings,\r\n services.map(service => ({\r\n Billable: service.Billable,\r\n BudgetsTurnedOn: service.BudgetsTurnedOn,\r\n HideProjects: service.HideProject,\r\n })),\r\n );\r\n\r\n let resUGEnabled =\r\n services.length > 0\r\n ? globalSettings.reservationUserGroupGroupByBudgetUserGroup &&\r\n budgetEnabled\r\n : globalSettings.reservationUserGroupGroupByBudgetUserGroup;\r\n let isServiceAdmin = user?.IsAllGroupOrLabTechAdmin(\r\n services.map(f => f.ServiceGroupId ?? 0),\r\n services,\r\n );\r\n let isRoleAdmin =\r\n user?.Roles.includes(Roles.Administrators) ||\r\n user?.Roles.includes(Roles.GroupAdministrators) ||\r\n user?.Roles.includes(Roles.LabTech);\r\n let isUserGroupCoordinator =\r\n user &&\r\n user.Roles.includes(Roles.UserGroupCoord) &&\r\n (isEditMode ? !!data && data.UserGroup?.Id === user.ActiveUserGroup : true);\r\n let btExpEnabled =\r\n globalSettings.budgetExperimentModuleEnabled && budgetEnabled;\r\n // && !!data\r\n // ? data.Budget !== null\r\n // ? !((data.Budget as IBudgetFilterDto).HideExperiments === true)\r\n // : false\r\n // : false;\r\n let chargesViewAllowed =\r\n (user && user.Roles.includes(Roles.FinAdmin)) ||\r\n isServiceAdmin ||\r\n (user &&\r\n user.Roles.includes(Roles.InvoicesReader) &&\r\n user.ActiveUserGroup?.Id === data?.UserGroup?.Id);\r\n const result = Object.assign({}, settings, {\r\n hideProject:\r\n services.length > 0 ? services.every(f => f.HideProject) : undefined,\r\n isUserGroupCoordinator: isUserGroupCoordinator,\r\n hasConflictProjects:\r\n services.some(f => f.HideProject === true) &&\r\n services.some(f => f.HideProject === false),\r\n budgetVisible: budgetEnabled,\r\n fundingTypeVisible:\r\n globalSettings.fundingTypeBudgetEnabled &&\r\n // funding type is not needed unless the PurchaseOrder is also enabled\r\n globalSettings.purchaseOrderBudgetEnabled,\r\n ReservationUserGroupGroupByBudgetUserGroup: resUGEnabled,\r\n userGroupVisible:\r\n (isServiceAdmin || isRoleAdmin) &&\r\n !isEditMode &&\r\n !isUserGroupCoordinator &&\r\n !resUGEnabled,\r\n userVisible:\r\n isServiceAdmin || isUserGroupCoordinator || (!isEditMode && isRoleAdmin),\r\n budgetExpirementVisible: btExpEnabled,\r\n instProjVisible: globalSettings.instituteProjectsEnabled,\r\n // looks like the external customers are being deprecated\r\n extCustomerVisible: false,\r\n purchaseOrderVisible:\r\n globalSettings.purchaseOrderBudgetEnabled &&\r\n ((data?.Budget as IBudgetFilterDto)?.PurchaseOrderOptionId ??\r\n PurchaseOrderOptions.Hidden) !== PurchaseOrderOptions.Hidden,\r\n referenceVisible:\r\n globalSettings.showReferenceFieldInReservationDetails && !!data\r\n ? data.FundingType?.Id === FundingTypes.External\r\n : false,\r\n onlyOwnUserGroupsAllowed: globalSettings.onlyOwnUserGroupsAllowed,\r\n budgetLimitedByUsers: globalSettings.budgetLimitedByUsers,\r\n isBudgetsWithoutUserGroup: globalSettings.isBudgetsWithoutUserGroup,\r\n isServiceAdmin: isServiceAdmin,\r\n endTimeVisible: false,\r\n startTimeVisible: true,\r\n chargesViewAllowed:\r\n globalSettings.allowUsersToViewTheirCharges || chargesViewAllowed,\r\n });\r\n return result;\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { put, select, takeLatest } from 'redux-saga/effects';\r\nimport { connectedFiltersActions as actions } from '.';\r\nimport { IConnectedFiltersDto } from 'types/IConnectedFiltersDto';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { ConnectedFiltersSettings, mapSettings } from './types';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { selectConnectedFiltersData } from './selectors';\r\n\r\nfunction* doSetConnectedValue(\r\n action: PayloadAction<{\r\n fieldKey: keyof IConnectedFiltersDto;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setConnectedValueSuccess(action.payload));\r\n}\r\nfunction* doUpdateEquipmentSettigs(\r\n action: PayloadAction<{\r\n services: IServiceTypeFilterDto[];\r\n globalSettings: GlobalSettingsType;\r\n settings: ConnectedFiltersSettings;\r\n isEdit: boolean;\r\n data?: IConnectedFiltersDto;\r\n }>,\r\n) {\r\n const user: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n const currentData: IConnectedFiltersDto = yield select(\r\n selectConnectedFiltersData,\r\n );\r\n let newSettings = mapSettings(\r\n action.payload.services,\r\n action.payload.globalSettings,\r\n action.payload.settings,\r\n action.payload.isEdit,\r\n user,\r\n action.payload.data || currentData,\r\n );\r\n\r\n yield put(actions.updateSettingsState(newSettings));\r\n}\r\nfunction* doResetState(action: PayloadAction) {\r\n yield put(actions.resetConnectedState_success());\r\n}\r\nexport function* connectedFiltersSaga() {\r\n yield takeLatest(actions.setConnectedValue.type, doSetConnectedValue);\r\n yield takeLatest(actions.extendSettingsState.type, doUpdateEquipmentSettigs);\r\n yield takeLatest(actions.resetConnectedState.type, doResetState);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { getSingleInvoiceFundingType } from 'app/components/pickers/StaticOptionsPickers/FundingTypeIdPicker';\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport {\r\n ConnectedFiltersInit,\r\n IConnectedFiltersDto,\r\n} from 'types/IConnectedFiltersDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { connectedFiltersSaga } from './saga';\r\nimport { ConnectedFiltersSettings, ConnectedFiltersState } from './types';\r\n\r\nexport const initialState: ConnectedFiltersState = {\r\n processing: false,\r\n data: {\r\n StartTime: new CustomDate(new Date()).toISOString(),\r\n EndTime: undefined,\r\n User: null,\r\n UserGroup: null,\r\n Budget: null,\r\n BudgetExperiment: null,\r\n InstituteProject: null,\r\n ExternalCustomer: null,\r\n FundingType: getSingleInvoiceFundingType(0),\r\n PurchaseOrder: undefined,\r\n Reference: undefined,\r\n },\r\n connectedValueHandler: undefined,\r\n connectedSettings: {\r\n budgetExpirementVisible: undefined,\r\n budgetLimitedByUsers: undefined,\r\n budgetVisible: undefined,\r\n endTimeVisible: undefined,\r\n extCustomerVisible: undefined,\r\n fundingTypeVisible: undefined,\r\n hideProject: undefined,\r\n instProjVisible: undefined,\r\n isBudgetsWithoutUserGroup: undefined,\r\n isServiceAdmin: undefined,\r\n onlyOwnUserGroupsAllowed: undefined,\r\n purchaseOrderVisible: undefined,\r\n referenceVisible: undefined,\r\n ReservationUserGroupGroupByBudgetUserGroup: undefined,\r\n startTimeVisible: undefined,\r\n userGroupVisible: undefined,\r\n userVisible: undefined,\r\n isUserGroupCoordinator: undefined,\r\n chargesViewAllowed: undefined,\r\n },\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'connectedFilters',\r\n initialState,\r\n reducers: {\r\n resetState(state, action: PayloadAction) {\r\n state.data = ConnectedFiltersInit();\r\n },\r\n saveState(state, action: PayloadAction) {\r\n state.data = {\r\n StartTime: action.payload.StartTime,\r\n EndTime: action.payload.EndTime,\r\n User: action.payload.User,\r\n UserGroup: action.payload.UserGroup,\r\n Budget: action.payload.Budget,\r\n BudgetExperiment: action.payload.BudgetExperiment,\r\n InstituteProject: action.payload.InstituteProject,\r\n ExternalCustomer: action.payload.ExternalCustomer,\r\n FundingType: action.payload.FundingType,\r\n PurchaseOrder: action.payload.PurchaseOrder,\r\n Reference: action.payload.PurchaseOrder,\r\n };\r\n },\r\n setSubmit(state, action: PayloadAction) {\r\n state.processing = action.payload;\r\n },\r\n resetConnectedState(state, action: PayloadAction) {},\r\n resetConnectedState_success(state, action: PayloadAction) {\r\n state.connectedSettings = {\r\n budgetExpirementVisible: undefined,\r\n budgetLimitedByUsers: undefined,\r\n budgetVisible: undefined,\r\n endTimeVisible: undefined,\r\n extCustomerVisible: undefined,\r\n fundingTypeVisible: undefined,\r\n hideProject: undefined,\r\n instProjVisible: undefined,\r\n isBudgetsWithoutUserGroup: undefined,\r\n isServiceAdmin: undefined,\r\n onlyOwnUserGroupsAllowed: undefined,\r\n purchaseOrderVisible: undefined,\r\n referenceVisible: undefined,\r\n ReservationUserGroupGroupByBudgetUserGroup: undefined,\r\n startTimeVisible: undefined,\r\n userGroupVisible: undefined,\r\n userVisible: undefined,\r\n isUserGroupCoordinator: undefined,\r\n chargesViewAllowed: undefined,\r\n };\r\n state.data = {\r\n StartTime: new CustomDate(new Date()).toISOString(),\r\n EndTime: undefined,\r\n User: null,\r\n UserGroup: null,\r\n Budget: null,\r\n BudgetExperiment: null,\r\n InstituteProject: null,\r\n ExternalCustomer: null,\r\n FundingType: getSingleInvoiceFundingType(0),\r\n PurchaseOrder: undefined,\r\n Reference: undefined,\r\n };\r\n state.connectedValueHandler = undefined;\r\n state.completed = undefined;\r\n state.processing = undefined;\r\n state.hasErrors = undefined;\r\n },\r\n setConnectedValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof IConnectedFiltersDto;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setConnectedValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof IConnectedFiltersDto;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.connectedValueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetConnectedHandler(state, action: PayloadAction) {\r\n state.connectedValueHandler = undefined;\r\n },\r\n extendSettingsState(\r\n state,\r\n action: PayloadAction<{\r\n services: IServiceTypeFilterDto[];\r\n globalSettings: GlobalSettingsType;\r\n settings: ConnectedFiltersSettings;\r\n isEdit: boolean;\r\n data?: IConnectedFiltersDto;\r\n }>,\r\n ) {},\r\n updateSettingsState(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.connectedSettings = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: connectedFiltersActions } = slice;\r\n\r\nexport const useConnectedFiltersSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: connectedFiltersSaga });\r\n return { actions: slice.actions };\r\n};\r\n","export const DRAWER_WIDTH: number = 240;\r\nexport const DRAWER_MOBILE_WIDTH: number = 350;\r\nexport const SIDE_PANEL_WIDTH: number = 370;\r\nexport const COVER_WIDTH: number = 360;\r\n","/**\r\n *\r\n * ExtraDDLPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IExtraDDLDto } from 'api/odata/generated/entities/IExtraDDLDto';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport * as React from 'react';\r\nexport type CatUrl = 'base' | 'assetBase' | 'public';\r\nexport interface ExtraDDLPickerProps\r\n extends Omit, 'loadData'> {\r\n urlType?: any;\r\n}\r\n\r\nconst url = '/api/odata/v4/ExtraDDL';\r\nexport const initExtraDDLData = (\r\n initval: string | undefined,\r\n sourceUrl?: string,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IExtraDDLDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,Active,ExtraDdlId',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl = `${url}?key=${sourceUrl ?? ''}`;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as IExtraDDLDto[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n urlType?: string,\r\n) => {\r\n const sourceUrl = `${url}?key=${urlType ?? ''}`;\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name', 'Active', 'ExtraDdlId'],\r\n globalServiceGroupFilter: [],\r\n });\r\n};\r\n\r\nexport function ExtraDDLPicker(props: ExtraDDLPickerProps) {\r\n const { predicates, urlType, ...other } = props;\r\n\r\n const innerLoadData = loadData(predicates, urlType);\r\n return (\r\n \r\n );\r\n}\r\n","import { CircularProgress } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport {\r\n Autocomplete,\r\n AutocompleteGetTagProps,\r\n AutocompleteProps,\r\n AutocompleteRenderOptionState,\r\n} from '@material-ui/lab';\r\nimport { BookitChip } from 'app/components/BasicChip';\r\nimport BaseTextField from 'app/components/BasicInputs/BaseTextField';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport React from 'react';\r\nimport { CSSProperties } from 'styled-components';\r\nimport { autocompleteStyles } from 'styles/MUIExtend/autocompleteStyles';\r\nimport { Entity } from 'types/common';\r\nimport clsx from 'clsx';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\n\r\nexport interface AutocompleteMultiPickerProps<\r\n TKey,\r\n TValue extends Entity = Entity\r\n> extends Omit<\r\n AutocompleteProps,\r\n | 'multiple'\r\n | 'loading'\r\n | 'open'\r\n | 'options'\r\n | 'renderInput'\r\n | 'onChange'\r\n | 'classes'\r\n | 'renderTags'\r\n | 'renderOptionLabel'\r\n | 'renderOptions'\r\n > {\r\n value?: TValue[];\r\n label?: string;\r\n loadData: (searchTerm: string | null) => Promise;\r\n size?: 'medium' | 'small';\r\n mini?: boolean;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n isOpen?: boolean;\r\n style?: CSSProperties;\r\n name?: string;\r\n placeholder?: string;\r\n error?: boolean;\r\n helperText?: string;\r\n onChange: (value: TValue[]) => void;\r\n required?: boolean;\r\n info?: string;\r\n id?: string;\r\n renderTags?: (\r\n value: TValue[],\r\n getTagProps: AutocompleteGetTagProps,\r\n ) => React.ReactNode | undefined;\r\n renderOptionLabel?: (value: TValue) => string | undefined;\r\n renderOptions?: (\r\n option: TValue,\r\n state: AutocompleteRenderOptionState,\r\n ) => React.ReactNode | undefined;\r\n onBlur?: React.FocusEventHandler;\r\n onChipClick?: (chip: TValue) => void;\r\n ariaLabel?: string;\r\n /**\r\n * Controls width of selected option chips. If true, every selected option will occupy full width of the picker, otherwise width will depend on option text content length\r\n */\r\n fullWdithOptions?: boolean;\r\n onPickerOpen?: () => void;\r\n}\r\n\r\nexport function AutocompleteMultiPicker<\r\n TKey,\r\n TValue extends Entity = Entity\r\n>({\r\n isOpen,\r\n size,\r\n mini,\r\n onOpen,\r\n onClose,\r\n label,\r\n fullWidth,\r\n fullWdithOptions,\r\n variant,\r\n name,\r\n placeholder,\r\n error,\r\n helperText,\r\n required,\r\n renderTags,\r\n loadData,\r\n disableClearable,\r\n onChange,\r\n onInputChange,\r\n getOptionSelected,\r\n getOptionLabel,\r\n renderOptionLabel,\r\n renderOptions,\r\n onBlur,\r\n value,\r\n defaultValue,\r\n info,\r\n id,\r\n onChipClick,\r\n ariaLabel,\r\n inputValue,\r\n onPickerOpen,\r\n ...props\r\n}: AutocompleteMultiPickerProps) {\r\n const classes = autocompleteStyles();\r\n let firstOpen = isOpen;\r\n const [open, setOpen] = React.useState(firstOpen);\r\n const [options, setOptions] = React.useState(null);\r\n const [searchTerm, setSearchTerm] = React.useState(null);\r\n const [hasSelected, setSelected] = React.useState(\r\n defaultValue && defaultValue.length > 0,\r\n );\r\n const [newInputValue, setInputValue] = React.useState(inputValue || '');\r\n const isMobile = DetectIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const showShortView = isMobile || (sidePanelOpen && !sidePanelExpanded);\r\n const loading = open && options === null;\r\n useEffectOnMount(() => {\r\n setSelected((value || []).length > 0);\r\n });\r\n React.useEffect(() => {\r\n let active = true;\r\n if (!loading) return undefined;\r\n\r\n (async () => {\r\n try {\r\n const data = await loadData(searchTerm);\r\n active && setOptions(data as TValue[]);\r\n } catch {}\r\n })();\r\n\r\n return () => {\r\n active = false;\r\n };\r\n }, [loading, loadData, searchTerm]);\r\n\r\n React.useEffect(() => {\r\n if (!open) setOptions(null);\r\n }, [open]);\r\n\r\n const handleRenderTags = (\r\n value: TValue[],\r\n getTagProps: AutocompleteGetTagProps,\r\n ) => {\r\n if (renderTags === undefined) {\r\n return value.map((option: TValue, index: number) => {\r\n const color = ((option as unknown) as IServiceFilterDto).Color;\r\n return (\r\n onChipClick?.(option)}\r\n variant=\"default\"\r\n size=\"small\"\r\n label={option.Name}\r\n custombgcolor={color ?? undefined}\r\n fullwidth={fullWdithOptions}\r\n {...getTagProps({ index })}\r\n />\r\n );\r\n });\r\n } else {\r\n return renderTags(value, getTagProps);\r\n }\r\n };\r\n const handleRenderOptionLabel = (option: TValue) => {\r\n return renderOptionLabel === undefined\r\n ? option.Name\r\n : (renderOptionLabel(option) as string);\r\n };\r\n return (\r\n {\r\n //onOpen && onOpen(e);\r\n !disableClearable && setOptions(null);\r\n setSearchTerm(null);\r\n setOpen(true);\r\n !!onPickerOpen && onPickerOpen();\r\n }}\r\n onClose={(e, r) => {\r\n //onClose && onClose(e, r);\r\n setSearchTerm(null);\r\n setOpen(false);\r\n }}\r\n onChange={(e, v, r, d) => {\r\n setSearchTerm(null);\r\n setInputValue('');\r\n setSelected(v.length > 0);\r\n onChange(v);\r\n }}\r\n onInputChange={(event, newValue, reason) => {\r\n if (reason === 'reset') return;\r\n setOptions(null);\r\n setInputValue(newValue);\r\n if (reason === 'input') setSearchTerm(newValue);\r\n //onInputChange && onInputChange(event, newValue, reason);\r\n }}\r\n getOptionSelected={\r\n getOptionSelected ?? ((option, value) => option.Id === value.Id)\r\n }\r\n getOptionLabel={handleRenderOptionLabel}\r\n renderTags={handleRenderTags}\r\n size={size}\r\n fullWidth={fullWidth}\r\n disableClearable={disableClearable}\r\n value={value ?? []}\r\n inputValue={newInputValue}\r\n popupIcon={}\r\n closeIcon={}\r\n selectOnFocus={isMobile ? false : true}\r\n renderInput={params => (\r\n \r\n {loading ? (\r\n \r\n ) : info ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n {params.InputProps.endAdornment}\r\n \r\n ),\r\n startAdornment: params.InputProps.startAdornment,\r\n }}\r\n />\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * MultiSelectBasicPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity, EntityType } from 'types/common';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from '../AutocompletePicker';\r\n\r\nexport interface BaseURLPickerProps\r\n extends Omit, 'loadData'> {\r\n url: string;\r\n queryfilter?: string | undefined;\r\n}\r\n\r\nexport function BaseURLPicker(\r\n props: BaseURLPickerProps,\r\n) {\r\n const { url, queryfilter, ...other } = props;\r\n const loadData = async (searchTerm: string | null) => {\r\n const params: { $orderby: string; $top: number; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n $top: 100,\r\n };\r\n const predicates: string[] = [];\r\n if (queryfilter !== undefined && queryfilter !== '') {\r\n predicates.push(queryfilter);\r\n }\r\n if (searchTerm !== null || predicates.length > 0) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm ?? undefined,\r\n }).toString();\r\n }\r\n const response = await httpClient.get(url, params);\r\n return response.value;\r\n };\r\n return ;\r\n}\r\n","export enum EmptySlotAdminClick {\r\n WhatToAdd = 0,\r\n ReservationsOnly = 1,\r\n DownTimeOnly = 2,\r\n}\r\n","import {\r\n SendEmailOnOffline,\r\n WorkOrderQueryStringParameters,\r\n} from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/types';\r\nimport { Identifiable } from 'types/common';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport { httpClient } from './HttpClient';\r\nimport { IWorkOrderDetailsDto } from './odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { Condition, ODataOperators } from './odata/ODataFilter';\r\n\r\nexport const WorkOrderApi = {\r\n initCreateData: (payload: WorkOrderQueryStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/workorders/InitWorkOrder`;\r\n return httpClient.post(url, data);\r\n },\r\n initUpdateData: (payload: WorkOrderQueryStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/workorders/InitWorkOrder`;\r\n return httpClient.post(url, data);\r\n },\r\n insertWorkOrder: (payload: IWorkOrderDetailsDto) => {\r\n const url = `/api/odata/v4/workorders`;\r\n return httpClient.post(url, payload);\r\n },\r\n updateWorkOrder: (payload: IWorkOrderDetailsDto) => {\r\n const url = `/api/odata/v4/workorders(${payload.Id})`;\r\n return httpClient.put(url, payload);\r\n },\r\n sendEmailOnOffline: (payload: SendEmailOnOffline) => {\r\n const data = {\r\n offData: payload,\r\n };\r\n console.debug('offlinedata', payload);\r\n const url = `/api/odata/v4/workorders/SendEmailOnResOffline`;\r\n return httpClient.post(url, data);\r\n },\r\n getNewWorkOrderStatus: (payload: number) => {\r\n const url = '/api/odata/v4/WorkOrderStatus';\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Order asc',\r\n $filter: `(WorkOrderTypeId eq ${payload} and New eq true)`,\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient.get(url, params).then(response => response.value);\r\n },\r\n deleteOrders: (payload: { Id: number; all: boolean | null }) => {\r\n const url = '/api/odata/v4/WorkOrders/DeleteWorkOrder';\r\n return httpClient.post(url, payload);\r\n },\r\n DowntimeOrders: (payload: number[]) => {\r\n const filters = (assetIds: number[]) => {\r\n const predicates: string | Condition[] = [];\r\n let foo: string | undefined = undefined;\r\n if (assetIds.length > 0) {\r\n let ids = assetIds.map(item => {\r\n return { Id: item };\r\n }) as Identifiable[];\r\n let nowDate = new CustomDate(new Date(), 'complete');\r\n predicates.push(new Condition('AssetId', ODataOperators.Includes, ids));\r\n predicates.push(\r\n new Condition('OfflineEventStart', ODataOperators.LessThan, nowDate),\r\n );\r\n predicates.push(\r\n new Condition('OfflineEventEnd', ODataOperators.GreaterThan, nowDate),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'DoneDate',\r\n ODataOperators.Equals,\r\n null,\r\n ),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'WorkingHoursId',\r\n ODataOperators.NotEquals,\r\n null,\r\n ),\r\n );\r\n predicates.push(\r\n new Condition(\r\n 'IsClosed',\r\n ODataOperators.Equals,\r\n false,\r\n ),\r\n );\r\n foo = predicates.map(f => f.toString()).join(' and ');\r\n }\r\n return foo;\r\n };\r\n const url = '/api/odata/v4/WorkOrders';\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n } = {\r\n $orderby: 'Id asc',\r\n $filter: filters(payload),\r\n };\r\n return httpClient.get(url, params).then(response => response.value);\r\n },\r\n removefromLinks: (id: number) => {\r\n const url = '/api/odata/v4/workorders/RemoveFromLinks';\r\n const params = { linkedId: id };\r\n return httpClient.post(url, params).then(v => v.value);\r\n },\r\n addToLinked: (data: { id: number; link: number }) => {\r\n const params = { params: { Id: data.id, Link: data.link } };\r\n const url = '/api/odata/v4/workorders/AddToLinked';\r\n return httpClient.post(url, params);\r\n },\r\n removeLinkedCalibration: (data: { id: number; link: number }) => {\r\n const url = '/api/odata/v4/workorders/RemoveLinkedCalibr';\r\n const params = { params: { Id: data.id, Link: data.link } };\r\n return httpClient.post(url, params);\r\n },\r\n addLinkedToCalibration: (data: { id: number; link: number }) => {\r\n const params = { params: { Id: data.id, Link: data.link } };\r\n const url = '/api/odata/v4/workorders/AddLinkedCalibr';\r\n return httpClient.post(url, params);\r\n },\r\n getLinkedToCalibration: (id: number) => {\r\n const params = { key: id };\r\n const url = '/api/odata/v4/workorders/InitLinkedCalibrations';\r\n return httpClient.post(url, params);\r\n },\r\n getOverlappingDowntimes: (id: number) => {\r\n const params = { id: id };\r\n const url = '/api/odata/v4/workorders/GetOverlappingDowntimes';\r\n return httpClient.post(url, params);\r\n },\r\n};\r\n","import { ListItemIcon, ListItemText, Menu, MenuItem } from '@material-ui/core';\r\nimport { Theme, withStyles } from '@material-ui/core/styles';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { TFunctionResult } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n bindMenu,\r\n usePopupState,\r\n bindTrigger,\r\n anchorRef,\r\n} from 'material-ui-popup-state/hooks';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { PluginHook } from 'react-table';\r\nimport { IPathAndQuery, toRootedURL } from 'utils/url-utils';\r\nimport { IRow } from '.';\r\nimport { RouterLink } from '../BasicLinks/RouterLink';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\r\nimport { CellRenderer } from './BasicTableProps';\r\nimport { ButtonsVariant } from '../BasicButtons/Button';\r\nimport { omit } from 'lodash';\r\nimport BasicTypography from '../Typography/BasicTypography';\r\n\r\nexport interface RowActionsProps {\r\n href?: string | IPathAndQuery;\r\n to?: string;\r\n text: string;\r\n icon: IconProp;\r\n title?: string;\r\n target?: string;\r\n renderAsTitle?: boolean;\r\n localizedText?: string;\r\n onClick?: () => Promise;\r\n}\r\nexport interface RowActionsMenuProps {\r\n id: string;\r\n items: RowActionsProps[];\r\n icon?: IconProp;\r\n tooltip?: React.ReactNode | TFunctionResult;\r\n variant?: ButtonsVariant;\r\n onClick?: (event: React.MouseEvent) => void;\r\n getIsOpen?: () => boolean;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n}));\r\nconst StyledItemIcon = withStyles({\r\n root: {\r\n minWidth: 'unset',\r\n },\r\n})(ListItemIcon);\r\nconst RowMenuActions = React.forwardRef(\r\n function RowMenuActions(props, ref) {\r\n const { id, items, variant, icon, tooltip, onClick } = props;\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const popupState = usePopupState({\r\n variant: 'popper',\r\n popupId: id,\r\n });\r\n const [tooltipOpen, setTooltipOpen] = React.useState(false);\r\n const toAbsolutePath = (href: string | IPathAndQuery) => {\r\n return typeof href === 'string'\r\n ? toRootedURL(href)\r\n : toRootedURL(\r\n (href as IPathAndQuery).path,\r\n (href as IPathAndQuery).search,\r\n );\r\n };\r\n React.useEffect(() => {\r\n if (popupState.isOpen) {\r\n setTooltipOpen(false);\r\n }\r\n }, [popupState.isOpen]);\r\n const popupProps = { ...bindTrigger(popupState) };\r\n return (\r\n
\r\n {!!tooltip ? (\r\n {\r\n setTooltipOpen(!popupState.isOpen);\r\n }}\r\n onClose={() => setTooltipOpen(false)}\r\n >\r\n \r\n {\r\n popupProps.onClick(event);\r\n if (!!onClick) {\r\n onClick(event);\r\n }\r\n }}\r\n {...omit(popupProps, 'onClick')}\r\n >\r\n \r\n \r\n \r\n \r\n ) : (\r\n {\r\n popupProps.onClick(event);\r\n if (!!onClick) {\r\n onClick(event);\r\n }\r\n }}\r\n {...omit(popupProps, 'onClick')}\r\n >\r\n \r\n \r\n )}\r\n\r\n \r\n {items.map((item, index) => {\r\n return item.renderAsTitle ? (\r\n \r\n {/* \r\n \r\n */}\r\n \r\n {!!item.localizedText ? t(item.localizedText) : item.text}\r\n \r\n {/* \r\n {!!item.localizedText ? t(item.localizedText) : item.text}\r\n */}\r\n \r\n ) : item.href ? (\r\n {\r\n if (item.href !== undefined) {\r\n let url = toAbsolutePath(item.href);\r\n window.open(url, '_blank');\r\n }\r\n popupState.close();\r\n }}\r\n >\r\n \r\n \r\n \r\n {item.text}\r\n \r\n ) : item.to ? (\r\n \r\n \r\n \r\n \r\n {item.text}\r\n \r\n ) : (\r\n {\r\n popupState.close();\r\n if (item.onClick) {\r\n await item.onClick();\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n {item.text}\r\n \r\n );\r\n })}\r\n \r\n
\r\n );\r\n },\r\n);\r\n\r\nexport function RowActionsMenu(props: RowActionsMenuProps) {\r\n return ;\r\n}\r\nexport function useRowActionsColumn(\r\n rowActions: CellRenderer[] | undefined,\r\n tablePlugins: PluginHook[],\r\n) {\r\n const { t } = useTranslation();\r\n if (rowActions !== undefined) {\r\n if (rowActions.length > 0) {\r\n const actionColumns = rowActions?.map((column, index) => ({\r\n id: `ActionColumn_${index}`,\r\n Header: t(translations.Action),\r\n disableSortBy: true,\r\n Cell: column,\r\n }));\r\n tablePlugins.push(hooks => {\r\n hooks.visibleColumns.push(columns => [...columns, ...actionColumns]);\r\n });\r\n }\r\n }\r\n}\r\nexport function useInlineRowActionsColumn(\r\n inlineRowActions: CellRenderer[] | undefined,\r\n tablePlugins: PluginHook[],\r\n) {\r\n const { t } = useTranslation();\r\n if (inlineRowActions !== undefined) {\r\n if (inlineRowActions.length > 0) {\r\n const actionColumns = inlineRowActions?.map((column, index) => ({\r\n id: `InlineActionColumn_${index}`,\r\n Header: t(translations.Action),\r\n disableSortBy: true,\r\n Cell: column,\r\n }));\r\n tablePlugins.push(hooks => {\r\n hooks.visibleColumns.push(columns => [...columns, ...actionColumns]);\r\n });\r\n }\r\n }\r\n}\r\n","/**\r\n *\r\n * FundingTypeIdPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { InvoiceFundingType } from 'enums/InvoiceFundingType';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface FundingTypePickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const getSingleInvoiceFundingType = (val: number): Entity => {\r\n return enumToEntityArray(InvoiceFundingType).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\n\r\nexport const initFundingTypeData = (\r\n initval: string | undefined,\r\n): Promise[]> => {\r\n const val = parseInt(initval ?? '');\r\n if (initval === undefined || isNaN(val)) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([getSingleInvoiceFundingType(val)]);\r\n });\r\n }\r\n};\r\n\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(InvoiceFundingType);\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\n\r\nexport function FundingTypeIdPicker(props: FundingTypePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectUserProfileSettings,\r\n} from 'app/slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nexport interface IUseProfileProps {\r\n profileSettingKey: string;\r\n}\r\nexport const useProfileSetting = (\r\n props: IUseProfileProps,\r\n): {\r\n savedValue: string | undefined;\r\n updateValue: (value: string) => void;\r\n savedEnabled: boolean | undefined;\r\n updateEnabled: (enabled: boolean) => void;\r\n} => {\r\n const { actions } = useAppSettingsSlice();\r\n const dispatch = useDispatch();\r\n const userProfileSettings = useSelector(selectUserProfileSettings);\r\n const key = props.profileSettingKey.toLowerCase();\r\n const userProfileSetting = userProfileSettings.GetSettingValueBy(\r\n f => f.Key.toLowerCase() === key,\r\n );\r\n\r\n const savedValue = userProfileSetting?.Value ?? undefined;\r\n const savedEnabled = userProfileSetting?.Enabled ?? undefined;\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n\r\n const updateValue = React.useCallback(\r\n (value: string) => {\r\n if (authenticatedUser === undefined) {\r\n return;\r\n }\r\n dispatch(\r\n actions.saveUserProfileSetting({\r\n Key: props.profileSettingKey,\r\n Value: value,\r\n UserName: authenticatedUser?.Id,\r\n Enabled: true,\r\n }),\r\n );\r\n },\r\n [actions, authenticatedUser, dispatch, props.profileSettingKey],\r\n );\r\n const updateEnabled = React.useCallback(\r\n (value: boolean) => {\r\n if (authenticatedUser === undefined) {\r\n return;\r\n }\r\n if (value === savedEnabled) {\r\n return;\r\n }\r\n dispatch(\r\n actions.saveUserProfileSetting({\r\n Key: props.profileSettingKey,\r\n Value: savedValue || null,\r\n UserName: authenticatedUser?.Id,\r\n Enabled: value,\r\n }),\r\n );\r\n },\r\n [\r\n actions,\r\n authenticatedUser,\r\n dispatch,\r\n props.profileSettingKey,\r\n savedEnabled,\r\n savedValue,\r\n ],\r\n );\r\n return { savedValue, updateValue, savedEnabled, updateEnabled };\r\n};\r\n","import { useDispatch } from 'react-redux';\r\nimport { useLargeFilesUploadSlice } from '../slice';\r\nimport { useCallback } from 'react';\r\nimport { Identifiable } from 'types/common';\r\n\r\nexport const useUploadToNewComment = () => {\r\n const dispatch = useDispatch();\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const onCommentAdded = useCallback(\r\n (comment: Identifiable) => {\r\n dispatch(largeFileActions.setCanUpload(comment.Id));\r\n },\r\n [dispatch, largeFileActions],\r\n );\r\n return { onCommentAdded };\r\n};\r\n","import { Roles } from 'app/slice/types';\r\n\r\nexport const allowedroles = [\r\n Roles.Administrators,\r\n Roles.InstrumentEventsAdmin,\r\n Roles.GroupAdministrators,\r\n Roles.LabTech,\r\n];\r\n","import * as React from 'react';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { intersection } from 'lodash';\r\nimport { useSelector } from 'react-redux';\r\nimport { allowedroles } from './allowedroles';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nexport function useWorkOrdersPermissions() {\r\n const user = useSelector(selectAuthenticatedUser);\r\n const roles: number[] | undefined = user?.Roles;\r\n\r\n const callback = React.useCallback(\r\n (row: IAlertPermissionCheckRecord): boolean =>\r\n allowedToViewAlert(user, row),\r\n [user],\r\n );\r\n\r\n const hasPermissions: boolean = intersection(roles, allowedroles).length > 0;\r\n const isMainOrInstrumentEventsAdmin: boolean =\r\n (user?.Roles.includes(Roles.Administrators) ?? false) ||\r\n (user?.Roles.includes(Roles.InstrumentEventsAdmin) ?? false);\r\n return {\r\n hasPermissions,\r\n allowedToView: callback,\r\n isMainOrInstrumentEventsAdmin,\r\n };\r\n}\r\n\r\nexport type IAlertPermissionCheckRecord = Pick<\r\n IWorkOrderDetailsDto,\r\n 'ServiceGroupId' | 'ReportedBy' | 'ServiceId' | 'ServiceTypeId'\r\n>;\r\nexport const allowedToViewAlert = (\r\n user: AuthenticatedUser | undefined,\r\n row: IAlertPermissionCheckRecord,\r\n) => {\r\n if (!user) return false;\r\n return (\r\n user.HasAdminGroupOnlyPermissions(row.ServiceGroupId ?? undefined) ||\r\n user.HasAdminServiceOnlyPermissions(\r\n row.ServiceTypeId ?? 1,\r\n row.ServiceId ?? undefined,\r\n ) ||\r\n user.HasLabTechGroupPermissions(row.ServiceGroupId ?? undefined) ||\r\n user.HasLabTechServicePermissions(\r\n row.ServiceTypeId ?? 1,\r\n row.ServiceId ?? undefined,\r\n ) ||\r\n (user.Roles.includes(Roles.InventoryAdmin) &&\r\n user.HasInstrumentEventsGroupPermissions(\r\n row.ServiceGroupId ?? undefined,\r\n )) ||\r\n user.Roles.includes(Roles.InstrumentEventsAdmin) ||\r\n user.Id === (row.ReportedBy ?? '')\r\n );\r\n};\r\n\r\nexport const IsReadOnlyUser = (user: AuthenticatedUser | undefined) => {\r\n if (!user) return true;\r\n return (\r\n user.Roles.includes(Roles.Readonly) ||\r\n user.Roles.includes(Roles.CalendarOnly)\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { SwitchProps } from '@material-ui/core';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { BasicToggle } from '../BasicToggle';\r\n\r\nexport interface FormSwitchProps extends SwitchProps {\r\n label?: string;\r\n helperText?: string;\r\n boldLebel?: boolean;\r\n maxLabelWidth?: string | number;\r\n boxed?: boolean;\r\n}\r\nexport const FormSwitch = ({\r\n label,\r\n name,\r\n onBlur,\r\n onChange,\r\n boldLebel,\r\n maxLabelWidth,\r\n ...props\r\n}: FormSwitchProps & FieldHookConfig & IFieldProps) => {\r\n const [field, meta] = useField({ name, ...props });\r\n const handleChange = (value, event) => {\r\n if (onChange !== undefined) {\r\n onChange(event);\r\n }\r\n field.onChange(event);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n","import { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport {\r\n EquipmentsChangeStateParameters,\r\n IReservationEquipmentDto,\r\n ReservationDetailsState,\r\n StatusChangeResult,\r\n} from '../slice/types';\r\nimport { ReservationsApi } from 'api/ReservationsApi';\r\nimport * as Yup from 'yup';\r\nimport { debounce } from 'lodash';\r\nimport { Entity } from 'types/common';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\n\r\nexport const updateFormValues = (\r\n original: IFormValueDto[],\r\n coming: IFormValueDto[],\r\n) => {\r\n const result = coming.map(v => {\r\n let orn = original.find(o => o.FormFieldId === v.FormFieldId);\r\n if (!!orn) {\r\n return Object.assign({}, orn, {\r\n Value: v.Value,\r\n });\r\n } else {\r\n return v;\r\n }\r\n });\r\n return result;\r\n};\r\nexport const getEnd = (\r\n start: Date,\r\n equipments: IReservationEquipmentDto[],\r\n): Date => {\r\n const ForceFullDayReservations = equipments.some(\r\n f => f.ForceFullDayReservations,\r\n );\r\n if (ForceFullDayReservations) {\r\n return dateUtils.addDays(dateUtils.startOfDay(start), 1);\r\n }\r\n let defEnd = dateUtils.addHours(\r\n start,\r\n equipments\r\n .map(f => f.DefaultReservationDuration)\r\n .sort((a, b) => a - b)[0] || 1,\r\n );\r\n let minEnd = dateUtils.addHours(\r\n start,\r\n equipments.map(f => f.MinOrderHours).sort((a, b) => a - b)[\r\n equipments.length - 1\r\n ] || 1,\r\n );\r\n return defEnd < minEnd ? minEnd : defEnd;\r\n};\r\nexport const validateReservation = async (\r\n parameters: EquipmentsChangeStateParameters,\r\n) => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n let results = await ReservationsApi.getValidationState(parameters);\r\n resolve(results);\r\n } catch (e) {\r\n resolve(undefined);\r\n }\r\n });\r\n};\r\nexport const validateDuration = async (\r\n value: Date | undefined,\r\n context: Yup.TestContext,\r\n) => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n let parent = context.parent as ReservationDetailsState;\r\n let results = await ReservationsApi.validateDuration({\r\n Equipments: parent.EquipmentsData.map(f => f.Id),\r\n AccServices: parent.AccServices.map(f => f.Id),\r\n ReservationId: parent.Id > 0 ? parent.Id : null,\r\n Start: parent.StartTime,\r\n End: parent.EndTime,\r\n Status: parent.Status?.Id || 1,\r\n TrainingSignUp: parent.TrainingSignUp,\r\n Tutoring: parent.Tutoring,\r\n FullDayReservation: parent.FullDayReservation,\r\n ADGroup: parent.ADGroup?.Id || null,\r\n BookedBy: parent.BookedBy?.Id || null,\r\n FundingTypeId: parent.FundingType?.Id || 0,\r\n CheckStatus: false,\r\n TrainingSessionId: parent.TrainingSession?.Id || null,\r\n Remarks: parent.Remarks || null,\r\n BudgetId: parent.Budget?.Id || null,\r\n CheckSession: false,\r\n });\r\n resolve(results.value);\r\n } catch (e) {\r\n resolve([]);\r\n }\r\n });\r\n};\r\nexport const validateYupPermissions = async (\r\n value: Entity | null,\r\n context: Yup.TestContext,\r\n) => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n let parent = context.parent as ReservationDetailsState;\r\n let results = await ReservationsApi.validatePermissions({\r\n Equipments: parent.EquipmentsData.map(f => f.Id),\r\n AccServices: parent.AccServices.map(f => f.Id),\r\n ReservationId: parent.Id > 0 ? parent.Id : null,\r\n Start: parent.StartTime,\r\n End: parent.EndTime,\r\n Status: parent.Status?.Id || 1,\r\n TrainingSignUp: parent.TrainingSignUp,\r\n Tutoring: parent.Tutoring,\r\n FullDayReservation: parent.FullDayReservation,\r\n ADGroup: parent.ADGroup?.Id || null,\r\n BookedBy: parent.BookedBy?.Id || null,\r\n FundingTypeId: parent.FundingType?.Id || 0,\r\n CheckStatus: false,\r\n TrainingSessionId: parent.TrainingSession?.Id || null,\r\n Remarks: parent.Remarks || null,\r\n BudgetId: parent.Budget?.Id || null,\r\n CheckSession: false,\r\n });\r\n resolve(results);\r\n } catch (e) {\r\n resolve([]);\r\n }\r\n });\r\n};\r\nexport const validatePermissions = async (values: ReservationDetailsState) => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n let parent = values;\r\n let results = await ReservationsApi.validatePermissions({\r\n Equipments: parent.EquipmentsData.map(f => f.Id),\r\n AccServices: parent.AccServices.map(f => f.Id),\r\n ReservationId: parent.Id > 0 ? parent.Id : null,\r\n Start: parent.StartTime,\r\n End: parent.EndTime,\r\n Status: parent.Status?.Id || 1,\r\n TrainingSignUp: parent.TrainingSignUp,\r\n Tutoring: parent.Tutoring,\r\n FullDayReservation: parent.FullDayReservation,\r\n ADGroup: parent.ADGroup?.Id || null,\r\n BookedBy: parent.BookedBy?.Id || null,\r\n FundingTypeId: parent.FundingType?.Id || 0,\r\n CheckStatus: false,\r\n TrainingSessionId: parent.TrainingSession?.Id || null,\r\n Remarks: parent.Remarks || null,\r\n BudgetId: parent.Budget?.Id || null,\r\n CheckSession: false,\r\n });\r\n resolve(results.value);\r\n } catch (e) {\r\n resolve(false);\r\n }\r\n });\r\n};\r\nexport const validateMinEnd = async (\r\n value: any,\r\n context: Yup.TestContext,\r\n) => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n let val = value as Date;\r\n if (!!val) {\r\n resolve(context.parent.StartTime < val);\r\n } else {\r\n resolve(true);\r\n }\r\n } catch (e) {\r\n resolve(true);\r\n }\r\n });\r\n};\r\nexport const validatePrerequisite = async (values: ReservationDetailsState) => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n let parent = values;\r\n let results = await ReservationsApi.validatePrerequisite({\r\n Equipments: parent.EquipmentsData.map(f => f.Id),\r\n AccServices: parent.AccServices.map(f => f.Id),\r\n ReservationId: parent.Id > 0 ? parent.Id : null,\r\n Start: parent.StartTime,\r\n End: parent.EndTime,\r\n Status: parent.Status?.Id || 1,\r\n TrainingSignUp: parent.TrainingSignUp,\r\n Tutoring: parent.Tutoring,\r\n FullDayReservation: parent.FullDayReservation,\r\n ADGroup: parent.ADGroup?.Id || null,\r\n BookedBy: parent.BookedBy?.Id || null,\r\n FundingTypeId: parent.FundingType?.Id || 0,\r\n CheckStatus: false,\r\n TrainingSessionId: parent.TrainingSession?.Id || null,\r\n Remarks: parent.Remarks || null,\r\n BudgetId: parent.Budget?.Id || null,\r\n CheckSession: false,\r\n });\r\n resolve(results);\r\n } catch (e) {\r\n resolve(false);\r\n }\r\n });\r\n};\r\n\r\nexport const validateAccServices = (\r\n allEquipments: IReservationEquipmentDto[],\r\n): string[] => {\r\n let allAcc = allEquipments.reduce((acc, next) => {\r\n let services: IEquipmentAccServiceDto[] = [];\r\n acc.forEach(c => {\r\n if (next.AccServices.some(n => n.Id === c.Id)) {\r\n services.push(c);\r\n }\r\n });\r\n return services;\r\n }, allEquipments.filter(f => f.AccServices.length > 0)[0].AccServices);\r\n if (\r\n allEquipments.some(f => f.AccServices.length > 0) &&\r\n allEquipments.some(f => f.AccServices.length < 1)\r\n ) {\r\n return allEquipments.filter(f => f.AccServices.length > 0).map(f => f.Name);\r\n } else if (allAcc.length !== allEquipments.length) {\r\n let wrongEqs = allEquipments.filter(\r\n f => !allAcc.some(a => a.EquipmentId === f.Id),\r\n );\r\n return wrongEqs.map(f => f.Name);\r\n } else {\r\n return [];\r\n }\r\n};\r\nexport const getStatus = async (\r\n values: ReservationDetailsState,\r\n trainingSessionOnly: boolean,\r\n): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n if (trainingSessionOnly) {\r\n let status = {\r\n Status: (values.EquipmentsData as IReservationEquipmentDto[])[0]\r\n .TrainingSignUpApproval,\r\n Tutoring: false,\r\n } as StatusChangeResult;\r\n resolve(status);\r\n } else {\r\n try {\r\n let parent = values;\r\n let result = await ReservationsApi.changeStatus({\r\n Equipments: parent.EquipmentsData.map(f => f.Id),\r\n AccServices: parent.AccServices.map(f => f.Id),\r\n ReservationId: parent.Id > 0 ? parent.Id : null,\r\n Start: parent.StartTime,\r\n End: parent.EndTime,\r\n Status: parent.Status?.Id || 1,\r\n TrainingSignUp: parent.TrainingSignUp,\r\n Tutoring: parent.Tutoring,\r\n FullDayReservation: parent.FullDayReservation,\r\n ADGroup: parent.ADGroup?.Id || null,\r\n BookedBy: parent.BookedBy?.Id || null,\r\n FundingTypeId: parent.FundingType?.Id || 0,\r\n CheckStatus: false,\r\n TrainingSessionId: parent.TrainingSession?.Id || null,\r\n Remarks: parent.Remarks || null,\r\n BudgetId: parent.Budget?.Id || null,\r\n CheckSession: false,\r\n });\r\n resolve(result);\r\n } catch (e) {\r\n resolve({\r\n Status: values.Status?.Id || 1,\r\n Tutoring: values.Tutoring,\r\n } as StatusChangeResult);\r\n }\r\n }\r\n });\r\n};\r\nexport const formatedToString = (date: Date | string) => {\r\n return dateUtils.formatISO(dateUtils.dateOrStringToDate(date));\r\n};\r\nexport const toDate = (date: Date | string) => {\r\n return dateUtils.dateOrStringToDate(date);\r\n};\r\nexport const newDate = (date: Date | string | undefined | null) => {\r\n if (!date) {\r\n return new CustomDate(new Date(), 'complete');\r\n } else {\r\n return new CustomDate(toDate(date), 'complete');\r\n }\r\n};\r\nexport const greaterThanDate = (\r\n compared: Date | string,\r\n toCompare: Date | string,\r\n) => {\r\n let first = newDate(compared);\r\n let second = newDate(toCompare);\r\n if (first.getTime() > second.getTime()) {\r\n return true;\r\n }\r\n return false;\r\n};\r\nexport const lessThanDate = (\r\n compared: Date | string,\r\n toCompare: Date | string,\r\n) => {\r\n let first = newDate(compared);\r\n let second = newDate(toCompare);\r\n if (first.getTime() < second.getTime()) {\r\n return true;\r\n }\r\n return false;\r\n};\r\nexport const getWorkFlowName = (userName: string) => {\r\n return {\r\n Id: -1,\r\n Name: `${userName} ${dateUtils.shortDateTimeFormat(newDate(undefined))}`,\r\n } as Entity;\r\n};\r\nexport const debounceValidateMinEnd = debounce(validateMinEnd, 300);\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { BookitDatePickerProps } from 'app/components/BookitDatePicker';\r\nimport { IFieldProps } from '../FormRender/IFormFieldSetting';\r\nimport { BookitDateTimePicker } from 'app/components/BookitDatePicker/BookitDateTimePicker';\r\n\r\n/**\r\n * TODO:\r\n * A non-serializable value was detected in an action, in the path: `payload.ReceivedAt`. Value: \r\nDate Sun May 02 2021 14:58:00 GMT+0300 (Israel Daylight Time)\r\n \r\nTake a look at the logic that dispatched this action: \r\nObject { type: \"animals/insertItem\", payload: {…} }\r\n \r\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string…t-least-serializable-why-should-my-action-types-be-constants) \r\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)\r\n * */\r\n\r\nexport const FormBookitDateTimePicker = ({\r\n label,\r\n disableFuture,\r\n disablePast,\r\n ...props\r\n}: FieldHookConfig &\r\n Pick<\r\n BookitDatePickerProps,\r\n | 'endTime'\r\n | 'truncateTime'\r\n | 'minDate'\r\n | 'maxDate'\r\n | 'labelFunc'\r\n | 'clearable'\r\n | 'fullScreen'\r\n | 'minutesStep'\r\n | 'dateLabel'\r\n | 'timeLabel'\r\n | 'maskIfEmpty'\r\n | 'saveOnSelect'\r\n > & { labelInline?: boolean } & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n fullWidth={true}\r\n helperText={meta.error}\r\n dateLabel={props.dateLabel}\r\n timeLabel={props.timeLabel}\r\n labelFunc={props.labelFunc}\r\n info={props.info}\r\n disabled={props.disabled}\r\n clearable={props.clearable}\r\n fullScreen={props.fullScreen}\r\n endTime={props.endTime}\r\n truncateTime={props.truncateTime}\r\n autoFocus={props.autoFocus}\r\n minDate={props.minDate}\r\n maxDate={props.maxDate}\r\n minutesStep={props.minutesStep || 15}\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * ExtraDDLFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { ExtraDDLPicker } from 'app/components/pickers/AutocompletePickers/ExtraddlPicker';\r\n\r\nexport const ExtraDDLFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n <>\r\n \r\n \r\n );\r\n};\r\nexport default ExtraDDLFilter;\r\n","import { CircularProgress } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport {\r\n Autocomplete,\r\n AutocompleteGetTagProps,\r\n AutocompleteProps,\r\n AutocompleteRenderOptionState,\r\n} from '@material-ui/lab';\r\nimport { BookitChip, BookitChipWithInfo } from 'app/components/BasicChip';\r\nimport BaseTextField from 'app/components/BasicInputs/BaseTextField';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport React from 'react';\r\nimport { CSSProperties } from 'styled-components';\r\nimport { autocompleteStyles } from 'styles/MUIExtend/autocompleteStyles';\r\nimport { EntityType } from 'types/common';\r\nimport clsx from 'clsx';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport {\r\n ColoredOption,\r\n extractDataFromResponse,\r\n IDisableable,\r\n InfoOption,\r\n loadDataAndPrepareOptions,\r\n NonRemoveableOption,\r\n NonSelectableOption,\r\n OptionType,\r\n} from '../Utils/autoCompletePickerUtils';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { undefinedIfIsEmpty } from 'app/components/BasicTable/useProfileSetting/parseProfileUrl';\r\n\r\nexport interface AutocompleteMultiPickerExProps\r\n extends Omit<\r\n AutocompleteProps, true, boolean | undefined, false>,\r\n | 'multiple'\r\n | 'loading'\r\n | 'open'\r\n | 'options'\r\n | 'renderInput'\r\n | 'onChange'\r\n | 'classes'\r\n | 'renderTags'\r\n | 'renderOptionLabel'\r\n | 'renderOptions'\r\n > {\r\n value?: TEntity[];\r\n label?: string;\r\n loadData: (\r\n searchTerm: string | null,\r\n predicates?: (string | Condition)[],\r\n expandedColumns?: string,\r\n ) => Promise;\r\n size?: 'medium' | 'small';\r\n mini?: boolean;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n isOpen?: boolean;\r\n style?: CSSProperties;\r\n name?: string;\r\n placeholder?: string;\r\n error?: boolean;\r\n helperText?: string;\r\n onChange?: (value: TEntity[]) => void;\r\n required?: boolean;\r\n info?: string;\r\n id?: string;\r\n renderTags?: (\r\n value: TEntity[],\r\n getTagProps: AutocompleteGetTagProps,\r\n ) => React.ReactNode | undefined;\r\n renderOptionLabel?: (value: TEntity) => string | undefined;\r\n renderOptions?: (\r\n option: TEntity,\r\n state: AutocompleteRenderOptionState,\r\n ) => React.ReactNode | undefined;\r\n onBlur?: React.FocusEventHandler;\r\n onChipClick?: (chip: TEntity) => void;\r\n ariaLabel?: string;\r\n predicates?: (string | Condition)[];\r\n additionalItem?: TEntity | null;\r\n expandedColumns?: string;\r\n onPickerOpen?: () => void;\r\n}\r\n\r\n/**\r\n * A copy of AutocompleteMultiPicker with addition of limiting the length of options shown\r\n * TODO: merge with AutocompleteMultiPicker + apply to BaseURLMultiPicker\r\n */\r\nexport function AutocompleteMultiPickerEx({\r\n isOpen,\r\n size,\r\n mini,\r\n onOpen,\r\n onClose,\r\n label,\r\n fullWidth,\r\n variant,\r\n name,\r\n placeholder,\r\n error,\r\n helperText,\r\n required,\r\n renderTags,\r\n loadData,\r\n disableClearable,\r\n onChange,\r\n onInputChange,\r\n getOptionSelected,\r\n getOptionLabel,\r\n renderOptionLabel,\r\n renderOptions,\r\n onBlur,\r\n value,\r\n defaultValue,\r\n info,\r\n id,\r\n onChipClick,\r\n ariaLabel,\r\n predicates,\r\n additionalItem,\r\n expandedColumns,\r\n onPickerOpen,\r\n ...props\r\n}: AutocompleteMultiPickerExProps) {\r\n const { t } = useTranslation();\r\n const classes = autocompleteStyles();\r\n let firstOpen = isOpen;\r\n const [open, setOpen] = React.useState(firstOpen);\r\n const [options, setOptions] = React.useState[] | null>(\r\n null,\r\n );\r\n const [searchTerm, setSearchTerm] = React.useState(null);\r\n const [hasSelected, setSelected] = React.useState(\r\n defaultValue && defaultValue.length > 0,\r\n );\r\n const isMobile = DetectIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const showShortView = isMobile || (sidePanelOpen && !sidePanelExpanded);\r\n const loading = open && options === null;\r\n useEffectOnMount(() => {\r\n setSelected((value || []).length > 0);\r\n });\r\n React.useEffect(() => {\r\n let active = true;\r\n if (!loading) return undefined;\r\n\r\n (async () => {\r\n try {\r\n const rawResponse = await loadData(\r\n searchTerm,\r\n predicates,\r\n expandedColumns,\r\n );\r\n const response = extractDataFromResponse(rawResponse);\r\n const optionsData = loadDataAndPrepareOptions({\r\n response,\r\n additionalItem,\r\n t,\r\n });\r\n active && setOptions(optionsData);\r\n } catch {}\r\n })();\r\n\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n loading,\r\n loadData,\r\n searchTerm,\r\n t,\r\n predicates,\r\n additionalItem,\r\n expandedColumns,\r\n ]);\r\n\r\n React.useEffect(() => {\r\n if (!open) setOptions(null);\r\n }, [open]);\r\n\r\n const handleRenderTags = (\r\n value: OptionType[],\r\n getTagProps: AutocompleteGetTagProps,\r\n ) => {\r\n const selectable = value.filter(\r\n option => (option as NonSelectableOption)?.disabled !== true,\r\n );\r\n if (renderTags === undefined) {\r\n return selectable.map((option: OptionType, index: number) =>\r\n !!(option as InfoOption).titleInfo ? (\r\n onChipClick?.(option as TEntity)}\r\n variant=\"default\"\r\n size=\"small\"\r\n label={option.Name}\r\n custombgcolor={\r\n undefinedIfIsEmpty((option as ColoredOption)?.Color) ?? undefined\r\n }\r\n info={(option as InfoOption).titleInfo}\r\n notremoved={(option as NonRemoveableOption)?.noremoved}\r\n {...getTagProps({ index })}\r\n />\r\n ) : (\r\n onChipClick?.(option as TEntity)}\r\n variant=\"default\"\r\n size=\"small\"\r\n label={option.Name}\r\n custombgcolor={\r\n undefinedIfIsEmpty((option as ColoredOption)?.Color) ?? undefined\r\n }\r\n notremoved={(option as NonRemoveableOption)?.noremoved}\r\n {...getTagProps({ index })}\r\n />\r\n ),\r\n );\r\n } else {\r\n return renderTags(selectable as TEntity[], getTagProps);\r\n }\r\n };\r\n const handleRenderOptionLabel = (option: OptionType) => {\r\n return renderOptionLabel === undefined\r\n ? option.Name\r\n : (renderOptionLabel(option as TEntity) as string);\r\n };\r\n const getIsOptionSelected_Internal = (\r\n option: OptionType,\r\n value: OptionType,\r\n ) => {\r\n if ((option as NonSelectableOption).disabled !== undefined) {\r\n return false;\r\n }\r\n var id = (option as TEntity)?.Id;\r\n var selectable = id !== undefined;\r\n\r\n if (!selectable) {\r\n return false;\r\n } else if (getOptionSelected !== undefined) {\r\n return getOptionSelected(option as TEntity, value as TEntity);\r\n } else {\r\n return id === (value as TEntity)?.Id;\r\n }\r\n };\r\n const getOptionDisabled = (option: OptionType) =>\r\n (option as IDisableable)?.disabled ?? false;\r\n\r\n return (\r\n []) ?? []}\r\n open={open || false}\r\n onOpen={e => {\r\n //onOpen && onOpen(e);\r\n !disableClearable && setOptions(null);\r\n setSearchTerm(null);\r\n setOpen(true);\r\n !!onPickerOpen && onPickerOpen();\r\n }}\r\n onClose={(e, r) => {\r\n //onClose && onClose(e, r);\r\n setSearchTerm(null);\r\n setOpen(false);\r\n }}\r\n onChange={(e, v, r, d) => {\r\n setSearchTerm(null);\r\n setSelected(v.length > 0);\r\n if (onChange) {\r\n onChange(v as TEntity[]);\r\n }\r\n }}\r\n onInputChange={(event, newValue, reason) => {\r\n setOptions(null);\r\n if (reason === 'input') setSearchTerm(newValue);\r\n //onInputChange && onInputChange(event, newValue, reason);\r\n }}\r\n getOptionSelected={getIsOptionSelected_Internal}\r\n getOptionDisabled={getOptionDisabled}\r\n getOptionLabel={handleRenderOptionLabel}\r\n renderTags={handleRenderTags}\r\n size={size}\r\n fullWidth={fullWidth}\r\n disableClearable={disableClearable}\r\n value={value || undefined}\r\n popupIcon={}\r\n closeIcon={}\r\n selectOnFocus={isMobile ? false : true}\r\n renderInput={params => (\r\n \r\n {loading ? (\r\n \r\n ) : info ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n {params.InputProps.endAdornment}\r\n \r\n ),\r\n startAdornment: params.InputProps.startAdornment,\r\n }}\r\n />\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n","import { toRootedURL } from 'utils/url-utils';\r\nexport type ImageSize =\r\n | 'full'\r\n | 'thumb'\r\n | 'thumbSmall'\r\n | 'thumbLarge'\r\n | 'horizontal'\r\n | 'horizontalLarge'\r\n | 'vertical'\r\n | 'verticalLarge';\r\n\r\nexport function getAssetImageThumbSrc(\r\n imageName: string | null,\r\n imageSize?: ImageSize,\r\n imageExist?: boolean,\r\n defaultImage?: string,\r\n): string | undefined {\r\n if (imageName === null || imageExist === false) {\r\n return toRootedURL(defaultImage ?? getDefaultImage(imageSize));\r\n }\r\n switch (imageSize) {\r\n case 'full':\r\n return toRootedURL(`/uploads/assets/${imageName}`);\r\n case 'horizontal':\r\n return toRootedURL(`/uploads/assets/cardhorizontal/${imageName}`);\r\n case 'horizontalLarge':\r\n return toRootedURL(`/uploads/assets/cardhorizontallarge/${imageName}`);\r\n case 'vertical':\r\n return toRootedURL(`/uploads/assets/cardvertical/${imageName}`);\r\n case 'verticalLarge':\r\n return toRootedURL(`/uploads/assets/cardverticallarge/${imageName}`);\r\n case 'thumbSmall':\r\n return toRootedURL(`/uploads/assets/thumbsSmall/${imageName}`);\r\n case 'thumbLarge':\r\n return toRootedURL(`/uploads/assets/thumbsLarge/${imageName}`);\r\n case 'thumb':\r\n default:\r\n return toRootedURL(`/uploads/assets/thumbs/${imageName}`);\r\n }\r\n}\r\nexport function getDefaultImage(size?: ImageSize) {\r\n switch (size) {\r\n case 'full':\r\n return `/images/200x150.png`;\r\n case 'thumb':\r\n return `/images/64x64.png`;\r\n case 'thumbSmall':\r\n return `/images/64x38.png`;\r\n case 'thumbLarge':\r\n return `/images/80x80.png`;\r\n case 'vertical':\r\n return `/images/278x174.png`;\r\n case 'verticalLarge':\r\n return `/images/457x240.png`;\r\n case 'horizontal':\r\n return `/images/180x201.png`;\r\n case 'horizontalLarge':\r\n return `/images/207x201.png`;\r\n case undefined:\r\n default:\r\n return `/images/64x64.png`;\r\n }\r\n}\r\nexport function getAssetImageSrc(\r\n imageName: string | null,\r\n imageExist?: boolean,\r\n defaultImage?: string,\r\n): string | undefined {\r\n if (imageName === null || imageExist === false) {\r\n return toRootedURL(defaultImage ?? `/images/200x150.png`);\r\n }\r\n return toRootedURL(`/uploads/assets/${imageName}`);\r\n}\r\n","export enum PartOfDay {\r\n Undefined = -1,\r\n /// \r\n /// Combines what was perviously named as Day/Night. Replaced by the TimeSlotTypes\r\n /// \r\n BusinessHours = 0,\r\n OffLine = 2,\r\n Tutoring = 3,\r\n NoTutoring = 4,\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport {\r\n call,\r\n put,\r\n select,\r\n takeEvery,\r\n takeLatest,\r\n debounce,\r\n all,\r\n} from 'redux-saga/effects';\r\nimport { schedulerActions as actions } from '.';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n ReservationDetailsState,\r\n ReservationQueryStringParameters,\r\n} from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport {\r\n ChangeServicesAction,\r\n ChangeViewModeAction,\r\n GetServicesAction,\r\n IEditEvent,\r\n INewEvent,\r\n ISchedulerService,\r\n ISerializableFilterSettings,\r\n IViewState,\r\n SetFilterAction,\r\n} from './types';\r\nimport { BatchResponses, httpClient } from 'api/HttpClient';\r\nimport {\r\n selectSchedulerViewStartDate,\r\n selectSchedulerViewEndDate,\r\n selectSchedulerPreviousViewState,\r\n selectSchedulerFilters,\r\n selectMultipleModeState,\r\n selectNotUseLocation,\r\n selectEmptySlotAdminClick,\r\n selectSchedulerNewEventServices,\r\n selectLoadedServices,\r\n selectCalendarReservationColumns,\r\n selectWithReservationsOnly,\r\n selectSchedulerViewState,\r\n} from './selectors';\r\n\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n withisInversed,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n RenderPageType,\r\n SidePanelState,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { ReservationDetailsProps } from 'app/pages/ReservationDetails/Details';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectGlobalServiceGroupFilter,\r\n selectGlobalSetting,\r\n selectglobalSettings,\r\n selectUserProfileSettings,\r\n} from 'app/slice/selectors';\r\nimport { getLogger } from 'loglevel';\r\nimport { routerActions } from 'connected-react-router';\r\nimport { isArray, isEqual, omit, uniq } from 'lodash';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { selectSidePanelState } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { selectReservationData } from 'app/pages/ReservationDetails/Details/slice/selectors';\r\nimport { reservationActions } from 'app/pages/ReservationDetails/Details/slice';\r\nimport { UserProfileSettings } from 'types/UserProfileSettings';\r\nimport { UserProfile } from 'utils/userProfileSettings';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { IWorkingHoursDto } from 'api/odata/generated/entities/IWorkingHoursDto';\r\nimport { PartOfDay } from 'enums/WorkingHoursTypes';\r\nimport { WorkOrderDetailsProps } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport {\r\n WorkOrderDetailsState,\r\n WorkOrderQueryStringParameters,\r\n} from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/types';\r\nimport { GetCalendarPagePath } from '../../GetCalendarPagePath';\r\nimport { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { EmptySlotAdminClick } from 'enums/EmptySlotAdminClick';\r\nimport { Entity } from 'types/common';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { workOrderActions } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { undefinedIfIsEmpty } from 'app/components/BasicTable/useProfileSetting/parseProfileUrl';\r\nimport { ISavedViewDto } from 'api/odata/generated/entities/ISavedViewDto';\r\nimport { selectSelectedSavedView } from 'app/pages/SavedViewsPage/SavedViewPage/slice/selectors';\r\nimport { savedViewActions } from 'app/pages/SavedViewsPage/SavedViewPage/slice';\r\nimport { ReservationOrDowntimeEnum } from 'enums/ReservationOrDowntimeEnum';\r\nimport { FilterValue } from 'react-table';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n groupByFilterFieldName,\r\n periodFilterFieldName,\r\n} from '../../parseCalendarPageParams';\r\nimport { URLSearchParamsCI } from 'app/components/BasicTable/types/FilterParam';\r\nimport { IEquipmentTimeSlot } from 'api/odata/generated/complexTypes/IEquipmentTimeSlot';\r\n\r\nconst log = getLogger('SchedulerSaga');\r\nfunction* doChangeViewMode(action: ChangeViewModeAction) {\r\n const previous: IViewState | undefined = yield select(\r\n selectSchedulerPreviousViewState,\r\n );\r\n const { current } = action.payload;\r\n log.debug('doChangeViewMode', previous, current);\r\n const notUseLocation = yield select(selectNotUseLocation);\r\n if (!notUseLocation) {\r\n yield* changeLocation(current, previous);\r\n }\r\n // skip unnecessary data reload during calendar/timeline switch\r\n // fool proofing against duplicate calls to change view state of the scheduler\r\n const isSameState = isStateEqual(previous, current);\r\n if (!isSameState || action.payload.forceEvents) {\r\n yield put(actions.getEvents());\r\n }\r\n yield put(actions.setPreviousViewState(current));\r\n}\r\n\r\nfunction* doChangeViewModePartial(action: PayloadAction>) {\r\n const current: IViewState = yield select(selectSchedulerViewState);\r\n yield* doChangeViewMode({\r\n type: action.type,\r\n payload: {\r\n current,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Determines if the viewstate have changed from the perspective of the scheduler saga\r\n * Used in order to fool proof the doChangeViewMode from rouge duplicate calls to change the viewstate causing to duplicate calls to fetch events\r\n * @param previous\r\n * @param current\r\n * @returns\r\n */\r\nfunction isStateEqual(previous: IViewState | undefined, current: IViewState) {\r\n try {\r\n const pickViewState = (a?: IViewState) => ({\r\n viewLength: a?.viewLength,\r\n // guards from one second changes to the viewstate regardless of their origin\r\n // lowest denominator for the purpose of fetching events is one day currently\r\n // in future, if the scheduler resolution will be lowered to > 1 day, this will need to be adjusted accordingly\r\n date:\r\n a?.date === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.startOfDay(dateUtils.parseISO(a.date)),\r\n ),\r\n });\r\n const isSameState = isEqual(\r\n pickViewState(previous),\r\n pickViewState(current),\r\n );\r\n return isSameState;\r\n } catch (error) {\r\n return false;\r\n }\r\n}\r\nexport function applyStateSearchParams(current: IViewState) {\r\n const params = new URLSearchParamsCI(current.search);\r\n if (current.preset === null) {\r\n params.delete(periodFilterFieldName);\r\n } else {\r\n params.set(periodFilterFieldName, current.preset);\r\n }\r\n\r\n params.set(groupByFilterFieldName, current.groupBy);\r\n\r\n return params.toString();\r\n}\r\n\r\nfunction* changeLocation(\r\n current: IViewState,\r\n previous: IViewState | undefined,\r\n) {\r\n const currentMode = {\r\n groupBy: current.groupBy,\r\n type: current.viewType,\r\n search: current.search,\r\n };\r\n const previousMode = {\r\n groupBy: previous?.groupBy,\r\n type: previous?.viewType,\r\n search: previous?.search,\r\n };\r\n\r\n if (!isEqual(previousMode, currentMode)) {\r\n const path = GetCalendarPagePath(current);\r\n\r\n yield put(\r\n routerActions.push({ pathname: path, search: currentMode.search }),\r\n );\r\n }\r\n}\r\n\r\nconst reservationHistoryAPIURL = '/api/odata/v4/CalendarReservations';\r\n\r\nfunction eventsParams({\r\n start,\r\n end,\r\n allFilters,\r\n selectedServices,\r\n serviceGroups,\r\n}: {\r\n start: Date | undefined;\r\n end: Date | undefined;\r\n allFilters: ISerializableFilterSettings | undefined;\r\n selectedServices: Array | undefined;\r\n serviceGroups: Array> | undefined;\r\n}) {\r\n const { events: eventFilters, training } = splitFilter(allFilters);\r\n const ReservationOrDowntime =\r\n allFilters?.['ReservationOrDowntime']?.value?.Id;\r\n\r\n // filters shared across all type of events reservations/working hours/training sessions/etc.\r\n // this filter can be sources either from the \"Filter\" or from scheduler state\r\n const sharedFilter: Array> = [\r\n new Condition(\r\n 'StartTime',\r\n ODataOperators.LessThan,\r\n end as FilterValue,\r\n ),\r\n new Condition(\r\n 'EndTime',\r\n ODataOperators.GreaterThan,\r\n start as FilterValue,\r\n ),\r\n ];\r\n\r\n const servicesFilter: Array> = [];\r\n\r\n if (selectedServices !== undefined && selectedServices.length > 0) {\r\n const equipmentIdArray = selectedServices.map(f => f.Id);\r\n servicesFilter.push(\r\n new Condition(\r\n 'EquipmentId',\r\n ODataOperators.Includes,\r\n equipmentIdArray,\r\n ),\r\n );\r\n }\r\n\r\n if (serviceGroups !== undefined && serviceGroups.length > 0) {\r\n servicesFilter.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n serviceGroups,\r\n ),\r\n );\r\n }\r\n return {\r\n ReservationOrDowntime,\r\n training,\r\n sharedFilter,\r\n servicesFilter,\r\n eventFilters,\r\n };\r\n}\r\n\r\nfunction* doGetEvents(action: PayloadAction) {\r\n const start = yield select(selectSchedulerViewStartDate);\r\n const end = yield select(selectSchedulerViewEndDate);\r\n const allFilters: ISerializableFilterSettings | undefined = yield select(\r\n selectSchedulerFilters,\r\n );\r\n const selectedServices: Array | undefined = yield select(\r\n selectLoadedServices,\r\n );\r\n const serviceGroups: Array> | undefined = yield select(\r\n selectGlobalServiceGroupFilter,\r\n );\r\n const withReservationsOnly = yield select(selectWithReservationsOnly);\r\n const {\r\n ReservationOrDowntime,\r\n training,\r\n sharedFilter,\r\n servicesFilter,\r\n eventFilters,\r\n } = eventsParams({\r\n start,\r\n end,\r\n allFilters,\r\n selectedServices,\r\n serviceGroups,\r\n });\r\n\r\n // track fetched services\r\n const fetchedServices: number[] = [];\r\n\r\n const reservations_fields = yield select(selectCalendarReservationColumns);\r\n const effects: Array = [\r\n fetchEvents(\r\n ReservationOrDowntime,\r\n sharedFilter,\r\n servicesFilter,\r\n eventFilters,\r\n reservations_fields,\r\n ),\r\n fetchTrainingSessions(\r\n ReservationOrDowntime,\r\n training,\r\n sharedFilter,\r\n servicesFilter,\r\n selectedServices,\r\n fetchedServices,\r\n ),\r\n ];\r\n const noServicesSelected =\r\n selectedServices === undefined || selectedServices.length === 0;\r\n const loadWorkingHoursForFetchedEvents = !(\r\n noServicesSelected && withReservationsOnly\r\n );\r\n\r\n // working hours can be fetched early if they don't depend on fetched events\r\n if (loadWorkingHoursForFetchedEvents) {\r\n effects.push(\r\n fetchWorkingHours(\r\n ReservationOrDowntime,\r\n sharedFilter,\r\n servicesFilter,\r\n eventFilters,\r\n ),\r\n );\r\n }\r\n try {\r\n const [\r\n fetchedEventsEffect,\r\n fetchedTrainingSessionsEffect,\r\n fetchWorkingHoursEffect,\r\n ] = yield all(effects);\r\n const fetchedEvents = fetchedEventsEffect as IODataQueryResponse<\r\n ICalendarReservationDto\r\n > | null;\r\n if (noServicesSelected && fetchedEvents != null) {\r\n fetchedServices.push(\r\n ...uniq(fetchedEvents.value.map(f => f.EquipmentId)),\r\n );\r\n }\r\n\r\n const fetchedTrainingSessions = fetchedTrainingSessionsEffect as IODataQueryResponse<\r\n ITrainingSessionSlotDto\r\n > | null;\r\n if (noServicesSelected && fetchedTrainingSessions != null) {\r\n fetchedServices.push(\r\n ...uniq(fetchedTrainingSessions.value.map(f => f.EquipmentId)),\r\n );\r\n }\r\n\r\n const fetchedWorkingHours = fetchWorkingHoursEffect as IODataQueryResponse<\r\n IWorkingHoursDto\r\n > | null;\r\n\r\n yield put(\r\n actions.getEvents_Success({\r\n reservations: fetchedEvents?.value ?? [],\r\n trainingSessions: fetchedTrainingSessions?.value ?? [],\r\n offlineHours: fetchedWorkingHours?.value ?? [],\r\n }),\r\n );\r\n\r\n if (loadWorkingHoursForFetchedEvents) {\r\n if (noServicesSelected && fetchedWorkingHours != null) {\r\n fetchedServices.push(\r\n ...uniq(fetchedWorkingHours.value.map(f => f.EquipmentId)),\r\n );\r\n }\r\n } else {\r\n const offlineServicesFilter =\r\n withReservationsOnly === true\r\n ? [\r\n new Condition(\r\n 'EquipmentId',\r\n ODataOperators.Includes,\r\n [\r\n ...new Set(\r\n (fetchedEvents?.value ?? []).map(f => f.EquipmentId),\r\n ),\r\n ],\r\n ),\r\n ]\r\n : servicesFilter;\r\n // fetch offline hours (alerts) for all displayed services\r\n var result: IODataQueryResponse = yield fetchWorkingHours(\r\n ReservationOrDowntime,\r\n sharedFilter,\r\n offlineServicesFilter,\r\n eventFilters,\r\n );\r\n fetchedServices.push(...uniq(result.value.map(f => f.EquipmentId)));\r\n yield put(actions.getOfflineHours_Success(result.value));\r\n }\r\n\r\n if (noServicesSelected) {\r\n const distinctEquipmentIds = uniq(fetchedServices);\r\n yield put(actions.getDerivedServices(distinctEquipmentIds));\r\n }\r\n\r\n // fetch non working hours only if a service has been selected\r\n if (selectedServices !== undefined && selectedServices.length > 0) {\r\n try {\r\n const nonWorking = yield call(\r\n getNonWorkingHours,\r\n selectedServices.map(f => f.Id),\r\n start,\r\n end,\r\n );\r\n yield put(actions.getNonWorkingHours_Success(nonWorking));\r\n } catch {\r\n yield put(actions.getNonWorkingHours_Success([]));\r\n }\r\n }\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n}\r\n\r\nfunction fetchWorkingHours(\r\n ReservationOrDowntime: any,\r\n sharedFilter: Condition[],\r\n offlineServicesFilter:\r\n | Condition[]\r\n | Condition[],\r\n eventFilters: string[],\r\n) {\r\n if (ReservationOrDowntime === ReservationOrDowntimeEnum.ReservationsOnly) {\r\n return call(() => null);\r\n } else {\r\n const url = `/api/odata/v4/WorkingHours`;\r\n // when the \"With reservations only\" is enabled - the offline hours need to be fetched only for those services that have reservations on them\r\n // so in this case reservations fetched here are used to extract the service ids and filter by them\r\n // otherwise the standard shared servicesFilter is used so that offline hours & reservations will be fetched on the same services\r\n const b = new ODataFilterBuilder({\r\n predicates: [\r\n new Condition(\r\n 'PeriodTypeId',\r\n ODataOperators.Equals,\r\n PartOfDay.OffLine,\r\n ).toString() || '',\r\n ...sharedFilter,\r\n ...offlineServicesFilter.map(f => f.toString()),\r\n ...Object.entries(eventFilters ?? {})\r\n // exclude the EquipmentId & ServiceGroupId filters applied separately in the shared filters\r\n .filter(([key]) => !['service', 'period'].includes(key))\r\n // exclude filters not applicable to the offline hours like the BudgetManager\r\n .filter(([key]) => !['BudgetManager'].includes(key))\r\n .map(([, value]) => value),\r\n ],\r\n stringColumns: [],\r\n globalServiceGroupFilter: [],\r\n isOptionalServiceGroup: true,\r\n });\r\n return call(httpClient.get, url, { $filter: b.toString() });\r\n }\r\n}\r\n\r\nfunction fetchTrainingSessions(\r\n ReservationOrDowntime: any,\r\n training: string[],\r\n sharedFilter: Condition[],\r\n servicesFilter: Condition[],\r\n selectedServices: IServiceFilterDto[] | undefined,\r\n fetchedServices: number[],\r\n) {\r\n if (ReservationOrDowntime !== ReservationOrDowntimeEnum.DownTimeOnly) {\r\n const ff = Object.keys(training || {}).includes('BudgetManager');\r\n if (ff) {\r\n return call(() => null);\r\n } else {\r\n const trainingFilterBuilder = new ODataFilterBuilder<\r\n ICalendarReservationDto\r\n >({\r\n predicates: [\r\n ...sharedFilter,\r\n ...servicesFilter,\r\n ...Object.entries(training ?? {})\r\n // exclude the EquipmentId & ServiceGroupId filters applied separately in the shared filters\r\n .filter(([key]) => !['service', 'period'].includes(key))\r\n .map(([, value]) => value),\r\n ],\r\n stringColumns: [],\r\n globalServiceGroupFilter: [],\r\n isOptionalServiceGroup: true,\r\n });\r\n return call(httpClient.get, '/api/odata/v4/TrainingSessionSlots', {\r\n $filter: trainingFilterBuilder.toString(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nfunction fetchEvents(\r\n ReservationOrDowntime: any,\r\n sharedFilter: Condition[],\r\n servicesFilter: Condition[],\r\n eventFilters: string[],\r\n reservations_fields: string[],\r\n) {\r\n if (ReservationOrDowntime !== ReservationOrDowntimeEnum.DownTimeOnly) {\r\n const b = new ODataFilterBuilder({\r\n predicates: [\r\n ...sharedFilter,\r\n ...servicesFilter,\r\n ...Object.entries(eventFilters ?? {})\r\n // exclude the EquipmentId & ServiceGroupId filters applied separately in the shared filters\r\n .filter(([key]) => !['service', 'period'].includes(key))\r\n .map(([, value]) => value),\r\n ],\r\n stringColumns: [],\r\n globalServiceGroupFilter: [],\r\n isOptionalServiceGroup: true,\r\n });\r\n\r\n return call(httpClient.get, reservationHistoryAPIURL, {\r\n $filter: b.toString(),\r\n $select: reservations_fields.join(','),\r\n });\r\n }\r\n return call(() => null);\r\n}\r\n\r\nasync function getNonWorkingHours(\r\n selectedServices: Array,\r\n start: Timestamp,\r\n end: Timestamp,\r\n) {\r\n const serviceIdParameter = selectedServices;\r\n const prepareDateParameter = date =>\r\n dateUtils.formatISO(date, { format: 'basic', representation: 'date' });\r\n const startParameter = prepareDateParameter(start);\r\n const endParameter = prepareDateParameter(\r\n dateUtils.addDays(dateUtils.startOfDay(dateUtils.parseISO(end)), 1),\r\n );\r\n var url = `/api/odata/v4/WorkingHours/GetNonWorking(ServiceId=${JSON.stringify(\r\n serviceIdParameter,\r\n )},Start=${startParameter},End=${endParameter})`;\r\n\r\n // use batch POST instead of GET to overcome 400 response for long urls\r\n const batchResponse: BatchResponses = await httpClient.batch([\r\n {\r\n method: 'GET',\r\n pathName: url,\r\n },\r\n ]);\r\n const result = batchResponse.responses[0].body as IODataQueryResponse<\r\n IEquipmentTimeSlot\r\n >;\r\n return result.value;\r\n}\r\n\r\nasync function getServiceDetails(ids: Array) {\r\n const result: IODataQueryResponse = await httpClient.get(\r\n '/api/odata/v4/ServiceFilter/ReservableEquipments',\r\n {\r\n $filter: new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n ids.filter(f => f !== undefined),\r\n ).toString(),\r\n $expand: 'WorkingHours',\r\n },\r\n );\r\n return result.value;\r\n}\r\n\r\nfunction* doGetServices(action: GetServicesAction) {\r\n try {\r\n if (action.payload === undefined) {\r\n yield put(actions.getServices_Success([]));\r\n return;\r\n }\r\n if (action.payload.length === 0) {\r\n yield put(actions.getServices_Success([]));\r\n return;\r\n }\r\n const needMoreProps = needMoreServiceProps({ services: action.payload });\r\n if (!needMoreProps) {\r\n yield put(\r\n actions.getServices_Success(action.payload as Array),\r\n );\r\n } else {\r\n try {\r\n // fetch service details only for services that haven't been loaded previously\r\n\r\n const servicesResponse: Array = yield call(\r\n getServiceDetails,\r\n action.payload.map(f => f.Id),\r\n );\r\n\r\n yield put(actions.getServices_Success(servicesResponse));\r\n } catch (error) {\r\n log.error('doGetServices', action, error);\r\n }\r\n }\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n yield put(actions.getEvents());\r\n}\r\n\r\nfunction needMoreServiceProps(props: {\r\n services: IServiceFilterDto[] | undefined;\r\n}) {\r\n const requiredProps: Array = [\r\n 'Id',\r\n 'Name',\r\n 'ServiceGroupId',\r\n 'ServiceTypeId',\r\n 'Color',\r\n 'UseServiceGroupTrainingLevels',\r\n 'ServiceGroupName',\r\n 'RestrictDurationUnitsAmount',\r\n 'RestrictDurationUnitType',\r\n 'ImageName',\r\n 'DefaultDuration',\r\n 'AssemblyId',\r\n 'TopAssemblyId',\r\n 'AssetCatId',\r\n 'AssetCatName',\r\n 'RestrictReservationToTimeSlots',\r\n 'MinOrderHours',\r\n 'WorkingHours',\r\n ];\r\n const needMoreProps = props.services?.some(f => {\r\n const actualProps = Object.keys(f).sort();\r\n const iss = isEqual(actualProps, requiredProps.sort());\r\n return !iss;\r\n });\r\n return needMoreProps;\r\n}\r\n\r\nfunction* doGetDerivedServices(action: ChangeServicesAction) {\r\n try {\r\n if (action.payload === undefined) {\r\n return undefined;\r\n }\r\n const servicesResponse: Array = yield call(\r\n getServiceDetails,\r\n action.payload,\r\n );\r\n\r\n yield put(actions.getDerivedServices_Success(servicesResponse));\r\n } catch (error) {\r\n log.error('doGetServices', action, error);\r\n }\r\n}\r\nfunction* doEdit(action: PayloadAction) {\r\n if (action.payload.type === undefined) {\r\n return;\r\n }\r\n switch (action.payload.type) {\r\n case 'offline':\r\n if (action.payload.alert_id !== undefined) {\r\n yield* doEditAlert(action);\r\n }\r\n break;\r\n case 'reservation':\r\n yield* doEditReservation(action);\r\n break;\r\n case 'trainingsession':\r\n if (action.payload.reservation_id === undefined) {\r\n yield* doEditTrainingSession(action);\r\n } else {\r\n yield doEditReservation(action);\r\n }\r\n break;\r\n default:\r\n assertExhaustive(action.payload.type);\r\n }\r\n}\r\nfunction* doEditTrainingSession(action: PayloadAction) {\r\n const trainingSession = action.payload.original as ITrainingSessionSlotDto;\r\n const authenticatedUser: AuthenticatedUser = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n\r\n const queryParams: ReservationQueryStringParameters = {\r\n // reservation details does not understand the ISO time, the value must be without the \"z\"\r\n Start: dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(trainingSession.StartTime),\r\n ),\r\n // reservation details does not understand the ISO time, the value must be without the \"z\"\r\n End: dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(trainingSession.EndTime),\r\n ),\r\n selectedIds: String(action.payload.service_id),\r\n un: authenticatedUser.Id,\r\n tsid: String((action.payload as any).trainingsession_id),\r\n };\r\n // undefined can't be processed by the reservation details\r\n if (action.payload.reservation_id !== undefined) {\r\n queryParams.id = String(action.payload.reservation_id);\r\n }\r\n // const x: SidePanelState | undefined = yield select(selectSidePanelState);\r\n // const reservationSidePanelOpened =\r\n // x?.sidePanelOpen && x?.pageType === RenderPageType.ReservationDetails;\r\n\r\n // if (reservationSidePanelOpened) {\r\n // if (action.payload.start_date !== undefined) {\r\n // yield put(reservationActions.setStartDate(action.payload.start_date));\r\n // }\r\n // if (action.payload.end_date !== undefined) {\r\n // yield put(reservationActions.setEndDate(action.payload.end_date));\r\n // }\r\n // } else {\r\n\r\n // }\r\n yield put(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.ReservationDetails,\r\n props: {\r\n useSidePanel: true,\r\n queryParams,\r\n } as ReservationDetailsProps,\r\n }),\r\n );\r\n}\r\nfunction* doEditReservation(action: PayloadAction) {\r\n if (action.payload.reservation_id === undefined) {\r\n log.error('doEditReservation: ReservationId not found', action.payload);\r\n return;\r\n }\r\n const queryParams: ReservationQueryStringParameters = {\r\n id: String(action.payload.reservation_id),\r\n Start: action.payload.start_date,\r\n End: action.payload.end_date,\r\n };\r\n const sidePanelState: SidePanelState | undefined = yield select(\r\n selectSidePanelState,\r\n );\r\n const reservationDetailsState:\r\n | ReservationDetailsState\r\n | undefined = yield select(selectReservationData);\r\n const reservationSidePanelOpened =\r\n sidePanelState?.sidePanelOpen &&\r\n sidePanelState?.pageType === RenderPageType.ReservationDetails;\r\n if (reservationSidePanelOpened) {\r\n if (action.payload.reservation_id !== reservationDetailsState?.Id) {\r\n if (reservationDetailsState?.Id !== undefined) {\r\n // reset previously opened reservation/alert details before showing new one\r\n yield put(layoutActions.resetSidePanel());\r\n }\r\n }\r\n }\r\n\r\n if (\r\n reservationSidePanelOpened &&\r\n action.payload.reservation_id === reservationDetailsState?.Id\r\n ) {\r\n if (action.payload.start_date !== undefined) {\r\n yield put(reservationActions.setStartDate(action.payload.start_date));\r\n }\r\n if (action.payload.end_date !== undefined) {\r\n yield put(reservationActions.setEndDate(action.payload.end_date));\r\n }\r\n } else {\r\n yield put(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.ReservationDetails,\r\n props: {\r\n useSidePanel: true,\r\n queryParams,\r\n } as ReservationDetailsProps,\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doEditAlert(action: PayloadAction) {\r\n const queryParams: WorkOrderQueryStringParameters = {\r\n id: String(action.payload.alert_id),\r\n offStart: action.payload.start_date,\r\n offEnd: action.payload.end_date,\r\n };\r\n const props: WorkOrderDetailsProps = {\r\n queryParams: queryParams,\r\n\r\n useSidePanel: true,\r\n };\r\n\r\n const sidePanelState: SidePanelState | undefined = yield select(\r\n selectSidePanelState,\r\n );\r\n\r\n if (sidePanelState?.sidePanelOpen && action.payload.alert_id === undefined) {\r\n yield put(\r\n workOrderActions.setOfflineEventStart(\r\n dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.start_date),\r\n ),\r\n ),\r\n );\r\n\r\n yield put(\r\n workOrderActions.setOfflineEventEnd(\r\n dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.end_date),\r\n ),\r\n ),\r\n );\r\n } else {\r\n yield put(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.WorkOrderDetails,\r\n props: props,\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doCreate(action: PayloadAction) {\r\n if (action.payload === undefined) {\r\n return;\r\n }\r\n const authenticatedUser: AuthenticatedUser = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n const requestedServices = yield select(selectSchedulerNewEventServices);\r\n const defaultMulti: boolean | undefined = yield select(\r\n selectMultipleModeState,\r\n );\r\n const defaultMultiModeBehavior = action.payload.defaultMulti ?? defaultMulti;\r\n const emptySlotAdminClick: EmptySlotAdminClick = yield select(\r\n selectEmptySlotAdminClick,\r\n );\r\n const isAdmin = authenticatedUser.IsAllGroupOrLabTechAdmin(\r\n requestedServices.map(f => f.ServiceGroupId),\r\n requestedServices.map(f => {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n ServiceTypeId: f.ServiceTypeId,\r\n } as IServiceTypeFilterDto;\r\n }),\r\n );\r\n const sidePanelState: SidePanelState | undefined = yield select(\r\n selectSidePanelState,\r\n );\r\n const reservationDetailsState:\r\n | ReservationDetailsState\r\n | undefined = yield select(selectReservationData);\r\n const reservationSidePanelOpened =\r\n sidePanelState?.sidePanelOpen &&\r\n sidePanelState?.pageType === RenderPageType.ReservationDetails;\r\n if (reservationSidePanelOpened) {\r\n if (reservationDetailsState?.Id !== 0) {\r\n // reset previously opened reservation/alert details before showing new one\r\n yield put(layoutActions.resetSidePanel());\r\n }\r\n }\r\n\r\n // equipment is changed here when a new reservation is dragged to another service on the timeline\r\n const equipmentChanged =\r\n action.payload.service_id !== undefined &&\r\n reservationDetailsState?.EquipmentsData?.some(\r\n equipment => equipment.Id === action.payload?.service_id,\r\n ) === false;\r\n\r\n if (\r\n reservationSidePanelOpened &&\r\n reservationDetailsState?.Id === 0 &&\r\n !equipmentChanged\r\n ) {\r\n if (action.payload.start_date !== undefined) {\r\n yield put(reservationActions.setStartDate(action.payload.start_date));\r\n }\r\n if (action.payload.end_date !== undefined) {\r\n yield put(reservationActions.setEndDate(action.payload.end_date));\r\n }\r\n return;\r\n }\r\n const settings: AppSettings = yield select(selectAppSettings);\r\n if (settings.Modules.includes(KnownModules.EquipmentAssemblies)) {\r\n }\r\n\r\n /**\r\n * service_id from the payload might be:\r\n * * number if reservation is placed on the service slot (timeline/unit view)\r\n * * or an array of numbers (where from?)\r\n * */\r\n\r\n const payloadServiceIds = isArray(action.payload.service_id)\r\n ? action.payload.service_id\r\n : [action.payload.service_id];\r\n\r\n var requestedServicesAssemblyIds = uniq(\r\n requestedServices.map(\r\n (f: Pick) =>\r\n f.TopAssemblyId ?? f.Id,\r\n ),\r\n );\r\n\r\n const useRequestedServices = requestedServices.length > 0;\r\n\r\n if (useRequestedServices) {\r\n if (\r\n requestedServices.some(\r\n (service: IServiceFilterDto) => service.AssemblyId !== null,\r\n ) &&\r\n settings.Modules.includes(KnownModules.EquipmentAssemblies)\r\n ) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'Scheduler_AssemblyPartSelected_InfoMessage',\r\n variant: 'info',\r\n message: i18next.t(\r\n translations.Scheduler_AssemblyPartSelected_InfoMessage,\r\n ),\r\n }),\r\n );\r\n }\r\n }\r\n\r\n // push all selected services if event was not created on dedicated service strip, e.g. on weekly calendar with no separate headers for each service\r\n const serviceIds = useRequestedServices\r\n ? requestedServicesAssemblyIds\r\n : payloadServiceIds;\r\n\r\n /**\r\n * Reservation side panel expects the service ids to be a csv e.g. \"1,2,3\"\r\n */\r\n const reservationSidePanelServiceId = String(serviceIds.join(','));\r\n const queryParams: ReservationQueryStringParameters = {\r\n selectedIds: reservationSidePanelServiceId,\r\n\r\n un: authenticatedUser?.Id,\r\n ug: authenticatedUser?.ActiveUserGroup?.Id,\r\n // reservation details does not understand the ISO time, the value must be without the \"z\"\r\n Start: dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.start_date),\r\n ),\r\n // reservation details does not understand the ISO time, the value must be without the \"z\"\r\n End: dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.end_date),\r\n ),\r\n defaultMulti:\r\n defaultMultiModeBehavior === undefined\r\n ? undefined\r\n : defaultMultiModeBehavior.toString(),\r\n sampleRunId: action.payload.sample_run_id?.toString(),\r\n };\r\n const alertQueryParams: WorkOrderQueryStringParameters = {\r\n eqid: reservationSidePanelServiceId,\r\n down: 'true',\r\n offH: 'true',\r\n // reservation details does not understand the ISO time, the value must be without the \"z\"\r\n eStart: dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.start_date),\r\n ),\r\n // reservation details does not understand the ISO time, the value must be without the \"z\"\r\n offStart: dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.start_date),\r\n ),\r\n // reservation details does not understand the ISO time, the value must be without the \"z\"\r\n offEnd: dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(action.payload.end_date),\r\n ),\r\n defaultMulti:\r\n defaultMultiModeBehavior === undefined\r\n ? undefined\r\n : defaultMultiModeBehavior.toString(),\r\n aType:\r\n action.payload.alert_type === undefined\r\n ? undefined\r\n : action.payload.alert_type.toString(),\r\n };\r\n // workaround to skip side panel close confirmation\r\n // otherwise a reset is called after confirmation causing the reservation/event to disappear from the scheduler\r\n yield put(layoutActions.setNotSavedChanges(false));\r\n if (\r\n isAdmin &&\r\n EmptySlotAdminClick[emptySlotAdminClick.toString()] ===\r\n EmptySlotAdminClick.DownTimeOnly\r\n ) {\r\n let params = {\r\n useSidePanel: true,\r\n useSwithButtons: true,\r\n queryParams: alertQueryParams,\r\n } as WorkOrderDetailsProps;\r\n yield put(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.WorkOrderDetails,\r\n props: params,\r\n }),\r\n );\r\n } else {\r\n let params = {\r\n useSidePanel: true,\r\n useSwitchButtons: isAdmin,\r\n queryParams,\r\n } as ReservationDetailsProps;\r\n yield put(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.ReservationDetails,\r\n props: params,\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doReset(action: PayloadAction) {\r\n yield put(actions.create());\r\n}\r\nfunction* doUpdateMultipleMode(action: PayloadAction) {\r\n const authenticatedUser: AuthenticatedUser = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n const selectedSavedView: ISavedViewDto | undefined = yield select(\r\n selectSelectedSavedView,\r\n );\r\n if (selectedSavedView === undefined) {\r\n yield put(\r\n appSettingsActions.updateUserProfileSettings({\r\n key: 'BookMultipleInstruments',\r\n model: {\r\n UserName: authenticatedUser?.Id,\r\n Key: 'BookMultipleInstruments',\r\n IsMultiple: action.payload === undefined ? null : action.payload,\r\n } as UserProfileSettings,\r\n }),\r\n );\r\n } else {\r\n yield put(\r\n savedViewActions.patch({\r\n Id: selectedSavedView.Id,\r\n Multiple: action.payload,\r\n }),\r\n );\r\n }\r\n yield put(actions.updateMultiMode_Success(action.payload));\r\n}\r\n\r\nfunction* doUpdateEmptySlotClick(action: PayloadAction) {\r\n const authenticatedUser: AuthenticatedUser = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n yield put(\r\n appSettingsActions.updateUserProfileSettings({\r\n key: 'EmptySlotAdminClick',\r\n model: {\r\n UserName: authenticatedUser?.Id,\r\n Key: 'EmptySlotAdminClick',\r\n Value: action.payload.toString(),\r\n } as UserProfileSettings,\r\n }),\r\n );\r\n yield put(actions.updateEmptySlotSettings_success(action.payload));\r\n}\r\nfunction* doGetEmptySlotAdminClick() {\r\n const sett: UserProfile = yield select(selectUserProfileSettings);\r\n const gsettings: GlobalSettings = yield select(selectglobalSettings);\r\n const defaultEmptySlotSetting = gsettings.GetNullableByKey(\r\n AllowedSettings.CalendarTimelineEmptySlotClickSettings,\r\n );\r\n const defaultEmptySlotClick =\r\n defaultEmptySlotSetting === null\r\n ? EmptySlotAdminClick.ReservationsOnly\r\n : EmptySlotAdminClick[defaultEmptySlotSetting] ===\r\n EmptySlotAdminClick.WhatToAdd\r\n ? EmptySlotAdminClick.ReservationsOnly\r\n : EmptySlotAdminClick[defaultEmptySlotSetting];\r\n const userEmptySlotAdminClick = sett.GetSettingValueBy(\r\n (f: { Key: string }) =>\r\n f.Key.toLowerCase() === 'EmptySlotAdminClick'.toLowerCase(),\r\n )?.Value;\r\n const userSetting =\r\n userEmptySlotAdminClick === undefined || userEmptySlotAdminClick === null\r\n ? defaultEmptySlotClick\r\n : isNaN(parseInt(userEmptySlotAdminClick))\r\n ? EmptySlotAdminClick[userEmptySlotAdminClick]\r\n : EmptySlotAdminClick[parseInt(userEmptySlotAdminClick)];\r\n yield put(actions.updateEmptySlotSettings_success(userSetting));\r\n}\r\n\r\n/**\r\n * Splits scheduler filters into 2 groups - one to be applied to the services the other one - to the events\r\n * @param filters scheduler filters\r\n * @returns\r\n */\r\nfunction splitFilter(filters?: ISerializableFilterSettings) {\r\n const result: {\r\n events: Array;\r\n service: Array;\r\n training: Array;\r\n } = {\r\n service: [],\r\n events: [],\r\n training: [],\r\n };\r\n if (filters === undefined) {\r\n return result;\r\n }\r\n const getPredicate = (filters: ISerializableFilterSettings, key: string) =>\r\n withisInversed(\r\n String(filters[key].predicate),\r\n filters[key].predicate['isInversed'],\r\n );\r\n return Object.keys(filters).reduce((acc, key) => {\r\n switch (key) {\r\n case 'BudgetManager':\r\n case 'BookedById':\r\n case 'BudgetId':\r\n acc.events.push(getPredicate(filters, key));\r\n acc.events.push(getPredicate(filters, key));\r\n break;\r\n\r\n case 'service':\r\n case 'campus':\r\n case 'AssetRoomId':\r\n case 'AssetBuildingId':\r\n case 'AssetGroupId':\r\n case 'AssetCatId':\r\n case 'AvailabilityTypeId':\r\n acc.service.push(getPredicate(filters, key));\r\n break;\r\n case 'TrainingStateId':\r\n acc.training.push(getPredicate(filters, key));\r\n break;\r\n case 'WithReservationsOnly':\r\n // noop - WithReservationsOnly is not applied to any API and only affects the services displayed based on the fetched services and reservations\r\n break;\r\n default:\r\n log.warn(`splitFilter: missing case for ${key}`, filters[key]);\r\n break;\r\n }\r\n return acc;\r\n }, result);\r\n}\r\nfunction* doSetFilters(action: SetFilterAction) {\r\n try {\r\n const serviceGroups: Array> | undefined = yield select(\r\n selectGlobalServiceGroupFilter,\r\n );\r\n // handle the global service groups filter\r\n const predicates: Array> = [];\r\n if (serviceGroups !== undefined && serviceGroups.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n serviceGroups,\r\n ),\r\n );\r\n }\r\n // apply the rest of the \"filters\" applicable to the services here\r\n if (action.payload !== undefined) {\r\n // The Service filter can't be applied directly as it filters by the EquipmentId column instead of the Id\r\n const serviceRelatedFilters = splitFilter(\r\n omit(action.payload, 'service'),\r\n );\r\n predicates.push(...serviceRelatedFilters.service);\r\n\r\n // service selected in the main filter need some special treatment\r\n if (action.payload.service !== undefined) {\r\n const filteredServices = action.payload?.service?.value?.map(f => f.Id);\r\n if (filteredServices?.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n filteredServices,\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n\r\n var serviceFilterValue = action.payload?.['service']?.value;\r\n const servicesLoaded =\r\n Array.isArray(serviceFilterValue) &&\r\n needMoreServiceProps({ services: serviceFilterValue }) === true;\r\n\r\n if (!servicesLoaded) {\r\n // max number of services allowed to be shown on the timeline\r\n const maxTimelineServices = yield select(state =>\r\n selectGlobalSetting(state, AllowedSettings.MaximumTimelineRowsLimit),\r\n );\r\n // max number of services allowed to be shown on the calendar\r\n const maxCalendarServices = yield select(state =>\r\n selectGlobalSetting(\r\n state,\r\n AllowedSettings.CalendarServicesPickerCapacity,\r\n ),\r\n );\r\n // take max + 1 in order to determine that the maximum limit has been reached for calendar/timeline\r\n const maxServices =\r\n Math.max(\r\n tryParseInt(maxTimelineServices) ?? 50,\r\n tryParseInt(maxCalendarServices) ?? 10,\r\n ) + 1;\r\n\r\n const x: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n '/api/odata/v4/ServiceFilter/ReservableEquipments',\r\n {\r\n $filter: undefinedIfIsEmpty(predicates.join(' and ')),\r\n $orderby: 'Name',\r\n $top: maxServices + 1,\r\n },\r\n );\r\n\r\n yield put(actions.getServices_Success(x.value));\r\n } else {\r\n yield put(actions.getServices_Success(serviceFilterValue));\r\n }\r\n\r\n yield put(actions.getEvents());\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n}\r\nfunction* doResetWorkOrder(\r\n action: PayloadAction,\r\n) {\r\n // todo: use the payload/state to reset the start/end time of the offline/alert that was edited by drag/resize instead of refetching all events\r\n yield put(actions.create());\r\n yield put(actions.getEvents());\r\n}\r\nexport function* schedulerSaga() {\r\n yield debounce(100, actions.getEvents.type, doGetEvents);\r\n yield takeLatest(actions.changeViewMode.type, doChangeViewMode);\r\n yield takeLatest(actions.changeViewModePartial.type, doChangeViewModePartial);\r\n yield takeLatest(actions.setDate.type, doGetEvents);\r\n yield takeLatest(actions.edit.type, doEdit);\r\n\r\n yield takeLatest(actions.create.type, doCreate);\r\n // refresh after reservation has been created\r\n yield takeEvery(\r\n reservationActions.createReservation_Success.type,\r\n doGetEvents,\r\n );\r\n // refresh after reservation has been updated\r\n yield takeEvery(\r\n reservationActions.updateReservation_Success.type,\r\n doGetEvents,\r\n );\r\n\r\n // process change in the service groups global filter - refresh events shown\r\n yield takeLatest(\r\n appSettingsActions.saveGlobalServiceGroupFilter.type,\r\n doGetEvents,\r\n );\r\n // removes temporary \"new event\" from the scheduler on workorder creation\r\n yield takeEvery(workOrderActions.createWorkOrder_Success.type, doReset);\r\n // refresh after alert was created\r\n yield takeEvery(workOrderActions.createWorkOrder_Success.type, doGetEvents);\r\n // refresh after alert was updated\r\n yield takeEvery(workOrderActions.updateWorkOrder_Success.type, doGetEvents);\r\n\r\n yield takeLatest(reservationActions.resetDetailsState, doReset);\r\n yield takeLatest(\r\n workOrderActions.resetUpdateWorkOrderState.type,\r\n doResetWorkOrder,\r\n );\r\n yield takeLatest(\r\n workOrderActions.resetCreateWorkOrderState.type,\r\n doResetWorkOrder,\r\n );\r\n\r\n yield takeLatest(actions.getDerivedServices.type, doGetDerivedServices);\r\n yield takeLatest(actions.getServices.type, doGetServices);\r\n yield takeLatest(actions.setFilters.type, doSetFilters);\r\n\r\n yield takeLatest(actions.updateMultiMode.type, doUpdateMultipleMode);\r\n\r\n yield takeLatest(\r\n actions.updateEmptySlotSettings.type,\r\n doUpdateEmptySlotClick,\r\n );\r\n yield takeLatest(\r\n actions.getEmptySlotAdminClick.type,\r\n doGetEmptySlotAdminClick,\r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { IWorkingHoursDto } from 'api/odata/generated/entities/IWorkingHoursDto';\r\nimport { IEquipmentTimeSlot } from 'api/odata/generated/complexTypes/IEquipmentTimeSlot';\r\nimport { TimelineGroupByUnion } from 'api/odata/generated/enums/TimelineGroupBy';\r\nimport { EmptySlotAdminClick } from 'enums/EmptySlotAdminClick';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { applyStateSearchParams, schedulerSaga } from './saga';\r\n\r\nimport {\r\n SchedulerState,\r\n IViewState,\r\n INewEvent,\r\n ChangeServicesAction,\r\n ChangeViewModeAction,\r\n ISchedulerService,\r\n GetServicesAction,\r\n SetFilterAction,\r\n IEditEvent,\r\n} from './types';\r\n\r\nexport const initialState: SchedulerState = {\r\n events: {},\r\n offlineHours: {},\r\n trainingSessions: {},\r\n emptySlotAdminClick: EmptySlotAdminClick.ReservationsOnly,\r\n selectedReservationEvents: [],\r\n TimelineGroupBy: 'NoTimelineGrouped',\r\n exportToPDF: false,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'scheduler',\r\n initialState,\r\n reducers: {\r\n init(state, action: PayloadAction) {\r\n const result = { ...initialState, ...{ viewState: action.payload } };\r\n return result;\r\n },\r\n changeViewModePartial(state, action: PayloadAction>) {\r\n state.viewState = Object.assign({}, state.viewState, action.payload);\r\n state.viewState.search = applyStateSearchParams(state.viewState);\r\n },\r\n changeViewMode(state, action: ChangeViewModeAction) {\r\n state.notUseLocation = action.payload.withNoChangeLocation;\r\n state.viewState = Object.assign({}, state.viewState, {\r\n preset: action.payload.current.preset,\r\n viewType: action.payload.current.viewType,\r\n viewLength: action.payload.current.viewLength,\r\n date: action.payload.current.date,\r\n search: applyStateSearchParams(action.payload.current),\r\n customDays: action.payload.current.customDays,\r\n customStart: action.payload.current.customStart,\r\n });\r\n },\r\n setPreviousViewState(state, action: PayloadAction) {\r\n state.previousViewState = action.payload;\r\n },\r\n changeGroupBy(state, action: PayloadAction) {},\r\n setDate(state, action: PayloadAction) {\r\n if (state.viewState !== undefined) {\r\n state.viewState.date = action.payload;\r\n }\r\n },\r\n\r\n getServices(state, action: GetServicesAction) {\r\n state.selectedServices = undefined;\r\n },\r\n getServices_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.selectedServices = action.payload;\r\n },\r\n\r\n getDerivedServices(state, action: ChangeServicesAction) {},\r\n getDerivedServices_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.derivedServices = action.payload;\r\n },\r\n\r\n getEvents(state, action: PayloadAction) {\r\n state.loadingEvents = true;\r\n },\r\n getEvents_Success(\r\n state,\r\n action: PayloadAction<{\r\n reservations: Array;\r\n trainingSessions: Array;\r\n offlineHours: Array;\r\n }>,\r\n ) {\r\n if (state?.viewState?.date !== undefined) {\r\n state.events[state.viewState.date] = action.payload.reservations;\r\n state.trainingSessions[state.viewState.date] =\r\n action.payload.trainingSessions;\r\n state.offlineHours[state.viewState.date] = action.payload.offlineHours;\r\n }\r\n state.loadingEvents = false;\r\n },\r\n getEvents_Error(state, action: PayloadAction) {},\r\n\r\n getOfflineHours_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n if (state?.viewState?.date !== undefined) {\r\n state.offlineHours[state.viewState.date] = action.payload;\r\n }\r\n },\r\n getNonWorkingHours_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.nonWorkingHours = action.payload;\r\n },\r\n getTrainingSessions_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n if (state?.viewState?.date !== undefined) {\r\n state.trainingSessions[state.viewState.date] = action.payload;\r\n }\r\n },\r\n\r\n setFilters(state, action: SetFilterAction) {\r\n // reset the events\r\n state.events = {};\r\n state.offlineHours = {};\r\n state.trainingSessions = {};\r\n state.loadingEvents = true;\r\n state.filters = action.payload;\r\n },\r\n\r\n edit(state, action: PayloadAction) {\r\n switch (action.payload.type) {\r\n case 'offline':\r\n // store the updated start/end of the offline event in the state\r\n // this might prevent event jumping back after it's been dragged for the first time after the scheduler has been loaded\r\n const entity = Object.values(state.offlineHours)\r\n ?.flat()\r\n ?.find(f => f.AlertId === action.payload.alert_id);\r\n if (entity !== undefined) {\r\n entity.StartTime = action.payload.start_date;\r\n entity.EndTime = action.payload.end_date;\r\n }\r\n }\r\n },\r\n create(state, action: PayloadAction) {\r\n state.tempReservations = action.payload;\r\n },\r\n updateMultiMode(state, action: PayloadAction) {},\r\n updateMultiMode_Success(state, action: PayloadAction) {\r\n state.multipleInstrumentsMode = action.payload;\r\n },\r\n updateEmptySlotSettings(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n updateEmptySlotSettings_success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.emptySlotAdminClick = action.payload;\r\n },\r\n getEmptySlotAdminClick(state, action: PayloadAction) {},\r\n setNotUseLocation(state, action: PayloadAction) {\r\n state.notUseLocation = action.payload;\r\n },\r\n setSelectedReservationEvents(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.selectedReservationEvents = action.payload;\r\n },\r\n exportToPDF(state, action: PayloadAction) {\r\n state.exportToPDF = true;\r\n },\r\n resetExportToPDF(state, action: PayloadAction) {\r\n state.exportToPDF = false;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: schedulerActions } = slice;\r\n\r\nexport const useSchedulerSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: schedulerSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useSchedulerSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n selectUserProfileSettings,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { BudgetFields } from 'enums/BudgetFields';\r\nimport { UserReservationsRestricted } from 'enums/enums';\r\nimport { MultipleInstrumentReservations } from 'enums/MultipleInstrumentReservations';\r\nimport { intersection } from 'lodash';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { IsBudgetFieldEnabled, IsModuleEnabled } from 'types/AppSettings';\r\nimport { isInRole } from 'types/AuthenticatedUser';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { AllowedSettings } from 'utils/globalSettings/AllowedSettings';\r\nexport interface GlobalSettingsType {\r\n loadCompleted: boolean;\r\n reservationRestricted: boolean;\r\n reservationUserGroupGroupByBudgetUserGroup: boolean;\r\n userGroupReservationRestricted: boolean;\r\n onlyOwnUserGroupsAllowed: boolean;\r\n userDefaultBudgetEnabled: boolean;\r\n defaultBudgetEnabled: boolean;\r\n hideNonDefaultBudgets: boolean;\r\n isBudgetsWithoutUserGroup: boolean;\r\n budgetModuleEnabled: boolean;\r\n priceSheetPricing: boolean;\r\n budgetLimitedByUsers: boolean;\r\n budgetExperimentModuleEnabled: boolean;\r\n fundingTypeBudgetEnabled: boolean;\r\n purchaseOrderBudgetEnabled: boolean;\r\n purchaseOrderLengthSetting: number | undefined;\r\n allowPartialProjectCharges: boolean;\r\n allowPartialSingleProjectCharges: boolean;\r\n trainingSessionEnabled: boolean;\r\n assistedReservationsEnabled: boolean;\r\n resCustomFormEnabled: boolean;\r\n resMultipleFormsEnabled: boolean;\r\n multipleInstrumentsEnabled: boolean;\r\n reservationTerminationEnabled: boolean;\r\n crossInstrumentTrainingEnabled: boolean;\r\n userAndGroupPermissionsEnabled: boolean;\r\n tutoringModulesEnabled: boolean;\r\n offlineServiceWithReservation: boolean;\r\n userIsMainAdmin: boolean;\r\n instituteProjectsEnabled: boolean;\r\n showReferenceFieldInReservationDetails: boolean;\r\n accServicesEnabled: boolean;\r\n showCalcPriceOnOfflineService: boolean;\r\n allowUsersToViewTheirCharges: boolean;\r\n allowOngoingReservationModificationEnabled: boolean;\r\n showCalculatePrice: boolean;\r\n allowAddRemoveOnEditReservation: boolean;\r\n allowToRemoveFromMultipleReservation: boolean;\r\n draftReservationsEnabled: boolean;\r\n hideReservationCollaborators: boolean;\r\n MandatoryOfflineServicesOnTrainingSignUps: boolean;\r\n DoNotAllowReservationUserChangeByStaff: boolean;\r\n AssemblyPartsEnabled: boolean;\r\n confidentialBudgetsEnabled: boolean;\r\n AllowWorkflowBooking: boolean;\r\n ModifyReservationNameForUsers: boolean;\r\n}\r\n\r\nfunction useGlobalSettingsHook(): GlobalSettingsType {\r\n const adminRoles = React.useMemo(\r\n () => [\r\n Roles.Administrators,\r\n Roles.EquipmentAdministrator,\r\n Roles.GroupAdministrators,\r\n Roles.LabTech,\r\n Roles.InstituteCoord,\r\n ],\r\n [],\r\n );\r\n const privateBudgetsRoles = React.useMemo(\r\n () => [Roles.Administrators, Roles.HeadOfLab],\r\n [],\r\n );\r\n const User = useSelector(selectAuthenticatedUser);\r\n const userRoles: number[] | undefined = User?.Roles;\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const [reservationRestricted, setReservationRestricted] = React.useState<\r\n boolean\r\n >(false);\r\n const [budgetModuleEnabled, setBudgetModuleEnabled] = React.useState(\r\n false,\r\n );\r\n const [priceSheetPricing, setPriceSheetPricing] = React.useState(\r\n false,\r\n );\r\n const [\r\n purchaseOrderLengthSetting,\r\n setPurchaseOrderLengthSetting,\r\n ] = React.useState();\r\n const [userIsMainAdmin, setUserIsMainAdmin] = React.useState(false);\r\n const userSettings = useSelector(selectUserProfileSettings);\r\n const [\r\n allowOngoingReservationModificationEnabled,\r\n setAllowOngoingReservationModificationEnabled,\r\n ] = React.useState(false);\r\n const [\r\n doNotAllowReservationUserChangeByStaff,\r\n setDoNotAllowReservationUserChangeByStaff,\r\n ] = React.useState(false);\r\n const [\r\n instituteProjectsEnabled,\r\n setInstituteProjectsEnabled,\r\n ] = React.useState(false);\r\n const [\r\n reservationTerminationEnabled,\r\n setReservationTerminationEnabled,\r\n ] = React.useState(false);\r\n const [\r\n draftReservationsEnabled,\r\n setDraftReservationsEnabled,\r\n ] = React.useState(false);\r\n const [\r\n MandatoryOfflineServicesOnTrainingSignUps,\r\n setMandatoryOfflineServicesOnTrainingSignUps,\r\n ] = React.useState(false);\r\n const [\r\n crossInstrumentTrainingEnabled,\r\n setCrossInstrumentTrainingEnabled,\r\n ] = React.useState(false);\r\n const [\r\n userAndGroupPermissionsEnabled,\r\n setUserAndGroupPermissionsEnabled,\r\n ] = React.useState(false);\r\n const [tutoringModulesEnabled, setTutoringModulesEnabled] = React.useState<\r\n boolean\r\n >(false);\r\n const [accServicesEnabled, setAccServicesEnabled] = React.useState(\r\n false,\r\n );\r\n const [\r\n allowUsersToViewTheirCharges,\r\n setAllowUsersToViewTheirCharges,\r\n ] = React.useState(false);\r\n\r\n const [\r\n showReferenceFieldInReservationDetails,\r\n setShowReferenceFieldInReservationDetails,\r\n ] = React.useState(false);\r\n\r\n const [\r\n offlineServiceWithReservation,\r\n setOfflineServiceWithReservation,\r\n ] = React.useState(false);\r\n const [\r\n multipleInstrumentsEnabled,\r\n setMultipleInstrumentsEnabled,\r\n ] = React.useState(false);\r\n const [trainingSessionEnabled, setTrainingSessionEnabled] = React.useState<\r\n boolean\r\n >(false);\r\n const [reservationFormEnabled, setReservationFormEnabled] = React.useState<\r\n boolean\r\n >(false);\r\n const [resMultipleFormsEnabled, setResMultipleFormsEnabled] = React.useState<\r\n boolean\r\n >(false);\r\n const [\r\n assistedReservationsEnabled,\r\n setAssistedReservationsEnabled,\r\n ] = React.useState(false);\r\n const [\r\n showCalcPriceOnOfflineService,\r\n setShowCalcPriceOnOfflineService,\r\n ] = React.useState(false);\r\n const [showCalculatePrice, setShowCalculatePrice] = React.useState(\r\n false,\r\n );\r\n const [\r\n allowPartialProjectCharges,\r\n setAllowPartialProjectCharges,\r\n ] = React.useState(false);\r\n const [\r\n allowPartialSingleProjectCharges,\r\n setAllowPartialSingleProjectCharges,\r\n ] = React.useState(false);\r\n\r\n const [\r\n budgetExperimentModuleEnabled,\r\n setBudgetExperimentModuleEnabled,\r\n ] = React.useState(false);\r\n const [\r\n fundingTypeBudgetEnabled,\r\n setFundingTypeBudgetEnabled,\r\n ] = React.useState(false);\r\n const [\r\n purchaseOrderBudgetEnabled,\r\n setPurchaseOrderBudgetEnabled,\r\n ] = React.useState(false);\r\n const [\r\n isBudgetsWithoutUserGroup,\r\n setIsBudgetsWithoutUserGroup,\r\n ] = React.useState(false);\r\n\r\n const [budgetLimitedByUsers, setIsBudgetLimitedByUsers] = React.useState<\r\n boolean\r\n >(false);\r\n const [hideNonDefaultBudgets, setHideNonDefaultBudgets] = React.useState<\r\n boolean\r\n >(false);\r\n const [assemblyPartsEnabled, setAssemblyPartsEnabled] = React.useState<\r\n boolean\r\n >(false);\r\n const [\r\n userDefaultBudgetEnabled,\r\n setUserDefaultBudgetEnabled,\r\n ] = React.useState(false);\r\n const [defaultBudgetEnabled, setDefaultBudgetEnabled] = React.useState<\r\n boolean\r\n >(false);\r\n const [\r\n userGroupReservationRestricted,\r\n setUserGroupReservationRestricted,\r\n ] = React.useState(false);\r\n const [\r\n reservationUserGroupGroupByBudgetUserGroup,\r\n setReservationUserGroupGroupByBudgetUserGroup,\r\n ] = React.useState(false);\r\n const [\r\n onlyOwnUserGroupsAllowed,\r\n setOnlyOwnUserGroupsAllowed,\r\n ] = React.useState(false);\r\n const [\r\n allowAddRemoveOnEditReservation,\r\n setAllowAddRemoveOnEditReservation,\r\n ] = React.useState(false);\r\n const [\r\n allowToRemoveFromMultipleReservation,\r\n setAllowToRemoveFromMultipleReservation,\r\n ] = React.useState(false);\r\n const [\r\n hideReservationCollaborators,\r\n setHideReservationCollaborators,\r\n ] = React.useState(false);\r\n const [\r\n isConfidentialBudgetsEnabled,\r\n setIsConfidentialBudgetsEnabled,\r\n ] = React.useState(false);\r\n const [\r\n allowWorkflowBookingEnabled,\r\n setAllowWorkflowBookingEnabled,\r\n ] = React.useState(false);\r\n const [\r\n modifyReservationNameForUsers,\r\n setModifyReservationNameForUsers,\r\n ] = React.useState(false);\r\n const [loadCompleted, setLoadCompleted] = React.useState(false);\r\n React.useEffect(() => {\r\n setIsBudgetsWithoutUserGroup(() => {\r\n return !IsBudgetFieldEnabled(appSettings, BudgetFields.UserGroup);\r\n });\r\n setIsConfidentialBudgetsEnabled(() => {\r\n return IsBudgetFieldEnabled(appSettings, BudgetFields.Confidential);\r\n });\r\n setUserIsMainAdmin(() => {\r\n return isInRole(User, Roles.Administrators);\r\n });\r\n setAllowAddRemoveOnEditReservation(() => {\r\n return IsModuleEnabled(\r\n appSettings,\r\n KnownModules.MultipleInstruments_AddRemoveOnEditReservation,\r\n );\r\n });\r\n setAllowToRemoveFromMultipleReservation(() => {\r\n return (\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.AllowToRemoveFromMultipleReservation],\r\n ) === true\r\n );\r\n });\r\n setTrainingSessionEnabled(() => {\r\n return (\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.HideTrainingSessionsSettings],\r\n ) === false\r\n );\r\n });\r\n setAllowWorkflowBookingEnabled(() => {\r\n return (\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.AllowWorkflowBooking],\r\n ) === true\r\n );\r\n });\r\n setModifyReservationNameForUsers(() => {\r\n return (\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.ModifyReservationNameForUsers],\r\n ) === true\r\n );\r\n });\r\n setInstituteProjectsEnabled(() => {\r\n return IsModuleEnabled(appSettings, KnownModules.InstituteProjects);\r\n });\r\n setMultipleInstrumentsEnabled(() => {\r\n const multipleInstrumentsSetting:\r\n | string\r\n | null = settings.GetNullableByKey(\r\n AllowedSettings.MultipleInstrumentReservations,\r\n );\r\n return (\r\n multipleInstrumentsSetting !== null &&\r\n MultipleInstrumentReservations[multipleInstrumentsSetting] !==\r\n MultipleInstrumentReservations.NotAllowed\r\n );\r\n });\r\n setReservationTerminationEnabled(() => {\r\n return settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.TerminateReservation],\r\n );\r\n });\r\n setAccServicesEnabled(() => {\r\n return IsModuleEnabled(appSettings, KnownModules.AccServices);\r\n });\r\n setAllowOngoingReservationModificationEnabled(() => {\r\n return IsModuleEnabled(\r\n appSettings,\r\n KnownModules.AllowOngoingReservationModification,\r\n );\r\n });\r\n setDoNotAllowReservationUserChangeByStaff(() => {\r\n return settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.DoNotAllowReservationUserChangeByStaff],\r\n );\r\n });\r\n setShowReferenceFieldInReservationDetails(() => {\r\n return !settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.HideReferenceFieldInReservationDetails],\r\n );\r\n });\r\n setAllowUsersToViewTheirCharges(() => {\r\n return settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.AllowUsersToViewCharges],\r\n );\r\n });\r\n setAssistedReservationsEnabled(() => {\r\n return !settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.HideAssistedReservationsSettings],\r\n );\r\n });\r\n setIsBudgetLimitedByUsers(() => {\r\n return settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.BudgetLimited_ByUsers],\r\n );\r\n });\r\n setBudgetModuleEnabled(() => {\r\n return IsModuleEnabled(appSettings, KnownModules.Budgets);\r\n });\r\n setPriceSheetPricing(() => {\r\n return IsModuleEnabled(appSettings, KnownModules.PriceSheetPricing);\r\n });\r\n setPurchaseOrderLengthSetting(() => {\r\n const stringValue = settings.TryGet(\r\n AllowedSettings[AllowedSettings.PurchaseOrderLengthSetting],\r\n );\r\n if (stringValue === null) {\r\n return undefined;\r\n }\r\n const intValue = parseInt(stringValue);\r\n if (isNaN(intValue)) {\r\n return undefined;\r\n }\r\n return intValue;\r\n });\r\n\r\n setDraftReservationsEnabled(() => {\r\n return settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.DraftReservationsEnabled],\r\n );\r\n });\r\n setMandatoryOfflineServicesOnTrainingSignUps(() => {\r\n return settings.GetBoolean(\r\n AllowedSettings[\r\n AllowedSettings.MandatoryOfflineServicesOnTrainingSignUps\r\n ],\r\n );\r\n });\r\n setOfflineServiceWithReservation(() => {\r\n return IsModuleEnabled(\r\n appSettings,\r\n KnownModules.OfflineServiceWithReservation,\r\n );\r\n });\r\n setReservationRestricted(() => {\r\n const resRestrictedSetting: string | null = settings.GetNullableByKey(\r\n AllowedSettings.UserReservationsRestricted,\r\n );\r\n return (\r\n resRestrictedSetting !== null &&\r\n UserReservationsRestricted[resRestrictedSetting] ===\r\n UserReservationsRestricted.UserOwnRestricted\r\n );\r\n });\r\n setUserGroupReservationRestricted(() => {\r\n const resUserGroupRestrictedSetting:\r\n | string\r\n | null = settings.GetNullableByKey(\r\n AllowedSettings.UserReservationsRestricted,\r\n );\r\n return (\r\n resUserGroupRestrictedSetting !== null &&\r\n UserReservationsRestricted[resUserGroupRestrictedSetting] ===\r\n UserReservationsRestricted.UserGroupRestricted\r\n );\r\n });\r\n setUserAndGroupPermissionsEnabled(() => {\r\n return (\r\n IsModuleEnabled(appSettings, KnownModules.UserPermission) ||\r\n IsModuleEnabled(appSettings, KnownModules.GroupPermissions)\r\n );\r\n });\r\n\r\n setReservationUserGroupGroupByBudgetUserGroup(() =>\r\n settings.GetBoolean(\r\n AllowedSettings[\r\n AllowedSettings.ReservationUserGroupGroupByBudgetUserGroup\r\n ],\r\n ),\r\n );\r\n setCrossInstrumentTrainingEnabled(() =>\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.CrossInstrumentTraining],\r\n ),\r\n );\r\n\r\n setOnlyOwnUserGroupsAllowed(() => {\r\n return !(intersection(userRoles, adminRoles).length > 0);\r\n // return (\r\n // !(intersection(userRoles, adminRoles).length > 0) ||\r\n // userGroupReservationRestricted\r\n // );\r\n });\r\n setUserDefaultBudgetEnabled(() =>\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.ShowDefaultBudgetOnUserProfile],\r\n ),\r\n );\r\n setShowCalcPriceOnOfflineService(\r\n () =>\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.HideCalcPriceOnOfflineService],\r\n ) !== true,\r\n );\r\n setShowCalculatePrice(\r\n () =>\r\n IsModuleEnabled(appSettings, KnownModules.Billing) ||\r\n (IsModuleEnabled(appSettings, KnownModules.Invoices) &&\r\n IsModuleEnabled(appSettings, KnownModules.PriceSheetPricing)),\r\n );\r\n setDefaultBudgetEnabled(() => {\r\n return IsBudgetFieldEnabled(appSettings, BudgetFields.Default);\r\n });\r\n setFundingTypeBudgetEnabled(() => {\r\n return IsBudgetFieldEnabled(appSettings, BudgetFields.FundingType);\r\n });\r\n setPurchaseOrderBudgetEnabled(() => {\r\n return IsBudgetFieldEnabled(\r\n appSettings,\r\n BudgetFields.PurchaseOrderOption,\r\n );\r\n });\r\n\r\n setTutoringModulesEnabled(() => {\r\n return (\r\n IsModuleEnabled(appSettings, KnownModules.Tutoring) ||\r\n IsModuleEnabled(appSettings, KnownModules.TutoringHours)\r\n );\r\n });\r\n setAssemblyPartsEnabled(() => {\r\n return IsModuleEnabled(appSettings, KnownModules.EquipmentAssemblies);\r\n });\r\n setHideNonDefaultBudgets(() => {\r\n return (\r\n IsModuleEnabled(appSettings, KnownModules.HideNonDefaultBudgets) &&\r\n !(\r\n intersection(userRoles, privateBudgetsRoles).length > 0 ||\r\n (isInRole(User, Roles.GroupAdministrators) &&\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.SGACreateProjects],\r\n ))\r\n )\r\n );\r\n });\r\n setBudgetExperimentModuleEnabled(() => {\r\n return IsModuleEnabled(appSettings, KnownModules.BudgetExperiments);\r\n });\r\n\r\n setAllowPartialProjectCharges(() => {\r\n return (\r\n IsModuleEnabled(appSettings, KnownModules.Invoices) &&\r\n IsModuleEnabled(appSettings, KnownModules.DisableBillingEvents) &&\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.AllowPartialMultipleProjectCharges],\r\n ) &&\r\n budgetModuleEnabled\r\n );\r\n });\r\n setAllowPartialSingleProjectCharges(() => {\r\n return (\r\n IsModuleEnabled(appSettings, KnownModules.Invoices) &&\r\n IsModuleEnabled(appSettings, KnownModules.DisableBillingEvents) &&\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.AllowPartialSingleProjectCharges],\r\n ) &&\r\n budgetModuleEnabled\r\n );\r\n });\r\n setReservationFormEnabled(() => {\r\n return IsModuleEnabled(appSettings, KnownModules.ReservationsCustomForm);\r\n });\r\n setResMultipleFormsEnabled(() => {\r\n return (\r\n reservationFormEnabled &&\r\n IsModuleEnabled(appSettings, KnownModules.MultipleCustomForms)\r\n );\r\n });\r\n setHideReservationCollaborators(\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.HideReservationCollaborators],\r\n ),\r\n );\r\n console.debug('Global Settings Called');\r\n setLoadCompleted(() => true);\r\n }, [\r\n User,\r\n adminRoles,\r\n appSettings,\r\n budgetModuleEnabled,\r\n privateBudgetsRoles,\r\n reservationFormEnabled,\r\n reservationRestricted,\r\n settings,\r\n userGroupReservationRestricted,\r\n userRoles,\r\n userSettings,\r\n ]);\r\n\r\n const r: GlobalSettingsType = {\r\n loadCompleted,\r\n reservationRestricted,\r\n reservationUserGroupGroupByBudgetUserGroup,\r\n userGroupReservationRestricted,\r\n onlyOwnUserGroupsAllowed,\r\n userDefaultBudgetEnabled,\r\n defaultBudgetEnabled,\r\n hideNonDefaultBudgets,\r\n isBudgetsWithoutUserGroup,\r\n budgetModuleEnabled,\r\n priceSheetPricing,\r\n purchaseOrderLengthSetting,\r\n budgetLimitedByUsers,\r\n budgetExperimentModuleEnabled: budgetExperimentModuleEnabled,\r\n fundingTypeBudgetEnabled,\r\n purchaseOrderBudgetEnabled,\r\n allowPartialProjectCharges,\r\n allowPartialSingleProjectCharges,\r\n trainingSessionEnabled,\r\n assistedReservationsEnabled,\r\n resCustomFormEnabled: reservationFormEnabled,\r\n resMultipleFormsEnabled,\r\n multipleInstrumentsEnabled,\r\n reservationTerminationEnabled,\r\n crossInstrumentTrainingEnabled,\r\n userAndGroupPermissionsEnabled: userAndGroupPermissionsEnabled,\r\n tutoringModulesEnabled,\r\n offlineServiceWithReservation,\r\n userIsMainAdmin,\r\n instituteProjectsEnabled,\r\n showReferenceFieldInReservationDetails,\r\n accServicesEnabled,\r\n showCalcPriceOnOfflineService,\r\n allowUsersToViewTheirCharges,\r\n allowOngoingReservationModificationEnabled,\r\n showCalculatePrice,\r\n allowAddRemoveOnEditReservation,\r\n allowToRemoveFromMultipleReservation,\r\n draftReservationsEnabled,\r\n hideReservationCollaborators,\r\n MandatoryOfflineServicesOnTrainingSignUps,\r\n DoNotAllowReservationUserChangeByStaff: doNotAllowReservationUserChangeByStaff,\r\n AssemblyPartsEnabled: assemblyPartsEnabled,\r\n confidentialBudgetsEnabled: isConfidentialBudgetsEnabled,\r\n AllowWorkflowBooking: allowWorkflowBookingEnabled,\r\n ModifyReservationNameForUsers: modifyReservationNameForUsers,\r\n };\r\n return r;\r\n}\r\n\r\nexport default useGlobalSettingsHook;\r\n","import { IsEmptyArray } from 'app/components/BasicTable/BasicFilter/AppliedFilterComponent';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport {\r\n findIsfilterInversed,\r\n URLSearchParamsCI,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { toURLSearchParams } from 'app/components/BasicTable/withSavedHistory';\r\nimport { initFilterData } from 'app/components/BasicTable/initFilterData';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { savedViewActions } from 'app/pages/SavedViewsPage/SavedViewPage/slice';\r\nimport { SavedViewSelected } from 'app/pages/SavedViewsPage/SavedViewPage/slice/types';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { routerActions } from 'connected-react-router';\r\nimport { useEffect, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\nimport { SAVEDVIEW_SEARCH_KEY } from '../BasicFilter/SavedListsDropDown';\r\nimport { getDependencyFilters } from '../BasicFilter';\r\nimport { BasicTableProps, IRow } from './UnconfigurableTable';\r\nimport React from 'react';\r\n\r\nfunction visibleFiltersFilter(item: IFilterSettings) {\r\n return (\r\n (item.value !== undefined && !IsEmptyArray(item.value)) || item.notNullable\r\n );\r\n}\r\n\r\nexport function filterHandler(\r\n Component: React.ComponentType>,\r\n GetFiltersDefinition: GetPageFilters,\r\n other?: {\r\n getDefaultFilter?: (user: IAuthenticatedUser) => URLSearchParams;\r\n reservedQueryStringParameterNames?: string[];\r\n isSidePanel?: boolean;\r\n setFilters?: (appliedFilters: IFilterSettings[] | undefined) => void;\r\n getRequiredFilter?: (\r\n search: string,\r\n appSettings?: AppSettings | null,\r\n ) => string | undefined;\r\n getSelectedViewFilter?: (\r\n search: string,\r\n view: SavedViewSelected,\r\n ) => string | undefined;\r\n enableSavedLists?: boolean;\r\n },\r\n): React.FC

> {\r\n return ({\r\n onFilterChange,\r\n availableFilters,\r\n savedListSettings,\r\n ...props\r\n }: BasicTableProps) => {\r\n const dispatch = useDispatch();\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const showFiltersFn = React.useCallback(visibleFiltersFilter, []);\r\n const {\r\n isSidePanel,\r\n getDefaultFilter,\r\n setFilters,\r\n reservedQueryStringParameterNames,\r\n getRequiredFilter,\r\n // getSelectedViewFilter,\r\n enableSavedLists,\r\n } = useMemo(() => other ?? {}, []);\r\n if (authenticatedUser === undefined) {\r\n return <>not authenticated;\r\n }\r\n\r\n useEffectOnMount(() => {\r\n const cancelToken = { mounted: true };\r\n const preset = getPresetFilter(\r\n isSidePanel\r\n ? undefined\r\n : withoutReserved(location.search, reservedQueryStringParameterNames),\r\n authenticatedUser,\r\n );\r\n const defaultSearch =\r\n getDefaultFilter !== undefined && getDefaultFilter !== null\r\n ? getDefaultFilter(authenticatedUser)?.toString()\r\n : undefined;\r\n let search =\r\n isSidePanel || isEmptyOrWhitespace(preset)\r\n ? defaultSearch ?? ''\r\n : location.search;\r\n const requiredSearch =\r\n getRequiredFilter !== null && getRequiredFilter !== undefined\r\n ? getRequiredFilter(search, appSettings)\r\n : undefined;\r\n search = requiredSearch === undefined ? search : requiredSearch ?? '';\r\n\r\n const savedViewId = tryParseInt(\r\n new URLSearchParamsCI(search).get(SAVEDVIEW_SEARCH_KEY),\r\n );\r\n dispatch(savedViewActions.selectSavedView(savedViewId));\r\n // const savedViewSearch = !!getSelectedViewFilter ? getSelectedViewFilter()\r\n\r\n const localizedFilters = getLocalizedFilters(search);\r\n // let fooFilters = foo?.filter(\r\n // item => item.value !== undefined && !IsEmptyArray(item.value),\r\n // );\r\n // let depFilters = getDependencyFilters(fooFilters);\r\n let visibleFilters = localizedFilters\r\n ?.map(f => {\r\n return {\r\n ...f,\r\n isInversed: findIsfilterInversed(\r\n search,\r\n f.urlKey ??\r\n (typeof f.queryStringSerializer === 'string'\r\n ? f.queryStringSerializer\r\n : undefined),\r\n ),\r\n };\r\n })\r\n .filter(showFiltersFn);\r\n let depFilters = getDependencyFilters(visibleFilters);\r\n\r\n setAppliedFilters(depFilters);\r\n setAppliedFilters(initFilterData(depFilters), cancelToken);\r\n if (!isSidePanel) {\r\n if (\r\n isEmptyOrWhitespace(\r\n withoutReserved(location.search, reservedQueryStringParameterNames),\r\n )\r\n ) {\r\n if (defaultSearch !== undefined) {\r\n const withReserved = addReserved(\r\n new URLSearchParams(defaultSearch),\r\n location.search,\r\n reservedQueryStringParameterNames,\r\n ).toString();\r\n dispatch(\r\n routerActions.replace({\r\n pathname: location.pathname,\r\n search: withReserved,\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n return () => {\r\n cancelToken.mounted = false;\r\n };\r\n });\r\n\r\n const location = useLocation();\r\n const removeEmptyFilters = (\r\n filter: string | undefined,\r\n ): string | undefined => {\r\n if (filter === undefined || filter === null) {\r\n return undefined;\r\n } else {\r\n const params = new URLSearchParams(filter);\r\n let newParams = new URLSearchParams();\r\n for (const [name, value] of params) {\r\n if (value !== undefined && value !== null && value !== '') {\r\n newParams.append(name, value);\r\n }\r\n }\r\n return newParams.toString();\r\n }\r\n };\r\n\r\n function getPresetFilter(\r\n savedFilter: string | undefined | null,\r\n user: IAuthenticatedUser,\r\n ): string | undefined {\r\n const saved =\r\n savedFilter !== undefined &&\r\n savedFilter !== null &&\r\n !isEmptyOrWhitespace(savedFilter)\r\n ? removeEmptyFilters(savedFilter)\r\n : undefined;\r\n const result = saved === undefined || saved === '' ? undefined : saved;\r\n\r\n return result;\r\n }\r\n\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const getLocalizedFilters = useMemo(() => {\r\n const result = GetFiltersDefinition(\r\n t,\r\n appSettings,\r\n authenticatedUser,\r\n settings,\r\n );\r\n return result;\r\n }, [appSettings, authenticatedUser, settings, t]);\r\n const [appliedFilters, setAppliedFilters] = useAsyncExtendedState<\r\n IFilterSettings[] | undefined\r\n >(undefined);\r\n\r\n const allfilters = useMemo(() => {\r\n var result = !appliedFilters\r\n ? getLocalizedFilters('')\r\n : getLocalizedFilters(\r\n toURLSearchParams(appliedFilters).toString(),\r\n );\r\n return result;\r\n }, [getLocalizedFilters, appliedFilters]);\r\n\r\n useEffect(() => {\r\n setFilters?.(appliedFilters);\r\n }, [appliedFilters, setFilters]);\r\n\r\n const handleFilterChange: (\r\n items: IFilterSettings[],\r\n ) => void = items => {\r\n const currentSearch = toURLSearchParams(appliedFilters ?? []);\r\n if (!isSidePanel && reservedQueryStringParameterNames) {\r\n const p = new URLSearchParams(location.search);\r\n [...p.keys()].forEach(key => {\r\n if (reservedQueryStringParameterNames.includes(key)) {\r\n const val = p.get(key);\r\n if (val !== null) {\r\n currentSearch.set(key, val);\r\n }\r\n }\r\n });\r\n }\r\n const filterSearch = toURLSearchParams(items);\r\n for (const key of filterSearch.keys()) {\r\n const filterValue = filterSearch.get(key);\r\n if (filterValue !== null) {\r\n currentSearch.set(key, filterValue);\r\n }\r\n }\r\n const originalSearch = new URLSearchParamsCI(location.search);\r\n\r\n // clear saved view selection when instrument selection changes\r\n if (enableSavedLists && savedListSettings !== undefined) {\r\n if (savedListSettings?.savedListSerializedKey !== undefined) {\r\n const currentInstrumentSelection = currentSearch.get(\r\n savedListSettings?.savedListSerializedKey,\r\n );\r\n const originalInstrumentSelection = originalSearch.get(\r\n savedListSettings?.savedListSerializedKey,\r\n );\r\n if (currentInstrumentSelection !== originalInstrumentSelection) {\r\n // remove the selection from the search\r\n currentSearch.delete(SAVEDVIEW_SEARCH_KEY);\r\n // clear redux state\r\n dispatch(savedViewActions.selectMyList());\r\n }\r\n }\r\n }\r\n\r\n setAppliedFilters(getDependencyFilters([...items]));\r\n // push current filter state to the URL search if it's not equivalent\r\n if (!originalSearch.equals(currentSearch) && !isSidePanel) {\r\n dispatch(\r\n routerActions.replace({\r\n pathname: location.pathname,\r\n search: currentSearch.toString(),\r\n }),\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {appliedFilters !== undefined && (\r\n )}\r\n />\r\n )}\r\n \r\n );\r\n };\r\n}\r\n\r\nconst withoutReserved = (\r\n search: string,\r\n reserved: string[] | undefined,\r\n): string => {\r\n if (reserved === undefined || reserved.length === 0) return search;\r\n const originalSearch = new URLSearchParamsCI(search);\r\n reserved.forEach(f => originalSearch.delete(f));\r\n return originalSearch.toString();\r\n};\r\n\r\nconst addReserved = (\r\n current: URLSearchParams,\r\n search: string,\r\n reserved: string[] | undefined,\r\n) => {\r\n if (reserved === undefined || reserved.length === 0) return current;\r\n const p = new URLSearchParams(search);\r\n [...p.keys()].forEach(key => {\r\n if (reserved.includes(key)) {\r\n const val = p.get(key);\r\n if (val !== null) {\r\n current.set(key, val);\r\n }\r\n }\r\n });\r\n return current;\r\n};\r\n\r\n// function getIgnoredSearch(search: string, ignore: string[]) {\r\n// var p = new URLSearchParams(search);\r\n// [...p.keys()].forEach(key => {\r\n// if (!ignore.includes(key)) {\r\n// p.delete(key);\r\n// }\r\n// });\r\n\r\n// return p;\r\n// }\r\n","import { ISavedViewDto } from 'api/odata/generated/entities/ISavedViewDto';\r\nimport { AsyncDataState, Entity } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\n\r\n/* --- STATE --- */\r\nexport interface SavedViewState {\r\n createState: AsyncDataState;\r\n updateState: AsyncDataState;\r\n processing: boolean;\r\n selectedSavedView?: ISavedViewDto;\r\n savedViewUserName?: string;\r\n}\r\nexport interface SavedViewSelected {\r\n listId: number | undefined;\r\n ids: string | undefined;\r\n assetIds: string | undefined;\r\n multiple: boolean;\r\n}\r\nexport interface SavedViewResponse extends IResponseType {\r\n Id?: number;\r\n}\r\nexport interface SavedViewDetailsState {\r\n Id: number;\r\n Name: string;\r\n Assets: Entity[];\r\n Shared?: boolean;\r\n Multiple?: boolean;\r\n // SharedTo: Entity | null;\r\n // SharedUsers: Entity[];\r\n // SharedCores: Entity[];\r\n}\r\nexport function ConvertEntityToModel(\r\n entity: ISavedViewDto,\r\n): SavedViewDetailsState | undefined {\r\n if (!entity) {\r\n return undefined;\r\n } else {\r\n return {\r\n Id: entity.Id,\r\n Name: entity.Name,\r\n Assets: entity.Assets,\r\n Shared: entity.Shared,\r\n Multiple: entity.Multiple,\r\n // SharedTo: getSingleSharedTo(entity.SharedTo),\r\n // SharedUsers: entity.SharedUsers,\r\n // SharedCores: entity.SharedCores,\r\n } as SavedViewDetailsState;\r\n }\r\n}\r\nexport function ConvertModelToEntity(\r\n model: SavedViewDetailsState,\r\n original: SavedViewDetailsState | undefined,\r\n): ISavedViewDto {\r\n let entity = {\r\n Id: original?.Id === undefined ? model.Id : original.Id,\r\n Name: model.Name,\r\n Shared: model.Shared,\r\n Multiple: model.Multiple,\r\n Assets: model.Assets,\r\n // SharedTo: model.SharedTo?.Id ?? 0,\r\n // SharedUsers: model.SharedUsers as IUserFilterDto[],\r\n // SharedCores: model.SharedCores as IServiceGroupDto[],\r\n } as ISavedViewDto;\r\n return entity;\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, takeLatest, select } from 'redux-saga/effects';\r\nimport { savedViewActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { translations } from 'locales/translations';\r\nimport i18next from 'i18next';\r\nimport {\r\n ConvertModelToEntity,\r\n SavedViewDetailsState,\r\n SavedViewResponse,\r\n} from './types';\r\nimport { savedViewsApi as api, savedViewsApi } from 'api/savedViewsApi';\r\nimport { ISavedViewDto } from 'api/odata/generated/entities/ISavedViewDto';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { SavedViewDetailsProps } from '../Details';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { AxiosError } from 'axios';\r\nimport { Entity } from 'types/common';\r\nimport { initAssetsData } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\n\r\nconst loadNew = async (eid?: string): Promise => {\r\n if (!!eid && eid !== '') {\r\n return initAssetsData(eid, true).then(data => {\r\n return {\r\n Id: -1,\r\n Name: '',\r\n Assets: data,\r\n Shared: false,\r\n Multiple: false,\r\n // SharedTo: null,\r\n // SharedUsers: [] as Entity[],\r\n // SharedCores: [] as Entity[],\r\n } as SavedViewDetailsState;\r\n });\r\n } else {\r\n return new Promise(resolve => {\r\n resolve({\r\n Id: -1,\r\n Name: '',\r\n Assets: [] as Entity[],\r\n Shared: false,\r\n Multiple: false,\r\n // SharedTo: null,\r\n // SharedUsers: [] as Entity[],\r\n // SharedCores: [] as Entity[],\r\n } as SavedViewDetailsState);\r\n });\r\n }\r\n};\r\n\r\nfunction* doInitNewDetails(action: PayloadAction) {\r\n try {\r\n const data = yield call(loadNew, action.payload);\r\n yield put(actions.initNewDetails_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initNewDetails_Error(Error));\r\n }\r\n}\r\nfunction* doInitDetails(action: PayloadAction) {\r\n try {\r\n const data = yield call(api.initUpdateData, action.payload);\r\n console.log(data);\r\n yield put(actions.initDetails_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initDetails_Error(Error));\r\n }\r\n}\r\nfunction* doCreate(action: PayloadAction) {\r\n const httpPayload: ISavedViewDto = ConvertModelToEntity(\r\n action.payload,\r\n undefined,\r\n );\r\n try {\r\n let responses: SavedViewResponse[] = [];\r\n const result = yield call(api.createSavedView, httpPayload);\r\n responses.push(result);\r\n\r\n let responseErrors = responses\r\n .filter(err => err.ErrorMessages.length > 0)\r\n .flatMap(f => f.ErrorMessages);\r\n\r\n let responseWarnings = responses\r\n .filter(err => err.WarningMessages.length > 0)\r\n .flatMap(f => f.WarningMessages);\r\n let responseSuccess = responses\r\n .filter(err => err.SuccessMessages.length > 0)\r\n .flatMap(f => f.SuccessMessages);\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors.map(item => {\r\n return {\r\n key: 'savedViewInsert',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: 'savedViewInsert',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (responseSuccess.length > 0) {\r\n let res = responses[0];\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'savedViewInsert',\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: res.Id,\r\n created: true,\r\n itemName: i18next.t(translations.MyInstrumentList),\r\n detailsType: RenderPageType.SavedViewDetails,\r\n detailsTypeProps: {\r\n id: '' + res.Id,\r\n useSidePanel: true,\r\n } as SavedViewDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors =\r\n responses.filter(f => f.ErrorMessages.length > 0).length > 0;\r\n yield put(\r\n actions.createView_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'savedViewInsert',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createView_Error(Error));\r\n }\r\n}\r\nfunction* doUpdate(\r\n action: PayloadAction<{\r\n current: SavedViewDetailsState;\r\n original: SavedViewDetailsState | undefined;\r\n }>,\r\n) {\r\n const httpPayload: ISavedViewDto = ConvertModelToEntity(\r\n action.payload.current,\r\n action.payload.original,\r\n );\r\n // const currentSelected = yield select(selectMyListSelected);\r\n // const userProfileSettings = yield select(selectUserProfileSettings);\r\n // let listViewSelected = currentSelected;\r\n // if (!listViewSelected) {\r\n // let proffSettings = userProfileSettings.GetSettingValueBy(\r\n // f => f.Key.toLowerCase() === 'myListSelected'.toLowerCase(),\r\n // );\r\n // listViewSelected = !!proffSettings\r\n // ? {\r\n // listId:\r\n // proffSettings.Name === null\r\n // ? undefined\r\n // : parseInt(proffSettings.Name),\r\n // ids: proffSettings.Value ?? undefined,\r\n // assetIds: proffSettings.DefaultGroups ?? undefined,\r\n // }\r\n // : undefined;\r\n // }\r\n try {\r\n const results = yield call(api.updateSavedView, httpPayload);\r\n let response = results as SavedViewResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: 'savedViewUpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'savedViewUpdateWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'savedViewUpdate',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: false,\r\n itemName: i18next.t(translations.MyInstrumentList),\r\n detailsType: RenderPageType.SavedViewDetails,\r\n detailsTypeProps: {\r\n id: '' + response.Id,\r\n useSidePanel: true,\r\n } as SavedViewDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n // if (!!listViewSelected && !!listViewSelected.listId) {\r\n // if (listViewSelected.listId === action.payload.original?.Id) {\r\n // yield call(doSelectView, {\r\n // payload: httpPayload,\r\n // type: actions.selectMyList.type,\r\n // });\r\n // }\r\n // }\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.updateView_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'savedViewUpdateErr',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateView_Error(Error));\r\n }\r\n}\r\nfunction* doUpdateViewAssets(\r\n action: PayloadAction<{ assets: Entity[]; view: ISavedViewDto }>,\r\n) {\r\n const newAssets: Entity[] = [];\r\n // const currentSelected = yield select(selectMyListSelected);\r\n // const userProfileSettings = yield select(selectUserProfileSettings);\r\n // let listViewSelected = currentSelected;\r\n // if (!listViewSelected) {\r\n // let proffSettings = userProfileSettings.GetSettingValueBy(\r\n // f => f.Key.toLowerCase() === 'myListSelected'.toLowerCase(),\r\n // );\r\n // listViewSelected = !!proffSettings\r\n // ? {\r\n // listId:\r\n // proffSettings.Name === null\r\n // ? undefined\r\n // : parseInt(proffSettings.Name),\r\n // ids: proffSettings.Value ?? undefined,\r\n // assetIds: proffSettings.DefaultGroups ?? undefined,\r\n // }\r\n // : undefined;\r\n // }\r\n action.payload.assets.forEach(el => {\r\n let a = action.payload.view.Assets.find(a => a.Id === el.Id);\r\n if (a === undefined) {\r\n newAssets.push(el);\r\n }\r\n });\r\n let groupId = (newAssets[0] as IAssetDto).ServiceGroupId;\r\n const shared =\r\n action.payload.view.Shared === true\r\n ? !newAssets.some(f => (f as IAssetDto).ServiceGroupId !== groupId)\r\n : false;\r\n const httpPayload: ISavedViewDto = Object.assign({}, action.payload.view, {\r\n Assets: newAssets.concat(action.payload.view.Assets),\r\n Shared: shared,\r\n });\r\n\r\n try {\r\n const results = yield call(api.updateSavedView, httpPayload);\r\n let response = results as SavedViewResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: 'savedViewUpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'savedViewUpdateWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'savedViewUpdate',\r\n message: response.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n // if (!!listViewSelected && !!listViewSelected.listId) {\r\n // if (listViewSelected.listId === action.payload.view.Id) {\r\n // yield call(doSelectView, {\r\n // payload: httpPayload,\r\n // type: actions.selectMyList.type,\r\n // });\r\n // }\r\n // }\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.updateViewAssets_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'savedViewUpdateErr',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateViewAssets_Error(Error));\r\n }\r\n}\r\nfunction* doSelectSavedView(action: PayloadAction) {\r\n try {\r\n if (action.payload === undefined) {\r\n yield put(actions.selectSavedView_Success());\r\n return;\r\n }\r\n\r\n const x: ISavedViewDto = yield call(\r\n savedViewsApi.initUpdateData,\r\n action.payload,\r\n );\r\n // check if the saved view belongs to current service groups selection\r\n const serviceGroups: Array> | undefined = yield select(\r\n selectGlobalServiceGroupFilter,\r\n );\r\n const serviceGroupIds = serviceGroups?.map(f => f.Id);\r\n const belongsToServiceGroupsSelection =\r\n serviceGroups === undefined ||\r\n serviceGroups?.length === 0 ||\r\n x.Assets.every(\r\n asset => serviceGroupIds?.includes(asset.ServiceGroupId ?? 0) === true,\r\n );\r\n if (belongsToServiceGroupsSelection) {\r\n yield put(actions.selectSavedView_Success(x));\r\n } else {\r\n yield put(actions.selectSavedView_Success());\r\n }\r\n } catch (error) {\r\n yield put(actions.selectSavedView_Success());\r\n }\r\n}\r\nfunction* doPatch(action: PayloadAction>) {\r\n try {\r\n yield call(savedViewsApi.patch, action.payload);\r\n yield put(actions.patch_success(action.payload));\r\n } catch (error) {\r\n //noop\r\n console.log(error);\r\n }\r\n}\r\n\r\nexport function* savedViewSaga() {\r\n yield takeLatest(actions.initNewDetails.type, doInitNewDetails);\r\n yield takeLatest(actions.initDetails.type, doInitDetails);\r\n yield takeLatest(actions.createView.type, doCreate);\r\n yield takeLatest(actions.updateView.type, doUpdate);\r\n yield takeLatest(actions.updateViewAssets.type, doUpdateViewAssets);\r\n yield takeLatest(actions.selectSavedView.type, doSelectSavedView);\r\n yield takeLatest(actions.patch.type, doPatch);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { ISavedViewDto } from 'api/odata/generated/entities/ISavedViewDto';\r\nimport { Entity } from 'types/common';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { savedViewSaga } from './saga';\r\nimport {\r\n ConvertEntityToModel,\r\n SavedViewDetailsState,\r\n SavedViewState,\r\n} from './types';\r\n\r\nexport const initialState: SavedViewState = {\r\n processing: false,\r\n createState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n updateState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'savedView',\r\n initialState,\r\n reducers: {\r\n initNewDetails(state, action: PayloadAction) {\r\n state.processing = true;\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initNewDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.createState.data = action.payload;\r\n },\r\n initNewDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.createState.data = {\r\n Id: -1,\r\n Name: '',\r\n Assets: [] as Entity[],\r\n Shared: false,\r\n Multiple: false,\r\n // SharedTo: null,\r\n // SharedUsers: [] as Entity[],\r\n // SharedCores: [] as Entity[],\r\n } as SavedViewDetailsState;\r\n },\r\n initDetails(state, action: PayloadAction) {\r\n state.processing = true;\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initDetails_Success(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.updateState.data = ConvertEntityToModel(action.payload);\r\n state.savedViewUserName = action.payload?.UserName;\r\n },\r\n initDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n createView(state, action: PayloadAction) {\r\n state.createState.processing = true;\r\n state.createState.completed = undefined;\r\n state.createState.hasErrors = undefined;\r\n },\r\n createView_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.createState.processing = false;\r\n state.createState.hasErrors = action.payload.hasErrors;\r\n state.createState.completed = true;\r\n },\r\n createView_Error(state, action: PayloadAction) {\r\n state.createState.processing = false;\r\n state.createState.completed = true;\r\n state.createState.hasErrors = true;\r\n },\r\n updateView(\r\n state,\r\n action: PayloadAction<{\r\n current: SavedViewDetailsState;\r\n original: SavedViewDetailsState | undefined;\r\n }>,\r\n ) {\r\n state.updateState.processing = true;\r\n state.updateState.completed = undefined;\r\n state.updateState.hasErrors = undefined;\r\n },\r\n updateView_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.updateState.processing = false;\r\n state.updateState.hasErrors = action.payload.hasErrors;\r\n state.updateState.completed = true;\r\n },\r\n updateView_Error(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n state.updateState.hasErrors = true;\r\n },\r\n updateViewAssets(\r\n state,\r\n action: PayloadAction<{ assets: Entity[]; view: ISavedViewDto }>,\r\n ) {\r\n state.updateState.processing = true;\r\n state.updateState.completed = undefined;\r\n state.updateState.hasErrors = undefined;\r\n },\r\n updateViewAssets_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.updateState.processing = false;\r\n state.updateState.hasErrors = action.payload.hasErrors;\r\n state.updateState.completed = true;\r\n },\r\n updateViewAssets_Error(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n state.updateState.hasErrors = true;\r\n },\r\n resetCreateSavedViewState(state, action: PayloadAction) {\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n resetUpdateSavedViewState(state, action: PayloadAction) {\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n selectMyList(state, action: PayloadAction) {},\r\n\r\n selectSavedView(state, action: PayloadAction) {\r\n state.selectedSavedView = undefined;\r\n },\r\n selectSavedView_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.selectedSavedView = action.payload;\r\n },\r\n selectSavedView_Error(state, action: PayloadAction) {\r\n state.selectedSavedView = undefined;\r\n },\r\n patch(state, action: PayloadAction>) {},\r\n patch_success(state, action: PayloadAction>) {\r\n state.selectedSavedView = Object.assign(\r\n state.selectedSavedView,\r\n action.payload,\r\n );\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: savedViewActions } = slice;\r\n\r\nexport const useSavedViewSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: savedViewSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useSavedViewSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","/**\r\n *\r\n * FormUserPicker\r\n *\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { UserPicker, UserUrl } from '../pickers/AutocompletePickers/UserPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\n\r\nexport const FormUserPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & {\r\n selectArray?: Array;\r\n urlType?: UserUrl;\r\n} & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n disabled={props.disabled}\r\n predicates={props.predicates}\r\n selectArray={props.selectArray}\r\n urlType={props.urlType}\r\n />\r\n \r\n );\r\n};\r\n","import { Collapse } from '@material-ui/core';\r\nimport { Alert } from '@material-ui/lab';\r\nimport * as React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { Caption } from '../Typography';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport clsx from 'clsx';\r\n\r\nexport type AlertVariant = 'success' | 'info' | 'warning' | 'error';\r\nexport type AlertContentType = {\r\n message?: string;\r\n type: AlertVariant;\r\n closable: boolean;\r\n children?: React.ReactNode;\r\n variant?: 'outlined' | 'filled' | 'standard';\r\n};\r\n\r\nexport interface BasicAlertProps {\r\n content: AlertContentType;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n className?: string;\r\n showMore?: boolean;\r\n style?: React.CSSProperties;\r\n collapsedMinHeight?: number;\r\n onClose?: (event: React.SyntheticEvent) => void;\r\n}\r\n\r\nconst MessageText = styled.div`\r\n ${(props: { showMore: boolean; minHeight: number }) => {\r\n return css`\r\n display: -webkit-box;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: normal;\r\n word-wrap: normal;\r\n -webkit-box-orient: horizontal;\r\n max-height: ${props.showMore ? '100%' : props.minHeight + 'px'};\r\n `;\r\n }}\r\n`;\r\nconst defaultIconMapping = {\r\n success: ,\r\n warning: (\r\n \r\n ),\r\n error: (\r\n \r\n ),\r\n info: (\r\n \r\n ),\r\n};\r\nexport function BasicAlert(props: BasicAlertProps) {\r\n const {\r\n content,\r\n variant,\r\n className,\r\n showMore,\r\n collapsedMinHeight,\r\n style,\r\n onClose,\r\n } = props;\r\n const [isShowMore, setIsShowMore] = React.useState(false);\r\n const toggleReadMore = () => setIsShowMore(show => !show);\r\n const [open, setOpen] = React.useState(true);\r\n return (\r\n \r\n \r\n {content.closable && (\r\n {\r\n setOpen(false);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n {showMore && (\r\n {\r\n toggleReadMore();\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n }\r\n >\r\n {showMore ? (\r\n \r\n {!!content.message && {content.message}}\r\n {!!content.children && (\r\n {content.children}\r\n )}\r\n \r\n ) : (\r\n \r\n {!!content.message && {content.message}}\r\n {!!content.children && (\r\n {content.children}\r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.savedView || initialState;\r\n\r\nexport const selectSavedView = createSelector([selectSlice], state => state);\r\n\r\nexport const selectSavedViewProcessing = createSelector(\r\n [selectSavedView],\r\n state => state.processing,\r\n);\r\nexport const selectCreateSavedViewProcessing = createSelector(\r\n [selectSavedView],\r\n state => state.createState.processing,\r\n);\r\nexport const selectUpdateSavedViewProcessing = createSelector(\r\n [selectSavedView],\r\n state => state.updateState.processing,\r\n);\r\nexport const selectCreateSavedView = createSelector(\r\n [selectSavedView],\r\n state => state.createState.data,\r\n);\r\nexport const selectUpdateSavedView = createSelector(\r\n [selectSavedView],\r\n state => state.updateState.data,\r\n);\r\nexport const selectUpdateUserName = createSelector(\r\n [selectSavedView],\r\n state => state.savedViewUserName,\r\n);\r\nexport const selectCreateSavedViewCompleted = createSelector(\r\n [selectSavedView],\r\n state => state.createState.completed,\r\n);\r\nexport const selectUpdateSavedViewCompleted = createSelector(\r\n [selectSavedView],\r\n state => state.updateState.completed,\r\n);\r\nexport const selectCreateSavedViewHasError = createSelector(\r\n [selectSavedView],\r\n state => state.createState.hasErrors,\r\n);\r\nexport const selectUpdateSavedViewHasError = createSelector(\r\n [selectSavedView],\r\n state => state.updateState.hasErrors,\r\n);\r\nexport const selectSelectedSavedView = createSelector(\r\n [selectSavedView],\r\n state => state.selectedSavedView,\r\n);\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects';\r\nimport { workOrderActions as actions } from '.';\r\nimport { WorkOrderApi as api } from 'api/WorkOrderApi';\r\nimport { FileStoreApi } from 'api/fileStoreApi';\r\nimport {\r\n ConvertModelToEntity,\r\n ConvertNewWorkOrdersToModel,\r\n DowntimeOverlaps,\r\n ReservationsOfflineData,\r\n SendEmailOnOffline,\r\n WorkOrderDetailsState,\r\n WorkOrderGlobalState,\r\n WorkOrderQueryStringParameters,\r\n WorkOrderResponse,\r\n} from './types';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport { AxiosError } from 'axios';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { WorkOrderDetailsProps } from '..';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { selectSavedLinkedOrders, selectUpdateAllRecurrent } from './selectors';\r\nimport { FileTypes } from 'api/odata/generated/enums/FileTypes';\r\nimport { CustomFormTypeEnum } from 'enums/CustomFormType';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { getFilesModel, UpdateFilesModel } from 'utils/fileStoreHelper';\r\nimport { IsEntity } from 'app/components/BasicTable/BasicFilter/AppliedFilterComponent';\r\nimport { UserProfileSettings } from 'types/UserProfileSettings';\r\nimport { routerActions } from 'connected-react-router';\r\n\r\nfunction* doInitCreate(action: PayloadAction) {\r\n try {\r\n const data = yield call(api.initCreateData, action.payload);\r\n yield put(actions.initWorkOrder_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initWorkOrder_Error(error));\r\n }\r\n}\r\nfunction* doInitUpdate(action: PayloadAction) {\r\n try {\r\n const data: IWorkOrderDetailsDto = yield call(\r\n api.initUpdateData,\r\n action.payload,\r\n );\r\n if (!data || data === null) {\r\n yield put(routerActions.push({ pathname: '/notallowed', search: '' }));\r\n } else {\r\n // set the offline event start to value provided through the params\r\n // for example, if an alert is edited from the scheduler, params will have an alert id and new start/end dates\r\n // these dates should override current alert offline event start/end\r\n // the values have to pass through formatQueryStringDate since alert details does not accept ISO properly and will shift the dates otherwise\r\n if (action.payload.offStart !== undefined) {\r\n data.OfflineEventStart = action.payload.offStart;\r\n }\r\n if (action.payload.offEnd !== undefined) {\r\n data.OfflineEventEnd = action.payload.offEnd;\r\n }\r\n\r\n yield put(actions.initUpdateWorkOrder_Success(data));\r\n }\r\n } catch (error: unknown) {\r\n yield put(actions.initUpdateWorkOrder_Error(Error));\r\n }\r\n}\r\nfunction* doCreate(action: PayloadAction) {\r\n const user: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n const httpPayloads: IWorkOrderDetailsDto[] = ConvertNewWorkOrdersToModel(\r\n action.payload,\r\n user,\r\n );\r\n const submissionFormFiles =\r\n action.payload.workOrderDetails.SubmissionFormFiles;\r\n const savedLinkeCalibrations = yield select(selectSavedLinkedOrders);\r\n //console.log(httpPayloads);\r\n try {\r\n let responses: WorkOrderResponse[] = [];\r\n for (let idx = 0; idx < httpPayloads.length; idx++) {\r\n const result = yield call(api.insertWorkOrder, httpPayloads[idx]);\r\n responses.push(result);\r\n }\r\n let fileResponses: IResponseType[] = [];\r\n if (submissionFormFiles.length > 0) {\r\n let resp = responses.filter(f => f.Id !== undefined);\r\n for (let i = 0; i < resp.length; i++) {\r\n let data = getFilesModel(\r\n [],\r\n submissionFormFiles,\r\n FileTypes.AlertTypeFile,\r\n resp[i].Id || -1,\r\n CustomFormTypeEnum.AlertType,\r\n 1,\r\n null,\r\n null,\r\n resp[i].WorkOrderTypeId || null,\r\n );\r\n let fileRes = yield call(FileStoreApi.saveFormFiles, data);\r\n fileResponses.push(fileRes);\r\n }\r\n }\r\n\r\n let responseErrors = responses\r\n .filter(err => err.ErrorMessages.length > 0)\r\n .flatMap(f => f.ErrorMessages);\r\n\r\n if (fileResponses.length > 0) {\r\n fileResponses.forEach(f => {\r\n if (f.ErrorMessages.length > 0) {\r\n responseErrors = [...responseErrors, ...f.ErrorMessages];\r\n }\r\n });\r\n }\r\n let responseWarnings = responses\r\n .filter(err => err.WarningMessages.length > 0)\r\n .flatMap(f => f.WarningMessages);\r\n let responseSuccess = responses\r\n .filter(err => err.SuccessMessages.length > 0)\r\n .flatMap(f => f.SuccessMessages);\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors.map(item => {\r\n return {\r\n key: 'workOrderInsertError',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: 'workOrderInsertWarning',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n if (responseSuccess.length > 0) {\r\n yield put(layoutActions.setNotSavedChanges(false));\r\n yield put(actions.setSaveNewComments(true));\r\n yield put(\r\n actions.setOrderNumbers(\r\n responses.map(f => f.Id ?? 0).filter(f => f !== 0),\r\n ),\r\n );\r\n for (let i = 0; i < responseSuccess.length; i++) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'workOrderInsertSuccess_' + i,\r\n message: responseSuccess[i],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: responses[i].Id,\r\n created: true,\r\n itemName: i18next.t(translations.WorkOrdersPageName),\r\n detailsType: RenderPageType.WorkOrderDetails,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + responses[i].Id,\r\n } as WorkOrderQueryStringParameters,\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n if (savedLinkeCalibrations.length > 0) {\r\n for (let idx = 0; idx < savedLinkeCalibrations.length; idx++) {\r\n for (let widx = 0; widx < responses.length; widx++) {\r\n yield put(\r\n actions.addLinkedCalibration({\r\n id: responses[widx].Id ?? 0,\r\n link: savedLinkeCalibrations[idx].Id,\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n yield put(\r\n appSettingsActions.updateUserProfileSettings({\r\n key: 'LastUsedDowntimeType',\r\n model: {\r\n UserName: user?.Id,\r\n Key: 'LastUsedDowntimeType',\r\n Value: action.payload.workOrderDetails.WorkOrderType?.Id?.toString(),\r\n } as UserProfileSettings,\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n //REPLACED WITH THIS^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n //TO SHOW MULTIPLE NOTIFICATIONS FOR EACH CREATED WORK ORDER\r\n /* if (responseSuccess.length > 0) {\r\n let res = responses[0];\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'workOrderInsertSuccess',\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: res.Id,\r\n created: true,\r\n itemName: i18next.t(translations.WorkOrdersPageName),\r\n detailsType: RenderPageType.workOrderDetails,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + res.Id,\r\n } as WorkOrderQueryStringParameters,\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n } */\r\n let hasErrors =\r\n responses.filter(f => f.ErrorMessages.length > 0).length > 0;\r\n let hasResOffline =\r\n responses.filter(f => f.sendEmailOnOffline === true).length > 0;\r\n let offData = responses\r\n .map(m => {\r\n return isNullOrUndefined(\r\n m.ReservationOffline[0],\r\n )\r\n ? undefined\r\n : {\r\n AlertId: m.ReservationOffline[0]?.AlertId,\r\n offStart: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(m.ReservationOffline[0]?.offStart),\r\n ),\r\n offEnd: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(m.ReservationOffline[0]?.offEnd),\r\n ),\r\n ReasonName: m.ReservationOffline[0].ReasonName,\r\n Remarks: m.ReservationOffline[0].Remarks,\r\n reservationIds: m.ReservationOffline[0].reservationIds,\r\n };\r\n })\r\n .filter(f => f !== undefined) as ReservationsOfflineData[];\r\n yield put(\r\n actions.createWorkOrder_Success({\r\n hasErrors: hasErrors,\r\n sendEmailOnOffline: hasResOffline,\r\n reservationOffline: offData,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'workOrderInsert',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createWorkOrder_Error(Error));\r\n }\r\n}\r\nfunction* doUpdate(\r\n action: PayloadAction<{\r\n current: WorkOrderDetailsState;\r\n original: WorkOrderDetailsState | undefined;\r\n originalSubFormFiles: IFormFileValue[];\r\n originalStaffFormFiles: IFormFileValue[];\r\n }>,\r\n) {\r\n const httpPayloads: IWorkOrderDetailsDto = ConvertModelToEntity(\r\n action.payload.current,\r\n action.payload.original,\r\n );\r\n const submissionFormFiles = action.payload.current.SubmissionFormFiles;\r\n const staffFormFiles = action.payload.current.StaffFormFiles;\r\n const updateAll = yield select(selectUpdateAllRecurrent);\r\n httpPayloads.UpdateAll = updateAll;\r\n let filesData: UpdateFilesModel[] = [];\r\n if (\r\n submissionFormFiles.length > 0 ||\r\n action.payload.originalSubFormFiles.length > 0\r\n ) {\r\n filesData = getFilesModel(\r\n action.payload.originalSubFormFiles,\r\n submissionFormFiles,\r\n FileTypes.AlertTypeFile,\r\n action.payload.current.Id,\r\n CustomFormTypeEnum.AlertType,\r\n updateAll === true ? 3 : 1,\r\n action.payload.current.RecurringAssetId,\r\n action.payload.current.RecurringGroupId,\r\n action.payload.current.WorkOrderType?.Id || null,\r\n );\r\n }\r\n if (\r\n staffFormFiles.length > 0 ||\r\n action.payload.originalStaffFormFiles.length > 0\r\n ) {\r\n filesData = [\r\n ...filesData,\r\n ...getFilesModel(\r\n action.payload.originalStaffFormFiles,\r\n staffFormFiles,\r\n FileTypes.AlertFile,\r\n action.payload.current.Id,\r\n CustomFormTypeEnum.Alert,\r\n updateAll === true ? 3 : 1,\r\n action.payload.current.RecurringAssetId,\r\n action.payload.current.RecurringGroupId,\r\n null,\r\n ),\r\n ];\r\n }\r\n try {\r\n const results = yield call(api.updateWorkOrder, httpPayloads);\r\n let response = results as WorkOrderResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (filesData.length > 0) {\r\n let fileRes = yield call(FileStoreApi.updateFormFiles, filesData);\r\n let fileResponses = fileRes as IResponseType;\r\n if (fileResponses.ErrorMessages.length > 0) {\r\n respErrors = [...respErrors, ...fileResponses.ErrorMessages];\r\n }\r\n }\r\n\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: 'workOrderUpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'workOrderUpdateWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'workOrderUpdate',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: false,\r\n itemName: i18next.t(translations.WorkOrdersPageName),\r\n detailsType: RenderPageType.WorkOrderDetails,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + response.Id,\r\n } as WorkOrderQueryStringParameters,\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n yield put(layoutActions.setNotSavedChanges(false));\r\n if (response.AutoCreatedOrders.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: `workOrderUpdateAuto-${response.AutoCreatedOrders[0].AlertId}`,\r\n message: response.SuccessMessages[0],\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: false,\r\n itemName: 'The following next Work Order',\r\n itemEndName: `has been created and set to start at ${\r\n dateUtils.longDateTimeFormat(\r\n response.AutoCreatedOrders[0].Date,\r\n ) ?? ''\r\n }`,\r\n detailsType: RenderPageType.WorkOrderDetails,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + response.AutoCreatedOrders[0].AlertId,\r\n } as WorkOrderQueryStringParameters,\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n let hasResOffline = response.sendEmailOnOffline === true;\r\n let offData =\r\n response.ReservationOffline.length > 0\r\n ? response.ReservationOffline.map(m => {\r\n return {\r\n AlertId: m.AlertId,\r\n offStart: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(m.offStart),\r\n ),\r\n offEnd: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(m.offEnd),\r\n ),\r\n ReasonName: m.ReasonName,\r\n Remarks: m.Remarks,\r\n reservationIds: m.reservationIds,\r\n };\r\n })\r\n : ([] as ReservationsOfflineData[]);\r\n yield put(\r\n actions.updateWorkOrder_Success({\r\n hasErrors: hasErrors,\r\n sendEmailOnOffline: hasResOffline,\r\n reservationOffline: offData,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'workOrderUpdateErr',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateWorkOrder_Error(Error));\r\n }\r\n}\r\nfunction* doSendReservationsOfflineEmail(\r\n action: PayloadAction<{\r\n cancel: boolean;\r\n deleted: boolean;\r\n insert: boolean;\r\n doNotNotifyUsers: boolean;\r\n allAffectedUsers: boolean;\r\n reservationOffline: ReservationsOfflineData[];\r\n }>,\r\n) {\r\n try {\r\n const paload = {\r\n cancel: action.payload.cancel,\r\n deleted: action.payload.deleted,\r\n insert: action.payload.insert,\r\n doNotNotifyUsers: action.payload.doNotNotifyUsers,\r\n allAffectedUsers: action.payload.allAffectedUsers,\r\n sendData: action.payload.reservationOffline,\r\n } as SendEmailOnOffline;\r\n const result = yield call(api.sendEmailOnOffline, paload);\r\n let response = result as IResponseType;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: 'sendOfflineEmail',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'sendOfflineEmail',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n key: 'sendOfflineEmail',\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(\r\n actions.sendReservationsOfflineEmail_Success(\r\n response.ErrorMessages.length > 0,\r\n ),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'sendOfflineEmail',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.sendReservationsOfflineEmail_Error(Error));\r\n }\r\n}\r\nfunction* doRemoveFromLinked(action: PayloadAction) {\r\n const res = yield call(api.removefromLinks, action.payload);\r\n if (typeof res === 'number') {\r\n yield put(actions.removeFromLinked_success(res));\r\n return;\r\n }\r\n const response = res as IResponseType;\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(r => ({ message: r, variant: 'error' })),\r\n ),\r\n );\r\n}\r\nfunction* doAddToLinked(action: PayloadAction<{ id: number; link: number }>) {\r\n try {\r\n const res = yield call(api.addToLinked, action.payload);\r\n if (IsEntity(res)) {\r\n yield put(actions.addToLink_success(res));\r\n return;\r\n }\r\n const response = res.value as IResponseType;\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(r => ({ message: r, variant: 'error' })),\r\n ),\r\n );\r\n } catch (error) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doRemoveLinkedCalibration(\r\n action: PayloadAction<{ id: number; link: number }>,\r\n) {\r\n const res = yield call(api.removeLinkedCalibration, action.payload);\r\n const response = res as IResponseType;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(r => ({ message: r, variant: 'error' })),\r\n ),\r\n );\r\n }\r\n yield put(actions.removeLinkedCalibration_success());\r\n}\r\nfunction* doaddLinkedCalibration(\r\n action: PayloadAction<{ id: number; link: number }>,\r\n) {\r\n try {\r\n const res = yield call(api.addLinkedToCalibration, action.payload);\r\n const response = res as IResponseType;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(r => ({ message: r, variant: 'error' })),\r\n ),\r\n );\r\n }\r\n yield put(actions.addLinkedCalibration_success());\r\n } catch (error) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doSetAny(\r\n action: PayloadAction<{\r\n fieldKey: keyof WorkOrderDetailsState;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setAnyValueSuccess(action.payload));\r\n}\r\nfunction* doSetCreatedOrders(action: PayloadAction) {\r\n yield put(actions.setOrderNumbers_success(action.payload));\r\n}\r\nfunction* doCheckDowntimeOverlaps(action: PayloadAction) {\r\n try {\r\n const res = yield call(api.getOverlappingDowntimes, action.payload);\r\n const response = res as DowntimeOverlaps[];\r\n yield put(actions.checkDowntimeOverlaps_Success(response));\r\n } catch (error) {\r\n yield put(actions.checkDowntimeOverlaps_Success(undefined));\r\n }\r\n}\r\nexport function* workOrderSaga() {\r\n yield takeLatest(actions.initWorkOrder.type, doInitCreate);\r\n yield takeLatest(actions.initUpdateWorkOrder.type, doInitUpdate);\r\n yield takeLatest(actions.createWorkOrder.type, doCreate);\r\n yield takeLatest(actions.updateWorkOrder.type, doUpdate);\r\n yield takeLatest(\r\n actions.sendReservationsOfflineEmail.type,\r\n doSendReservationsOfflineEmail,\r\n );\r\n yield takeLatest(actions.removeFromLinked.type, doRemoveFromLinked);\r\n yield takeLatest(actions.addToLinked.type, doAddToLinked);\r\n yield takeLatest(\r\n actions.removeLinkedCalibration.type,\r\n doRemoveLinkedCalibration,\r\n );\r\n yield takeLatest(actions.addLinkedCalibration.type, doaddLinkedCalibration);\r\n yield takeLatest(actions.setAnyValue.type, doSetAny);\r\n yield takeLatest(actions.setOrderNumbers.type, doSetCreatedOrders);\r\n yield takeLatest(actions.checkDowntimeOverlaps.type, doCheckDowntimeOverlaps);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { Entity } from 'types/common';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { workOrderSaga } from './saga';\r\nimport {\r\n ConvertEntityToModel,\r\n DowntimeOverlaps,\r\n ReservationsOfflineData,\r\n WorkOrderDetailsState,\r\n WorkOrderGlobalState,\r\n WorkOrderQueryStringParameters,\r\n WorkOrderReadonlyState,\r\n WorkOrderState,\r\n} from './types';\r\n\r\nexport const initialState: WorkOrderState = {\r\n processing: false,\r\n createState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n updateState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n reservationOffline: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n sendEmailOnOffline: false,\r\n readonlyState: undefined,\r\n updateAllRecurrent: false,\r\n valueHandler: undefined,\r\n doSaveNewComments: undefined,\r\n createdOrders: [],\r\n savedLinkedOrders: [],\r\n calibrationsChanged: undefined,\r\n linksProcessing: undefined,\r\n downtimeOverlaps: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'workOrder',\r\n initialState,\r\n reducers: {\r\n initWorkOrder(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = true;\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.downtimeOverlaps = undefined;\r\n },\r\n initWorkOrder_Success(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.createState.data = ConvertEntityToModel(\r\n action.payload,\r\n action.payload.ToDown,\r\n );\r\n },\r\n initWorkOrder_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n initUpdateWorkOrder(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = true;\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initUpdateWorkOrder_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.updateState.data = ConvertEntityToModel(action.payload, undefined);\r\n state.readonlyState = action.payload as WorkOrderReadonlyState;\r\n },\r\n initUpdateWorkOrder_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n // state.updateState.data = undefined;\r\n // state.readonlyState = undefined;\r\n },\r\n createWorkOrder(state, action: PayloadAction) {\r\n state.createState.processing = true;\r\n state.createState.completed = undefined;\r\n state.createState.hasErrors = undefined;\r\n },\r\n createWorkOrder_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n sendEmailOnOffline: boolean;\r\n reservationOffline: ReservationsOfflineData[];\r\n }>,\r\n ) {\r\n state.createState.processing = false;\r\n state.createState.hasErrors = action.payload.hasErrors;\r\n state.createState.completed = true;\r\n\r\n state.reservationOffline.data = action.payload.reservationOffline;\r\n state.sendEmailOnOffline = action.payload.sendEmailOnOffline;\r\n },\r\n createWorkOrder_Error(state, action: PayloadAction) {\r\n state.createState.processing = false;\r\n state.createState.completed = true;\r\n state.createState.hasErrors = true;\r\n },\r\n updateWorkOrder(\r\n state,\r\n action: PayloadAction<{\r\n current: WorkOrderDetailsState;\r\n original: WorkOrderDetailsState | undefined;\r\n originalSubFormFiles: IFormFileValue[];\r\n originalStaffFormFiles: IFormFileValue[];\r\n }>,\r\n ) {\r\n state.updateState.processing = true;\r\n state.updateState.completed = undefined;\r\n state.updateState.hasErrors = undefined;\r\n },\r\n updateWorkOrder_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n sendEmailOnOffline: boolean;\r\n reservationOffline: ReservationsOfflineData[];\r\n }>,\r\n ) {\r\n state.updateState.processing = false;\r\n state.updateState.hasErrors = action.payload.hasErrors;\r\n state.updateState.completed = true;\r\n state.reservationOffline.data = action.payload.reservationOffline;\r\n state.sendEmailOnOffline = action.payload.sendEmailOnOffline;\r\n },\r\n updateWorkOrder_Error(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n state.updateState.hasErrors = true;\r\n },\r\n resetCreateWorkOrderState(state, action: PayloadAction) {\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.OfflineEventStart = undefined;\r\n state.OfflineEventEnd = undefined;\r\n state.savedLinkedOrders = [];\r\n state.downtimeOverlaps = undefined;\r\n },\r\n resetUpdateWorkOrderState(state, action: PayloadAction) {\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.readonlyState = undefined;\r\n state.savedLinkedOrders = [];\r\n state.downtimeOverlaps = undefined;\r\n },\r\n resetReservationsOfflineState(state, action: PayloadAction) {\r\n state.sendEmailOnOffline = false;\r\n state.reservationOffline = {\r\n data: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n processing: false,\r\n };\r\n state.OfflineEventStart = undefined;\r\n state.OfflineEventEnd = undefined;\r\n },\r\n sendReservationsOfflineEmail(\r\n state,\r\n action: PayloadAction<{\r\n cancel: boolean;\r\n deleted: boolean;\r\n insert: boolean;\r\n doNotNotifyUsers: boolean;\r\n allAffectedUsers: boolean;\r\n reservationOffline: ReservationsOfflineData[];\r\n }>,\r\n ) {\r\n state.reservationOffline.processing = true;\r\n state.reservationOffline.completed = undefined;\r\n state.reservationOffline.hasErrors = undefined;\r\n },\r\n sendReservationsOfflineEmail_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.reservationOffline.processing = false;\r\n state.reservationOffline.hasErrors = action.payload;\r\n state.reservationOffline.completed = true;\r\n },\r\n sendReservationsOfflineEmail_Error(state, action: PayloadAction) {\r\n state.reservationOffline.processing = false;\r\n state.reservationOffline.completed = true;\r\n state.reservationOffline.hasErrors = true;\r\n },\r\n setUpdateAllRecurrent(state, action: PayloadAction) {\r\n state.updateAllRecurrent = action.payload;\r\n },\r\n removeFromLinked(state, action: PayloadAction) {\r\n state.processing = true;\r\n },\r\n removeFromLinked_success(state, action: PayloadAction) {\r\n state.processing = false;\r\n if (state.readonlyState === undefined) return;\r\n state.readonlyState.LinkedAlerts = state.readonlyState.LinkedAlerts.filter(\r\n f => f.Id !== action.payload,\r\n );\r\n },\r\n addToLinked(state, action: PayloadAction<{ id: number; link: number }>) {\r\n state.processing = true;\r\n },\r\n addToLink_success(state, action: PayloadAction>) {\r\n state.processing = false;\r\n if (state.readonlyState === undefined) return;\r\n state.readonlyState.LinkedAlerts.push(action.payload);\r\n },\r\n setAnyValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof WorkOrderDetailsState;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setAnyValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof WorkOrderDetailsState;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.valueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetValueHandler(state, action: PayloadAction) {\r\n state.valueHandler = undefined;\r\n },\r\n /**\r\n * Sets the offline event start\r\n * @param state\r\n * @param action\r\n */\r\n setOfflineEventStart(state, action: PayloadAction) {\r\n state.OfflineEventStart = action.payload;\r\n },\r\n /**\r\n * Sets the offline event end\r\n * @param state\r\n * @param action\r\n */\r\n setOfflineEventEnd(state, action: PayloadAction) {\r\n state.OfflineEventEnd = action.payload;\r\n },\r\n setSaveNewComments(state, action: PayloadAction) {\r\n state.doSaveNewComments = action.payload;\r\n },\r\n setOrderNumbers(state, action: PayloadAction) {},\r\n setOrderNumbers_success(state, action: PayloadAction) {\r\n state.createdOrders = action.payload;\r\n },\r\n setSavedLinkedOrders(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.savedLinkedOrders = action.payload;\r\n },\r\n resetSavedLinkedOrders(state, action: PayloadAction) {\r\n state.savedLinkedOrders = [];\r\n },\r\n removeLinkedCalibration(\r\n state,\r\n action: PayloadAction<{ id: number; link: number }>,\r\n ) {\r\n state.linksProcessing = true;\r\n },\r\n removeLinkedCalibration_success(state, action: PayloadAction) {\r\n state.linksProcessing = false;\r\n state.calibrationsChanged = true;\r\n },\r\n addLinkedCalibration(\r\n state,\r\n action: PayloadAction<{ id: number; link: number }>,\r\n ) {\r\n state.linksProcessing = true;\r\n },\r\n addLinkedCalibration_success(state, action: PayloadAction) {\r\n state.linksProcessing = false;\r\n state.calibrationsChanged = true;\r\n },\r\n setCalibrationChanged(state, action: PayloadAction) {\r\n state.calibrationsChanged = action.payload;\r\n },\r\n checkDowntimeOverlaps(state, action: PayloadAction) {},\r\n checkDowntimeOverlaps_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.downtimeOverlaps = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: workOrderActions } = slice;\r\n\r\nexport const useWorkOrderSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: workOrderSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import { InputAdornment } from '@material-ui/core';\r\nimport { TextField as BasicTextField } from 'app/components/TextField';\r\nimport * as React from 'react';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { EditorProps } from '../../EditableCell';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\n\r\n// 'ShortText':\r\n\r\nexport function TextField({\r\n parentValue,\r\n error,\r\n helperText,\r\n info,\r\n autoFocus,\r\n ...props\r\n}: EditorProps) {\r\n const handleChange: React.ChangeEventHandler<\r\n HTMLInputElement | HTMLTextAreaElement\r\n > = e => {\r\n props.onChange(e.target.value);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {!!info && info !== '' && }\r\n {error && (\r\n \r\n )}\r\n \r\n ),\r\n }}\r\n variant=\"standard\"\r\n fullWidth\r\n error={error}\r\n inputProps={{\r\n type: 'text',\r\n }}\r\n value={props.value || ''}\r\n onChange={handleChange}\r\n onBlur={props.onBlur}\r\n id={props.id}\r\n label={props.label}\r\n autoFocus={autoFocus}\r\n name={props.name}\r\n />\r\n {/* */}\r\n \r\n );\r\n}\r\n","import { Entity } from 'types/common';\r\n\r\nexport enum messageType {\r\n Announcment,\r\n reservationStarted,\r\n usageReservation,\r\n loadDesk,\r\n removableAnnouncment,\r\n calendar,\r\n}\r\n\r\nexport interface StartedReservation {\r\n Id: number;\r\n Asset: Entity;\r\n AllowModification: boolean;\r\n AllowExtendReservation: boolean;\r\n AllowUsersToShortenReservations: boolean;\r\n Tutoring: boolean;\r\n AllUsagesEnded: boolean;\r\n}\r\n\r\nexport interface LoanDesk {\r\n Id: number;\r\n AssetDetails: Entity;\r\n}\r\n\r\nexport interface UsageReservation extends Entity {}\r\n\r\nexport interface CalendarMessageProps {\r\n Id: number;\r\n ServiceGroupId: number | null;\r\n EquipmentId: number | null;\r\n Title: string | null;\r\n Body: string | null;\r\n StartDate: Date | null;\r\n EndDate: Date | null;\r\n}\r\n\r\ntype Messageprops =\r\n | StartedReservation\r\n | UsageReservation\r\n | LoanDesk\r\n | string\r\n | CalendarMessageProps;\r\n\r\nexport interface Message {\r\n type: messageType;\r\n props?: Messageprops;\r\n key: string;\r\n}\r\n\r\nexport interface MessagesState {\r\n messages: Message[];\r\n initialized: number;\r\n}\r\n","import { IAssetDetails2Dto } from 'api/odata/generated/entities/IAssetDetails2Dto';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Entity } from 'types/common';\r\nimport { IMyAssetsRow } from '../MyAssetsPage/IMyAssetsRow';\r\n\r\nexport type IAsset = IAssetDetails2Dto;\r\n\r\nexport interface AlertInfo {\r\n show: boolean;\r\n hasActive: boolean;\r\n hasDownActive: boolean;\r\n noAlerts: boolean;\r\n assetId?: number;\r\n alertId?: number;\r\n isAdmin: boolean;\r\n}\r\n\r\nexport interface AssetUser extends Entity {\r\n DisplayName: string;\r\n Email: string;\r\n OfficeTel: string;\r\n}\r\n\r\nexport interface IRestrictions {\r\n Id: number;\r\n Name: string;\r\n AssetId: number | null;\r\n ServiceGroupId: number;\r\n LimitlessReservationAllowed: boolean | null;\r\n PrerequisiteEquipments: IAssetDto[];\r\n ForceTutoring: boolean;\r\n RestrictionsOverview: string | null;\r\n ReservationRestrictions: string | null;\r\n MinReservationOrder: number | null;\r\n MaxReservationOrder: number | null;\r\n ReservationMinimumGap: number | null;\r\n MinTimeAheadPeriodValue: number | null;\r\n MinTimeAheadPeriodType: number | null;\r\n MinTimeAheadMinutesSinceMidnight: number | null;\r\n BypassQuotas: boolean;\r\n BypassUserQuotasAndGaps: boolean;\r\n BypassMinResDurationD: boolean;\r\n BypassMinResDurationT: number | null;\r\n BypassUserQuotasAndGapsD: number | null;\r\n MinReservationOrderGap: number;\r\n UserReservationGap: number;\r\n UserGroupReservationGap: number;\r\n InstituteReservationGap: number;\r\n CarryOverTimeSlotGap: number | null;\r\n CarryOverTimeSlotTypeId: number | null;\r\n CarryOverTimeSlotTypeName: string | null;\r\n}\r\nexport const mapToAssetDto = (myAsset: IMyAssetsRow): IAssetDto => {\r\n return {\r\n Id: myAsset.Id,\r\n Name: myAsset.Name,\r\n AssetCatId: myAsset.AssetCatId,\r\n Availability: {\r\n Id: myAsset.AvailabilityTypeId,\r\n Name: myAsset.AvailabilityTypeName,\r\n },\r\n ServiceGroupId: myAsset.ServiceGroupId,\r\n ServiceGroupName: myAsset.ServiceGroupName,\r\n ServiceId: myAsset.ServiceId,\r\n ServiceTypeId: myAsset.ServiceTypeId,\r\n ServiceGroupAssetId: myAsset.ServiceGroupAssetId,\r\n } as IAssetDto;\r\n};\r\n","import { ConfigurableColumns } from 'app/components/BasicTable/ConfigurableColumns';\r\nimport { ExportImportApi } from './Api';\r\nimport { ImportAdditionalData, ImportData, TemplateColumns } from './Types';\r\n\r\nconst Api = new ExportImportApi();\r\nexport const ExportImportActions = {\r\n Export: (url: string) => {\r\n return Api.export(url);\r\n },\r\n Import: (url: string, file, data: ImportData) => {\r\n return Api.import(url, file, data);\r\n },\r\n TemplateColumns: (\r\n screenId: number,\r\n Iad: ImportAdditionalData = ImportAdditionalData.none,\r\n ) => {\r\n return Api.TemplateColumns(screenId, Iad);\r\n },\r\n ConfigurableColumns: (\r\n url: string,\r\n listId: number,\r\n configurableType: number,\r\n ) => {\r\n return Api.ConfigurableColumns(\r\n url,\r\n listId,\r\n configurableType,\r\n );\r\n },\r\n ImportTemplate: (\r\n screenId: number,\r\n ext: string,\r\n Iad: ImportAdditionalData = ImportAdditionalData.none,\r\n ) => {\r\n return Api.ImportTemplate(screenId, ext, Iad);\r\n },\r\n ExportForImport: (\r\n ScreenId: number,\r\n Ids: number[],\r\n Iad: ImportAdditionalData = ImportAdditionalData.none,\r\n ) => {\r\n return Api.ExportForImport(ScreenId, Ids, Iad);\r\n },\r\n ImportImages: (files: File[], ScreenId: number) => {\r\n return Api.importImages(files, ScreenId);\r\n },\r\n};\r\n","import { httpClient } from 'api/HttpClient';\r\nimport axios from 'axios';\r\nimport { ImportAdditionalData, ImportData } from './Types';\r\n\r\nexport class ExportImportApi {\r\n export = (url: string) => {\r\n return axios.get(url, {\r\n responseType: 'blob',\r\n timeout: undefined,\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n });\r\n };\r\n import = async (url: string, file, data: ImportData) => {\r\n const formData = new FormData();\r\n formData.append('File', file);\r\n formData.append('importData', JSON.stringify(data));\r\n try {\r\n const response = await axios.post(url, formData, {\r\n responseType: 'blob',\r\n timeout: undefined,\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n });\r\n return response;\r\n } catch (error: unknown) {\r\n throw error;\r\n }\r\n };\r\n ConfigurableColumns = (\r\n url: string,\r\n listId: number,\r\n configurableType: number,\r\n ) => {\r\n return httpClient.get(url, {\r\n ListID: listId,\r\n ConfigurableType: configurableType,\r\n });\r\n };\r\n TemplateColumns = (\r\n ScreenId: number,\r\n Iad: ImportAdditionalData = ImportAdditionalData.none,\r\n ) => {\r\n const url = 'api/GenericImport/TemplateNames';\r\n return httpClient.get(url, {\r\n screenId: ScreenId,\r\n iad: Iad,\r\n });\r\n };\r\n ImportTemplate = (\r\n ScreenId: number,\r\n Ext: string,\r\n Iad: ImportAdditionalData = ImportAdditionalData.none,\r\n ) => {\r\n const url = 'api/GenericImport/ImportTemplate';\r\n return axios.get(url, {\r\n responseType: 'blob',\r\n timeout: undefined,\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n params: { screenId: ScreenId, ext: Ext, iad: Iad },\r\n });\r\n };\r\n // Ids count may be too large.\r\n // Therefore, Ids are sent in the request body.\r\n ExportForImport = (\r\n ScreenId: number,\r\n Ids: number[],\r\n Iad: ImportAdditionalData = ImportAdditionalData.none,\r\n ) => {\r\n const data = { ScreenId: ScreenId, Ids: Ids, Iad: Iad };\r\n const formData = new FormData();\r\n formData.append('importData', JSON.stringify(data));\r\n const url = 'api/GenericImport/ExportForImport';\r\n return axios.post(url, formData, {\r\n responseType: 'blob',\r\n timeout: undefined,\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n });\r\n };\r\n importImages = (files: File[], ScreenId: number) => {\r\n const url = 'api/GenericImport/ImportImages';\r\n const formData = new FormData();\r\n for (const file of files) {\r\n formData.append(file.name, file);\r\n }\r\n return axios.post(url, formData, {\r\n responseType: 'blob',\r\n timeout: undefined,\r\n maxContentLength: 50000000,\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n params: { screenId: ScreenId },\r\n });\r\n };\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.samplesList || initialState;\r\n\r\nexport const selectSamplesList = createSelector([selectSlice], state => state);\r\n\r\nexport const selectSamplesTableState = createSelector(\r\n [selectSlice],\r\n state => state.SamplesListTableState,\r\n);\r\nexport const selectSamplesData = createSelector(\r\n [selectSamplesList],\r\n state => state.SamplesList,\r\n);\r\nexport const selectSelectedRunType = createSelector(\r\n [selectSlice],\r\n state => state.SelectedRunType,\r\n);\r\nexport const selectRunDetails = createSelector(\r\n [selectSamplesList],\r\n state => state.RunDetails,\r\n);\r\nexport const selectShowRunDialog = createSelector(\r\n [selectSamplesList],\r\n state => state.ShowRunDialog,\r\n);\r\nexport const selectSelectedSamples = createSelector(\r\n [selectSamplesList],\r\n state => state.SamplesSelected,\r\n);\r\nexport const selectSamplesListEditMode = createSelector(\r\n [selectSamplesList],\r\n state => state.EditMode,\r\n);\r\nexport const selectImportingRunDetails = createSelector(\r\n [selectSamplesList],\r\n state => state.ImportStarted,\r\n);\r\nexport const selectImportingRunDetailsFinished = createSelector(\r\n [selectSamplesList],\r\n state => state.ImportFinished,\r\n);\r\nexport const selectRunDetailsInstrument = createSelector(\r\n [selectSamplesList],\r\n state => state.RunDetails?.Instrument?.Name,\r\n);\r\nexport const selectRunDetailsSecondaryInstrument = createSelector(\r\n [selectSamplesList],\r\n state => state.RunDetails?.SecondaryInstrument?.Name,\r\n);\r\nexport const selectRunDetailsGradient = createSelector(\r\n [selectSamplesList],\r\n state => state.RunDetails?.Gradient?.Name,\r\n);\r\nexport const selectRunDetailsCreatedDate = createSelector(\r\n [selectSamplesList],\r\n state => state.RunDetails?.CreateDate,\r\n);\r\nexport const selectRunDetailsAcquision_type = createSelector(\r\n [selectSamplesList],\r\n state => state.RunDetails?.ACQUISITION_TYPE,\r\n);\r\n","export * from './CampusPickerFilter';\r\nexport * from './DatePickerFilter';\r\nexport * from './TextFieldFilter';\r\nexport * from './IFilterComponentProps';\r\n","/**\r\n *\r\n * TextField\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n TextField as MatTextField,\r\n TextFieldProps as MatTextFieldProps,\r\n Theme,\r\n withStyles,\r\n} from '@material-ui/core';\r\nimport { omit } from 'lodash';\r\n//import styled from 'styled-components/macro';\r\nexport interface TextFieldProps\r\n extends Omit {\r\n variant?: 'outlined' | 'filled' | 'standard';\r\n color?: 'primary' | 'secondary';\r\n autoComplete?: string;\r\n mini?: string;\r\n}\r\nexport function TextField(props: TextFieldProps) {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n/* only bottom border should have accent when focused according to figma design */\r\n/* TODO: override default theme instead of this mess */\r\nconst StyledTextField = withStyles((theme: Theme) => ({\r\n root: {\r\n margin: theme.spacing(0),\r\n },\r\n}))(MatTextField);\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { BasicCheckBox, BasicCheckBoxProps } from '../BasicCheckBox';\r\n\r\nexport interface FormCheckboxProps extends BasicCheckBoxProps {\r\n label?: string;\r\n helperText?: string;\r\n}\r\nexport const FormCheckbox = ({\r\n label,\r\n onChange,\r\n onBlur,\r\n value,\r\n name,\r\n color,\r\n helperText,\r\n ...props\r\n}: FormCheckboxProps & FieldHookConfig & IFieldProps) => {\r\n const [field, meta] = useField({ name, ...props });\r\n const handleChange = (value, event) => {\r\n if (onChange !== undefined) {\r\n onChange(value, event);\r\n }\r\n field.onChange(event);\r\n };\r\n return (\r\n <>\r\n \r\n \r\n );\r\n};\r\n","import { generatePath } from 'react-router';\r\n\r\nexport const ServiceRequestDetailsPath = '/requests/:id';\r\nexport const GetServiceRequestDetailsPath = (serviceRequestId: number) =>\r\n generatePath(ServiceRequestDetailsPath, {\r\n id: serviceRequestId,\r\n });\r\n","import * as React from 'react';\r\nimport { MenuList, MenuItem, makeStyles, Theme, Box } from '@material-ui/core';\r\nimport { IFilterSettings } from './IFilterSettings';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Popper } from 'app/components/Popper';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport clsx from 'clsx';\r\n\r\nexport interface AddFilterButtonProps {\r\n availableFilters: IFilterSettings[];\r\n onChange: (value: IFilterSettings) => void;\r\n filtersSelectionOpen: boolean;\r\n title: string;\r\n disabled?: boolean;\r\n disabledTitle?: string;\r\n}\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n // root: {\r\n // width: `${props.winWidth}px`,\r\n // height: 'calc(100% - 90px)',\r\n // },\r\n selectPaper: {\r\n height: '100%',\r\n },\r\n selectRoot: {\r\n padding: theme.spacing(2),\r\n },\r\n selectTitle: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '8px 8px',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n '&>label': {\r\n width: '100%',\r\n textAlign: 'center',\r\n },\r\n },\r\n selectContent: {\r\n marginTop: theme.spacing(2),\r\n boxShadow: 'inset 0px 1px 0px #E0E5EC',\r\n overflow: 'auto',\r\n // aim to show 10 top items in the list, with rest hidden behind scrollbar\r\n maxHeight: '385px',\r\n '&.mobHorizontal': {\r\n maxHeight: '200px',\r\n },\r\n },\r\n addButtonRoot: {\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: 8,\r\n marginTop: 'unset',\r\n '&.isMobile': {\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n marginTop: '16px',\r\n },\r\n },\r\n addCollapsContainer: {\r\n width: '100%',\r\n },\r\n}));\r\nexport function AddFilterButton({\r\n filtersSelectionOpen,\r\n ...props\r\n}: AddFilterButtonProps) {\r\n const [open, setOpen] = React.useState(filtersSelectionOpen);\r\n const { checkIsMobile, isLandscape } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n React.useEffect(() => setOpen(filtersSelectionOpen), [filtersSelectionOpen]);\r\n\r\n const anchorRef = React.useRef(null);\r\n const [anchorEl, setAnchorEl] = React.useState<\r\n EventTarget & HTMLDivElement\r\n >();\r\n React.useEffect(() => {\r\n setAnchorEl(anchorRef.current ?? undefined);\r\n }, [anchorRef]);\r\n const handleAddFilterClick = e => {\r\n setOpen(c => !c);\r\n setAnchorEl(e.currentTarget);\r\n };\r\n // const winWidth = window.innerWidth;\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n // close popover on click anywhere outside the menu\r\n\r\n // control field search text value\r\n const [input, setInnput] = React.useState();\r\n\r\n // manually filter the items and take first 10\r\n const options = props.availableFilters.filter((item, index) =>\r\n item.displayName.toLowerCase().includes((input || '').toLowerCase()),\r\n );\r\n\r\n // handle selected filter event\r\n const handleFilterSelect = item => {\r\n props.onChange(item);\r\n setOpen(false);\r\n setInnput(undefined);\r\n };\r\n\r\n return (\r\n \r\n {/* TODO: user localization on button */}\r\n }\r\n disabled={props.disabled}\r\n title={props.disabled ? props.disabledTitle : undefined}\r\n >\r\n {props.title}\r\n \r\n {anchorEl !== undefined && (\r\n <>\r\n {/* {isMobile ? (\r\n \r\n \r\n }\r\n value={input || ''}\r\n onChange={e => setInnput(e.target.value)}\r\n aria-label={t(translations.SearchFilter)}\r\n autoFocus\r\n inputProps={{ 'aria-label': t(translations.SearchFilter) }}\r\n fullWidth\r\n />\r\n\r\n \r\n {options.map((item, index) => (\r\n handleFilterSelect(item)}\r\n >\r\n {item.displayName}\r\n \r\n ))}\r\n \r\n \r\n ) : ( */}\r\n setOpen(false)}\r\n title={t(translations.SelectFieldToFilterBy)}\r\n minWidth=\"auto\"\r\n >\r\n \r\n }\r\n value={input || ''}\r\n aria-label={t(translations.SearchFilter)}\r\n inputProps={{ 'aria-label': t(translations.SearchFilter) }}\r\n onChange={e => setInnput(e.target.value)}\r\n autoFocus\r\n fullWidth\r\n />\r\n\r\n \r\n {options.map((item, index) => (\r\n handleFilterSelect(item)}\r\n >\r\n {item.displayName}\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 * AppliedFiltersContainer\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { Directions } from '../FilterBox';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport clsx from 'clsx';\r\n\r\nexport interface AppliedFiltersContainerProps {\r\n direction: Directions;\r\n}\r\n\r\nexport function AppliedFiltersContainer({\r\n children,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const classes = useStyles();\r\n const { checkIsMobile, isLandscape } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n // maxHeight was taken to contain 3 AppliedFilterComponents vertically\r\n maxHeight: theme.spacing(54),\r\n height: 'auto',\r\n overflowY: 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: 12,\r\n width: '100%',\r\n '&.horizontal': {\r\n maxHeight: theme.spacing(21),\r\n },\r\n '&.mobileRoot': {\r\n maxHeight: '100%',\r\n },\r\n '&.mobileHorizontalRoot': {\r\n maxHeight: '100%',\r\n },\r\n },\r\n mobileRoot: {\r\n height: 'calc(100% - 48px)',\r\n },\r\n mobileHorizontalRoot: {\r\n height: 'calc(100% - 48px)',\r\n },\r\n }),\r\n);\r\n","import * as React from 'react';\r\nimport { AddFilterButton } from './AddFilterButton';\r\nimport { FilterDependencyData, IFilterSettings } from './IFilterSettings';\r\nimport { AppliedFilterComponent } from './AppliedFilterComponent';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nimport { Box, styled } from '@material-ui/core';\r\nimport { areSameFilter } from './utils';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { Directions } from 'app/components/BasicTable/BasicFilter/FilterBox';\r\nimport { AppliedFiltersContainer } from 'app/components/BasicTable/BasicFilter/AppliedFiltersContainer';\r\nimport { SavedListsDropDown } from './SavedListsDropDown';\r\nimport { TableSavedListSettings } from '../BasicTableProps';\r\nimport { FilterValueType } from './FilterValueType';\r\n\r\nexport interface SingleFilterProps {}\r\n\r\nexport interface IBasicFilterGroupProps {\r\n availableFilters: IFilterSettings[];\r\n appliedFilters: IFilterSettings[];\r\n appliedFiltersDirection?: Directions;\r\n onClose: () => void;\r\n onChange: (items: IFilterSettings[]) => void;\r\n getDefaultFilters?: () => IFilterSettings[];\r\n autoOpenAddFilter: boolean;\r\n showFooter: boolean;\r\n savedListSettings?: TableSavedListSettings;\r\n filterDefaultOpen?: boolean;\r\n}\r\nexport function updateDepValues(\r\n filterValues: FilterDependencyData[],\r\n depKey: keyof TRow,\r\n depValue?: FilterValueType,\r\n) {\r\n if (depValue === null || depValue === undefined) {\r\n if (\r\n filterValues.length > 0 &&\r\n filterValues.some(f => f.depKey === depKey)\r\n ) {\r\n return filterValues.filter(f => f.depKey !== depKey);\r\n } else return filterValues;\r\n } else {\r\n if (\r\n filterValues.length > 0 &&\r\n filterValues.some(f => f.depKey === depKey)\r\n ) {\r\n return filterValues.map(f => {\r\n if (f.depKey === depKey) {\r\n let item = {\r\n depKey: f.depKey,\r\n depValue: depValue,\r\n };\r\n return Object.assign({}, f, item);\r\n } else {\r\n return f;\r\n }\r\n });\r\n } else {\r\n let item = {\r\n depKey: depKey,\r\n depValue: depValue,\r\n };\r\n return [...filterValues, item];\r\n }\r\n }\r\n}\r\nexport function getDependencyFilters(\r\n filters: IFilterSettings[],\r\n): IFilterSettings[] {\r\n if (filters.length > 0) {\r\n if (\r\n filters.some(\r\n f =>\r\n !!f.dependencyProp &&\r\n f.dependencyProp.length > 0 &&\r\n !!f.filterPredicates,\r\n )\r\n ) {\r\n let depFilters = filters.filter(\r\n f =>\r\n !!f.dependencyProp &&\r\n f.dependencyProp.length > 0 &&\r\n !!f.filterPredicates,\r\n );\r\n depFilters.forEach(item => {\r\n let depFiltered = filters.filter(f =>\r\n item.dependencyProp?.includes(f.fieldName),\r\n );\r\n if (depFiltered.length > 0) {\r\n depFiltered.forEach(filt => {\r\n let depValue = filt?.value ?? filt?.defaultValue;\r\n item.filterData = updateDepValues(\r\n item.filterData ?? [],\r\n filt.fieldName,\r\n depValue,\r\n );\r\n });\r\n }\r\n });\r\n return filters.map(item => {\r\n if (depFilters.some(d => d.fieldName === item.fieldName)) {\r\n return depFilters.filter(d => d.fieldName === item.fieldName)[0];\r\n } else {\r\n return item;\r\n }\r\n });\r\n }\r\n }\r\n return filters;\r\n}\r\nexport function BasicFilterGroup({\r\n onChange,\r\n onClose,\r\n appliedFiltersDirection = 'vertical',\r\n savedListSettings,\r\n getDefaultFilters,\r\n filterDefaultOpen,\r\n ...props\r\n}: IBasicFilterGroupProps) {\r\n const { t } = useTranslation();\r\n\r\n // save provided applied filters to be used in change callbacks\r\n const [visibleFilters, setVisibleFilters] = React.useState<\r\n IFilterSettings[]\r\n >(props.appliedFilters);\r\n\r\n // refresh applied filters if they were changed from outside\r\n React.useEffect(() => {\r\n setVisibleFilters(props.appliedFilters);\r\n }, [props.appliedFilters]);\r\n\r\n // handle addition of a new filter\r\n const handleAddFilter = (item: IFilterSettings) => {\r\n item.value = null;\r\n setVisibleFilters(currentState => {\r\n const newState = [\r\n ...currentState,\r\n { ...item, ...{ open: filterDefaultOpen ?? true } },\r\n ];\r\n onChange(newState);\r\n return newState;\r\n });\r\n };\r\n const handleAddFilterWithValue = (item: IFilterSettings) => {\r\n setVisibleFilters(currentState => {\r\n const newState = [\r\n ...currentState,\r\n { ...item, ...{ open: filterDefaultOpen ?? true } },\r\n ];\r\n onChange(newState);\r\n return newState;\r\n });\r\n };\r\n const handleClearClick = () => {\r\n setVisibleFilters(currentState => {\r\n const newState =\r\n getDefaultFilters?.() ??\r\n currentState.map(f => ({\r\n ...f,\r\n ...{ value: null, open: false },\r\n }));\r\n onChange([...newState]);\r\n return newState;\r\n });\r\n };\r\n\r\n // handle apply (change) of the applied filter\r\n const handleApply = item => {\r\n if (item.value === undefined) {\r\n item.value = null;\r\n }\r\n item.visible = true;\r\n item.open = false;\r\n setVisibleFilters(currentState => {\r\n const newState = currentState.map(f =>\r\n areSameFilter({ f, item }) ? item : f,\r\n );\r\n onChange(newState);\r\n return newState;\r\n });\r\n };\r\n\r\n // handle removal of applied filter\r\n const handleRemoveFitler = (item: IFilterSettings) => {\r\n setVisibleFilters(currentState => {\r\n const newState = currentState.filter(f => !areSameFilter({ f, item }));\r\n onChange(newState);\r\n return newState;\r\n });\r\n };\r\n\r\n /**\r\n * Filters available in \"Add filter\" - to be added to the displayed fitlers list\r\n */\r\n const availableFilters = props.availableFilters.filter(available => {\r\n const unavailable = visibleFilters;\r\n const isApplied = unavailable.some(applied =>\r\n areSameFilter({ f: available, item: applied }),\r\n );\r\n return !isApplied;\r\n });\r\n\r\n const appliedFitltersCount = visibleFilters.length;\r\n const [open, setOpen] = React.useState(props.autoOpenAddFilter ?? false);\r\n useEffectOnMount(() =>\r\n props.autoOpenAddFilter ? setOpen(appliedFitltersCount === 0) : void 0,\r\n );\r\n\r\n return (\r\n <>\r\n {visibleFilters.length > 0 && (\r\n \r\n {visibleFilters.map((item, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n {savedListSettings && savedListSettings.enableSavedLists && (\r\n \r\n f.fieldName ===\r\n savedListSettings.savedListRelatedPickerName,\r\n ).length === 1\r\n ? visibleFilters.filter(\r\n f =>\r\n f.fieldName ===\r\n savedListSettings.savedListRelatedPickerName,\r\n )[0]\r\n : props.availableFilters.filter(\r\n f =>\r\n f.fieldName ===\r\n savedListSettings.savedListRelatedPickerName,\r\n )[0]\r\n }\r\n hasInVisibleFilters={\r\n visibleFilters.filter(\r\n f =>\r\n f.fieldName ===\r\n savedListSettings.savedListRelatedPickerName,\r\n ).length === 1\r\n }\r\n onApply={handleApply}\r\n onRemove={handleRemoveFitler}\r\n addFilter={handleAddFilterWithValue}\r\n serializedKey={savedListSettings.savedListSerializedKey || 'eid'}\r\n listViewbyAsset={savedListSettings.listViewbyAsset}\r\n />\r\n )}\r\n \r\n )}\r\n\r\n {savedListSettings &&\r\n savedListSettings.enableSavedLists &&\r\n visibleFilters.length < 1 && (\r\n \r\n \r\n f.fieldName ===\r\n savedListSettings.savedListRelatedPickerName,\r\n ).length === 1\r\n ? visibleFilters.filter(\r\n f =>\r\n f.fieldName ===\r\n savedListSettings.savedListRelatedPickerName,\r\n )[0]\r\n : props.availableFilters.filter(\r\n f =>\r\n f.fieldName ===\r\n savedListSettings.savedListRelatedPickerName,\r\n )[0]\r\n }\r\n hasInVisibleFilters={\r\n visibleFilters.filter(\r\n f =>\r\n f.fieldName ===\r\n savedListSettings.savedListRelatedPickerName,\r\n ).length === 1\r\n }\r\n onApply={handleApply}\r\n onRemove={handleRemoveFitler}\r\n addFilter={handleAddFilterWithValue}\r\n serializedKey={savedListSettings.savedListSerializedKey || 'eid'}\r\n listViewbyAsset={savedListSettings.listViewbyAsset}\r\n />\r\n \r\n )}\r\n \r\n {props.showFooter && (\r\n <>\r\n \r\n onClose()}\r\n >\r\n {t(translations.apply)}\r\n \r\n \r\n {t(translations.ResetFilters)}\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\nexport const ButtonsContainer = styled(Box)(theme => ({\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: '8px 0px 0px',\r\n gap: 8,\r\n}));\r\n","import {\r\n FormControlLabelProps as MuiFormControlLabelProps,\r\n FormControlLabel as MuiFormControlLabel,\r\n} from '@material-ui/core';\r\nimport clsx from 'clsx';\r\nimport * as React from 'react';\r\n\r\nexport interface FormControlLabelProps extends MuiFormControlLabelProps {\r\n boldLabel?: boolean;\r\n withInfo?: boolean;\r\n boxed?: boolean;\r\n boxedChecked?: boolean;\r\n boxedError?: boolean;\r\n}\r\nconst FormControlLabel = (props: FormControlLabelProps) => {\r\n const {\r\n boldLabel,\r\n withInfo,\r\n boxed,\r\n boxedChecked,\r\n boxedError,\r\n ...other\r\n } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default FormControlLabel;\r\n","import { BaseTextFieldProps, InputAdornment } from '@material-ui/core';\r\nimport { PureDateInputProps } from '@material-ui/pickers/_shared/PureDateInput';\r\nimport React from 'react';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { InfoIcon } from '../BasicIcons/InfoIcon';\r\nimport BaseTextField from '../BasicInputs/BaseTextField';\r\nimport { DatePopupVariants } from './utils/types';\r\n\r\nexport interface DateInputProps\r\n extends PureDateInputProps,\r\n Pick<\r\n BaseTextFieldProps,\r\n | 'autoFocus'\r\n | 'fullWidth'\r\n | 'helperText'\r\n | 'placeholder'\r\n | 'required'\r\n | 'disabled'\r\n | 'name'\r\n | 'id'\r\n | 'label'\r\n | 'margin'\r\n > {\r\n info?: string;\r\n ariaLabel?: string;\r\n startIcon?: React.ReactNode;\r\n endIcon?: React.ReactNode;\r\n togglePicker: () => void;\r\n variant?: DatePopupVariants;\r\n}\r\n\r\nexport function DateInput(props: DateInputProps) {\r\n const {\r\n inputValue,\r\n openPicker,\r\n InputProps,\r\n TextFieldComponent,\r\n inputProps,\r\n onBlur,\r\n onFocus,\r\n validationError,\r\n inputVariant,\r\n togglePicker,\r\n info,\r\n ariaLabel,\r\n startIcon,\r\n endIcon,\r\n variant,\r\n ...other\r\n } = props;\r\n const TextComponent = !!TextFieldComponent\r\n ? TextFieldComponent\r\n : BaseTextField;\r\n const innerInputProps = React.useMemo(() => {\r\n return Object.assign({}, InputProps, { readOnly: true });\r\n }, [InputProps]);\r\n return (\r\n \r\n // \r\n // \r\n // ),\r\n endAdornment: (\r\n <>\r\n {(info && ) ||\r\n (endIcon && (\r\n {endIcon}\r\n ))}\r\n \r\n togglePicker()}\r\n disabled={props.disabled}\r\n size=\"xs\"\r\n variant=\"ghost\"\r\n >\r\n \r\n \r\n \r\n \r\n ),\r\n style: { minWidth: 80 },\r\n }}\r\n InputLabelProps={{\r\n shrink:\r\n props.inputVariant === 'filled'\r\n ? !isNullOrUndefined(inputValue)\r\n ? true\r\n : false\r\n : undefined,\r\n }}\r\n helperText={validationError || props.helperText}\r\n onClick={ev => {\r\n const target = ev.target as HTMLInputElement;\r\n if (!!target && target.nodeName === 'INPUT') openPicker();\r\n }}\r\n value={inputValue}\r\n variant={inputVariant}\r\n onKeyDown={(event: React.KeyboardEvent) => {\r\n if (event.key === 'Enter') {\r\n event.stopPropagation();\r\n openPicker();\r\n }\r\n }}\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n {...other}\r\n />\r\n );\r\n}\r\n","import { dateUtils } from 'utils/date-utils';\r\nimport { truncateTime } from './truncateTime';\r\nimport { DatePickerValueProps } from '../index';\r\n\r\n/**\r\n * Handles date-only period end date conversions\r\n * @param props\r\n * @returns\r\n */\r\n\r\nexport const toEndDateDisplayValue = (\r\n props: DatePickerValueProps & { direction: 'toDisplay' | 'fromDisplay' },\r\n) => {\r\n if (props.value === null) {\r\n return null;\r\n }\r\n if (props.value === undefined) {\r\n return null;\r\n }\r\n // first truncate the time part if required\r\n const truncatedDate = truncateTime({\r\n value: dateUtils.dateOrStringToDate(props.value),\r\n truncateTime: props.variant === 'date',\r\n });\r\n\r\n // then either move to one day forward for the underlying value or backward for the display value\r\n // for example, the actual stored value is '2010-11-12T00:00:00' is displayed as 'November 10th 2010' (note that 10th is inclusive till the midnight)\r\n const dir = props.direction === 'toDisplay' ? -1 : 1;\r\n const result = props.endTime\r\n ? dateUtils.addDays(truncatedDate, dir)\r\n : truncatedDate;\r\n return result;\r\n};\r\n","import { dateUtils } from 'utils/date-utils';\r\nimport { DatePickerValueProps } from '../index';\r\n\r\n/**\r\n * Optionally truncates time part to be used in date-only picker\r\n * @param props\r\n * @returns\r\n */\r\nexport function truncateTime(\r\n props: Pick & { value: Date },\r\n) {\r\n return props.truncateTime ? dateUtils.truncateTime(props.value) : props.value;\r\n}\r\n","function dateLongFormatter(pattern, formatLong) {\r\n switch (pattern) {\r\n case 'P':\r\n return formatLong.date({\r\n width: 'short',\r\n });\r\n\r\n case 'PP':\r\n return formatLong.date({\r\n width: 'medium',\r\n });\r\n\r\n case 'PPP':\r\n return formatLong.date({\r\n width: 'long',\r\n });\r\n\r\n case 'PPPP':\r\n default:\r\n return formatLong.date({\r\n width: 'full',\r\n });\r\n }\r\n}\r\n\r\nfunction timeLongFormatter(pattern, formatLong) {\r\n switch (pattern) {\r\n case 'p':\r\n return formatLong.time({\r\n width: 'short',\r\n });\r\n\r\n case 'pp':\r\n return formatLong.time({\r\n width: 'medium',\r\n });\r\n\r\n case 'ppp':\r\n return formatLong.time({\r\n width: 'long',\r\n });\r\n\r\n case 'pppp':\r\n default:\r\n return formatLong.time({\r\n width: 'full',\r\n });\r\n }\r\n}\r\n\r\nfunction dateTimeLongFormatter(pattern, formatLong) {\r\n var matchResult = pattern.match(/(P+)(p+)?/) || [];\r\n var datePattern = matchResult[1];\r\n var timePattern = matchResult[2];\r\n\r\n if (!timePattern) {\r\n return dateLongFormatter(pattern, formatLong);\r\n }\r\n\r\n var dateTimeFormat;\r\n\r\n switch (datePattern) {\r\n case 'P':\r\n dateTimeFormat = formatLong.dateTime({\r\n width: 'short',\r\n });\r\n break;\r\n\r\n case 'PP':\r\n dateTimeFormat = formatLong.dateTime({\r\n width: 'medium',\r\n });\r\n break;\r\n\r\n case 'PPP':\r\n dateTimeFormat = formatLong.dateTime({\r\n width: 'long',\r\n });\r\n break;\r\n\r\n case 'PPPP':\r\n default:\r\n dateTimeFormat = formatLong.dateTime({\r\n width: 'full',\r\n });\r\n break;\r\n }\r\n\r\n return dateTimeFormat\r\n .replace('{{date}}', dateLongFormatter(datePattern, formatLong))\r\n .replace('{{time}}', timeLongFormatter(timePattern, formatLong));\r\n}\r\n\r\nvar longFormatters = {\r\n p: timeLongFormatter,\r\n P: dateTimeLongFormatter,\r\n};\r\nexport default longFormatters;\r\n","// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\r\n// (one of the certain letters followed by `o`)\r\n// - (\\w)\\1* matches any sequences of the same letter\r\n// - '' matches two quote characters in a row\r\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\r\n// except a single quote symbol, which ends the sequence.\r\n// Two quote characters do not end the sequence.\r\n// If there is no matching single quote\r\n// then the sequence will continue until the end of the string.\r\n// - . matches any single character unmatched by previous parts of the RegExps\r\n// This RegExp catches symbols escaped by quotes, and also\r\n\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport longFormatters from './longFormatters';\r\n\r\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\r\nconst formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\r\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\r\n// const escapedStringRegExp = /^'([^]*?)'?$/;\r\n// const doubleQuoteRegExp = /''/g;\r\n// const notWhitespaceRegExp = /\\S/;\r\n// const unescapedLatinCharacterRegExp = /[a-zA-Z]/;\r\n//returns RegExpMatchArray\r\nexport default function getFormatTokens(formatString: string): string[] | null {\r\n // if(formatString === null ) return null;\r\n let tokens = formatString\r\n .match(longFormattingTokensRegExp)\r\n ?.map(function (substring) {\r\n var firstCharacter = substring[0];\r\n\r\n if (firstCharacter === 'p' || firstCharacter === 'P') {\r\n var longFormatter = longFormatters[firstCharacter];\r\n return longFormatter(\r\n substring,\r\n dateUtils.dateFnsUtils.locale.formatLong,\r\n // dateUtils.subFnOptions(),\r\n );\r\n }\r\n\r\n return substring;\r\n })\r\n .join('')\r\n .match(formattingTokensRegExp);\r\n if (tokens === undefined || tokens === null) {\r\n return null;\r\n }\r\n return tokens;\r\n}\r\n","import { IUtils } from '@date-io/core/IUtils';\r\nimport { ParsableDate } from '@material-ui/pickers/constants/prop-types';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport { BaseKeyboardPickerProps } from '@material-ui/pickers/_shared/hooks/useKeyboardPickerState';\r\nimport { toEndDateDisplayValue } from 'app/components/DatePicker/utils/toEndDateDisplayValue';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport getFormatTokens from 'utils/DateFormattingUtils/getFormatTokens';\r\n\r\nexport type DateStartWith = 'day' | 'month' | 'year';\r\nexport type DatePopupVariants = 'date' | 'datetime' | 'time' | 'separated';\r\nexport interface DateTimeMask {\r\n day: string;\r\n month: string;\r\n year: string;\r\n hour: string;\r\n minute: string;\r\n meridiem: string;\r\n dateSeparator: string;\r\n dateStartFrom: DateStartWith;\r\n}\r\nexport interface FormatedResult {\r\n value: string;\r\n stayOnSelection: boolean;\r\n zeroPress: boolean;\r\n}\r\nexport const getInputViewDate = (\r\n variant: DatePopupVariants,\r\n value?: Date | string | null,\r\n endTime?: boolean,\r\n truncateTime?: boolean,\r\n): string | undefined => {\r\n if (variant === 'date') {\r\n return (\r\n dateUtils.shortDateFormat(\r\n toEndDateDisplayValue({\r\n value,\r\n endTime,\r\n truncateTime,\r\n direction: 'toDisplay',\r\n }),\r\n ) ?? undefined\r\n );\r\n } else if (variant === 'time') {\r\n return dateUtils.timeFormat(value) ?? undefined;\r\n } else if (variant === 'datetime') {\r\n return dateUtils.shortDateTimeFormat(value) ?? undefined;\r\n } else {\r\n return dateUtils.shortDateTimeFormat(value) ?? undefined;\r\n }\r\n};\r\nexport const setInputViewDate = (\r\n variant: DatePopupVariants,\r\n value?: Date | string | null,\r\n endTime?: boolean,\r\n truncateTime?: boolean,\r\n): MaterialUiPickersDate | null => {\r\n if (value === null) {\r\n return null;\r\n }\r\n if (value === undefined) {\r\n return null;\r\n } else if (variant === 'date') {\r\n let ddd =\r\n toEndDateDisplayValue({\r\n value,\r\n endTime,\r\n truncateTime,\r\n direction: 'fromDisplay',\r\n }) ?? value;\r\n return new CustomDate(ddd, 'date');\r\n } else if (variant === 'time') {\r\n return new CustomDate(value, 'time');\r\n } else if (variant === 'datetime') {\r\n return new CustomDate(value, 'complete');\r\n } else {\r\n return new CustomDate(value, 'complete');\r\n }\r\n};\r\nexport const getValueDateOrTruncat = (\r\n variant: DatePopupVariants,\r\n value?: Date | string | null,\r\n endTime?: boolean,\r\n truncateTime?: boolean,\r\n): Date | string | null | undefined => {\r\n if (value === null || value === undefined) {\r\n return value;\r\n }\r\n\r\n if (variant === 'date') {\r\n return toEndDateDisplayValue({\r\n value,\r\n endTime,\r\n truncateTime,\r\n direction: 'toDisplay',\r\n });\r\n } else {\r\n return value;\r\n }\r\n};\r\nexport const maskFormats = {\r\n date: '__/__/____',\r\n time: '__:__',\r\n timeMeridiem: '__:__ _M',\r\n dateTime: '__/__/____ __:__',\r\n dateTimeMeridiem: '__/__/____ __:__ _M',\r\n};\r\nexport const defaultDateTimeMask = (\r\n format: string,\r\n variant?: 'date' | 'time',\r\n): DateTimeMask => {\r\n const tokens = getFormatTokens(format);\r\n if (tokens === null) {\r\n let defTokens = getFormatTokens(dateUtils.DateIOFormats.keyboardDateTime); //full fate time\r\n if (defTokens === null) {\r\n return {\r\n day: 'dd',\r\n month: 'MM',\r\n year: 'yyyy',\r\n hour: 'HH',\r\n minute: 'mm',\r\n meridiem: 'a',\r\n dateSeparator: '/',\r\n dateStartFrom: 'day',\r\n };\r\n } else {\r\n let first = defTokens[0].toLowerCase();\r\n let dateStartWith = first.startsWith('d')\r\n ? 'day'\r\n : first.startsWith('m')\r\n ? 'month'\r\n : 'year';\r\n return {\r\n day:\r\n dateStartWith === 'day'\r\n ? defTokens[0]\r\n : dateStartWith === 'month'\r\n ? defTokens[2]\r\n : defTokens[4],\r\n month:\r\n dateStartWith === 'day'\r\n ? defTokens[2]\r\n : dateStartWith === 'month'\r\n ? defTokens[0]\r\n : defTokens[4],\r\n year:\r\n dateStartWith === 'day'\r\n ? defTokens[4]\r\n : dateStartWith === 'month'\r\n ? defTokens[4]\r\n : defTokens[0],\r\n hour: defTokens[6],\r\n minute: defTokens[8],\r\n meridiem: defTokens.length > 8 ? defTokens[10] : 'aa',\r\n dateSeparator: defTokens[1],\r\n dateStartFrom:\r\n dateStartWith === 'day'\r\n ? 'day'\r\n : dateStartWith === 'month'\r\n ? 'month'\r\n : 'year',\r\n };\r\n }\r\n } else {\r\n if (variant === undefined) {\r\n if (tokens[0].toLowerCase().startsWith('h')) {\r\n //time\r\n let dateTokens = getFormatTokens(\r\n dateUtils.DateIOFormats.keyboardDate,\r\n ) ?? ['dd', '/', 'MM', '/', 'yyyy']; //full date\r\n let first = dateTokens[0].toLowerCase();\r\n let dateStartWith = first.startsWith('d')\r\n ? 'day'\r\n : first.startsWith('m')\r\n ? 'month'\r\n : 'year';\r\n return {\r\n day:\r\n dateStartWith === 'day'\r\n ? dateTokens[0]\r\n : dateStartWith === 'month'\r\n ? dateTokens[2]\r\n : dateTokens[4],\r\n month:\r\n dateStartWith === 'day'\r\n ? dateTokens[2]\r\n : dateStartWith === 'month'\r\n ? dateTokens[0]\r\n : dateTokens[4],\r\n year:\r\n dateStartWith === 'day'\r\n ? dateTokens[4]\r\n : dateStartWith === 'month'\r\n ? dateTokens[4]\r\n : dateTokens[0],\r\n hour: tokens[0],\r\n minute: tokens[2],\r\n meridiem: tokens.length > 2 ? tokens[4] : 'aa',\r\n dateSeparator: dateTokens[1],\r\n dateStartFrom:\r\n dateStartWith === 'day'\r\n ? 'day'\r\n : dateStartWith === 'month'\r\n ? 'month'\r\n : 'year',\r\n };\r\n } else {\r\n //date\r\n let first = tokens[0].toLowerCase();\r\n let dateStartWith = first.startsWith('d')\r\n ? 'day'\r\n : first.startsWith('m')\r\n ? 'month'\r\n : 'year';\r\n let timeTokens = getFormatTokens(dateUtils.DateIOFormats.fullTime) ?? [\r\n 'HH',\r\n ':',\r\n 'mm',\r\n ];\r\n return {\r\n day:\r\n dateStartWith === 'day'\r\n ? tokens[0]\r\n : dateStartWith === 'month'\r\n ? tokens[2]\r\n : tokens[4],\r\n month:\r\n dateStartWith === 'day'\r\n ? tokens[2]\r\n : dateStartWith === 'month'\r\n ? tokens[0]\r\n : tokens[4],\r\n year:\r\n dateStartWith === 'day'\r\n ? tokens[4]\r\n : dateStartWith === 'month'\r\n ? tokens[4]\r\n : tokens[0],\r\n hour: timeTokens[0],\r\n minute: timeTokens[2],\r\n meridiem: timeTokens.length > 2 ? timeTokens[4] : 'a',\r\n dateSeparator: tokens[1],\r\n dateStartFrom:\r\n dateStartWith === 'day'\r\n ? 'day'\r\n : dateStartWith === 'month'\r\n ? 'month'\r\n : 'year',\r\n };\r\n }\r\n } else {\r\n if (variant === 'time') {\r\n let dateTokens = getFormatTokens(\r\n dateUtils.DateIOFormats.keyboardDate,\r\n ) ?? ['dd', '/', 'MM', '/', 'yyyy']; //full date\r\n let first = dateTokens[0].toLowerCase();\r\n let dateStartWith = first.startsWith('d')\r\n ? 'day'\r\n : first.startsWith('m')\r\n ? 'month'\r\n : 'year';\r\n return {\r\n day:\r\n dateStartWith === 'day'\r\n ? dateTokens[0]\r\n : dateStartWith === 'month'\r\n ? dateTokens[2]\r\n : dateTokens[4],\r\n month:\r\n dateStartWith === 'day'\r\n ? dateTokens[2]\r\n : dateStartWith === 'month'\r\n ? dateTokens[0]\r\n : dateTokens[4],\r\n year:\r\n dateStartWith === 'day'\r\n ? dateTokens[4]\r\n : dateStartWith === 'month'\r\n ? dateTokens[4]\r\n : dateTokens[0],\r\n hour: tokens[0],\r\n minute: tokens[2],\r\n meridiem: tokens.length > 2 ? tokens[4] : 'a',\r\n dateSeparator: dateTokens[1],\r\n dateStartFrom:\r\n dateStartWith === 'day'\r\n ? 'day'\r\n : dateStartWith === 'month'\r\n ? 'month'\r\n : 'year',\r\n };\r\n } else {\r\n let first = tokens[0].toLowerCase();\r\n let dateStartWith = first.startsWith('d')\r\n ? 'day'\r\n : first.startsWith('m')\r\n ? 'month'\r\n : 'year';\r\n let timeTokens = getFormatTokens(dateUtils.DateIOFormats.fullTime) ?? [\r\n 'HH',\r\n ':',\r\n 'mm',\r\n ];\r\n return {\r\n day:\r\n dateStartWith === 'day'\r\n ? tokens[0]\r\n : dateStartWith === 'month'\r\n ? tokens[2]\r\n : tokens[4],\r\n month:\r\n dateStartWith === 'day'\r\n ? tokens[2]\r\n : dateStartWith === 'month'\r\n ? tokens[0]\r\n : tokens[4],\r\n year:\r\n dateStartWith === 'day'\r\n ? tokens[4]\r\n : dateStartWith === 'month'\r\n ? tokens[4]\r\n : tokens[0],\r\n hour: timeTokens[0],\r\n minute: timeTokens[2],\r\n meridiem: timeTokens.length > 2 ? timeTokens[4] : 'a',\r\n dateSeparator: tokens[1],\r\n dateStartFrom:\r\n dateStartWith === 'day'\r\n ? 'day'\r\n : dateStartWith === 'month'\r\n ? 'month'\r\n : 'year',\r\n };\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const maskFormat = (\r\n dateVariant: Omit,\r\n ampm: boolean,\r\n): string => {\r\n switch (dateVariant) {\r\n case 'date':\r\n return maskFormats.date;\r\n case 'time':\r\n return ampm ? maskFormats.timeMeridiem : maskFormats.time;\r\n case 'datetime':\r\n return ampm ? maskFormats.dateTimeMeridiem : maskFormats.dateTime;\r\n default:\r\n return maskFormats.date;\r\n }\r\n};\r\nexport function makeMaskFromFormat(format, numberMaskChar) {\r\n return format.replace(/[a-z]/gi, numberMaskChar);\r\n}\r\n//MUI-4 dateFormatter\r\nexport const maskedDateFormatter = function (mask, numberMaskChar, refuse) {\r\n return function (value) {\r\n var result = '';\r\n var parsed = value.replace(refuse, '');\r\n if (parsed === '') {\r\n return parsed;\r\n }\r\n var i = 0;\r\n var n = 0;\r\n while (i < mask.length) {\r\n var maskChar = mask[i];\r\n if (maskChar === numberMaskChar && n < parsed.length) {\r\n var parsedChar = parsed[n];\r\n result += parsedChar;\r\n n += 1;\r\n } else {\r\n result += maskChar;\r\n }\r\n i += 1;\r\n }\r\n return result;\r\n };\r\n};\r\n\r\nexport const parseDigits = (input: string) =>\r\n (input.match(/\\d+/g) || []).join('');\r\n\r\nexport const formatDate = (input: string) => {\r\n const digits = parseDigits(input);\r\n const chars = digits.split('');\r\n let res = chars\r\n .reduce((r, v, index) => {\r\n return index === 2 || index === 4 ? `${r}/${v}` : `${r}${v}`;\r\n }, '')\r\n .substr(0, 10);\r\n return res;\r\n};\r\n\r\nexport const formatDateWithAppend = (input: string) => {\r\n const res = formatDate(input);\r\n\r\n if (input.endsWith('/')) {\r\n if (res.length === 2) {\r\n return `${res}/`;\r\n }\r\n\r\n if (res.length === 5) {\r\n return `${res}/`;\r\n }\r\n }\r\n return res;\r\n};\r\n\r\nexport const appendHyphen = v =>\r\n v.length === 2 || v.length === 5 ? `${v}/` : v;\r\nexport const addMask = string => {\r\n const digits = parseDigits(string);\r\n const days = digits.slice(0, 2).padEnd(2, '_');\r\n const months = digits.slice(2, 4).padEnd(2, '_');\r\n const years = digits.slice(4, 8).padEnd(4, '_');\r\n return `${days}-${months}-${years}`;\r\n};\r\n\r\nexport const dateStart: DateStartWith = dateUtils.dateFnsUtils.dateFormat\r\n .toLowerCase()\r\n .startsWith('m')\r\n ? 'month'\r\n : dateUtils.dateFnsUtils.dateFormat.toLowerCase().startsWith('d')\r\n ? 'day'\r\n : dateUtils.dateFnsUtils.dateFormat.toLowerCase().startsWith('y')\r\n ? 'year'\r\n : 'day';\r\n\r\nexport const dateSelection = (\r\n event: React.MouseEvent,\r\n maskFormats: DateTimeMask,\r\n) => {\r\n const target = event.target as HTMLInputElement;\r\n let dateStartFrom = maskFormats.dateStartFrom;\r\n // let selectionDirection = target.selectionDirection;\r\n let selectionStart = target.selectionStart;\r\n let selectionEnd = target.selectionEnd;\r\n if (!!target.value && target.value !== '') {\r\n if (dateStartFrom === 'year') {\r\n if (selectionEnd !== null) {\r\n if (selectionEnd <= 4) {\r\n if (selectionStart === 0 && selectionEnd === 4) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(0, 4);\r\n } else if (selectionEnd <= 7) {\r\n if (selectionStart === 5 && selectionEnd === 7) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(5, 7);\r\n } else {\r\n if (selectionStart === 8 && selectionEnd === 10) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(8, 10);\r\n }\r\n // target.setRangeText(target.value.substring(0, 2));\r\n }\r\n } else {\r\n if (selectionEnd !== null) {\r\n if (selectionEnd <= 2) {\r\n if (selectionStart === 0 && selectionEnd === 2) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(0, 2);\r\n } else if (selectionEnd <= 5) {\r\n if (selectionStart === 3 && selectionEnd === 5) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(3, 5);\r\n } else {\r\n if (selectionStart === 6 && selectionEnd === 10) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(6, 10);\r\n }\r\n // target.setRangeText(target.value.substring(0, 2));\r\n }\r\n }\r\n }\r\n};\r\nexport const timeSelection = (\r\n event: React.MouseEvent,\r\n maskFormats: DateTimeMask,\r\n) => {\r\n const target = event.target as HTMLInputElement;\r\n // let selectionDirection = target.selectionDirection;\r\n let selectionStart = target.selectionStart ?? 0;\r\n let selectionEnd = target.selectionEnd ?? 0;\r\n let oneLetterHour =\r\n maskFormats.hour.length === 1 && target.value.split(':')[0].length === 1;\r\n\r\n if (!!target.value && target.value !== '') {\r\n if (selectionEnd <= (oneLetterHour ? 1 : 2)) {\r\n if (selectionStart === 0 && selectionEnd === (oneLetterHour ? 1 : 2)) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(0, oneLetterHour ? 1 : 2);\r\n } else if (selectionEnd <= (oneLetterHour ? 4 : 5)) {\r\n if (\r\n selectionStart > (oneLetterHour ? 1 : 2) &&\r\n selectionEnd === (oneLetterHour ? 4 : 5)\r\n ) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(oneLetterHour ? 2 : 3, oneLetterHour ? 4 : 5);\r\n } else {\r\n if (target.value.length > (oneLetterHour ? 4 : 5)) {\r\n if (\r\n selectionStart === (oneLetterHour ? 5 : 6) &&\r\n selectionEnd === (oneLetterHour ? 7 : 8)\r\n ) {\r\n event.preventDefault();\r\n }\r\n target.setSelectionRange(oneLetterHour ? 5 : 6, oneLetterHour ? 7 : 8);\r\n } else {\r\n target.setSelectionRange(3, 5);\r\n }\r\n }\r\n }\r\n};\r\nexport const dateArrowSelection = (\r\n event: React.KeyboardEvent,\r\n arrows: 'left' | 'right',\r\n variant: 'date' | 'time',\r\n maskFormats: DateTimeMask,\r\n) => {\r\n const target = event.target as HTMLInputElement;\r\n let selectionStart = target.selectionStart ?? 0;\r\n let selectionEnd = target.selectionEnd ?? 0;\r\n let oneLetterHour =\r\n variant === 'time' &&\r\n maskFormats.hour.length === 1 &&\r\n target.value.split(':')[0].length === 1;\r\n let dateStartFrom = maskFormats.dateStartFrom;\r\n if (arrows === 'left') {\r\n if (!!target.value && target.value !== '') {\r\n if (variant === 'time') {\r\n if (selectionStart <= (oneLetterHour ? 2 : 3)) {\r\n target.setSelectionRange(0, oneLetterHour ? 1 : 2);\r\n } else if (\r\n selectionStart <= (oneLetterHour ? 5 : 6) &&\r\n selectionStart > (oneLetterHour ? 2 : 3)\r\n ) {\r\n target.setSelectionRange(\r\n oneLetterHour ? 2 : 3,\r\n oneLetterHour ? 4 : 5,\r\n );\r\n } else {\r\n if (target.value.length > (oneLetterHour ? 4 : 5)) {\r\n target.setSelectionRange(\r\n oneLetterHour ? 5 : 6,\r\n oneLetterHour ? 7 : 8,\r\n );\r\n } else {\r\n target.setSelectionRange(3, 5);\r\n }\r\n }\r\n } else {\r\n if (dateStartFrom === 'year') {\r\n if (selectionStart <= 6 && selectionStart > 4) {\r\n target.setSelectionRange(0, 4);\r\n } else if (selectionStart <= 8 && selectionStart > 5) {\r\n target.setSelectionRange(5, 7);\r\n } else {\r\n target.setSelectionRange(8, 10);\r\n }\r\n } else {\r\n if (selectionStart <= 3) {\r\n target.setSelectionRange(0, 2);\r\n } else if (selectionStart <= 6 && selectionStart > 3) {\r\n target.setSelectionRange(3, 5);\r\n } else {\r\n target.setSelectionRange(6, 10);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (arrows === 'right') {\r\n if (!!target.value && target.value !== '') {\r\n if (variant === 'time') {\r\n if (\r\n selectionEnd >= (oneLetterHour ? 1 : 2) &&\r\n selectionEnd < (oneLetterHour ? 4 : 5)\r\n ) {\r\n target.setSelectionRange(\r\n oneLetterHour ? 2 : 3,\r\n oneLetterHour ? 4 : 5,\r\n );\r\n } else if (selectionEnd >= (oneLetterHour ? 4 : 5)) {\r\n if (target.value.length > (oneLetterHour ? 4 : 5)) {\r\n target.setSelectionRange(\r\n oneLetterHour ? 5 : 6,\r\n oneLetterHour ? 7 : 8,\r\n );\r\n } else {\r\n target.setSelectionRange(3, 5);\r\n }\r\n } else {\r\n target.setSelectionRange(0, oneLetterHour ? 1 : 2);\r\n }\r\n } else {\r\n if (dateStartFrom === 'year') {\r\n if (selectionEnd >= 4 && selectionEnd < 7) {\r\n target.setSelectionRange(5, 7);\r\n } else if (selectionEnd >= 7) {\r\n target.setSelectionRange(8, 10);\r\n } else {\r\n target.setSelectionRange(0, 2);\r\n }\r\n } else {\r\n if (selectionEnd >= 2 && selectionEnd < 5) {\r\n target.setSelectionRange(3, 5);\r\n } else if (selectionEnd >= 5) {\r\n target.setSelectionRange(6, 10);\r\n } else {\r\n target.setSelectionRange(0, 2);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n};\r\nexport const getMaskedDateValue = (mask: DateTimeMask, value?: string) => {\r\n let singleValue = !!value && value.length === 1 ? value : undefined;\r\n return mask.dateStartFrom === 'day'\r\n ? `${!!singleValue ? singleValue : mask.day}${mask.dateSeparator}${\r\n mask.month\r\n }${mask.dateSeparator}${mask.year}`\r\n : mask.dateStartFrom === 'month'\r\n ? `${!!singleValue ? singleValue : mask.month}${mask.dateSeparator}${\r\n mask.day\r\n }${mask.dateSeparator}${mask.year}`\r\n : `${!!singleValue ? singleValue : mask.year}${mask.dateSeparator}${\r\n mask.month\r\n }${mask.dateSeparator}${mask.day}`;\r\n};\r\nexport const getMaskedTimeValue = (\r\n mask: DateTimeMask,\r\n ampm?: boolean,\r\n value?: string,\r\n) => {\r\n let separator = ':';\r\n // value only used when is a single character\r\n let hour = !!value && value.length === 1 ? value : undefined;\r\n return ampm\r\n ? `${!!hour ? hour : mask.hour}${separator}${mask.minute} ${mask.meridiem}`\r\n : `${!!hour ? hour : mask.hour}${separator}${mask.minute}`;\r\n};\r\nexport const formatingDate = (\r\n text: string,\r\n partChanged: 'day' | 'month' | 'year',\r\n maskFormat: DateTimeMask,\r\n prevValue: string,\r\n increment?: 'increase' | 'decrease',\r\n isPrevZero?: boolean,\r\n isSelectionChanged?: boolean,\r\n): FormatedResult => {\r\n let result = {\r\n value: prevValue,\r\n stayOnSelection: false,\r\n zeroPress: false,\r\n };\r\n let stayOnSelection = false;\r\n let newDate = prevValue;\r\n let separator = maskFormat.dateSeparator;\r\n let startedFrom = maskFormat.dateStartFrom;\r\n let zeroPress = false;\r\n if (text === '') {\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${maskFormat.day}${separator}${maskFormat.month}${separator}${maskFormat.year}`\r\n : maskFormat.dateStartFrom === 'month'\r\n ? `${maskFormat.month}${separator}${maskFormat.day}${separator}${maskFormat.year}`\r\n : `${maskFormat.year}${separator}${maskFormat.month}${separator}${maskFormat.day}`;\r\n } else {\r\n let parts = text.split(separator);\r\n let prevParts = prevValue.split(separator);\r\n if (partChanged === 'day') {\r\n let dayVal =\r\n startedFrom === 'day'\r\n ? parts[0]\r\n : startedFrom === 'month'\r\n ? parts[1]\r\n : parts[2];\r\n let prevDayVal =\r\n startedFrom === 'day'\r\n ? prevParts[0]\r\n : startedFrom === 'month'\r\n ? prevParts[1]\r\n : prevParts[2];\r\n if (dayVal === '') {\r\n stayOnSelection = true;\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${maskFormat.day}${separator}${parts[1]}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${maskFormat.day}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${parts[1]}${separator}${maskFormat.day}`;\r\n } else {\r\n if (\r\n dayVal.match(/[^\\d]+/gi) ||\r\n (dayVal === '0' &&\r\n !isNaN(parseInt(prevDayVal)) &&\r\n (parseInt(prevDayVal) > 3 || isSelectionChanged)) ||\r\n isNaN(parseInt(dayVal))\r\n ) {\r\n stayOnSelection = true;\r\n zeroPress = dayVal === '0';\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${prevDayVal}${separator}${parts[1]}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${prevDayVal}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${parts[1]}${separator}${prevDayVal}`;\r\n } else {\r\n let newVal = '';\r\n let dayInt = parseInt(dayVal);\r\n if (!!increment) {\r\n stayOnSelection = true;\r\n dayInt = increment === 'increase' ? dayInt + 1 : dayInt - 1;\r\n dayVal = dayInt.toString();\r\n if (dayInt <= 0) {\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${'31'}${separator}${parts[1]}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${'31'}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${parts[1]}${separator}${'31'}`;\r\n } else if (dayInt > 31) {\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${'01'}${separator}${parts[1]}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${'01'}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${parts[1]}${separator}${'01'}`;\r\n } else {\r\n newVal = dayInt < 10 ? `0${dayVal}` : dayVal;\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${newVal}${separator}${parts[1]}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${newVal}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${parts[1]}${separator}${newVal}`;\r\n }\r\n } else {\r\n if (prevDayVal === '' || prevDayVal === maskFormat.day) {\r\n newVal = `0${dayVal}`;\r\n stayOnSelection = dayInt <= 3;\r\n } else {\r\n let prevInt = parseInt(isPrevZero ? '0' : prevDayVal);\r\n if (prevInt.toString().length > 1) {\r\n newVal = `0${dayVal}`;\r\n stayOnSelection = dayInt <= 3;\r\n } else {\r\n if (prevInt > 3) {\r\n newVal = `0${dayVal}`;\r\n stayOnSelection = dayInt <= 3;\r\n } else {\r\n let comb = `${prevInt}${dayInt}`;\r\n if (parseInt(comb) > 31) {\r\n newVal = `0${dayVal}`;\r\n stayOnSelection = dayInt <= 3;\r\n } else {\r\n newVal = comb;\r\n }\r\n }\r\n }\r\n }\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${newVal}${separator}${parts[1]}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${newVal}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${parts[1]}${separator}${newVal}`;\r\n }\r\n }\r\n }\r\n return {\r\n value: newDate,\r\n stayOnSelection: stayOnSelection,\r\n zeroPress: zeroPress,\r\n };\r\n } else if (partChanged === 'month') {\r\n let monthVal =\r\n startedFrom === 'day'\r\n ? parts[1]\r\n : startedFrom === 'month'\r\n ? parts[0]\r\n : parts[1];\r\n let prevMonthVal =\r\n startedFrom === 'day'\r\n ? prevParts[1]\r\n : startedFrom === 'month'\r\n ? prevParts[0]\r\n : prevParts[1];\r\n\r\n // let monthArray = monthEntityArray;\r\n if (monthVal === '') {\r\n stayOnSelection = true;\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${maskFormat.month}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${maskFormat.month}${separator}${parts[1]}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${maskFormat.month}${separator}${parts[2]}`;\r\n } else {\r\n if (\r\n monthVal.match(/[^\\d]+/gi) ||\r\n (monthVal === '0' &&\r\n !isNaN(parseInt(prevMonthVal)) &&\r\n (parseInt(prevMonthVal) > 1 || isSelectionChanged)) ||\r\n isNaN(parseInt(monthVal))\r\n ) {\r\n stayOnSelection = true;\r\n zeroPress = monthVal === '0';\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${prevMonthVal}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${prevMonthVal}${separator}${parts[1]}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${prevMonthVal}${separator}${parts[2]}`;\r\n } else {\r\n let newVal = '';\r\n let monthInt = parseInt(monthVal);\r\n if (!!increment) {\r\n stayOnSelection = true;\r\n monthInt = increment === 'increase' ? monthInt + 1 : monthInt - 1;\r\n monthVal = monthInt.toString();\r\n\r\n if (monthInt <= 0) {\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${'12'}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${'12'}${separator}${parts[1]}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${'12'}${separator}${parts[2]}`;\r\n } else if (monthInt > 12) {\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${'01'}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${'01'}${separator}${parts[1]}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${'01'}${separator}${parts[2]}`;\r\n } else {\r\n newVal = monthInt < 10 ? `0${monthVal}` : monthVal;\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${newVal}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${newVal}${separator}${parts[1]}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${newVal}${separator}${parts[2]}`;\r\n }\r\n } else {\r\n if (prevMonthVal === '' || prevMonthVal === maskFormat.month) {\r\n newVal = `0${monthVal}`;\r\n stayOnSelection = monthInt <= 1;\r\n } else {\r\n let prevMonthInt = parseInt(isPrevZero ? '0' : prevMonthVal);\r\n if (prevMonthInt.toString().length > 1) {\r\n newVal = `0${monthVal}`;\r\n stayOnSelection = monthInt <= 1;\r\n } else {\r\n let comb = `${prevMonthInt}${monthInt}`;\r\n if (parseInt(comb) > 12) {\r\n newVal = `0${monthVal}`;\r\n stayOnSelection = monthInt <= 1;\r\n } else {\r\n newVal = comb;\r\n }\r\n // if (prevMonthInt === 1) {\r\n // let comb = `${prevMonthInt}${monthInt}`;\r\n // if (parseInt(comb) > 12) {\r\n // newVal = `0${monthVal}`;\r\n // stayOnSelection = monthInt <= 1;\r\n // } else {\r\n // newVal = comb;\r\n // }\r\n // } else {\r\n // newVal = `0${monthVal}`;\r\n // stayOnSelection = monthInt <= 1;\r\n // }\r\n }\r\n }\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${newVal}${separator}${parts[2]}`\r\n : startedFrom === 'month'\r\n ? `${newVal}${separator}${parts[1]}${separator}${parts[2]}`\r\n : `${parts[0]}${separator}${newVal}${separator}${parts[2]}`;\r\n }\r\n }\r\n }\r\n return {\r\n value: newDate,\r\n stayOnSelection: stayOnSelection,\r\n zeroPress: zeroPress,\r\n };\r\n } else if (partChanged === 'year') {\r\n let yearVal =\r\n startedFrom === 'day'\r\n ? parts[2]\r\n : startedFrom === 'month'\r\n ? parts[2]\r\n : parts[0];\r\n let prevYearVal =\r\n startedFrom === 'day'\r\n ? prevParts[2]\r\n : startedFrom === 'month'\r\n ? prevParts[2]\r\n : prevParts[0];\r\n if (yearVal === '') {\r\n stayOnSelection = true;\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${maskFormat.year}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${maskFormat.year}`\r\n : `${maskFormat.year}${separator}${parts[1]}${separator}${parts[2]}`;\r\n } else {\r\n if (\r\n yearVal.match(/[^\\d]+/gi) ||\r\n // yearVal === '0' ||\r\n isNaN(parseInt(yearVal))\r\n ) {\r\n stayOnSelection = true;\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${prevYearVal}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${prevYearVal}`\r\n : `${prevYearVal}${separator}${parts[1]}${separator}${parts[2]}`;\r\n } else {\r\n let newVal = '';\r\n let yearInt = parseInt(yearVal);\r\n if (!!increment) {\r\n stayOnSelection = true;\r\n yearInt = increment === 'increase' ? yearInt + 1 : yearInt - 1;\r\n yearVal = yearInt.toString();\r\n if (yearInt < 0) {\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${'9999'}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${'9999'}`\r\n : `${'9999'}${separator}${parts[1]}${separator}${parts[2]}`;\r\n } else if (yearInt > 9999) {\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${'0000'}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${'0000'}`\r\n : `${'0000'}${separator}${parts[1]}${separator}${parts[2]}`;\r\n } else {\r\n newVal =\r\n yearInt > 1000\r\n ? yearVal\r\n : yearInt > 100\r\n ? `0${yearVal}`\r\n : yearInt > 10\r\n ? `00${yearVal}`\r\n : `000${yearVal}`;\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${newVal}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${newVal}`\r\n : `${newVal}${separator}${parts[1]}${separator}${parts[2]}`;\r\n }\r\n } else {\r\n if (prevYearVal === undefined) {\r\n newVal =\r\n yearVal.length === 4\r\n ? yearVal\r\n : yearVal.length === 3\r\n ? `0${yearVal}`\r\n : yearVal.length === 2\r\n ? `00${yearVal}`\r\n : `000${yearVal}`;\r\n } else if (prevYearVal === '' || prevYearVal === maskFormat.year) {\r\n newVal = `000${yearVal}`;\r\n } else if (prevYearVal.startsWith('0')) {\r\n newVal = prevYearVal.padEnd(5, yearVal).slice(1, 5);\r\n } else {\r\n newVal = `000${yearVal}`;\r\n }\r\n newDate =\r\n startedFrom === 'day'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${newVal}`\r\n : startedFrom === 'month'\r\n ? `${parts[0]}${separator}${parts[1]}${separator}${newVal}`\r\n : `${newVal}${separator}${parts[1]}${separator}${parts[2]}`;\r\n }\r\n }\r\n }\r\n return {\r\n value: newDate,\r\n stayOnSelection: true,\r\n zeroPress: false,\r\n };\r\n } else {\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\nexport const formatingTime = (\r\n text: string,\r\n partChanged: 'hour' | 'minute' | 'meridiem',\r\n maskFormat: DateTimeMask,\r\n prevValue: string,\r\n increment?: 'increase' | 'decrease',\r\n ampm?: boolean,\r\n) => {\r\n let result = {\r\n value: prevValue,\r\n stayOnSelection: false,\r\n };\r\n let stayOnSelection = false;\r\n let newTime = prevValue;\r\n let separator = ':';\r\n if (text === '') {\r\n newTime = ampm\r\n ? `${maskFormat.hour}${separator}${maskFormat.minute} ${maskFormat.meridiem}`\r\n : `${maskFormat.hour}${separator}${maskFormat.minute}`;\r\n } else {\r\n let parts = text.split(separator);\r\n let hour = parts[0];\r\n let minute = ampm ? parts[1].split(' ')[0] : parts[1];\r\n let meridiem = ampm ? parts[1].split(' ')[1] : '';\r\n let prevParts = prevValue.split(separator);\r\n let prevHour = prevParts[0];\r\n let prevMinute = ampm ? prevParts[1].split(' ')[0] : prevParts[1];\r\n let prevMeridiem = ampm ? prevParts[1].split(' ')[1] : '';\r\n if (partChanged === 'hour') {\r\n if (hour === '') {\r\n stayOnSelection = true;\r\n newTime = ampm\r\n ? `${maskFormat.hour}${separator}${minute} ${meridiem}`\r\n : `${maskFormat.hour}${separator}${minute}`;\r\n } else {\r\n if (\r\n hour.match(/[^\\d]+/gi) ||\r\n (ampm &&\r\n ((hour === '0' &&\r\n !isNaN(parseInt(prevHour)) &&\r\n parseInt(prevHour) > 1) ||\r\n isNaN(parseInt(hour))))\r\n ) {\r\n stayOnSelection = true;\r\n newTime = ampm\r\n ? `${prevHour}${separator}${minute} ${meridiem}`\r\n : `${prevHour}${separator}${minute}`;\r\n } else {\r\n let newVal = '';\r\n let hourInt = parseInt(hour);\r\n if (!!increment) {\r\n stayOnSelection = true;\r\n hourInt = increment === 'increase' ? hourInt + 1 : hourInt - 1;\r\n hour = hourInt.toString();\r\n\r\n if (hourInt < 0 || (ampm && hourInt === 0)) {\r\n newTime = ampm\r\n ? `${'12'}${separator}${minute} ${meridiem}`\r\n : `${'23'}${separator}${minute}`;\r\n } else if (hourInt > (ampm ? 12 : 23)) {\r\n newTime = ampm\r\n ? `${\r\n maskFormat.hour.length === 1 ? '1' : '01'\r\n }${separator}${minute} ${meridiem}`\r\n : `${'00'}${separator}${minute}`;\r\n } else {\r\n newVal =\r\n hourInt < 10\r\n ? ampm\r\n ? maskFormat.hour.length === 1\r\n ? hour\r\n : `0${hour}`\r\n : `0${hour}`\r\n : hour;\r\n newTime = ampm\r\n ? `${newVal}${separator}${minute} ${meridiem}`\r\n : `${newVal}${separator}${minute}`;\r\n }\r\n } else {\r\n if (prevHour === '' || prevHour === maskFormat.hour) {\r\n newVal = ampm\r\n ? maskFormat.hour.length === 1\r\n ? `${hour}`\r\n : `0${hour}`\r\n : `0${hour}`;\r\n stayOnSelection = ampm ? hourInt <= 1 : hourInt <= 2;\r\n } else {\r\n let prevHourInt = parseInt(prevHour);\r\n if (prevHourInt.toString().length > 1) {\r\n newVal = ampm\r\n ? maskFormat.hour.length === 1\r\n ? `${hour}`\r\n : `0${hour}`\r\n : `0${hour}`;\r\n stayOnSelection = ampm ? hourInt <= 1 : hourInt <= 2;\r\n } else {\r\n if (\r\n (ampm && prevHourInt === 1) ||\r\n (!ampm && prevHourInt <= 2)\r\n ) {\r\n let comb = `${prevHourInt}${hourInt}`;\r\n if (ampm && parseInt(comb) > 12) {\r\n newVal =\r\n maskFormat.hour.length === 1 ? `${hour}` : `0${hour}`;\r\n stayOnSelection = hourInt <= 1;\r\n } else if (!ampm && parseInt(comb) > 23) {\r\n newVal = `0${hour}`;\r\n stayOnSelection = hourInt <= 2;\r\n } else {\r\n newVal = comb;\r\n }\r\n } else {\r\n newVal = ampm\r\n ? maskFormat.hour.length === 1\r\n ? `${hour}`\r\n : `0${hour}`\r\n : `0${hour}`;\r\n stayOnSelection = ampm ? hourInt <= 1 : hourInt <= 2;\r\n }\r\n }\r\n }\r\n newTime = ampm\r\n ? `${newVal}${separator}${minute} ${meridiem}`\r\n : `${newVal}${separator}${minute}`;\r\n }\r\n }\r\n }\r\n return {\r\n value: newTime,\r\n stayOnSelection: stayOnSelection,\r\n };\r\n }\r\n if (partChanged === 'minute') {\r\n if (minute === '') {\r\n stayOnSelection = true;\r\n newTime = ampm\r\n ? `${hour}${separator}${maskFormat.minute} ${meridiem}`\r\n : `${hour}${separator}${maskFormat.minute}`;\r\n } else {\r\n if (minute.match(/[^\\d]+/gi)) {\r\n stayOnSelection = true;\r\n newTime = ampm\r\n ? `${hour}${separator}${prevMinute} ${meridiem}`\r\n : `${hour}${separator}${prevMinute}`;\r\n } else {\r\n let newVal = '';\r\n let minuteInt = parseInt(minute);\r\n if (!!increment) {\r\n stayOnSelection = true;\r\n minuteInt =\r\n increment === 'increase' ? minuteInt + 1 : minuteInt - 1;\r\n minute = minuteInt.toString();\r\n\r\n if (minuteInt < 0) {\r\n newTime = ampm\r\n ? `${hour}${separator}${'59'} ${meridiem}`\r\n : `${hour}${separator}${'59'}`;\r\n } else if (minuteInt > 59) {\r\n newTime = ampm\r\n ? `${hour}${separator}${'00'} ${meridiem}`\r\n : `${hour}${separator}${'00'}`;\r\n } else {\r\n newVal = minuteInt < 10 ? `0${minute}` : minute;\r\n newTime = ampm\r\n ? `${hour}${separator}${newVal} ${meridiem}`\r\n : `${hour}${separator}${newVal}`;\r\n }\r\n } else {\r\n if (prevMinute === '' || prevMinute === maskFormat.minute) {\r\n newVal = `0${minute}`;\r\n stayOnSelection = minuteInt <= 5;\r\n } else {\r\n let prevMinuteInt = parseInt(prevMinute);\r\n if (prevMinuteInt.toString().length > 1) {\r\n newVal = `0${minute}`;\r\n stayOnSelection = minuteInt <= 5;\r\n } else {\r\n if (prevMinuteInt <= 5) {\r\n let comb = `${prevMinuteInt}${minuteInt}`;\r\n if (parseInt(comb) > 59) {\r\n newVal = `0${minute}`;\r\n stayOnSelection = minuteInt <= 5;\r\n } else {\r\n newVal = comb;\r\n }\r\n } else {\r\n newVal = `0${minute}`;\r\n stayOnSelection = minuteInt <= 5;\r\n }\r\n }\r\n }\r\n newTime = ampm\r\n ? `${hour}${separator}${newVal} ${meridiem}`\r\n : `${hour}${separator}${newVal}`;\r\n }\r\n }\r\n }\r\n return {\r\n value: newTime,\r\n stayOnSelection: stayOnSelection,\r\n };\r\n }\r\n if (ampm && partChanged === 'meridiem') {\r\n if (meridiem === '') {\r\n stayOnSelection = true;\r\n newTime = `${hour}${separator}${minute} ${maskFormat.meridiem}`;\r\n } else {\r\n if (meridiem.match(/[\\dap]+/gi) === null) {\r\n stayOnSelection = true;\r\n newTime = `${hour}${separator}${minute} ${prevMeridiem}`;\r\n } else {\r\n let newVal = '';\r\n if (!!increment) {\r\n stayOnSelection = true;\r\n newVal = prevMeridiem.toLowerCase().startsWith('p') ? 'AM' : 'PM';\r\n newTime = `${hour}${separator}${minute} ${newVal}`;\r\n } else {\r\n stayOnSelection = true;\r\n newVal = meridiem.toLowerCase().startsWith('p') ? 'PM' : 'AM';\r\n newTime = `${hour}${separator}${minute} ${newVal}`;\r\n }\r\n }\r\n }\r\n return {\r\n value: newTime,\r\n stayOnSelection: stayOnSelection,\r\n };\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport const getDisplayDate = (\r\n value: ParsableDate,\r\n format: string,\r\n utils: IUtils,\r\n isEmpty: boolean,\r\n props: Pick<\r\n BaseKeyboardPickerProps,\r\n 'invalidLabel' | 'emptyLabel' | 'labelFunc'\r\n >,\r\n) => {\r\n const { invalidLabel, emptyLabel, labelFunc } = props;\r\n var date =\r\n value === null || value === undefined\r\n ? ''\r\n : typeof value === 'object'\r\n ? new Date(value as Date)\r\n : typeof value === 'number'\r\n ? new Date(value)\r\n : dateUtils.dateOrStringToDate(value);\r\n let t = dateUtils.dateOrStringToDate(date);\r\n if (labelFunc) {\r\n return labelFunc(isEmpty ? null : t, invalidLabel || '');\r\n }\r\n if (isEmpty) {\r\n return emptyLabel || '';\r\n }\r\n return utils.isValid(date) ? utils.format(t, format) : invalidLabel;\r\n};\r\nexport const getParsableDate = (date: ParsableDate): Date | null => {\r\n var resDate =\r\n date === null || date === undefined\r\n ? null\r\n : typeof date === 'object'\r\n ? new Date(date as Date)\r\n : typeof date === 'number'\r\n ? new Date(date)\r\n : dateUtils.dateOrStringToDate(date);\r\n return resDate;\r\n};\r\n","import { PopperProps, Theme, Popper } from '@material-ui/core';\r\nimport styled from 'styled-components';\r\n// import { bookitColors } from 'styles/colors/bookitColors';\r\nimport { bookitShadows } from 'styles/shadows/bookitShadow';\r\n\r\nexport const StyledPicker = styled('div')(({ theme }) => ({\r\n '&.picker-root': {\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n '& .picker-date-input': {},\r\n // '& .picker-popper': {\r\n // zIndex: 1300,\r\n // '& .picker-paper': {\r\n // padding: '16px',\r\n // maxWidth: '360px',\r\n // borderRadius: '12px',\r\n // boxShadow: bookitShadows.shadowXL,\r\n // // background: bookitColors.grayscale.grayBackground,\r\n // '& .picker-header': {\r\n // // minHeight: '20px',\r\n // '& .picker-header-title': {},\r\n // },\r\n // '& .picker-content': {\r\n // display: 'flex',\r\n // flexDirection: 'column',\r\n // alignItems: 'center',\r\n // gap: '8px',\r\n // '& .picker-content-date': {\r\n // height: '56px',\r\n // width: '100%',\r\n // // padding: '12px',\r\n // },\r\n // '& .picker-buttons': {\r\n // display: 'flex',\r\n // flexDirection: 'row',\r\n // alignItems: 'center',\r\n // alignSelf: 'flex-start',\r\n // gap: '16px',\r\n // // paddingTop: '16px',\r\n // },\r\n // },\r\n // },\r\n // },\r\n },\r\n}));\r\n\r\nexport const PickerPopper = styled(\r\n ({\r\n theme,\r\n children,\r\n ...other\r\n }: {\r\n theme: Theme;\r\n children: React.ReactNode;\r\n } & PopperProps) => {children},\r\n)({\r\n '&.picker-popper': {\r\n zIndex: 1300,\r\n '& .picker-paper': {\r\n padding: '16px',\r\n maxWidth: '360px',\r\n borderRadius: '12px',\r\n boxShadow: bookitShadows.shadowXL,\r\n // background: bookitColors.grayscale.grayBackground,\r\n '& .picker-header': {\r\n // minHeight: '20px',\r\n '& .picker-header-title': {},\r\n },\r\n '& .picker-content': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n gap: '8px',\r\n '& .picker-content-date': {\r\n height: '56px',\r\n width: '100%',\r\n // padding: '12px',\r\n },\r\n '& .picker-buttons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n alignSelf: 'flex-start',\r\n gap: '16px',\r\n // paddingTop: '16px',\r\n },\r\n },\r\n },\r\n },\r\n});\r\n\r\n// `\r\n// z-index: ${props => props.theme.zIndex.modal};\r\n// height: 100vh;\r\n// border-left: 1px solid ${bookitColors.grayscale.grayBorders};\r\n// &.rootopen {\r\n// width: 100%;\r\n// transform: unset;\r\n// &.mobileroot {\r\n// padding-top: 0px;\r\n// }\r\n// }\r\n// &.rootclose {\r\n// width: 100vw;\r\n// &.mobileroot {\r\n// inset-block: 50px auto;\r\n// height: calc(100% - 50px);\r\n// padding-top: 0px;\r\n// }\r\n// }\r\n// @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\r\n// &.rootclose {\r\n// width: 100%;\r\n// min-width: 600px;\r\n// }\r\n// }\r\n// @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n// &.rootclose {\r\n// width: 100%;\r\n// min-width: 370px;\r\n// }\r\n// }\r\n// @media (min-width: ${props => props.theme.breakpoints.values.md}px) {\r\n// &.rootclose {\r\n// width: ${props => props.sidePanelWidth}px;\r\n// }\r\n// }\r\n// & .paper {\r\n// background: ${props => props.theme.palette.common.background};\r\n// border-radius: 0;\r\n// max-height: 100vh;\r\n// height: auto;\r\n// margin: 0;\r\n// box-shadow: unset;\r\n// }\r\n// @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n// & .paper {\r\n// max-width: 100%;\r\n// }\r\n// }\r\n// `;\r\n","/**\r\n *\r\n * DaysByMonthPicker\r\n *\r\n */\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { GetOptionsFilterFunction } from 'utils/enumKeys';\r\n\r\nexport interface DaysByMonthPickerProps\r\n extends Omit>, 'getOptions'> {\r\n month?: number | null;\r\n date?: Date | string | null;\r\n}\r\nexport const daysEntityArray = Array.from({ length: 31 }, (_, i) => {\r\n const x = i + 1;\r\n return {\r\n Id: x,\r\n Name: x.toString(),\r\n } as Entity;\r\n});\r\n\r\nexport const defaultDayValue =\r\n daysEntityArray.find(f => f.Id === dateUtils.getDate(new Date())) ??\r\n ({\r\n Id: dateUtils.getDate(new Date()),\r\n Name: dateUtils.getDate(new Date()).toString(),\r\n } as Entity);\r\nexport const getDayEntityFromDate = (date?: Date | string | null) => {\r\n if (date === null || date === undefined) {\r\n return daysEntityArray[0];\r\n } else {\r\n let toDate = dateUtils.dateOrStringToDate(date);\r\n return (\r\n daysEntityArray.find(f => f.Id === toDate.getDate()) ?? daysEntityArray[0]\r\n );\r\n }\r\n};\r\n\r\nexport const initDaysData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n daysEntityArray.filter(item => {\r\n return item.Id.toString() === initval.toString();\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nexport function DaysByMonthPicker(props: DaysByMonthPickerProps) {\r\n const getOptions = React.useMemo(() => {\r\n let maxDay = 31;\r\n if (props.month !== null && props.month !== undefined) {\r\n let monthDate = dateUtils.setMonth(new Date(), props.month);\r\n maxDay = dateUtils.lastDayOfMonth(monthDate).getDate();\r\n } else if (props.date !== null && props.date !== undefined) {\r\n let monthDate = dateUtils.dateOrStringToDate(props.date);\r\n maxDay = dateUtils.lastDayOfMonth(monthDate).getDate();\r\n }\r\n let items = daysEntityArray.filter(f => f.Id <= maxDay);\r\n return GetOptionsFilterFunction(items);\r\n }, [props.date, props.month]);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * MonthOfYearPicker\r\n *\r\n */\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { GetOptionsFilterFunction } from 'utils/enumKeys';\r\n\r\nexport interface MonthEntity extends Entity {\r\n FullName: string;\r\n MonthId: number;\r\n}\r\nexport interface MonthOfYearPickerProps\r\n extends Omit>, 'getOptions'> {\r\n date?: Date | string | null;\r\n}\r\nexport const monthEntityArray = Array.from({ length: 12 }, (_, i) => {\r\n const x = i;\r\n return {\r\n Id: x,\r\n Name: dateUtils.format(\r\n dateUtils.setMonth(new Date(), x),\r\n dateUtils.DateIOFormats.monthShort,\r\n ),\r\n FullName: dateUtils.format(\r\n dateUtils.setMonth(new Date(), x),\r\n dateUtils.DateIOFormats.month,\r\n ),\r\n MonthId: x + 1,\r\n } as Entity;\r\n});\r\n\r\nexport const defaultMonthValue =\r\n monthEntityArray.find(f => f.Id === dateUtils.getMonth(new Date())) ??\r\n ({\r\n Id: dateUtils.getMonth(new Date()),\r\n Name: dateUtils.format(new Date(), dateUtils.DateIOFormats.monthShort),\r\n FullName: dateUtils.format(new Date(), dateUtils.DateIOFormats.month),\r\n MonthId: dateUtils.getMonth(new Date()) + 1,\r\n } as Entity);\r\nexport const getMonthEntityFromDate = (date?: Date | string | null) => {\r\n if (date === null || date === undefined) {\r\n return defaultMonthValue;\r\n } else {\r\n let toDate = dateUtils.dateOrStringToDate(date);\r\n return (\r\n monthEntityArray.find(f => f.Id === toDate.getMonth()) ??\r\n defaultMonthValue\r\n );\r\n }\r\n};\r\nexport const initMonthData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n monthEntityArray.filter(item => {\r\n return item.Id.toString() === initval.toString();\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nexport function MonthOfYearPicker(props: MonthOfYearPickerProps) {\r\n const getOptions = React.useMemo(() => {\r\n let items = monthEntityArray;\r\n\r\n return GetOptionsFilterFunction(items, (f, search) =>\r\n (f as MonthEntity).MonthId.toString()\r\n .toLowerCase()\r\n .startsWith(search.toLowerCase()),\r\n );\r\n }, []);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * YearsPicker\r\n *\r\n */\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { GetOptionsFilterFunction } from 'utils/enumKeys';\r\n\r\nexport interface YearsPickerProps\r\n extends Omit>, 'getOptions'> {\r\n date?: Date | string | null;\r\n}\r\nexport const MIN_YEAR: number = 2001;\r\nexport const MAX_YEAR: number = dateUtils.getYear(\r\n dateUtils.addYears(new Date(), 10),\r\n);\r\nexport const yearsEntityArray = Array.from(\r\n { length: MAX_YEAR - MIN_YEAR },\r\n (_, i) => {\r\n const x = MIN_YEAR + i;\r\n return {\r\n Id: x,\r\n Name: x.toString(),\r\n } as Entity;\r\n },\r\n);\r\n\r\nexport const initYearsData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n yearsEntityArray.filter(item => {\r\n return item.Id.toString() === initval.toString();\r\n }),\r\n );\r\n });\r\n }\r\n};\r\nexport const defaultYearValue =\r\n yearsEntityArray.find(f => f.Id === dateUtils.getYear(new Date())) ??\r\n ({\r\n Id: dateUtils.getYear(new Date()),\r\n Name: dateUtils.getYear(new Date()).toString(),\r\n } as Entity);\r\nexport const getYearEntityFromDate = (date?: Date | string | null) => {\r\n if (date === null || date === undefined) {\r\n return defaultYearValue;\r\n } else {\r\n let toDate = dateUtils.dateOrStringToDate(date);\r\n return (\r\n yearsEntityArray.find(f => f.Id === dateUtils.getYear(toDate)) ??\r\n defaultYearValue\r\n );\r\n }\r\n};\r\nexport function YearsPicker(props: YearsPickerProps) {\r\n const getOptions = React.useMemo(() => {\r\n let items = yearsEntityArray;\r\n return GetOptionsFilterFunction(items);\r\n }, []);\r\n return (\r\n \r\n );\r\n}\r\n","import { BaseTextFieldProps, capitalize } from '@material-ui/core';\r\nimport { BaseDatePickerProps, useUtils } from '@material-ui/pickers';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport FormControl from 'app/components/Forms/FormControls/FormControl';\r\nimport FormHelperText from 'app/components/Forms/FormControls/FormHelperText';\r\nimport { InputLabel } from '@material-ui/core';\r\nimport {\r\n DaysByMonthPicker,\r\n defaultDayValue,\r\n getDayEntityFromDate,\r\n} from 'app/components/pickers/StaticOptionsPickers/DaysByMonthPicker';\r\nimport {\r\n defaultMonthValue,\r\n getMonthEntityFromDate,\r\n MonthOfYearPicker,\r\n} from 'app/components/pickers/StaticOptionsPickers/MonthOfYearPicker';\r\nimport {\r\n defaultYearValue,\r\n getYearEntityFromDate,\r\n YearsPicker,\r\n} from 'app/components/pickers/StaticOptionsPickers/YearsPicker';\r\nimport * as React from 'react';\r\n\r\nimport clsx from 'clsx';\r\nimport { Entity } from 'types/common';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { DateValidationProps } from '@material-ui/pickers/_helpers/text-field-helper';\r\nimport { validateDate } from 'app/components/DatePicker/utils/pickerDateValidate';\r\nimport { ParsableDate } from '@material-ui/pickers/constants/prop-types';\r\n\r\nexport interface DateDropDownValidationProps\r\n extends DateValidationProps,\r\n Pick<\r\n BaseDatePickerProps,\r\n | 'minDate'\r\n | 'maxDate'\r\n | 'disablePast'\r\n | 'disableFuture'\r\n | 'strictCompareDates'\r\n > {}\r\nexport interface DateDropDownProps\r\n extends DateDropDownValidationProps,\r\n Pick<\r\n BaseTextFieldProps,\r\n | 'fullWidth'\r\n | 'helperText'\r\n | 'required'\r\n | 'disabled'\r\n | 'name'\r\n | 'id'\r\n | 'label'\r\n | 'error'\r\n | 'size'\r\n > {\r\n value?: Date | string | null;\r\n onChange: (\r\n date: MaterialUiPickersDate | null,\r\n withCompletion?: boolean,\r\n ) => void;\r\n inputVariant?: 'filled' | 'standard' | 'outlined';\r\n info?: string;\r\n className?: string;\r\n dayDisabled?: boolean;\r\n monthDisabled?: boolean;\r\n yearDisabled?: boolean;\r\n onError?: (\r\n error: React.ReactNode,\r\n value: MaterialUiPickersDate | ParsableDate,\r\n ) => void;\r\n}\r\n\r\nexport function DateDropDown(props: DateDropDownProps) {\r\n const {\r\n value,\r\n onChange,\r\n inputVariant,\r\n id,\r\n name,\r\n fullWidth,\r\n helperText,\r\n disabled,\r\n label,\r\n error,\r\n size,\r\n dayDisabled,\r\n monthDisabled,\r\n yearDisabled,\r\n onError,\r\n } = props;\r\n const { newDate, getOffsetDate } = useSystemDate();\r\n const utils = useUtils();\r\n const inputLabelId = label && id ? `${id}-label` : undefined;\r\n const helperTextId = id ? `${id}-helper-text` : undefined;\r\n const sizeClass = `inputSize${capitalize(size ?? 'large')}`;\r\n const dateTimeValue = React.useMemo(() => {\r\n return value;\r\n }, [value]);\r\n const [dateSelected, setDateSelected] = React.useState<\r\n Date | string | null | undefined\r\n >(value);\r\n const [daySelected, setDaySelected] = React.useState(\r\n getDayEntityFromDate(dateTimeValue),\r\n );\r\n const [monthSelected, setMonthSelected] = React.useState(\r\n getMonthEntityFromDate(dateTimeValue),\r\n );\r\n const [yearSelected, setYearSelected] = React.useState(\r\n getYearEntityFromDate(dateTimeValue),\r\n );\r\n const [innerError, setInnerError] = React.useState<\r\n React.ReactNode | undefined\r\n >(undefined);\r\n const [isYearOpen, setIsYearOpen] = React.useState(false);\r\n const [isMonthOpen, setIsMonthOpen] = React.useState(false);\r\n const [isDayOpen, setIsDayOpen] = React.useState(false);\r\n const someOpen = React.useMemo(() => {\r\n return isYearOpen || isMonthOpen || isDayOpen;\r\n }, [isDayOpen, isMonthOpen, isYearOpen]);\r\n // const dateStart = React.useMemo(() => {\r\n // return utils.dateFormat.toLowerCase().startsWith('m')\r\n // ? 'fromMonth'\r\n // : utils.dateFormat.toLowerCase().startsWith('d')\r\n // ? 'fromDay'\r\n // : utils.dateFormat.toLowerCase().startsWith('y')\r\n // ? 'fromYear'\r\n // : 'fromDay';\r\n // }, [utils.dateFormat]);\r\n React.useEffect(() => {\r\n setDaySelected(() => getDayEntityFromDate(dateTimeValue));\r\n setMonthSelected(() => getMonthEntityFromDate(dateTimeValue));\r\n setYearSelected(() => getYearEntityFromDate(dateTimeValue));\r\n }, [dateTimeValue]);\r\n\r\n React.useEffect(() => {\r\n if (dateSelected !== null && dateSelected !== undefined) {\r\n let error = validateDate(\r\n daySelected.Id,\r\n monthSelected.Id,\r\n yearSelected.Id,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n dateSelected,\r\n );\r\n if (!!error) {\r\n setInnerError(error);\r\n if (onError) {\r\n onError(error, dateSelected);\r\n }\r\n } else {\r\n setInnerError('');\r\n if (onError) {\r\n onError('', dateSelected);\r\n }\r\n }\r\n } else {\r\n setInnerError('');\r\n if (onError) {\r\n onError('', null);\r\n }\r\n }\r\n }, [\r\n dateSelected,\r\n daySelected.Id,\r\n monthSelected.Id,\r\n onError,\r\n props.disableFuture,\r\n props.disablePast,\r\n props.invalidDateMessage,\r\n props.maxDate,\r\n props.maxDateMessage,\r\n props.minDate,\r\n props.minDateMessage,\r\n props.strictCompareDates,\r\n utils,\r\n yearSelected.Id,\r\n ]);\r\n const handleChange = React.useCallback(\r\n (day: number, month: number, year: number, withCompletion?: boolean) => {\r\n if (dateSelected !== null && dateSelected !== undefined) {\r\n let date = dateUtils.dateOrStringToDate(dateSelected);\r\n let finalDate = dateUtils.set(getOffsetDate(date), {\r\n year: year,\r\n month: month,\r\n date: day,\r\n });\r\n let hasError = validateDate(\r\n day,\r\n month,\r\n year,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n finalDate,\r\n );\r\n if (!hasError) {\r\n onChange(finalDate, withCompletion);\r\n }\r\n } else {\r\n let finalDate = dateUtils.set(newDate(), {\r\n year: year,\r\n month: month,\r\n date: day,\r\n });\r\n setDateSelected(finalDate);\r\n let hasError = validateDate(\r\n day,\r\n month,\r\n year,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n finalDate,\r\n );\r\n if (!hasError) {\r\n onChange(finalDate, withCompletion);\r\n }\r\n }\r\n },\r\n [\r\n dateSelected,\r\n getOffsetDate,\r\n newDate,\r\n onChange,\r\n props.disableFuture,\r\n props.disablePast,\r\n props.invalidDateMessage,\r\n props.maxDate,\r\n props.maxDateMessage,\r\n props.minDate,\r\n props.minDateMessage,\r\n props.strictCompareDates,\r\n utils,\r\n ],\r\n );\r\n const handleDayChange = React.useCallback(\r\n (val: Entity) => {\r\n setDaySelected(val);\r\n handleChange(val.Id, monthSelected.Id, yearSelected.Id);\r\n },\r\n [handleChange, monthSelected.Id, yearSelected.Id],\r\n );\r\n const handleMonthChange = React.useCallback(\r\n (val: Entity) => {\r\n setMonthSelected(val);\r\n handleChange(daySelected.Id, val.Id, yearSelected.Id);\r\n },\r\n [daySelected.Id, handleChange, yearSelected.Id],\r\n );\r\n const handleYearChange = React.useCallback(\r\n (val: Entity) => {\r\n setYearSelected(val);\r\n handleChange(daySelected.Id, monthSelected.Id, val.Id);\r\n },\r\n [daySelected.Id, handleChange, monthSelected.Id],\r\n );\r\n return (\r\n \r\n ) => {\r\n const target = event.target as any; // as HTMLInputElement;\r\n\r\n if (event.key === 'Enter') {\r\n if (!!target && target.nodeName === 'INPUT') {\r\n if (!someOpen && !innerError) {\r\n handleChange(\r\n daySelected.Id,\r\n monthSelected.Id,\r\n yearSelected.Id,\r\n true,\r\n );\r\n }\r\n }\r\n }\r\n }}\r\n >\r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n

\r\n handleDayChange(day ?? defaultDayValue)}\r\n id={`${id ?? 'dayId'}_day`}\r\n name={`${name ?? 'dayName'}_day`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || dayDisabled}\r\n ariaLabel={`${label ?? 'day'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n autoFocus={true}\r\n setSomeOpen={setIsDayOpen}\r\n />\r\n handleMonthChange(month ?? defaultMonthValue)}\r\n id={`${id ?? 'monthId'}_month`}\r\n name={`${name ?? 'monthName'}_month`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || monthDisabled}\r\n ariaLabel={`${label ?? 'month'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n setSomeOpen={setIsMonthOpen}\r\n //autoFocus={dateStart === 'fromMonth'}\r\n />\r\n handleYearChange(year ?? defaultYearValue)}\r\n id={`${id ?? 'yearId'}_year`}\r\n name={`${name ?? 'yearName'}_year`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || yearDisabled}\r\n ariaLabel={`${label ?? 'year'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n setSomeOpen={setIsYearOpen}\r\n //autoFocus={dateStart === 'fromYear'}\r\n />\r\n
\r\n {/*
\r\n {dateStart === 'fromYear' ? (\r\n \r\n handleYearChange(year ?? defaultYearValue)}\r\n id={`${id ?? 'yearId'}_year`}\r\n name={`${name ?? 'yearName'}_year`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || yearDisabled}\r\n ariaLabel={`${label ?? 'year'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n autoFocus={true}\r\n />\r\n \r\n handleMonthChange(month ?? defaultMonthValue)\r\n }\r\n id={`${id ?? 'monthId'}_month`}\r\n name={`${name ?? 'monthName'}_month`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || monthDisabled}\r\n ariaLabel={`${label ?? 'month'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n />\r\n handleDayChange(day ?? defaultDayValue)}\r\n id={`${id ?? 'dayId'}_day`}\r\n name={`${name ?? 'dayName'}_day`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || dayDisabled}\r\n ariaLabel={`${label ?? 'day'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n />\r\n \r\n ) : dateStart === 'fromMonth' ? (\r\n \r\n \r\n handleMonthChange(month ?? defaultMonthValue)\r\n }\r\n id={`${id ?? 'monthId'}_month`}\r\n name={`${name ?? 'monthName'}_month`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || monthDisabled}\r\n ariaLabel={`${label ?? 'month'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n autoFocus={true}\r\n />\r\n handleDayChange(day ?? defaultDayValue)}\r\n id={`${id ?? 'dayId'}_day`}\r\n name={`${name ?? 'dayName'}_day`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || dayDisabled}\r\n ariaLabel={`${label ?? 'day'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n />\r\n handleYearChange(year ?? defaultYearValue)}\r\n id={`${id ?? 'yearId'}_year`}\r\n name={`${name ?? 'yearName'}_year`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || yearDisabled}\r\n ariaLabel={`${label ?? 'year'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n />\r\n \r\n ) : (\r\n \r\n handleDayChange(day ?? defaultDayValue)}\r\n id={`${id ?? 'dayId'}_day`}\r\n name={`${name ?? 'dayName'}_day`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || dayDisabled}\r\n ariaLabel={`${label ?? 'day'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n autoFocus={true}\r\n />\r\n \r\n handleMonthChange(month ?? defaultMonthValue)\r\n }\r\n id={`${id ?? 'monthId'}_month`}\r\n name={`${name ?? 'monthName'}_month`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || monthDisabled}\r\n ariaLabel={`${label ?? 'month'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n />\r\n handleYearChange(year ?? defaultYearValue)}\r\n id={`${id ?? 'yearId'}_year`}\r\n name={`${name ?? 'yearName'}_year`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || yearDisabled}\r\n ariaLabel={`${label ?? 'year'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n />\r\n \r\n )}\r\n
*/}\r\n {(!!helperText || Boolean(innerError)) && (\r\n \r\n {helperText || innerError}\r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * HoursPicker\r\n *\r\n */\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { GetOptionsFilterFunction } from 'utils/enumKeys';\r\n\r\nexport interface HoursPickerProps\r\n extends Omit>, 'getOptions'> {\r\n useAmPm?: boolean;\r\n}\r\nexport const hoursEntityArray12 = Array.from({ length: 12 }, (_, i) => {\r\n const x = i + 1;\r\n return {\r\n Id: x,\r\n Name: x.toString(),\r\n } as Entity;\r\n});\r\nexport const hoursEntityArray24 = Array.from({ length: 24 }, (_, i) => {\r\n const x = i;\r\n return {\r\n Id: x,\r\n Name: x.toString(),\r\n } as Entity;\r\n});\r\n\r\nexport const defaultHourValue12 =\r\n hoursEntityArray12.find(\r\n f => f.Id === dateUtils.getMeridiemHours(new Date()),\r\n ) ??\r\n ({\r\n Id: dateUtils.getMeridiemHours(new Date()),\r\n Name: dateUtils.getMeridiemHours(new Date()).toString(),\r\n } as Entity);\r\nexport const defaultHourValue24 =\r\n hoursEntityArray24.find(f => f.Id === dateUtils.getHours(new Date())) ??\r\n ({\r\n Id: dateUtils.getHours(new Date()),\r\n Name: dateUtils.getHours(new Date()).toString(),\r\n } as Entity);\r\nexport const getHoursEntityFromDate = (\r\n ampm: boolean,\r\n date?: Date | string | null,\r\n) => {\r\n if (date === null || date === undefined) {\r\n return ampm ? defaultHourValue12 : defaultHourValue24;\r\n } else {\r\n let toDate = dateUtils.dateOrStringToDate(date);\r\n return ampm\r\n ? hoursEntityArray12.find(\r\n f => f.Id === dateUtils.getMeridiemHours(toDate),\r\n ) ?? defaultHourValue12\r\n : hoursEntityArray24.find(f => f.Id === toDate.getHours()) ??\r\n defaultHourValue24;\r\n }\r\n};\r\nexport const initHoursData = (\r\n initval: number | string | undefined,\r\n ampm?: boolean,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n ampm\r\n ? hoursEntityArray12.filter(item => {\r\n return item.Id.toString() === initval.toString();\r\n })\r\n : hoursEntityArray24.filter(item => {\r\n return item.Id.toString() === initval.toString();\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nexport function HoursPicker(props: HoursPickerProps) {\r\n const getOptions = React.useMemo(() => {\r\n let items = props.useAmPm ? hoursEntityArray12 : hoursEntityArray24;\r\n return GetOptionsFilterFunction(items);\r\n }, [props.useAmPm]);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * MinutesPicker\r\n *\r\n */\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { GetOptionsFilterFunction } from 'utils/enumKeys';\r\n\r\nexport interface MinutesPickerProps\r\n extends Omit>, 'getOptions'> {\r\n minutesStep?: number;\r\n}\r\nexport const minutesEntityArray = Array.from({ length: 60 }, (_, i) => {\r\n const x = i;\r\n return {\r\n Id: x,\r\n Name: x.toString(),\r\n } as Entity;\r\n});\r\n\r\nexport const defaultMinutes =\r\n minutesEntityArray.find(f => f.Id === dateUtils.getMinutes(new Date())) ??\r\n ({\r\n Id: dateUtils.getMinutes(new Date()),\r\n Name: dateUtils.getMinutes(new Date()).toString(),\r\n } as Entity);\r\n\r\nexport const getMinutesEntityFromDate = (\r\n date?: Date | string | null,\r\n minutesStep?: number,\r\n) => {\r\n if (date === null || date === undefined) {\r\n return defaultMinutes;\r\n } else {\r\n let toDate = dateUtils.dateOrStringToDate(date);\r\n return (\r\n minutesEntityArray.find(f => f.Id === toDate.getMinutes()) ??\r\n defaultMinutes\r\n );\r\n }\r\n};\r\nexport const initMinutesData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n minutesEntityArray.filter(item => {\r\n return item.Id.toString() === initval.toString();\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nexport function MinutesPicker(props: MinutesPickerProps) {\r\n const { minutesStep, mini, size, id, value, ...other } = props;\r\n const getOptions = React.useMemo(() => {\r\n let items =\r\n !!minutesStep && minutesStep > 0 && minutesStep <= 30\r\n ? minutesEntityArray.filter(f => f.Id % minutesStep === 0)\r\n : minutesEntityArray;\r\n return GetOptionsFilterFunction(items);\r\n }, [minutesStep]);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AmPmPicker\r\n *\r\n */\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { GetOptionsFilterFunction } from 'utils/enumKeys';\r\n\r\nexport interface AmPmPickerProps\r\n extends Omit>, 'getOptions'> {}\r\nexport const AmPmEntityArray = [\r\n {\r\n Id: 'am',\r\n Name: 'AM',\r\n },\r\n {\r\n Id: 'pm',\r\n Name: 'PM',\r\n },\r\n] as Entity[];\r\n\r\nexport const defaultAmPm = AmPmEntityArray[0];\r\n// AmPmEntityArray.find(f => f.Id === dateUtils.getMinutes(new Date())) ??\r\n// ({\r\n// Id: dateUtils.getMinutes(new Date()),\r\n// Name: dateUtils.getMinutes(new Date()).toString(),\r\n// } as Entity);\r\n\r\nexport const getAmPmEntityFromDate = (date?: Date | string | null) => {\r\n if (date === null || date === undefined) {\r\n return AmPmEntityArray[0];\r\n } else {\r\n let meridiem = dateUtils.getMeridiem(date);\r\n return AmPmEntityArray.find(f => f.Id === meridiem) ?? AmPmEntityArray[0];\r\n }\r\n};\r\nexport const initAmPmData = (\r\n initval: string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n AmPmEntityArray.filter(item => {\r\n return item.Id.toString() === initval.toString();\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nexport function AmPmPicker(props: AmPmPickerProps) {\r\n const getOptions = React.useMemo(() => {\r\n let items = AmPmEntityArray;\r\n return GetOptionsFilterFunction(items);\r\n }, []);\r\n return (\r\n \r\n );\r\n}\r\n","import { BaseTextFieldProps, capitalize } from '@material-ui/core';\r\nimport { BaseTimePickerProps, useUtils } from '@material-ui/pickers';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport FormControl from 'app/components/Forms/FormControls/FormControl';\r\nimport FormHelperText from 'app/components/Forms/FormControls/FormHelperText';\r\nimport { InputLabel } from '@material-ui/core';\r\nimport * as React from 'react';\r\n\r\nimport clsx from 'clsx';\r\nimport { Entity } from 'types/common';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { validateError } from 'app/components/DatePicker/utils/pickerDateValidate';\r\nimport { ParsableDate } from '@material-ui/pickers/constants/prop-types';\r\nimport { DateDropDownValidationProps } from '../DateDropDown';\r\nimport {\r\n defaultHourValue12,\r\n defaultHourValue24,\r\n getHoursEntityFromDate,\r\n HoursPicker,\r\n} from 'app/components/pickers/StaticOptionsPickers/HoursPicker';\r\nimport {\r\n defaultMinutes,\r\n getMinutesEntityFromDate,\r\n MinutesPicker,\r\n} from 'app/components/pickers/StaticOptionsPickers/MinutesPicker';\r\nimport {\r\n AmPmPicker,\r\n defaultAmPm,\r\n getAmPmEntityFromDate,\r\n} from 'app/components/pickers/StaticOptionsPickers/AmPmPicker';\r\n\r\nexport interface TimeDropDownProps\r\n extends DateDropDownValidationProps,\r\n BaseTimePickerProps,\r\n Pick<\r\n BaseTextFieldProps,\r\n | 'fullWidth'\r\n | 'helperText'\r\n | 'required'\r\n | 'disabled'\r\n | 'name'\r\n | 'id'\r\n | 'label'\r\n | 'error'\r\n | 'size'\r\n > {\r\n value?: Date | string | null;\r\n onChange: (\r\n date: MaterialUiPickersDate | null,\r\n withCompletion?: boolean,\r\n ) => void;\r\n inputVariant?: 'filled' | 'standard' | 'outlined';\r\n info?: string;\r\n className?: string;\r\n hoursDisabled?: boolean;\r\n minutesDisabled?: boolean;\r\n onError?: (\r\n error: React.ReactNode,\r\n value: MaterialUiPickersDate | ParsableDate,\r\n ) => void;\r\n}\r\n\r\nexport function TimeDropDown(props: TimeDropDownProps) {\r\n const {\r\n value,\r\n onChange,\r\n inputVariant,\r\n id,\r\n name,\r\n fullWidth,\r\n helperText,\r\n disabled,\r\n label,\r\n error,\r\n size,\r\n hoursDisabled,\r\n minutesDisabled,\r\n ampm,\r\n minutesStep,\r\n onError,\r\n } = props;\r\n const { newDate } = useSystemDate();\r\n const utils = useUtils();\r\n const inputLabelId = label && id ? `${id}-label` : undefined;\r\n const helperTextId = id ? `${id}-helper-text` : undefined;\r\n const sizeClass = `inputSize${capitalize(size ?? 'large')}`;\r\n const dateTimeValue = React.useMemo(() => {\r\n return value;\r\n }, [value]);\r\n const [dateSelected, setDateSelected] = React.useState<\r\n Date | string | null | undefined\r\n >(value);\r\n const [hoursSelected, setHoursSelected] = React.useState(\r\n getHoursEntityFromDate(ampm ?? false, dateTimeValue),\r\n );\r\n const [minutesSelected, setMinutesSelected] = React.useState(\r\n getMinutesEntityFromDate(dateTimeValue),\r\n );\r\n const [ampmSelected, setAmpmSelected] = React.useState(\r\n getAmPmEntityFromDate(dateTimeValue),\r\n );\r\n const [isHourOpen, setIsHourOpen] = React.useState(false);\r\n const [isMinuteOpen, setIsMinuteOpen] = React.useState(false);\r\n const [isAmPmOpen, setIsAmPmOpen] = React.useState(false);\r\n const someOpen = React.useMemo(() => {\r\n return isHourOpen || isMinuteOpen || isAmPmOpen;\r\n }, [isHourOpen, isMinuteOpen, isAmPmOpen]);\r\n const [innerError, setInnerError] = React.useState<\r\n React.ReactNode | undefined\r\n >(undefined);\r\n\r\n React.useEffect(() => {\r\n setHoursSelected(() =>\r\n getHoursEntityFromDate(ampm ?? false, dateTimeValue),\r\n );\r\n setMinutesSelected(() => getMinutesEntityFromDate(dateTimeValue));\r\n setAmpmSelected(() => getAmPmEntityFromDate(dateTimeValue));\r\n }, [ampm, dateTimeValue]);\r\n\r\n React.useEffect(() => {\r\n if (dateSelected !== null && dateSelected !== undefined) {\r\n let time = dateUtils.set(dateUtils.dateOrStringToDate(dateSelected), {\r\n hours: hoursSelected.Id,\r\n minutes: minutesSelected.Id,\r\n });\r\n let validateDate = dateUtils.convertToMeridiem(\r\n time,\r\n ampmSelected.Id === 'am' ? 'am' : 'pm',\r\n ampm ?? false,\r\n );\r\n let error = validateError(\r\n validateDate,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!!error) {\r\n setInnerError(error);\r\n if (onError) {\r\n onError(error, validateDate);\r\n }\r\n } else {\r\n setInnerError('');\r\n if (onError) {\r\n onError('', validateDate);\r\n }\r\n }\r\n } else {\r\n setInnerError('');\r\n if (onError) {\r\n onError('', null);\r\n }\r\n }\r\n }, [\r\n ampm,\r\n ampmSelected.Id,\r\n dateSelected,\r\n hoursSelected.Id,\r\n minutesSelected.Id,\r\n onError,\r\n props.disableFuture,\r\n props.disablePast,\r\n props.invalidDateMessage,\r\n props.maxDate,\r\n props.maxDateMessage,\r\n props.minDate,\r\n props.minDateMessage,\r\n props.strictCompareDates,\r\n utils,\r\n ]);\r\n const handleChange = React.useCallback(\r\n (\r\n hour: number,\r\n minute: number,\r\n ampmValue: 'am' | 'pm',\r\n withCompletion?: boolean,\r\n ) => {\r\n if (dateSelected !== null && dateSelected !== undefined) {\r\n let time = dateUtils.set(dateUtils.dateOrStringToDate(dateSelected), {\r\n hours: hour,\r\n minutes: minute,\r\n });\r\n let finalDate = dateUtils.convertToMeridiem(\r\n time,\r\n ampmValue,\r\n ampm ?? false,\r\n );\r\n let hasError = validateError(\r\n finalDate,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!hasError || hasError === '') {\r\n onChange(finalDate, withCompletion);\r\n }\r\n } else {\r\n let time = dateUtils.set(newDate(), { hours: hour, minutes: minute });\r\n let finalDate = dateUtils.convertToMeridiem(\r\n time,\r\n ampmValue,\r\n ampm ?? false,\r\n );\r\n setDateSelected(finalDate);\r\n let hasError = validateError(\r\n finalDate,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!hasError || hasError === '') {\r\n onChange(finalDate, withCompletion);\r\n }\r\n }\r\n },\r\n [\r\n ampm,\r\n dateSelected,\r\n newDate,\r\n onChange,\r\n props.disableFuture,\r\n props.disablePast,\r\n props.invalidDateMessage,\r\n props.maxDate,\r\n props.maxDateMessage,\r\n props.minDate,\r\n props.minDateMessage,\r\n props.strictCompareDates,\r\n utils,\r\n ],\r\n );\r\n const handleHoursChange = React.useCallback(\r\n (val: Entity) => {\r\n setHoursSelected(val);\r\n handleChange(\r\n val.Id,\r\n minutesSelected.Id,\r\n ampmSelected.Id === 'am' ? 'am' : 'pm',\r\n );\r\n },\r\n [ampmSelected.Id, handleChange, minutesSelected.Id],\r\n );\r\n const handleMinutesChange = React.useCallback(\r\n (val: Entity) => {\r\n setMinutesSelected(val);\r\n handleChange(\r\n hoursSelected.Id,\r\n val.Id,\r\n ampmSelected.Id === 'am' ? 'am' : 'pm',\r\n );\r\n },\r\n [ampmSelected.Id, handleChange, hoursSelected.Id],\r\n );\r\n const handleAmPmChange = React.useCallback(\r\n (val: Entity) => {\r\n setAmpmSelected(val);\r\n handleChange(\r\n hoursSelected.Id,\r\n minutesSelected.Id,\r\n val.Id === 'am' ? 'am' : 'pm',\r\n );\r\n },\r\n [handleChange, hoursSelected.Id, minutesSelected.Id],\r\n );\r\n return (\r\n \r\n ) => {\r\n const target = event.target as any; // as HTMLInputElement;\r\n\r\n if (event.key === 'Enter') {\r\n if (!!target && target.nodeName === 'INPUT') {\r\n if (!someOpen && !innerError) {\r\n handleChange(\r\n hoursSelected.Id,\r\n minutesSelected.Id,\r\n ampmSelected.Id === 'am' ? 'am' : 'pm',\r\n true,\r\n );\r\n }\r\n }\r\n }\r\n }}\r\n >\r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n
\r\n \r\n handleHoursChange(\r\n hour ?? (ampm ? defaultHourValue12 : defaultHourValue24),\r\n )\r\n }\r\n id={`${id ?? 'hourId'}_hour`}\r\n name={`${name ?? 'hourName'}_hour`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || hoursDisabled}\r\n ariaLabel={`${label ?? 'hour'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n disableClearable\r\n autoFocus={true}\r\n placeholder={'HH'}\r\n setSomeOpen={setIsHourOpen}\r\n // disableListWrap\r\n // disableCloseOnSelect\r\n // ListboxProps={{\r\n // style: { maxHeight: '20vh' },\r\n // }}\r\n // isOpen={true}\r\n />\r\n handleMinutesChange(minute ?? defaultMinutes)}\r\n id={`${id ?? 'minuteId'}_minute`}\r\n name={`${name ?? 'minuteName'}_minute`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled || minutesDisabled}\r\n ariaLabel={`${label ?? 'minute'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n minutesStep={minutesStep}\r\n disableClearable\r\n placeholder={'mm'}\r\n setSomeOpen={setIsMinuteOpen}\r\n // disableCloseOnSelect\r\n // ListboxProps={{\r\n // style: { maxHeight: '20vh' },\r\n // }}\r\n // isOpen={true}\r\n />\r\n {ampm && (\r\n handleAmPmChange(ampmVal ?? defaultAmPm)}\r\n id={`${id ?? 'ampmId'}_ampm`}\r\n name={`${name ?? 'ampmName'}_ampm`}\r\n variant={inputVariant ?? 'standard'}\r\n disabled={disabled}\r\n ariaLabel={`${label ?? 'ampm'} select`}\r\n error={error}\r\n size={size || 'small'}\r\n placeholder={'AM/PM'}\r\n disableClearable\r\n setSomeOpen={setIsAmPmOpen}\r\n // disableCloseOnSelect\r\n // ListboxProps={{\r\n // style: { maxHeight: '20vh' },\r\n // }}\r\n // isOpen={true}\r\n />\r\n )}\r\n
\r\n {(!!helperText || Boolean(innerError)) && (\r\n \r\n {helperText || innerError}\r\n \r\n )}\r\n \r\n
\r\n );\r\n}\r\n","import { useEffect, useLayoutEffect } from 'react';\r\n\r\nconst useIsomorphicLayoutEffect =\r\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\r\n\r\nexport default useIsomorphicLayoutEffect;\r\n","import { RefObject, useEffect, useRef } from 'react';\r\nimport useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect';\r\n\r\n// Window Event based useEventListener interface\r\nfunction useEventListener(\r\n eventName: K,\r\n handler: (event: WindowEventMap[K]) => void,\r\n element?: undefined,\r\n options?: boolean | AddEventListenerOptions,\r\n): void;\r\n\r\n// Element Event based useEventListener interface\r\nfunction useEventListener<\r\n K extends keyof HTMLElementEventMap,\r\n T extends HTMLElement = HTMLDivElement\r\n>(\r\n eventName: K,\r\n handler: (event: HTMLElementEventMap[K]) => void,\r\n element: RefObject,\r\n options?: boolean | AddEventListenerOptions,\r\n): void;\r\n\r\n// Document Event based useEventListener interface\r\nfunction useEventListener(\r\n eventName: K,\r\n handler: (event: DocumentEventMap[K]) => void,\r\n element: RefObject,\r\n options?: boolean | AddEventListenerOptions,\r\n): void;\r\n\r\nfunction useEventListener<\r\n KW extends keyof WindowEventMap,\r\n KH extends keyof HTMLElementEventMap,\r\n T extends HTMLElement | void = void\r\n>(\r\n eventName: KW | KH,\r\n handler: (\r\n event: WindowEventMap[KW] | HTMLElementEventMap[KH] | Event,\r\n ) => void,\r\n element?: RefObject,\r\n options?: boolean | AddEventListenerOptions,\r\n) {\r\n // Create a ref that stores handler\r\n const savedHandler = useRef(handler);\r\n\r\n useIsomorphicLayoutEffect(() => {\r\n savedHandler.current = handler;\r\n }, [handler]);\r\n\r\n useEffect(() => {\r\n // Define the listening target\r\n const targetElement: T | Window = element?.current || window;\r\n if (!(targetElement && targetElement.addEventListener)) {\r\n return;\r\n }\r\n\r\n // Create event listener that calls handler function stored in ref\r\n const eventListener: typeof handler = event => savedHandler.current(event);\r\n\r\n targetElement.addEventListener(eventName, eventListener, options);\r\n\r\n // Remove event listener on cleanup\r\n return () => {\r\n targetElement.removeEventListener(eventName, eventListener);\r\n };\r\n }, [eventName, element, options]);\r\n}\r\n\r\nexport default useEventListener;\r\n","/* @flow */\r\n\r\nimport useIsomorphicLayoutEffect from 'app/hooks/useIsomorphicLayoutEffect';\r\nimport * as React from 'react';\r\nimport {\r\n DateStartWith,\r\n DateTimeMask,\r\n formatingDate,\r\n formatingTime,\r\n getMaskedDateValue,\r\n getMaskedTimeValue,\r\n} from './types';\r\n\r\nexport interface DateChangeProps {\r\n value: string;\r\n onChange: (text: string) => void;\r\n onSelectionChange: () => boolean;\r\n variant: 'date' | 'time';\r\n maskFormats: DateTimeMask;\r\n inputMask: string;\r\n ampm?: boolean;\r\n // format: (str: string) => string;\r\n mask?: boolean;\r\n maskIfEmpty?: boolean;\r\n // replace?: string => string,\r\n // append?: string => string,\r\n // accept?: RegExp,\r\n selectionChanged?: boolean;\r\n}\r\n\r\ntype RenderProps = {\r\n value: string;\r\n onChange: (\r\n evt: React.ChangeEvent,\r\n increment?: 'increase' | 'decrease',\r\n ) => void;\r\n};\r\n\r\nexport type ResolverProps = {\r\n props: DateChangeProps;\r\n children: (props: RenderProps) => React.ReactNode;\r\n};\r\n\r\nexport const useDateTimeChange = (props: DateChangeProps): RenderProps => {\r\n const [, refresh] = React.useReducer(c => c + 1, 0);\r\n const valueRef = React.useRef(null);\r\n\r\n const dateTimeMask = props.maskFormats;\r\n const dateStartOf: DateStartWith = React.useMemo(() => {\r\n return dateTimeMask.dateStartFrom;\r\n }, [dateTimeMask.dateStartFrom]);\r\n // const { replace, append } = props;\r\n // const { variant } = props;\r\n // const userValue = replace\r\n // ? replace(props.format(props.value))\r\n // : props.format(props.value);\r\n const userValue = props.value;\r\n // state of delete button see comments below about inputType support\r\n const isDeleleteButtonDownRef = React.useRef(false);\r\n const wasZeroBefore = React.useRef(false);\r\n const selectionStateChanged = React.useRef(false);\r\n const onChange = (\r\n evt: React.ChangeEvent,\r\n increment?: 'increase' | 'decrease',\r\n ) => {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (evt.target.type === 'number') {\r\n console.error(\r\n 'Rifm does not support input type=number, use type=tel instead.',\r\n );\r\n return;\r\n }\r\n if (evt.target.type === 'date') {\r\n console.error('Rifm does not support input type=date.');\r\n return;\r\n }\r\n }\r\n\r\n const eventValue = evt.target.value;\r\n const target = evt.target as HTMLInputElement;\r\n const oneLetterHour =\r\n props.variant === 'time' &&\r\n props.ampm &&\r\n dateTimeMask.hour.length === 1 &&\r\n (eventValue === '' || eventValue.split(':')[0].length === 1);\r\n const hasSingleChar =\r\n eventValue.length === 1 && (target.selectionStart ?? 0) <= 1;\r\n const maskedValue = hasSingleChar\r\n ? props.variant === 'time'\r\n ? getMaskedTimeValue(props.maskFormats, props.ampm, eventValue)\r\n : getMaskedDateValue(props.maskFormats, eventValue)\r\n : undefined;\r\n selectionStateChanged.current = props.onSelectionChange();\r\n valueRef.current = [\r\n hasSingleChar ? maskedValue : eventValue, // eventValue\r\n target, // input\r\n // eventValue.length > userValue.length, // isSizeIncreaseOperation\r\n // eventValue.length < userValue.length, // isSizeDecraseOperation\r\n increment, //'increase' | 'decrease' by keyboard\r\n props.variant === 'time' &&\r\n (target.selectionStart ?? 0) <= (oneLetterHour ? 1 : 2), //isHourChanged\r\n props.variant === 'time' &&\r\n (target.selectionStart ?? 0) > (oneLetterHour ? 1 : 2) &&\r\n (target.selectionEnd ?? 0) <= (oneLetterHour ? 4 : 5), //isMinutesChanged\r\n props.variant === 'time' &&\r\n props.ampm &&\r\n (target.selectionStart ?? 0) >= 5, //isAmPmChanged\r\n dateStartOf === 'day'\r\n ? (target.selectionStart ?? 0) <= 2\r\n : dateStartOf === 'month'\r\n ? (target.selectionStart ?? 0) > 2 && (target.selectionEnd ?? 0) <= 5\r\n : (target.selectionStart ?? 0) >= 8, //isDayChanged\r\n dateStartOf === 'day'\r\n ? (target.selectionStart ?? 0) > 2 && (target.selectionEnd ?? 0) <= 5\r\n : dateStartOf === 'month'\r\n ? (target.selectionStart ?? 0) <= 2\r\n : (target.selectionStart ?? 0) > 4 && (target.selectionEnd ?? 0) < 7, //isMonthChanged\r\n\r\n dateStartOf === 'day' || dateStartOf === 'month'\r\n ? (target.selectionStart ?? 0) > 5\r\n : (target.selectionStart ?? 0) <= 4, //isYearChanged\r\n isDeleleteButtonDownRef.current, // isDeleleteButtonDown\r\n props.variant === 'time' ? false : userValue === eventValue, // isNoOperation\r\n selectionStateChanged.current,\r\n ];\r\n // if (process.env.NODE_ENV !== 'production') {\r\n // const formattedEventValue = props.format(eventValue);\r\n // if (\r\n // eventValue !== formattedEventValue &&\r\n // eventValue.toLowerCase() === formattedEventValue.toLowerCase()\r\n // ) {\r\n // console.warn(\r\n // 'Case enforcement does not work with format. Please use replace={value => value.toLowerCase()} instead',\r\n // );\r\n // }\r\n // }\r\n\r\n // The main trick is to update underlying input with non formatted value (= eventValue)\r\n // that allows us to calculate right cursor position after formatting (see getCursorPosition)\r\n // then we format new value and call props.onChange with masked/formatted value\r\n // and finally we are able to set cursor position into right place\r\n refresh();\r\n };\r\n // React prints warn on server in non production mode about useLayoutEffect usage\r\n // in both cases it's noop\r\n useIsomorphicLayoutEffect(() => {\r\n if (valueRef.current == null) return;\r\n\r\n let [\r\n eventValue,\r\n input,\r\n increment,\r\n isHourChanged,\r\n isMinutesChanged,\r\n isAmPmChanged,\r\n isDayChanged,\r\n isMonthChanged,\r\n isYearChanged,\r\n isDeleleteButtonDown,\r\n // No operation means that value itself hasn't been changed, BTW cursor, selection etc can be changed\r\n isNoOperation,\r\n selectionChanged,\r\n ] = valueRef.current;\r\n valueRef.current = null;\r\n let formattedValue = eventValue;\r\n let moveSelectionForward = true;\r\n if (eventValue === '' || eventValue === undefined) {\r\n formattedValue = props.maskIfEmpty\r\n ? props.variant === 'time'\r\n ? getMaskedTimeValue(dateTimeMask, props.ampm)\r\n : getMaskedDateValue(dateTimeMask)\r\n : '';\r\n } else {\r\n if (!isNoOperation) {\r\n if (props.variant === 'time') {\r\n if (isHourChanged || isMinutesChanged || isAmPmChanged) {\r\n let finalTime = formatingTime(\r\n eventValue,\r\n isHourChanged ? 'hour' : isMinutesChanged ? 'minute' : 'meridiem',\r\n dateTimeMask,\r\n userValue,\r\n increment,\r\n props.ampm,\r\n );\r\n formattedValue = finalTime.value;\r\n moveSelectionForward = !finalTime.stayOnSelection;\r\n }\r\n } else {\r\n if (isDayChanged || isMonthChanged || isYearChanged) {\r\n let finalValue = formatingDate(\r\n eventValue,\r\n isDayChanged ? 'day' : isMonthChanged ? 'month' : 'year',\r\n dateTimeMask,\r\n userValue,\r\n increment,\r\n wasZeroBefore.current,\r\n selectionChanged,\r\n );\r\n formattedValue = finalValue.value;\r\n moveSelectionForward = !finalValue.stayOnSelection;\r\n wasZeroBefore.current = finalValue.zeroPress;\r\n }\r\n }\r\n }\r\n }\r\n if (isDeleleteButtonDown) {\r\n }\r\n if (userValue === formattedValue || isNoOperation) {\r\n // if nothing changed for formatted value, just refresh so userValue will be used at render\r\n refresh();\r\n } else {\r\n props.onChange(formattedValue);\r\n }\r\n // const replacedValue = replace ? replace(formattedValue) : formattedValue;\r\n // const replacedValue = formattedValue;\r\n // if (userValue === formattedValue || isNoOperation) {\r\n // // if nothing changed for formatted value, just refresh so userValue will be used at render\r\n // refresh();\r\n // } else {\r\n // props.onChange(formattedValue);\r\n // }\r\n\r\n return () => {\r\n if (\r\n (eventValue === '' || eventValue === undefined) &&\r\n props.maskIfEmpty\r\n ) {\r\n if (props.variant === 'time') {\r\n if (props.ampm) {\r\n let oneLetterHour = dateTimeMask.hour.length === 1;\r\n input.setSelectionRange(0, oneLetterHour ? 1 : 2);\r\n } else {\r\n input.setSelectionRange(0, 2);\r\n }\r\n } else {\r\n if (dateStartOf === 'year') {\r\n input.setSelectionRange(0, 4);\r\n } else {\r\n input.setSelectionRange(0, 2);\r\n }\r\n }\r\n } else {\r\n if (props.variant === 'time') {\r\n let oneLetterHour =\r\n props.ampm &&\r\n dateTimeMask.hour.length === 1 &&\r\n formattedValue.split(':')[0].length === 1;\r\n if (isHourChanged) {\r\n if (moveSelectionForward) {\r\n input.setSelectionRange(\r\n oneLetterHour ? 2 : 3,\r\n oneLetterHour ? 4 : 5,\r\n );\r\n } else {\r\n input.setSelectionRange(0, oneLetterHour ? 1 : 2);\r\n }\r\n }\r\n if (isMinutesChanged) {\r\n if (props.ampm) {\r\n if (moveSelectionForward) {\r\n input.setSelectionRange(\r\n oneLetterHour ? 5 : 6,\r\n oneLetterHour ? 7 : 8,\r\n );\r\n } else {\r\n input.setSelectionRange(\r\n oneLetterHour ? 2 : 3,\r\n oneLetterHour ? 4 : 5,\r\n );\r\n }\r\n } else {\r\n input.setSelectionRange(3, 5);\r\n }\r\n }\r\n if (isAmPmChanged) {\r\n input.setSelectionRange(\r\n oneLetterHour ? 5 : 6,\r\n oneLetterHour ? 7 : 8,\r\n );\r\n }\r\n } else {\r\n if (isDayChanged) {\r\n if (moveSelectionForward) {\r\n if (dateStartOf === 'year') {\r\n input.setSelectionRange(8, 10);\r\n } else if (dateStartOf === 'month') {\r\n input.setSelectionRange(6, 10);\r\n } else {\r\n input.setSelectionRange(3, 5);\r\n }\r\n } else {\r\n if (dateStartOf === 'year') {\r\n input.setSelectionRange(8, 10);\r\n } else if (dateStartOf === 'month') {\r\n input.setSelectionRange(3, 5);\r\n } else {\r\n input.setSelectionRange(0, 2);\r\n }\r\n }\r\n }\r\n if (isMonthChanged) {\r\n if (moveSelectionForward) {\r\n if (dateStartOf === 'year') {\r\n input.setSelectionRange(8, 10);\r\n } else if (dateStartOf === 'month') {\r\n input.setSelectionRange(3, 5);\r\n } else {\r\n input.setSelectionRange(6, 10);\r\n }\r\n } else {\r\n if (dateStartOf === 'year') {\r\n input.setSelectionRange(3, 5);\r\n } else if (dateStartOf === 'month') {\r\n input.setSelectionRange(0, 2);\r\n } else {\r\n input.setSelectionRange(3, 5);\r\n }\r\n }\r\n }\r\n if (isYearChanged) {\r\n if (moveSelectionForward) {\r\n if (dateStartOf === 'year') {\r\n input.setSelectionRange(5, 7);\r\n } else if (dateStartOf === 'month') {\r\n input.setSelectionRange(6, 10);\r\n } else {\r\n input.setSelectionRange(6, 10);\r\n }\r\n } else {\r\n if (dateStartOf === 'year') {\r\n input.setSelectionRange(0, 4);\r\n } else if (dateStartOf === 'month') {\r\n input.setSelectionRange(6, 10);\r\n } else {\r\n input.setSelectionRange(6, 10);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n selectionStateChanged.current = false;\r\n // let start = getCursorPosition(formattedValue);\r\n // // Visually improves working with masked values,\r\n // // like cursor jumping over refused symbols\r\n // // as an example date mask: was \"5|1-24-3\" then user pressed \"6\"\r\n // // it becomes \"56-|12-43\" with this code, and \"56|-12-43\" without\r\n // if (\r\n // props.mask != null &&\r\n // (isSizeIncreaseOperation ||\r\n // isSizeDecraseOperation ||\r\n // (isDeleleteButtonDown && !deleteWasNoOp))\r\n // ) {\r\n // while (formattedValue[start] && clean(formattedValue[start]) === '') {\r\n // start += 1;\r\n // }\r\n // }\r\n // input.selectionStart = input.selectionEnd =\r\n // start + (deleteWasNoOp ? 1 + charsToSkipAfterDelete : 0);\r\n };\r\n });\r\n\r\n React.useEffect(() => {\r\n // until https://developer.mozilla.org/en-US/docs/Web/API/InputEvent/inputType will be supported\r\n // by all major browsers (now supported by: +chrome, +safari, ?edge, !firefox)\r\n // there is no way I found to distinguish in onChange\r\n // backspace or delete was called in some situations\r\n // firefox track https://bugzilla.mozilla.org/show_bug.cgi?id=1447239\r\n const handleKeyDown = (evt: KeyboardEvent) => {\r\n if (evt.code === 'Delete') {\r\n isDeleleteButtonDownRef.current = true;\r\n }\r\n };\r\n\r\n const handleKeyUp = (evt: KeyboardEvent) => {\r\n if (evt.code === 'Delete') {\r\n isDeleleteButtonDownRef.current = false;\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleKeyDown);\r\n document.addEventListener('keyup', handleKeyUp);\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleKeyDown);\r\n document.removeEventListener('keyup', handleKeyUp);\r\n };\r\n }, []);\r\n\r\n return {\r\n value: valueRef.current != null ? valueRef.current[0] : userValue,\r\n onChange,\r\n };\r\n};\r\n\r\nexport const DateTimeResolver = (props: ResolverProps) => {\r\n const renderProps = useDateTimeChange(props.props);\r\n\r\n return props.children(renderProps);\r\n};\r\n","import {\r\n BaseTextFieldProps,\r\n InputAdornment,\r\n InputAdornmentProps,\r\n TextFieldProps,\r\n} from '@material-ui/core';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport BaseTextField from 'app/components/BasicInputs/BaseTextField';\r\nimport React from 'react';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport {\r\n dateArrowSelection,\r\n DatePopupVariants,\r\n dateSelection,\r\n DateTimeMask,\r\n defaultDateTimeMask,\r\n getMaskedDateValue,\r\n getMaskedTimeValue,\r\n timeSelection,\r\n} from '../utils/types';\r\nimport { useDateTimeChange } from '../utils/useDateTimeChange';\r\n\r\nexport interface KeyboardRifmInputProps\r\n extends Pick<\r\n BaseTextFieldProps,\r\n | 'autoFocus'\r\n | 'fullWidth'\r\n | 'helperText'\r\n | 'placeholder'\r\n | 'required'\r\n | 'disabled'\r\n | 'name'\r\n | 'id'\r\n | 'label'\r\n | 'margin'\r\n | 'error'\r\n | 'size'\r\n > {\r\n format: string;\r\n onChange: (value: string | null, withCompletion?: boolean) => void;\r\n openPicker: () => void;\r\n validationError?: React.ReactNode;\r\n inputValue: string;\r\n inputProps?: TextFieldProps['inputProps'];\r\n InputProps?: TextFieldProps['InputProps'];\r\n onBlur?: TextFieldProps['onBlur'];\r\n onFocus?: TextFieldProps['onFocus'];\r\n InputAdornmentProps?: Partial;\r\n /** Override input component */\r\n TextFieldComponent?: React.ComponentType;\r\n /** Icon displaying for open picker button */\r\n keyboardIcon?: React.ReactNode;\r\n /** Pass material-ui text field variant down, bypass internal variant prop */\r\n inputVariant?: TextFieldProps['variant'];\r\n info?: string;\r\n ariaLabel?: string;\r\n startIcon?: React.ReactNode;\r\n endIcon?: React.ReactNode;\r\n togglePicker: () => void;\r\n variant: Omit;\r\n ampm?: boolean;\r\n isPickerOpen?: boolean;\r\n maskIfEmpty?: boolean;\r\n clearable?: boolean;\r\n}\r\n\r\nexport function KeyboardRifmInput({\r\n inputValue,\r\n openPicker,\r\n InputProps,\r\n TextFieldComponent,\r\n inputProps,\r\n inputVariant,\r\n togglePicker,\r\n info,\r\n ariaLabel,\r\n startIcon,\r\n endIcon,\r\n variant,\r\n format,\r\n ampm,\r\n onChange,\r\n isPickerOpen,\r\n maskIfEmpty,\r\n // refuse = /[^\\d]+/gi, //props.ampm ? /[^\\dap]+/gi : /[^\\d]+/gi\r\n // maskChar = '_',\r\n ...props\r\n}: KeyboardRifmInputProps) {\r\n const TextComponent = !!TextFieldComponent\r\n ? TextFieldComponent\r\n : BaseTextField;\r\n\r\n // const keyDownRef = React.useRef({\r\n // selectionStart: 0,\r\n // selectionEnd: 0,\r\n // });\r\n // used to show mask for each part of the Date - e.g. MM, DD, YYYY\r\n const dateTimeMask: DateTimeMask = React.useMemo(() => {\r\n return defaultDateTimeMask(format, variant === 'time' ? 'time' : 'date');\r\n }, [format, variant]);\r\n\r\n // //indicator of start date based on dateUtils dateFrmat definition per local time zone - is date is start form day/month/year;\r\n // const dateStartWith = React.useMemo(() => {\r\n // return dateStartFrom ?? dateStart;\r\n // }, [dateStartFrom]);\r\n\r\n //generated mask for date, so will be replaced when value is null\r\n const inputMask = React.useMemo(() => {\r\n return variant === 'time'\r\n ? getMaskedTimeValue(dateTimeMask, ampm)\r\n : getMaskedDateValue(dateTimeMask);\r\n }, [ampm, dateTimeMask, variant]);\r\n const [hasError, setHasError] = React.useState(\r\n props.error || Boolean(props.validationError),\r\n );\r\n\r\n const [errorMessage, setErrorMessage] = React.useState(\r\n hasError ? props.validationError || props.helperText : undefined,\r\n );\r\n React.useEffect(() => {\r\n setHasError(props.error || Boolean(props.validationError));\r\n setErrorMessage(props.validationError || props.helperText);\r\n }, [props.error, props.helperText, props.validationError]);\r\n const [selectionChanged, setSelectionChanged] = React.useState(false);\r\n const handleChange = (text: string, withCompletion?: boolean) => {\r\n let finalString =\r\n text === '' || text === inputMask\r\n ? maskIfEmpty\r\n ? inputMask\r\n : null\r\n : text;\r\n onChange(finalString, withCompletion);\r\n };\r\n const dateChange = useDateTimeChange({\r\n mask: true,\r\n // format: val => val,\r\n value: inputValue || (maskIfEmpty ? inputMask : ''),\r\n onChange: handleChange,\r\n variant: variant === 'time' ? 'time' : 'date',\r\n maskFormats: dateTimeMask,\r\n ampm: ampm,\r\n inputMask: inputMask,\r\n maskIfEmpty: maskIfEmpty,\r\n onSelectionChange: () => selectionChanged,\r\n });\r\n return (\r\n {\r\n if (variant === 'time') {\r\n timeSelection(event, dateTimeMask);\r\n } else {\r\n dateSelection(event, dateTimeMask);\r\n }\r\n setSelectionChanged(true);\r\n },\r\n onMouseDown: event => {\r\n const target = event.target as HTMLInputElement;\r\n if (!!target.value && target.value !== '') {\r\n target.selectionStart = target.selectionEnd = target.value.length;\r\n }\r\n },\r\n onKeyUp: event => {\r\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\r\n dateArrowSelection(\r\n event,\r\n event.key === 'ArrowLeft' ? 'left' : 'right',\r\n variant === 'time' ? 'time' : 'date',\r\n dateTimeMask,\r\n );\r\n setSelectionChanged(true);\r\n console.log(event.key, {\r\n selStart: (event.target as any).selectionStart,\r\n selEnd: (event.target as any).selectionEnd,\r\n });\r\n }\r\n if (event.key === 'ArrowUp') {\r\n // keyDownRef.current = {\r\n // selectionStart: (event.target as any).selectionStart,\r\n // selectionEnd: (event.target as any).selectionEnd,\r\n // };\r\n dateChange.onChange(event as any, 'increase');\r\n console.log('ArrowUp', {\r\n selectionStart: (event.target as any).selectionStart,\r\n selectionEnd: (event.target as any).selectionEnd,\r\n });\r\n }\r\n if (event.key === 'ArrowDown') {\r\n dateChange.onChange(event as any, 'decrease');\r\n // keyDownRef.current = {\r\n // selectionStart: (event.target as any).selectionStart,\r\n // selectionEnd: (event.target as any).selectionEnd,\r\n // };\r\n console.log('ArrowUp', {\r\n selStart: (event.target as any).selectionStart,\r\n selEnd: (event.target as any).selectionEnd,\r\n });\r\n }\r\n if (event.key === 'Enter' || event.key === 'Tab') {\r\n handleChange(dateChange.value, true);\r\n }\r\n },\r\n onKeyDown: event => {\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n event.nativeEvent.stopImmediatePropagation();\r\n }\r\n },\r\n }}\r\n error={hasError}\r\n onChange={event => {\r\n dateChange.onChange(event);\r\n }}\r\n InputProps={{\r\n ...InputProps,\r\n disableUnderline: inputVariant === 'standard',\r\n autoComplete: 'off',\r\n // startAdornment: (\r\n // \r\n // \r\n // \r\n // ),\r\n endAdornment: (\r\n <>\r\n {(info && ) ||\r\n (endIcon && (\r\n \r\n {endIcon}\r\n \r\n ))}\r\n \r\n togglePicker()}\r\n disabled={props.disabled}\r\n size=\"xs\"\r\n variant=\"ghost\"\r\n >\r\n \r\n \r\n \r\n {props.clearable &&\r\n Boolean(inputValue || (maskIfEmpty ? inputMask : '')) && (\r\n \r\n handleChange('', true)}\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n ),\r\n // style: { minWidth: 80 },\r\n }}\r\n InputLabelProps={{\r\n shrink:\r\n inputVariant === 'filled'\r\n ? !isNullOrUndefined(inputValue)\r\n ? true\r\n : false\r\n : undefined,\r\n }}\r\n helperText={errorMessage || props.helperText}\r\n onClick={ev => {\r\n if (!isPickerOpen) {\r\n const target = ev.target as HTMLInputElement;\r\n if (!!target && target.nodeName === 'INPUT') openPicker();\r\n }\r\n }}\r\n onMouseDown={ev => {\r\n if (!isPickerOpen) {\r\n const target = ev.target as HTMLInputElement;\r\n if (!!target && target.nodeName === 'INPUT') openPicker();\r\n }\r\n }}\r\n value={dateChange.value}\r\n variant={inputVariant}\r\n // onKeyUp={(event: React.KeyboardEvent) => {\r\n // if (event.key === 'Enter') {\r\n // event.stopPropagation();\r\n // openPicker();\r\n // }\r\n // }}\r\n autoFocus={props.autoFocus}\r\n size={props.size}\r\n fullWidth={props.fullWidth}\r\n placeholder={props.placeholder}\r\n required={props.required}\r\n disabled={props.disabled}\r\n name={props.name}\r\n id={props.id}\r\n label={props.label}\r\n margin={props.margin}\r\n onBlur={props.onBlur}\r\n onFocus={props.onFocus}\r\n />\r\n );\r\n}\r\n","import { BaseTextFieldProps } from '@material-ui/core';\r\nimport { BaseDatePickerProps, BaseTimePickerProps } from '@material-ui/pickers';\r\nimport { DateValidationProps } from '@material-ui/pickers/_helpers/text-field-helper';\r\nimport { BaseKeyboardPickerProps } from '@material-ui/pickers/_shared/hooks/useKeyboardPickerState';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { KeyboardRifmInput } from './KeyboardRifmInput';\r\nimport * as React from 'react';\r\nimport { IUtils } from '@date-io/core/IUtils';\r\nimport { validateError } from '../DatePicker/utils/pickerDateValidate';\r\nimport { KeyboardDateInputProps } from '@material-ui/pickers/_shared/KeyboardDateInput';\r\nimport { DatePopupVariants, getDisplayDate } from './utils/types';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\n\r\nexport interface KeyboardInputProps\r\n extends DateValidationProps,\r\n Pick,\r\n Pick<\r\n BaseDatePickerProps,\r\n | 'disableFuture'\r\n | 'disablePast'\r\n | 'minDate'\r\n | 'maxDate'\r\n | 'strictCompareDates'\r\n >,\r\n Omit<\r\n KeyboardDateInputProps,\r\n | 'maskChar'\r\n | 'mask'\r\n | 'refuse'\r\n | 'KeyboardButtonProps'\r\n | 'rifmFormatter'\r\n | 'onChange'\r\n | 'format'\r\n >,\r\n Pick<\r\n BaseKeyboardPickerProps,\r\n | 'onChange'\r\n | 'format'\r\n | 'value'\r\n | 'invalidLabel'\r\n | 'emptyLabel'\r\n | 'labelFunc'\r\n | 'onError'\r\n | 'onChange'\r\n >,\r\n Pick<\r\n BaseTextFieldProps,\r\n | 'autoFocus'\r\n | 'fullWidth'\r\n | 'helperText'\r\n | 'placeholder'\r\n | 'required'\r\n | 'disabled'\r\n | 'name'\r\n | 'id'\r\n | 'label'\r\n | 'margin'\r\n > {\r\n info?: string;\r\n ariaLabel?: string;\r\n startIcon?: React.ReactNode;\r\n endIcon?: React.ReactNode;\r\n togglePicker: () => void;\r\n variant: Omit;\r\n isPickerOpen?: boolean;\r\n onChange: (\r\n date: MaterialUiPickersDate | null,\r\n value?: string | null,\r\n withCompletion?: boolean,\r\n ) => void;\r\n maskIfEmpty?: boolean;\r\n clearable?: boolean;\r\n}\r\nexport function parseInputString(\r\n value: string,\r\n utils: IUtils,\r\n format: string,\r\n) {\r\n try {\r\n return utils.parse(value, format);\r\n } catch {\r\n return null;\r\n }\r\n}\r\nexport function KeyboardInput({\r\n format = dateUtils.DateIOFormats.keyboardDate,\r\n inputValue,\r\n onChange,\r\n value,\r\n onError,\r\n maxDate,\r\n minDate,\r\n disablePast,\r\n disableFuture,\r\n maxDateMessage,\r\n minDateMessage,\r\n invalidDateMessage,\r\n strictCompareDates,\r\n variant,\r\n size,\r\n maskIfEmpty,\r\n clearable,\r\n ...props\r\n}: KeyboardInputProps) {\r\n const utils = dateUtils.dateFnsUtils;\r\n const displayDate = getDisplayDate(\r\n value,\r\n format,\r\n utils,\r\n value === null || value === '',\r\n {\r\n invalidLabel: props.invalidLabel,\r\n emptyLabel: props.emptyLabel,\r\n labelFunc: props.labelFunc,\r\n },\r\n );\r\n const [innerInputValue, setInnerInputValue] = React.useState(displayDate);\r\n // const dateValue = inputValue\r\n // ? parseInputString(inputValue, utils, format)\r\n // : value;\r\n const changedValueRef = React.useRef(innerInputValue);\r\n React.useEffect(() => {\r\n if (value === null || utils.isValid(value)) {\r\n setInnerInputValue(displayDate);\r\n }\r\n }, [displayDate, setInnerInputValue, utils, value]);\r\n React.useEffect(() => {\r\n let val = innerInputValue;\r\n if (!!val && val !== '') {\r\n let date = val === null ? null : utils.parse(val, format);\r\n\r\n if (!(date?.toString() === 'Invalid Date')) {\r\n if (value !== null || utils.isValid(value)) {\r\n let dateVal = dateUtils.getParsableDate(value);\r\n if (dateVal !== null && date !== null) {\r\n if (variant === 'time') {\r\n date = dateUtils.dateFnsUtils.mergeDateAndTime(dateVal, date);\r\n } else {\r\n date = dateUtils.dateFnsUtils.mergeDateAndTime(date, dateVal);\r\n }\r\n }\r\n }\r\n }\r\n\r\n let error = validateError(\r\n date,\r\n {\r\n maxDate: maxDate,\r\n minDate: minDate,\r\n disablePast: disablePast,\r\n disableFuture: disableFuture,\r\n maxDateMessage: maxDateMessage,\r\n minDateMessage: minDateMessage,\r\n invalidDateMessage: invalidDateMessage,\r\n strictCompareDates: strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!!error) {\r\n setValidationError(error);\r\n if (!!onError) {\r\n onError(error, null);\r\n }\r\n } else {\r\n setValidationError('');\r\n if (!!onError) {\r\n onError('', null);\r\n }\r\n }\r\n } else {\r\n setValidationError('');\r\n if (!!onError) {\r\n onError('', null);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [format, innerInputValue, maxDate, minDate]);\r\n const [innerValidationError, setValidationError] = React.useState<\r\n React.ReactNode | undefined\r\n >(undefined);\r\n const errorMessage = React.useMemo(() => {\r\n return innerValidationError;\r\n }, [innerValidationError]);\r\n // const handleKeyboardChange = React.useCallback(\r\n // (date: MaterialUiPickersDate) => {\r\n // onChange(date, date === null ? null : utils.format(date, format));\r\n // },\r\n // [format, onChange, utils],\r\n // );\r\n\r\n // const inputProps = React.useMemo(\r\n // () => ({\r\n // ...innerInputProps, // reuse validation and open/close logic\r\n // format: format,\r\n // inputValue: inputValue || innerInputValue,\r\n // onChange: (value: string | null) => {\r\n // setInnerInputValue(value || '');\r\n // const date =\r\n // value === null ? null : utils.parse(value, wrapperProps.format);\r\n\r\n // onChange(date, value);\r\n // },\r\n // }),\r\n // [\r\n // innerInputProps,\r\n // innerInputValue,\r\n // inputValue,\r\n // onChange,\r\n // utils,\r\n // wrapperProps.format,\r\n // ],\r\n // );\r\n return (\r\n {\r\n setInnerInputValue(textValue ?? '');\r\n changedValueRef.current = textValue ?? '';\r\n\r\n let date = textValue === null ? null : utils.parse(textValue, format);\r\n\r\n if (!(date?.toString() === 'Invalid Date')) {\r\n if (value !== null || utils.isValid(value)) {\r\n let dateVal = dateUtils.getParsableDate(value);\r\n if (dateVal !== null && date !== null) {\r\n if (variant === 'time') {\r\n date = dateUtils.dateFnsUtils.mergeDateAndTime(dateVal, date);\r\n } else {\r\n date = dateUtils.dateFnsUtils.mergeDateAndTime(date, dateVal);\r\n }\r\n }\r\n }\r\n }\r\n let error = validateError(\r\n date,\r\n {\r\n maxDate: maxDate,\r\n minDate: minDate,\r\n disablePast: disablePast,\r\n disableFuture: disableFuture,\r\n maxDateMessage: maxDateMessage,\r\n minDateMessage: minDateMessage,\r\n invalidDateMessage: invalidDateMessage,\r\n strictCompareDates: strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!!error) {\r\n setValidationError(error);\r\n if (!!onError) {\r\n onError(error, date);\r\n }\r\n } else {\r\n setValidationError('');\r\n if (!!onError) {\r\n onError('', date);\r\n }\r\n // if (!(date?.toString() === 'Invalid Date')) {\r\n // setTimeout(() => {\r\n // if (textValue === changedValueRef.current) {\r\n // onChange(date, textValue);\r\n // }\r\n // }, 1500);\r\n // }\r\n if (!(date?.toString() === 'Invalid Date')) {\r\n onChange(date, textValue, withCompletion);\r\n }\r\n }\r\n }}\r\n isPickerOpen={props.isPickerOpen}\r\n info={props.info}\r\n ariaLabel={props.ariaLabel}\r\n format={format}\r\n validationError={errorMessage || props.validationError}\r\n helperText={errorMessage || props.helperText}\r\n error={Boolean(errorMessage)}\r\n InputProps={props.InputProps}\r\n startIcon={props.startIcon}\r\n endIcon={props.endIcon}\r\n inputVariant={props.inputVariant}\r\n onFocus={props.onFocus}\r\n onBlur={props.onBlur}\r\n ampm={props.ampm}\r\n variant={variant}\r\n size={size}\r\n maskIfEmpty={maskIfEmpty}\r\n clearable={clearable}\r\n {...props}\r\n />\r\n );\r\n}\r\n","import {\r\n BaseTextFieldProps,\r\n capitalize,\r\n Divider,\r\n List,\r\n ListItem,\r\n useTheme,\r\n} from '@material-ui/core';\r\nimport { BaseTimePickerProps, useUtils } from '@material-ui/pickers';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport FormControl from 'app/components/Forms/FormControls/FormControl';\r\nimport FormHelperText from 'app/components/Forms/FormControls/FormHelperText';\r\nimport { InputLabel } from '@material-ui/core';\r\nimport * as React from 'react';\r\n\r\nimport clsx from 'clsx';\r\nimport { Entity } from 'types/common';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { validateError } from 'app/components/DatePicker/utils/pickerDateValidate';\r\nimport { ParsableDate } from '@material-ui/pickers/constants/prop-types';\r\nimport { DateDropDownValidationProps } from '../DateDropDown';\r\nimport {\r\n getHoursEntityFromDate,\r\n hoursEntityArray12,\r\n hoursEntityArray24,\r\n} from 'app/components/pickers/StaticOptionsPickers/HoursPicker';\r\nimport {\r\n getMinutesEntityFromDate,\r\n minutesEntityArray,\r\n} from 'app/components/pickers/StaticOptionsPickers/MinutesPicker';\r\nimport {\r\n AmPmEntityArray,\r\n getAmPmEntityFromDate,\r\n} from 'app/components/pickers/StaticOptionsPickers/AmPmPicker';\r\nimport styled from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport interface TimeOptionPickerProps\r\n extends DateDropDownValidationProps,\r\n BaseTimePickerProps,\r\n Pick<\r\n BaseTextFieldProps,\r\n | 'fullWidth'\r\n | 'helperText'\r\n | 'required'\r\n | 'disabled'\r\n | 'name'\r\n | 'id'\r\n | 'label'\r\n | 'error'\r\n | 'size'\r\n > {\r\n value?: Date | string | null;\r\n onChange: (\r\n date: MaterialUiPickersDate | null,\r\n withCompletion?: boolean,\r\n ) => void;\r\n inputVariant?: 'filled' | 'standard' | 'outlined';\r\n info?: string;\r\n className?: string;\r\n hoursDisabled?: boolean;\r\n minutesDisabled?: boolean;\r\n onError?: (\r\n error: React.ReactNode,\r\n value: MaterialUiPickersDate | ParsableDate,\r\n ) => void;\r\n}\r\n\r\nexport function TimeOptionPicker(props: TimeOptionPickerProps) {\r\n const {\r\n value,\r\n onChange,\r\n inputVariant,\r\n id,\r\n fullWidth,\r\n helperText,\r\n disabled,\r\n label,\r\n error,\r\n size,\r\n ampm,\r\n minutesStep,\r\n strictCompareDates = true,\r\n onError,\r\n } = props;\r\n const { newDate } = useSystemDate();\r\n const utils = useUtils();\r\n const theme = useTheme();\r\n const inputLabelId = label && id ? `${id}-label` : undefined;\r\n const helperTextId = id ? `${id}-helper-text` : undefined;\r\n const sizeClass = `inputSize${capitalize(size ?? 'large')}`;\r\n const dateTimeValue = React.useMemo(() => {\r\n return value;\r\n }, [value]);\r\n const [dateSelected, setDateSelected] = React.useState<\r\n Date | string | null | undefined\r\n >(value);\r\n const [hoursSelected, setHoursSelected] = React.useState(\r\n getHoursEntityFromDate(ampm ?? false, dateTimeValue),\r\n );\r\n const [minutesSelected, setMinutesSelected] = React.useState(\r\n getMinutesEntityFromDate(dateTimeValue),\r\n );\r\n const [ampmSelected, setAmpmSelected] = React.useState(\r\n getAmPmEntityFromDate(dateTimeValue),\r\n );\r\n // const [isHourOpen, setIsHourOpen] = React.useState(false);\r\n // const [isMinuteOpen, setIsMinuteOpen] = React.useState(false);\r\n // const [isAmPmOpen, setIsAmPmOpen] = React.useState(false);\r\n // const someOpen = React.useMemo(() => {\r\n // return isHourOpen || isMinuteOpen || isAmPmOpen;\r\n // }, [isHourOpen, isMinuteOpen, isAmPmOpen]);\r\n const [innerError, setInnerError] = React.useState<\r\n React.ReactNode | undefined\r\n >(undefined);\r\n\r\n const hoursItems = React.useMemo(() => {\r\n return ampm ? hoursEntityArray12 : hoursEntityArray24;\r\n }, [ampm]);\r\n const minutesItems = React.useMemo(() => {\r\n return !!minutesStep && minutesStep > 0 && minutesStep <= 30\r\n ? minutesEntityArray.filter(f => f.Id % minutesStep === 0)\r\n : minutesEntityArray;\r\n }, [minutesStep]);\r\n const ampmItems = React.useMemo(() => {\r\n return AmPmEntityArray;\r\n }, []);\r\n const hourRef = React.useRef(null);\r\n const minuteRef = React.useRef(null);\r\n const hourScroll = (selectedId: number, useAmPm?: boolean) => {\r\n if (!!hourRef.current) {\r\n let top = (useAmPm ? selectedId - 1 : selectedId) * 50;\r\n hourRef.current.scrollTo(0, top);\r\n }\r\n };\r\n const minuteScroll = (selectedId: number, step?: number) => {\r\n if (!!minuteRef.current) {\r\n let top = selectedId * 50;\r\n if (step !== undefined) {\r\n top = top / step;\r\n }\r\n minuteRef.current.scrollTo(0, top);\r\n }\r\n };\r\n React.useEffect(() => {\r\n setHoursSelected(() =>\r\n getHoursEntityFromDate(ampm ?? false, dateTimeValue),\r\n );\r\n setMinutesSelected(() => getMinutesEntityFromDate(dateTimeValue));\r\n setAmpmSelected(() => getAmPmEntityFromDate(dateTimeValue));\r\n }, [ampm, dateTimeValue]);\r\n\r\n React.useEffect(() => {\r\n if (!!hourRef.current) {\r\n hourScroll(hoursSelected.Id, ampm);\r\n }\r\n if (!!minuteRef.current) {\r\n minuteScroll(minutesSelected.Id, minutesStep);\r\n }\r\n }, [ampm, hoursSelected.Id, minutesSelected.Id, minutesStep]);\r\n React.useEffect(() => {\r\n if (dateSelected !== null && dateSelected !== undefined) {\r\n let time = dateUtils.set(dateUtils.dateOrStringToDate(dateSelected), {\r\n hours: hoursSelected.Id,\r\n minutes: minutesSelected.Id,\r\n });\r\n let validateDate = dateUtils.convertToMeridiem(\r\n time,\r\n ampmSelected.Id === 'am' ? 'am' : 'pm',\r\n ampm ?? false,\r\n );\r\n let error = validateError(\r\n validateDate,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!!error) {\r\n setInnerError(error);\r\n if (onError) {\r\n onError(error, validateDate);\r\n }\r\n } else {\r\n setInnerError('');\r\n if (onError) {\r\n onError('', validateDate);\r\n }\r\n }\r\n } else {\r\n setInnerError('');\r\n if (onError) {\r\n onError('', null);\r\n }\r\n }\r\n }, [\r\n ampm,\r\n ampmSelected.Id,\r\n dateSelected,\r\n hoursSelected.Id,\r\n minutesSelected.Id,\r\n onError,\r\n props.disableFuture,\r\n props.disablePast,\r\n props.invalidDateMessage,\r\n props.maxDate,\r\n props.maxDateMessage,\r\n props.minDate,\r\n props.minDateMessage,\r\n strictCompareDates,\r\n utils,\r\n ]);\r\n const handleChange = React.useCallback(\r\n (\r\n hour: number,\r\n minute: number,\r\n ampmValue: 'am' | 'pm',\r\n withCompletion?: boolean,\r\n ) => {\r\n if (dateSelected !== null && dateSelected !== undefined) {\r\n let time = dateUtils.set(dateUtils.dateOrStringToDate(dateSelected), {\r\n hours: hour,\r\n minutes: minute,\r\n });\r\n let finalDate = dateUtils.convertToMeridiem(\r\n time,\r\n ampmValue,\r\n ampm ?? false,\r\n );\r\n let hasError = validateError(\r\n finalDate,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!hasError || hasError === '') {\r\n onChange(finalDate, withCompletion);\r\n }\r\n } else {\r\n let time = dateUtils.set(newDate(), { hours: hour, minutes: minute });\r\n let finalDate = dateUtils.convertToMeridiem(\r\n time,\r\n ampmValue,\r\n ampm ?? false,\r\n );\r\n setDateSelected(finalDate);\r\n let hasError = validateError(\r\n finalDate,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!hasError || hasError === '') {\r\n onChange(finalDate, withCompletion);\r\n }\r\n }\r\n },\r\n [\r\n ampm,\r\n dateSelected,\r\n newDate,\r\n onChange,\r\n props.disableFuture,\r\n props.disablePast,\r\n props.invalidDateMessage,\r\n props.maxDate,\r\n props.maxDateMessage,\r\n props.minDate,\r\n props.minDateMessage,\r\n strictCompareDates,\r\n utils,\r\n ],\r\n );\r\n const handleHoursChange = React.useCallback(\r\n (val: Entity) => {\r\n setHoursSelected(val);\r\n handleChange(\r\n val.Id,\r\n minutesSelected.Id,\r\n ampmSelected.Id === 'am' ? 'am' : 'pm',\r\n );\r\n },\r\n [ampmSelected.Id, handleChange, minutesSelected.Id],\r\n );\r\n const handleMinutesChange = React.useCallback(\r\n (val: Entity) => {\r\n setMinutesSelected(val);\r\n handleChange(\r\n hoursSelected.Id,\r\n val.Id,\r\n ampmSelected.Id === 'am' ? 'am' : 'pm',\r\n );\r\n },\r\n [ampmSelected.Id, handleChange, hoursSelected.Id],\r\n );\r\n const handleAmPmChange = React.useCallback(\r\n (val: Entity) => {\r\n setAmpmSelected(val);\r\n handleChange(\r\n hoursSelected.Id,\r\n minutesSelected.Id,\r\n val.Id === 'am' ? 'am' : 'pm',\r\n );\r\n },\r\n [handleChange, hoursSelected.Id, minutesSelected.Id],\r\n );\r\n\r\n return (\r\n \r\n ) => {\r\n // const target = event.target as any; // as HTMLInputElement;\r\n\r\n // if (event.key === 'Enter') {\r\n // if (!!target && target.nodeName === 'INPUT') {\r\n // if (!someOpen && !innerError) {\r\n // handleChange(\r\n // hoursSelected.Id,\r\n // minutesSelected.Id,\r\n // ampmSelected.Id === 'am' ? 'am' : 'pm',\r\n // true,\r\n // );\r\n // }\r\n // }\r\n // }\r\n // }}\r\n >\r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n \r\n
\r\n
\r\n \r\n {hoursItems.map(hour => (\r\n {\r\n handleHoursChange(hour);\r\n }}\r\n onKeyDown={event => {\r\n if (event.key === 'Enter') {\r\n handleHoursChange(hour);\r\n }\r\n }}\r\n selected={hoursSelected.Id === hour.Id}\r\n >\r\n {hour.Name}\r\n \r\n ))}\r\n \r\n \r\n \r\n {minutesItems.map(minute => (\r\n {\r\n handleMinutesChange(minute);\r\n }}\r\n onKeyDown={event => {\r\n if (event.key === 'Enter') {\r\n handleMinutesChange(minute);\r\n }\r\n }}\r\n selected={minutesSelected.Id === minute.Id}\r\n >\r\n {minute.Name}\r\n \r\n ))}\r\n \r\n {ampm && (\r\n \r\n \r\n \r\n {ampmItems.map(ap => (\r\n {\r\n handleAmPmChange(ap);\r\n }}\r\n onKeyDown={event => {\r\n if (event.key === 'Enter') {\r\n handleAmPmChange(ap);\r\n }\r\n }}\r\n selected={ampmSelected.Id === ap.Id}\r\n >\r\n {ap.Name}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n
\r\n
\r\n
\r\n {(!!helperText || Boolean(innerError)) && (\r\n \r\n {helperText || innerError}\r\n \r\n )}\r\n \r\n
\r\n );\r\n}\r\nconst PickerOptions = styled('div')(({ theme }) => ({\r\n '&.time-options-picker-root': {\r\n display: 'grid',\r\n gridAutoColumns: 'max-content auto max-content',\r\n gridAutoRows: 'max-content auto max-content',\r\n '& .time-options-picker-wrap': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gridColumn: 1,\r\n gridRow: 1,\r\n '& .time-options-picker-section': {\r\n overflow: 'hidden',\r\n maxHeight: '334px',\r\n margin: '0px auto',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n width: '100%',\r\n borderBottom: '1px solid rgba(0, 0, 0, 0.12)',\r\n borderTop: '1px solid rgba(0, 0, 0, 0.12)',\r\n gap: '8px',\r\n padding: '8px 0px',\r\n '& .time-options-picker-list': {\r\n listStyle: 'none',\r\n margin: '0px',\r\n position: 'relative',\r\n maxHeight: '232px',\r\n width: '56px',\r\n padding: '0px',\r\n overflow: 'hidden',\r\n '&.time-options-hours, &.time-options-minutes': {\r\n '&::after': {\r\n display: 'block',\r\n content: '\"\"',\r\n height: 'calc((100% - 40px) - 6px)',\r\n },\r\n '@media (prefers-reduced-motion: no-preference)': {\r\n scrollBehavior: 'auto',\r\n },\r\n '&:hover': {\r\n overflowY: 'auto',\r\n },\r\n '&::-webkit-scrollbar': {\r\n width: '4px',\r\n boxShadow: `inset 0px 0px 1px 1px ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: '2px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n },\r\n '& .time-options-picker-list-item': {\r\n display: 'flex',\r\n minHeight: '48px',\r\n whiteSpace: 'nowrap',\r\n padding: '8px',\r\n margin: '2px 4px',\r\n width: '48px',\r\n borderRadius: '8px',\r\n justifyContent: 'center',\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '16px',\r\n fontStyle: 'normal',\r\n lineHeight: '20px' /* 125% */,\r\n fontWeight: 600,\r\n letterSpacing: '0.2px',\r\n '&.selected': {\r\n backgroundColor: bookitColors.primary.components,\r\n color: bookitColors.base.white,\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.regular,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n },\r\n },\r\n },\r\n '& .time-options-minutes': {\r\n // borderLeft: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n // marginLeft: '12px',\r\n },\r\n '& .time-options-ampm': {\r\n // borderLeft: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n // marginLeft: '12px',\r\n },\r\n '& .time-options-hours': {\r\n // marginRight: '12px',\r\n },\r\n },\r\n },\r\n },\r\n}));\r\n","import { ClickAwayListener, Fade, Paper, useTheme } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport * as React from 'react';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport clsx from 'clsx';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { DateInput, DateInputProps } from './DateInput';\r\nimport {\r\n DatePopupVariants,\r\n getInputViewDate,\r\n getValueDateOrTruncat,\r\n setInputViewDate,\r\n} from './utils/types';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport {\r\n BaseDatePickerProps,\r\n BaseTimePickerProps,\r\n DatePicker,\r\n KeyboardDatePickerProps,\r\n TimePicker,\r\n useUtils,\r\n} from '@material-ui/pickers';\r\nimport { DatePickerValueProps } from '../DatePicker';\r\nimport { PickerPopper, StyledPicker } from './StyledPicker';\r\nimport { SeparatedPickerProps } from '../KeyBoardDatePicker';\r\nimport { KeyboardDateInputProps } from '@material-ui/pickers/_shared/KeyboardDateInput';\r\nimport { ParsableDate } from '@material-ui/pickers/constants/prop-types';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from '../BasicButtons/Button';\r\nimport { BaseKeyboardPickerProps } from '@material-ui/pickers/_shared/hooks/useKeyboardPickerState';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { DateDropDown } from './DateDropDown';\r\nimport { TimeDropDown } from './TimeDropDown';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectUseAmPm } from 'app/slice/selectors';\r\nimport {\r\n validateDate,\r\n validateTime,\r\n} from '../DatePicker/utils/pickerDateValidate';\r\nimport { useKeyUpOutside } from 'app/hooks/useKeyUpOutside';\r\nimport { KeyboardInput } from './KeyboardInput';\r\nimport { TimeOptionPicker } from './TimeOptionPicker';\r\n\r\nexport interface BookitDatePickerProps\r\n extends BaseDatePickerProps,\r\n Pick,\r\n SeparatedPickerProps,\r\n Pick,\r\n Pick<\r\n KeyboardDateInputProps,\r\n | 'validationError'\r\n | 'keyboardIcon'\r\n | 'mask'\r\n | 'maskChar'\r\n | 'KeyboardButtonProps'\r\n | 'rifmFormatter'\r\n | 'refuse'\r\n >,\r\n Pick<\r\n KeyboardDatePickerProps,\r\n | 'labelFunc'\r\n | 'clearable'\r\n | 'maxDateMessage'\r\n | 'minDateMessage'\r\n | 'invalidDateMessage'\r\n | 'onError'\r\n >,\r\n Pick,\r\n Pick<\r\n DateInputProps,\r\n | 'autoFocus'\r\n | 'fullWidth'\r\n | 'helperText'\r\n | 'placeholder'\r\n | 'error'\r\n | 'required'\r\n | 'disabled'\r\n | 'name'\r\n | 'id'\r\n | 'label'\r\n | 'margin'\r\n | 'inputProps'\r\n | 'InputProps'\r\n | 'TextFieldComponent'\r\n | 'onBlur'\r\n | 'onFocus'\r\n > {\r\n inputVariant?: 'filled' | 'standard' | 'outlined';\r\n closablePicker?: boolean;\r\n closeTitle?: React.ReactNode;\r\n onClose?: () => void;\r\n onOpen?: () => void;\r\n variant?: DatePopupVariants;\r\n info?: string;\r\n ariaLabel?: string;\r\n startIcon?: React.ReactNode;\r\n endIcon?: React.ReactNode;\r\n size?: 'medium' | 'small' | undefined;\r\n className?: string;\r\n fullScreen?: boolean;\r\n readonlyInput?: boolean;\r\n useTimeClockPicker?: boolean;\r\n useTimeDropDowns?: boolean;\r\n useDateDropDowns?: boolean;\r\n useDateCalendarPicker?: boolean;\r\n saveOnSelect?: boolean;\r\n maskIfEmpty?: boolean;\r\n clearable?: boolean;\r\n}\r\n\r\nexport function BookitDatePicker(props: BookitDatePickerProps) {\r\n const isMobile = DetectIsMobile();\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n const useAmPm = useSelector(selectUseAmPm);\r\n const utils = useUtils();\r\n const elementRef = React.useRef(null);\r\n const {\r\n inputVariant,\r\n closablePicker = true,\r\n closeTitle = 'Close',\r\n onClose,\r\n onOpen,\r\n value,\r\n endTime,\r\n truncateTime,\r\n variant = 'date',\r\n info,\r\n startIcon,\r\n endIcon,\r\n ariaLabel,\r\n minDateMessage = 'Date should not be before minimal date',\r\n maxDateMessage = 'Date should not be after maximal date',\r\n invalidDateMessage = 'Invalid Date Format',\r\n onChange,\r\n labelFunc,\r\n readonlyInput,\r\n useTimeClockPicker,\r\n useTimeDropDowns,\r\n useDateDropDowns,\r\n saveOnSelect,\r\n maskIfEmpty = true,\r\n clearable,\r\n ...other\r\n } = props;\r\n\r\n const dateInputProps = React.useMemo(() => {\r\n return {\r\n autoFocus: props.autoFocus,\r\n fullWidth: props.fullWidth,\r\n helperText: props.helperText,\r\n placeholder: props.placeholder,\r\n error: props.error,\r\n required: props.required,\r\n disabled: props.disabled,\r\n name: props.name || 'dateInputName',\r\n id: props.id || 'dateInputId',\r\n label: props.label,\r\n margin: props.margin,\r\n inputProps: props.inputProps,\r\n InputProps: props.InputProps,\r\n TextFieldComponent: props.TextFieldComponent,\r\n onBlur: props.onBlur,\r\n onFocus: props.onFocus,\r\n };\r\n }, [\r\n props.InputProps,\r\n props.TextFieldComponent,\r\n props.autoFocus,\r\n props.disabled,\r\n props.error,\r\n props.fullWidth,\r\n props.helperText,\r\n props.id,\r\n props.inputProps,\r\n props.label,\r\n props.margin,\r\n props.name,\r\n props.onBlur,\r\n props.onFocus,\r\n props.placeholder,\r\n props.required,\r\n ]);\r\n const keyboardInputProps = React.useMemo(() => {\r\n return {\r\n ...dateInputProps,\r\n minDateMessage: minDateMessage,\r\n maxDateMessage: maxDateMessage,\r\n invalidDateMessage: invalidDateMessage,\r\n ariaLabel: ariaLabel,\r\n startIcon: startIcon,\r\n endIcon: endIcon,\r\n info: info,\r\n labelFunc: labelFunc,\r\n minDate: other.minDate,\r\n maxDate: other.maxDate,\r\n disableFuture: other.disableFuture,\r\n disablePast: other.disablePast,\r\n strictCompareDates: other.strictCompareDates,\r\n };\r\n }, [\r\n ariaLabel,\r\n dateInputProps,\r\n endIcon,\r\n info,\r\n invalidDateMessage,\r\n labelFunc,\r\n maxDateMessage,\r\n minDateMessage,\r\n other.disableFuture,\r\n other.disablePast,\r\n other.maxDate,\r\n other.minDate,\r\n other.strictCompareDates,\r\n startIcon,\r\n ]);\r\n const [dateValue, setDateValue] = React.useState<\r\n Date | string | null | undefined\r\n >(getValueDateOrTruncat(variant, value, endTime, truncateTime));\r\n const [open, setOpen] = React.useState(undefined);\r\n const [validationError, setValidationError] = React.useState<\r\n React.ReactNode | undefined\r\n >(undefined);\r\n const dateTimeValue = React.useMemo(() => {\r\n return getValueDateOrTruncat(variant, value, endTime, truncateTime);\r\n }, [endTime, truncateTime, value, variant]);\r\n React.useEffect(() => {\r\n setDateValue(() => {\r\n if (dateTimeValue === null || dateTimeValue === undefined) {\r\n return null;\r\n } else {\r\n return dateUtils.dateOrStringToDate(dateTimeValue);\r\n }\r\n });\r\n }, [dateTimeValue]);\r\n useKeyUpOutside(\r\n elementRef,\r\n () => {\r\n if (open) {\r\n if (!validationError || validationError === '') {\r\n handleSave();\r\n }\r\n handleClose();\r\n }\r\n },\r\n 'keyup',\r\n 'Tab',\r\n );\r\n // useGlobalDOMEvents({\r\n // keyup(ev) {\r\n // if ((ev as KeyboardEvent).key === 'Tab') {\r\n // console.log('tab event target', ev.target);\r\n // console.log('tab event currentTarget', ev.currentTarget);\r\n // }\r\n // },\r\n // });\r\n // manually trigger rerender using a useless usState hook\r\n // this ensures that the popper is rendered only after the div is rendered and have provided the elementRef value to ancor the popper\r\n const countState = React.useState(0);\r\n React.useEffect(() => {\r\n countState[1](c => c + 1);\r\n // setCount (rerender) needs to occur after element elementRef.current value is bound\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementRef.current]);\r\n\r\n const handleClickAway = (event: React.MouseEvent) => {\r\n if (open) {\r\n if (!validationError || validationError === '') {\r\n handleSave();\r\n }\r\n handleClose();\r\n }\r\n };\r\n const handleSave = React.useCallback(() => {\r\n onChange(setInputViewDate(variant, dateValue, endTime, truncateTime));\r\n setOpen(false);\r\n onClose?.();\r\n }, [dateValue, endTime, onChange, onClose, truncateTime, variant]);\r\n const handleClose = React.useCallback(() => {\r\n setOpen(false);\r\n onClose?.();\r\n }, [onClose]);\r\n const handleOpen = React.useCallback(() => {\r\n setOpen(true);\r\n onOpen?.();\r\n }, [onOpen]);\r\n const togglePicker = React.useCallback(() => {\r\n if (open) {\r\n if (!validationError || validationError === '') {\r\n handleClose();\r\n }\r\n } else {\r\n handleOpen();\r\n }\r\n }, [handleClose, handleOpen, open, validationError]);\r\n const inputDisplayValue = React.useMemo(() => {\r\n return getInputViewDate(variant, dateValue, endTime, truncateTime);\r\n }, [endTime, truncateTime, dateValue, variant]);\r\n\r\n const onError = React.useCallback(\r\n (error: React.ReactNode, value: MaterialUiPickersDate | ParsableDate) => {\r\n setValidationError(error);\r\n if (!!props.onError) {\r\n props.onError(error, value);\r\n }\r\n },\r\n [props],\r\n );\r\n return (\r\n handleClickAway(event)}\r\n >\r\n \r\n {readonlyInput || isMobile ? (\r\n \r\n ) : (\r\n {\r\n setDateValue(date);\r\n if (withCompletion) {\r\n if (!validationError || validationError === '') {\r\n onChange(\r\n setInputViewDate(variant, date, endTime, truncateTime),\r\n inpValue,\r\n );\r\n setOpen(false);\r\n onClose?.();\r\n }\r\n }\r\n // onChange(date, inpValue);\r\n // if (open) {\r\n // setOpen(false);\r\n // onClose?.();\r\n // }\r\n //onChange(setInputViewDate(variant, dateValue, endTime, truncateTime));\r\n }}\r\n onError={(error, date) => {\r\n if (\r\n !!error &&\r\n !!date &&\r\n date !== null &&\r\n dateUtils.dateFnsUtils.isValid(date)\r\n ) {\r\n let setDate = dateUtils.getParsableDate(date);\r\n setDateValue(setDate);\r\n }\r\n\r\n onError(error, date);\r\n }}\r\n ampm={useAmPm}\r\n format={\r\n variant === 'time'\r\n ? dateUtils.DateIOFormats.fullTime\r\n : dateUtils.DateIOFormats.keyboardDate\r\n }\r\n validationError={\r\n keyboardInputProps.error\r\n ? keyboardInputProps.helperText\r\n : undefined\r\n }\r\n {...keyboardInputProps}\r\n />\r\n )}\r\n\r\n ) => {\r\n const target = event.target as any; // as HTMLInputElement;\r\n\r\n if (event.key === 'Enter') {\r\n if (!!target && target.nodeName === 'INPUT') {\r\n // if (!validationError || validationError === '') {\r\n // handleSave();\r\n // }\r\n } else {\r\n if (!validationError || validationError === '') {\r\n handleSave();\r\n } else {\r\n handleClose();\r\n }\r\n }\r\n }\r\n }}\r\n // onBlur={event => {\r\n // console.log('blur event', event.target);\r\n // }}\r\n // modifiers={{\r\n // keepTogether: { enabled: true },\r\n // flip: { enabled: false },\r\n // preventOverflow: {\r\n // enabled: true,\r\n // boundariesElement: 'viewport',\r\n // },\r\n // // offset: {\r\n // // offset: '-15,0',\r\n // // },\r\n // }}\r\n >\r\n {({ TransitionProps }) => (\r\n \r\n \r\n \r\n {closablePicker && (\r\n {\r\n handleClose();\r\n }}\r\n disabled={!!validationError && validationError !== ''}\r\n style={{ position: 'absolute', right: 8, top: 8 }}\r\n >\r\n {!!closeTitle ? (\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 {variant === 'time' ? (\r\n \r\n {useTimeClockPicker ? (\r\n {\r\n if (timeValue !== null) {\r\n // let validateDate = dateUtils.convertToMeridiem(\r\n // timeValue,\r\n // dateUtils.getMeridiem(timeValue),\r\n // useAmPm ?? false,\r\n // );\r\n let error = validateTime(\r\n timeValue.getHours(),\r\n timeValue.getMinutes(),\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: maxDateMessage,\r\n minDateMessage: minDateMessage,\r\n invalidDateMessage: invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n timeValue,\r\n useAmPm ?? false,\r\n );\r\n if (!!error) {\r\n onError(error, validateDate);\r\n } else {\r\n setDateValue(timeValue);\r\n if (saveOnSelect) {\r\n onChange(\r\n setInputViewDate(\r\n variant,\r\n timeValue,\r\n endTime,\r\n truncateTime,\r\n ),\r\n );\r\n setOpen(false);\r\n onClose?.();\r\n }\r\n }\r\n } else {\r\n setDateValue(timeValue);\r\n if (saveOnSelect) {\r\n onChange(\r\n setInputViewDate(\r\n variant,\r\n timeValue,\r\n endTime,\r\n truncateTime,\r\n ),\r\n );\r\n setOpen(false);\r\n onClose?.();\r\n }\r\n }\r\n }}\r\n ampm={useAmPm}\r\n />\r\n ) : (\r\n {\r\n setDateValue(val);\r\n if (withCompletion) {\r\n if (!validationError || validationError === '') {\r\n onChange(\r\n setInputViewDate(\r\n variant,\r\n val,\r\n endTime,\r\n truncateTime,\r\n ),\r\n );\r\n setOpen(false);\r\n onClose?.();\r\n }\r\n }\r\n }}\r\n onBlur={props.onBlur}\r\n error={props.error}\r\n onError={onError}\r\n fullWidth={props.fullWidth || true}\r\n helperText={props.helperText}\r\n disabled={props.disabled}\r\n placeholder={props.placeholder}\r\n required={props.required}\r\n size={props.size}\r\n maxDateMessage={maxDateMessage}\r\n minDateMessage={minDateMessage}\r\n invalidDateMessage={invalidDateMessage}\r\n strictCompareDates={true}\r\n // dateId={`inner-date-${props.dateId ?? 'dateId'}`}\r\n // timeId={`inner-time-${props.timeId ?? 'timeId'}`}\r\n // dateName={`inner-date-${props.dateName ?? 'dateName'}`}\r\n // timeName={`inner-time-${props.timeName ?? 'timeName'}`}\r\n // dateInputProps={props.dateInputProps}\r\n // timeInputProps={props.timeInputProps}\r\n autoFocus={true}\r\n ampm={useAmPm}\r\n minutesStep={props.minutesStep}\r\n {...other}\r\n />\r\n )}\r\n \r\n ) : (\r\n {\r\n if (dateVal !== null) {\r\n let error = validateDate(\r\n dateVal.getDate(),\r\n dateVal.getMonth(),\r\n dateVal.getFullYear(),\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: maxDateMessage,\r\n minDateMessage: minDateMessage,\r\n invalidDateMessage: invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n dateVal,\r\n );\r\n if (!!error) {\r\n onError(error, dateVal);\r\n } else {\r\n setDateValue(dateVal);\r\n if (saveOnSelect) {\r\n onChange(\r\n setInputViewDate(\r\n variant,\r\n dateVal,\r\n endTime,\r\n truncateTime,\r\n ),\r\n );\r\n setOpen(false);\r\n onClose?.();\r\n }\r\n }\r\n } else {\r\n setDateValue(dateVal);\r\n if (saveOnSelect) {\r\n onChange(\r\n setInputViewDate(\r\n variant,\r\n dateVal,\r\n endTime,\r\n truncateTime,\r\n ),\r\n );\r\n setOpen(false);\r\n onClose?.();\r\n }\r\n }\r\n }}\r\n />\r\n )}\r\n {((variant === 'time' && useTimeDropDowns) ||\r\n (variant === 'date' && useDateDropDowns)) && (\r\n
\r\n {variant === 'time' && useTimeDropDowns && (\r\n {\r\n setDateValue(val);\r\n if (withCompletion) {\r\n if (!validationError || validationError === '') {\r\n onChange(\r\n setInputViewDate(\r\n variant,\r\n val,\r\n endTime,\r\n truncateTime,\r\n ),\r\n );\r\n setOpen(false);\r\n onClose?.();\r\n }\r\n }\r\n }}\r\n onBlur={props.onBlur}\r\n error={props.error}\r\n onError={onError}\r\n fullWidth={props.fullWidth || true}\r\n helperText={props.helperText}\r\n disabled={props.disabled}\r\n placeholder={props.placeholder}\r\n required={props.required}\r\n size={props.size}\r\n maxDateMessage={maxDateMessage}\r\n minDateMessage={minDateMessage}\r\n invalidDateMessage={invalidDateMessage}\r\n // dateId={`inner-date-${props.dateId ?? 'dateId'}`}\r\n // timeId={`inner-time-${props.timeId ?? 'timeId'}`}\r\n // dateName={`inner-date-${props.dateName ?? 'dateName'}`}\r\n // timeName={`inner-time-${props.timeName ?? 'timeName'}`}\r\n // dateInputProps={props.dateInputProps}\r\n // timeInputProps={props.timeInputProps}\r\n autoFocus={true}\r\n ampm={useAmPm}\r\n minutesStep={props.minutesStep}\r\n {...other}\r\n />\r\n )}\r\n {variant === 'date' && useDateDropDowns && (\r\n {\r\n setDateValue(val);\r\n if (withCompletion) {\r\n if (!validationError || validationError === '') {\r\n onChange(\r\n setInputViewDate(\r\n variant,\r\n val,\r\n endTime,\r\n truncateTime,\r\n ),\r\n );\r\n setOpen(false);\r\n onClose?.();\r\n }\r\n }\r\n }}\r\n onBlur={props.onBlur}\r\n error={props.error}\r\n onError={onError}\r\n fullWidth={props.fullWidth || true}\r\n helperText={props.helperText}\r\n disabled={props.disabled}\r\n placeholder={props.placeholder}\r\n required={props.required}\r\n size={props.size}\r\n maxDateMessage={maxDateMessage}\r\n minDateMessage={minDateMessage}\r\n invalidDateMessage={invalidDateMessage}\r\n // dateId={`inner-date-${props.dateId ?? 'dateId'}`}\r\n // timeId={`inner-time-${props.timeId ?? 'timeId'}`}\r\n // dateName={`inner-date-${props.dateName ?? 'dateName'}`}\r\n // timeName={`inner-time-${props.timeName ?? 'timeName'}`}\r\n // dateInputProps={props.dateInputProps}\r\n // timeInputProps={props.timeInputProps}\r\n autoFocus={true}\r\n {...other}\r\n />\r\n )}\r\n
\r\n )}\r\n\r\n
\r\n {\r\n if (!validationError || validationError === '') {\r\n handleSave();\r\n }\r\n }}\r\n >\r\n {t(translations.Save)}\r\n \r\n {\r\n handleClose();\r\n }}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n {(clearable || isMobile) && (\r\n {\r\n setDateValue(null);\r\n onChange(null);\r\n setOpen(false);\r\n onClose?.();\r\n }}\r\n >\r\n {t(translations.Clear)}\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","import { RefObject } from 'react';\r\nimport useEventListener from './useEventListener';\r\n\r\ntype Handler = (event: KeyboardEvent) => void;\r\n\r\nexport function useKeyUpOutside(\r\n ref: RefObject,\r\n handler: Handler,\r\n keyboardEvent: 'keyup',\r\n key: string,\r\n): void {\r\n useEventListener(keyboardEvent, event => {\r\n if ((event as KeyboardEvent).key === key) {\r\n const el = ref?.current;\r\n\r\n // Do nothing if clicking ref's element or descendent elements\r\n if (!el || el.contains(event.target as Node)) {\r\n return;\r\n }\r\n\r\n handler(event);\r\n }\r\n });\r\n}\r\n","import * as log from 'loglevel';\r\nimport * as prefix from 'loglevel-plugin-prefix';\r\n\r\nlog.enableAll();\r\n\r\nprefix.apply(log, {\r\n template: '[%t] %l (%n):',\r\n levelFormatter(level) {\r\n return level.toUpperCase();\r\n },\r\n nameFormatter(name) {\r\n return name || 'global';\r\n },\r\n timestampFormatter(date) {\r\n return date.toISOString();\r\n },\r\n});\r\n\r\nlog.setLevel(process.env.NODE_ENV === 'development' ? 'DEBUG' : 'INFO');\r\nlog.info('%s prefix', 'template');\r\n\r\nexport const getLogger = log.getLogger;\r\n","import { PeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { IDatesRange } from './IDatesRange';\r\n\r\nfunction createPeriod(\r\n now: Date,\r\n startFn: (d: Date) => Date,\r\n endFn: (d: Date) => Date,\r\n addFn: (d: Date, n: number) => Date,\r\n offset: number,\r\n): DatesRange {\r\n const d = addFn(now, offset);\r\n return new DatesRange({ start: startFn(d), end: endFn(d) });\r\n}\r\nexport class DatesRange implements IDatesRange {\r\n public start: Date | null = null;\r\n public end: Date | null = null;\r\n constructor(t?: IDatesRange) {\r\n this.start = t?.start ?? null;\r\n this.end = t?.end ?? null;\r\n }\r\n public static fromPreset(\r\n type: PeriodTypesEntity,\r\n st: Date | null,\r\n et: Date | null,\r\n ): { start: Date | null; end: Date | null } {\r\n const now = new Date();\r\n switch (type.Id) {\r\n case 'CustomDate':\r\n return { start: st, end: et };\r\n case 'ThisMonth':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfMonth,\r\n dateUtils.endOfMonth,\r\n dateUtils.addMonths,\r\n 0,\r\n );\r\n case 'LastMonth':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfMonth,\r\n dateUtils.endOfMonth,\r\n dateUtils.addMonths,\r\n -1,\r\n );\r\n case 'NextMonth':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfMonth,\r\n dateUtils.endOfMonth,\r\n dateUtils.addMonths,\r\n 1,\r\n );\r\n case 'ThisQuarter':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfQuarter,\r\n dateUtils.endOfQuarter,\r\n dateUtils.addQuarters,\r\n 0,\r\n );\r\n case 'LastQuarter':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfQuarter,\r\n dateUtils.endOfQuarter,\r\n dateUtils.addQuarters,\r\n -1,\r\n );\r\n case 'NextQuarter':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfQuarter,\r\n dateUtils.endOfQuarter,\r\n dateUtils.addQuarters,\r\n 1,\r\n );\r\n case 'ThisWeek':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfWeek,\r\n dateUtils.endOfWeek,\r\n dateUtils.addWeeks,\r\n 0,\r\n );\r\n case 'LastWeek':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfWeek,\r\n dateUtils.endOfWeek,\r\n dateUtils.addWeeks,\r\n -1,\r\n );\r\n case 'NextWeek':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfWeek,\r\n dateUtils.endOfWeek,\r\n dateUtils.addWeeks,\r\n 1,\r\n );\r\n case 'ThisYear':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfYear,\r\n dateUtils.endOfYear,\r\n dateUtils.addYears,\r\n 0,\r\n );\r\n case 'LastYear':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfYear,\r\n dateUtils.endOfYear,\r\n dateUtils.addYears,\r\n -1,\r\n );\r\n case 'NextYear':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfYear,\r\n dateUtils.endOfYear,\r\n dateUtils.addYears,\r\n 1,\r\n );\r\n case 'Today':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfDay,\r\n dateUtils.endOfDay,\r\n dateUtils.addDays,\r\n 0,\r\n );\r\n case 'TodayTomorrow':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfDay,\r\n dateUtils.endOfTomorrow,\r\n dateUtils.addDays,\r\n 0,\r\n );\r\n case 'Tomorrow':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfDay,\r\n dateUtils.endOfDay,\r\n dateUtils.addDays,\r\n 1,\r\n );\r\n case 'Yesterday':\r\n return createPeriod(\r\n now,\r\n dateUtils.startOfDay,\r\n dateUtils.endOfDay,\r\n dateUtils.addDays,\r\n -1,\r\n );\r\n default:\r\n assertExhaustive(type.Id);\r\n }\r\n }\r\n}\r\n","/**\r\n * Parses the stored relative HRef without in a way to match how URL is parsed to produce the pathName + search\r\n * Used to save the stored filters/pathnames in the pages with the filters.\r\n * Has to be backward compatible with the aspx filters where only the search without the path was stored (e.g. foo=bar&baz=...)\r\n * @param value stored \"saved url\" value\r\n * @returns pathName + search\r\n */\r\nexport const parseProfileUrl = (\r\n value?: string,\r\n): {\r\n pathName?: string;\r\n search?: string;\r\n} => {\r\n if (value === undefined || value === null) {\r\n return {\r\n pathName: undefined,\r\n search: undefined,\r\n };\r\n }\r\n const i = value.indexOf('?');\r\n if (i < 0) {\r\n return {\r\n pathName: undefined,\r\n search: '?' + value,\r\n };\r\n }\r\n\r\n const part1 = value.slice(0, i);\r\n const part2 = value.slice(i + 1);\r\n\r\n return {\r\n pathName: undefinedIfIsEmpty(part1),\r\n search: undefinedIfIsEmpty(part2),\r\n };\r\n};\r\n\r\nexport const undefinedIfIsEmpty = (\r\n s: string | null | undefined,\r\n): string | undefined => (isEmpty(s) ? undefined : s ?? undefined);\r\n\r\nexport const isEmpty = (s: string | null | undefined): boolean => {\r\n if (s === null || s === undefined) {\r\n return true;\r\n }\r\n if (s.trim() === '') {\r\n return true;\r\n }\r\n return false;\r\n};\r\n","import { useAppSettingsSlice } from 'app/slice';\r\nimport { selectIsExpandedSideBar } from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { UserProfile } from 'utils/userProfileSettings';\r\nimport { useIsMobile } from './useIsMobile';\r\ninterface ExpandedType {\r\n expand: (value: boolean) => void;\r\n expandLocal: (value: boolean) => void;\r\n toggle: () => void;\r\n}\r\nexport function userProfileComparer(\r\n prev: readonly [UserProfile],\r\n next: readonly [UserProfile],\r\n) {\r\n if (!!prev[0] && !!prev[0].savedSettings) {\r\n if (prev[0].savedSettings.length === next[0].savedSettings.length) {\r\n let prevExpanded = prev[0].GetSideBarExpanded('SideBarExpanded');\r\n let nextExpanded = next[0].GetSideBarExpanded('SideBarExpanded');\r\n if (prevExpanded !== nextExpanded) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction useExpandedSideBarState(defaultValue?: boolean): ExpandedType {\r\n const { checkIsMobile } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const isExpanded = useSelector(state =>\r\n selectIsExpandedSideBar(state, isMobile),\r\n );\r\n //const userProfileSett = useSelector(selectUserProfileSettings);\r\n // const [expanded, setExpanded] = React.useState(\r\n // !!defaultValue ? defaultValue : isExpanded,\r\n // );\r\n // const [lastExpandedTime, setLastExpandedTime] = React.useState<\r\n // number | undefined\r\n // >(undefined);\r\n // const userProfileSettCompared = useCustomCompareMemo(\r\n // () => {\r\n // return userProfileSett;\r\n // },\r\n // [userProfileSett],\r\n // userProfileComparer,\r\n // );\r\n // const userProfExpanded = React.useMemo(() => {\r\n // return userProfileSettCompared?.GetSideBarExpanded('SideBarExpanded');\r\n // }, [userProfileSettCompared]);\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n // useEffectOnMount(() => {\r\n // let defaultval = isMobile\r\n // ? !!defaultValue\r\n // ? defaultValue\r\n // : isExpanded\r\n // : userProfExpanded ?? true;\r\n // dispatch(actions.updateExpandedState_Local(defaultval));\r\n // // if (isMobile) {\r\n // // setExpanded(isExpanded);\r\n // // } else {\r\n // // setExpanded(userProfExpanded ?? true);\r\n // // }\r\n // });\r\n // React.useEffect(() => {\r\n // if (isMobile) {\r\n // setExpanded(isExpanded);\r\n // } else {\r\n // setExpanded(userProfExpanded ?? true);\r\n // }\r\n // }, [isExpanded, isMobile, userProfExpanded]);\r\n\r\n const expand = React.useCallback(\r\n (value: boolean) => {\r\n dispatch(actions.updateExpandedState_Local(value));\r\n if (!isMobile) {\r\n dispatch(actions.updateExpandedState(value));\r\n }\r\n // if (value === true) {\r\n // setLastExpandedTime(new Date().getTime());\r\n // }\r\n },\r\n [actions, dispatch, isMobile],\r\n );\r\n const expandLocal = React.useCallback(\r\n (value: boolean) => {\r\n dispatch(actions.updateExpandedState_Local(value));\r\n // if (value === true) {\r\n // setLastExpandedTime(new Date().getTime());\r\n // }\r\n },\r\n [actions, dispatch],\r\n );\r\n const toggle = React.useCallback(() => {\r\n dispatch(actions.updateExpandedState_Local(!isExpanded));\r\n if (!isMobile) {\r\n dispatch(actions.updateExpandedState(!isExpanded));\r\n }\r\n // if (!lastExpandedTime) {\r\n // dispatch(actions.updateExpandedState_Local(!isExpanded));\r\n // if (!isMobile) {\r\n // dispatch(actions.updateExpandedState(!isExpanded));\r\n // }\r\n // if (isExpanded === true) {\r\n // setLastExpandedTime(new Date().getTime());\r\n // }\r\n // } else {\r\n // if (!!lastExpandedTime && new Date().getTime() - lastExpandedTime > 500) {\r\n // dispatch(actions.updateExpandedState_Local(!isExpanded));\r\n // if (!isMobile) {\r\n // dispatch(actions.updateExpandedState(!isExpanded));\r\n // }\r\n // }\r\n // }\r\n }, [actions, dispatch, isExpanded, isMobile]);\r\n\r\n return { expand, expandLocal, toggle };\r\n}\r\n\r\nexport default useExpandedSideBarState;\r\n","import {\r\n FormControlProps as MuiFormControlProps,\r\n FormControl as MuiFormControl,\r\n} from '@material-ui/core';\r\nimport clsx from 'clsx';\r\nimport * as React from 'react';\r\nexport interface FormControlProps extends MuiFormControlProps {\r\n boxed?: boolean;\r\n}\r\nconst FormControl = (props: FormControlProps) => {\r\n const { boxed, className, ...other } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default FormControl;\r\n","/* eslint-disable prettier/prettier */\r\nimport { RowActionsProps } from 'app/components/BasicTable/RowActions';\r\nimport { Roles } from 'app/slice/types';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { isEmptyOrWhitespace, toLowerCaseSafely } from 'utils/typeUtils';\r\nimport {\r\n AuthenticatedUser,\r\n IAuthenticatedUser,\r\n isInRole,\r\n} from './AuthenticatedUser';\r\n\r\nexport interface SiteMapSettings {\r\n userNodes: SiteMapNode[];\r\n rootNode: SiteMapNode;\r\n}\r\nexport enum MainTabs {\r\n Dashboard = 1,\r\n Cores = 2,\r\n Assets = 3,\r\n RoomMap = 4,\r\n Reservations = 5,\r\n Trainings = 6,\r\n Consumables = 7,\r\n Samples = 8,\r\n WorkOrders = 9,\r\n LoanDesk = 10,\r\n Eln = 11,\r\n Colonies = 12,\r\n Budgets = 13,\r\n Billing = 14,\r\n Messages = 15,\r\n Users = 16,\r\n Suppliers = 17,\r\n Expenses = 18,\r\n LargeAnimals = 19,\r\n Reports = 20,\r\n SystemSettings = 21,\r\n}\r\nexport type MainTabsUnion = keyof typeof MainTabs;\r\nexport const MainTabsUnionArray: Array = [\r\n 'Dashboard',\r\n 'Cores',\r\n 'Assets',\r\n 'RoomMap',\r\n 'Reservations',\r\n 'Trainings',\r\n 'Consumables',\r\n 'Samples',\r\n 'WorkOrders',\r\n 'LoanDesk',\r\n 'Eln',\r\n 'Colonies',\r\n 'Budgets',\r\n 'Billing',\r\n 'Messages',\r\n 'Users',\r\n 'Suppliers',\r\n 'Expenses',\r\n 'LargeAnimals',\r\n 'Reports',\r\n 'SystemSettings',\r\n];\r\nexport enum AssetsSubTab {\r\n AssetsTabSetting = 1,\r\n InstrumentsTabSettings = 2,\r\n LocationsTabSettings = 3,\r\n}\r\nexport type AssetsSubTabUnion = keyof typeof AssetsSubTab;\r\nexport const AssetsSubTabUnionArray: Array = [\r\n 'AssetsTabSetting',\r\n 'InstrumentsTabSettings',\r\n 'LocationsTabSettings',\r\n];\r\nexport interface SiteMapNode {\r\n Roles?: string[];\r\n HasChildNodes: boolean;\r\n Key?: string;\r\n ResourceKey?: string;\r\n Title: string;\r\n Description?: string;\r\n RootNode: SiteMapNode | null;\r\n Url: string;\r\n ChildNodes: SiteMapNode[];\r\n icon?: string;\r\n reactUrl: string;\r\n HideReact: boolean;\r\n isAdminNode: boolean;\r\n ParentNode: SiteMapNode | null;\r\n Hide: boolean;\r\n LinkWithChildren?: string | null;\r\n MainTab?: string;\r\n SubTab?: string;\r\n IsAdminSettings?: boolean;\r\n GroupTab?: number;\r\n IsLastTab?: boolean;\r\n}\r\nexport const NoAuthNodes = (t: TFunction): SiteMapNode[] => {\r\n return [\r\n {\r\n Roles: [],\r\n HasChildNodes: false,\r\n Key: undefined,\r\n ResourceKey: undefined,\r\n Title: t(translations.reg_NewUserRegistration) as string,\r\n Description: undefined,\r\n RootNode: null,\r\n Url: '/RegisterAccount',\r\n ChildNodes: [],\r\n icon: undefined,\r\n reactUrl: '/RegisterAccount',\r\n HideReact: false,\r\n isAdminNode: false,\r\n ParentNode: null,\r\n Hide: false,\r\n MainTab: undefined,\r\n SubTab: undefined,\r\n IsAdminSettings: false,\r\n GroupTab: undefined,\r\n },\r\n {\r\n Roles: [],\r\n HasChildNodes: false,\r\n Key: undefined,\r\n ResourceKey: undefined,\r\n Title: t(translations.reg_NewUserRegistration) as string,\r\n Description: undefined,\r\n RootNode: null,\r\n Url: '/Assets/Public',\r\n ChildNodes: [],\r\n icon: undefined,\r\n reactUrl: '/Assets/Public',\r\n HideReact: false,\r\n isAdminNode: false,\r\n ParentNode: null,\r\n Hide: false,\r\n MainTab: undefined,\r\n SubTab: undefined,\r\n IsAdminSettings: false,\r\n GroupTab: undefined,\r\n },\r\n {\r\n Roles: [],\r\n HasChildNodes: false,\r\n Key: undefined,\r\n ResourceKey: undefined,\r\n Title: t(translations.reg_NewUserRegistration) as string,\r\n Description: undefined,\r\n RootNode: null,\r\n Url: '/Assets/Details',\r\n ChildNodes: [],\r\n icon: undefined,\r\n reactUrl: '/Assets/Details',\r\n HideReact: false,\r\n isAdminNode: false,\r\n ParentNode: null,\r\n Hide: false,\r\n MainTab: undefined,\r\n SubTab: undefined,\r\n IsAdminSettings: false,\r\n GroupTab: undefined,\r\n },\r\n ] as SiteMapNode[];\r\n};\r\n\r\nexport class SiteMapProvider {\r\n settings: SiteMapSettings | null;\r\n constructor(sett: SiteMapSettings | null) {\r\n this.settings = sett;\r\n }\r\n // public getAdminNodes(): SiteMapNode[] {\r\n // if (\r\n // !!this.settings &&\r\n // this.settings !== null &&\r\n // !!this.settings.adminNodes\r\n // ) {\r\n // //console.log('adminNodes', this.settings.adminNodes);\r\n // return this.settings.adminNodes;\r\n // } else {\r\n // //console.log('empty admin nodes');\r\n // return [] as SiteMapNode[];\r\n // }\r\n // }\r\n public getUserNodes(): SiteMapNode[] {\r\n if (\r\n !!this.settings &&\r\n this.settings !== null &&\r\n !!this.settings.userNodes\r\n ) {\r\n //console.log('userNodes', this.settings.userNodes);\r\n return this.settings.userNodes;\r\n } else {\r\n //console.log('empty user nodes');\r\n return [] as SiteMapNode[];\r\n }\r\n }\r\n public getCurrentMainNode(pathname: string): SiteMapNode | undefined {\r\n let node: SiteMapNode[] | undefined = undefined;\r\n let searchItem = pathname;\r\n if (!!this.settings && this.settings != null) {\r\n node = this.settings.userNodes\r\n .filter(f => f.Hide === false)\r\n .filter((item, index) => {\r\n if (item.ChildNodes.length > 0) {\r\n let irurl = toLowerCaseSafely(item.reactUrl);\r\n\r\n return (\r\n item.ChildNodes.filter(chitem => {\r\n let rurl = toLowerCaseSafely(chitem.reactUrl);\r\n if (rurl !== null) {\r\n let rpath = rurl.split('?')[0] ?? rurl;\r\n return searchItem.toLowerCase().indexOf(rpath) > -1;\r\n } else {\r\n return chitem.Url.toLowerCase().indexOf(searchItem) > -1;\r\n }\r\n }).length > 0 ||\r\n (irurl !== null\r\n ? searchItem\r\n .toLowerCase()\r\n .indexOf(irurl.split('?')[0] ?? irurl) > -1\r\n : item.Url.toLowerCase().indexOf(searchItem) > -1) === true\r\n );\r\n } else {\r\n let irurl = toLowerCaseSafely(item.reactUrl);\r\n let prurl =\r\n item.ParentNode !== null\r\n ? toLowerCaseSafely(item.ParentNode.reactUrl)\r\n : null;\r\n let purl = item.ParentNode !== null ? item.ParentNode.Url : null;\r\n return (\r\n (irurl !== null\r\n ? searchItem\r\n .toLowerCase()\r\n .indexOf(irurl.split('?')[0] ?? irurl) > -1\r\n : item.Url.toLowerCase().indexOf(searchItem) > -1) === true ||\r\n (item.ParentNode !== null && prurl !== null\r\n ? searchItem\r\n .toLowerCase()\r\n .indexOf(prurl.split('?')[0] ?? prurl) > -1\r\n : purl !== null\r\n ? purl.toLowerCase().indexOf(searchItem) > -1\r\n : false)\r\n );\r\n }\r\n });\r\n }\r\n // There may be multiple results.\r\n // This happens when the react page is selected.\r\n // It is necessary to choose the result whose reactUrl length is longer.\r\n if (node !== undefined && node.length > 0) {\r\n let res: SiteMapNode | undefined = node[0];\r\n if (node.length > 1) {\r\n var rurl = '';\r\n node.forEach(item => {\r\n item.ChildNodes.forEach(chitem => {\r\n let rurl1 = toLowerCaseSafely(chitem.reactUrl);\r\n if (rurl1 !== null) {\r\n let rpath = rurl1.split('?')[0] ?? rurl1;\r\n if (searchItem.toLowerCase().indexOf(rpath) > -1) {\r\n if (rpath.length > rurl.length) {\r\n res = item;\r\n rurl = rpath;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n //console.log('getCurrentNode', node);\r\n return res;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n public currentMainNodeIsAdmin(pathname: string): boolean | undefined {\r\n let isAdmin = this.getCurrentMainNode(pathname)?.isAdminNode;\r\n //console.log('isAdmin', isAdmin);\r\n return isAdmin;\r\n }\r\n public getCurrentNodes(pathname: string): SiteMapNode[] {\r\n return this.getUserNodes().filter(f => f.Hide === false);\r\n // let isAdmin = this.currentMainNodeIsAdmin(pathname);\r\n // if (isAdmin) {\r\n // return this.getAdminNodes().filter(f => f.Hide === false);\r\n // } else {\r\n // return this.getUserNodes().filter(f => f.Hide === false);\r\n // }\r\n }\r\n public findNode(pathname: string): SiteMapNode | undefined {\r\n let node: SiteMapNode | undefined = undefined;\r\n if (!!this.settings && this.settings != null) {\r\n let parentNodes = this.settings.userNodes;\r\n let childNodes = this.settings.userNodes.map(f => f.ChildNodes).flat();\r\n const currentPathNameLowered = pathname.toLowerCase();\r\n // first try exact match node\r\n node = childNodes.find(element => {\r\n const elementURL = element.reactUrl ?? element.Url;\r\n const [elementPathName] = elementURL.split('?');\r\n return currentPathNameLowered === elementPathName?.toLowerCase();\r\n });\r\n // then if no exact match was found - try the indexOf for whatever reason it was done originally\r\n if (!node) {\r\n childNodes.find(element => {\r\n if (element !== undefined) {\r\n const reactUrl = toLowerCaseSafely(element.reactUrl);\r\n\r\n if (reactUrl !== null) {\r\n let rpath = reactUrl.split('?')[0] ?? reactUrl;\r\n //return pathname.toLowerCase() === rpath;\r\n return pathname.toLowerCase().indexOf(rpath) > -1;\r\n } else {\r\n return (\r\n element.Url.toLowerCase().indexOf(pathname.toLowerCase()) > -1\r\n );\r\n }\r\n }\r\n return undefined;\r\n });\r\n }\r\n if (!node) {\r\n node = parentNodes.find(element => {\r\n if (element !== undefined) {\r\n const reactUrl = toLowerCaseSafely(element.reactUrl);\r\n if (reactUrl !== null) {\r\n let rpath = reactUrl.split('?')[0] ?? reactUrl;\r\n //return pathname.toLowerCase() === rpath;\r\n return pathname.toLowerCase().indexOf(rpath) > -1;\r\n } else {\r\n return (\r\n element.Url.toLowerCase().indexOf(pathname.toLowerCase()) > -1\r\n );\r\n }\r\n }\r\n return undefined;\r\n });\r\n }\r\n }\r\n return node;\r\n }\r\n public updatePath(pathname: string | undefined, newSearch: string) {\r\n if (!!this.settings && this.settings != null && pathname) {\r\n this.getCurrentNodes(pathname)\r\n .map(f => f.ChildNodes)\r\n .flat()\r\n .forEach(element => {\r\n if (element !== undefined) {\r\n const reactUrl = element.reactUrl;\r\n if (reactUrl !== undefined && reactUrl !== null) {\r\n const elementPath = reactUrl.split('?')[0] ?? reactUrl;\r\n if (elementPath === pathname) {\r\n element.reactUrl = `${pathname}?${newSearch}`;\r\n element.Url = `${pathname}?${newSearch}`;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n public accesibleByRole(pathname: string, user?: IAuthenticatedUser): boolean {\r\n if (user) {\r\n let currentNode = this.findNode(pathname);\r\n if (currentNode) {\r\n if (currentNode.Roles && currentNode.Roles.length > 0) {\r\n return (\r\n currentNode.Roles.filter(item => isInRole(user, item)).length > 0\r\n );\r\n } else if (\r\n currentNode.ParentNode !== null &&\r\n currentNode.ParentNode.Roles &&\r\n currentNode.ParentNode.Roles.length > 0\r\n ) {\r\n return (\r\n currentNode.ParentNode.Roles.filter(item => isInRole(user, item))\r\n .length > 0\r\n );\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n public nodeAccesibleByRole(\r\n node: SiteMapNode,\r\n user?: IAuthenticatedUser,\r\n ): boolean {\r\n if (user) {\r\n if (node) {\r\n if (node.Roles && node.Roles.length > 0) {\r\n return node.Roles.filter(item => isInRole(user, item)).length > 0;\r\n } else if (\r\n node.ParentNode !== null &&\r\n node.ParentNode.Roles &&\r\n node.ParentNode.Roles.length > 0\r\n ) {\r\n return (\r\n node.ParentNode.Roles.filter(item => isInRole(user, item)).length >\r\n 0\r\n );\r\n }else {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n public findMainTabNode(menuTab: MainTabsUnion) {\r\n let filtered = this.getUserNodes().filter(\r\n f => f.Hide === false && !!f.MainTab && f.MainTab === menuTab,\r\n );\r\n if (!!filtered && filtered.length > 0) {\r\n return filtered[0];\r\n }\r\n return undefined;\r\n }\r\n public adminSettingsNodes(node: SiteMapNode, user?: AuthenticatedUser) {\r\n let result: SiteMapNode[] = [];\r\n const isAdmin =\r\n isInRole(user, Roles.Administrators) ||\r\n isInRole(user, Roles.GroupAdministrators) ||\r\n isInRole(user, Roles.EquipmentAdministrator);\r\n if (\r\n isAdmin &&\r\n node.ChildNodes.length > 0 &&\r\n !!node.MainTab &&\r\n node.ChildNodes.some(f => f.IsAdminSettings)\r\n ) {\r\n let filtered = node.ChildNodes.filter(\r\n f => f.IsAdminSettings && this.nodeAccesibleByRole(f, user),\r\n ).map((it, index) => {\r\n return it;\r\n });\r\n return filtered;\r\n }\r\n return result;\r\n }\r\n public adminSettingsActions(\r\n menuTab: MainTabsUnion,\r\n user?: AuthenticatedUser,\r\n subTab?: any,\r\n action?: (link: string) => void,\r\n ) {\r\n let result: RowActionsProps[] = [];\r\n const isAdmin =\r\n isInRole(user, Roles.Administrators) ||\r\n isInRole(user, Roles.GroupAdministrators) ||\r\n isInRole(user, Roles.EquipmentAdministrator);\r\n let node = this.findMainTabNode(menuTab);\r\n if (\r\n isAdmin &&\r\n !!node &&\r\n node.ChildNodes.length > 0 &&\r\n !!node.MainTab &&\r\n node.ChildNodes.some(f => f.IsAdminSettings)\r\n ) {\r\n let filtered = node.ChildNodes.filter(\r\n f =>\r\n f.IsAdminSettings &&\r\n this.nodeAccesibleByRole(f, user) &&\r\n (!subTab || (!isEmptyOrWhitespace(subTab) && subTab === f.SubTab)),\r\n ).map((it, index) => {\r\n return it;\r\n });\r\n if (!!filtered && filtered.length > 0) {\r\n let subTabTitle =\r\n filtered.filter(f => !!f.SubTab).length > 0\r\n ? filtered.filter(f => !!f.SubTab)[0].SubTab\r\n : 'Settings';\r\n result.push({\r\n localizedText: subTabTitle === 'Settings' ? undefined : subTabTitle,\r\n text: subTabTitle === 'Settings' ? subTabTitle : '',\r\n icon: 'circle',\r\n renderAsTitle: true,\r\n });\r\n filtered.forEach((item, index) => {\r\n result.push({\r\n href:\r\n !action && isEmptyOrWhitespace(item.reactUrl)\r\n ? item.Url\r\n : undefined,\r\n to: !isEmptyOrWhitespace(item.reactUrl) ? item.reactUrl : undefined,\r\n text: item.Title,\r\n icon: 'circle-small',\r\n onClick:\r\n !!action && isEmptyOrWhitespace(item.reactUrl)\r\n ? () => action(item.Url)\r\n : undefined,\r\n } as RowActionsProps);\r\n });\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n","import { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport { CheckEntity } from 'app/components/CheckBoxGroup';\r\nimport {\r\n RepeatMonthlyBy,\r\n RepeatPeriod,\r\n RepetitiveOptions,\r\n} from 'enums/RepetitiveOptions';\r\nimport { WorkWeekDays } from 'enums/WorkWeekDays';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { dateUtils, WeekStartsOn } from 'utils/date-utils';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { Entity } from './common';\r\nimport { Timestamp } from './Timestamp';\r\n\r\nexport interface IRepetitiveDto {\r\n StartDate?: Date | string;\r\n RecurringEvents?: Entity | null;\r\n RecurringEndDate?: Date | string;\r\n RepeatsEveryDay?: Entity | null;\r\n RepeatsEveryPeriod?: Entity | null;\r\n RepeatsMonthlyBy?: Entity | null;\r\n RepeatsOnDays: CheckEntity[];\r\n}\r\nexport interface RepetitiveIntervals {\r\n start: Date;\r\n end: Date;\r\n}\r\nexport const ShortWeekDays = (): CheckEntity[] => {\r\n return dateUtils.getShortDaysArray().map((day, index) => {\r\n return {\r\n Id: index + 1,\r\n Name: day,\r\n checked: false,\r\n } as CheckEntity;\r\n });\r\n};\r\nexport const LongWeekDays = (): CheckEntity[] => {\r\n return dateUtils.getLongDaysArray().map((day, index) => {\r\n return {\r\n Id: index + 1,\r\n Name: day,\r\n checked: false,\r\n } as CheckEntity;\r\n });\r\n};\r\nexport const RepetitiveInit = (\r\n date?: Date | string,\r\n option?: number,\r\n): IRepetitiveDto => {\r\n const startDate = dateUtils.dateOrStringToDate(date || new Date());\r\n const untilDate = dateUtils.dateFnsUtils.addDays(startDate, 7);\r\n return {\r\n StartDate: dateUtils.formatISO(dateUtils.dateOrStringToDate(startDate)),\r\n RecurringEvents: enumToEntityArray(RepetitiveOptions)[option ?? 0],\r\n RepeatsOnDays: ShortWeekDays().map(f => {\r\n if (f.Id === 1) f.checked = true;\r\n return f;\r\n }),\r\n RecurringEndDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(untilDate),\r\n ),\r\n RepeatsEveryDay: { Id: 1, Name: '1' } as Entity,\r\n RepeatsEveryPeriod: enumToEntityArray(RepeatPeriod)[1],\r\n RepeatsMonthlyBy: enumToEntityArray(RepeatMonthlyBy)[0],\r\n };\r\n};\r\nexport const GetAutoCreateTitle = (\r\n type: IWorkOrderTypeDto,\r\n eventStart: Date | Timestamp | null,\r\n firstDayOfWeek: WeekStartsOn,\r\n): string | undefined => {\r\n let title: string | undefined = undefined;\r\n if (type.AutoCreateEvent && type.AutoCreateFor !== 0) {\r\n if (type.RepetitiveOptions > 0) {\r\n switch (type.RepetitiveOptions) {\r\n case RepetitiveOptions.RepeatCustom:\r\n let periodName = enumToEntityArray(RepeatPeriod).filter(\r\n f => f.Id === type.RepeatsEveryType,\r\n )[0].Name;\r\n if (type.RepeatsEveryType === RepeatPeriod.Days) {\r\n title = `Repeats every ${type.RepeatsEveryNum} - ${periodName}`;\r\n } else if (type.RepeatsEveryType === RepeatPeriod.Weeks) {\r\n title = `Repeats every ${type.RepeatsEveryNum} - ${periodName} on ${\r\n LongWeekDays().filter(f => f.Id.toString() === type.RepeatsOn)[0]\r\n .Name\r\n }`;\r\n } else {\r\n title = `Repeats every ${type.RepeatsEveryNum} - ${periodName} by ${\r\n enumToEntityArray(RepeatMonthlyBy).filter(\r\n f => f.Id === type.RepeatsBy,\r\n )[0].Name\r\n }`;\r\n }\r\n break;\r\n case RepetitiveOptions.RepeatDaily:\r\n title = 'Repeats Daily';\r\n break;\r\n case RepetitiveOptions.RepeatWeeklyOn:\r\n title = `Repeats ${i18next\r\n .t(translations.RepeatWeeklyOn)\r\n .replace(\r\n '{0}',\r\n dateUtils.getDayText(\r\n dateUtils.parseISOOrNull(eventStart) ?? new Date(),\r\n ),\r\n )}`;\r\n break;\r\n case RepetitiveOptions.RepeatMonthlyOn:\r\n let weekName = i18next.t(\r\n enumToEntityArray(WorkWeekDays).filter(\r\n f =>\r\n dateUtils.getWeekNumberOfMonth(\r\n dateUtils.parseISOOrNull(eventStart) ?? new Date(),\r\n firstDayOfWeek,\r\n ) === f.Id,\r\n )[0].Name,\r\n );\r\n title = `Repeats ${i18next\r\n .t(translations.RepeatMonthlyOn)\r\n .replace('{0}', weekName)\r\n .replace(\r\n '{1}',\r\n dateUtils.getDayText(\r\n dateUtils.parseISOOrNull(eventStart) ?? new Date(),\r\n ),\r\n )}`;\r\n break;\r\n case RepetitiveOptions.RepeatEveryWeekDay:\r\n let weekDays = `${\r\n dateUtils.getLongDaysArray()[firstDayOfWeek as number]\r\n } - ${\r\n dateUtils.getLongDaysArray()[\r\n dateUtils.getLongDaysArray().length - 2\r\n ]\r\n }`;\r\n title = `Repeats ${i18next\r\n .t(translations.RepeatEveryWeekDay)\r\n .replace('{0}', weekDays)}`;\r\n break;\r\n }\r\n }\r\n }\r\n return title;\r\n};\r\nexport const GetIntervals = (\r\n start: Date,\r\n data: IRepetitiveDto,\r\n firstDayOfWeek?: number,\r\n): Date[] => {\r\n let dates: Date[] = [];\r\n if (start && data.RecurringEndDate) {\r\n let originStart = dateUtils.dateOrStringToDate(start);\r\n let originalEnd = dateUtils.dateOrStringToDate(data.RecurringEndDate);\r\n if (data.RecurringEvents && data.RecurringEvents !== null) {\r\n if (\r\n data.RecurringEvents.Id !== (RepetitiveOptions.DoNotRepeat as number)\r\n ) {\r\n switch (data.RecurringEvents.Id) {\r\n case RepetitiveOptions.RepeatDaily as number:\r\n let days = dateUtils.differenceInCalendarDays(\r\n originalEnd,\r\n originStart,\r\n );\r\n dates = [...Array(days + 1).keys()].map(i =>\r\n dateUtils.addDays(originStart, i),\r\n );\r\n break;\r\n case RepetitiveOptions.RepeatWeeklyOn as number:\r\n dates.push(originStart);\r\n let nextWeek = dateUtils.addWeeks(originStart, 1);\r\n while (nextWeek < originalEnd) {\r\n dates.push(nextWeek);\r\n nextWeek = dateUtils.addWeeks(nextWeek, 1);\r\n }\r\n break;\r\n case RepetitiveOptions.RepeatMonthlyOn as number:\r\n // let week = dateUtils.getWeekNumberOfMonth(\r\n // originStart,\r\n // firstDayOfWeek,\r\n // );\r\n dates.push(originStart);\r\n let dayWeek = dateUtils.getDay(originStart);\r\n let newMonthDate = dateUtils.addMonths(originStart, 1);\r\n let newDayWeek = dateUtils.getDay(newMonthDate);\r\n let calcDay =\r\n dayWeek >= newDayWeek\r\n ? dayWeek - newDayWeek\r\n : 7 - (newDayWeek - dayWeek);\r\n let checkDate = dateUtils.addDays(newMonthDate, calcDay);\r\n if (checkDate.getMonth() > newMonthDate.getMonth()) {\r\n newMonthDate = dateUtils.addDays(newMonthDate, calcDay - 7);\r\n } else if (checkDate.getMonth() === newMonthDate.getMonth()) {\r\n if (\r\n checkDate.getDate() > newMonthDate.getDate() &&\r\n (dateUtils.addDays(newMonthDate, calcDay - 7).getFullYear() ===\r\n checkDate.getFullYear()\r\n ? !(\r\n dateUtils.addDays(newMonthDate, calcDay - 7).getMonth() <\r\n checkDate.getMonth()\r\n )\r\n : dateUtils.addDays(newMonthDate, calcDay - 7).getMonth() <\r\n checkDate.getMonth())\r\n ) {\r\n newMonthDate = dateUtils.addDays(newMonthDate, calcDay - 7);\r\n } else {\r\n newMonthDate = checkDate;\r\n }\r\n } else {\r\n newMonthDate = checkDate;\r\n }\r\n //newMonth = dateUtils.setWeek(newMonth, week, firstDayOfWeek);\r\n //newMonth = dateUtils.setDay(newMonth, dayWeek, firstDayOfWeek);\r\n let counter = 1;\r\n while (newMonthDate <= originalEnd) {\r\n dates.push(newMonthDate);\r\n counter++;\r\n newMonthDate = dateUtils.addMonths(originStart, counter);\r\n let newDayWeek = dateUtils.getDay(newMonthDate);\r\n let calcDay =\r\n dayWeek >= newDayWeek\r\n ? dayWeek - newDayWeek\r\n : 7 - (newDayWeek - dayWeek);\r\n let checkDate = dateUtils.addDays(newMonthDate, calcDay);\r\n if (checkDate.getMonth() > newMonthDate.getMonth()) {\r\n newMonthDate = dateUtils.addDays(newMonthDate, calcDay - 7);\r\n } else if (checkDate.getMonth() === newMonthDate.getMonth()) {\r\n if (\r\n checkDate.getDate() > newMonthDate.getDate() &&\r\n (dateUtils\r\n .addDays(newMonthDate, calcDay - 7)\r\n .getFullYear() === checkDate.getFullYear()\r\n ? !(\r\n dateUtils\r\n .addDays(newMonthDate, calcDay - 7)\r\n .getMonth() < checkDate.getMonth()\r\n )\r\n : dateUtils.addDays(newMonthDate, calcDay - 7).getMonth() <\r\n checkDate.getMonth())\r\n ) {\r\n newMonthDate = dateUtils.addDays(newMonthDate, calcDay - 7);\r\n } else {\r\n newMonthDate = checkDate;\r\n }\r\n } else {\r\n newMonthDate = checkDate;\r\n }\r\n }\r\n break;\r\n case RepetitiveOptions.RepeatEveryWeekDay as number:\r\n dates.push(originStart);\r\n let theDay = dateUtils.getDay(originStart);\r\n let firstDay = dateUtils.getDay(\r\n dateUtils.startOfWeek(originStart, firstDayOfWeek),\r\n );\r\n let lastDay = firstDay + 4;\r\n\r\n let day =\r\n (theDay > firstDay && theDay < lastDay) || theDay === firstDay\r\n ? 1\r\n : 3;\r\n let newDay = dateUtils.addDays(originStart, day);\r\n while (newDay <= originalEnd) {\r\n dates.push(newDay);\r\n let theDay = dateUtils.getDay(newDay);\r\n let day =\r\n (theDay > firstDay && theDay < lastDay) || theDay === firstDay\r\n ? 1\r\n : 3;\r\n newDay = dateUtils.addDays(newDay, day);\r\n }\r\n break;\r\n case RepetitiveOptions.RepeatCustom as number:\r\n if (\r\n data.RepeatsEveryDay !== null &&\r\n data.RepeatsEveryPeriod !== null\r\n ) {\r\n let period =\r\n (data.RepeatsEveryPeriod?.Id as RepeatPeriod) ||\r\n RepeatPeriod.Weeks;\r\n let everyDayNum = data.RepeatsEveryDay?.Id || 1;\r\n switch (period) {\r\n case RepeatPeriod.Days:\r\n dates.push(originStart);\r\n let newDay = dateUtils.addDays(originStart, everyDayNum);\r\n while (newDay <= originalEnd) {\r\n dates.push(newDay);\r\n newDay = dateUtils.addDays(newDay, everyDayNum);\r\n }\r\n break;\r\n case RepeatPeriod.Weeks:\r\n dates.push(originStart);\r\n let days = data.RepeatsOnDays.filter(f => f.checked === true)\r\n .map(m => m.Id - 1)\r\n .sort((a, b) => a - b);\r\n let theDay = dateUtils.getDay(originStart);\r\n let nextDay =\r\n days.filter(f => f > theDay).length > 0\r\n ? days.filter(f => f > theDay)[0]\r\n : days[0];\r\n let daysToAdd =\r\n nextDay >= theDay\r\n ? nextDay - theDay === 0\r\n ? 7 * everyDayNum\r\n : nextDay - theDay\r\n : 7 * everyDayNum - (theDay - nextDay);\r\n\r\n let newDayDate = dateUtils.addDays(originStart, daysToAdd);\r\n while (newDayDate <= originalEnd) {\r\n dates.push(newDayDate);\r\n let mtheDay = dateUtils.getDay(newDayDate);\r\n let mnextDay =\r\n days.filter(f => f > mtheDay).length > 0\r\n ? days.filter(f => f > mtheDay)[0]\r\n : days[0];\r\n let mdaysToAdd =\r\n mnextDay >= mtheDay\r\n ? mnextDay - mtheDay === 0\r\n ? 7 * everyDayNum\r\n : mnextDay - mtheDay\r\n : 7 * everyDayNum - (mtheDay - mnextDay);\r\n\r\n newDayDate = dateUtils.addDays(newDayDate, mdaysToAdd);\r\n }\r\n break;\r\n case RepeatPeriod.Months:\r\n let monthlyBy =\r\n (data.RepeatsMonthlyBy?.Id as RepeatMonthlyBy) ||\r\n RepeatMonthlyBy.RepeatsBy_DayOfMonth;\r\n switch (monthlyBy) {\r\n case RepeatMonthlyBy.RepeatsBy_DayOfMonth:\r\n dates.push(originStart);\r\n let monthDay = dateUtils.getDate(originStart);\r\n let newMonthDate = dateUtils.addMonths(\r\n originStart,\r\n everyDayNum,\r\n );\r\n dateUtils.setDate(newMonthDate, monthDay);\r\n while (newMonthDate <= originalEnd) {\r\n dates.push(newMonthDate);\r\n newMonthDate = dateUtils.addMonths(\r\n newMonthDate,\r\n everyDayNum,\r\n );\r\n dateUtils.setDate(newMonthDate, monthDay);\r\n }\r\n break;\r\n case RepeatMonthlyBy.RepeatsBy_DayOfWeek:\r\n dates.push(originStart);\r\n let dayWeek = dateUtils.getDay(originStart);\r\n let newMonth = dateUtils.addMonths(\r\n originStart,\r\n everyDayNum,\r\n );\r\n let newDayWeek = dateUtils.getDay(newMonth);\r\n let calcDay =\r\n dayWeek >= newDayWeek\r\n ? dayWeek - newDayWeek\r\n : 7 - (newDayWeek - dayWeek);\r\n let checkDate = dateUtils.addDays(newMonth, calcDay);\r\n if (checkDate.getMonth() > newMonth.getMonth()) {\r\n newMonth = dateUtils.addDays(newMonth, calcDay - 7);\r\n } else if (checkDate.getMonth() === newMonth.getMonth()) {\r\n if (\r\n checkDate.getDate() > newMonth.getDate() &&\r\n (dateUtils\r\n .addDays(newMonth, calcDay - 7)\r\n .getFullYear() === checkDate.getFullYear()\r\n ? !(\r\n dateUtils\r\n .addDays(newMonth, calcDay - 7)\r\n .getMonth() < checkDate.getMonth()\r\n )\r\n : dateUtils\r\n .addDays(newMonth, calcDay - 7)\r\n .getMonth() < checkDate.getMonth())\r\n ) {\r\n newMonth = dateUtils.addDays(newMonth, calcDay - 7);\r\n } else {\r\n newMonth = checkDate;\r\n }\r\n } else {\r\n newMonth = checkDate;\r\n }\r\n let counter = everyDayNum;\r\n while (newMonth <= originalEnd) {\r\n dates.push(newMonth);\r\n counter += everyDayNum;\r\n newMonth = dateUtils.addMonths(originStart, counter);\r\n let newDayWeek = dateUtils.getDay(newMonth);\r\n let calcDay =\r\n dayWeek >= newDayWeek\r\n ? dayWeek - newDayWeek\r\n : 7 - (newDayWeek - dayWeek);\r\n let checkDate = dateUtils.addDays(newMonth, calcDay);\r\n if (checkDate.getMonth() > newMonth.getMonth()) {\r\n newMonth = dateUtils.addDays(newMonth, calcDay - 7);\r\n } else if (\r\n checkDate.getMonth() === newMonth.getMonth()\r\n ) {\r\n if (\r\n checkDate.getDate() > newMonth.getDate() &&\r\n (dateUtils\r\n .addDays(newMonth, calcDay - 7)\r\n .getFullYear() === checkDate.getFullYear()\r\n ? !(\r\n dateUtils\r\n .addDays(newMonth, calcDay - 7)\r\n .getMonth() < checkDate.getMonth()\r\n )\r\n : dateUtils\r\n .addDays(newMonth, calcDay - 7)\r\n .getMonth() < checkDate.getMonth())\r\n ) {\r\n newMonth = dateUtils.addDays(newMonth, calcDay - 7);\r\n } else {\r\n newMonth = checkDate;\r\n }\r\n } else {\r\n newMonth = checkDate;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return dates;\r\n};\r\n","export const box_shadow_xs: React.CSSProperties['boxShadow'] =\r\n '0px 1px 2px 0px rgba(16, 24, 40, 0.10), 0px 1px 3px 0px rgba(16, 24, 40, 0.10)';\r\nexport const box_shadow_s: React.CSSProperties['boxShadow'] =\r\n '0px 2px 4px -2px rgba(16, 24, 40, 0.06), 0px 4px 8px -2px rgba(16, 24, 40, 0.10)';\r\nexport const box_shadow_m: React.CSSProperties['boxShadow'] =\r\n '0px 4px 4px -2px rgba(16, 24, 40, 0.03), 0px 12px 16px -4px rgba(16, 24, 40, 0.08)';\r\nexport const box_shadow_l: React.CSSProperties['boxShadow'] =\r\n '0px 8px 8px -4px rgba(16, 24, 40, 0.03), 0px 20px 24px -4px rgba(16, 24, 40, 0.08)';\r\nexport const box_shadow_xl: React.CSSProperties['boxShadow'] =\r\n '0px 24px 48px -12px rgba(16, 24, 40, 0.18)';\r\nexport const box_shadow_border_top: React.CSSProperties['boxShadow'] =\r\n '0px 1px 0px 0px #E3E8EF inset';\r\n\r\nexport const bookitShadows = {\r\n shadowXS: box_shadow_xs,\r\n shadowS: box_shadow_s,\r\n shadowM: box_shadow_m,\r\n shadowL: box_shadow_l,\r\n shadowXL: box_shadow_xl,\r\n shadowBorderTop: box_shadow_border_top,\r\n};\r\n","/**\r\n *\r\n * AssetCatGroupPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\n\r\nimport * as React from 'react';\r\n\r\nimport { Entity, Identifiable } from 'types/common';\r\nexport interface IWorkOrderTypeParamsPicker {\r\n assets?: IAssetDto[];\r\n groupIds?: number[];\r\n downtime?: boolean;\r\n}\r\nexport interface WorkOrderTypePickerProps\r\n extends Omit, 'loadData'> {\r\n useSearchOrPredicate?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/WorkOrderType';\r\nexport const initWOTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nexport const initWOTypeDataParams = (\r\n assets: IAssetDto[] | undefined,\r\n groupIds: number[] | undefined,\r\n downtime: boolean | undefined,\r\n) => {\r\n if (assets === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IWorkOrderTypeDto[]);\r\n });\r\n } else {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $skip: 0,\r\n $top: 10,\r\n };\r\n const predicates: (\r\n | string\r\n | Condition\r\n )[] = filteredWorkOrderTypes(assets, groupIds, downtime);\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: undefined,\r\n globalServiceGroupFilter: [],\r\n }).toString();\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as IWorkOrderTypeDto[]);\r\n }\r\n};\r\nexport const filteredWorkOrderTypes = (\r\n assets: IAssetDto[] | undefined,\r\n groupIds: number[] | undefined,\r\n downtime: boolean | undefined,\r\n calibration?: boolean,\r\n): (string | Condition)[] => {\r\n const predicates: (string | Condition)[] = [];\r\n if (assets !== undefined && assets.length > 0) {\r\n const grp = assets\r\n .map(f => f.ServiceGroupId)\r\n .filter((elem, index, self) => {\r\n return (\r\n elem !== null && elem !== undefined && index === self.indexOf(elem)\r\n );\r\n })\r\n .map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n const cts = assets\r\n .map(f => f.AssetCatId)\r\n .filter((elem, index, self) => {\r\n return (\r\n elem !== null && elem !== undefined && index === self.indexOf(elem)\r\n );\r\n })\r\n .map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n const byGroups: string[] = [];\r\n byGroups.push(\r\n new Condition('Groups', ODataOperators.HasNoAny, 0).toString() || '',\r\n );\r\n byGroups.push(\r\n `(${grp\r\n .map(\r\n g =>\r\n new Condition(\r\n 'Groups',\r\n ODataOperators.Any,\r\n g.Id,\r\n 'Id',\r\n ).toString() || '',\r\n )\r\n .filter(f => f !== '')\r\n .join(' and ')})`,\r\n );\r\n predicates.push(\r\n '(' + byGroups.filter(f => f !== '' && f !== '()').join(' or ') + ')',\r\n );\r\n const byCats: string[] = [];\r\n byCats.push(\r\n new Condition('AssetCats', ODataOperators.HasNoAny, 0).toString() || '',\r\n );\r\n byCats.push(\r\n `(${cts\r\n .map(\r\n g =>\r\n new Condition(\r\n 'AssetCats',\r\n ODataOperators.Any,\r\n g.Id,\r\n 'Id',\r\n ).toString() || '',\r\n )\r\n .filter(f => f !== '')\r\n .join(' and ')})`,\r\n );\r\n predicates.push(\r\n '(' + byCats.filter(f => f !== '' && f !== '()').join(' or ') + ')',\r\n );\r\n }\r\n if (groupIds !== undefined && groupIds.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'Groups',\r\n ODataOperators.Includes,\r\n groupIds.map(g => {\r\n return { Id: g } as Identifiable;\r\n }),\r\n ).toString() || '',\r\n );\r\n }\r\n if (downtime) {\r\n predicates.push(\r\n new Condition('AssetAlertType', ODataOperators.Equals, true),\r\n );\r\n }\r\n if (calibration === true) {\r\n predicates.push(\r\n new Condition('ShowOnCalibrationHistory', ODataOperators.Equals, true),\r\n );\r\n }\r\n predicates.push(new Condition('Statuses', ODataOperators.Any, true, 'New'));\r\n return predicates || [];\r\n};\r\nexport function withParamsFilter(\r\n assets: IAssetDto[] | undefined,\r\n groupIds: number[] | undefined,\r\n downtime: boolean | undefined,\r\n) {\r\n return (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n const predicates: (\r\n | string\r\n | Condition\r\n )[] = filteredWorkOrderTypes(assets, groupIds, downtime);\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm === null ? undefined : searchTerm,\r\n globalServiceGroupFilter: [],\r\n }).toString();\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n };\r\n}\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n queryUrl?: string,\r\n useSearchOrPredicate?: boolean,\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url: url ?? queryUrl,\r\n predicates: predicates,\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'UserInquiry',\r\n 'AssetAlertType',\r\n 'QuickCreation',\r\n 'ReportSymptoms',\r\n 'UserCreated',\r\n 'NotifySGA',\r\n 'NotifyCreator',\r\n 'NotifyInstrumentAdmin',\r\n 'NotifyLabTech',\r\n 'Active',\r\n 'StaffOnly',\r\n 'AutoCreateEvent',\r\n 'RepairCodesEnabled',\r\n 'AssignedToCoreAdmin',\r\n 'AssignedToInstrumentAdmin',\r\n 'AssignedToLabTech',\r\n 'AssignedToCreator',\r\n 'ShowOnCalibrationHistory',\r\n 'NotifyAdditionalEmails',\r\n 'UserInquiryGuidance',\r\n 'RepeatsOn',\r\n 'DefaultSubject',\r\n 'DefaultCreatedBy',\r\n 'CustomFormId',\r\n 'RepeatsEveryNum',\r\n 'RepeatsEveryType',\r\n 'RepeatsBy',\r\n 'AutoCreateFor',\r\n 'DefaultRemaindBefore',\r\n 'RepetitiveOptions',\r\n 'DowntimeReasonTypeId',\r\n 'DowntimeDuration',\r\n 'CreatedDate',\r\n 'UpdateDate',\r\n 'DefaultEventTime',\r\n 'AssignedUsers',\r\n 'AssetCats',\r\n 'Groups',\r\n 'FormValues',\r\n 'Statuses',\r\n 'NotEditable',\r\n ],\r\n useSearchOrPredicate: useSearchOrPredicate,\r\n });\r\nexport function WorkOrderTypePicker(props: WorkOrderTypePickerProps) {\r\n const innerLoadData = (predicates, queryUrl) =>\r\n loadData(props.predicates, queryUrl, props.useSearchOrPredicate);\r\n // const loadData = withParamsFilter(\r\n // props.assets,\r\n // props.groupIds,\r\n // props.downtime,\r\n // );\r\n return (\r\n \r\n );\r\n}\r\nexport const loadWorkOrderTypes = loadData;\r\n","import { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\n\r\nexport interface InventoryBatchPickerProps\r\n extends Omit, 'loadData'> {}\r\nconst url = '/api/odata/v4/InventoryBatches';\r\nexport const generateInventoryBatchName = (\r\n dto: IInventoryBatchDto,\r\n): IInventoryBatchDto => {\r\n let name = `Batch: #${dto?.Id} - ${dto.Name} - ${dto?.Inventory}`;\r\n return Object.assign({}, dto, { Name: name });\r\n};\r\nexport const convertInventoryBatchName = (\r\n Id: number,\r\n Name: string,\r\n Inventory: number,\r\n): string => {\r\n let name = `Batch: #${Id} - ${Name} - ${Inventory}`;\r\n return name;\r\n};\r\nconst loadBaseData = (\r\n predicates: (string | Condition)[] | undefined,\r\n select?: (keyof IInventoryBatchDto)[],\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: predicates,\r\n //transformModel: generateInventoryBatchName,\r\n // TODO: narrow down used properties list\r\n select:\r\n !!select && select.length > 0\r\n ? select\r\n : [\r\n 'Id',\r\n 'Name',\r\n 'OfflineServiceTypeId',\r\n 'OfflineServiceTypeName',\r\n 'Inventory',\r\n 'Lot',\r\n 'CreatedAt',\r\n 'CreatedBy',\r\n 'ExpirationDate',\r\n 'PurchaseDate',\r\n 'PurchasePricePerUnit',\r\n 'InventoryUsed',\r\n 'StokRenewed',\r\n ],\r\n globalServiceGroupFilter: undefined,\r\n });\r\n\r\nexport function InventoryBatchPicker(props: InventoryBatchPickerProps) {\r\n const innerLoadData = loadBaseData(props.predicates);\r\n return (\r\n \r\n convertInventoryBatchName(\r\n (option as IInventoryBatchDto).Id,\r\n (option as IInventoryBatchDto).Name,\r\n (option as IInventoryBatchDto).Inventory,\r\n )\r\n }\r\n renderOptionName={option =>\r\n convertInventoryBatchName(\r\n (option as IInventoryBatchDto).Id,\r\n (option as IInventoryBatchDto).Name,\r\n (option as IInventoryBatchDto).Inventory,\r\n )\r\n }\r\n {...props}\r\n />\r\n );\r\n}\r\nexport const loadInventoryBatchesData = loadBaseData;\r\nexport function BatchesByServiceTypeFilter(\r\n serviceTypeId: number,\r\n withStockRenewed?: boolean,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(\r\n new Condition(\r\n 'OfflineServiceTypeId',\r\n ODataOperators.Equals,\r\n serviceTypeId,\r\n ),\r\n );\r\n if (!!withStockRenewed) {\r\n predicates.push(\r\n new Condition(\r\n 'StokRenewed',\r\n ODataOperators.Equals,\r\n withStockRenewed,\r\n ),\r\n );\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n","import { ViewTypes } from '../slice/types';\r\n\r\nexport const parseType = (s?: ViewTypes) => {\r\n if (s === undefined) {\r\n return undefined;\r\n }\r\n switch (s) {\r\n case 'calendar':\r\n case 'timeline':\r\n return s;\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","/**\r\n *\r\n * auto generated interface for Default.TimelineGroupBy\r\n *\r\n */\r\n\r\nexport enum TimelineGroupBy {\r\n NoTimelineGrouped = 0,\r\n GroupByAssemblyPart = 1,\r\n GroupByAssetCat = 2,\r\n}\r\nexport type TimelineGroupByUnion = keyof typeof TimelineGroupBy;\r\nexport const TimelineGroupByUnionArray: Array = [\r\n 'NoTimelineGrouped',\r\n 'GroupByAssemblyPart',\r\n 'GroupByAssetCat',\r\n];\r\n","import { IViewState } from './Scheduler/slice/types';\r\nimport { match } from 'react-router';\r\nimport { parseType } from './Scheduler/utils/parseType';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { CalendarPageParams } from './index';\r\nimport { presetPeriodToViewLength } from './Scheduler/utils/parseLength';\r\nimport {\r\n getPeriodTypeNameOrUndefined,\r\n GetRawValue,\r\n URLSearchParamsCI,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { TimelineGroupByUnionArray } from 'api/odata/generated/enums/TimelineGroupBy';\r\n\r\n/** the name of the filter/search/querystring field storing the selected period value */\r\nexport const periodFilterFieldName = 'period';\r\n/**\r\n * the name of the filter/search/querystring field storing the selected period value\r\n */\r\nexport const groupByFilterFieldName = 'groupBy';\r\n/**\r\n * Parse and sanitize scheduler viewstate provided in the URL\r\n * @param match current route match\r\n * @param search route search\r\n * @returns scheduler view state\r\n */\r\nexport const parseCalendarPageParams = (\r\n match: match,\r\n search: string,\r\n isMobile: boolean,\r\n date: Date,\r\n dashView?: boolean,\r\n): IViewState => {\r\n const params = new URLSearchParamsCI(search);\r\n let periodType =\r\n getPeriodTypeNameOrUndefined(GetRawValue(params, periodFilterFieldName)) ??\r\n match.params.period;\r\n const defaultviewType =\r\n isMobile && !dashView\r\n ? 'calendar'\r\n : parseType(match.params.type) ?? 'timeline';\r\n const defaultviewLength = isMobile\r\n ? 'day'\r\n : periodType === undefined\r\n ? 'week'\r\n : presetPeriodToViewLength(periodType, defaultviewType);\r\n const result: IViewState = {\r\n viewType: defaultviewType,\r\n search: search,\r\n preset: null,\r\n viewLength: defaultviewLength,\r\n date: dateUtils.formatISO(date),\r\n groupBy: getTimelineGroupBy(params),\r\n //...parsePosition(match.params.length, match.params.date),\r\n };\r\n return result;\r\n};\r\n\r\nconst getTimelineGroupBy = function (params: URLSearchParamsCI) {\r\n const rawValue = GetRawValue(params, groupByFilterFieldName);\r\n if (rawValue === null || rawValue === undefined) {\r\n return undefined;\r\n }\r\n var result = TimelineGroupByUnionArray.find(\r\n item => item.toLowerCase() === rawValue.toLowerCase(),\r\n );\r\n return result;\r\n};\r\n","import { styled } from '@material-ui/core';\r\n\r\nexport const AlignRight = styled('div')(props => ({\r\n textAlign: 'right',\r\n}));\r\n","export enum CustomFormTypeEnum {\r\n Reservation = 0,\r\n Request = 1,\r\n Experiment = 2,\r\n Alert = 3,\r\n AlertType = 4,\r\n ServiceGroup = 5,\r\n Quiz = 6,\r\n}\r\n","import Box from '@material-ui/core/Box';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\n\r\nexport interface UserProfileLinkProps {\r\n UserId: string | null;\r\n DisplayName?: string | null;\r\n twoRows?: boolean;\r\n isAdmin?: boolean;\r\n}\r\n\r\nexport const UserProfileLink = React.forwardRef(\r\n function UserProfileLink(props, ref) {\r\n const { t } = useTranslation();\r\n const { UserId, DisplayName, isAdmin, twoRows = true, ...rest } = props;\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const settings = useSelector(selectglobalSettings);\r\n const isServiceAdmin: boolean = React.useMemo(\r\n () =>\r\n authenticatedUser !== undefined &&\r\n ((authenticatedUser.Roles.indexOf(Roles.Administrators) >= 0 ||\r\n isAdmin) ??\r\n false),\r\n [authenticatedUser, isAdmin],\r\n );\r\n const format = settings.GetString(AllowedSettings.UserFormatResult);\r\n const url = `/userprofile.aspx?id=${UserId}`;\r\n if ((DisplayName ?? null) == null) {\r\n return <>;\r\n }\r\n\r\n const text =\r\n format === 'DisplayNameUserName' && DisplayName !== undefined ? (\r\n \r\n {DisplayName}\r\n {UserId === 'undefined' ? (\r\n <>\r\n ) : (\r\n <>\r\n {twoRows &&
}\r\n {' (' + UserId + ') '}\r\n \r\n )}\r\n
\r\n ) : (\r\n \r\n {DisplayName || UserId}\r\n \r\n );\r\n return isServiceAdmin && UserId !== 'undefined' ? (\r\n \r\n \r\n \r\n \r\n {text}\r\n \r\n \r\n \r\n ) : (\r\n {text}\r\n );\r\n },\r\n);\r\n","/**\r\n *\r\n * UserGroupPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IUserGroupDto } from 'api/odata/generated/entities/IUserGroupDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface UserGroupPickerProps\r\n extends Omit, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/UserGroupFilter';\r\nconst restrictedUrl = '/api/odata/v4/UserGroupFilter/Restricted';\r\nexport const initUserGroupData = (initval: string) => {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: new Condition>(\r\n 'Id',\r\n ODataOperators.Equals,\r\n initval,\r\n ).toString(),\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\n\r\nexport function UserGroupPicker(props: UserGroupPickerProps) {\r\n const loadData = getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: props.predicates,\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'DepartmentId',\r\n 'DepartmentName',\r\n 'InstituteId',\r\n 'InstituteName',\r\n 'InstituteTypeId',\r\n 'InstituteTypeName',\r\n 'AffiliatedGroups',\r\n 'IsUserOwneGroup',\r\n ],\r\n });\r\n return (\r\n \r\n );\r\n}\r\nexport function RestrictedUserGroupPicker(props: UserGroupPickerProps) {\r\n const loadData = getAutoCompleteLoadDataFn({\r\n url: restrictedUrl,\r\n predicates: props.predicates,\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'DepartmentId',\r\n 'DepartmentName',\r\n 'InstituteId',\r\n 'InstituteName',\r\n 'InstituteTypeId',\r\n 'InstituteTypeName',\r\n 'AffiliatedGroups',\r\n 'IsUserOwneGroup',\r\n ],\r\n });\r\n return (\r\n \r\n );\r\n}\r\nexport function RestrictedFilter(\r\n departmentId?: number,\r\n instituteId?: number,\r\n instituteTypeId?: number,\r\n restricted?: boolean,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (!!departmentId) {\r\n predicates.push(\r\n new Condition(\r\n 'DepartmentId',\r\n ODataOperators.Equals,\r\n departmentId,\r\n ),\r\n );\r\n }\r\n if (!!instituteId) {\r\n predicates.push(\r\n new Condition(\r\n 'InstituteId',\r\n ODataOperators.Equals,\r\n instituteId,\r\n ),\r\n );\r\n }\r\n if (!!instituteTypeId) {\r\n predicates.push(\r\n new Condition(\r\n 'InstituteTypeId',\r\n ODataOperators.Equals,\r\n instituteTypeId,\r\n ),\r\n );\r\n }\r\n if (restricted) {\r\n predicates.push(\r\n new Condition(\r\n 'IsUserOwneGroup',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n","/**\r\n *\r\n * UserFilter\r\n *\r\n */\r\nimport { UserPicker } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const UserFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default UserFilter;\r\n","/**\r\n *\r\n * DescriptionCell\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Description, DescriptionProps } from 'app/components/Description';\r\n\r\nexport interface DescriptonCellProps\r\n extends Pick<\r\n DescriptionProps,\r\n 'width' | 'interactive' | 'leaveDelay' | 'leaveTouchDelay'\r\n > {}\r\n/**\r\n * Renders a long text Cell - truncates long text with a popup\r\n * @param c react-table renderprop params - see https://react-table.tanstack.com/docs/api/useTable\r\n * @returns\r\n */\r\nexport const DescriptionCell = (p?: DescriptonCellProps) => (c: {\r\n value: string | null;\r\n}) => {\r\n if (p?.width === 'auto') {\r\n return String(c.value);\r\n }\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * DateTimeLabel\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport interface DateTimeLabelProps {\r\n value: Date | string | null;\r\n}\r\n\r\nexport function DateTimeLabel(props: DateTimeLabelProps) {\r\n return <>{dateUtils.shortDateTimeFormat(props.value)};\r\n}\r\n","/**\r\n * A copy of local\\Bookit.Data\\Enums\\BudgetFields.cs\r\n * replace attributes: ^ *\\[[^\\]]+\\]\\n\r\n */\r\nexport enum BudgetFields {\r\n Active = 1,\r\n\r\n Number = 2,\r\n\r\n BudgetManager = 3,\r\n\r\n UserGroup = 4,\r\n\r\n BudgetCat = 5,\r\n\r\n HideExperiments = 6,\r\n\r\n StartDate = 7,\r\n\r\n EndDate = 8,\r\n\r\n Confidential = 9,\r\n\r\n FundingType = 10,\r\n\r\n AllowJoinRequests = 11,\r\n\r\n DefaultExperimentTemplate = 12,\r\n\r\n Default = 13,\r\n\r\n BudgetIsOnline = 14,\r\n\r\n BudgetFund = 15,\r\n\r\n FacilityProject = 16,\r\n\r\n BudgetInternalId = 17,\r\n\r\n BudgetStatus = 18,\r\n\r\n ExternalEndDate = 19,\r\n\r\n ExternalUpdatedAt = 20,\r\n\r\n BudgetLeader = 21,\r\n\r\n BudgetInitialCost = 22,\r\n\r\n BudgetBudget = 23,\r\n\r\n BudgetOwner = 24,\r\n\r\n BdmUsername = 25,\r\n\r\n SubsidyProfit = 26,\r\n\r\n SubsProfProjectNumber = 27,\r\n\r\n SubsProfCostCenter = 28,\r\n SubsProfActivity = 29,\r\n\r\n SubsProfAccountNumber = 30,\r\n SubsidyFinAccountType = 31,\r\n BudgetRemarks = 32,\r\n\r\n Company = 33,\r\n\r\n BudgetManagerCanApproveExperiment = 34,\r\n\r\n BudgetAmount = 35,\r\n\r\n HardLimit = 36,\r\n\r\n SoftLimit = 37,\r\n\r\n BudgetLimitsNotificationSettings = 38,\r\n\r\n BudgetExtraTextField1 = 39,\r\n\r\n BudgetExtraTextField2 = 40,\r\n\r\n BudgetExtraTextField3 = 41,\r\n\r\n BudgetExtraTextField4 = 42,\r\n\r\n BudgetExtraTextField5 = 43,\r\n\r\n BudgetExtraBoolField1 = 44,\r\n\r\n BudgetExtraBoolField2 = 45,\r\n\r\n BudgetExtraBoolField3 = 46,\r\n\r\n BudgetExtraBoolField4 = 47,\r\n\r\n BudgetExtraBoolField5 = 48,\r\n\r\n BudgetExtraDateField1 = 49,\r\n\r\n BudgetExtraDateField2 = 50,\r\n\r\n BudgetExtraDateField3 = 51,\r\n\r\n BudgetExtraDateField4 = 52,\r\n\r\n BudgetExtraDateField5 = 53,\r\n\r\n BudgetExtraNumField1 = 54,\r\n\r\n BudgetExtraNumField2 = 55,\r\n\r\n BudgetExtraNumField3 = 56,\r\n\r\n BudgetExtraNumField4 = 57,\r\n\r\n BudgetExtraNumField5 = 58,\r\n\r\n InvoicingRemarks = 59,\r\n ProjectBilingEmail = 60,\r\n PendingProjectAmount = 61,\r\n SecondaryCoordinators = 62,\r\n PurchaseOrderOption = 63,\r\n}\r\n","import { omit } from 'lodash';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { httpClient } from './HttpClient';\r\nimport { ISavedViewDto } from './odata/generated/entities/ISavedViewDto';\r\nimport { Condition, ODataOperators } from './odata/ODataFilter';\r\n\r\nexport const savedViewsApi = {\r\n initUpdateData: (payload: number) => {\r\n const url = `/api/odata/v4/savedviews(${payload})`;\r\n return httpClient.get(url);\r\n },\r\n deleteSavedViews: (rows: ISavedViewDto[]): Promise => {\r\n const viewIds: number[] = rows.map(item => item.Id);\r\n const data = { viewIds };\r\n const url = '/api/odata/v4/SavedViews/DeleteViews';\r\n return httpClient.post(url, data);\r\n },\r\n createSavedView: (payload: ISavedViewDto) => {\r\n const url = `/api/odata/v4/savedviews`;\r\n return httpClient.post(url, payload);\r\n },\r\n updateSavedView: (payload: ISavedViewDto) => {\r\n const url = `/api/odata/v4/savedviews(${payload.Id})`;\r\n return httpClient.put(url, payload);\r\n },\r\n patch: (payload: Partial) => {\r\n const url = `/api/odata/v4/savedviews(${payload.Id})`;\r\n return httpClient.patch(url, omit(payload, 'Id'));\r\n },\r\n getMySavedViews: (payload: {\r\n user: AuthenticatedUser | undefined;\r\n serviceGroups: Entity[] | undefined;\r\n isAdmin: boolean;\r\n onlyMyView: boolean | undefined;\r\n }) => {\r\n const url = '/api/odata/v4/SavedViews';\r\n const filters = mySavedViewFilter(\r\n payload.serviceGroups,\r\n payload.user,\r\n payload.isAdmin,\r\n );\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $expand: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter:\r\n payload.onlyMyView === true\r\n ? new Condition(\r\n 'UserName',\r\n ODataOperators.Equals,\r\n payload.user?.Id || '',\r\n ).toString()\r\n : filters.toString(),\r\n $expand: 'Assets',\r\n $skip: 0,\r\n $top: 100,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as ISavedViewDto[]);\r\n },\r\n};\r\nconst mySavedViewFilter = (\r\n topServiceGroups: Entity[] | undefined,\r\n user: AuthenticatedUser | undefined,\r\n isAdmin: boolean,\r\n): string => {\r\n const predicates: (string | Condition)[] = [];\r\n let result = '';\r\n const byUser: string[] = [];\r\n if (user) {\r\n byUser.push(\r\n new Condition('UserName', ODataOperators.Equals, user.Id).toString() ||\r\n '',\r\n );\r\n // byUser.push(\r\n // '(' +\r\n // (new Condition(\r\n // 'Shared',\r\n // ODataOperators.Equals,\r\n // true,\r\n // ).toString() || '') +\r\n // ' and ' +\r\n // (new Condition(\r\n // 'SharedUsers',\r\n // ODataOperators.Any,\r\n // user.Id,\r\n // 'Name',\r\n // ).toString() || '') +\r\n // ')',\r\n // );\r\n // if (isAdmin && user.AdminServiceGroups.length > 0) {\r\n // let ids = user.AdminServiceGroups.map(item => {\r\n // return { Id: item.Id };\r\n // }) as Identifiable[];\r\n // byUser.push(\r\n // '(' +\r\n // (new Condition(\r\n // 'Shared',\r\n // ODataOperators.Equals,\r\n // true,\r\n // ).toString() || '') +\r\n // ' and ' +\r\n // '(' +\r\n // new Condition(\r\n // 'Assets',\r\n // ODataOperators.AllIn,\r\n // ids,\r\n // 'ServiceGroupId',\r\n // ).toString() +\r\n // '))',\r\n // );\r\n // }\r\n // if (isAdmin && user.AdminEquipments.length > 0) {\r\n // let ids = user.AdminEquipments.map(item => {\r\n // return { Id: item };\r\n // }) as Identifiable[];\r\n // byUser.push(\r\n // '(' +\r\n // (new Condition(\r\n // 'Shared',\r\n // ODataOperators.Equals,\r\n // true,\r\n // ).toString() || '') +\r\n // ' and ' +\r\n // '(' +\r\n // new Condition(\r\n // 'Assets',\r\n // ODataOperators.AllIn,\r\n // ids,\r\n // 'ServiceId',\r\n // ).toString() +\r\n // '))',\r\n // );\r\n // }\r\n byUser.push(\r\n new Condition(\r\n 'Shared',\r\n ODataOperators.Equals,\r\n true,\r\n ).toString() || '',\r\n );\r\n predicates.push(byUser.filter(f => f !== '').join(' or '));\r\n result = '(' + predicates.map(f => f.toString()).join(' or ') + ')';\r\n if (topServiceGroups !== undefined) {\r\n if (topServiceGroups.length > 0) {\r\n let ids = topServiceGroups.map(item => {\r\n return { Id: item.Id };\r\n }) as Identifiable[];\r\n result +=\r\n ' and (' +\r\n new Condition(\r\n 'Assets',\r\n ODataOperators.AllIn,\r\n ids,\r\n 'ServiceGroupId',\r\n ).toString() +\r\n ')';\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n","import { EditorProps } from '../../EditableCell';\r\nimport { tryParseFloat } from 'utils/string-utils';\r\nimport { TextField as BasicTextField } from 'app/components/TextField';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { InputAdornment } from '@material-ui/core';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\n\r\n/* Project Name */\r\n// 'Number':\r\n\r\nexport function NumberField({\r\n value,\r\n onChange,\r\n parentValue,\r\n min,\r\n max,\r\n step,\r\n helperText,\r\n info,\r\n error,\r\n autoFocus,\r\n ...props\r\n}: EditorProps & MinMaxProps) {\r\n return (\r\n // onChange(tryParseFloat(e.target.value) ?? null)}\r\n // {...props}\r\n // />\r\n \r\n {!!info && info !== '' && }\r\n {error && (\r\n \r\n )}\r\n \r\n ),\r\n }}\r\n variant=\"standard\"\r\n error={error}\r\n fullWidth\r\n autoFocus={autoFocus}\r\n inputProps={{\r\n type: 'number',\r\n min: min,\r\n max: max,\r\n step: step,\r\n }}\r\n value={value || ''}\r\n onChange={e => onChange(tryParseFloat(e.target.value) ?? null)}\r\n onBlur={props.onBlur}\r\n id={props.id}\r\n label={props.label}\r\n name={props.name}\r\n />\r\n );\r\n}\r\n\r\ninterface MinMaxProps {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n}\r\n\r\nexport function withMinMax(Component, withProps: MinMaxProps) {\r\n return (props: EditorProps) => (\r\n \r\n );\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\nimport { Dto, ISection } from './types';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.serviceRequestsKanban || initialState;\r\n\r\nexport const selectServiceRequestsKanban = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n\r\nexport const selectServiceRequestsKanbanProcessingUpdate = createSelector(\r\n [selectSlice],\r\n state => state.processingUpdate,\r\n);\r\nexport const selectServiceRequestsKanbanProcessingInsert = createSelector(\r\n [selectSlice],\r\n state => state.processingInsert,\r\n);\r\n\r\nexport const selectServiceRequestsKanbanTickets = createSelector(\r\n [selectServiceRequestsKanban],\r\n state => state.data,\r\n);\r\nexport const selectServiceRequestsKanbanSelectedStatuses = createSelector(\r\n [selectSlice],\r\n state => state.selectedStatuses,\r\n);\r\nexport const selectServiceRequestsKanbanData = createSelector(\r\n [\r\n selectServiceRequestsKanbanSelectedStatuses,\r\n selectServiceRequestsKanbanTickets,\r\n ],\r\n (selectedStatuses, tickets) => {\r\n if (selectedStatuses !== undefined) {\r\n if (selectedStatuses.some(f => f.Name !== undefined)) {\r\n return selectedStatuses.map(status => {\r\n const dataList = tickets[status.Id.toString()];\r\n const b: ISection = {\r\n id: status.Id,\r\n section: status,\r\n data: dataList,\r\n };\r\n return b;\r\n });\r\n }\r\n }\r\n },\r\n);\r\n\r\nexport const selectShowAddSubTicket = createSelector(\r\n [selectSlice],\r\n state => state.showAddSubTicket,\r\n);\r\nexport const selectParentTicket = createSelector(\r\n [selectSlice],\r\n state => state.parentTicket,\r\n);\r\nexport const selectEdit = createSelector([selectSlice], state => state.ticket);\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Identifiable } from 'types/common';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IServiceGroupDto } from 'api/odata/generated/entities/IServiceGroupDto';\r\n\r\nexport type GroupUrl =\r\n | 'base'\r\n | 'admin'\r\n | 'regpublic'\r\n | 'public'\r\n | 'billableAdminUrl';\r\n\r\nexport interface ServiceGroupPickerProps\r\n extends Omit, 'loadData'> {\r\n urlType: GroupUrl;\r\n}\r\n\r\nconst url = '/api/odata/v4/servicegroups';\r\nconst adminUrl = '/api/odata/v4/servicegroups/GetAdminServiceGroups';\r\nconst publicUrl = '/api/odata/v4/servicegroups/GetPublicServiceGroups';\r\nconst regPublicUrl = '/api/odata/v4/servicegroups/GetRegistrationServiceGroups';\r\nconst billableAdminUrl =\r\n '/api/odata/v4/servicegroups/GetBillableAdminServiceGroups';\r\n\r\nexport const initServiceGroupsData = (\r\n initval: string | undefined,\r\n urlType: GroupUrl | undefined,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IServiceGroupDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,DivisionId,DivisionName',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n urlType === undefined\r\n ? url\r\n : urlType === 'public'\r\n ? publicUrl\r\n : urlType === 'regpublic'\r\n ? regPublicUrl\r\n : urlType === 'admin'\r\n ? adminUrl\r\n : urlType === 'billableAdminUrl'\r\n ? billableAdminUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as IServiceGroupDto[]);\r\n }\r\n};\r\n\r\nexport function ServiceGroupPicker(props: ServiceGroupPickerProps) {\r\n const urlt =\r\n props.urlType === 'public'\r\n ? publicUrl\r\n : props.urlType === 'regpublic'\r\n ? regPublicUrl\r\n : props.urlType === 'admin'\r\n ? adminUrl\r\n : props.urlType === 'billableAdminUrl'\r\n ? billableAdminUrl\r\n : url;\r\n let filters: (string | Condition)[] = [];\r\n if (urlt === url) {\r\n if (!!props.predicates && props.predicates.length > 0) {\r\n filters = [...props.predicates, ...['Active eq true']];\r\n } else {\r\n filters = ['Active eq true'];\r\n }\r\n }\r\n const loadData = getAutoCompleteLoadDataFn({\r\n url:\r\n props.urlType === 'public'\r\n ? publicUrl\r\n : props.urlType === 'regpublic'\r\n ? regPublicUrl\r\n : props.urlType === 'admin'\r\n ? adminUrl\r\n : props.urlType === 'billableAdminUrl'\r\n ? billableAdminUrl\r\n : url,\r\n select: ['Id', 'Name', 'DivisionId', 'DivisionName'],\r\n predicates: filters,\r\n });\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport const ServiceGroupByDivisionFilter = (value: FilterValueType) => {\r\n if (value !== undefined && value !== null) {\r\n return [\r\n `${new Condition(\r\n 'DivisionId',\r\n ODataOperators.Equals,\r\n (value as Identifiable).Id,\r\n ).toString()}`,\r\n ];\r\n }\r\n return [];\r\n};\r\n\r\nexport const serviceGroupFilterUrl = url;\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { GroupUrl, ServiceGroupPicker } from '../pickers/ServiceGroupPicker';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { IServiceGroupDto } from 'api/odata/generated/entities/IServiceGroupDto';\r\n\r\nexport const FormServiceGroupPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & {\r\n label?: string;\r\n fullWidth?: boolean;\r\n urlType: GroupUrl;\r\n autoFocus?: boolean;\r\n name: string;\r\n placeholder: string;\r\n disabled?: boolean;\r\n predicates?: (string | Condition>)[];\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n}) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(props.value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value as IServiceGroupDto}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n predicates={props.predicates}\r\n variant={props.variant === undefined ? 'filled' : props.variant}\r\n />\r\n );\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects';\r\nimport { articlesActions as actions } from '.';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IExternalArticlesSearchResponse } from 'api/odata/generated/entities/IExternalArticlesSearchResponse';\r\nimport { IExternalArticleSearchPayload } from './types';\r\nimport { selectArticlesExternalSearchPageData } from 'app/pages/ArticlesPage/slice/selectors';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { AxiosError } from 'axios';\r\nimport { StatusCodes } from 'http-status-codes';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { ArticleStatus } from 'enums/Article';\r\nimport { omit } from 'lodash';\r\n\r\nfunction* doShowDetails(\r\n action: PayloadAction<{\r\n Id?: number;\r\n externalId?: string;\r\n externalIdSource?: string;\r\n article?: IArticleDto;\r\n }>,\r\n) {\r\n // const props: ArticleDetailsProps = {\r\n // useSidePanel: true,\r\n // value: action.payload,\r\n // };\r\n\r\n try {\r\n const url = '/api/odata/v4/articles';\r\n let params = {};\r\n let articleDetails;\r\n if (!!action.payload.Id && action.payload.Id > 0) {\r\n params = { key: action.payload.Id };\r\n const data: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n url,\r\n params,\r\n );\r\n articleDetails = omit(data, '@odata.context');\r\n } else {\r\n if (\r\n action.payload.externalId !== undefined &&\r\n action.payload.externalIdSource !== undefined\r\n ) {\r\n const filter = new ODataFilterBuilder({\r\n predicates: [\r\n new Condition(\r\n 'ExternalId',\r\n ODataOperators.Equals,\r\n action.payload.externalId,\r\n ),\r\n new Condition(\r\n 'ExternalIdSource',\r\n ODataOperators.Equals,\r\n action.payload.externalIdSource,\r\n ),\r\n ],\r\n stringColumns: [],\r\n });\r\n params = { $filter: filter.toString(), $top: 1 };\r\n const data: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n url,\r\n params,\r\n );\r\n articleDetails = data.value[0];\r\n }\r\n }\r\n yield put(actions.showDetails_Success(articleDetails));\r\n } catch (error) {}\r\n\r\n // yield put(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.Article,\r\n // props: props,\r\n // }),\r\n // );\r\n}\r\n\r\nfunction* doExternalSearch(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n // skip fetching already loaded items\r\n const page = yield select(selectArticlesExternalSearchPageData);\r\n if (page !== undefined) {\r\n yield put(actions.externalSearch_Skip());\r\n return;\r\n }\r\n if (action.payload.searchForm.Source === undefined) {\r\n return;\r\n }\r\n const url = `/api/odata/v4/Articles/ExternalSearch(source='${action.payload.searchForm.Source}')`;\r\n const params = new URLSearchParams(\r\n action.payload.searchForm as Record,\r\n );\r\n params.set(\r\n '$skip',\r\n String(action.payload.pageIndex * action.payload.pageSize),\r\n );\r\n params.set('$top', String(action.payload.pageSize));\r\n const results: IExternalArticlesSearchResponse = yield call(\r\n httpClient.get,\r\n url,\r\n params,\r\n );\r\n yield put(\r\n actions.externalSearch_Success({\r\n count: results.Count,\r\n items: results.Items,\r\n pageIndex: action.payload.pageIndex,\r\n }),\r\n );\r\n } catch (error) {\r\n if ((error as AxiosError).isAxiosError) {\r\n var errorCode = (error as AxiosError).response?.status;\r\n if (errorCode === StatusCodes.TOO_MANY_REQUESTS) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.TooManyRequests),\r\n }),\r\n );\r\n }\r\n }\r\n yield put(actions.externalSearch_Error('Error searching external source'));\r\n }\r\n}\r\nfunction* doSaveArticleAssociation(action: PayloadAction) {\r\n try {\r\n const isNew = (action.payload.Id ?? 0) === 0;\r\n const url = isNew\r\n ? '/api/odata/v4/articles'\r\n : `/api/odata/v4/articles(${action.payload.Id})`;\r\n const fn = isNew ? httpClient.post : httpClient.put;\r\n const result = yield call(fn, url, action.payload);\r\n yield put(layoutActions.setRefreshTable(true));\r\n if (result.Queryable[0].Status === ArticleStatus.AwaitingApproval) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.PublicationAwaitingApproval),\r\n }),\r\n );\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.Success),\r\n }),\r\n );\r\n }\r\n yield put(actions.saveArticleAssociation_Success(result.Queryable[0]));\r\n } catch (error) {\r\n const mes = (error as AxiosError)?.response?.data.error.message;\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message:\r\n mes !== undefined ? mes : i18next.t(translations.AnErrorOccurred),\r\n }),\r\n );\r\n yield put(actions.saveArticleAssociation_Error(action.payload));\r\n }\r\n}\r\n\r\nexport function* articlesSaga() {\r\n yield takeLatest(actions.showDetails.type, doShowDetails);\r\n yield takeLatest(actions.externalSearch.type, doExternalSearch);\r\n yield takeLatest(actions.chnagePage.type, doExternalSearch);\r\n\r\n yield takeLatest(\r\n actions.saveArticleAssociation.type,\r\n doSaveArticleAssociation,\r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { articlesSaga } from './saga';\r\nimport {\r\n ArticlesState,\r\n IExternalArticleSearchPayload,\r\n IExternalArticleSearchSuccessPayload,\r\n} from './types';\r\n\r\nexport const initialState: ArticlesState = {\r\n externalSearchResults: {},\r\n externalSearchPageIndex: 0,\r\n externalSearchPageSize: 10,\r\n refreshEditArticleAssociation: undefined,\r\n articleDetailsBusy: undefined,\r\n editArticleAssociationBusy: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'articles',\r\n initialState,\r\n reducers: {\r\n showDetails(\r\n state,\r\n action: PayloadAction<{\r\n Id?: number;\r\n externalId?: string;\r\n externalIdSource?: string;\r\n article?: IArticleDto;\r\n }>,\r\n ) {\r\n state.articleDetailsBusy = true;\r\n state.editArticleAssociationBusy = undefined;\r\n state.articleDetails = action.payload.article;\r\n },\r\n showDetails_Success(state, action: PayloadAction) {\r\n state.articleDetailsBusy = false;\r\n if (action.payload !== undefined) {\r\n if (state.articleDetails !== undefined) {\r\n state.articleDetails.Id = action.payload.Id;\r\n state.articleDetails.Assets = action.payload.Assets;\r\n }\r\n }\r\n },\r\n refreshEditArticleAssociation(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.refreshEditArticleAssociation = action.payload;\r\n },\r\n saveArticleAssociation(state, action: PayloadAction) {\r\n state.editArticleAssociationBusy = true;\r\n state.refreshEditArticleAssociation = undefined;\r\n },\r\n saveArticleAssociation_Success(state, action: PayloadAction) {\r\n state.articleDetails = action.payload;\r\n state.refreshEditArticleAssociation = true;\r\n state.editArticleAssociationBusy = false;\r\n },\r\n saveArticleAssociation_Error(state, action: PayloadAction) {\r\n state.editArticleAssociationBusy = false;\r\n },\r\n resetArticleAssociationState(state, action: PayloadAction) {\r\n state.editArticleAssociationBusy = undefined;\r\n //delete state.articleDetails;\r\n },\r\n externalSearch(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.externalSearchFormDetails = action.payload.searchForm;\r\n state.externalSearchPageIndex = action.payload.pageIndex;\r\n state.externalSearchPageSize = action.payload.pageSize;\r\n state.externalSearchResults = {\r\n processing: true,\r\n };\r\n },\r\n chnagePage(state, action: PayloadAction) {\r\n state.externalSearchResults.processing = true;\r\n if (state.externalSearchPageSize !== action.payload.pageSize) {\r\n state.externalSearchResults.data = {};\r\n }\r\n state.externalSearchPageIndex = action.payload.pageIndex;\r\n state.externalSearchPageSize = action.payload.pageSize;\r\n },\r\n externalSearch_Skip(state, action: PayloadAction) {\r\n state.externalSearchResults.processing = false;\r\n },\r\n externalSearch_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.externalSearchResults.processing = false;\r\n state.externalSearchResults.dataLength = action.payload.count;\r\n if (state.externalSearchResults.data === undefined) {\r\n state.externalSearchResults.data = {};\r\n }\r\n state.externalSearchResults.data[action.payload.pageIndex] =\r\n action.payload.items;\r\n },\r\n externalSearch_Error(state, action: PayloadAction) {\r\n state.externalSearchResults = { error: action.payload };\r\n },\r\n someAction(state, action: PayloadAction) {},\r\n clearArticleDetails(state) {\r\n state.articleDetails = undefined;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: articlesActions } = slice;\r\n\r\nexport const useArticlesSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: articlesSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useArticlesSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import {\r\n FormHelperTextProps as MuiFormHelperTextProps,\r\n FormHelperText as MuiFormHelperText,\r\n} from '@material-ui/core';\r\nimport clsx from 'clsx';\r\n\r\nexport interface FormHelperTextProps extends MuiFormHelperTextProps {\r\n boxed?: boolean;\r\n shiftRight?: boolean;\r\n}\r\nconst FormHelperText = (props: FormHelperTextProps) => {\r\n const { shiftRight, boxed, ...other } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default FormHelperText;\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport {\r\n call,\r\n put,\r\n take,\r\n select,\r\n takeLatest,\r\n takeLeading,\r\n takeEvery,\r\n all,\r\n} from 'redux-saga/effects';\r\nimport { serviceRequestsKanbanActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { translations } from 'locales/translations';\r\nimport i18next from 'i18next';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { IServiceRequestTicketDto } from 'api/odata/generated/entities/IServiceRequestTicketDto';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport {\r\n selectServiceRequestsKanbanData,\r\n selectServiceRequestsKanbanTickets,\r\n} from './selectors';\r\nimport { Dto, IDataList, ISection, ReorderPayload } from './types';\r\nimport { omit } from 'lodash';\r\nimport { takeLatestByKey } from 'utils/redux-saga';\r\nimport { PartialExceptId } from 'utils/typeUtils';\r\nimport { extractErrorMessages, getModelStateErrors } from 'api/utils';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { ServiceRequestTicketDetailsProps } from 'app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails';\r\n\r\nconst ENTITY_SET_URL = '/api/odata/v4/ServiceRequestTickets';\r\n\r\nconst fetchTicketsByStatusId = async (params: {\r\n statusId: number;\r\n top: number;\r\n skip: number;\r\n}) => {\r\n const response: IODataQueryResponse = await httpClient.get(\r\n ENTITY_SET_URL,\r\n fetchTicketsParams({\r\n statusId: params.statusId,\r\n top: params.top + 1,\r\n skip: params.skip,\r\n }),\r\n );\r\n const count = response['@odata.count'];\r\n const result: IDataList = {\r\n id: params.statusId,\r\n items: response.value.slice(0, params.top),\r\n count: count ?? 0,\r\n more: response.value.length > params.top,\r\n };\r\n return result;\r\n};\r\nconst fetchTicketById = async (params: { Id: number | null }) => {\r\n if (params.Id === null) {\r\n return Promise.resolve(undefined);\r\n } else {\r\n const response = await httpClient.get(\r\n `${ENTITY_SET_URL}(${params.Id})`,\r\n FETCH_SELECT_EXPAND,\r\n );\r\n return response;\r\n }\r\n};\r\n\r\nconst FETCH_SELECT_EXPAND = {\r\n $select: [\r\n 'Id',\r\n 'Index',\r\n 'SubSamplesCount',\r\n 'TotalSamplesCount',\r\n 'SamplesCount',\r\n 'Priority',\r\n 'ParentTicketId',\r\n 'ServiceRequestId',\r\n ].join(','),\r\n $expand: [\r\n 'Status($select=Id,Name)',\r\n //'Service($select=Id,Name)',\r\n //'ServiceRequestStatus($select=Id,Name)',\r\n 'AssignedTo($select=Id,Name)',\r\n 'ServiceRequest($select=CreatedFor,Service;$expand=CreatedFor($select=Id,Name),Service($select=Id,Name;$expand=ServiceGroup($select=Id,Name)),Budget($select=Id,Name))',\r\n ].join(','),\r\n};\r\nfunction fetchTicketsParams(params: {\r\n statusId: number;\r\n top: number;\r\n skip: number;\r\n}): any {\r\n return {\r\n ...FETCH_SELECT_EXPAND,\r\n $filter: `Status/Id eq ${params.statusId}`,\r\n $top: params.top,\r\n $skip: params.skip,\r\n $count: true,\r\n $orderBy: 'Index',\r\n };\r\n}\r\n/**\r\n * Number of initially fetched tickets per each status\r\n */\r\nconst INITIAL_TOP = 10;\r\nconst notificationMessageKey_getItems = 'getItems';\r\nfunction* doGetItems(action: PayloadAction) {\r\n try {\r\n const bar: Array> = yield all(\r\n action.payload.map(statusId =>\r\n call(fetchTicketsByStatusId, { statusId, top: INITIAL_TOP, skip: 0 }),\r\n ),\r\n );\r\n\r\n yield put(actions.getItems_Success(bar));\r\n } catch (error: unknown) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: notificationMessageKey_getItems,\r\n message: i18next.t(translations.errormessage),\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.getItems_Error(Error));\r\n }\r\n}\r\nfunction* doGetMoreItems(action: PayloadAction) {\r\n const tickets: Record<\r\n string,\r\n IDataList\r\n > = yield select(selectServiceRequestsKanbanTickets);\r\n\r\n try {\r\n const section = tickets[action.payload.toString()];\r\n const bar: IDataList = yield call(\r\n fetchTicketsByStatusId,\r\n {\r\n statusId: action.payload,\r\n top: INITIAL_TOP,\r\n skip: section.items.length,\r\n },\r\n );\r\n\r\n yield put(actions.getMoreItems_Success(bar));\r\n } catch (error: unknown) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: notificationMessageKey_getItems,\r\n message: i18next.t(translations.errormessage),\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.getItems_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doSetSelectedStatuses(\r\n action: PayloadAction,\r\n) {\r\n if (action.payload !== undefined) {\r\n const original: Record = yield select(\r\n selectServiceRequestsKanbanTickets,\r\n );\r\n const loadedIds = Object.keys(original);\r\n const currentStatusIdentifiers = action.payload\r\n .map(f => f.Id)\r\n .filter(statusId => !loadedIds.includes(statusId.toString()));\r\n\r\n if (currentStatusIdentifiers.length > 0) {\r\n yield put(actions.getItems(currentStatusIdentifiers));\r\n }\r\n }\r\n}\r\nfunction* doReorder(action: PayloadAction) {\r\n try {\r\n const data: ISection<\r\n IServiceRequestStatusDto,\r\n IServiceRequestTicketDto\r\n >[] = yield select(selectServiceRequestsKanbanData);\r\n\r\n const indexChanges = data\r\n .flatMap(section => {\r\n return (\r\n section.data?.items?.map((item, index) => {\r\n return {\r\n Id: item.Id,\r\n Index: item.Index === index ? undefined : index,\r\n Status:\r\n item.Status.Id === section.id ? undefined : section.section,\r\n };\r\n }) ?? []\r\n );\r\n })\r\n .filter(item => item.Status !== undefined);\r\n\r\n const payload = {\r\n Id: action.payload.Id,\r\n ServiceRequestStatusId: action.payload.destinationSectionId,\r\n Index: action.payload.destinationIndex,\r\n };\r\n\r\n yield call(\r\n httpClient.patch,\r\n `${ENTITY_SET_URL}(${payload.Id})`,\r\n omit(payload, 'Id'),\r\n );\r\n yield put(actions.reorder_Success(indexChanges));\r\n } catch (error) {\r\n yield put(\r\n actions.reorder_Error({\r\n destinationIndex: action.payload.sourceIndex,\r\n destinationSectionId: action.payload.sourceSectionId,\r\n Id: action.payload.Id,\r\n sourceIndex: action.payload.destinationIndex,\r\n sourceSectionId: action.payload.destinationSectionId,\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doInsert(action: PayloadAction>) {\r\n const url = ENTITY_SET_URL;\r\n const notificationMessageKey = 'serviceRequestTicektsInsert';\r\n try {\r\n const payload: Partial = {\r\n AssignedTo_Id: action.payload.AssignedTo?.Id,\r\n Index: action.payload.Index,\r\n Priority: action.payload.Priority,\r\n SamplesCount: action.payload.SamplesCount,\r\n ServiceRequestId: action.payload.ParentTicket?.ServiceRequestId,\r\n ServiceRequestStatusId: action.payload.Status?.Id,\r\n ParentTicketId: action.payload.ParentTicketId,\r\n };\r\n const response = yield call(httpClient.post, url, payload);\r\n const p: Dto = {\r\n ...action.payload.ParentTicket,\r\n ...response,\r\n ...action.payload,\r\n };\r\n yield put(actions.insert_Success(p));\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: notificationMessageKey,\r\n variant: 'success',\r\n message: i18next.t(translations.GenericInsertSuccessMessage),\r\n }),\r\n );\r\n } catch (error) {\r\n yield put(actions.insert_Error());\r\n const modelState = getModelStateErrors(error);\r\n console.error(error);\r\n if (modelState !== undefined) {\r\n const messages = Object.values(modelState).flat();\r\n for (const message of messages) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: notificationMessageKey,\r\n variant: 'error',\r\n message: message,\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n}\r\nfunction* doUpdate(\r\n action: PayloadAction>,\r\n) {\r\n const url = `${ENTITY_SET_URL}(${action.payload.Id})`;\r\n const notificationMessageKey = 'serviceRequestTicketUpdate';\r\n try {\r\n const payload: Partial = {\r\n AssignedTo_Id: action.payload.AssignedTo?.Id,\r\n Priority: action.payload.Priority,\r\n Index: action.payload.Index,\r\n ServiceRequestStatusId: action.payload.Status?.Id,\r\n SamplesCount: action.payload.SamplesCount,\r\n };\r\n yield call(httpClient.patch, url, payload);\r\n yield put(actions.update_Success(action.payload));\r\n yield put(layoutActions.resetSidePanel());\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: notificationMessageKey,\r\n variant: 'success',\r\n message: i18next.t(translations.GenericUpdateSuccessMessage),\r\n }),\r\n );\r\n //yield put(layoutActions.resetSidePanel());\r\n } catch (error) {\r\n yield put(actions.update_Error());\r\n const messages = extractErrorMessages(error);\r\n if (messages !== undefined) {\r\n for (const message of messages) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: notificationMessageKey,\r\n variant: 'error',\r\n message: message,\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Runs a monitor on a given selector\r\n * @param selector selector to monitor\r\n */\r\nfunction* selectorChangeSaga(selector, pattern) {\r\n let previousValue;\r\n while (true) {\r\n const currentValue = yield* monitorSelector(\r\n selector,\r\n previousValue,\r\n pattern,\r\n );\r\n if (previousValue !== currentValue) {\r\n //yield spawn(loadRowSaga, focusType, focusId);\r\n }\r\n previousValue = currentValue;\r\n }\r\n}\r\n\r\nfunction* monitorSelector(selector, previousValue, takePattern = '*') {\r\n while (true) {\r\n const nextValue = yield select(selector);\r\n if (nextValue !== previousValue) {\r\n return nextValue;\r\n }\r\n yield take(takePattern);\r\n }\r\n}\r\nfunction* doShowEdit(action: PayloadAction) {\r\n // const data = yield select(s)\r\n\r\n const openSidePanelProps: ServiceRequestTicketDetailsProps = {\r\n item: action.payload,\r\n useSidePanel: true,\r\n };\r\n const parent = yield call(fetchTicketById, {\r\n Id: action.payload.ParentTicketId,\r\n });\r\n yield put(\r\n actions.showEdit_Success({\r\n ...action.payload,\r\n ParentTicket: parent,\r\n }),\r\n );\r\n yield put(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.ServiceRequestTicketDetails,\r\n props: openSidePanelProps,\r\n }),\r\n );\r\n}\r\nfunction* doShowEditParent(action: PayloadAction) {\r\n try {\r\n const ticket = yield call(fetchTicketById, {\r\n Id: action.payload.ParentTicketId,\r\n });\r\n yield put(actions.showEdit(ticket));\r\n } catch (error) {\r\n yield put(actions.showEdit_Error());\r\n }\r\n}\r\nexport function* serviceRequestsKanbanSaga() {\r\n yield takeLatest(actions.getItems.type, doGetItems);\r\n yield takeLatestByKey(\r\n actions.getMoreItems.type,\r\n f => f,\r\n doGetMoreItems,\r\n );\r\n yield takeLatest(actions.setSelectedStatuses.type, doSetSelectedStatuses);\r\n yield takeEvery(actions.reorder.type, doReorder);\r\n yield takeLeading(actions.insert.type, doInsert);\r\n yield takeLeading(actions.update.type, doUpdate);\r\n yield takeLeading(actions.showEdit.type, doShowEdit);\r\n yield takeLeading(actions.showEditParent.type, doShowEditParent);\r\n yield selectorChangeSaga(\r\n selectServiceRequestsKanbanTickets,\r\n actions.setSelectedStatuses.type,\r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { serviceRequestsKanbanSaga } from './saga';\r\nimport {\r\n Dto,\r\n IDataList,\r\n ServiceRequestsKanbanState,\r\n ReorderPayload,\r\n} from './types';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport { isEqual, orderBy } from 'lodash';\r\nimport { IServiceRequestTicketDto } from 'api/odata/generated/entities/IServiceRequestTicketDto';\r\nimport { PartialExceptId } from 'utils/typeUtils';\r\n\r\nexport const initialState: ServiceRequestsKanbanState = {\r\n data: {},\r\n selectedStatuses: [],\r\n selectedStatusIds: [],\r\n fetchCount: 2,\r\n processingUpdate: false,\r\n processingInsert: false,\r\n ticket: {},\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'serviceRequestsKanban',\r\n initialState,\r\n reducers: {\r\n setSelectedStatuses(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n const ids = orderBy(action.payload?.map(f => f.Id));\r\n const p = orderBy(state.selectedStatuses.map(f => f.Id));\r\n if (!isEqual(ids, p)) {\r\n state.selectedStatusIds = ids;\r\n }\r\n state.selectedStatuses = action.payload ?? [];\r\n },\r\n getItems(state, action: PayloadAction) {},\r\n\r\n getItems_Success(state, action: PayloadAction>>) {\r\n action.payload.forEach(item => {\r\n state.data[item.id.toString()] = item;\r\n });\r\n },\r\n getItems_Error(state, action: PayloadAction) {\r\n // state.processing = false;\r\n // state.error = 'ERROR';\r\n },\r\n getMoreItems(state, action: PayloadAction) {},\r\n getMoreItems_Success(state, action: PayloadAction>) {\r\n const section = state.data[action.payload.id.toString()];\r\n section.items.push(...action.payload.items);\r\n section.more = action.payload.more;\r\n },\r\n reorder(state, action: PayloadAction) {\r\n const sourceSection =\r\n state.data[action.payload.sourceSectionId.toString()];\r\n if (sourceSection === undefined) {\r\n return;\r\n }\r\n const destinationSection =\r\n state.data[action.payload.destinationSectionId.toString()];\r\n if (destinationSection === undefined) {\r\n return;\r\n }\r\n const [removed] = sourceSection?.items?.splice(\r\n action.payload.sourceIndex,\r\n 1,\r\n );\r\n\r\n destinationSection?.items?.splice(\r\n action.payload.destinationIndex,\r\n 0,\r\n removed,\r\n );\r\n },\r\n reorder_Success(\r\n state,\r\n action: PayloadAction<\r\n Array & Partial>>\r\n >,\r\n ) {\r\n action.payload.forEach(item => {\r\n Object.values(state.data).forEach(section => {\r\n const { Id, ...props } = item;\r\n const ticket = section.items.find(f => f.Id === Id);\r\n if (ticket !== undefined) {\r\n if (props.Index !== undefined) ticket.Index = props.Index;\r\n if (props.Status !== undefined) ticket.Status = props.Status;\r\n }\r\n });\r\n });\r\n },\r\n //todo reuse update & updateError function bodies\r\n reorder_Error(state, action: PayloadAction) {\r\n const sourceSection =\r\n state.data[action.payload.sourceSectionId.toString()];\r\n if (sourceSection === undefined) {\r\n return;\r\n }\r\n const destinationSection =\r\n state.data[action.payload.destinationSectionId.toString()];\r\n if (destinationSection === undefined) {\r\n return;\r\n }\r\n const [removed] = sourceSection?.items?.splice(\r\n action.payload.sourceIndex,\r\n 1,\r\n );\r\n\r\n destinationSection?.items?.splice(\r\n action.payload.destinationIndex,\r\n 0,\r\n removed,\r\n );\r\n },\r\n\r\n showAddSubTicket(state, action: PayloadAction | undefined>) {\r\n state.showAddSubTicket = action.payload !== undefined;\r\n state.parentTicket = action.payload;\r\n },\r\n showEdit(state, action: PayloadAction) {\r\n state.ticket.status = 'pending';\r\n },\r\n showEditParent(state, action: PayloadAction) {\r\n state.ticket.status = 'pending';\r\n },\r\n showEdit_Success(state, action: PayloadAction) {\r\n state.ticket.status = 'resolved';\r\n state.ticket.value = action.payload;\r\n },\r\n showEdit_Error(state, action: PayloadAction) {\r\n state.ticket.status = 'rejected';\r\n },\r\n insert(state, action: PayloadAction>) {\r\n state.processingInsert = true;\r\n },\r\n insert_Success(state, action: PayloadAction) {\r\n // subtract number of samples from the samples count on the main ticket - for sub tickets only\r\n updateSamplesCount(action.payload, state);\r\n\r\n // insert newly created ticket into corresponding section based on the status\r\n // and push the index on the tickets that come after the newly inserted ticket\r\n const statusId = action.payload.Status?.Id;\r\n if (statusId !== undefined) {\r\n const index = action.payload.Index;\r\n if (index !== undefined) {\r\n const section = state.data[statusId.toString()];\r\n const items = section.items;\r\n if (items !== undefined) {\r\n items.slice(index).forEach(ticket => (ticket.Index += 1));\r\n items.splice(index, 0, action.payload);\r\n }\r\n }\r\n }\r\n state.parentTicket = undefined;\r\n state.showAddSubTicket = false;\r\n state.processingInsert = false;\r\n },\r\n insert_Error(state, action: PayloadAction) {\r\n state.processingInsert = false;\r\n },\r\n\r\n update(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.processingUpdate = true;\r\n },\r\n update_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n Object.keys(state.data).forEach(key => {\r\n const item = Object.values(state.data)\r\n .flatMap(section => section.items)\r\n .find(f => f.Id === action.payload.Id);\r\n if (item !== undefined) {\r\n //item = {...item, ...action.payload};\r\n Object.assign(item, action.payload);\r\n }\r\n });\r\n updateSamplesCount(\r\n action.payload,\r\n state,\r\n state.ticket.value?.SamplesCount ?? undefined,\r\n );\r\n state.processingUpdate = false;\r\n },\r\n update_Error(state, action: PayloadAction) {\r\n state.processingUpdate = false;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: serviceRequestsKanbanActions } = slice;\r\n\r\nexport const useServiceRequestsKanbanSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: serviceRequestsKanbanSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\nfunction updateSamplesCount(\r\n payload: Partial,\r\n\r\n state,\r\n originalSamplesCount?: number,\r\n) {\r\n if (payload.SamplesCount !== undefined) {\r\n if (payload.ParentTicket !== undefined) {\r\n const parent = state.data[\r\n payload.ParentTicket.Status.Id.toString()\r\n ].items.find(f => f.Id === payload.ParentTicket?.Id);\r\n if (parent !== undefined) {\r\n parent.SamplesCount -=\r\n (payload.SamplesCount ?? 0) - (originalSamplesCount ?? 0);\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useServiceRequestsKanbanSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","export function sum(values, aggregatedValues) {\r\n // It's faster to just add the aggregations together instead of\r\n // process leaf nodes individually\r\n return aggregatedValues.reduce(\r\n (sum, next) => sum + (typeof next === 'number' ? next : 0),\r\n 0,\r\n );\r\n}\r\n\r\nexport function min(values) {\r\n let min = values[0] || 0;\r\n\r\n values.forEach(value => {\r\n if (typeof value === 'number') {\r\n min = Math.min(min, value);\r\n }\r\n });\r\n\r\n return min;\r\n}\r\n\r\nexport function max(values) {\r\n let max = values[0] || 0;\r\n\r\n values.forEach(value => {\r\n if (typeof value === 'number') {\r\n max = Math.max(max, value);\r\n }\r\n });\r\n\r\n return max;\r\n}\r\n\r\nexport function minMax(values) {\r\n let min = values[0] || 0;\r\n let max = values[0] || 0;\r\n\r\n values.forEach(value => {\r\n if (typeof value === 'number') {\r\n min = Math.min(min, value);\r\n max = Math.max(max, value);\r\n }\r\n });\r\n\r\n return `${min}..${max}`;\r\n}\r\n\r\nexport function average(values) {\r\n return sum(null, values) / values.length;\r\n}\r\n\r\nexport function median(values) {\r\n if (!values.length) {\r\n return null;\r\n }\r\n\r\n const mid = Math.floor(values.length / 2);\r\n const nums = [...values].sort((a, b) => a - b);\r\n return values.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;\r\n}\r\n\r\nexport function unique(values) {\r\n return Array.from(new Set(values).values());\r\n}\r\n\r\nexport function uniqueCount(values) {\r\n return new Set(values).size;\r\n}\r\n\r\nexport function count(values) {\r\n return values.length;\r\n}\r\n","import { defaultColumn, emptyRenderer } from 'react-table';\r\n\r\n// Find the depth of the columns\r\nexport function findMaxDepth(columns, depth = 0) {\r\n return columns.reduce((prev, curr) => {\r\n if (curr.columns) {\r\n return Math.max(prev, findMaxDepth(curr.columns, depth + 1));\r\n }\r\n return depth;\r\n }, 0);\r\n}\r\n\r\n// Build the visible columns, headers and flat column list\r\nexport function linkColumnStructure(columns, parent, depth = 0) {\r\n return columns.map(column => {\r\n column = {\r\n ...column,\r\n parent,\r\n depth,\r\n };\r\n\r\n assignColumnAccessor(column);\r\n\r\n if (column.columns) {\r\n column.columns = linkColumnStructure(column.columns, column, depth + 1);\r\n }\r\n return column;\r\n });\r\n}\r\n\r\nexport function flattenColumns(columns) {\r\n return flattenBy(columns, 'columns');\r\n}\r\n\r\nexport function assignColumnAccessor(column) {\r\n // First check for string accessor\r\n let { id, accessor, Header } = column;\r\n\r\n if (typeof accessor === 'string') {\r\n id = id || accessor;\r\n const accessorPath = accessor.split('.');\r\n accessor = row => getBy(row, accessorPath);\r\n }\r\n\r\n if (!id && typeof Header === 'string' && Header) {\r\n id = Header;\r\n }\r\n\r\n if (!id && column.columns) {\r\n console.error(column);\r\n throw new Error('A column ID (or unique \"Header\" value) is required!');\r\n }\r\n\r\n if (!id) {\r\n console.error(column);\r\n throw new Error('A column ID (or string accessor) is required!');\r\n }\r\n\r\n Object.assign(column, {\r\n id,\r\n accessor,\r\n });\r\n\r\n return column;\r\n}\r\n\r\nexport function decorateColumn(column, userDefaultColumn) {\r\n if (!userDefaultColumn) {\r\n throw new Error();\r\n }\r\n Object.assign(column, {\r\n // Make sure there is a fallback header, just in case\r\n Header: emptyRenderer,\r\n Footer: emptyRenderer,\r\n ...defaultColumn,\r\n ...userDefaultColumn,\r\n ...column,\r\n });\r\n\r\n Object.assign(column, {\r\n originalWidth: column.width,\r\n });\r\n\r\n return column;\r\n}\r\n\r\n// Build the header groups from the bottom up\r\nexport function makeHeaderGroups(\r\n allColumns,\r\n defaultColumn,\r\n additionalHeaderProperties = () => ({}),\r\n) {\r\n const headerGroups = [];\r\n\r\n let scanColumns = allColumns;\r\n\r\n let uid = 0;\r\n const getUID = () => uid++;\r\n\r\n while (scanColumns.length) {\r\n // The header group we are creating\r\n const headerGroup = {\r\n headers: [],\r\n };\r\n\r\n // The parent columns we're going to scan next\r\n const parentColumns = [];\r\n\r\n const hasParents = scanColumns.some(d => d.parent);\r\n\r\n // Scan each column for parents\r\n scanColumns.forEach(column => {\r\n // What is the latest (last) parent column?\r\n let latestParentColumn = [...parentColumns].reverse()[0];\r\n\r\n let newParent;\r\n\r\n if (hasParents) {\r\n // If the column has a parent, add it if necessary\r\n if (column.parent) {\r\n newParent = {\r\n ...column.parent,\r\n originalId: column.parent.id,\r\n id: `${column.parent.id}_${getUID()}`,\r\n headers: [column],\r\n ...additionalHeaderProperties(column),\r\n };\r\n } else {\r\n // If other columns have parents, we'll need to add a place holder if necessary\r\n const originalId = `${column.id}_placeholder`;\r\n newParent = decorateColumn(\r\n {\r\n originalId,\r\n id: `${column.id}_placeholder_${getUID()}`,\r\n placeholderOf: column,\r\n headers: [column],\r\n ...additionalHeaderProperties(column),\r\n },\r\n defaultColumn,\r\n );\r\n }\r\n\r\n // If the resulting parent columns are the same, just add\r\n // the column and increment the header span\r\n if (\r\n latestParentColumn &&\r\n latestParentColumn.originalId === newParent.originalId\r\n ) {\r\n latestParentColumn.headers.push(column);\r\n } else {\r\n parentColumns.push(newParent);\r\n }\r\n }\r\n\r\n headerGroup.headers.push(column);\r\n });\r\n\r\n headerGroups.push(headerGroup);\r\n\r\n // Start scanning the parent columns\r\n scanColumns = parentColumns;\r\n }\r\n\r\n return headerGroups.reverse();\r\n}\r\n\r\nconst pathObjCache = new Map();\r\n\r\nexport function getBy(obj, path, def) {\r\n if (!path) {\r\n return obj;\r\n }\r\n const cacheKey = typeof path === 'function' ? path : JSON.stringify(path);\r\n\r\n const pathObj =\r\n pathObjCache.get(cacheKey) ||\r\n (() => {\r\n const pathObj = makePathArray(path);\r\n pathObjCache.set(cacheKey, pathObj);\r\n return pathObj;\r\n })();\r\n\r\n let val;\r\n\r\n try {\r\n val = pathObj.reduce((cursor, pathPart) => cursor[pathPart], obj);\r\n } catch (e) {\r\n // continue regardless of error\r\n }\r\n return typeof val !== 'undefined' ? val : def;\r\n}\r\n\r\nexport function getFirstDefined(...args) {\r\n for (let i = 0; i < args.length; i += 1) {\r\n if (typeof args[i] !== 'undefined') {\r\n return args[i];\r\n }\r\n }\r\n}\r\n\r\nexport function getElementDimensions(element) {\r\n const rect = element.getBoundingClientRect();\r\n const style = window.getComputedStyle(element);\r\n const margins = {\r\n left: parseInt(style.marginLeft),\r\n right: parseInt(style.marginRight),\r\n };\r\n const padding = {\r\n left: parseInt(style.paddingLeft),\r\n right: parseInt(style.paddingRight),\r\n };\r\n return {\r\n left: Math.ceil(rect.left),\r\n width: Math.ceil(rect.width),\r\n outerWidth: Math.ceil(\r\n rect.width + margins.left + margins.right + padding.left + padding.right,\r\n ),\r\n marginLeft: margins.left,\r\n marginRight: margins.right,\r\n paddingLeft: padding.left,\r\n paddingRight: padding.right,\r\n scrollWidth: element.scrollWidth,\r\n };\r\n}\r\n\r\nexport function isFunction(a) {\r\n if (typeof a === 'function') {\r\n return a;\r\n }\r\n}\r\n\r\nexport function flattenBy(arr, key) {\r\n const flat = [];\r\n\r\n const recurse = arr => {\r\n arr.forEach(d => {\r\n if (!d[key]) {\r\n flat.push(d);\r\n } else {\r\n recurse(d[key]);\r\n }\r\n });\r\n };\r\n\r\n recurse(arr);\r\n\r\n return flat;\r\n}\r\n\r\nexport function expandRows(\r\n rows,\r\n { manualExpandedKey, expanded, expandSubRows = true },\r\n) {\r\n const expandedRows = [];\r\n\r\n const handleRow = (row, addToExpandedRows = true) => {\r\n row.isExpanded =\r\n (row.original && row.original[manualExpandedKey]) || expanded[row.id];\r\n\r\n row.canExpand = row.subRows && !!row.subRows.length;\r\n\r\n if (addToExpandedRows) {\r\n expandedRows.push(row);\r\n }\r\n\r\n if (row.subRows && row.subRows.length && row.isExpanded) {\r\n row.subRows.forEach(row => handleRow(row, expandSubRows));\r\n }\r\n };\r\n\r\n rows.forEach(row => handleRow(row));\r\n\r\n return expandedRows;\r\n}\r\n\r\nexport function getFilterMethod(filter, userFilterTypes, filterTypes) {\r\n return (\r\n isFunction(filter) ||\r\n userFilterTypes[filter] ||\r\n filterTypes[filter] ||\r\n filterTypes.text\r\n );\r\n}\r\n\r\nexport function shouldAutoRemoveFilter(autoRemove, value, column) {\r\n return autoRemove ? autoRemove(value, column) : typeof value === 'undefined';\r\n}\r\n\r\nexport function unpreparedAccessWarning() {\r\n throw new Error(\r\n 'React-Table: You have not called prepareRow(row) one or more rows you are attempting to render.',\r\n );\r\n}\r\n\r\nlet passiveSupported = null;\r\nexport function passiveEventSupported() {\r\n // memoize support to avoid adding multiple test events\r\n if (typeof passiveSupported === 'boolean') return passiveSupported;\r\n\r\n let supported = false;\r\n try {\r\n const options = {\r\n get passive() {\r\n supported = true;\r\n return false;\r\n },\r\n };\r\n\r\n window.addEventListener('test', null, options);\r\n window.removeEventListener('test', null, options);\r\n } catch (err) {\r\n supported = false;\r\n }\r\n passiveSupported = supported;\r\n return passiveSupported;\r\n}\r\n\r\n//\r\n\r\nconst reOpenBracket = /\\[/g;\r\nconst reCloseBracket = /\\]/g;\r\n\r\nfunction makePathArray(obj) {\r\n return (\r\n flattenDeep(obj)\r\n // remove all periods in parts\r\n .map(d => String(d).replace('.', '_'))\r\n // join parts using period\r\n .join('.')\r\n // replace brackets with periods\r\n .replace(reOpenBracket, '.')\r\n .replace(reCloseBracket, '')\r\n // split it back out on periods\r\n .split('.')\r\n );\r\n}\r\n\r\nfunction flattenDeep(arr, newArr = []) {\r\n if (!Array.isArray(arr)) {\r\n newArr.push(arr);\r\n } else {\r\n for (let i = 0; i < arr.length; i += 1) {\r\n flattenDeep(arr[i], newArr);\r\n }\r\n }\r\n return newArr;\r\n}\r\n","import React from 'react';\r\n\r\nimport * as aggregations from './aggregations';\r\n\r\nimport { getFirstDefined, flattenBy } from './utils';\r\n\r\nimport {\r\n actions,\r\n ensurePluginOrder,\r\n useMountedLayoutEffect,\r\n useGetLatest,\r\n} from 'react-table';\r\n\r\nconst emptyArray = [];\r\nconst emptyObject = {};\r\n\r\n// Actions\r\nactions.resetGroupBy = 'resetGroupBy';\r\nactions.setGroupBy = 'setGroupBy';\r\n\r\nexport const useSummary = hooks => {\r\n hooks.stateReducers.push(reducer);\r\n hooks.visibleColumnsDeps.push((deps, { instance }) => [\r\n ...deps,\r\n instance.state.groupBy,\r\n ]);\r\n hooks.visibleColumns.push(visibleColumns);\r\n hooks.useInstance.push(useInstance);\r\n hooks.prepareRow.push(prepareRow);\r\n};\r\n\r\nuseSummary.pluginName = 'useSummary';\r\n\r\n// Reducer\r\nfunction reducer(state, action, previousState, instance) {\r\n if (action.type === actions.init) {\r\n return {\r\n groupBy: [],\r\n ...state,\r\n };\r\n }\r\n\r\n if (action.type === actions.resetGroupBy) {\r\n return {\r\n ...state,\r\n groupBy: instance.initialState.groupBy || [],\r\n };\r\n }\r\n\r\n if (action.type === actions.setGroupBy) {\r\n const { value } = action;\r\n return {\r\n ...state,\r\n groupBy: value,\r\n };\r\n }\r\n}\r\n\r\nfunction visibleColumns(\r\n columns,\r\n {\r\n instance: {\r\n state: { groupBy },\r\n },\r\n },\r\n) {\r\n // Sort grouped columns to the start of the column list\r\n // before the headers are built\r\n\r\n const groupByColumns = groupBy\r\n .map(g => columns.find(col => col.id === g))\r\n .filter(Boolean);\r\n\r\n const nonGroupByColumns = columns.filter(col => !groupBy.includes(col.id));\r\n\r\n columns = [...groupByColumns, ...nonGroupByColumns];\r\n\r\n columns.forEach(column => {\r\n column.isGrouped = groupBy.includes(column.id);\r\n column.groupedIndex = groupBy.indexOf(column.id);\r\n });\r\n\r\n return columns;\r\n}\r\n\r\nconst defaultUserAggregations = {};\r\n\r\nfunction useInstance(instance) {\r\n const {\r\n data,\r\n rows,\r\n flatRows,\r\n rowsById,\r\n allColumns,\r\n groupByFn = defaultGroupByFn,\r\n manualGroupBy,\r\n aggregations: userAggregations = defaultUserAggregations,\r\n plugins,\r\n state: { groupBy },\r\n dispatch,\r\n autoResetGroupBy = true,\r\n disableGroupBy,\r\n defaultCanGroupBy,\r\n } = instance;\r\n\r\n ensurePluginOrder(plugins, ['useColumnOrder', 'useFilters'], 'useSummary');\r\n\r\n allColumns.forEach(column => {\r\n const {\r\n accessor,\r\n defaultGroupBy: defaultColumnGroupBy,\r\n disableGroupBy: columnDisableGroupBy,\r\n } = column;\r\n\r\n column.canGroupBy = accessor\r\n ? getFirstDefined(\r\n column.canGroupBy,\r\n columnDisableGroupBy === true ? false : undefined,\r\n disableGroupBy === true ? false : undefined,\r\n true,\r\n )\r\n : getFirstDefined(\r\n column.canGroupBy,\r\n defaultColumnGroupBy,\r\n defaultCanGroupBy,\r\n false,\r\n );\r\n\r\n column.Aggregated = column.Aggregated || column.Cell;\r\n });\r\n const setGroupBy = React.useCallback(\r\n value => {\r\n dispatch({ type: actions.setGroupBy, value });\r\n },\r\n [dispatch],\r\n );\r\n\r\n const [\r\n groupedRows,\r\n groupedFlatRows,\r\n groupedRowsById,\r\n onlyGroupedFlatRows,\r\n onlyGroupedRowsById,\r\n nonGroupedFlatRows,\r\n nonGroupedRowsById,\r\n summaryRows,\r\n ] = React.useMemo(() => {\r\n if (manualGroupBy || !groupBy.length) {\r\n return [\r\n rows,\r\n flatRows,\r\n rowsById,\r\n emptyArray,\r\n emptyObject,\r\n flatRows,\r\n rowsById,\r\n ];\r\n }\r\n\r\n // Ensure that the list of filtered columns exist\r\n const existingGroupBy = groupBy.filter(g =>\r\n allColumns.find(col => col.id === g),\r\n );\r\n\r\n // Find the columns that can or are aggregating\r\n // Uses each column to aggregate rows into a single value\r\n const aggregateRowsToValues = (leafRows, groupedRows, depth) => {\r\n const values = {};\r\n\r\n allColumns.forEach(column => {\r\n // Don't aggregate columns that are in the groupBy\r\n if (existingGroupBy.includes(column.id)) {\r\n values[column.id] = groupedRows[0]\r\n ? groupedRows[0].values[column.id]\r\n : null;\r\n return;\r\n }\r\n\r\n // Aggregate the values\r\n let aggregateFn =\r\n typeof column.aggregate === 'function'\r\n ? column.aggregate\r\n : userAggregations[column.aggregate] ||\r\n aggregations[column.aggregate];\r\n\r\n if (aggregateFn) {\r\n // Get the columnValues to aggregate\r\n const groupedValues = groupedRows.map(row => row.values[column.id]);\r\n\r\n // Get the columnValues to aggregate\r\n const leafValues = leafRows.map(row => {\r\n let columnValue = row.values[column.id];\r\n\r\n if (!depth && column.aggregateValue) {\r\n const aggregateValueFn =\r\n typeof column.aggregateValue === 'function'\r\n ? column.aggregateValue\r\n : userAggregations[column.aggregateValue] ||\r\n aggregations[column.aggregateValue];\r\n\r\n if (!aggregateValueFn) {\r\n console.info({ column });\r\n throw new Error(\r\n `React Table: Invalid column.aggregateValue option for column listed above`,\r\n );\r\n }\r\n\r\n columnValue = aggregateValueFn(columnValue, row, column);\r\n }\r\n return columnValue;\r\n });\r\n\r\n values[column.id] = aggregateFn(leafValues, groupedValues);\r\n } else if (column.aggregate) {\r\n console.info({ column });\r\n throw new Error(\r\n `React Table: Invalid column.aggregate option for column listed above`,\r\n );\r\n } else {\r\n values[column.id] = null;\r\n }\r\n });\r\n\r\n return values;\r\n };\r\n\r\n let groupedFlatRows = [];\r\n const groupedRowsById = {};\r\n const onlyGroupedFlatRows = [];\r\n const onlyGroupedRowsById = {};\r\n const nonGroupedFlatRows = [];\r\n const nonGroupedRowsById = {};\r\n\r\n // Recursively group the data\r\n const groupUpRecursively = (rows, depth = 0, parentId) => {\r\n // This is the last level, just return the rows\r\n if (depth === existingGroupBy.length) {\r\n return rows;\r\n }\r\n\r\n const columnId = existingGroupBy[depth];\r\n\r\n // Group the rows together for this level\r\n let rowGroupsMap = groupByFn(rows, columnId);\r\n\r\n // Peform aggregations for each group\r\n const aggregatedGroupedRows = Object.entries(rowGroupsMap).map(\r\n ([groupByVal, groupedRows], index) => {\r\n let id = `${columnId}:${groupByVal}`;\r\n id = parentId ? `${parentId}>${id}` : id;\r\n\r\n // First, Recurse to group sub rows before aggregation\r\n const subRows = groupUpRecursively(groupedRows, depth + 1, id);\r\n\r\n // Flatten the leaf rows of the rows in this group\r\n const leafRows = depth\r\n ? flattenBy(groupedRows, 'leafRows')\r\n : groupedRows;\r\n\r\n const values = aggregateRowsToValues(leafRows, groupedRows, depth);\r\n\r\n const row = {\r\n id,\r\n isGrouped: true,\r\n groupByID: columnId,\r\n groupByVal,\r\n values,\r\n subRows,\r\n leafRows,\r\n depth,\r\n index,\r\n };\r\n\r\n subRows.forEach(subRow => {\r\n groupedFlatRows.push(subRow);\r\n groupedRowsById[subRow.id] = subRow;\r\n if (subRow.isGrouped) {\r\n onlyGroupedFlatRows.push(subRow);\r\n onlyGroupedRowsById[subRow.id] = subRow;\r\n } else {\r\n nonGroupedFlatRows.push(subRow);\r\n nonGroupedRowsById[subRow.id] = subRow;\r\n }\r\n });\r\n\r\n return row;\r\n },\r\n );\r\n\r\n return aggregatedGroupedRows;\r\n };\r\n\r\n const groupedRows = groupUpRecursively(rows);\r\n const summaryRows = [\r\n {\r\n id: 'summary',\r\n isGrouped: true,\r\n values: aggregateRowsToValues(rows, rows, 0),\r\n },\r\n ];\r\n groupedRows.forEach(subRow => {\r\n groupedFlatRows.push(subRow);\r\n groupedRowsById[subRow.id] = subRow;\r\n if (subRow.isGrouped) {\r\n onlyGroupedFlatRows.push(subRow);\r\n onlyGroupedRowsById[subRow.id] = subRow;\r\n } else {\r\n nonGroupedFlatRows.push(subRow);\r\n nonGroupedRowsById[subRow.id] = subRow;\r\n }\r\n });\r\n\r\n // Assign the new data\r\n return [\r\n groupedRows,\r\n groupedFlatRows,\r\n groupedRowsById,\r\n onlyGroupedFlatRows,\r\n onlyGroupedRowsById,\r\n nonGroupedFlatRows,\r\n nonGroupedRowsById,\r\n summaryRows,\r\n ];\r\n }, [\r\n manualGroupBy,\r\n groupBy,\r\n rows,\r\n flatRows,\r\n rowsById,\r\n allColumns,\r\n userAggregations,\r\n groupByFn,\r\n ]);\r\n\r\n const getAutoResetGroupBy = useGetLatest(autoResetGroupBy);\r\n\r\n useMountedLayoutEffect(() => {\r\n if (getAutoResetGroupBy()) {\r\n dispatch({ type: actions.resetGroupBy });\r\n }\r\n }, [dispatch, manualGroupBy ? null : data]);\r\n\r\n Object.assign(instance, {\r\n preGroupedRows: rows,\r\n preGroupedFlatRow: flatRows,\r\n preGroupedRowsById: rowsById,\r\n groupedRows,\r\n groupedFlatRows,\r\n groupedRowsById,\r\n onlyGroupedFlatRows,\r\n onlyGroupedRowsById,\r\n nonGroupedFlatRows,\r\n nonGroupedRowsById,\r\n rows: groupedRows,\r\n flatRows: groupedFlatRows,\r\n rowsById: groupedRowsById,\r\n setGroupBy,\r\n summaryRows,\r\n });\r\n}\r\n\r\nfunction prepareRow(row) {\r\n row.allCells.forEach(cell => {\r\n // Grouped cells are in the groupBy and the pivot cell for the row\r\n cell.isGrouped = cell.column.isGrouped && cell.column.id === row.groupByID;\r\n // Placeholder cells are any columns in the groupBy that are not grouped\r\n cell.isPlaceholder = !cell.isGrouped && cell.column.isGrouped;\r\n // Aggregated cells are not grouped, not repeated, but still have subRows\r\n cell.isAggregated =\r\n !cell.isGrouped && !cell.isPlaceholder && row.subRows?.length;\r\n });\r\n}\r\n\r\nexport function defaultGroupByFn(rows, columnId) {\r\n return rows.reduce((prev, row, i) => {\r\n // TODO: Might want to implement a key serializer here so\r\n // irregular column values can still be grouped if needed?\r\n const resKey = `${row.values[columnId]}`;\r\n prev[resKey] = Array.isArray(prev[resKey]) ? prev[resKey] : [];\r\n prev[resKey].push(row);\r\n return prev;\r\n }, {});\r\n}\r\n","import React from 'react';\r\nimport { Row } from 'react-table';\r\nimport { IRow } from '../../IRow';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport {\r\n getAssetImageThumbSrc,\r\n ImageSize,\r\n} from 'app/components/AssetThumbImage/getAssetImageSrc';\r\nimport {\r\n BasicCardWithInfo,\r\n CardPosition,\r\n CardSize,\r\n} from 'app/components/BasicCards';\r\nimport { PrimaryAction } from './PrimaryAction';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectAuthenticatedUser, selectImageExist } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface TableCardProps {\r\n row: Row;\r\n imageSrcKey?: keyof TRow;\r\n titleKey: keyof TRow;\r\n primaryAction?: PrimaryAction;\r\n someSelected: boolean;\r\n viewCheckBox?: boolean;\r\n useSelect: boolean;\r\n hasAdditionalActions: boolean;\r\n hasInlineRowActions: boolean;\r\n toggleAllRowsSelected?: (value?: boolean) => void;\r\n isRowSelectable: (row: Row) => boolean;\r\n active: boolean;\r\n cardSize?: CardSize;\r\n showTitleCell?: boolean;\r\n preventInnerClicks?: boolean;\r\n compact?: boolean;\r\n contentEditable?: boolean;\r\n cardPosition?: CardPosition;\r\n loading?: boolean;\r\n}\r\n\r\nexport function TableCard({\r\n row,\r\n imageSrcKey,\r\n titleKey,\r\n primaryAction,\r\n viewCheckBox = true,\r\n useSelect,\r\n hasAdditionalActions,\r\n hasInlineRowActions,\r\n toggleAllRowsSelected,\r\n isRowSelectable,\r\n someSelected,\r\n active,\r\n cardSize = 'small',\r\n showTitleCell,\r\n compact,\r\n contentEditable,\r\n cardPosition,\r\n loading,\r\n ...props\r\n}: TableCardProps) {\r\n const isMobile = DetectIsMobile() || compact === true;\r\n const user = useSelector(selectAuthenticatedUser);\r\n const { t } = useTranslation();\r\n const useButtons = React.useMemo(() => {\r\n return (\r\n hasInlineRowActions &&\r\n row.cells.filter(c => c.column.id.startsWith('InlineActionColumn'))\r\n .length > 0\r\n );\r\n }, [hasInlineRowActions, row.cells]);\r\n\r\n const sizeOfMobileCard = React.useMemo(() => {\r\n return isMobile ? (cardSize === undefined ? 'small' : cardSize) : undefined;\r\n }, [cardSize, isMobile]);\r\n const position = React.useMemo(() => {\r\n return isMobile\r\n ? 'horizontal'\r\n : cardPosition === undefined\r\n ? 'vertical'\r\n : cardPosition;\r\n }, [cardPosition, isMobile]);\r\n const img = React.useMemo(() => {\r\n return row.original[imageSrcKey ?? ''];\r\n }, [imageSrcKey, row.original]);\r\n const hasImg = React.useMemo(() => {\r\n return (img ?? null) !== null && typeof img === 'string';\r\n }, [img]);\r\n const imageExist = useSelector(state =>\r\n selectImageExist(state, hasImg ? img : null),\r\n );\r\n const imageSize = React.useMemo(() => {\r\n if (position === 'horizontal') {\r\n if (!!sizeOfMobileCard) {\r\n return sizeOfMobileCard === 'medium' ? 'thumbLarge' : 'thumb';\r\n } else {\r\n return cardSize === 'medium' ? 'horizontalLarge' : 'horizontal';\r\n }\r\n } else {\r\n return cardSize === 'medium' ? 'verticalLarge' : 'vertical';\r\n }\r\n }, [cardSize, position, sizeOfMobileCard]);\r\n const imgSrc = React.useMemo(() => {\r\n return getAssetImageThumbSrc(img, imageSize, imageExist);\r\n }, [imageExist, imageSize, img]);\r\n const [showSelect, setShowSelect] = React.useState(\r\n isMobile ? viewCheckBox === true : someSelected || viewCheckBox === true,\r\n );\r\n\r\n React.useEffect(() => {\r\n setShowSelect(\r\n isMobile ? viewCheckBox === true : someSelected || viewCheckBox === true,\r\n );\r\n }, [isMobile, someSelected, viewCheckBox]);\r\n const title = React.useMemo(() => {\r\n return row.cells.find(c => c.column.id === titleKey);\r\n }, [row.cells, titleKey]);\r\n const select = React.useMemo(() => {\r\n return row.cells.find(c => c.column.id === 'selection');\r\n }, [row.cells]);\r\n const isDisabled = React.useMemo(() => {\r\n return !isRowSelectable(row);\r\n }, [isRowSelectable, row]);\r\n const cells = React.useMemo(() => {\r\n return row.cells\r\n .filter(\r\n c =>\r\n c.column.id !== titleKey &&\r\n c.column.id !== imageSrcKey &&\r\n c.column.id !== 'selection',\r\n )\r\n .filter(f => f.value !== null && f.value !== undefined && f.value !== '')\r\n .slice(0, 3);\r\n }, [imageSrcKey, row.cells, titleKey]);\r\n\r\n return (\r\n {!!select && select.render('Cell')}\r\n }\r\n showBullet={true}\r\n cardSize={cardSize}\r\n mobileSize={sizeOfMobileCard}\r\n position={position}\r\n primaryAction={() => {\r\n if (!!primaryAction) {\r\n primaryAction(row, toggleAllRowsSelected, user, undefined, isMobile);\r\n } else if (useSelect && !isDisabled) {\r\n row.toggleRowSelected();\r\n }\r\n }}\r\n useSelect={useSelect} //&& viewCheckBox\r\n useButtons={useButtons}\r\n useImage={imageSrcKey !== undefined}\r\n topActions={\r\n hasAdditionalActions\r\n ? row.cells\r\n .filter(c => c.column.id.startsWith('ActionColumn'))\r\n .map(c => {\r\n return {\r\n key: c.column.id,\r\n action: c.render('Cell'),\r\n };\r\n })\r\n : undefined\r\n }\r\n hasTopActions={hasAdditionalActions}\r\n cardContentRows={\r\n cells.length > 0\r\n ? cells\r\n .filter(\r\n f =>\r\n !(\r\n f.column.id.startsWith('ActionColumn') ||\r\n f.column.id.startsWith('InlineActionColumn')\r\n ),\r\n )\r\n .map(c => {\r\n return {\r\n key: c.column.id,\r\n label: c.render('Header'),\r\n text: c.render('Cell'),\r\n };\r\n })\r\n : undefined\r\n }\r\n buttons={\r\n hasInlineRowActions\r\n ? row.cells\r\n .filter(c => c.column.id.startsWith('InlineActionColumn'))\r\n .map(c => {\r\n return {\r\n key: c.column.id,\r\n button: c.render('Cell'),\r\n };\r\n })\r\n : undefined\r\n }\r\n preventInnerClicks={props.preventInnerClicks}\r\n contentEditable={contentEditable}\r\n loading={loading}\r\n />\r\n );\r\n}\r\n","import { Grow, Tabs, useTheme } from '@material-ui/core';\r\nimport { TabsActionRenderer } from './TabsActionRender';\r\nimport * as React from 'react';\r\nimport { IFilterSettings } from '../../BasicFilter/IFilterSettings';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Row } from 'react-table';\r\nimport { IRow } from '../..';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ICanRaiseBasicTableRefreshEvent } from '../../ControlledTable/ControlledTableProps';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport clsx from 'clsx';\r\n\r\nexport interface TabsToolbarProps\r\n extends ICanRaiseBasicTableRefreshEvent {\r\n rowsCount: number;\r\n rows: Row[];\r\n leftTabs?: TabsActionRenderer[];\r\n rightTabActions?: TabsActionRenderer[];\r\n selectedValue?: number;\r\n selectedArray: TRow[];\r\n toggleAllRowsSelected: (value?: boolean) => void;\r\n appliedFilters?: IFilterSettings[];\r\n allRowsSelected?: boolean;\r\n isRowSelectable: (row: Row) => boolean;\r\n getMultiMode?: (mode: boolean) => void;\r\n onAllRowsSelected?: (rows: Row[], selected: boolean) => void;\r\n disableMultiMode?: boolean;\r\n defaultMultiMode?: boolean;\r\n showClear?: boolean;\r\n compact?: boolean;\r\n selectMultiLabel?: string;\r\n}\r\n\r\nexport const TabsToolbar = React.memo(function TabsToolbarFunc(\r\n props: TabsToolbarProps,\r\n) {\r\n const {\r\n leftTabs,\r\n selectedValue,\r\n onRefresh,\r\n selectedArray,\r\n toggleAllRowsSelected,\r\n appliedFilters,\r\n rowsCount,\r\n rows,\r\n allRowsSelected,\r\n isRowSelectable,\r\n getMultiMode,\r\n onAllRowsSelected,\r\n disableMultiMode,\r\n defaultMultiMode = true,\r\n rightTabActions,\r\n //showClear,\r\n compact,\r\n } = props;\r\n const [value, setValue] = React.useState(selectedValue || 0);\r\n const isMobile = DetectIsMobile();\r\n const { t } = useTranslation();\r\n const theme = useTheme();\r\n const [multiMode, setMultiMode] = React.useState(\r\n (selectedArray.length > 0 && !disableMultiMode) ||\r\n defaultMultiMode === true,\r\n );\r\n // const handleChecked = React.useCallback(\r\n // ev => {\r\n // if (!multiMode) {\r\n // setMultiMode(true);\r\n // !!getMultiMode && getMultiMode(true);\r\n // } else {\r\n // let selectable = rows.filter(f => isRowSelectable(f));\r\n // selectable.forEach(f => {\r\n // f.isSelected && f.toggleRowSelected(false);\r\n // });\r\n // if (!!onAllRowsSelected) {\r\n // onAllRowsSelected(selectable, false);\r\n // }\r\n // setMultiMode(false);\r\n // !!getMultiMode && getMultiMode(false);\r\n // }\r\n // },\r\n // [getMultiMode, isRowSelectable, multiMode, onAllRowsSelected, rows],\r\n // );\r\n const handleChange = (event: any, newValue: number) => {\r\n setValue(newValue);\r\n };\r\n React.useEffect(() => {\r\n if (selectedArray.length > 1 || defaultMultiMode === true) {\r\n //!multiMode &&\r\n setMultiMode(true);\r\n } else {\r\n setMultiMode(false);\r\n }\r\n }, [defaultMultiMode, multiMode, selectedArray.length]);\r\n return (\r\n \r\n {!isMobile && !compact && (\r\n
\r\n {!!leftTabs && leftTabs.length > 0 && (\r\n \r\n ref?.updateIndicator()}\r\n selectionFollowsFocus={false}\r\n indicatorColor=\"primary\"\r\n value={value}\r\n onChange={(ev, value) => handleChange(ev, value)}\r\n aria-label=\"nav tabs example\"\r\n >\r\n {leftTabs.map((tab, index) =>\r\n tab(\r\n rowsCount,\r\n rows,\r\n toggleAllRowsSelected,\r\n selectedArray,\r\n allRowsSelected,\r\n onRefresh,\r\n appliedFilters,\r\n ),\r\n )}\r\n \r\n \r\n )}\r\n
\r\n )}\r\n \r\n {/* selectedArray.length > 0 && (multiMode || showClear) && */}\r\n {!disableMultiMode && (\r\n }\r\n disabled={!(selectedArray.length > 0)}\r\n onClick={event => {\r\n event.stopPropagation();\r\n let selectable = rows.filter(f => isRowSelectable(f));\r\n selectable.forEach(f => {\r\n f.toggleRowSelected(false);\r\n });\r\n if (!!onAllRowsSelected) {\r\n onAllRowsSelected(selectable, false);\r\n }\r\n let allPagesUnselected = selectedArray.length > selectable.length;\r\n setMultiMode(allPagesUnselected);\r\n !!getMultiMode && getMultiMode(allPagesUnselected);\r\n }}\r\n >\r\n {compact || isMobile\r\n ? t(translations.Unselect)\r\n : t(translations.ClearSelection)}\r\n \r\n )}\r\n {/* (multiMode === true || selectedArray.length > 0) && */}\r\n {!disableMultiMode && (\r\n }\r\n onClick={() => {\r\n setMultiMode(true);\r\n !!getMultiMode && getMultiMode(true);\r\n let selectable = rows.filter(f => isRowSelectable(f));\r\n selectable.forEach(f => {\r\n f.toggleRowSelected(true);\r\n });\r\n if (!!onAllRowsSelected) {\r\n onAllRowsSelected(selectable, true);\r\n }\r\n }}\r\n >\r\n {t(translations.CoreSelectAll)}\r\n \r\n )}\r\n {/* */}\r\n\r\n {/* {tabRightActions\r\n .filter(f => f !== undefined)\r\n .map((tab, index) => (\r\n {tab(rowsCount, rows)}\r\n ))} */}\r\n \r\n {!!rightTabActions && rightTabActions.length > 0 && (\r\n <>\r\n {rightTabActions\r\n .filter(f => f !== undefined)\r\n .map((tab, index) => (\r\n {tab(rowsCount, rows)}\r\n ))}\r\n \r\n )}\r\n \r\n );\r\n});\r\nconst TabsContainer = styled('div')(({ theme }) => ({\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n padding: '8px 32px',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n '&.shortView': {\r\n flexDirection: 'column',\r\n padding: '8px 8px 16px',\r\n alignItems: 'start',\r\n },\r\n '& .tabsContent': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n gap: 16,\r\n },\r\n '& .buttonsContent': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n //flexWrap: isMobile ? 'wrap' : 'nowrap',\r\n gap: 16,\r\n '&.shortView': {\r\n gap: 0,\r\n },\r\n },\r\n}));\r\n","import { useTheme } from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { BookitChip } from 'app/components/BasicChip';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { SelectedRowsActionExtRenderer } from '../SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport * as React from 'react';\r\nimport { IdType, Row } from 'react-table';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectHideNavigation } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport clsx from 'clsx';\r\nimport { IRow } from '..';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { ICanRaiseBasicTableRefreshEvent } from '../ControlledTable/ControlledTableProps';\r\nimport styled from 'styled-components';\r\n\r\nconst genericMemo: (component: T) => T = React.memo;\r\n\r\nexport interface FloatingActionsProps\r\n extends ICanRaiseBasicTableRefreshEvent {\r\n selectedActions: SelectedRowsActionExtRenderer[];\r\n rows: Row[];\r\n useSidePanel?: boolean;\r\n buttonActions?: SelectedRowsActionExtRenderer[];\r\n\r\n selectedArray: TRow[];\r\n toggleAllRowsSelected: (value?: boolean) => void;\r\n toggleRowSelected: (rowId: IdType, set?: boolean | undefined) => void;\r\n totalRows: number;\r\n compact?: boolean;\r\n}\r\n\r\nexport const FloatingContainer = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 8,\r\n height: 72,\r\n background: '#ffffff',\r\n borderRadius: 8,\r\n boxShadow: '0px 2px 18px rgba(8, 24, 41, 0.16)',\r\n '&.fixedContainer': {\r\n position: 'fixed',\r\n insetBlock: 'auto 80px',\r\n insetInline: 'auto 160px',\r\n zIndex: 1070,\r\n width: '70%',\r\n padding: 16,\r\n '&.fullWidth': {\r\n width: '80%',\r\n },\r\n },\r\n '&.fixedContainerMobile': {\r\n //position: 'absolute',\r\n zIndex: 1070, //zIndex: 1500,\r\n width: '100%',\r\n padding: '16px 8px',\r\n //bottom: 'unset',\r\n position: 'fixed',\r\n bottom: '50px',\r\n '&.isPopup': {\r\n position: 'absolute',\r\n bottom: '50px',\r\n },\r\n },\r\n '& .buttonsContent': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: 8,\r\n width: 'calc(100% - 200px)',\r\n '&.mobile': {\r\n width: 'calc(100% - 115px)',\r\n },\r\n '&.compact': {\r\n width: 'auto',\r\n },\r\n '& .actions': {\r\n display: 'inline-flex',\r\n flex: '1 1 auto',\r\n position: 'relative',\r\n whiteSpace: 'nowrap',\r\n overflow: 'auto hidden',\r\n alignItems: 'center',\r\n gap: 8,\r\n '&.compactActions': {\r\n flex: '0 1 auto',\r\n },\r\n '& .rowsCount': {\r\n display: 'inline-flex',\r\n },\r\n },\r\n },\r\n '& .buttonActions': {\r\n display: 'inline-flex',\r\n flex: '1 1 auto',\r\n position: 'relative',\r\n whiteSpace: 'nowrap',\r\n overflow: 'auto hidden',\r\n gap: 8,\r\n },\r\n}));\r\n\r\nfunction FloatingActionsFunc(props: FloatingActionsProps) {\r\n const {\r\n selectedActions: actions,\r\n onRefresh,\r\n selectedArray,\r\n toggleAllRowsSelected,\r\n totalRows,\r\n buttonActions,\r\n useSidePanel,\r\n toggleRowSelected,\r\n compact,\r\n rows,\r\n } = props;\r\n const isMobile = DetectIsMobile() === true;\r\n const hideNavigation = useSelector(selectHideNavigation);\r\n\r\n const maxButtons = React.useMemo(() => {\r\n return isMobile || compact === true ? 1 : 6;\r\n }, [compact, isMobile]);\r\n const baseActions = React.useMemo(() => {\r\n return actions.length > maxButtons\r\n ? actions.slice(0, maxButtons - 1)\r\n : actions;\r\n }, [actions, maxButtons]);\r\n const sperActions = React.useMemo(() => {\r\n return actions.length > maxButtons ? actions.slice(maxButtons - 1) : [];\r\n }, [actions, maxButtons]);\r\n const theme = useTheme();\r\n // const toggleSingleSelected = (\r\n // rowId: IdType,\r\n // set?: boolean | undefined,\r\n // ) => {\r\n // let selectable = rows.filter(f => f.id === rowId).length > 0;\r\n // if (selectable) {\r\n // return toggleRowSelected(rowId, set);\r\n // }\r\n // };\r\n return (\r\n \r\n \r\n \r\n
\r\n {`${selectedArray.length} of ${totalRows} Items`}\r\n
\r\n {sperActions.length > 0 ? (\r\n \r\n {baseActions.map((item, index) =>\r\n item(\r\n selectedArray,\r\n rows,\r\n onRefresh,\r\n toggleAllRowsSelected,\r\n toggleRowSelected,\r\n ),\r\n )}\r\n \r\n \r\n ) : (\r\n \r\n {actions.map((item, index) => (\r\n \r\n {item(\r\n selectedArray,\r\n rows,\r\n onRefresh,\r\n toggleAllRowsSelected,\r\n toggleRowSelected,\r\n )}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n \r\n {!!buttonActions && buttonActions.length > 0 && (\r\n
\r\n {buttonActions.map((item, index) => (\r\n \r\n {item(\r\n selectedArray,\r\n rows,\r\n onRefresh,\r\n toggleAllRowsSelected,\r\n toggleRowSelected,\r\n )}\r\n \r\n ))}\r\n
\r\n )}\r\n \r\n );\r\n}\r\nexport interface SperActionsProps\r\n extends ICanRaiseBasicTableRefreshEvent {\r\n actions: SelectedRowsActionExtRenderer[];\r\n selectedArray: TRow[];\r\n rows: Row[];\r\n toggleAllRowsSelected: (value?: boolean) => void;\r\n toggleRowSelected: (rowId: IdType, set?: boolean | undefined) => void;\r\n isMobile: boolean;\r\n}\r\nfunction SperActionsFunc(props: SperActionsProps) {\r\n const {\r\n actions,\r\n onRefresh,\r\n selectedArray,\r\n rows,\r\n toggleAllRowsSelected,\r\n toggleRowSelected,\r\n isMobile,\r\n } = props;\r\n return (\r\n {}}\r\n deleteIcon={\r\n (\r\n \r\n {item(\r\n selectedArray,\r\n rows,\r\n onRefresh,\r\n toggleAllRowsSelected,\r\n toggleRowSelected,\r\n )}\r\n \r\n )),\r\n ].filter(v => !!v) as JSX.Element[]\r\n }\r\n >\r\n }\r\n variant=\"default\"\r\n customsize=\"medium\"\r\n label={`and ${actions.length} more`}\r\n customwidth={isMobile ? 150 : 180}\r\n custombgcolor={bookitColors.primary.disabled}\r\n customcolor={bookitColors.grayscale.blackComponents}\r\n customiconcolor={bookitColors.primary.regular}\r\n shape=\"circle\"\r\n key={'sper_actions'}\r\n />\r\n );\r\n}\r\nexport const SperActions = genericMemo(SperActionsFunc);\r\nexport const FloatingActions = genericMemo(FloatingActionsFunc);\r\n","import { Box, createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Row } from 'react-table';\r\nimport { IRow } from '../..';\r\n\r\nexport interface ICustomToolbar extends Record {\r\n rowsCount: number;\r\n rows: Row[];\r\n}\r\nexport interface CustomToolbarProps {\r\n Component: React.ReactNode;\r\n compact?: boolean;\r\n}\r\n\r\nfunction CustomToolbarFunc(props: CustomToolbarProps) {\r\n const { Component, compact } = props;\r\n const isMobile = DetectIsMobile() || compact === true;\r\n const classes = useStyles({ isMobile })();\r\n return {Component};\r\n}\r\nconst useStyles = ({ isMobile }: { isMobile: boolean }) =>\r\n makeStyles((theme: Theme) =>\r\n createStyles({\r\n customRoot: {\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: isMobile ? '8px 8px 16px' : '8px 32px',\r\n },\r\n tabsContant: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n gap: 16,\r\n },\r\n buttonsContant: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n //flexWrap: isMobile ? 'wrap' : 'nowrap',\r\n gap: isMobile ? 0 : 16,\r\n },\r\n }),\r\n );\r\nexport const CustomToolbar = React.memo(CustomToolbarFunc);\r\n","import * as React from 'react';\r\nimport { TableCell, TableRow } from '@material-ui/core';\r\nimport { Row } from 'react-table';\r\nimport { IRow } from 'app/components/BasicTable/IRow';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { ICanRaiseBasicTableRefreshEvent } from './ControlledTableProps';\r\n\r\nexport interface RenderRowProps\r\n extends ICanRaiseBasicTableRefreshEvent {\r\n row: Row;\r\n\r\n onRowClicked?: (row: TRow) => void;\r\n children?: (cell) => React.ReactNode;\r\n}\r\nexport function RenderRow({\r\n row,\r\n onRefresh,\r\n onRowClicked,\r\n children = cell =>\r\n cell.render('Cell', {\r\n onRefresh: onRefresh,\r\n }),\r\n}: RenderRowProps) {\r\n const canClickRow = onRowClicked !== undefined;\r\n return (\r\n \r\n onRowClicked?.(row.original)}\r\n {...row.getRowProps()}\r\n >\r\n {\r\n // Loop over the rows cells\r\n row.cells.map(cell => {\r\n // Apply the cell props\r\n return (\r\n \r\n {\r\n if (canClickRow) {\r\n e.stopPropagation();\r\n }\r\n }}\r\n >\r\n {\r\n // Render the cell contents\r\n children(cell)\r\n }\r\n
\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n );\r\n}\r\n","import { H3 } from 'app/components/Typography';\r\nimport { H4 } from 'app/components/Typography';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { FlexRowDiv } from 'app/components/basic/Wrappers/FlexWrappers/flexRow';\r\nimport React from 'react';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\n\r\nexport interface CustomEmptyTableProps {\r\n id?: string;\r\n headTitle?: string;\r\n title?: string;\r\n shortView?: boolean;\r\n}\r\n\r\nexport function CustomEmptyTable(props: CustomEmptyTableProps) {\r\n const { headTitle, title } = props;\r\n return (\r\n \r\n \r\n {props.shortView ? (\r\n \r\n {headTitle && (\r\n {headTitle}\r\n )}\r\n {title && (\r\n {title}\r\n )}\r\n \r\n ) : (\r\n \r\n {headTitle &&

{headTitle}

}\r\n {title &&

{title}

}\r\n
\r\n )}\r\n
\r\n
\r\n );\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const TableHeaderCellLabel = styled('span')`\r\n white-space: break-spaces;\r\n word-break: normal;\r\n`;\r\n\r\n// export const TableCell = withStyles({\r\n// root: {\r\n// height: '32px',\r\n// },\r\n// head: {},\r\n// body: {\r\n// padding: '10px 12px',\r\n// },\r\n// })(MuiTableCell);\r\n","import * as React from 'react';\r\nimport { IRow } from 'app/components/BasicTable/IRow';\r\nimport { RenderRow, RenderRowProps } from './RenderRow';\r\n\r\nexport interface RenderGroupedRowProps\r\n extends RenderRowProps {}\r\n\r\nexport function RenderGroupedRow({\r\n row,\r\n onRefresh,\r\n onRowClicked,\r\n children = cell =>\r\n cell.isAggregated\r\n ? // If the cell is aggregated, use the Aggregated\r\n // renderer for cell\r\n cell.render('Aggregated')\r\n : cell.isPlaceholder\r\n ? null // For cells with repeated values, render null\r\n : // Otherwise, just render the regular cell\r\n cell.render('Cell', {\r\n onRefresh: onRefresh,\r\n }),\r\n}: RenderGroupedRowProps) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ImportButton\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Menu } from '@material-ui/core';\r\n\r\nexport interface ImportButtonProps {\r\n onClick: () => void;\r\n importLink?: string;\r\n importHandler?: () => void;\r\n menuItems?: (onClose: () => void) => React.ReactNode[] | undefined;\r\n}\r\n\r\nexport function ImportButton(props: ImportButtonProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n const handleImport = async () => {\r\n handleClose();\r\n props.onClick();\r\n };\r\n const menuItems = React.useMemo(() => {\r\n const result = props.menuItems ? props.menuItems(handleClose) : undefined;\r\n return result;\r\n }, [props]);\r\n const showSingleImportButton =\r\n menuItems === undefined || menuItems.length === 0;\r\n\r\n return (\r\n \r\n }\r\n onClick={showSingleImportButton ? handleImport : handleClick}\r\n >\r\n {t(translations.Import)}\r\n \r\n {!showSingleImportButton && (\r\n <>\r\n \r\n {menuItems}\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ControlledTable\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n LinearProgress,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TablePagination,\r\n TableRow,\r\n TableSortLabel,\r\n} from '@material-ui/core';\r\nimport Table from '@material-ui/core/Table';\r\nimport {\r\n useTable,\r\n usePagination,\r\n useSortBy,\r\n UseSortByState,\r\n UseSortByInstanceProps,\r\n UsePaginationState,\r\n PluginHook,\r\n useGlobalFilter,\r\n useExpanded,\r\n Row,\r\n HeaderGroup,\r\n SortingRule,\r\n} from 'react-table';\r\nimport TablePaginationActions from 'app/components/BasicTable/TablePaginationActions';\r\nimport { TableContainer } from '@material-ui/core';\r\nimport { GlobalFilter } from 'app/components/BasicTable/GlobalFilter';\r\nimport { IRow } from 'app/components/BasicTable/IRow';\r\nimport { BasicFilterGroup } from 'app/components/BasicTable/BasicFilter';\r\nimport { useState } from 'react';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { useStyles } from 'app/components/BasicTable/styles';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { Button } from 'app/components//BasicButtons/Button';\r\nimport { TableHeaderIcon } from 'app/components//BasicIcons/SvgIcons';\r\nimport { Icon } from 'app/components//BasicIcons/FontAwesome';\r\nimport { TableToolbar } from 'app/components/BasicTable/BasicFilter/TableToolbar';\r\nimport { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\n//import { Progress } from '../LoadingIndicator';\r\nimport { BasicTableProps } from '..';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { ExportButton } from 'app/components/BasicTable/ExportButton';\r\nimport { orderBy, sortedUniq } from 'lodash';\r\nimport { FilterContainer } from '../FilterContainer';\r\nimport { PageActionRenderer2 } from '../PageActions/PageActionsRenderer';\r\nimport { FilterIconButton } from 'app/components/BasicButtons/FilterIconButton';\r\nimport { TableRowsSkeleton } from '../components/TableSkeleton';\r\nimport { AlertContentType, BasicAlert } from 'app/components/BasicAlert';\r\nimport { ControlledTableProps } from './ControlledTableProps';\r\nimport { SelectedActions } from '../SelectedActions';\r\nimport { FiltersGroupDisplay } from '../BasicFilter/FiltersGroupDisplay';\r\nimport { NoTableData } from '../components/NoTableData';\r\nimport { useMemoFilters } from '../useMemoFilters';\r\nimport { useInlineRowActionsColumn, useRowActionsColumn } from '../RowActions';\r\nimport { useSummary } from '../Hooks/useSummary';\r\nimport { TableError } from '../components/TableError';\r\nimport { FiltersButton } from '../BasicFilter/FiltersButton';\r\nimport { TableCardGrid } from '../components/TableCardGrid';\r\nimport { TableCard } from '../components/TableCard';\r\nimport { ConfigureColumnsButton } from '../components/ConfigureColumnsButton';\r\nimport { TabsToolbar } from '../components/TabsToolbar';\r\nimport { selectActionTableProcessing } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { FloatingActions } from '../components/FloatingActions';\r\nimport clsx from 'clsx';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { CustomToolbar } from '../components/CustomTableToolbar';\r\nimport { RenderRow } from './RenderRow';\r\nimport { CustomEmptyTable } from '../components/CustomEmptyTable';\r\nimport DefaultRenderer from '../CellRenderers/DefaultRenderer';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { TableHeaderCellLabel } from './TableCell';\r\nimport { RenderGroupedRow } from './RenderGroupedRow';\r\nimport { selectGlobalSearchOpen } from 'app/pages/PublicAssets/slice/selectors';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { ImportButton } from '../ImportButton';\r\nimport { Notification } from 'types/Notification';\r\nimport { addRowSelect } from './addRowSelect';\r\n\r\nexport type { IRow };\r\nexport type { BasicTableProps };\r\n\r\ntype IPartialTableState = Partial<\r\n UseSortByState & UsePaginationState & UseSortByInstanceProps\r\n>;\r\nexport type TableMode = 'card' | 'table';\r\n/**\r\n * Interface to the (initial) table state\r\n */\r\nexport interface IControlledTableState\r\n extends IPartialTableState {}\r\n\r\n// todo: enable row accessor for rowActions\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst defaultRowIdAccessor = (row: TRow): string =>\r\n row.Id?.toString();\r\n\r\nconst defaultGetSubRows = original =>\r\n original.Rows && original.Rows.length > 1 ? original.Rows : [];\r\nexport const defaultCheckIfRowIsSelectable = (\r\n row: TRow,\r\n): boolean => true;\r\n/**\r\n * Server side driven Table component that will be reused in most of the pages\r\n * @param param0\r\n * @returns\r\n */\r\nexport function ControlledTable({\r\n columns,\r\n initialState,\r\n getRowId = defaultRowIdAccessor,\r\n searchColumns,\r\n useExport = true,\r\n onDownloadTemplate,\r\n rowActions,\r\n inlineRowActions,\r\n pageActions,\r\n screenName,\r\n screenNameVariant = 'H1',\r\n selectedRowsActions,\r\n filterOpen = false,\r\n screenId,\r\n serviceGroups,\r\n customParams,\r\n useImportLink,\r\n importLink,\r\n importHandler,\r\n ServiceGroupsOptional,\r\n topAlertMessage,\r\n onChangeState,\r\n onSelectedRowsChange,\r\n onExport,\r\n compact = true,\r\n updateMyData,\r\n loading,\r\n tableRowsSize = 'small',\r\n getSubRows = defaultGetSubRows,\r\n savedListSettings,\r\n withToolBar = true,\r\n allowCards,\r\n useCardsByDefault,\r\n onModeChange,\r\n viewCardsCheck,\r\n floatingTabSettings,\r\n tabSectionSettings,\r\n isRowSelectable,\r\n onSelectedChange,\r\n hideMenuOnMobile,\r\n useConfigurable = true,\r\n customToolbarSettings,\r\n showTitleCell,\r\n getAllFilteredRowsCallback,\r\n useExportForImport,\r\n exportForImportFilterKey,\r\n customEmptyTableSettings,\r\n manualPagination = true,\r\n manualSorting = true,\r\n enablePagination = true,\r\n onRowClicked,\r\n printing,\r\n alwaysShowTableHeader,\r\n hideFilters,\r\n baseTableActionsOnToolbar,\r\n baseSortBy,\r\n showGlobalSearchIconOnToolbar,\r\n toggleGlobalSearchIcon,\r\n customExpandMenu,\r\n customScreenName,\r\n getDefaultFilters,\r\n importMenuItems,\r\n isContentEditable,\r\n cardPosition = 'vertical',\r\n tablePaddingVariant = 'regular',\r\n minCardHeight = 80,\r\n ...props\r\n}: ControlledTableProps) {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const dispatch = useDispatch();\r\n const { actions: globalActions } = useAppSettingsSlice();\r\n // collapsed state of the filters\r\n // reference to the show/hide filters button\r\n const [filtersButtonAnchorEl, setFiltersButtonAnchorEl] = React.useState(\r\n null,\r\n );\r\n // collapsed state of the filters\r\n const [open, setOpen] = React.useState(false);\r\n // data length - total number of the records\r\n const dataLength = React.useMemo(() => {\r\n return props.dataLength ?? 0;\r\n }, [props.dataLength]);\r\n // table Plugins array assembly\r\n const tablePlugins: PluginHook[] = [\r\n useSummary,\r\n useGlobalFilter,\r\n useSortBy,\r\n useExpanded,\r\n ];\r\n if (enablePagination) {\r\n tablePlugins.push(usePagination);\r\n }\r\n if (searchColumns !== undefined && searchColumns?.length > 0) {\r\n tablePlugins.unshift(useGlobalFilter);\r\n }\r\n\r\n if (props.useRowSelect) {\r\n addRowSelect(tablePlugins, isRowSelectable, onSelectedChange);\r\n }\r\n useInlineRowActionsColumn(inlineRowActions, tablePlugins);\r\n useRowActionsColumn(rowActions, tablePlugins);\r\n const columnsDefinition = React.useMemo(() => {\r\n const columnDefaults = {\r\n Cell: DefaultRenderer,\r\n };\r\n return columns.map(column => ({\r\n ...columnDefaults,\r\n ...column,\r\n }));\r\n }, [columns]);\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n prepareRow,\r\n rows: reactTableRows,\r\n page: reactTablePage,\r\n gotoPage,\r\n setPageSize,\r\n setGlobalFilter,\r\n // todo: make use of the selectedRowIds\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n state: { pageIndex, pageSize, sortBy, selectedRowIds, globalFilter },\r\n selectedFlatRows,\r\n toggleAllRowsSelected,\r\n toggleRowSelected,\r\n isAllRowsSelected,\r\n summaryRows,\r\n setSortBy,\r\n } = useTable(\r\n {\r\n columns: columnsDefinition,\r\n data: props.data,\r\n updateMyData,\r\n initialState,\r\n // server side controlled pagination\r\n manualPagination: manualPagination,\r\n // server side controlled sorting\r\n manualSortBy: manualSorting,\r\n // server side controlled global filter\r\n manualGlobalFilter: true,\r\n //When true, the selectedRowIds state will automatically reset if any of the following conditions are met:\r\n autoResetSelectedRows: false,\r\n //When true, the paging is always reset to initial pageIndex state.\r\n autoResetPage: false,\r\n // controlled page count (server sided pagination)\r\n pageCount: props.pageCount,\r\n getRowId: getRowId,\r\n getSubRows,\r\n },\r\n ...tablePlugins,\r\n );\r\n const rows = React.useMemo(() => {\r\n return enablePagination ? reactTablePage : reactTableRows;\r\n }, [enablePagination, reactTablePage, reactTableRows]);\r\n\r\n useEffect(() => {\r\n if (baseSortBy !== undefined) {\r\n setSortBy(baseSortBy);\r\n }\r\n }, [baseSortBy, setSortBy]);\r\n\r\n useEffect(() => {\r\n if (initialState?.pageSize !== undefined) {\r\n setPageSize(initialState.pageSize);\r\n }\r\n }, [initialState?.pageSize, setPageSize]);\r\n\r\n useEffect(() => {\r\n if (initialState?.globalFilter !== undefined) {\r\n setGlobalFilter(initialState.globalFilter);\r\n }\r\n }, [initialState?.globalFilter, setGlobalFilter]);\r\n // useEffect(() => {\r\n // if (initialState?.pageIndex !== undefined) {\r\n // gotoPage(initialState.pageIndex);\r\n // }\r\n // }, [gotoPage, initialState?.pageIndex]);\r\n\r\n /**\r\n * Track selected original row values. selectedRowIds only stores the row Ids.\r\n * selectedFlatRows only holds selected rows from the current page.\r\n */\r\n const isSomeSelected = React.useMemo(() => {\r\n return Object.keys(selectedRowIds || {}).length > 0;\r\n }, [selectedRowIds]);\r\n const [selected, setSelected] = useState>({});\r\n useEffect(() => {\r\n setSelected(state =>\r\n Object.keys(selectedRowIds || {}).reduce((accumulator, key) => {\r\n accumulator[key] =\r\n state[key] ??\r\n selectedFlatRows\r\n .filter(isRowSelectable || defaultCheckIfRowIsSelectable)\r\n .find(row => row.id === key)?.original;\r\n return accumulator;\r\n }, {}),\r\n );\r\n }, [selectedRowIds, selectedFlatRows, isRowSelectable]);\r\n const selectedArray = React.useMemo(() => {\r\n return Object.entries(selected).map(value => value[1]);\r\n }, [selected]);\r\n\r\n const appliedFiltersLength = React.useMemo(() => {\r\n return props.appliedFilters && props.appliedFilters.length > 0\r\n ? props.appliedFilters.filter(\r\n f => f.value !== null && f.value !== undefined && f.value !== '',\r\n ).length\r\n : 0;\r\n }, [props.appliedFilters]);\r\n\r\n const handleFilterChange = React.useCallback(\r\n (items: IFilterSettings[]) => {\r\n props.onFilterChange?.(items);\r\n if (items.length !== appliedFiltersLength) {\r\n gotoPage(0);\r\n }\r\n },\r\n [appliedFiltersLength, gotoPage, props],\r\n );\r\n const [alreadySelected, setAlreadySelected] = React.useState[]>(\r\n selectedFlatRows || [],\r\n );\r\n useEffect(() => {\r\n let active =\r\n onSelectedRowsChange !== undefined &&\r\n selectedFlatRows !== undefined &&\r\n selectedFlatRows.length !== alreadySelected.length;\r\n if (active) {\r\n !!onSelectedRowsChange &&\r\n onSelectedRowsChange(\r\n selectedFlatRows\r\n .filter(isRowSelectable || defaultCheckIfRowIsSelectable)\r\n .map(row => row.original),\r\n );\r\n setAlreadySelected(selectedFlatRows);\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n alreadySelected.length,\r\n isRowSelectable,\r\n onSelectedRowsChange,\r\n selectedFlatRows,\r\n ]);\r\n // page change handler\r\n const handlePageChange: (\r\n event: React.MouseEvent | null,\r\n page: number,\r\n ) => void = (e, page) => {\r\n gotoPage(page < 0 ? 0 : page);\r\n };\r\n const handlePageSizeChange = newPageSize => {\r\n // setControlledPageCount(Math.ceil(dataLength / newPageSize));\r\n setPageSize(newPageSize);\r\n };\r\n const filterRef = React.useRef(null);\r\n const handleFilterOpen = React.useCallback(() => {\r\n setFiltersButtonAnchorEl(filterRef.current);\r\n setOpen(!open);\r\n }, [open]);\r\n\r\n const AuthenticatedUser = useSelector(selectAuthenticatedUser);\r\n const customProcesing = useSelector(selectActionTableProcessing);\r\n const globalSearchOpen = useSelector(selectGlobalSearchOpen);\r\n const showGlobalFilter = React.useMemo(() => {\r\n return (\r\n searchColumns !== undefined && searchColumns?.length > 0 && !hideFilters\r\n );\r\n }, [hideFilters, searchColumns]);\r\n\r\n const defaultPageActions: PageActionRenderer2[] = React.useMemo(() => {\r\n const actions: PageActionRenderer2[] = [];\r\n if (compact && props.availableFilters !== undefined && !hideFilters) {\r\n actions.push((dataCount, refresh) => (\r\n \r\n ));\r\n }\r\n if (pageActions !== undefined) {\r\n if (pageActions.length > 0) {\r\n pageActions.forEach(element => {\r\n actions.push(element);\r\n });\r\n }\r\n }\r\n return actions;\r\n }, [\r\n appliedFiltersLength,\r\n compact,\r\n handleFilterOpen,\r\n hideFilters,\r\n pageActions,\r\n props.availableFilters,\r\n ]);\r\n\r\n const handleExportClick = React.useCallback(async () => {\r\n await onExport();\r\n }, [onExport]);\r\n\r\n const rowsPerPageOptions = sortedUniq(\r\n orderBy([5, 10, 25, 100].concat(initialState?.pageSize ?? [])),\r\n );\r\n const handleSortBy = React.useCallback(\r\n (event: any, column: HeaderGroup) => {\r\n const columnId = column.id;\r\n let sortAction = '';\r\n let newSortBy: SortingRule[] = [];\r\n let sortDescFirst = column.sortDescFirst;\r\n let desc = column.isSortedDesc;\r\n const existingSortBy = sortBy.find(d => d.id === columnId);\r\n const existingIndex = sortBy.findIndex(d => d.id === columnId);\r\n const hasDescDefined = typeof desc !== 'undefined' && desc !== null;\r\n if (existingIndex !== sortBy.length - 1 || sortBy.length !== 1) {\r\n sortAction = 'replace';\r\n } else if (existingSortBy) {\r\n sortAction = 'toggle';\r\n } else {\r\n sortAction = 'replace';\r\n }\r\n if (sortAction === 'replace') {\r\n newSortBy = [\r\n {\r\n id: columnId,\r\n desc: hasDescDefined ? desc : sortDescFirst,\r\n },\r\n ];\r\n } else if (sortAction === 'add') {\r\n newSortBy = [\r\n ...sortBy,\r\n {\r\n id: columnId,\r\n desc: hasDescDefined ? desc : sortDescFirst,\r\n },\r\n ];\r\n } else if (sortAction === 'toggle') {\r\n // This flips (or sets) the\r\n newSortBy = sortBy.map(d => {\r\n if (d.id === columnId) {\r\n return {\r\n ...d,\r\n desc: hasDescDefined ? !desc : !existingSortBy?.desc,\r\n };\r\n }\r\n return d;\r\n });\r\n } else if (sortAction === 'remove') {\r\n newSortBy = sortBy.filter(d => d.id !== columnId);\r\n }\r\n // Object.assign({}, sortBy, newSortBy)\r\n setSortBy(newSortBy);\r\n },\r\n [setSortBy, sortBy],\r\n );\r\n React.useEffect(() => {\r\n if (props.allRowsSelected !== undefined) {\r\n toggleAllRowsSelected?.(props.allRowsSelected);\r\n }\r\n }, [props.allRowsSelected, toggleAllRowsSelected]);\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const s = React.useMemo(() => searchColumns, []);\r\n const customFilters = useMemoFilters({\r\n appliedFilters: props.appliedFilters,\r\n });\r\n\r\n const sortByActual = React.useMemo(() => JSON.stringify(sortBy), [sortBy]);\r\n React.useEffect(() => {\r\n const state = {\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilter,\r\n customFilters: customFilters,\r\n searchColumns: s,\r\n };\r\n\r\n onChangeState(state);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n onChangeState,\r\n globalFilter,\r\n pageIndex,\r\n pageSize,\r\n\r\n sortByActual,\r\n customFilters,\r\n s,\r\n ]);\r\n\r\n //used to add top message as Alert on the page if needs\r\n const [topMessage, setTopMessage] = React.useState<\r\n AlertContentType | undefined\r\n >(undefined);\r\n const setGlobalMessage = React.useCallback(\r\n (message: Notification) => {\r\n dispatch(globalActions.addNotification(message));\r\n },\r\n [dispatch, globalActions],\r\n );\r\n React.useEffect(() => {\r\n if (ServiceGroupsOptional && !!serviceGroups && serviceGroups.length > 0) {\r\n setGlobalMessage({\r\n key: 'NotRelatedServiceGroups',\r\n message: t(translations.ShowNotRelatedServiceGroups_warning) as string,\r\n variant: 'warning',\r\n autoHideDuration: 30000,\r\n closable: true,\r\n });\r\n } else if (!!topAlertMessage) {\r\n setTopMessage(() => {\r\n return topAlertMessage;\r\n });\r\n }\r\n }, [\r\n ServiceGroupsOptional,\r\n serviceGroups,\r\n setGlobalMessage,\r\n t,\r\n topAlertMessage,\r\n ]);\r\n const [isCards, setIsCards] = useState(useCardsByDefault || isMobile);\r\n useEffect(() => {\r\n setIsCards(useCardsByDefault || isMobile);\r\n }, [isMobile, useCardsByDefault]);\r\n useEffect(() => {\r\n if (allowCards) {\r\n onModeChange?.(isCards === true);\r\n }\r\n }, [allowCards, isCards, onModeChange]);\r\n const print = React.useMemo(() => {\r\n return printing !== undefined && printing.printing === true;\r\n }, [printing]);\r\n useEffect(() => {\r\n if (printing !== undefined && print && printing.onLoading !== undefined) {\r\n printing.onLoading(printing.id, loading);\r\n }\r\n }, [loading, print, printing]);\r\n const error = React.useMemo(() => {\r\n return (props.error ?? false) === true;\r\n }, [props.error]);\r\n const baseTableActions: PageActionRenderer2[] = React.useMemo(() => {\r\n const actions: PageActionRenderer2[] = [];\r\n if (screenId && AuthenticatedUser && useConfigurable && !isMobile) {\r\n actions.push(dataCount => (\r\n \r\n ));\r\n }\r\n if (useExport && !isMobile) {\r\n actions.push(dataCount => (\r\n \r\n ));\r\n }\r\n if (\r\n useImportLink &&\r\n !isMobile &&\r\n !compact &&\r\n (importLink || importHandler || importMenuItems)\r\n ) {\r\n actions.push(dataCount => (\r\n {\r\n if (importHandler) {\r\n importHandler();\r\n } else {\r\n if (importLink) {\r\n window.open(toRootedURL(importLink), '_blank');\r\n }\r\n }\r\n }}\r\n />\r\n ));\r\n }\r\n if (allowCards && !isMobile) {\r\n //&& !compact\r\n actions.push(dataCount => (\r\n }\r\n onClick={() => setIsCards(false)}\r\n >\r\n {t(translations.Table)}\r\n \r\n ));\r\n actions.push(dataCount => (\r\n }\r\n onClick={() => setIsCards(true)}\r\n >\r\n {t(translations.Cards)}\r\n \r\n ));\r\n }\r\n return actions;\r\n }, [\r\n AuthenticatedUser,\r\n allowCards,\r\n compact,\r\n exportForImportFilterKey,\r\n getAllFilteredRowsCallback,\r\n handleExportClick,\r\n importHandler,\r\n importLink,\r\n importMenuItems,\r\n isCards,\r\n isMobile,\r\n onDownloadTemplate,\r\n props.onConfigurableColumns,\r\n screenId,\r\n t,\r\n useConfigurable,\r\n useExport,\r\n useExportForImport,\r\n useImportLink,\r\n ]);\r\n const table_id = React.useMemo(\r\n () =>\r\n props.id ??\r\n (screenId === undefined ? undefined : ScreensId[screenId]) ??\r\n 'table',\r\n [props.id, screenId],\r\n );\r\n const tableHead: React.ReactNode = React.useMemo(() => {\r\n let result: React.ReactNode = (\r\n \r\n {\r\n // loop over header groups\r\n headerGroups.map(headerGroup => (\r\n // apply header group props\r\n \r\n {\r\n // loop over headers\r\n headerGroup.headers.map((column, i) => (\r\n // apply header props\r\n // disableSortBy controls the sortability\r\n \r\n !column.disableSortBy &&\r\n column.id !== 'selection' &&\r\n handleSortBy(ev, column)\r\n }\r\n >\r\n \r\n // column.toggleSortBy(\r\n // !column.isSortedDesc,\r\n // undefined,\r\n // )\r\n !column.disableSortBy &&\r\n column.id !== 'selection' &&\r\n handleSortBy(ev, column)\r\n }\r\n // react-table has a unsorted state which is not treated here\r\n direction={column.isSortedDesc ? 'desc' : 'asc'}\r\n >\r\n \r\n {column.render('Header')}\r\n \r\n \r\n \r\n ))\r\n }\r\n \r\n ))\r\n }\r\n \r\n );\r\n return result;\r\n }, [handleSortBy, headerGroups, props.useRowSelect, table_id]);\r\n return (\r\n \r\n \r\n {customProcesing !== undefined && customProcesing.processing === true && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n {withToolBar && (\r\n \r\n {print === false &&\r\n defaultPageActions.length > 0 &&\r\n defaultPageActions.map((item, index) => (\r\n \r\n {item(\r\n dataLength,\r\n props.onRefresh,\r\n props.appliedFilters,\r\n selectedArray,\r\n )}\r\n \r\n ))}\r\n {baseTableActionsOnToolbar &&\r\n baseTableActions.length > 0 &&\r\n baseTableActions.map((item, index) => (\r\n \r\n {item(\r\n dataLength,\r\n props.onRefresh,\r\n props.appliedFilters,\r\n selectedArray,\r\n )}\r\n \r\n ))}\r\n \r\n )}\r\n {print === false ? (\r\n <>\r\n {props.subHeader !== undefined && (\r\n {props.subHeader}\r\n )}\r\n {!isMobile && !compact && topMessage !== undefined && (\r\n
\r\n \r\n
\r\n )}\r\n {props.availableFilters !== undefined && !hideFilters && (\r\n setOpen(false)}\r\n onChange={handleFilterChange}\r\n anchorEl={filtersButtonAnchorEl}\r\n appliedFilters={props.appliedFilters ?? []}\r\n compact={compact}\r\n >\r\n setOpen(false)}\r\n autoOpenAddFilter={true}\r\n showFooter={!isMobile && !compact}\r\n savedListSettings={savedListSettings}\r\n />\r\n \r\n )}\r\n {!error &&\r\n (showGlobalFilter || useExport || screenId) &&\r\n !baseTableActionsOnToolbar && (\r\n <>\r\n \r\n 0,\r\n [classes.tableButtonNoWrap]:\r\n (isSomeSelected &&\r\n selectedRowsActions !== undefined &&\r\n selectedRowsActions.length > 0) === false,\r\n })}\r\n >\r\n {isSomeSelected &&\r\n selectedRowsActions !== undefined &&\r\n selectedRowsActions.length > 0 ? (\r\n \r\n ) : (\r\n <>\r\n {(showGlobalSearchIconOnToolbar === true\r\n ? globalSearchOpen\r\n : showGlobalFilter) && (\r\n \r\n )}\r\n {!compact &&\r\n !hideFilters &&\r\n (props.availableFilters ?? []).length > 0 && (\r\n \r\n )}\r\n \r\n )}\r\n {(isMobile || compact) && (\r\n (\r\n \r\n {item(\r\n dataLength,\r\n props.onRefresh,\r\n props.appliedFilters,\r\n selectedArray,\r\n )}\r\n \r\n ))}\r\n >\r\n )}\r\n \r\n {!isMobile && !compact && (\r\n \r\n {!baseTableActionsOnToolbar &&\r\n baseTableActions.length > 0 &&\r\n baseTableActions.map((item, index) => (\r\n \r\n {item(\r\n dataLength,\r\n props.onRefresh,\r\n props.appliedFilters,\r\n selectedArray,\r\n )}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n {!isMobile &&\r\n !compact &&\r\n (props.appliedFilters ?? []).filter(\r\n f => f.value !== undefined,\r\n ).length > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n {!!customToolbarSettings &&\r\n customToolbarSettings.useCustomToolbar &&\r\n !!customToolbarSettings.CustomToolbar && (\r\n \r\n )}\r\n\r\n {((!!tabSectionSettings && tabSectionSettings.useTabsSection) ||\r\n (props.useRowSelect && isCards)) && (\r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n )}\r\n \r\n {error ? (\r\n \r\n ) : loading ? (\r\n \r\n ) : dataLength === 0 && !loading ? (\r\n \r\n {alwaysShowTableHeader && !isCards && (\r\n
\r\n \r\n {tableHead}\r\n \r\n \r\n
\r\n )}\r\n {!!customEmptyTableSettings ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n ) : (\r\n <>\r\n {/* {loading && (\r\n // \r\n // \r\n // \r\n \r\n )} */}\r\n {/* */}\r\n {!isCards ? (\r\n \r\n \r\n {tableHead}\r\n \r\n {\r\n // Loop over the table rows\r\n rows.map((row, rowIndex) => {\r\n // Prepare the row for display\r\n\r\n prepareRow(row);\r\n return (\r\n \r\n {row.isGrouped &&\r\n row.subRows?.map(subRow => {\r\n prepareRow(subRow);\r\n return (\r\n \r\n );\r\n })}\r\n \r\n
\r\n );\r\n })\r\n }\r\n {summaryRows !== undefined &&\r\n summaryRows.map(summaryRow => {\r\n prepareRow(summaryRow);\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n ) : (\r\n \r\n {rows.map((r, ind) => {\r\n prepareRow(r);\r\n return (\r\n 0\r\n // (!!selectedRowsActions ||\r\n // (!!floatingTabSettings &&\r\n // floatingTabSettings.useFloatingActions ===\r\n // true &&\r\n // !!floatingTabSettings.selectedFloatingActions &&\r\n // floatingTabSettings.selectedFloatingActions\r\n // .length > 0)) &&\r\n // selectedFlatRows.filter(\r\n // isRowSelectable || defaultCheckIfRowIsSelectable,\r\n // ).length > 0\r\n }\r\n viewCheckBox={viewCardsCheck}\r\n useSelect={\r\n !!props.useRowSelect &&\r\n (!!isRowSelectable\r\n ? isRowSelectable(r)\r\n : defaultCheckIfRowIsSelectable(r))\r\n }\r\n primaryAction={props.primaryAction}\r\n row={r}\r\n titleKey={props.titleKey ?? sortBy![0].id}\r\n imageSrcKey={props.imageSrcKey}\r\n hasAdditionalActions={\r\n !!rowActions && rowActions.length > 0\r\n }\r\n hasInlineRowActions={\r\n !!inlineRowActions && inlineRowActions.length > 0\r\n }\r\n active={selectedFlatRows?.some(f => f.id === r.id)}\r\n toggleAllRowsSelected={toggleAllRowsSelected}\r\n isRowSelectable={\r\n isRowSelectable || defaultCheckIfRowIsSelectable\r\n }\r\n cardSize={props.cardSize}\r\n cardPosition={cardPosition}\r\n showTitleCell={showTitleCell}\r\n preventInnerClicks={props.preventInnerClicks}\r\n compact={compact}\r\n contentEditable={\r\n !!isContentEditable\r\n ? isContentEditable(r)\r\n : undefined\r\n }\r\n loading={loading}\r\n />\r\n );\r\n })}\r\n \r\n )}\r\n {print === false && enablePagination && (\r\n \r\n {/* {loading && (\r\n \r\n \r\n \r\n )} */}\r\n : <>{'Rows per Page'}\r\n }\r\n SelectProps={{\r\n label: 'Rows per Page',\r\n inputProps: {\r\n 'aria-label': `${pageSize || 'pagesize'}`,\r\n },\r\n native: true,\r\n MenuProps: {\r\n variant: 'menu',\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n },\r\n getContentAnchorEl: null,\r\n classes: { paper: classes.menuPaper },\r\n },\r\n 'aria-label': `${pageSize || 'pagesize'}`,\r\n }}\r\n onChangePage={handlePageChange}\r\n onChangeRowsPerPage={e =>\r\n handlePageSizeChange(Number(e.target.value))\r\n }\r\n ActionsComponent={TablePaginationActions}\r\n />\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n
\r\n {print === false &&\r\n !!floatingTabSettings &&\r\n floatingTabSettings.useFloatingActions && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Grid, Divider, Card, TableContainer } from '@material-ui/core';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport { TableCardGrid } from '../TableCardGrid';\r\nimport clsx from 'clsx';\r\n\r\n/* \r\nxs (for phones - screens less than 768px wide)\r\nsm (for tablets - screens equal to or greater than 768px wide)\r\nmd (for small laptops - screens equal to or greater than 992px wide)\r\nlg (for laptops and desktops - screens equal to or greater than 1200px wide) \r\n*/\r\n\r\nconst headerHeight = 48;\r\nconst toolbarHeight = 30;\r\nconst searchBarHeight = 30;\r\n//const tableHeaderHeight = 30;\r\n//const tableRowHeight = 30;\r\n//const tableColumnHeight = 438;\r\n//const tableFooterHeight = 30;\r\n\r\nconst numOfHeaderItems = 7;\r\nconst numOfColumns = 7;\r\nconst numOfRows = 11;\r\nconst numberOfCards = 12;\r\n\r\nconst useStyles = makeStyles({\r\n tableContainer: {\r\n boxShadow: '0 3px 5px 2px #D7D7D7',\r\n },\r\n tableHeaderCell: {\r\n position: 'relative',\r\n height: 48,\r\n backgroundColor: '#F5F5F5',\r\n borderRight: '1px solid #D7D7D7',\r\n borderBottom: '1px solid #D7D7D7',\r\n boxShadow: '0 3px 5px 2px #D7D7D7',\r\n color: 'white',\r\n },\r\n tableHeader: {\r\n position: 'absolute',\r\n top: '35%',\r\n left: '20%',\r\n height: 15,\r\n width: '60%',\r\n background: '#D7D7D7',\r\n color: 'white',\r\n },\r\n tableRowContainer: {\r\n height: 48,\r\n color: 'white',\r\n },\r\n tableRowCell: {\r\n position: 'relative',\r\n borderBottom: '1px solid #D7D7D7',\r\n },\r\n tableRow: {\r\n position: 'absolute',\r\n top: '37%',\r\n left: '20%',\r\n height: 15,\r\n width: '60%',\r\n color: 'white',\r\n },\r\n tableFooterContainer: {\r\n //display: 'block',\r\n //position: 'relative',\r\n height: 48,\r\n backgroundColor: 'green',\r\n justifyContent: 'center',\r\n //borderBottom: '1px solid black',\r\n //boxShadow: '0 3px 5px 2px #D7D7D7',\r\n color: 'white',\r\n },\r\n tableFooter: {\r\n //position: 'absolute',\r\n //top: '37%',\r\n //left: '20%',\r\n height: 15,\r\n //width: 'auto',\r\n backgroundColor: 'black', //'#F5F5F5',\r\n boxShadow: '0 3px 5px 2px #D7D7D7',\r\n color: 'white',\r\n },\r\n shadow: {\r\n boxShadow: '0 3px 5px 2px #D7D7D7',\r\n },\r\n});\r\nconst useTableCardsStyle = makeStyles({\r\n card: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'flex-start',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n },\r\n cardVertical: {\r\n maxHeight: 308,\r\n height: 220,\r\n },\r\n cardHorizontal: {\r\n maxHeight: 183,\r\n height: 110,\r\n },\r\n cardSkelet: {\r\n backgroundColor: '#e0e5ec',\r\n },\r\n});\r\nconst RenderTableRowsItems = classes => {\r\n return [...Array(numOfRows).keys()].map(key => (\r\n //Row item\r\n \r\n \r\n \r\n \r\n \r\n ));\r\n};\r\n\r\nconst RenderTableHeaderCells = classes => {\r\n return [...Array(numOfHeaderItems).keys()].map(key => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ));\r\n};\r\n\r\nconst RenderTableRows = classes => {\r\n return [...Array(numOfColumns).keys()].map(key => (\r\n //TableRow\r\n \r\n \r\n \r\n {RenderTableRowsItems(classes)}\r\n \r\n \r\n \r\n ));\r\n};\r\n\r\n/* const RenderFooter = classes => {\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 \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\nexport function TableCardsSkeleton({ isMobile }: { isMobile: boolean }) {\r\n const classes = useTableCardsStyle();\r\n return (\r\n \r\n {[...Array(numberOfCards).keys()].map(key => (\r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n}\r\nexport interface TableRowsSkeletonProps {\r\n id?: string;\r\n isMobile: boolean;\r\n isCards: boolean;\r\n style?: React.CSSProperties;\r\n}\r\nexport function TableRowsSkeleton(props: TableRowsSkeletonProps) {\r\n const { isMobile, isCards, style } = props;\r\n const classes = useStyles();\r\n //RENDER\r\n return (\r\n \r\n {/* Table */}\r\n {/* TableHeaders */}\r\n\r\n {isCards ? (\r\n \r\n ) : (\r\n \r\n \r\n {RenderTableHeaderCells(classes)}\r\n \r\n {/* TableBody */}\r\n \r\n {RenderTableRows(classes)}\r\n \r\n \r\n )}\r\n\r\n {/* TableFooter */}\r\n {/* {RenderFooter(classes)} */}\r\n \r\n );\r\n}\r\n\r\nexport function TableSkeleton(): JSX.Element {\r\n const classes = useStyles();\r\n //RENDER\r\n return (\r\n \r\n {/* Header */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* Toolbar */}\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 {/* Search bar */}\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 {/* Table */}\r\n {/* TableHeaders */}\r\n \r\n \r\n {RenderTableHeaderCells(classes)}\r\n \r\n {/* TableBody */}\r\n \r\n {RenderTableRows(classes)}\r\n \r\n {/* TableFooter */}\r\n {/* \r\n \r\n \r\n \r\n */}\r\n \r\n \r\n );\r\n}\r\n","import { Switch, SwitchProps } from '@material-ui/core';\r\n\r\nexport interface ToggleProps extends SwitchProps {\r\n danger?: boolean;\r\n label?: string;\r\n}\r\n\r\nexport function Toggle(props: ToggleProps) {\r\n const {\r\n color = 'primary',\r\n label,\r\n danger,\r\n size = 'medium',\r\n className,\r\n ...other\r\n } = props;\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { InfoIcon } from '../BasicIcons/InfoIcon';\r\nimport FormControl from '../Forms/FormControls/FormControl';\r\nimport FormControlLabel from '../Forms/FormControls/FormControlLabel';\r\nimport FormHelperText from '../Forms/FormControls/FormHelperText';\r\nimport FormGroup from '../Forms/FormControls/FormGroup';\r\nimport { Toggle, ToggleProps } from '../BasicInputs/Toggle';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { capitalize } from 'lodash';\r\n\r\nexport interface BasicToggleProps\r\n extends Omit {\r\n label?: string;\r\n error?: string;\r\n helperText?: string;\r\n info?: React.ReactNode;\r\n fullWidth?: boolean;\r\n name?: string;\r\n boxed?: boolean;\r\n boldLabel?: boolean;\r\n maxLabelWidth?: string | number;\r\n onChange?: (\r\n value: boolean,\r\n event: React.ChangeEvent,\r\n ) => void;\r\n}\r\n\r\nexport function BasicToggle(props: BasicToggleProps) {\r\n const {\r\n label,\r\n error,\r\n helperText,\r\n info,\r\n name,\r\n onChange,\r\n boxed,\r\n fullWidth,\r\n boldLabel,\r\n maxLabelWidth = 25,\r\n size,\r\n ...other\r\n } = props;\r\n const [isChecked, setIsChecked] = React.useState(\r\n props.checked ?? false,\r\n );\r\n const sizeClass = `toggleSize${capitalize(size ?? 'medium')}`;\r\n const handleChange = (event: React.ChangeEvent) => {\r\n const value = event.target.checked as boolean;\r\n if (onChange !== undefined) {\r\n onChange(value, event);\r\n }\r\n setIsChecked(value);\r\n };\r\n const withInfoLabel = React.useMemo(() => {\r\n return !!label && label.length > maxLabelWidth;\r\n }, [label, maxLabelWidth]);\r\n const Label = withInfoLabel ? (\r\n {label}}>\r\n {label}\r\n \r\n ) : (\r\n {label}\r\n );\r\n const baseLabelStyle: React.CSSProperties = React.useMemo(() => {\r\n return withInfoLabel\r\n ? { maxWidth: `${maxLabelWidth}ch`, gap: 12 }\r\n : { gap: 12 };\r\n }, [maxLabelWidth, withInfoLabel]);\r\n return (\r\n \r\n \r\n \r\n }\r\n />\r\n {info && }\r\n \r\n {((!!error && error !== '') || (!!helperText && helperText !== '')) && (\r\n \r\n {error || helperText}\r\n \r\n )}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * Comments\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { CommentsApi } from 'api/CommentsApi';\r\nimport {\r\n CommentsContainer,\r\n EmailRelated,\r\n} from 'app/components/CommentsContainer';\r\nimport {\r\n IComment,\r\n NewComment,\r\n} from 'app/components/CommentsContainer/IComment';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useAbsolute } from 'utils/url-utils';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useLargeFilesUploadSlice } from '../LargeFilesUpload/slice';\r\n\r\nexport interface CommentsProps\r\n extends Omit {\r\n /**\r\n * Type of the comments, e.g. Invoice, UserTraining, etc.\r\n */\r\n commentType: CommentReferenceTypes;\r\n /**\r\n * Controls permissions related functionality like internal comments available to admins only\r\n */\r\n isAdmin: boolean;\r\n /**\r\n * Entity identifier to attach comments to\r\n */\r\n referenceId: number;\r\n /**\r\n * Optional link that will be shown inside of comments\r\n */\r\n link?: string;\r\n /**\r\n * default initial value for added comment\r\n */\r\n defaultComment?: Partial;\r\n /**\r\n * set to true if user can not add comments\r\n */\r\n cannotComment?: boolean;\r\n\r\n /**\r\n * Event fired after a comment has been added successfully\r\n */\r\n onCommentAdded?: (comment: IComment) => void;\r\n\r\n onEditComment?: (comment: IComment, newComment: NewComment) => void;\r\n onDeleteComment?: (comment: IComment) => void;\r\n noTitle?: boolean;\r\n}\r\n\r\n/**\r\n * Reusable comments component.\r\n * For example:\r\n * \r\n * @param param\r\n * @returns\r\n */\r\nexport const Comments = ({\r\n commentType,\r\n referenceId,\r\n isAdmin,\r\n link,\r\n defaultComment,\r\n cannotComment,\r\n pageName,\r\n emailType,\r\n ...props\r\n}: CommentsProps) => {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const [changed, setChanged] = React.useState(false);\r\n\r\n const comments = useAsyncGetWthEffect(\r\n () => CommentsApi.GetComments(commentType, referenceId),\r\n [],\r\n [changed],\r\n );\r\n\r\n React.useEffect(() => {\r\n dispatch(\r\n largeFileActions.setCommentProperties({\r\n commentType: commentType,\r\n referenceId: referenceId,\r\n }),\r\n );\r\n }, [commentType, dispatch, largeFileActions, referenceId]);\r\n\r\n // const classes = useStyles();\r\n\r\n return (\r\n {\r\n CommentsApi.SendComment(commentType, referenceId, c)\r\n .then(res => props.onCommentAdded?.(res))\r\n .finally(() => setChanged(prev => !prev));\r\n }}\r\n isAdmin={isAdmin}\r\n withMentions\r\n pageName={pageName ?? t(translations.Invoice)}\r\n referenceName={referenceId.toString()}\r\n linkUrl={useAbsolute(link)}\r\n emailType={emailType ?? 'Invoice'}\r\n defaultComment={defaultComment}\r\n cannotComment={cannotComment}\r\n {...props}\r\n />\r\n );\r\n};\r\n// \r\n// \r\n// const useStyles = makeStyles((theme: Theme) => ({\r\n// base: {\r\n// paddingInline: theme.spacing(2),\r\n// },\r\n// }));\r\n","import { useCalendarLink } from 'app/pages/CalendarPage/GetCalendarPagePath';\r\nimport { ViewTypes } from 'app/pages/CalendarPage/Scheduler/slice/types';\r\nimport { Button, ButtonProps } from '../BasicButtons/Button';\r\n\r\nexport interface CalendarButtonProps extends Omit {\r\n equipments?: Array;\r\n start?: string | Date;\r\n openToBook?: boolean;\r\n viewType?: ViewTypes;\r\n defaultMulti?: boolean;\r\n target?: string;\r\n}\r\n\r\nexport function CalendarButton({\r\n equipments,\r\n start,\r\n openToBook,\r\n viewType = 'calendar',\r\n defaultMulti,\r\n target,\r\n ...props\r\n}: CalendarButtonProps) {\r\n const link = useCalendarLink({\r\n equipments,\r\n openToBook,\r\n start,\r\n viewType,\r\n defaultMulti,\r\n });\r\n return \r\n \r\n ) : (\r\n \r\n }\r\n onClick={() => openDetailsList()}\r\n >\r\n {t(translations.AddSavedView)}\r\n \r\n \r\n )}\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {\r\n removeSelected();\r\n }}\r\n aria-label=\"Remove\"\r\n >\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport const SavedListsDropDown = React.memo(\r\n SavedLists,\r\n (prevProps, nextProps) => {\r\n const x = props =>\r\n JSON.stringify({\r\n value: props.serviceItem?.value,\r\n });\r\n var result = x(prevProps) === x(nextProps);\r\n\r\n return result;\r\n },\r\n) as typeof SavedLists;\r\n","/**\r\n *\r\n * EnumPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { Entity } from 'types/common';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { GetOptionsFilterFunction } from 'utils/enumKeys';\r\n\r\nexport interface EnumPickerProps\r\n extends Omit<\r\n BaseOptionsPickerProps>,\r\n 'getOptions' | 'value' | 'onChange'\r\n > {\r\n EnumNamesArray: Array;\r\n value: TKey | null;\r\n onChange: (value: TKey | null) => void;\r\n nameRender?: (value: TKey) => string;\r\n}\r\n\r\nexport function EnumPicker({\r\n value,\r\n onChange,\r\n nameRender,\r\n ...props\r\n}: EnumPickerProps) {\r\n const { t } = useTranslation();\r\n const options = React.useMemo(\r\n () =>\r\n props.EnumNamesArray.map(key => ({\r\n Id: key,\r\n Name: !!nameRender ? nameRender(key) : t(key) ?? key,\r\n })),\r\n [nameRender, props.EnumNamesArray, t],\r\n );\r\n\r\n const getOptions = React.useMemo(() => GetOptionsFilterFunction(options), [\r\n options,\r\n ]);\r\n const selectedOption = React.useMemo(\r\n () => options.find(f => f.Id === value) ?? null,\r\n [options, value],\r\n );\r\n const handleChange = (value: Entity | null) => {\r\n onChange?.(value?.Id ?? null);\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\n/**\r\n * Provides a picker with the predefined options based on the array of the enum names\r\n * @param array Array of the Union type enum names\r\n * @returns\r\n */\r\nexport function withEnumOptions(array: Array) {\r\n return (Component: React.ComponentType>) => {\r\n return (props: Omit, 'EnumNamesArray'>) => (\r\n \r\n );\r\n };\r\n}\r\n","import { Entity } from './common';\r\nimport { CustomDate } from './CustomDate';\r\n\r\nexport interface IConnectedFiltersDto {\r\n StartTime: Date | string;\r\n EndTime?: Date | string;\r\n User?: Entity | null;\r\n UserGroup?: Entity | null;\r\n Budget?: Entity | null;\r\n BudgetExperiment?: Entity | null;\r\n InstituteProject?: Entity | null;\r\n FundingType?: Entity | null;\r\n ExternalCustomer?: Entity | null;\r\n PurchaseOrder?: string | null;\r\n Reference?: string | null;\r\n}\r\nexport const ConnectedFiltersInit = (\r\n StartTime?: Date | string,\r\n EndTime?: Date | string,\r\n User?: Entity | null,\r\n UserGroup?: Entity | null,\r\n Budget?: Entity | null,\r\n BudgetExperiment?: Entity | null,\r\n InstituteProject?: Entity | null,\r\n FundingType?: Entity | null,\r\n ExternalCustomer?: Entity | null,\r\n PurchaseOrder?: string | null,\r\n Reference?: string | null,\r\n): IConnectedFiltersDto => {\r\n return {\r\n StartTime: StartTime || new CustomDate(new Date()).toISOString(),\r\n EndTime: EndTime,\r\n User: User,\r\n UserGroup: UserGroup,\r\n Budget: Budget,\r\n BudgetExperiment: BudgetExperiment,\r\n InstituteProject: InstituteProject,\r\n ExternalCustomer: ExternalCustomer,\r\n FundingType: FundingType,\r\n PurchaseOrder: PurchaseOrder,\r\n Reference: Reference,\r\n };\r\n};\r\n","/**\r\n *\r\n * NumberFieldFilter\r\n *\r\n */\r\nimport { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const NumberFieldFilter = (props: IFilterComponentProps) => {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [value, setValue] = React.useState(null);\r\n const handleChange: React.ChangeEventHandler<\r\n HTMLInputElement | HTMLTextAreaElement\r\n > = event => {\r\n setValue(+event.target.value);\r\n props.onChange(+event.target.value);\r\n };\r\n\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default NumberFieldFilter;\r\n","/**\r\n *\r\n * BuildingPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IBuildingDto } from 'api/odata/generated/entities/IBuildingDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectIsAuthenticated,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\n\r\nexport type BuildingsUrl = 'base' | 'assetBase' | 'public' | 'locations';\r\nexport interface BuildingPickerProps\r\n extends Omit, 'loadData'> {\r\n urlType?: BuildingsUrl;\r\n withoutServiceGroups?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/Buildings';\r\nconst assetBuildingUrl = '/api/odata/v4/Buildings/BuildingsFilter';\r\nconst publicBuildingUrl = '/api/odata/v4/Buildings/PublicBuildingsFilter';\r\nconst LocationsUrl = '/api/odata/v4/Locations';\r\nexport const initBuildingData = (\r\n initval: string | undefined,\r\n sourceUrl?: BuildingsUrl,\r\n withoutServiceGroups?: boolean,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IBuildingDto[]);\r\n });\r\n } else {\r\n if (sourceUrl === 'locations') {\r\n withoutServiceGroups = true;\r\n }\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select:\r\n withoutServiceGroups === undefined || withoutServiceGroups === false\r\n ? 'Id,Name,ServiceGroups'\r\n : 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n sourceUrl === 'public'\r\n ? publicBuildingUrl\r\n : sourceUrl === 'assetBase'\r\n ? assetBuildingUrl\r\n : sourceUrl === 'locations'\r\n ? LocationsUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as IBuildingDto[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n isAuthenticated?: boolean,\r\n urlType?: BuildingsUrl,\r\n withoutServiceGroups?: boolean,\r\n) => {\r\n if (urlType === 'locations') {\r\n withoutServiceGroups = true;\r\n }\r\n const sourceUrl =\r\n urlType === 'public' || !isAuthenticated\r\n ? publicBuildingUrl\r\n : urlType === 'assetBase'\r\n ? assetBuildingUrl\r\n : urlType === 'locations'\r\n ? LocationsUrl\r\n : url;\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select:\r\n withoutServiceGroups === undefined || withoutServiceGroups === false\r\n ? ['Id', 'Name', 'ServiceGroups']\r\n : ['Id', 'Name'],\r\n globalServiceGroupFilter:\r\n (withoutServiceGroups === undefined || withoutServiceGroups === false) &&\r\n !!globalServiceGroupFilter &&\r\n globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n 'Id',\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\n\r\nexport function BuildingPicker(props: BuildingPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n isAuth ? globalServiceGroupFilter || [] : [],\r\n isAuth,\r\n props.urlType,\r\n props.withoutServiceGroups,\r\n );\r\n return (\r\n \r\n );\r\n}\r\nexport const BuildingByServiceGroupFilter = (\r\n value: FilterValueType,\r\n fieldName: any,\r\n) => {\r\n if (value !== undefined && value !== null) {\r\n if (fieldName === 'ServiceGroupId') {\r\n return [\r\n `${new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n [(value as Identifiable).Id],\r\n 'Id',\r\n ).toString()}`,\r\n ];\r\n }\r\n }\r\n return [];\r\n};\r\n","/**\r\n *\r\n * CampusPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ICampusDto } from 'api/odata/generated/entities/ICampusDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectIsAuthenticated,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\n\r\nexport type CampusUrl = 'base' | 'assetBase' | 'public';\r\nexport interface CampusPickerProps\r\n extends Omit, 'loadData'> {\r\n urlType?: CampusUrl;\r\n withoutServiceGroups?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/Campuses';\r\nconst assetCampusUrl = '/api/odata/v4/Campuses/CampusAssetFilter';\r\nconst publicCampusUrl = '/api/odata/v4/Campuses/PublicCampusAssetFilter';\r\nexport const initCampusData = (\r\n initval: string | undefined,\r\n sourceUrl?: CampusUrl,\r\n withoutServiceGroups?: boolean,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as ICampusDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select:\r\n withoutServiceGroups === undefined || withoutServiceGroups === false\r\n ? 'Id,Name,ServiceGroups'\r\n : 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n sourceUrl === 'public'\r\n ? publicCampusUrl\r\n : sourceUrl === 'assetBase'\r\n ? assetCampusUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as ICampusDto[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n isAuthenticated?: boolean,\r\n urlType?: CampusUrl,\r\n withoutServiceGroups?: boolean,\r\n) => {\r\n const sourceUrl =\r\n urlType === 'public' || !isAuthenticated\r\n ? publicCampusUrl\r\n : urlType === 'assetBase'\r\n ? assetCampusUrl\r\n : url;\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select:\r\n withoutServiceGroups === undefined || withoutServiceGroups === false\r\n ? ['Id', 'Name', 'ServiceGroups']\r\n : ['Id', 'Name'],\r\n globalServiceGroupFilter:\r\n (withoutServiceGroups === undefined || withoutServiceGroups === false) &&\r\n !!globalServiceGroupFilter &&\r\n globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\n\r\nexport function CampusPicker(props: CampusPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n isAuth ? globalServiceGroupFilter || [] : [],\r\n isAuth,\r\n props.urlType,\r\n props.withoutServiceGroups,\r\n );\r\n return (\r\n \r\n );\r\n}\r\nexport const CampusByServiceGroupFilter = (\r\n value: FilterValueType,\r\n fieldName: any,\r\n) => {\r\n if (value !== undefined && value !== null) {\r\n if (fieldName === 'ServiceGroupId') {\r\n return [\r\n `${new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.In,\r\n (value as Identifiable).Id,\r\n ).toString()}`,\r\n ];\r\n }\r\n }\r\n return [];\r\n};\r\n","/**\r\n *\r\n * RoomPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IRoomDto } from 'api/odata/generated/entities/IRoomDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectIsAuthenticated,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\n\r\nexport type RoomsUrl = 'base' | 'assetBase' | 'public' | 'locations';\r\nexport interface RoomPickerProps\r\n extends Omit, 'loadData'> {\r\n urlType?: RoomsUrl;\r\n selectArray?: Array;\r\n withoutServiceGroups?: boolean;\r\n}\r\nexport const convertRoomWithBuildingName = (\r\n Name: string,\r\n BuildingName: string,\r\n): string => {\r\n let name = BuildingName !== '' ? `${Name} - ${BuildingName}` : Name;\r\n return name;\r\n};\r\nexport const modifyRoomName = (room: IRoomDto | null): IRoomDto | null => {\r\n if (room !== null && room !== undefined) {\r\n return Object.assign(\r\n {},\r\n {\r\n Name: convertRoomWithBuildingName(room.Name, room.BuildingName ?? ''),\r\n },\r\n room,\r\n );\r\n }\r\n return null;\r\n};\r\nconst url = '/api/odata/v4/Rooms/GetRoomsFilter';\r\nconst publicUrl = '/api/odata/v4/Rooms/GetPublicAssetsRoomsFilter';\r\nconst assetRoomUrl = '/api/odata/v4/Rooms/GetAssetsRoomsFilter';\r\nconst LocationsUrl = '/api/odata/v4/LocationsBuilding';\r\nexport const initRoomData = (\r\n initval: string | undefined,\r\n sourceUrl?: RoomsUrl,\r\n withoutServiceGroups?: boolean,\r\n selectArray?: Array,\r\n): Promise => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IRoomDto[]);\r\n });\r\n } else {\r\n if (sourceUrl === 'locations') {\r\n withoutServiceGroups = true;\r\n }\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: !!selectArray\r\n ? selectArray.join(',')\r\n : (withoutServiceGroups === undefined ||\r\n withoutServiceGroups === false) &&\r\n !!sourceUrl &&\r\n sourceUrl !== 'base'\r\n ? 'Id,Name,BuildingId,BuildingName,ServiceGroupsIds'\r\n : 'Id,Name,BuildingId,BuildingName',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n sourceUrl === 'public'\r\n ? publicUrl\r\n : sourceUrl === 'assetBase'\r\n ? assetRoomUrl\r\n : sourceUrl === 'locations'\r\n ? LocationsUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as IRoomDto[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n isAuthenticated?: boolean,\r\n urlType?: RoomsUrl,\r\n withoutServiceGroups?: boolean,\r\n selectArray?: Array,\r\n) => {\r\n if (urlType === 'locations') {\r\n withoutServiceGroups = true;\r\n }\r\n const sourceUrl =\r\n urlType === 'public' || !isAuthenticated\r\n ? publicUrl\r\n : urlType === 'assetBase'\r\n ? assetRoomUrl\r\n : urlType === 'locations'\r\n ? LocationsUrl\r\n : url;\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select:\r\n selectArray ??\r\n ((withoutServiceGroups === undefined || withoutServiceGroups === false) &&\r\n !!urlType &&\r\n urlType !== 'base'\r\n ? ['Id', 'Name', 'BuildingId', 'BuildingName', 'ServiceGroupsIds']\r\n : ['Id', 'Name', 'BuildingId', 'BuildingName']),\r\n maxTop: 100,\r\n globalServiceGroupFilter:\r\n (withoutServiceGroups === undefined || withoutServiceGroups === false) &&\r\n !!globalServiceGroupFilter &&\r\n globalServiceGroupFilter.length > 0 &&\r\n !!urlType &&\r\n urlType !== 'base'\r\n ? [\r\n new Condition(\r\n 'ServiceGroupsIds',\r\n ODataOperators.HasNoAny,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n new Condition(\r\n 'ServiceGroupsIds',\r\n ODataOperators.AnyIn,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n isOptionalServiceGroup: true,\r\n });\r\n};\r\n\r\nexport function RoomPicker(props: RoomPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n isAuth ? globalServiceGroupFilter || [] : [],\r\n isAuth,\r\n props.urlType,\r\n props.withoutServiceGroups,\r\n props.selectArray,\r\n );\r\n return (\r\n \r\n );\r\n}\r\nexport const RoomByBuildingFilter = (\r\n value: FilterValueType,\r\n fieldName: any,\r\n) => {\r\n if (value !== undefined && value !== null) {\r\n if (fieldName === 'BuildingId') {\r\n return [\r\n `${new Condition(\r\n 'BuildingId',\r\n ODataOperators.Equals,\r\n (value as Identifiable).Id,\r\n ).toString()}`,\r\n ];\r\n }\r\n if (fieldName === 'ServiceGroupId') {\r\n return [\r\n `${new Condition(\r\n 'ServiceGroupsIds',\r\n ODataOperators.AnyIn,\r\n (value as Identifiable).Id,\r\n ).toString()}`,\r\n ];\r\n }\r\n }\r\n return [];\r\n};\r\n","import { ToolbarProps as MuiToolbarProps } from '@material-ui/core';\r\nimport React from 'react';\r\nimport { Body, H1 } from 'app/components/Typography';\r\nimport { FormSectionTitle } from 'app/components/Forms/FormsLayout/FormSectionTitle';\r\n\r\nexport interface TableToolbarHeaderProps\r\n extends Pick {\r\n isMobile: boolean;\r\n compact?: boolean;\r\n screenName: React.ReactNode;\r\n customScreenName?: React.ReactNode;\r\n /**\r\n * Controls the size of the table title. Defaults to H1 for list pages.\r\n */\r\n screenNameVariant?: 'H1' | 'section';\r\n}\r\n/**\r\n * Renders responsive page/table header.\r\n * Nothing fancy, just wraps the header content in different components for desktop/mobile. Using responsive styling might have been more appropriate here\r\n * @param props\r\n * @returns\r\n */\r\nexport function TableToolbarHeader({\r\n compact,\r\n isMobile,\r\n screenName,\r\n customScreenName,\r\n screenNameVariant,\r\n variant,\r\n}: React.PropsWithChildren) {\r\n if (compact || isMobile) {\r\n return {screenName};\r\n } else if (!!customScreenName) {\r\n return {customScreenName};\r\n } else if (screenNameVariant === 'section') {\r\n return ;\r\n } else {\r\n return

{screenName}

;\r\n }\r\n}\r\n","import { ToolbarProps as MuiToolbarProps, useTheme } from '@material-ui/core';\r\nimport React from 'react';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport { AlertContentType, BasicAlert } from 'app/components/BasicAlert';\r\nimport useExpandedSideBarState from 'app/hooks/useExpandedSideBarState';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport clsx from 'clsx';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ICanRaiseBasicTableRefreshEvent } from '../../ControlledTable/ControlledTableProps';\r\nimport { RefreshIcon } from './RefreshIcon';\r\nimport {\r\n TableToolbarHeader,\r\n TableToolbarHeaderProps,\r\n} from './TableToolbarHeader';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { StyledToolbar } from './styled';\r\n\r\nexport interface TableToolbarProps\r\n extends React.PropsWithChildren,\r\n Omit,\r\n ICanRaiseBasicTableRefreshEvent {\r\n alertContent?: AlertContentType;\r\n showAlert?: boolean;\r\n titleIcon?: React.ReactNode;\r\n showMenu?: boolean;\r\n loading?: boolean;\r\n compact?: boolean;\r\n /**\r\n * Make a title section render content as flex column (in case when need to show additional description under Title)\r\n */\r\n titleAsColumn?: boolean;\r\n customExpandMenu?: () => void;\r\n showGlobalSearchIcon?: boolean;\r\n toggleGlobalFilter?: () => void;\r\n}\r\n\r\nexport const TableToolbar = React.memo(function TableToolbar({\r\n screenName,\r\n screenNameVariant = 'H1',\r\n alertContent,\r\n showAlert,\r\n titleIcon,\r\n showMenu = true,\r\n variant = 'regular',\r\n onRefresh,\r\n compact,\r\n customExpandMenu,\r\n customScreenName,\r\n showGlobalSearchIcon,\r\n toggleGlobalFilter,\r\n titleAsColumn,\r\n ...props\r\n}: TableToolbarProps) {\r\n const { t } = useTranslation();\r\n const { checkIsMobile } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const { toggle } = useExpandedSideBarState();\r\n\r\n const handleSidebarOpen = () => {\r\n if (!!customExpandMenu) {\r\n customExpandMenu();\r\n } else {\r\n toggle();\r\n }\r\n };\r\n const handleRefresh = () => {\r\n const event = { reloadConfigurableColumns: true };\r\n onRefresh?.(event);\r\n };\r\n const theme = useTheme();\r\n return (\r\n \r\n {isMobile && showMenu && (\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n\r\n {onRefresh !== undefined && (\r\n \r\n )}\r\n
\r\n
{titleIcon}
\r\n \r\n {!isMobile && !compact && showAlert === true && alertContent && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n
\r\n {\r\n \r\n {showGlobalSearchIcon && (\r\n !!toggleGlobalFilter && toggleGlobalFilter()}\r\n >\r\n \r\n \r\n )}\r\n {props.children}\r\n \r\n }\r\n
\r\n \r\n );\r\n});\r\n","import styled from 'styled-components/macro';\r\n\r\nexport const FlexRowDiv = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n`;\r\n","/**\r\n *\r\n * AssetPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\nimport { avTypes, getAvFilter } from '../../MultiSelectPickers/AssetsPicker';\r\n\r\nexport interface AssetPickerProps\r\n extends Omit, 'loadData'> {\r\n restrictByAvType?: avTypes;\r\n /**\r\n * Option to filter admin permissions. If set to true will return only the assets authenticated user is an admin of\r\n */\r\n admin?: boolean;\r\n /**\r\n * Fetches only Active assets/instruments if this property is set to true\r\n */\r\n showOnlyActiveAssets?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/AssetNames';\r\nexport const initAssetData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n admin?: boolean,\r\n) => {\r\n const url =\r\n admin === true\r\n ? '/api/odata/v4/AssetNames/AdminAssets'\r\n : '/api/odata/v4/AssetNames';\r\n return getAutoCompleteLoadDataFn({\r\n url: url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'AssetCatId',\r\n 'Availability',\r\n // BookableAsset is not mapped (AssetNamesController)\r\n // 'BookableAsset',\r\n 'Image',\r\n 'ServiceGroupId',\r\n 'ServiceId',\r\n 'ServiceTypeId',\r\n 'ServiceGroupName',\r\n 'ServiceGroupAssetId',\r\n ],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\n\r\nexport function AssetPicker({\r\n predicates,\r\n restrictByAvType,\r\n showOnlyActiveAssets,\r\n admin,\r\n ...props\r\n}: AssetPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n let avFilter =\r\n restrictByAvType === undefined ? undefined : getAvFilter(restrictByAvType);\r\n\r\n let filters =\r\n avFilter !== undefined\r\n ? predicates !== undefined\r\n ? [...predicates, avFilter]\r\n : [avFilter]\r\n : predicates;\r\n if (showOnlyActiveAssets === true) {\r\n filters?.push(\r\n new Condition('Active', ODataOperators.Equals, true),\r\n );\r\n }\r\n const innerLoadData = loadData(\r\n filters,\r\n globalServiceGroupFilter || [],\r\n admin,\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport {\r\n UseSortByState,\r\n UsePaginationState,\r\n SortingRule,\r\n TableState,\r\n} from 'react-table';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { CancelToken } from 'axios';\r\nimport { BasicTableProps } from 'app/components/BasicTable/BasicTableProps';\r\nimport { IRow } from 'app/components/BasicTable/IRow';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport {\r\n getExportParameters,\r\n buildURL,\r\n openExportLink,\r\n IPathAndQuery,\r\n} from 'utils/url-utils';\r\nimport { Entity } from 'types/common';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n//import { Progress } from '../LoadingIndicator';\r\nimport { buildParams } from 'api/odata/ODataParamsBuilder';\r\nimport { ControlledTable } from 'app/components/BasicTable/ControlledTable';\r\nimport { useMemoFilters } from 'app/components/BasicTable/useMemoFilters';\r\nimport { selectDoRefreshTable } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { BasicTableRefreshEventHandler } from '../ControlledTable/ControlledTableProps';\r\nexport type { IRow };\r\nexport type { BasicTableProps };\r\n\r\ntype IPartialTableState = Partial<\r\n UseSortByState & UsePaginationState\r\n>;\r\n\r\nconst REQUEST_CANCELLED_MESSAGE = 'Request cancelled (race condition)';\r\n/**\r\n * Interface to the (initial) table state\r\n */\r\nexport interface IBasicTableState\r\n extends IPartialTableState {}\r\n\r\nconst defaultRowIdAccessor = (row: TRow): string =>\r\n row.Id?.toString();\r\n/**\r\n * Server side driven Table component that will be reused in most of the pages\r\n * @param param0\r\n * @returns\r\n */\r\nexport function UnconfigurableTable({\r\n columns,\r\n initialState,\r\n api,\r\n additionalColumns,\r\n getRowId = defaultRowIdAccessor,\r\n searchColumns,\r\n useExport = true,\r\n onExportForImport,\r\n rowActions,\r\n pageActions,\r\n screenName,\r\n selectedRowsActions,\r\n filterOpen = false,\r\n serviceGroups,\r\n customParams,\r\n useImportLink,\r\n importLink,\r\n needRefresh,\r\n ServiceGroupsOptional,\r\n topAlertMessage,\r\n printing,\r\n ...props\r\n}: Omit, 'screenId'>) {\r\n const isMobile = DetectIsMobile();\r\n // loading/processing indication\r\n const [loading, setLoading] = React.useState(false);\r\n // data received from the server and displayd on the table\r\n const [data, setData] = React.useState([]);\r\n // reference to the show/hide filters button\r\n // data length - total number of the records\r\n const [dataLength, setDataLength] = React.useState(0);\r\n // page count derrived from total number of the records\r\n // this is passed to the react-table hook\r\n const [controlledPageCount, setControlledPageCount] = React.useState(0);\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const dispatch = useDispatch();\r\n const doRefresh = useSelector(selectDoRefreshTable);\r\n\r\n const [tableState, setTableState] = React.useState>>(\r\n {\r\n pageIndex: initialState?.pageIndex ?? 0,\r\n pageSize:\r\n printing !== undefined && printing.printing === true\r\n ? 10000\r\n : initialState?.pageSize ?? 10,\r\n\r\n sortBy: initialState?.sortBy,\r\n },\r\n );\r\n const handleChangeState = React.useCallback(state => {\r\n setTableState(state);\r\n }, []);\r\n\r\n const configurableColumns = React.useMemo(() => columns, [columns]);\r\n\r\n const columnAccessors = React.useMemo(\r\n () =>\r\n configurableColumns\r\n ?.filter(c => typeof c.accessor === 'string')\r\n ?.filter(c => c.accessor !== undefined)\r\n ?.map(c => c.accessor as keyof TRow),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [configurableColumns],\r\n );\r\n\r\n // memo cleaned up filters without the Name which is loaded independently of the filter value and only affects appearance of the filter\r\n const customFilter = useMemoFilters({ appliedFilters: props.appliedFilters });\r\n // serialize the applied filters to be compatible with shallow comparison of the useEffect readonly array\r\n const serializedCustomFilter = JSON.stringify(customFilter);\r\n const handleFilterChange = React.useCallback(\r\n items => {\r\n if (props.onFilterChange !== undefined) {\r\n props.onFilterChange(items);\r\n }\r\n },\r\n [props],\r\n );\r\n\r\n /**\r\n * Fetch data method that retrieves the data according to the current table state\r\n */\r\n const fetchData = React.useCallback(\r\n async (\r\n state: {\r\n api: string | IPathAndQuery;\r\n pageSize: number;\r\n pageIndex: number;\r\n sortBy?: SortingRule[] | null;\r\n globalFilterValue?: string;\r\n customFilter: IFilterSettings[];\r\n serviceGroups?: Entity[];\r\n isOptionalServiceGroup: boolean;\r\n columns: Array;\r\n },\r\n cancelToken: CancelToken,\r\n ) => {\r\n setLoading(true);\r\n try {\r\n // todo: add support for object notation accessors like 'foo.bar'\r\n // todo: add support for accessor of type Function(originalRow, rowIndex) => any\r\n const oDataParams = buildParams(\r\n {\r\n ...state,\r\n select: state.columns,\r\n additionalColumns: additionalColumns,\r\n serviceGroups: state.serviceGroups ?? [],\r\n },\r\n searchColumns,\r\n customParams,\r\n );\r\n var { url, params } = getUrlAndParams(state.api, oDataParams);\r\n const response = await httpClient.get(url, params, cancelToken);\r\n\r\n setData(response.value);\r\n setDataLength(response['@odata.count']);\r\n setControlledPageCount(\r\n Math.ceil(response['@odata.count'] / state.pageSize),\r\n );\r\n setLoading(false);\r\n } catch (error) {\r\n // todo: show error message\r\n\r\n if (\r\n error instanceof Error &&\r\n error.message === REQUEST_CANCELLED_MESSAGE\r\n ) {\r\n // noop - request was explicitly cancelled after a new one was issues to prevent race conditions between multiple requests\r\n } else {\r\n console.warn(error);\r\n }\r\n }\r\n // finally {\r\n // setLoading(false);\r\n // }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n\r\n const pageIndex = tableState.pageIndex!;\r\n const pageSize = tableState.pageSize!;\r\n const sortBy = tableState.sortBy!;\r\n const globalFilter = tableState.globalFilter;\r\n\r\n // connect table state changes to server data fetch side effect\r\n React.useEffect(() => {\r\n const cancelTokenSource = httpClient.cancelToken.source();\r\n if (columnAccessors === undefined) {\r\n return;\r\n }\r\n fetchData(\r\n {\r\n api,\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilterValue: globalFilter as string,\r\n customFilter: customFilter ?? [],\r\n serviceGroups: serviceGroups,\r\n isOptionalServiceGroup: ServiceGroupsOptional || false,\r\n columns: columnAccessors,\r\n },\r\n cancelTokenSource.token,\r\n );\r\n return () => {\r\n cancelTokenSource.cancel(REQUEST_CANCELLED_MESSAGE);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n fetchData,\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilter,\r\n serializedCustomFilter,\r\n serviceGroups,\r\n ServiceGroupsOptional,\r\n columnAccessors,\r\n api,\r\n ]);\r\n\r\n const handleExportClick = (): Promise => {\r\n const { $top, $skip, ...tableParams } = buildParams({\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilterValue: globalFilter as string,\r\n customFilter: customFilter ?? [],\r\n select: columnAccessors,\r\n additionalColumns: additionalColumns,\r\n serviceGroups: serviceGroups ?? [],\r\n isOptionalServiceGroup: ServiceGroupsOptional || false,\r\n });\r\n var oDataParams = getExportParameters(tableParams);\r\n var { url, params } = getUrlAndParams(api, oDataParams);\r\n const exporturl = buildURL(url, params);\r\n return openExportLink(exporturl);\r\n };\r\n\r\n const [allRowsSelected, setAllRowsSelected] = React.useState();\r\n const toggleAllRowsSelected = React.useCallback((value: boolean) => {\r\n setAllRowsSelected(value);\r\n }, []);\r\n\r\n /**\r\n * Reloads the table and unselects all rows\r\n */\r\n const handleRefresh: BasicTableRefreshEventHandler = React.useCallback(\r\n event => {\r\n if (columnAccessors === undefined) {\r\n return;\r\n }\r\n if (toggleAllRowsSelected !== undefined) {\r\n toggleAllRowsSelected(false);\r\n }\r\n fetchData(\r\n {\r\n api,\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilterValue: globalFilter as string,\r\n customFilter: customFilter ?? [],\r\n serviceGroups: serviceGroups,\r\n isOptionalServiceGroup: ServiceGroupsOptional || false,\r\n columns: columnAccessors,\r\n },\r\n httpClient.cancelToken.source().token,\r\n );\r\n },\r\n [\r\n columnAccessors,\r\n toggleAllRowsSelected,\r\n fetchData,\r\n api,\r\n pageIndex,\r\n pageSize,\r\n sortBy,\r\n globalFilter,\r\n customFilter,\r\n serviceGroups,\r\n ServiceGroupsOptional,\r\n ],\r\n );\r\n\r\n const refreshFromState = React.useCallback(() => {\r\n dispatch(layoutActions.setRefreshTable(false));\r\n handleRefresh();\r\n }, [dispatch, layoutActions, handleRefresh]);\r\n\r\n React.useEffect(() => {\r\n if (needRefresh !== undefined && needRefresh) {\r\n handleRefresh();\r\n }\r\n if (doRefresh === true) {\r\n refreshFromState();\r\n }\r\n }, [doRefresh, needRefresh, handleRefresh, refreshFromState]);\r\n const handleSelectedRowsChange = React.useCallback(\r\n (rows: TRow[]) => {\r\n if (props.onSelectedRowsChange !== undefined) {\r\n props.onSelectedRowsChange(rows);\r\n }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [props.onSelectedRowsChange],\r\n );\r\n return (\r\n \r\n );\r\n}\r\nfunction getUrlAndParams(\r\n api: string | IPathAndQuery,\r\n oDataParams: {\r\n $skip?: number;\r\n $top?: number;\r\n $count?: boolean;\r\n $select?: string;\r\n $orderby?: string | undefined;\r\n $filter?: string | undefined;\r\n $format?: string;\r\n },\r\n) {\r\n var url = typeof api === 'string' ? api : (api as IPathAndQuery).path;\r\n var search = (api as IPathAndQuery).search;\r\n const params = { ...oDataParams, ...search };\r\n return { url, params };\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { put, select, takeLatest } from 'redux-saga/effects';\r\nimport { PrintPDFItem } from './types';\r\nimport { printPDFActions as actions } from '.';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { selectPrintPDFSections } from './selectors';\r\n\r\nfunction* doUpdateSections(action: PayloadAction) {}\r\nfunction* doSaveSections(action: PayloadAction) {\r\n const sections: PrintPDFItem[] = yield select(selectPrintPDFSections);\r\n const value = sections.filter(s => s.checked === true).map(f => f.id);\r\n const user = yield select(selectAuthenticatedUser);\r\n yield put(\r\n appSettingsActions.updateUserProfileSettings({\r\n key: '/RequestSamples.pdf',\r\n model: {\r\n UserName: user.Id,\r\n Key: '/RequestSamples.pdf',\r\n Value: value.join(','),\r\n Id: 0,\r\n AdGroup: null,\r\n DefaultGroups: null,\r\n Enabled: true,\r\n IsMultiple: null,\r\n Name: null,\r\n Selected: false,\r\n StaffEnabled: false,\r\n },\r\n }),\r\n );\r\n}\r\nexport function* printPDFSaga() {\r\n yield takeLatest(actions.updateSections.type, doUpdateSections);\r\n yield takeLatest(actions.saveSections.type, doSaveSections);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { printPDFSaga } from './saga';\r\nimport { PrintPDFItem, PrintPDFState } from './types';\r\nimport { ServiceRequestSectionTypes } from '../ServiceRequestSectionTypes';\r\n\r\nexport const initialState: PrintPDFState = {\r\n printing: false,\r\n isLoading: false,\r\n useSections: false,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'printPDF',\r\n initialState,\r\n reducers: {\r\n setPrinting(state, action: PayloadAction) {\r\n state.printing = action.payload;\r\n },\r\n setUseSections(state, action: PayloadAction) {\r\n state.useSections = action.payload;\r\n },\r\n updateSections(state, action: PayloadAction) {\r\n state.Sections = action.payload;\r\n },\r\n updateSection(\r\n state,\r\n action: PayloadAction<{\r\n id: ServiceRequestSectionTypes;\r\n checked: boolean;\r\n }>,\r\n ) {\r\n if (state.Sections !== undefined) {\r\n const section = state.Sections.find(f => f.id === action.payload.id);\r\n if (section !== undefined) {\r\n section.checked = action.payload.checked;\r\n }\r\n }\r\n },\r\n saveSections(state, action: PayloadAction) {},\r\n clearLoading(state, action: PayloadAction) {\r\n state.tables = undefined;\r\n },\r\n setLoading(state, action: PayloadAction<{ id: string; loading: boolean }>) {\r\n if (state.tables === undefined) {\r\n state.tables = [action.payload];\r\n state.isLoading = action.payload.loading;\r\n } else {\r\n const table = state.tables.find(t => t.id === action.payload.id);\r\n if (table !== undefined) {\r\n table.loading = action.payload.loading;\r\n } else {\r\n state.tables.push(action.payload);\r\n }\r\n state.isLoading = state.tables.some(t => t.loading === true);\r\n }\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: printPDFActions } = slice;\r\n\r\nexport const usePrintPDFSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: printPDFSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import styled from 'styled-components';\r\nimport {\r\n Theme,\r\n AppBar,\r\n AppBarProps,\r\n MenuProps,\r\n Menu,\r\n Collapse,\r\n CollapseProps,\r\n} from '@material-ui/core';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport transitions from '@material-ui/core/styles/transitions';\r\n\r\nexport const StyledTopBar = styled(\r\n ({\r\n theme,\r\n drawerWidth,\r\n sidePanelWidth,\r\n children,\r\n ...other\r\n }: {\r\n theme: Theme;\r\n drawerWidth: number;\r\n sidePanelWidth: number;\r\n children: React.ReactNode;\r\n } & AppBarProps) => {children},\r\n)`\r\n &.appBar {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: flex-start;\r\n align-self: stretch;\r\n background-color: ${bookitColors.base.white};\r\n z-index: ${props => props.theme.zIndex.drawer + 1};\r\n transition: ${props =>\r\n props.theme.transitions.create(['width', 'margin'], {\r\n easing: props.theme.transitions.easing.sharp,\r\n duration: props.theme.transitions.duration.leavingScreen,\r\n })};\r\n border-bottom: 1px solid ${bookitColors.grayscale.grayBorders};\r\n width: calc(100% - ${60 + 1}px);\r\n &.appBarShift {\r\n margin-left: ${props => props.drawerWidth}px;\r\n width: calc(100% - ${props => props.drawerWidth}px);\r\n transition: ${props =>\r\n props.theme.transitions.create(['width', 'margin'], {\r\n easing: props.theme.transitions.easing.sharp,\r\n duration: props.theme.transitions.duration.enteringScreen,\r\n })};\r\n }\r\n &.sidePanelShift {\r\n margin-right: ${props => props.sidePanelWidth}px;\r\n width: calc(100% - ${props => 60 + 1 + props.sidePanelWidth}px);\r\n &.appBarShift {\r\n width: calc(\r\n 100% - ${props => props.drawerWidth + props.sidePanelWidth}px\r\n );\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const CollapseBar = styled(\r\n ({\r\n theme,\r\n children,\r\n ...other\r\n }: {\r\n theme: Theme;\r\n children: React.ReactNode;\r\n } & CollapseProps) => {children},\r\n)`\r\n &.subBar {\r\n display: flex;\r\n height: 56px;\r\n padding: 4px 16px 4px 32px;\r\n align-items: center;\r\n gap: 24px;\r\n align-self: stretch;\r\n width: 100%;\r\n gap: ${props => props.theme.spacing(2)}px;\r\n border-top: 1px solid ${bookitColors.grayscale.grayBorders};\r\n background: ${bookitColors.primary.background};\r\n & .frame {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n flex: 1 0 0;\r\n & .controls {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex: 1 0 0;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const SubTopBar = styled.div.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n}>`\r\n &.subBar {\r\n display: flex;\r\n height: 56px;\r\n padding: 4px 16px 4px 32px;\r\n align-items: center;\r\n gap: 24px;\r\n align-self: stretch;\r\n width: 100%;\r\n gap: ${props => props.theme.spacing(2)}px;\r\n border-top: 1px solid ${bookitColors.grayscale.grayBorders};\r\n background: ${bookitColors.primary.background};\r\n transition: ${transitions.create('height', {\r\n easing: transitions.easing.easeInOut,\r\n duration: 150,\r\n })};\r\n &.subBarCollapsed {\r\n height: 0;\r\n display: none;\r\n }\r\n & .frame {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n flex: 1 0 0;\r\n & .controls {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex: 1 0 0;\r\n }\r\n }\r\n }\r\n`;\r\n// box-shadow: 0px 1px 1px -1px rgb(0 0 0 / 20%),\r\n// 0px 0px 2px 0px rgb(0 0 0 / 14%), 0px 1px 1px 0px rgb(0 0 0 / 12%);\r\nexport const ProfileSection = styled.div.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n}>`\r\n &.userProfile {\r\n display: flex;\r\n justify-content: flex-end;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n`;\r\n// display: flex;\r\n// flex-direction: row;\r\n// align-items: center;\r\n// padding: 0px;\r\n// gap: ${props => props.theme.spacing(2)}px;\r\n// & span > a {\r\n// color: ${props => props.theme.palette.common.graySubtitle};\r\n// & > svg {\r\n// font-size: 20px;\r\n// }\r\n// }\r\n// @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\r\n// gap: 12px;\r\n// }\r\n// & .mainMenu {\r\n// display: flex;\r\n// align-items: flex-start;\r\n// padding: 0px;\r\n// &.userMenu {\r\n// flex-direction: column;\r\n// flex: none;\r\n// order: 4;\r\n// flex-grow: 0;\r\n// }\r\n// &.menuIcon {\r\n// flex-direction: row;\r\n// flex: none;\r\n// flex-grow: 0;\r\n// }\r\n// &.menuCores {\r\n// flex-direction: row;\r\n// flex: none;\r\n// flex-grow: 0;\r\n// order: 1;\r\n// align-self: center;\r\n// }\r\n// &.menuSearch {\r\n// flex-direction: column;\r\n// flex: none;\r\n// flex-grow: 0;\r\n// order: 0;\r\n// align-self: stretch;\r\n// }\r\n// }\r\nexport const StyledUserMenu = styled(\r\n ({\r\n theme,\r\n children,\r\n ...other\r\n }: {\r\n theme: Theme;\r\n children: React.ReactNode;\r\n } & MenuProps) => {children},\r\n)`\r\n & li {\r\n & a {\r\n margin-left: ${props => props.theme.spacing(2)}px;\r\n color: ${props => props.theme.palette.text.primary};\r\n }\r\n }\r\n`;\r\n","import styled from 'styled-components';\r\nimport { Theme } from '@material-ui/core/styles';\r\n\r\nexport const Section = styled.div.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n sidePanelWidth: number;\r\n}>`\r\n &.formsection {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: flex-start;\r\n padding: 0px 32px;\r\n max-width: 100%;\r\n width: 100%;\r\n gap: ${props => props.theme.spacing(17)}px;\r\n &.noPadding {\r\n padding: 0;\r\n }\r\n &.shortView {\r\n .baseRootHeight & {\r\n flex-direction: row;\r\n padding: 0px 32px;\r\n width: 100%;\r\n gap: ${props => props.theme.spacing(17)}px;\r\n }\r\n &.noPadding {\r\n padding: 0;\r\n }\r\n flex-direction: column;\r\n padding: 0px 16px 0px 24px;\r\n width: ${props => props.sidePanelWidth}px;\r\n gap: ${props => props.theme.spacing(2)}px;\r\n }\r\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n &.shortView {\r\n width: 100%;\r\n }\r\n }\r\n }\r\n`;\r\nexport const LeftSection = styled.div.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n}>`\r\n &.leftsection {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n flex-grow: 1;\r\n padding: 0px;\r\n\r\n width: 100%;\r\n gap: ${props => props.theme.spacing(6)}px;\r\n &.shortView {\r\n gap: ${props => props.theme.spacing(3)}px;\r\n .baseRootHeight & {\r\n gap: ${props => props.theme.spacing(6)}px;\r\n }\r\n }\r\n }\r\n`;\r\nexport const RightSection = styled.div.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n}>`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n flex-grow: 1;\r\n padding: 0px;\r\n width: 40%;\r\n gap: ${props => props.theme.spacing(6)}px;\r\n &.shortView {\r\n width: 100%;\r\n gap: ${props => props.theme.spacing(2)}px;\r\n padding-bottom: ${props => props.theme.spacing(3)}px;\r\n .baseRootHeight & {\r\n width: 40%;\r\n gap: ${props => props.theme.spacing(6)}px;\r\n padding-bottom: 0px;\r\n }\r\n }\r\n`;\r\n\r\nexport const RowSection = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n gap: `${theme.spacing(2)}px`,\r\n flex: '1 1 49%',\r\n '&.hideRow': {\r\n display: 'none',\r\n },\r\n '&.shortView': {\r\n flex: '1 1 100%',\r\n },\r\n '&.fullRow': {\r\n flex: '1 1 100%',\r\n },\r\n '&.minRow': {\r\n flex: '1 1 25%',\r\n [theme.breakpoints.down('md')]: {\r\n flex: '1 1 40%',\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n flex: '1 1 40%',\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n flex: '1 1 100%',\r\n },\r\n // [theme.breakpoints.down('sm')]: {\r\n // flex: '1 1 100%',\r\n // },\r\n },\r\n '.shortView &': {\r\n flex: '1 1 100%',\r\n },\r\n '&.wrap': {\r\n flexWrap: 'wrap',\r\n },\r\n}));\r\n\r\nexport const FormFieldsBox = styled.div.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n}>`\r\n &.fields-section {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n width: 100%;\r\n padding: 0px;\r\n gap: ${props => props.theme.spacing(1.5)}px;\r\n & .sectiontitle {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n // padding: ${props => props.theme.spacing(0, 0, 0.5)};\r\n gap: ${props => props.theme.spacing(2)}px;\r\n }\r\n & .fields {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: flex-start;\r\n padding: 0px;\r\n flex-wrap: wrap;\r\n box-sizing: border-box;\r\n width: 100%;\r\n gap: ${props => props.theme.spacing(1.5)}px;\r\n }\r\n }\r\n`;\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { selectglobalSettings } from './selectors';\r\n\r\nexport const selectGlobalDbSetting_EnableLegacyScheduler = createSelector(\r\n [selectglobalSettings],\r\n state =>\r\n state.GetBooleanByKey(AllowedSettings.EnableLegacyScheduler) ?? false,\r\n);\r\n","/**\r\n *\r\n * AssetsPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport {\r\n AssetsPicker,\r\n avTypes,\r\n} from '../pickers/MultiSelectPickers/AssetsPicker/index';\r\n\r\nexport const FormAssetsPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig[] | null> &\r\n IFieldProps & {\r\n restrictByAvType?: avTypes;\r\n admin?: boolean;\r\n showOnlyActiveAssets?: boolean;\r\n withoutServiceGroups?: boolean;\r\n }) => {\r\n const [field, meta, helpers] = useField[] | null>(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n restrictByAvType={props.restrictByAvType}\r\n admin={props.admin}\r\n showOnlyActiveAssets={props.showOnlyActiveAssets}\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n required={props.required}\r\n withoutServiceGroups={props.withoutServiceGroups}\r\n />\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport {\r\n BaseOptionsMultiPicker,\r\n BaseOptionsMultiPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsMultiPicker';\r\nimport { ReservationStatus } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { selectReservationStatuses } from 'app/slice/selectors';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\n\r\nexport interface ReservationStatusMultiProps\r\n extends Omit, 'getOptions'> {}\r\n\r\nexport const initReservationStatusMultiData = (t: TFunction) => (\r\n initialValue: string | undefined,\r\n) => {\r\n const id =\r\n initialValue\r\n ?.split('|')\r\n ?.map(id => parseInt(id))\r\n ?.filter(id => !isNaN(id) && ReservationStatus[id] !== undefined)\r\n ?.map(id => ({ Id: id, Name: t(translations[ReservationStatus[id]]) })) ??\r\n [];\r\n return Promise.resolve(id);\r\n};\r\n\r\nexport function ReservationStatusMultiPicker(\r\n props: ReservationStatusMultiProps,\r\n) {\r\n const { t } = useTranslation();\r\n const options = useSelector(state => selectReservationStatuses(state, t));\r\n const getOptions = React.useCallback(() => options, [options]);\r\n return (\r\n \r\n );\r\n}\r\n","import { ReservationStatusMultiPicker } from 'app/components/pickers/AutocompletePickers/ResrevationStatusMultiPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const ResrvationStatusMultiFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n []}\r\n ariaLabel={props.label}\r\n size=\"small\"\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default ResrvationStatusMultiFilter;\r\n","import { BaseOptionsMultiPicker } from 'app/components/BasicPickers/BaseOptionsMultiPicker';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '..';\r\n\r\nconst getOptions: (t: TFunction) => Entity[] = (t: TFunction) => {\r\n return [\r\n {\r\n Id: 1,\r\n Name: t(translations.Future),\r\n },\r\n {\r\n Id: 2,\r\n Name: t(translations.Ongoing),\r\n },\r\n ];\r\n};\r\n\r\nexport const getInitUpcomingReservationfilterMultiData = (t: TFunction) => (\r\n initval: string | undefined,\r\n) => {\r\n if (initval === undefined) {\r\n return Promise.resolve([]);\r\n }\r\n return Promise.resolve(\r\n getOptions(t).filter(f =>\r\n initval\r\n .split('|')\r\n .map(s => parseInt(s))\r\n .includes(f.Id),\r\n ),\r\n );\r\n};\r\n\r\nexport const UpcomingReservationfilter = (props: IFilterComponentProps) => {\r\n const { t } = useTranslation();\r\n const handleChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n return (\r\n getOptions(t)}\r\n onChange={handleChange}\r\n value={props.value}\r\n placeholder={t(translations.AllReservations)}\r\n size=\"small\"\r\n id={props.id}\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * WorkflowBookingFilter\r\n *\r\n */\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { WorkflowBookingPicker } from 'app/components/pickers/AutocompletePickers/WorkflowBookingPicker';\r\n\r\nexport const WorkflowBookingFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default WorkflowBookingFilter;\r\n","/**\r\n *\r\n * ReservationByIdWithPartsPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IReservationByIdFilterDto } from 'api/odata/generated/entities/IReservationByIdFilterDto';\r\n\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface ReservationByIdWithPartsPickerProps\r\n extends Omit<\r\n AutocompletePickerProps,\r\n 'loadData'\r\n > {}\r\n\r\nconst url = '/api/odata/v4/ReservationByIdFilter/WithParts';\r\nexport const initReservationByIdWithPartsData = (\r\n initval: string | undefined,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Id desc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select:\r\n 'Id,Name,FatherId,ParentAssemblyReservationId,TopAssemblyReservationId,Repeat_Period,Repeat,ReservationParts',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nexport function ReservationByIdWithPartsPicker(\r\n props: ReservationByIdWithPartsPickerProps,\r\n) {\r\n const loadData = getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: props.predicates,\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'FatherId',\r\n 'ParentAssemblyReservationId',\r\n 'TopAssemblyReservationId',\r\n 'Repeat_Period',\r\n 'Repeat',\r\n 'ReservationParts',\r\n ],\r\n });\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ReservationByIdWithPartsFilter\r\n *\r\n */\r\n\r\nimport { ReservationByIdWithPartsPicker } from 'app/components/pickers/AutocompletePickers/ReservationByIdWithPartsPicker';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const ReservationByIdWithPartsFilter = (\r\n props: IFilterComponentProps,\r\n) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n return (\r\n \r\n );\r\n};\r\nexport default ReservationByIdWithPartsFilter;\r\n","import { Chip, ChipProps, Theme, useTheme } from '@material-ui/core';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { BasicTypography } from 'app/components/Typography/BasicTypography';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { Entity } from 'types/common';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { FilterChip, FilterDisplayProps } from '..';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { FilterValueType } from '../../FilterValueType';\r\n\r\nconst InstrumentFilterChip = styled(\r\n ({\r\n color,\r\n theme,\r\n ...other\r\n }: {\r\n color?: string;\r\n theme: Theme;\r\n } & ChipProps) => ,\r\n)`\r\n &.instrument-display-root {\r\n gap: ${props => props.theme.spacing(1)}px;\r\n max-width: 28ch;\r\n border-radius: 8px;\r\n color: white;\r\n background-color: ${props => (!!props.color ? props.color : '#ccc')};\r\n height: 28px;\r\n &::first-child {\r\n margin: 0;\r\n }\r\n }\r\n`;\r\nfunction IsNotEmptyArray(\r\n entity: FilterValueType | undefined,\r\n): entity is Extract {\r\n return Array.isArray(entity) && !!entity.length;\r\n}\r\nexport function InstrumentsFilterDisplay(\r\n props: FilterDisplayProps,\r\n) {\r\n const { t } = useTranslation();\r\n const theme = useTheme();\r\n const isMobile = DetectIsMobile();\r\n const value = props.filter.value;\r\n const items = IsNotEmptyArray(value) ? (value as Array>) : [];\r\n\r\n const handleDelete = event => {\r\n props.onDelete(props.filter);\r\n };\r\n return items.length > 0 ? (\r\n 7 ? '6px 12px' : '0px 12px'}`,\r\n borderRadius: '8px',\r\n }}\r\n >\r\n \r\n {props.filter.displayName}\r\n {':'}\r\n {props.filter.isInversed ? ' Not' : ''}\r\n \r\n\r\n {items\r\n .filter(chip => chip.Name !== undefined)\r\n .map(chip => (\r\n \r\n {chip.Name !== undefined && chip.Name.length > 20 ? (\r\n \r\n \r\n \r\n {chip.Name}\r\n \r\n \r\n \r\n ) : (\r\n \r\n {chip.Name}\r\n \r\n )}\r\n \r\n }\r\n // onDelete={handleDelete}\r\n />\r\n ))}\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n {props.filter.displayName}\r\n \r\n : \r\n \r\n {t(translations.NA)}\r\n \r\n \r\n }\r\n onDelete={handleDelete}\r\n />\r\n );\r\n}\r\n","import { translations } from 'locales/translations';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { IReservationHistoryDto } from 'api/odata/generated/entities/IReservationHistoryDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { getBudgetsFilterSettings } from 'app/components/BasicTable/Filters/ProjectFilter/getBudgetsFilterSettings';\r\nimport { AssetCatGroupFilter } from 'app/components/BasicTable/Filters/AssetCatGroupFilter';\r\nimport { DatesRangeFilter } from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport { InstituteFilter } from 'app/components/BasicTable/Filters/InstituteFilter';\r\nimport { AssetCatFilter } from 'app/components/BasicTable/Filters/AssetCatFilter';\r\nimport { CampusFilter } from 'app/components/BasicTable/Filters/CampusFilter';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { BooleanPickerFilter } from 'app/components/BasicTable/Filters/BooleanPickerFilter';\r\nimport {\r\n formatQueryStringDateValue,\r\n GetBooleanEntity,\r\n GetBooleanOrUndefined,\r\n GetDateOrUndefined,\r\n getDefaultFilterDatePeriod,\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n presetDatesRangeToQueryString,\r\n initPickerValue,\r\n URLSearchParamsCI,\r\n GetStringOrUndefined,\r\n arrayToQueryString,\r\n getNumberEntityArray,\r\n getDefaultFilterNumberPeriod,\r\n NumebersRangeToQueryString,\r\n initMultiPickerValue,\r\n initMultiExPickerValue,\r\n initExPickerValue,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { UserGroupFilter } from 'app/components/BasicTable/Filters/UserGroupFIlter';\r\nimport { initAssetCatGroupData } from 'app/components/pickers/AutocompletePickers/AssetCatGroupPicker';\r\nimport { initAssetCatData } from 'app/components/pickers/AutocompletePickers/AssetCatPicker';\r\nimport { initInstituteData } from 'app/components/pickers/AutocompletePickers/InstitutePicker';\r\nimport { initUserGroupData } from 'app/components/pickers/AutocompletePickers/UserGroupPicker';\r\nimport { initCampusData } from 'app/components/pickers/AutocompletePickers/CampusPicker';\r\nimport { UserFilter } from 'app/components/BasicTable/Filters/UserFilter';\r\nimport { initUserData } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport {\r\n AppSettings,\r\n getOffsetDate,\r\n IsAssetFieldEnabled,\r\n IsModuleEnabled,\r\n} from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { initReservationStatusMultiData } from 'app/components/pickers/AutocompletePickers/ResrevationStatusMultiPicker';\r\nimport ResrvationStatusMultiFilter from 'app/components/BasicTable/Filters/ResrvationStatusMultiFilter';\r\nimport ServiceGroupFilter from 'app/components/BasicTable/Filters/ServiceGroupFilter';\r\nimport NumbersRangeFilter from 'app/components/BasicTable/Filters/NumbersRangeFilter';\r\nimport DepartmentFilter from 'app/components/BasicTable/Filters/DepartmentFilter';\r\nimport { initDepartmentData } from 'app/components/pickers/AutocompletePickers/DepartmentPicker';\r\nimport { initInstituteTypeData } from 'app/components/pickers/AutocompletePickers/InstituteTypePicker';\r\nimport {\r\n DatePickerFilter,\r\n TextFieldFilter,\r\n} from 'app/components/BasicTable/Filters';\r\nimport { initRoomData } from 'app/components/pickers/AutocompletePickers/RoomPicker';\r\nimport RoomPickerFilter from 'app/components/BasicTable/Filters/RoomPickerFilter';\r\nimport { initBuildingData } from 'app/components/pickers/AutocompletePickers/BuildingPicker';\r\nimport UserDisciplineFilter from 'app/components/BasicTable/Filters/UserDisciplineFilter';\r\nimport { initUserDisciplineData } from 'app/components/pickers/AutocompletePickers/UserDisciplinePicker';\r\nimport { AssetAttributes } from 'enums/AssetAttributes';\r\nimport { initAvailabilityTypeData } from 'app/components/pickers/AutocompletePickers/AvailabilityTypePicker';\r\nimport { AvailabilityTypeBookableFilter } from 'app/components/BasicTable/Filters/AvailabilityTypeBookableFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport {\r\n initOnlineServicesData,\r\n ServiceUrl,\r\n} from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport {\r\n ServiceAdminFilter,\r\n ServiceMultiFilter,\r\n ServiceReservationFilter,\r\n} from 'app/components/BasicTable/Filters/ServiceMultiFilter';\r\nimport { TFunction } from 'i18next';\r\nimport {\r\n getInitUpcomingReservationfilterMultiData,\r\n UpcomingReservationfilter,\r\n} from 'app/components/BasicTable/Filters/UpcomingReservationfilter';\r\nimport { isArray } from 'lodash';\r\nimport { IsEntity } from 'app/components/BasicTable/BasicFilter/AppliedFilterComponent';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { initWorkflowBookingData } from 'app/components/pickers/AutocompletePickers/WorkflowBookingPicker';\r\nimport WorkflowBookingFilter from 'app/components/BasicTable/Filters/WorkflowBookingFilter';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport NumberFieldFilter from 'app/components/BasicTable/Filters/NumberFieldFilter';\r\nimport InstituteTypeFilter from 'app/components/BasicTable/Filters/InstituteTypeFilter';\r\nimport { BuildingPickerFilter } from 'app/components/BasicTable/Filters/BuildingPickerFilter';\r\nimport { initServiceGroupsData } from 'app/components/pickers/ServiceGroupPicker';\r\nimport ReservationByIdWithPartsFilter from 'app/components/BasicTable/Filters/ReservationByIdWithPartsFilter';\r\nimport { InstrumentsFilterDisplay } from 'app/components/BasicTable/BasicFilter/FilterDisplay/InstrumentsFilterDisplay';\r\nimport { initReservationByIdWithPartsData } from 'app/components/pickers/AutocompletePickers/ReservationByIdWithPartsPicker';\r\nimport { IReservationByIdFilterDto } from 'api/odata/generated/entities/IReservationByIdFilterDto';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParamsCI(search);\r\n var result: IFilterSettings[] = [];\r\n result.push({\r\n id: 'period',\r\n fieldName: 'StartTime',\r\n fieldName1: 'EndTime',\r\n displayName: t(translations.RG_DatePeriod),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'st', 'et', params),\r\n queryStringSerializer: presetDatesRangeToQueryString('period', 'st', 'et'),\r\n component: DatesRangeFilter,\r\n notNullable: true,\r\n urlKey: 'period',\r\n });\r\n pushServicesFilter(result, t, params, true);\r\n result.push({\r\n fieldName: 'StatusId',\r\n displayName: t(translations.Status),\r\n operator: ODataOperators.Includes,\r\n queryStringSerializer: arrayToQueryString('stid'),\r\n value: getNumberEntityArray(params, 'stid'),\r\n initData: initMultiPickerValue(initReservationStatusMultiData(t)),\r\n component: ResrvationStatusMultiFilter,\r\n urlKey: 'stid',\r\n });\r\n pushBookedByFilter(result, t, params);\r\n const budgetsFilter = getBudgetsFilterSettings(\r\n params,\r\n 'BudgetId',\r\n t,\r\n appSettings,\r\n );\r\n if (budgetsFilter !== undefined) {\r\n result.push(budgetsFilter);\r\n }\r\n pushAssetCatGroupFilter(result, t, params, true);\r\n pushAssetCatFilter(result, t, params, true);\r\n pushAssetAvailabilityFilter(result, t, params, true);\r\n result.push({\r\n fieldName: 'InstituteId',\r\n displayName: t(translations.Institute),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'iid',\r\n value: GetPartialEntity(GetNumberOrUndefined(GetRawValue(params, 'iid'))),\r\n initData: initPickerValue(initInstituteData),\r\n component: InstituteFilter,\r\n notDefault: true,\r\n urlKey: 'iid',\r\n });\r\n\r\n result.push({\r\n fieldName: 'StatusId',\r\n displayName: t(translations.ExcludeStatus),\r\n operator: ODataOperators.Excludes,\r\n queryStringSerializer: arrayToQueryString('stidx'),\r\n value: getNumberEntityArray(params, 'stidx'),\r\n initData: initMultiPickerValue(initReservationStatusMultiData(t)),\r\n component: ResrvationStatusMultiFilter,\r\n notDefault: true,\r\n urlKey: 'stidx',\r\n });\r\n\r\n result.push({\r\n customFilter: (value, setting) => {\r\n //To be able to display records when \"All My Managed Services\" option is selected\r\n if (!!value && setting.fieldName === 'EquipmentId') {\r\n if (\r\n isArray(value) &&\r\n (value as []).find(x => (x as Entity).Id === -999)\r\n ) {\r\n return new Condition(\r\n setting.fieldName,\r\n ODataOperators.NotEquals,\r\n -999,\r\n ).toString();\r\n } else {\r\n return new Condition(\r\n setting.fieldName,\r\n setting.operator,\r\n value,\r\n ).toString();\r\n }\r\n }\r\n },\r\n fieldName: 'ServiceGroupId',\r\n displayName: t(translations.ServiceGroup),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'ServiceGroupId',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'ServiceGroupId')),\r\n ),\r\n initData: initExPickerValue(initServiceGroupsData),\r\n component: ServiceGroupFilter,\r\n notDefault: true,\r\n });\r\n result.push({\r\n fieldName: 'ADGroup',\r\n displayName: t(translations.UserGroup),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(GetStringOrUndefined(GetRawValue(params, 'adg'))),\r\n component: UserGroupFilter,\r\n queryStringSerializer: 'adg',\r\n initData: initPickerValue(initUserGroupData),\r\n notDefault: true,\r\n urlKey: 'adg',\r\n });\r\n result.push({\r\n fieldName: 'Id',\r\n displayName: t(translations.ReservationsRelatedToReservationId),\r\n operator: ODataOperators.Includes,\r\n queryStringSerializer: 'relId',\r\n value: GetPartialEntity(GetNumberOrUndefined(GetRawValue(params, 'relId'))),\r\n component: ReservationByIdWithPartsFilter,\r\n initData: initExPickerValue(initReservationByIdWithPartsData),\r\n notDefault: true,\r\n urlKey: 'relId',\r\n refreshAfterInit: true,\r\n customFilter: (value, setting) => {\r\n if (!!value && setting.fieldName === 'Id') {\r\n let part = value as IReservationByIdFilterDto;\r\n if (!!part.ReservationParts && part.ReservationParts.length > 0) {\r\n let ids = part.ReservationParts.map(item => {\r\n return { Id: item };\r\n }) as Identifiable[];\r\n\r\n return `${new Condition(\r\n setting.fieldName,\r\n ODataOperators.Includes,\r\n ids,\r\n ).toString()} or ${new Condition(\r\n 'TopAssemblyReservationId',\r\n ODataOperators.Includes,\r\n ids,\r\n ).toString()}`;\r\n } else {\r\n return `${new Condition(\r\n setting.fieldName,\r\n ODataOperators.Equals,\r\n part.Id,\r\n ).toString()} or ${new Condition(\r\n 'TopAssemblyReservationId',\r\n ODataOperators.Equals,\r\n part.Id,\r\n ).toString()}`;\r\n }\r\n }\r\n },\r\n });\r\n result.push({\r\n fieldName: 'LastUpdateAdminId',\r\n displayName: t(translations.LastUpdateAdmin),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'LastUpdateAdminId',\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'LastUpdateAdminId')),\r\n ),\r\n component: UserFilter,\r\n initData: initPickerValue(initUserData),\r\n notDefault: true,\r\n });\r\n result.push({\r\n fieldName: 'InsertedById',\r\n displayName: t(translations.OrderedBy),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'InsertedById',\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'InsertedById')),\r\n ),\r\n component: UserFilter,\r\n initData: initPickerValue(initUserData),\r\n notDefault: true,\r\n });\r\n result.push({\r\n id: 'StartTimeDate',\r\n fieldName: 'StartTime',\r\n queryStringSerializer: formatQueryStringDateValue('startsOn'),\r\n displayName: t(translations.ReservationStartsOn),\r\n operator: ODataOperators.Equals,\r\n defaultValue: new CustomDate(),\r\n value: GetDateOrUndefined(GetRawValue(params, 'startsOn'), 'date'),\r\n component: DatePickerFilter,\r\n notDefault: true,\r\n urlKey: 'startsOn',\r\n });\r\n result.push({\r\n id: 'EndTimeDate',\r\n fieldName: 'EndTime',\r\n queryStringSerializer: formatQueryStringDateValue('endsOn'),\r\n displayName: t(translations.ReservationEndsOn),\r\n operator: ODataOperators.Equals,\r\n defaultValue: new Date(),\r\n value: GetDateOrUndefined(GetRawValue(params, 'endsOn'), 'date'),\r\n component: DatePickerFilter,\r\n notDefault: true,\r\n urlKey: 'endsOn',\r\n });\r\n result.push({\r\n id: 'StartTime',\r\n fieldName: 'StartTime',\r\n displayName: t(translations.StartTime),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod(\r\n 'StartTime-period',\r\n 'StartTime-st',\r\n 'StartTime-et',\r\n params,\r\n ),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'StartTime-period',\r\n 'StartTime-st',\r\n 'StartTime-et',\r\n ),\r\n component: DatesRangeFilter,\r\n notDefault: true,\r\n urlKey: 'StartTime-period',\r\n });\r\n result.push({\r\n id: 'EndTime',\r\n fieldName: 'EndTime',\r\n displayName: t(translations.EndTime),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod(\r\n 'EndTime-period',\r\n 'EndTime-st',\r\n 'EndTime-et',\r\n params,\r\n ),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'EndTime-period',\r\n 'EndTime-st',\r\n 'EndTime-et',\r\n ),\r\n component: DatesRangeFilter,\r\n notDefault: true,\r\n urlKey: 'EndTime-period',\r\n });\r\n\r\n result.push({\r\n fieldName: 'Tutoring',\r\n displayName: t(translations.Tutoring),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'tr',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'tr')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n notDefault: true,\r\n urlKey: 'tr',\r\n });\r\n result.push({\r\n fieldName: 'Loanable',\r\n displayName: t(translations.Loanable),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'loan',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'loan')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n notDefault: true,\r\n urlKey: 'loan',\r\n });\r\n result.push({\r\n fieldName: 'TrainingSignUp',\r\n queryStringSerializer: 'TrainingSignUp',\r\n displayName: t(translations.TrainingSignUp),\r\n operator: ODataOperators.Equals,\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'TrainingSignUp')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n notDefault: true,\r\n });\r\n result.push({\r\n id: 'RecordDate',\r\n fieldName: 'RecordDate',\r\n displayName: t(translations.RecordDate),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod(\r\n 'RecordDate-period',\r\n 'RecordDate-st',\r\n 'RecordDate-et',\r\n params,\r\n ),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'RecordDate-period',\r\n 'RecordDate-st',\r\n 'RecordDate-et',\r\n ),\r\n component: DatesRangeFilter,\r\n notDefault: true,\r\n urlKey: 'RecordDate-period',\r\n });\r\n result.push({\r\n id: 'DurationH',\r\n fieldName: 'DurationH',\r\n displayName: t(translations.Duration),\r\n operator: ODataOperators.Between,\r\n value: getDefaultFilterNumberPeriod('DurationH', params),\r\n queryStringSerializer: NumebersRangeToQueryString('DurationH'),\r\n component: NumbersRangeFilter,\r\n notDefault: true,\r\n urlKey: 'DurationH',\r\n });\r\n result.push({\r\n id: 'DepartmentId',\r\n fieldName: 'DepartmentId',\r\n queryStringSerializer: 'DepartmentId',\r\n displayName: t(translations.Department),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'DepartmentId')),\r\n ),\r\n initData: initPickerValue(initDepartmentData),\r\n component: DepartmentFilter,\r\n notDefault: true,\r\n });\r\n result.push({\r\n notDefault: true,\r\n id: 'InstituteTypeId',\r\n fieldName: 'InstituteTypeId',\r\n queryStringSerializer: 'InstituteTypeId',\r\n displayName: t(translations.InstituteType),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'InstituteTypeId')),\r\n ),\r\n initData: initPickerValue(initInstituteTypeData),\r\n component: InstituteTypeFilter,\r\n });\r\n result.push({\r\n id: 'AssetModel',\r\n fieldName: 'AssetModel',\r\n queryStringSerializer: 'AssetModel',\r\n displayName: t(translations.Model),\r\n operator: ODataOperators.Contains,\r\n value: GetRawValue(params, 'AssetModel'),\r\n component: TextFieldFilter,\r\n notDefault: true,\r\n });\r\n result.push({\r\n id: 'AssetModelNumber',\r\n fieldName: 'AssetModelNumber',\r\n queryStringSerializer: 'AssetModelNumber',\r\n displayName: t(translations.ModelNumber),\r\n operator: ODataOperators.Contains,\r\n value: GetRawValue(params, 'AssetModelNumber'),\r\n component: TextFieldFilter,\r\n notDefault: true,\r\n });\r\n pushRoomFilter(result, t, params, true);\r\n pushBuildingFilter(result, t, params, true);\r\n result.push({\r\n id: 'UserDisciplineId',\r\n fieldName: 'UserDisciplineId',\r\n displayName: t(translations.Discipline),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'UserDisciplineId',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'UserDisciplineId')),\r\n ),\r\n component: UserDisciplineFilter,\r\n initData: initPickerValue(initUserDisciplineData),\r\n notDefault: true,\r\n });\r\n result.push({\r\n fieldName: 'StaffUser',\r\n displayName: t(translations.StaffUser),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'StaffUser',\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'StaffUser')),\r\n ),\r\n initData: initPickerValue(initUserData),\r\n component: UserFilter,\r\n notDefault: true,\r\n });\r\n\r\n pushBudgetManagerFilter(appSettings, result, t, params, true);\r\n pushCampusFilter(appSettings, result, t, params, true);\r\n\r\n result.push({\r\n id: 'upcomingReservations',\r\n fieldName: 'StartTime',\r\n queryStringSerializer: arrayToQueryString('upcomingReservations'),\r\n operator: ODataOperators.Equals,\r\n displayName: t(translations.UpcomingReservations),\r\n value: getNumberEntityArray(params, 'upcomingReservations'),\r\n component: UpcomingReservationfilter,\r\n initData: initMultiPickerValue(\r\n getInitUpcomingReservationfilterMultiData(t),\r\n ),\r\n notDefault: true,\r\n urlKey: 'upcomingReservations',\r\n customFilter(value, settings) {\r\n if (!isArray(value) || (value ?? []).length === 0) {\r\n return undefined;\r\n }\r\n const now = getOffsetDate(appSettings, new Date());\r\n return (\r\n '(' +\r\n value\r\n .map(v => {\r\n if (!IsEntity(v)) return '';\r\n if (v.Id === 1) {\r\n return new Condition(\r\n 'StartTime',\r\n ODataOperators.GreaterThan,\r\n now,\r\n ).toString();\r\n }\r\n if (v.Id === 2) {\r\n return (\r\n '(' +\r\n new Condition(\r\n 'StartTime',\r\n ODataOperators.LessThanEqual,\r\n now,\r\n ).toString() +\r\n ' and ' +\r\n new Condition(\r\n 'EndTime',\r\n ODataOperators.GreaterThan,\r\n now,\r\n ).toString() +\r\n ')'\r\n );\r\n }\r\n return '';\r\n })\r\n .join(' or ') +\r\n ')'\r\n );\r\n },\r\n });\r\n pushWorkflowBookingFilter(settings, result, t, params, true);\r\n const HideTrainingSessionsSettings = settings?.GetBoolean(\r\n AllowedSettings[AllowedSettings.HideTrainingSessionsSettings],\r\n );\r\n if (!HideTrainingSessionsSettings) {\r\n result.push({\r\n id: 'TrainingSessionId',\r\n fieldName: 'TrainingSessionId',\r\n queryStringSerializer: 'TrainingSessionId',\r\n displayName: t(translations.TrainingSessionId),\r\n operator: ODataOperators.Equals,\r\n value: GetNumberOrUndefined(GetRawValue(params, 'TrainingSessionId')),\r\n component: NumberFieldFilter,\r\n notDefault: true,\r\n });\r\n }\r\n return result;\r\n};\r\nexport function pushAssetCatGroupFilter<\r\n T extends { AssetGroupId: number | null }\r\n>(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n result.push({\r\n id: 'AssetGroupId',\r\n fieldName: 'AssetGroupId',\r\n queryStringSerializer: 'assetCatGroupId',\r\n displayName: t(translations.AssetCatGroupName),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'assetCatGroupId')),\r\n ),\r\n initData: initPickerValue(initAssetCatGroupData),\r\n component: AssetCatGroupFilter,\r\n urlType: 'assetBase',\r\n notDefault,\r\n urlKey: 'assetCatGroupId',\r\n });\r\n}\r\n\r\nexport function pushBookedByFilter(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n result.push({\r\n id: 'BookedById',\r\n fieldName: 'BookedById',\r\n displayName: t(translations.User),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'un',\r\n value: GetPartialEntity(GetStringOrUndefined(GetRawValue(params, 'un'))),\r\n component: UserFilter,\r\n initData: initPickerValue(initUserData),\r\n notDefault,\r\n urlKey: 'un',\r\n });\r\n}\r\n\r\nexport function pushAssetAvailabilityFilter<\r\n T extends { AvailabilityTypeId: number | null }\r\n>(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n result.push({\r\n id: 'AvailabilityTypeId',\r\n fieldName: 'AvailabilityTypeId',\r\n queryStringSerializer: 'atid',\r\n displayName: t(translations.AvailabilityType),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(GetNumberOrUndefined(GetRawValue(params, 'atid'))),\r\n // TODO: set value directly instead of the initValue\r\n //initValue: getDefaultFilterValue('atid', params) as FilterValueType,\r\n initData: initPickerValue(initAvailabilityTypeData),\r\n component: AvailabilityTypeBookableFilter,\r\n notDefault,\r\n urlKey: 'atid',\r\n });\r\n}\r\n\r\nexport function pushBudgetManagerFilter<\r\n T extends { BudgetManager: string | null }\r\n>(\r\n appSettings: AppSettings | null,\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n if (IsModuleEnabled(appSettings, KnownModules.Budgets)) {\r\n result.push({\r\n id: 'BudgetManager',\r\n fieldName: 'BudgetManager',\r\n displayName: t(translations.BudgetManager),\r\n operator: ODataOperators.Equals,\r\n // value: getDefaultFilterValue('bid', params),\r\n queryStringSerializer: 'BudgetManager',\r\n initData: initPickerValue(initUserData),\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'BudgetManager')),\r\n ),\r\n component: UserFilter,\r\n notDefault,\r\n });\r\n }\r\n}\r\n\r\nexport function pushAssetCatFilter(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n result.push({\r\n id: 'AssetCatId',\r\n fieldName: 'AssetCatId',\r\n displayName: t(translations.AssetCategory),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'assetCatID',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'assetCatID')),\r\n ),\r\n initData: initPickerValue(initAssetCatData),\r\n component: AssetCatFilter,\r\n urlType: 'assetBase',\r\n urlKey: 'assetCatID',\r\n notDefault,\r\n });\r\n}\r\n\r\nexport function pushRoomFilter(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n result.push({\r\n id: 'AssetRoomId',\r\n fieldName: 'AssetRoomId',\r\n queryStringSerializer: 'AssetRoomId',\r\n displayName: t(translations.Room),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'AssetRoomId')),\r\n ),\r\n initData: initPickerValue(initRoomData),\r\n component: RoomPickerFilter,\r\n notDefault,\r\n });\r\n}\r\n\r\nexport function pushBuildingFilter<\r\n T extends { AssetBuildingId: number | null }\r\n>(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n result.push({\r\n id: 'AssetBuildingId',\r\n fieldName: 'AssetBuildingId',\r\n queryStringSerializer: 'AssetBuildingId',\r\n displayName: t(translations.Building),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'AssetBuildingId')),\r\n ),\r\n initData: initPickerValue(initBuildingData),\r\n component: BuildingPickerFilter,\r\n urlType: 'assetBase',\r\n notDefault,\r\n });\r\n}\r\n\r\nexport function pushServicesFilter(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n includeAllMyManagedServicesOption: boolean,\r\n fieldName?: keyof T,\r\n sourceUrl?: ServiceUrl,\r\n separator?: string,\r\n) {\r\n const allMyManagedServicesOption = {\r\n Id: -999,\r\n Name: t(translations.AllMyManagedServices),\r\n };\r\n result.push({\r\n id: 'service',\r\n fieldName: fieldName || 'EquipmentId',\r\n displayName: t(translations.InstrumentServiceName),\r\n operator: ODataOperators.Includes,\r\n queryStringSerializer: arrayToQueryString('eid'),\r\n urlKey: 'eid',\r\n value: getNumberEntityArray(params, 'eid'),\r\n component:\r\n sourceUrl === 'admin'\r\n ? ServiceAdminFilter\r\n : sourceUrl === 'reserved'\r\n ? ServiceReservationFilter\r\n : ServiceMultiFilter,\r\n additionalItem: includeAllMyManagedServicesOption\r\n ? allMyManagedServicesOption\r\n : undefined,\r\n initData: initMultiExPickerValue(\r\n initOnlineServicesData,\r\n [allMyManagedServicesOption],\r\n sourceUrl,\r\n separator,\r\n ),\r\n customFilter: (value, setting) => {\r\n if (!includeAllMyManagedServicesOption) {\r\n return new Condition(\r\n setting.fieldName,\r\n setting.operator,\r\n value,\r\n setting.fieldName1,\r\n ).toString();\r\n }\r\n //To be able to display records when \"All My Managed Services\" option is selected\r\n if (!!value && setting.fieldName === 'EquipmentId') {\r\n if (\r\n isArray(value) &&\r\n (value as []).find(x => (x as Entity).Id === -999)\r\n ) {\r\n return new Condition(\r\n setting.fieldName,\r\n ODataOperators.NotEquals,\r\n -999,\r\n ).toString();\r\n } else {\r\n return new Condition(\r\n setting.fieldName,\r\n setting.operator,\r\n value,\r\n ).toString();\r\n }\r\n }\r\n },\r\n });\r\n}\r\n\r\nexport function pushServicesCalendarFilter(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n includeAllMyManagedServicesOption: boolean,\r\n fieldName?: keyof T,\r\n sourceUrl?: ServiceUrl,\r\n separator?: string,\r\n) {\r\n const allMyManagedServicesOption = {\r\n Id: -999,\r\n Name: t(translations.AllMyManagedServices),\r\n };\r\n result.push({\r\n id: 'service',\r\n fieldName: fieldName || 'EquipmentId',\r\n displayName: t(translations.InstrumentServiceName),\r\n operator: ODataOperators.Includes,\r\n queryStringSerializer: arrayToQueryString('eid'),\r\n urlKey: 'eid',\r\n value: getNumberEntityArray(params, 'eid'),\r\n component:\r\n sourceUrl === 'admin'\r\n ? ServiceAdminFilter\r\n : sourceUrl === 'reserved'\r\n ? ServiceReservationFilter\r\n : ServiceMultiFilter,\r\n additionalItem: includeAllMyManagedServicesOption\r\n ? allMyManagedServicesOption\r\n : undefined,\r\n initData: initMultiExPickerValue(\r\n initOnlineServicesData,\r\n [allMyManagedServicesOption],\r\n sourceUrl,\r\n separator,\r\n ),\r\n renderFilterDisplay: InstrumentsFilterDisplay,\r\n });\r\n}\r\n\r\nexport function pushCampusFilter(\r\n appSettings: AppSettings | null,\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Campus)) {\r\n result.push({\r\n id: 'campus',\r\n fieldName: 'AssetCampusId',\r\n displayName: t(translations.Campus),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'campus',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'campus')),\r\n ),\r\n initData: initPickerValue(initCampusData),\r\n\r\n component: CampusFilter,\r\n notDefault,\r\n urlKey: 'campus',\r\n });\r\n }\r\n}\r\nexport function pushWorkflowBookingFilter(\r\n settings: GlobalSettings | null,\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n if (\r\n settings?.GetBoolean(AllowedSettings[AllowedSettings.AllowWorkflowBooking])\r\n ) {\r\n result.push({\r\n id: 'WorkflowBooking',\r\n fieldName: 'WorkflowBookingId',\r\n displayName: t(translations.WorkflowBooking),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'wbId',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'wbId')),\r\n ),\r\n initData: initPickerValue(initWorkflowBookingData),\r\n component: WorkflowBookingFilter,\r\n notDefault,\r\n urlKey: 'wbId',\r\n });\r\n }\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { put, takeLatest } from 'redux-saga/effects';\r\nimport { repetitiveActions as actions } from '.';\r\nimport { IRepetitiveDto } from 'types/IRepetitiveDto';\r\n\r\nfunction* doSaveState(action: PayloadAction) {\r\n yield put(actions.saveState_success(action.payload));\r\n}\r\nfunction* doSetRepetitiveValue(\r\n action: PayloadAction<{\r\n fieldKey: keyof IRepetitiveDto;\r\n fieldValue: any;\r\n }>,\r\n) {\r\n yield put(actions.setRepetitiveValueSuccess(action.payload));\r\n}\r\nexport function* repetitiveSaga() {\r\n yield takeLatest(actions.saveState.type, doSaveState);\r\n yield takeLatest(actions.setRepetitiveValue.type, doSetRepetitiveValue);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport {\r\n IRepetitiveDto,\r\n RepetitiveInit,\r\n ShortWeekDays,\r\n} from 'types/IRepetitiveDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { repetitiveSaga } from './saga';\r\nimport { RepetitiveState } from './types';\r\n\r\nexport const initialState: RepetitiveState = {\r\n processing: false,\r\n data: {\r\n StartDate: undefined,\r\n RecurringEvents: null,\r\n RepeatsOnDays: ShortWeekDays().map(f => {\r\n if (f.Id === 0) f.checked = true;\r\n return f;\r\n }),\r\n RecurringEndDate: undefined,\r\n RepeatsEveryDay: null,\r\n RepeatsEveryPeriod: null,\r\n RepeatsMonthlyBy: null,\r\n },\r\n repetitiveValueHandler: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'repetitive',\r\n initialState,\r\n reducers: {\r\n resetState(state, action: PayloadAction) {\r\n state.data = RepetitiveInit(action.payload ?? new Date());\r\n },\r\n saveState(state, action: PayloadAction) {},\r\n saveState_success(state, action: PayloadAction) {\r\n state.data = {\r\n StartDate: action.payload.StartDate,\r\n RecurringEvents: action.payload.RecurringEvents,\r\n RepeatsOnDays: action.payload.RepeatsOnDays,\r\n RecurringEndDate: action.payload.RecurringEndDate,\r\n RepeatsEveryDay: action.payload.RepeatsEveryDay,\r\n RepeatsEveryPeriod: action.payload.RepeatsEveryPeriod,\r\n RepeatsMonthlyBy: action.payload.RepeatsMonthlyBy,\r\n };\r\n },\r\n setSubmit(state, action: PayloadAction) {\r\n state.processing = action.payload;\r\n },\r\n setRepetitiveValue(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof IRepetitiveDto;\r\n fieldValue: any;\r\n }>,\r\n ) {},\r\n setRepetitiveValueSuccess(\r\n state,\r\n action: PayloadAction<{\r\n fieldKey: keyof IRepetitiveDto;\r\n fieldValue: any;\r\n }>,\r\n ) {\r\n state.repetitiveValueHandler = {\r\n run: true,\r\n fieldKey: action.payload.fieldKey,\r\n fieldValue: action.payload.fieldValue,\r\n shouldValidate: true,\r\n };\r\n },\r\n resetRepetitiveHandler(state, action: PayloadAction) {\r\n state.repetitiveValueHandler = undefined;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: repetitiveActions } = slice;\r\n\r\nexport const useRepetitiveSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: repetitiveSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useRepetitiveSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","/**\r\n * Bookit.Data.ServiceGroupRegistrationStatus\r\n */\r\nexport enum ServiceGroupRegistrationStatus {\r\n Approved = 0,\r\n Rejected = 1,\r\n Pending = 2,\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { ConfigurableTypes } from 'enums/ConfigurableTypes';\r\nimport { Column } from 'react-table';\r\nimport { IRow } from './IRow';\r\n\r\n/**\r\n * Simplest in memory cache of the configurable columns\r\n * TODO: replace this one with something a little bit capable (e.g. expiration, cache-control, etc.)\r\n */\r\nconst configurableColumnsCache: Record<\r\n string,\r\n Promise>\r\n> = {};\r\n\r\nexport interface ConfigurableColumns {\r\n Id: string;\r\n DisplayName: string;\r\n CustomName: string;\r\n hasCustomName: boolean;\r\n}\r\n\r\n/**\r\n * Returns cached configurable columns data. Can be also used for pre fetching screens that are likely will be visited.\r\n * Server request can be already resolved one which will return the data immediately.\r\n * If the request is pending, it will resolve for all callers on completion.\r\n * In case no calls were made yet with exact params, a new request will be issued and a pending promis will be returned.\r\n * @param listId listId aka screenId\r\n * @param configurableType screen/export\r\n * @param force forces reload of configurable column and ignores cache\r\n * @returns A promise of the configurable columns data.\r\n */\r\nexport async function GetCachedConfigurableColumnsData(\r\n listId: number,\r\n configurableType: number,\r\n isAuthenticated?: boolean,\r\n force?: boolean,\r\n) {\r\n const privateUrl = '/api/odata/v4/ConfigurableColumns';\r\n const publicUrl = '/api/odata/v4/ConfigurableColumns/PublicColumns';\r\n const url = isAuthenticated ? privateUrl : publicUrl;\r\n const param = { ListID: listId, ConfigurableType: configurableType };\r\n const key = JSON.stringify(param);\r\n\r\n // drops stored value so it will be reloaded later\r\n if (force === true) {\r\n delete configurableColumnsCache[key];\r\n }\r\n\r\n // load configurable columns data if it's not present yet\r\n if (configurableColumnsCache[key] === undefined) {\r\n configurableColumnsCache[key] = loadData(url, param);\r\n }\r\n return await configurableColumnsCache[key];\r\n}\r\n/**\r\n * Loads configurable columns from the server. Throws an error if there's no columns configured\r\n * @param url\r\n * @param param\r\n * @returns\r\n */\r\nasync function loadData(url, param) {\r\n try {\r\n const response = await httpClient.get<\r\n IODataQueryResponse\r\n >(url, param);\r\n if (!response || !response.value || response.value.length === 0) {\r\n throw new Error('Unexpected configurable columns response');\r\n }\r\n return response.value;\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\nexport function getTableColumns({\r\n response,\r\n ConfigurableColumnsSetUp,\r\n}: {\r\n response: ConfigurableColumns[];\r\n ConfigurableColumnsSetUp: Column[];\r\n}) {\r\n var res: Column[] = [];\r\n\r\n if (!response || response.length === 0) {\r\n return ConfigurableColumnsSetUp;\r\n } else {\r\n for (var i = 0; i < response.length; i++) {\r\n for (var j = 0; j < ConfigurableColumnsSetUp.length; j++) {\r\n if (\r\n ConfigurableColumnsSetUp[j].accessor === response[i].Id ||\r\n ConfigurableColumnsSetUp[j].accessor === response[i].DisplayName ||\r\n // This is for dummy columns when no accessor is defined.\r\n ConfigurableColumnsSetUp[j].Header === response[i].DisplayName\r\n ) {\r\n if (response[i].hasCustomName) {\r\n ConfigurableColumnsSetUp[j].Header = response[i].CustomName;\r\n }\r\n res.push(ConfigurableColumnsSetUp[j]);\r\n break;\r\n }\r\n }\r\n }\r\n return res;\r\n }\r\n}\r\n\r\nexport async function TryGetExportColumns(\r\n listId: number | undefined,\r\n columns: Array>,\r\n): Promise | undefined> {\r\n try {\r\n if (listId === undefined) {\r\n return getColumnAccessors(columns);\r\n } else {\r\n const columnsData = await GetCachedConfigurableColumnsData(\r\n listId,\r\n ConfigurableTypes.ColumnExportConfig,\r\n );\r\n return columnsData.map(item => item.Id);\r\n }\r\n } catch (error) {\r\n return getColumnAccessors(columns);\r\n }\r\n}\r\n\r\nexport function getColumnAccessors(\r\n columns: Column[],\r\n): Array {\r\n const result: Array = columns\r\n .filter(c => typeof c.accessor === 'string')\r\n .filter(c => c.accessor !== undefined)\r\n .map(c => c.accessor as keyof TRow);\r\n return result;\r\n}\r\n","export enum RemindBefore {\r\n doNotNotify = 0,\r\n oneday = 1,\r\n twodays = 2,\r\n threedays = 3,\r\n oneweek = 4,\r\n onemonth = 5,\r\n custom = 6,\r\n}\r\n","import { IOfflineServiceTypeDto } from 'api/odata/generated/entities/IOfflineServiceTypeDto';\r\nimport { IAsset } from 'app/pages/AssetPopUp/IAsset';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { intersection } from 'lodash';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\n\r\nexport function useAdminPermissions() {\r\n const user = useSelector(selectAuthenticatedUser);\r\n const roles: number[] | undefined = user?.Roles;\r\n\r\n const allowedToEdit = React.useCallback(\r\n (\r\n row: Pick,\r\n ): boolean => {\r\n if (!user) return false;\r\n return (\r\n user.HasAdminGroupPermissions(row.ServiceGroupId ?? undefined) ||\r\n (row.ServiceType !== null &&\r\n row.ServiceId !== null &&\r\n user.HasAdminServicePermissions(\r\n ServiceType[row.ServiceType],\r\n row.ServiceId,\r\n ))\r\n );\r\n },\r\n [user],\r\n );\r\n const allowedToAdd = React.useCallback(\r\n (row: Pick): boolean => {\r\n if (!user) return false;\r\n return (\r\n user.HasCreateAdminGroupPermissions(row.ServiceGroupId ?? undefined) ||\r\n user.HasAdminGroupPermissions(row.ServiceGroupId ?? undefined)\r\n );\r\n },\r\n [user],\r\n );\r\n const allowedToEditOffline = React.useCallback(\r\n (row: Pick): boolean => {\r\n if (!user) return false;\r\n return (\r\n user.HasAdminGroupPermissions(row.ServiceGroupId) ||\r\n user.HasAdminServicePermissions(ServiceType.Offline, row.Id)\r\n );\r\n },\r\n [user],\r\n );\r\n const allowedToAddOffline = React.useCallback(\r\n (row: Pick): boolean => {\r\n if (!user) return false;\r\n return (\r\n user.HasCreateAdminGroupPermissions(row.ServiceGroupId) ||\r\n user.HasAdminGroupPermissions(row.ServiceGroupId)\r\n );\r\n },\r\n [user],\r\n );\r\n const allowedToEditBatch = React.useCallback(\r\n (row: Pick): boolean => {\r\n if (!user) return false;\r\n return (\r\n user.HasAdminGroupPermissions(row.ServiceGroupId) ||\r\n user.HasAdminServicePermissions(ServiceType.Offline, row.Id) ||\r\n user.HasLabTechGroupPermissions(row.ServiceGroupId) ||\r\n user.HasLabTechServicePermissions(ServiceType.Offline, row.Id)\r\n );\r\n },\r\n [user],\r\n );\r\n const allowedToEditGroup = React.useCallback(\r\n (row: Pick): boolean => {\r\n if (!user) return false;\r\n return user.HasAdminGroupOnlyPermissions(row.Id);\r\n },\r\n [user],\r\n );\r\n const allowedRoles = [\r\n Roles.Administrators,\r\n Roles.EquipmentAdministrator,\r\n Roles.GroupAdministrators,\r\n Roles.CreateNewAssetsAdmin,\r\n ];\r\n const hasRolePermissions: boolean =\r\n intersection(roles, allowedRoles).length > 0;\r\n return {\r\n hasRolePermissions,\r\n allowedToEdit,\r\n allowedToAdd,\r\n allowedToEditOffline,\r\n allowedToAddOffline,\r\n allowedToEditBatch,\r\n allowedToEditGroup,\r\n };\r\n}\r\n","/**\r\n *\r\n * UserMultiPicker\r\n *\r\n */\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompleteMultiPickerEx,\r\n AutocompleteMultiPickerExProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\n\r\nimport * as React from 'react';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { UserUrl } from '../UserPicker';\r\n\r\nexport interface UserPickerProps\r\n extends Omit, 'loadData'> {\r\n inputProps?: InputBaseComponentProps;\r\n selectArray?: Array;\r\n urlType?: UserUrl;\r\n separator?: string;\r\n}\r\n\r\nconst defaultUrl = '/api/odata/v4/UserFilter';\r\nconst fullActiveUrl = '/api/odata/v4/UserFilter/GetUserSelections';\r\nconst adminsUrl = '/api/odata/v4/UserFilter/GetAdminUsers';\r\nexport const initUserMultiData = (\r\n initval: string | undefined,\r\n sourceUrl?: UserUrl,\r\n separator?: string,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n let ids = (initval.indexOf(separator || '|') !== -1\r\n ? initval.split(separator || '|')\r\n : [initval]\r\n ).map(item => {\r\n return { Id: item };\r\n }) as Identifiable[];\r\n let filters: string | undefined = undefined;\r\n if (ids.length > 0) {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(new Condition('Id', ODataOperators.Includes, ids));\r\n filters = predicates.map(f => f.toString()).join(' and ');\r\n }\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: filters,\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n sourceUrl === 'full'\r\n ? fullActiveUrl\r\n : sourceUrl === 'admin'\r\n ? adminsUrl\r\n : defaultUrl;\r\n\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nexport function UserMultiPicker(props: UserPickerProps) {\r\n const { selectArray, predicates, urlType, ...other } = props;\r\n const loadData = getAutoCompleteLoadDataFn({\r\n url:\r\n urlType === 'full'\r\n ? fullActiveUrl\r\n : urlType === 'admin'\r\n ? adminsUrl\r\n : defaultUrl,\r\n predicates: predicates,\r\n select: selectArray ?? [\r\n 'Id',\r\n 'Name',\r\n 'UserGroups',\r\n 'Budgets',\r\n 'IsAdminPanel',\r\n 'IsEquipmentAdmin',\r\n 'IsGroupAdmin',\r\n 'IsLabTech',\r\n 'ServiceGroupIds',\r\n 'Services',\r\n 'CustomRoles',\r\n 'UserGroupId',\r\n 'UserGroupName',\r\n 'UserRoles',\r\n ],\r\n expand: 'Services,UserGroups',\r\n });\r\n return (\r\n \r\n );\r\n}\r\n\r\n//PREDICATES FUNCTION\r\nexport function ContactsByAssetIdsFilter(\r\n AssetIds: number[],\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (AssetIds.length > 0) {\r\n let ids = AssetIds.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition('AssetIds', ODataOperators.Includes, ids),\r\n );\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n","import { isEqual } from 'lodash';\r\nimport { IFilterSettings } from './IFilterSettings';\r\n\r\nexport function areSameFilter({\r\n f,\r\n item,\r\n}: {\r\n f: IFilterSettings | undefined;\r\n item: IFilterSettings | undefined;\r\n}): boolean {\r\n return (\r\n f !== undefined &&\r\n item !== undefined &&\r\n isEqual(filterKey(f), filterKey(item))\r\n );\r\n}\r\n\r\nexport const filterKey = (f: IFilterSettings) =>\r\n f.id !== undefined\r\n ? f.id\r\n : {\r\n fieldName: f.fieldName,\r\n fieldName1: f.fieldName1,\r\n displayName: f.displayName,\r\n };\r\n\r\nexport const filtersInQuery = (\r\n filters: IFilterSettings[],\r\n query: string,\r\n) => {\r\n return filters.filter(f => f.value !== undefined);\r\n};\r\n","/**\r\n *\r\n * FormOnlineServicesComboPicker - FormOnlineServicesSinglePicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n OnlineServiceMultiPicker,\r\n OnlineServicePickerProps,\r\n OnlineServiceSinglePicker,\r\n} from '../pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\n\r\nexport const FormOnlineServicesComboPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps & { multiple: boolean } & OnlineServicePickerProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n if (props.multiple) {\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n urlType={props.urlType}\r\n />\r\n );\r\n } else {\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n urlType={props.urlType}\r\n info={props.info}\r\n />\r\n );\r\n }\r\n};\r\nexport const FormOnlineServicesSinglePicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps &\r\n OnlineServicePickerProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n\r\n return (\r\n {\r\n helpers.setValue(value[0], true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value === null ? undefined : [field.value]}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n urlType={props.urlType}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n />\r\n );\r\n};\r\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport { Entity, Identifiable } from 'types/common';\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport { INamedEntity } from 'types/common';\r\nimport { IAssetAvailabilityDto } from './IAssetAvailabilityDto';\r\nimport { IServiceFilterDto } from './IServiceFilterDto';\r\nimport { IServiceTypeFilterDto } from './IServiceTypeFilterDto';\r\n\r\n/**\r\n *\r\n * auto generated interface for bkt_webApp.Api.OData.V4.Dto.AssetDto\r\n *\r\n */\r\nexport interface IAssetDto extends Entity {\r\n Id: number;\r\n Name: string;\r\n Active?: boolean;\r\n Availability?: IAssetAvailabilityDto;\r\n ServiceId?: number | null;\r\n ServiceTypeId?: number | null;\r\n ServiceGroupId?: number | null;\r\n ServiceGroupName?: string | null;\r\n Image?: string;\r\n AssetCatId?: number | null;\r\n PrerequisiteFor?: number | null;\r\n BookableAsset?: boolean;\r\n ServiceGroupAssetId?: number | null;\r\n Color?: string;\r\n}\r\nexport const mapAssetsToServiceFilterDto = (\r\n assets: IAssetDto[],\r\n): IServiceFilterDto[] => {\r\n return assets.map(a => {\r\n return {\r\n Id: a.ServiceId,\r\n Name: a.Name,\r\n ServiceGroupId: a.ServiceGroupId,\r\n ServiceTypeId: a.ServiceTypeId,\r\n } as IServiceFilterDto;\r\n });\r\n};\r\nexport const mapAssetsToServiceTypeFilterDto = (\r\n assets: IAssetDto[],\r\n): IServiceTypeFilterDto[] => {\r\n return assets.map(a => {\r\n return {\r\n Id: a.ServiceId ?? 0,\r\n Name: a.Name,\r\n ServiceGroupId: a.ServiceGroupId ?? 0,\r\n ServiceTypeId: a.ServiceTypeId ?? 1,\r\n } as IServiceTypeFilterDto;\r\n });\r\n};\r\n","import { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { BudgetPicker } from '../pickers/AutocompletePickers/BudgetPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport const FormBudgetPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps & { useSearchOrPredicate?: boolean }) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n {\r\n props.onChange?.(value);\r\n helpers.setValue(value, true);\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n variant=\"filled\"\r\n predicates={props.predicates}\r\n useSearchOrPredicate={props.useSearchOrPredicate}\r\n info={props.info}\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * FormFundingTypePicker\r\n *\r\n */\r\n\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { FundingTypeIdPicker } from '../pickers/StaticOptionsPickers/FundingTypeIdPicker';\r\n\r\nexport const FormFundingTypePicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * auto generated interface for Bookit.Data.ServiceRequestMilestoneStatuses\r\n *\r\n */\r\n\r\nexport enum ServiceRequestMilestoneStatuses {\r\n NotStarted = 0,\r\n Started = 1,\r\n Completed = 2,\r\n}\r\nexport type ServiceRequestMilestoneStatusesUnion = keyof typeof ServiceRequestMilestoneStatuses;\r\nexport const ServiceRequestMilestoneStatusesUnionArray: Array = [\r\n 'NotStarted',\r\n 'Started',\r\n 'Completed',\r\n];\r\n","import { IRepairCodeDto } from 'api/odata/generated/entities/IRepairCodeDto';\r\nimport { ISymptomCodeDto } from 'api/odata/generated/entities/ISymptomCodeDto';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { AsyncDataState, Entity } from 'types/common';\r\nimport { toEntity } from 'utils/entity-utils';\r\nimport { GetIntervals, IRepetitiveDto } from 'types/IRepetitiveDto';\r\nimport { getSingleReminder } from 'app/components/pickers/StaticOptionsPickers/RemindBeforePicker';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { RepetitiveOptions } from 'enums/RepetitiveOptions';\r\nimport { RemindBefore } from 'enums/RemindBefore';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { Guid } from 'guid-typescript';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport { FieldHandlerProps } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport {\r\n PageTypeProps,\r\n RenderPageType,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\n//import { FieldHandlerProps } from 'app/components/Forms/FormRender/FormRenderer';\r\n\r\n/* --- STATE --- */\r\nexport interface WorkOrderState {\r\n createState: AsyncDataState;\r\n updateState: AsyncDataState;\r\n reservationOffline: AsyncDataState;\r\n processing: boolean;\r\n sendEmailOnOffline: boolean;\r\n readonlyState?: WorkOrderReadonlyState;\r\n updateAllRecurrent: boolean;\r\n valueHandler?: FieldHandlerProps;\r\n linksProcessing?: boolean;\r\n /**\r\n * Value used to change the offline event start from outside of the workorder details\r\n */\r\n OfflineEventStart?: Date | Timestamp | null;\r\n /**\r\n * Value used to change the offline event end from outside of the workorder details\r\n */\r\n OfflineEventEnd?: Date | Timestamp | null;\r\n doSaveNewComments?: boolean;\r\n createdOrders: number[];\r\n savedLinkedOrders: IWorkOrderDetailsDto[];\r\n calibrationsChanged?: boolean;\r\n downtimeOverlaps?: DowntimeOverlaps[];\r\n}\r\nexport interface WorkOrderResponse extends IResponseType {\r\n Id?: number;\r\n sendEmailOnOffline: boolean;\r\n RecurringAssetId: number | null;\r\n RecurringGroupId: number | null;\r\n WorkOrderTypeId: number | null;\r\n ReservationOffline: ReservationsOfflineData[];\r\n AutoCreatedOrders: AutoCreateResult[];\r\n}\r\nexport interface WorkOrderGlobalState {\r\n workOrderDetails: WorkOrderDetailsState;\r\n RepetitiveOptions: IRepetitiveDto | null;\r\n}\r\nexport interface WorkOrderDetailsState {\r\n Id: number;\r\n Assets: Entity[];\r\n WorkOrderType: Entity | null;\r\n WorkOrderTypeStatus: Entity | null;\r\n SymptomCodes: Entity[];\r\n RepairCodes: Entity[];\r\n RemindBefore: Entity | null;\r\n EventStart: Date | Timestamp;\r\n EventEnd?: Date | Timestamp | null;\r\n AlertStart?: Date | Timestamp | null;\r\n AssignUsers: Entity[];\r\n Description?: string | null;\r\n Downtime?: boolean;\r\n ToDown: boolean;\r\n OfflineEventStart?: Date | Timestamp | null;\r\n OfflineEventEnd?: Date | Timestamp | null;\r\n ReasonType?: Entity | null;\r\n OfflineRemarks?: string | null;\r\n AlertTitle?: string | null;\r\n AutoCreateTitle?: string | null;\r\n RecurringAssetId: number | null;\r\n RecurringGroupId: number | null;\r\n SubmissionFormValues: IFormValueDto[];\r\n StaffFormValues: IFormValueDto[];\r\n SubmissionFormFiles: IFormFileValue[];\r\n StaffFormFiles: IFormFileValue[];\r\n StuffCustomForm: Entity | null;\r\n HasAletForm: boolean;\r\n IsClosed: boolean;\r\n ClosedStatuses: Entity[];\r\n ReportedBy?: string | null;\r\n ShowOnCalibrationHistory: boolean;\r\n NotEditable: boolean;\r\n ReservationId: number | null;\r\n}\r\nexport interface SendEmailOnOffline {\r\n cancel: boolean;\r\n deleted: boolean;\r\n insert: boolean;\r\n sendData: ReservationsOfflineData[];\r\n}\r\nexport interface ReservationsOfflineData {\r\n AlertId: number;\r\n offStart: Date | string;\r\n offEnd: Date | string;\r\n ReasonName: string;\r\n Remarks: string;\r\n reservationIds: string;\r\n}\r\nexport interface AutoCreateResult {\r\n AlertId: number;\r\n Date: Date;\r\n}\r\nexport interface WorkOrderReadonlyState {\r\n AlertType: string | null;\r\n UpdateUser: IUserFilterDto;\r\n StatusName: string | null;\r\n ReportedBy: string | null;\r\n ReportedByDisplayName: string | null;\r\n LastUpdated: Date | Timestamp | null;\r\n Reservation: number | null;\r\n LastComment: string | null;\r\n LastCommentBy: string | null;\r\n AssetCatName: string | null;\r\n AssetCatGroupName: string | null;\r\n IsClosed: boolean | null;\r\n ReservationBookedBy: string;\r\n ReservationUserGroup: string;\r\n ReservationInstituteId: number | null;\r\n DoneDate: Date | Timestamp | null;\r\n DoneBy: string | null;\r\n InternalServiceAvaliable: boolean;\r\n CreateDate: Date | Timestamp | null;\r\n LinkedAlerts: Entity[];\r\n}\r\nexport interface WorkOrderQueryStringParameters {\r\n id?: string;\r\n aType?: string;\r\n down?: string;\r\n source?: string;\r\n Up?: string;\r\n title?: string;\r\n eStart?: string;\r\n sympt?: string;\r\n aStatus?: string;\r\n aStart?: string;\r\n desc?: string;\r\n assetId?: string;\r\n offH?: string;\r\n offStart?: string;\r\n offEnd?: string;\r\n reason?: string;\r\n eqid?: string;\r\n sid?: string;\r\n defaultMulti?: string;\r\n continueTo?: string;\r\n reservationId?: string;\r\n}\r\nexport interface WorkOrderDates {\r\n start: Date[];\r\n end: Date[];\r\n alert: Date[];\r\n offlineStart: Date[];\r\n offlineEnd: Date[];\r\n}\r\n\r\nexport interface ContinueToState {\r\n pageType?: RenderPageType;\r\n pageProps?: PageTypeProps;\r\n continueToLink?: string;\r\n}\r\nexport interface DowntimeOverlaps {\r\n Id: number;\r\n AssetId: number;\r\n ServiceId: number;\r\n}\r\nexport function ConvertEntityToModel(\r\n entity: IWorkOrderDetailsDto,\r\n toDown: boolean | undefined,\r\n): WorkOrderDetailsState | undefined {\r\n if (!entity) {\r\n return undefined;\r\n } else {\r\n const result: WorkOrderDetailsState = {\r\n Id: entity.Id,\r\n AlertStart: entity.AlertStart,\r\n Assets: entity.Assets,\r\n AssignUsers: entity.AssignedUsers,\r\n Description: entity.AlertDescription,\r\n Downtime: entity.InstrumentWasDown,\r\n EventEnd: entity.EventEnd,\r\n EventStart: entity.EventStart,\r\n // convert dates (timestamps) received from the API to Date objects\r\n OfflineEventEnd: entity.OfflineEventEnd,\r\n OfflineEventStart: entity.OfflineEventStart,\r\n OfflineRemarks: entity.OfflineRemarks,\r\n\r\n ReasonType: toEntity(entity.ReasonTypeId, entity.ReasonTypeName),\r\n RemindBefore: getSingleReminder(entity.RemindMeBefore),\r\n WorkOrderType: entity.WorkOrderType, //toEntity(entity.AlertTypeId, entity.AlertType),\r\n WorkOrderTypeStatus: toEntity(entity.StatusId, entity.StatusName),\r\n RepairCodes: entity.RepairCodes as IRepairCodeDto[],\r\n SymptomCodes: entity.SymptomCodes as ISymptomCodeDto[],\r\n AlertTitle: entity.AlertTitle,\r\n ToDown: toDown || false,\r\n RecurringAssetId: entity.RecurringAssetId,\r\n RecurringGroupId: entity.RecurringGroupId,\r\n AutoCreateTitle: entity.AutoCreateTitle,\r\n StaffFormValues: entity.FormValues.filter(\r\n fv => fv.AlertId !== null && fv.AlertTypeId === null,\r\n ),\r\n SubmissionFormValues: entity.FormValues.filter(\r\n fv => fv.AlertId !== null && fv.AlertTypeId !== null,\r\n ),\r\n StaffFormFiles: [] as IFormFileValue[],\r\n SubmissionFormFiles: [] as IFormFileValue[],\r\n StuffCustomForm: entity.CustomForm as Entity | null,\r\n HasAletForm: entity.HasAletForm,\r\n IsClosed: entity.IsClosed ?? false,\r\n ClosedStatuses: entity.ClosedStatuses,\r\n ReportedBy: entity.ReportedBy,\r\n ShowOnCalibrationHistory: (entity.WorkOrderType as IWorkOrderTypeDto)\r\n .ShowOnCalibrationHistory,\r\n NotEditable: (entity.WorkOrderType as IWorkOrderTypeDto).NotEditable,\r\n ReservationId: entity.Reservation,\r\n } as WorkOrderDetailsState;\r\n return result;\r\n }\r\n}\r\nexport function parseRepetitive(\r\n model: WorkOrderDetailsState,\r\n repetitive: IRepetitiveDto,\r\n): WorkOrderDates {\r\n const dates: WorkOrderDates = {\r\n start: [],\r\n end: [],\r\n alert: [],\r\n offlineStart: [],\r\n offlineEnd: [],\r\n };\r\n let start = dateUtils.dateOrStringToDate(model.EventStart);\r\n dates.start = GetIntervals(start, repetitive);\r\n if (!isNullOrUndefined(model.EventEnd)) {\r\n let end = dateUtils.dateOrStringToDate(model.EventEnd);\r\n dates.end = dates.start.map(s => {\r\n if (s === start) {\r\n return end;\r\n } else {\r\n let dur = dateUtils.intervalToDuration({\r\n start: start,\r\n end: s,\r\n });\r\n return dateUtils.add(end, dur);\r\n }\r\n });\r\n }\r\n if (!isNullOrUndefined(model.AlertStart)) {\r\n // start = dateUtils.dateOrStringToDate(model.AlertStart);\r\n // dates.alert = GetIntervals(start, repetitive);\r\n let alertStart = dateUtils.dateOrStringToDate(model.AlertStart);\r\n // let alertDuration = dateUtils.intervalToDuration({\r\n // start: start,\r\n // end: alertStart,\r\n // });\r\n dates.alert = dates.start.map(s => {\r\n if (s === start) {\r\n return alertStart;\r\n } else {\r\n let dur = dateUtils.intervalToDuration({\r\n start: start,\r\n end: s,\r\n });\r\n return dateUtils.add(alertStart, dur);\r\n }\r\n });\r\n }\r\n if (!isNullOrUndefined(model.OfflineEventStart)) {\r\n // start = dateUtils.dateOrStringToDate(model.OfflineEventStart);\r\n // dates.offlineStart = GetIntervals(start, repetitive);\r\n let offStart = dateUtils.dateOrStringToDate(model.OfflineEventStart);\r\n dates.offlineStart = dates.start.map(s => {\r\n if (s === start) {\r\n return offStart;\r\n } else {\r\n let dur = dateUtils.intervalToDuration({\r\n start: start,\r\n end: s,\r\n });\r\n return dateUtils.add(offStart, dur);\r\n }\r\n });\r\n }\r\n if (!isNullOrUndefined(model.OfflineEventEnd)) {\r\n let offend = dateUtils.dateOrStringToDate(model.OfflineEventEnd);\r\n dates.offlineEnd = dates.start.map(s => {\r\n if (s === start) {\r\n return offend;\r\n } else {\r\n let dur = dateUtils.intervalToDuration({\r\n start: start,\r\n end: s,\r\n });\r\n return dateUtils.add(offend, dur);\r\n }\r\n });\r\n }\r\n return dates;\r\n}\r\nexport function ConvertNewWorkOrdersToModel(\r\n model: WorkOrderGlobalState,\r\n user: AuthenticatedUser | undefined,\r\n): IWorkOrderDetailsDto[] {\r\n let entities = [] as IWorkOrderDetailsDto[];\r\n let workModel = model.workOrderDetails;\r\n let repeat =\r\n model.RepetitiveOptions !== null &&\r\n model.RepetitiveOptions.RecurringEndDate !== null &&\r\n model.RepetitiveOptions.RecurringEvents != null &&\r\n model.RepetitiveOptions.RecurringEvents.Id !== RepetitiveOptions.DoNotRepeat\r\n ? model.RepetitiveOptions\r\n : null;\r\n let repeatAsset = workModel.Assets.length > 1;\r\n let times = repeat ? parseRepetitive(model.workOrderDetails, repeat) : null;\r\n let assetGuid: Guid | null =\r\n workModel.Assets.length > 1 ? Guid.create() : null;\r\n workModel.Assets.forEach(ass => {\r\n let asset = ass as IAssetDto;\r\n if (repeat !== null && times !== null) {\r\n let timesGuid = Guid.create();\r\n times.start.forEach((date, idx) => {\r\n entities.push(({\r\n Id: -1,\r\n EventStart: dateUtils.formatISO(date),\r\n EventEnd: isNullOrUndefined(times?.end[idx])\r\n ? null\r\n : dateUtils.tryFormatIso(times?.end[idx]),\r\n AlertDescription: workModel.Description || null,\r\n AlertStart: isNullOrUndefined(times?.alert[idx])\r\n ? null\r\n : dateUtils.tryFormatIso(times?.alert[idx]),\r\n\r\n AlertTitle: workModel.AlertTitle,\r\n AlertTypeId: workModel.WorkOrderType?.Id ?? -1,\r\n StatusId: workModel.WorkOrderTypeStatus?.Id,\r\n AssetId: asset.Id,\r\n ServiceId: asset.ServiceId,\r\n ServiceTypeId: asset.ServiceTypeId,\r\n ServiceGroupId: asset.ServiceGroupId,\r\n AssignedUsers: workModel.AssignUsers as IUserFilterDto[],\r\n OfflineEventStart: isNullOrUndefined(times?.offlineStart[idx])\r\n ? null\r\n : dateUtils.tryFormatIso(times?.offlineStart[idx]),\r\n OfflineEventEnd:\r\n workModel.OfflineEventStart !== null &&\r\n workModel.Downtime &&\r\n isNullOrUndefined(workModel.OfflineEventEnd)\r\n ? dateUtils.formatISO(MaxDate)\r\n : dateUtils.tryFormatIso(times?.offlineEnd[idx]),\r\n OfflineRemarks: workModel.OfflineRemarks,\r\n ReasonTypeId: workModel.ReasonType?.Id,\r\n ReasonTypeName: workModel.ReasonType?.Name,\r\n InstrumentWasDown: workModel.Downtime ?? false,\r\n Repeat: true,\r\n RepeatAssets: repeatAsset,\r\n RepeatEndTime: repeat?.RecurringEndDate,\r\n RepairCodes: workModel.RepairCodes as IRepairCodeDto[],\r\n SymptomCodes: workModel.SymptomCodes as ISymptomCodeDto[],\r\n RecurringAssetUniq: assetGuid?.toString() ?? null,\r\n RecurringGroupUniq: timesGuid?.toString() ?? null,\r\n FormValues: workModel.SubmissionFormValues.concat(\r\n workModel.StaffFormValues,\r\n ),\r\n Reservation: workModel.ReservationId,\r\n ReportedBy: user?.Id,\r\n StaffOnly: (workModel.WorkOrderType as IWorkOrderTypeDto).StaffOnly,\r\n ShowOnCalibrationHistory: (workModel.WorkOrderType as IWorkOrderTypeDto)\r\n .ShowOnCalibrationHistory,\r\n NotEditable: (workModel.WorkOrderType as IWorkOrderTypeDto)\r\n .NotEditable,\r\n } as unknown) as IWorkOrderDetailsDto);\r\n });\r\n } else {\r\n entities.push({\r\n Id: -1,\r\n EventStart: dateUtils.tryFormatIso(workModel.EventStart),\r\n AlertDescription: workModel.Description || null,\r\n AlertStart: isNullOrUndefined(workModel.AlertStart)\r\n ? null\r\n : dateUtils.tryFormatIso(workModel.AlertStart),\r\n AlertTitle: workModel.AlertTitle,\r\n AlertTypeId: workModel.WorkOrderType?.Id ?? -1,\r\n StatusId: workModel.WorkOrderTypeStatus?.Id,\r\n AssetId: ass.Id,\r\n ServiceId: asset.ServiceId,\r\n ServiceTypeId: asset.ServiceTypeId,\r\n ServiceGroupId: asset.ServiceGroupId,\r\n AssignedUsers: workModel.AssignUsers as IUserFilterDto[],\r\n OfflineEventStart: isNullOrUndefined(\r\n workModel.OfflineEventStart,\r\n )\r\n ? null\r\n : dateUtils.tryFormatIso(workModel.OfflineEventStart),\r\n OfflineEventEnd:\r\n workModel.OfflineEventStart !== null &&\r\n workModel.Downtime &&\r\n isNullOrUndefined(workModel.OfflineEventEnd)\r\n ? dateUtils.formatISO(MaxDate)\r\n : isNullOrUndefined(workModel.OfflineEventEnd)\r\n ? null\r\n : dateUtils.tryFormatIso(workModel.OfflineEventEnd),\r\n OfflineRemarks: workModel.OfflineRemarks,\r\n ReasonTypeId: workModel.ReasonType?.Id,\r\n ReasonTypeName: workModel.ReasonType?.Name,\r\n InstrumentWasDown: workModel.Downtime ?? false,\r\n Repeat: false,\r\n RepeatAssets: repeatAsset,\r\n RepairCodes: workModel.RepairCodes as IRepairCodeDto[],\r\n SymptomCodes: workModel.SymptomCodes as ISymptomCodeDto[],\r\n RecurringAssetUniq: assetGuid?.toString() ?? null,\r\n RecurringGroupUniq: null,\r\n FormValues: workModel.SubmissionFormValues.concat(\r\n workModel.StaffFormValues,\r\n ),\r\n Reservation: workModel.ReservationId,\r\n ReportedBy: user?.Id,\r\n StaffOnly: (workModel.WorkOrderType as IWorkOrderTypeDto).StaffOnly,\r\n ShowOnCalibrationHistory: (workModel.WorkOrderType as IWorkOrderTypeDto)\r\n .ShowOnCalibrationHistory,\r\n NotEditable: (workModel.WorkOrderType as IWorkOrderTypeDto).NotEditable,\r\n } as IWorkOrderDetailsDto);\r\n }\r\n });\r\n return entities;\r\n}\r\nexport function ConvertModelToEntity(\r\n model: WorkOrderDetailsState,\r\n original: WorkOrderDetailsState | undefined,\r\n): IWorkOrderDetailsDto {\r\n let entity = {\r\n Id: original?.Id === undefined ? model.Id : original.Id,\r\n AlertDescription: model.Description,\r\n AlertStart: isNullOrUndefined(model.AlertStart)\r\n ? null\r\n : dateUtils.formatISO(dateUtils.dateOrStringToDate(model.AlertStart)),\r\n AlertTitle: model.AlertTitle,\r\n AlertTypeId: model.WorkOrderType?.Id ?? -1,\r\n AlertType: model.WorkOrderType?.Name,\r\n StatusId: model.WorkOrderTypeStatus?.Id,\r\n StatusName: model.WorkOrderTypeStatus?.Name,\r\n AssetId: model.Assets[0].Id,\r\n AssetName: model.Assets[0].Name,\r\n AssignedUsers: model.AssignUsers as IUserFilterDto[],\r\n EventStart: isNullOrUndefined(model.EventStart)\r\n ? null\r\n : dateUtils.formatISO(dateUtils.dateOrStringToDate(model.EventStart)),\r\n OfflineEventStart: isNullOrUndefined(\r\n model.OfflineEventStart,\r\n )\r\n ? null\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.OfflineEventStart),\r\n ),\r\n OfflineEventEnd:\r\n !isNullOrUndefined(model.OfflineEventStart) &&\r\n model.Downtime\r\n ? isNullOrUndefined(model.OfflineEventEnd)\r\n ? dateUtils.formatISO(MaxDate)\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.OfflineEventEnd),\r\n )\r\n : null,\r\n OfflineRemarks: model.OfflineRemarks,\r\n RemindMeBefore: model.RemindBefore?.Id,\r\n InstrumentWasDown: model.Downtime || false,\r\n ReasonTypeId: model.ReasonType?.Id,\r\n ReasonTypeName: model.ReasonType?.Name,\r\n RepairCodes: model.RepairCodes as IRepairCodeDto[],\r\n SymptomCodes: model.SymptomCodes as ISymptomCodeDto[],\r\n ServiceGroupId: (model.Assets[0] as IAssetDto).ServiceGroupId,\r\n ServiceId: (model.Assets[0] as IAssetDto).ServiceId,\r\n ServiceTypeId: (model.Assets[0] as IAssetDto).ServiceTypeId,\r\n RecurringAssetId: model.RecurringAssetId,\r\n RecurringGroupId: model.RecurringGroupId,\r\n Repeat: model.RecurringGroupId !== null,\r\n RepeatAssets: model.RecurringAssetId !== null,\r\n FormValues: model.SubmissionFormValues.concat(model.StaffFormValues),\r\n ReportedBy: model.ReportedBy,\r\n Reservation: model.ReservationId,\r\n ShowOnCalibrationHistory: (model.WorkOrderType as IWorkOrderTypeDto)\r\n .ShowOnCalibrationHistory,\r\n NotEditable: (model.WorkOrderType as IWorkOrderTypeDto).NotEditable,\r\n } as IWorkOrderDetailsDto;\r\n\r\n return entity;\r\n}\r\nexport const getAlertStart = (\r\n remindBefore: number,\r\n Start: Date | Timestamp,\r\n): Date | Timestamp | null => {\r\n let alertStart: Date | null = new Date();\r\n switch (remindBefore as RemindBefore) {\r\n case RemindBefore.doNotNotify:\r\n alertStart = null;\r\n break;\r\n case RemindBefore.oneday:\r\n alertStart = dateUtils.addDays(dateUtils.dateOrStringToDate(Start), -1);\r\n break;\r\n case RemindBefore.twodays:\r\n alertStart = dateUtils.addDays(dateUtils.dateOrStringToDate(Start), -2);\r\n break;\r\n case RemindBefore.threedays:\r\n alertStart = dateUtils.addDays(dateUtils.dateOrStringToDate(Start), -3);\r\n break;\r\n case RemindBefore.oneweek:\r\n alertStart = dateUtils.addDays(dateUtils.dateOrStringToDate(Start), -7);\r\n break;\r\n case RemindBefore.onemonth:\r\n alertStart = dateUtils.addMonths(dateUtils.dateOrStringToDate(Start), -1);\r\n break;\r\n default:\r\n alertStart = dateUtils.addDays(dateUtils.dateOrStringToDate(Start), -1);\r\n break;\r\n }\r\n return alertStart;\r\n};\r\n\r\nexport const MaxDate: Date = dateUtils.set(new Date(), {\r\n year: 9999,\r\n month: 11,\r\n date: 31,\r\n hours: 0,\r\n minutes: 0,\r\n seconds: 0,\r\n});\r\n","import { IRow } from 'app/components/BasicTable';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { SearchColumnType } from 'app/components/BasicTable/BasicTableProps';\r\nimport { isEmpty } from 'lodash';\r\nimport { SortingRule } from 'react-table';\r\nimport { Entity } from 'types/common';\r\nimport { getPredicates } from './getPredicates';\r\nimport { Condition, ODataFilterBuilder, ODataOperators } from './ODataFilter';\r\n\r\nexport const buildParams = (\r\n state: {\r\n pageSize: number;\r\n pageIndex: number;\r\n sortBy?: SortingRule[] | null;\r\n globalFilterValue?: string;\r\n customFilter: IFilterSettings[];\r\n select: Array;\r\n additionalColumns?: Array;\r\n serviceGroups: Entity[];\r\n isOptionalServiceGroup: boolean;\r\n expandedColumns?: Array;\r\n predicates?: Array | string>;\r\n },\r\n searchColumns?: Array>,\r\n customParams?: (fieldName: string, Id: number, fn: (p: {}) => void) => void,\r\n isExport?: boolean,\r\n) => {\r\n const params: {\r\n $skip: number;\r\n $top: number;\r\n $count: boolean;\r\n $select: string;\r\n $orderby?: string;\r\n $filter?: string;\r\n $expand?: string;\r\n } = {\r\n $skip: state.pageIndex * state.pageSize,\r\n $top: state.pageSize,\r\n // adds inline count of all records\r\n $count: true,\r\n // definition of columns required\r\n $select: isExport\r\n ? state.select.join(',')\r\n : [\r\n ...new Set([...state.select, ...(state.additionalColumns ?? [])]),\r\n ].join(','),\r\n };\r\n const expaneded = state.expandedColumns?.filter(\r\n c => state.select.includes(c) || state.additionalColumns?.includes(c),\r\n );\r\n\r\n if (expaneded && expaneded.length > 0) {\r\n params.$expand = expaneded.join(',');\r\n }\r\n const customparams = {};\r\n function cp(p: {}) {\r\n Object.assign(customparams, p);\r\n }\r\n\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: [\r\n ...(state.predicates ?? []),\r\n ...getPredicates(state.customFilter, customParams, cp),\r\n ],\r\n globalServiceGroupFilter:\r\n state.serviceGroups === undefined || state.serviceGroups.length === 0\r\n ? undefined\r\n : state.additionalColumns?.find(f => f === 'ServiceGroupId') !==\r\n undefined ||\r\n state.select.find(f => f === 'ServiceGroupId') !== undefined\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n state.serviceGroups,\r\n ),\r\n ]\r\n : state.additionalColumns?.find(f => f === 'ServiceGroups') !==\r\n undefined ||\r\n state.select.find(f => f === 'ServiceGroups') !== undefined\r\n ? [\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n state.serviceGroups,\r\n 'Id',\r\n ),\r\n ]\r\n : undefined,\r\n stringColumns: searchColumns || [],\r\n stringSearch: state.globalFilterValue,\r\n isOptionalServiceGroup: state.isOptionalServiceGroup,\r\n }).toString();\r\n\r\n // sort parameter should be present only if sorting is defined\r\n // empty $orderby is considered a bad request\r\n if (!isEmpty(state?.sortBy)) {\r\n params.$orderby = state.sortBy\r\n ?.map(f => `${f.id} ${f.desc ?? false ? 'desc' : 'asc'}`)\r\n .join(',');\r\n }\r\n Object.assign(params, customparams);\r\n return params;\r\n};\r\n","import { Box, createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\n\r\nexport interface BulletedListItem {\r\n key: React.Key | null | undefined;\r\n node: React.ReactNode;\r\n}\r\nexport interface BulletedListProps {\r\n items: BulletedListItem[];\r\n showBullet?: boolean;\r\n}\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n '&': {\r\n listStyle: 'none',\r\n },\r\n '& li:before': {\r\n content: \"'•'\",\r\n color: theme.palette.primary.main,\r\n fontWeight: 'bold',\r\n display: 'inline-block',\r\n width: '1em',\r\n marginLeft: '-1em',\r\n },\r\n },\r\n }),\r\n);\r\n\r\nconst bulletedStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n rows: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n margin: 0,\r\n gap: '8px',\r\n flexGrow: 1,\r\n overflowY: 'auto',\r\n overflowX: 'clip',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n height: 'auto', // isMobile ? '90px' : `${cardcurrentHeight - (84 + 64)}px`,\r\n maxHeight: 200,\r\n },\r\n row: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: 8,\r\n height: 25,\r\n // width: '100%',\r\n },\r\n rowOverRule: {\r\n display: 'flex',\r\n width: '100%',\r\n whiteSpace: 'pre',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: '23ch',\r\n },\r\n }),\r\n);\r\nexport const StyledList = ({\r\n children,\r\n className,\r\n style,\r\n}: React.PropsWithChildren<{\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}>) => {\r\n const classes = useStyles();\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\nexport const SimpleList = ({\r\n children,\r\n className,\r\n style,\r\n}: React.PropsWithChildren<{\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}>) => {\r\n return (\r\n
    \r\n {children}\r\n
\r\n );\r\n};\r\nexport const BulletedList = (props: BulletedListProps) => {\r\n const classes = bulletedStyles();\r\n const { items, showBullet = true } = props;\r\n return (\r\n \r\n {items.map(c => {\r\n return (\r\n
  • \r\n {showBullet && (\r\n \r\n )}\r\n \r\n {c.node}\r\n \r\n
  • \r\n );\r\n })}\r\n
    \r\n );\r\n};\r\n","import { cyan } from '@material-ui/core/colors';\r\n\r\ninterface InfoColors {\r\n colorInfoFull: string;\r\n colorInfoDark: string;\r\n colorInfoHover: string;\r\n colorInfoRegular: string;\r\n colorInfoComponents: string;\r\n colorInfoComponentsLight: string;\r\n colorInfoBorders: string;\r\n colorInfoDisabled: string;\r\n colorInfoBgHover: string;\r\n colorInfoBg: string;\r\n colorInfoBgLight: string;\r\n}\r\nconst infoColors: InfoColors = {\r\n colorInfoFull: cyan[900],\r\n colorInfoDark: cyan[900],\r\n colorInfoHover: cyan[800],\r\n colorInfoRegular: cyan[700],\r\n colorInfoComponents: cyan[600],\r\n colorInfoComponentsLight: cyan[500],\r\n colorInfoBorders: cyan[400],\r\n colorInfoDisabled: cyan[300],\r\n colorInfoBgHover: cyan[200],\r\n colorInfoBg: cyan[100],\r\n colorInfoBgLight: cyan[50],\r\n};\r\n\r\nexport default infoColors;\r\n","import { StyleRules } from '@material-ui/styles';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { buttonS } from 'styles/typography/bookitTypography';\r\n\r\nexport const MuiButtonOverride = {\r\n root: {\r\n ...buttonS,\r\n textTransform: 'none',\r\n display: 'inline-flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: '10px',\r\n flexShrink: 1,\r\n boxShadow: 'unset',\r\n lineHeight: 'normal',\r\n border: '1px solid transparent',\r\n padding: '4px 16px',\r\n minWidth: '40px',\r\n height: '40px',\r\n '&.variantMain': {\r\n backgroundColor: bookitColors.primary.regular,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.hover,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.primary.disabled,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&.variantText': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.regular,\r\n padding: '0px',\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.hover,\r\n textDecoration: 'underline',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n '&.variantTextgray': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.graySubtitles,\r\n padding: '0px',\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.blackComponents,\r\n textDecoration: 'underline',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n '&.variantGray': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.grayscale.blackRegular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.regular,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantAccent': {\r\n backgroundColor: bookitColors.grayscale.graySubtitles,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.grayscale.blackRegular,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantDanger': {\r\n backgroundColor: bookitColors.danger.regular,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.danger.hover,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.danger.disabled,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&.variantWhite': {\r\n backgroundColor: bookitColors.base.white,\r\n color: bookitColors.grayscale.blackRegular,\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n border: '1px solid transparent',\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n border: '1px solid transparent',\r\n },\r\n },\r\n '&.variantGhostcolor': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.primary.regular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantGhost': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.blackRegular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '& .buttonLabel': {\r\n height: '18px',\r\n whiteSpace: 'nowrap',\r\n },\r\n },\r\n contained: {\r\n borderRadius: '8px',\r\n boxShadow: 'none',\r\n color: bookitColors.grayscale.blackRegular,\r\n padding: '4px 16px',\r\n minWidth: '40px',\r\n height: '40px',\r\n '&.hasStartIcon.hasEndIcon': {\r\n padding: '4px 12px',\r\n },\r\n '&.hasStartIcon': {\r\n padding: '4px 16px 4px 12px',\r\n },\r\n '&.hasEndIcon': {\r\n padding: '4px 12px 4px 16px',\r\n },\r\n '&:hover': {\r\n backgroundColor: 'initial',\r\n boxShadow: 'unset',\r\n '@media (hover: none)': {\r\n boxShadow: 'unset',\r\n backgroundColor: 'initial',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'initial',\r\n },\r\n },\r\n '&$focusVisible': {\r\n boxShadow: 'unset',\r\n },\r\n '&:active': {\r\n boxShadow: 'unset',\r\n },\r\n '&$disabled': {\r\n boxShadow: 'unset',\r\n // color: theme.palette.action.disabled,\r\n // boxShadow: theme.shadows[0],\r\n // backgroundColor: theme.palette.action.disabledBackground\r\n },\r\n '&.variantMain': {\r\n backgroundColor: bookitColors.primary.regular,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.hover,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.primary.disabled,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&.variantText': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.regular,\r\n padding: '0px',\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.hover,\r\n textDecoration: 'underline',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n '&.variantTextgray': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.graySubtitles,\r\n padding: '0px',\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.blackComponents,\r\n textDecoration: 'underline',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n '&.variantGray': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.grayscale.blackRegular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.regular,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantAccent': {\r\n backgroundColor: bookitColors.grayscale.graySubtitles,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.grayscale.blackRegular,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantDanger': {\r\n backgroundColor: bookitColors.danger.regular,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.danger.hover,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.danger.disabled,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&.variantWhite': {\r\n backgroundColor: bookitColors.base.white,\r\n color: bookitColors.grayscale.blackRegular,\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n border: '1px solid transparent',\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n border: '1px solid transparent',\r\n },\r\n },\r\n '&.variantGhostcolor': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.primary.regular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantGhost': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.blackRegular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n },\r\n containedSizeSmall: {\r\n borderRadius: '6px',\r\n padding: '4px 12px',\r\n minWidth: '32px',\r\n height: '32px',\r\n '&.hasStartIcon.hasEndIcon': {\r\n padding: '4px 8px',\r\n },\r\n '&.hasStartIcon': {\r\n padding: '4px 12px 4px 8px',\r\n },\r\n '&.hasEndIcon': {\r\n padding: '4px 8px 4px 12px',\r\n },\r\n },\r\n containedSizeLarge: {\r\n minWidth: '48px',\r\n height: '48px',\r\n borderRadius: '8px',\r\n padding: '4px 20px',\r\n '&.hasStartIcon.hasEndIcon': {\r\n padding: '4px 16px',\r\n },\r\n '&.hasStartIcon': {\r\n padding: '4px 20px 4px 16px',\r\n },\r\n '&.hasEndIcon': {\r\n padding: '4px 16px 4px 20px',\r\n },\r\n },\r\n label: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '0px',\r\n margin: 0,\r\n gap: '8px',\r\n },\r\n startIcon: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n flex: 'none',\r\n order: 0,\r\n flexGrow: 0,\r\n margin: 0,\r\n marginLeft: 0,\r\n marginRight: 0,\r\n '&$iconSizeSmall': {\r\n marginLeft: 0,\r\n },\r\n },\r\n endIcon: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n flex: 'none',\r\n order: 2,\r\n flexGrow: 0,\r\n margin: 0,\r\n marginLeft: 0,\r\n marginRight: 0,\r\n '&$iconSizeSmall': {\r\n marginRight: 0,\r\n },\r\n },\r\n text: {\r\n padding: '0px',\r\n height: '20px',\r\n },\r\n textSizeSmall: {\r\n fontSize: '14px',\r\n height: '17px',\r\n },\r\n textSizeLarge: {\r\n fontSize: '14px',\r\n height: '23px',\r\n },\r\n sizeSmall: {},\r\n sizeLarge: {\r\n '&>[class*=\"MuiButton-label\"]': {\r\n gap: '12px',\r\n },\r\n },\r\n iconSizeMedium: {\r\n fontSize: '16px',\r\n '&>:first-child': {\r\n fontSize: '16px',\r\n width: '16px',\r\n height: '16px',\r\n },\r\n },\r\n iconSizeLarge: {\r\n fontSize: '14px',\r\n '&>:first-child': {\r\n fontSize: '14px',\r\n width: '14px',\r\n height: '14px',\r\n },\r\n },\r\n iconSizeSmall: {\r\n fontSize: '14px',\r\n '&>:first-child': {\r\n fontSize: '14px',\r\n width: '14px',\r\n height: '14px',\r\n },\r\n },\r\n} as Partial;\r\nexport const MuiIconButtonOverride = {\r\n root: {\r\n display: 'inline-flex',\r\n flexDirection: 'row',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: '10px',\r\n padding: '0px',\r\n border: '1px solid transparent',\r\n '&.variantMain': {\r\n backgroundColor: bookitColors.primary.regular,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.hover,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.primary.disabled,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&.variantText': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.regular,\r\n padding: '0px',\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.hover,\r\n textDecoration: 'underline',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n '&.variantTextgray': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.graySubtitles,\r\n padding: '0px',\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.blackComponents,\r\n textDecoration: 'underline',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n '&.variantGray': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.grayscale.blackRegular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.regular,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantAccent': {\r\n backgroundColor: bookitColors.grayscale.graySubtitles,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.grayscale.blackRegular,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantDanger': {\r\n backgroundColor: bookitColors.danger.regular,\r\n color: bookitColors.base.white,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.danger.hover,\r\n color: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.danger.disabled,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&.variantWhite': {\r\n backgroundColor: bookitColors.base.white,\r\n color: bookitColors.grayscale.blackRegular,\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n border: '1px solid transparent',\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n border: '1px solid transparent',\r\n },\r\n },\r\n '&.variantGhostcolor': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.primary.regular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantGhost': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.blackRegular,\r\n '&:hover, &:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'unset',\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.iconSizeLarge': {\r\n width: '48px',\r\n height: '48px',\r\n fontSize: '16px',\r\n '&.shapeSquare': {\r\n borderRadius: '8px',\r\n },\r\n },\r\n '&.iconSizeMedium': {\r\n width: '40px',\r\n height: '40px',\r\n fontSize: '16px',\r\n '&.shapeSquare': {\r\n borderRadius: '8px',\r\n },\r\n },\r\n '&.iconSizeSmall': {\r\n width: '32px',\r\n height: '32px',\r\n fontSize: '14px',\r\n '&.shapeSquare': {\r\n borderRadius: '6px',\r\n },\r\n },\r\n '&.iconSizeXs': {\r\n width: '24px',\r\n height: '24px',\r\n fontSize: '14px',\r\n padding: '4px 11px 4px 11px',\r\n '&.shapeSquare': {\r\n borderRadius: '4px',\r\n },\r\n },\r\n '&.shapeCircle': {\r\n borderRadius: '50%',\r\n },\r\n },\r\n label: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: '12px',\r\n cursor: 'pointer',\r\n },\r\n} as Partial;\r\nexport const MuiToggleButtonGroupOverride = {\r\n root: {\r\n display: 'inline-flex',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n gap: '0px',\r\n backgroundColor: 'transparent',\r\n '&.variantMain': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n },\r\n '&.variantText': {\r\n padding: '0px',\r\n },\r\n '&.variantTextgray': {\r\n padding: '0px',\r\n },\r\n '&.variantGray': {\r\n backgroundColor: bookitColors.primary.bgLight,\r\n },\r\n '&.variantAccent': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n },\r\n '&.variantDanger': {\r\n backgroundColor: bookitColors.danger.background,\r\n },\r\n '&.variantWhite': {\r\n backgroundColor: bookitColors.base.white,\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n },\r\n '&.separated': {\r\n gap: '8px',\r\n },\r\n '&.variantGhostcolor': {\r\n '&.separated': {\r\n padding: '0px',\r\n },\r\n },\r\n '&.variantGhost': {\r\n '&.separated': {\r\n padding: '0px',\r\n },\r\n },\r\n '&.sizeLarge': {\r\n borderRadius: '12px',\r\n '&.separated': {\r\n padding: '4px',\r\n gap: '4px',\r\n },\r\n },\r\n '&.sizeMedium': {\r\n borderRadius: '10px',\r\n '&.separated': {\r\n padding: '3px',\r\n gap: '3px',\r\n },\r\n },\r\n '&.sizeSmall': {\r\n borderRadius: '8px',\r\n '&.separated': {\r\n padding: '1px',\r\n gap: '1px',\r\n },\r\n },\r\n '&.errorBorder': {\r\n borderColor: bookitColors.danger.regular,\r\n },\r\n '&.fullWidth': {\r\n width: '100%',\r\n },\r\n },\r\n grouped: {\r\n '&.fullWidthButton': {\r\n flex: '1',\r\n },\r\n },\r\n /* Styles applied to the children if `orientation=\"horizontal\"`. */\r\n groupedHorizontal: {\r\n '&:not(:first-child)': {\r\n marginLeft: '0px', //props => (props.variant === 'white' ? 0 : -1),\r\n borderLeft: '1px solid transparent',\r\n borderTopLeftRadius: 0,\r\n borderBottomLeftRadius: 0,\r\n '&.separated': {\r\n '&.sizeLarge': {\r\n borderTopLeftRadius: 8,\r\n borderBottomLeftRadius: 8,\r\n },\r\n '&.sizeMedium': {\r\n borderTopLeftRadius: 8,\r\n borderBottomLeftRadius: 8,\r\n },\r\n '&.sizeSmall': {\r\n borderTopLeftRadius: 6,\r\n borderBottomLeftRadius: 6,\r\n },\r\n },\r\n },\r\n '&:not(:last-child)': {\r\n borderTopRightRadius: 0,\r\n borderBottomRightRadius: 0,\r\n '&.separated': {\r\n '&.sizeLarge': {\r\n borderTopRightRadius: 8,\r\n borderBottomRightRadius: 8,\r\n },\r\n '&.sizeMedium': {\r\n borderTopRightRadius: 8,\r\n borderBottomRightRadius: 8,\r\n },\r\n '&.sizeSmall': {\r\n borderTopRightRadius: 6,\r\n borderBottomRightRadius: 6,\r\n },\r\n },\r\n },\r\n '&>[class*=\"withTitle\"]:not(:first-child)': {\r\n '&>button': {\r\n marginLeft: '0px', // props => (props.variant === 'white' ? 0 : -1),\r\n borderLeft: '1px solid transparent',\r\n borderTopLeftRadius: 0,\r\n borderBottomLeftRadius: 0,\r\n '&.separated': {\r\n '&.sizeLarge': {\r\n borderTopLeftRadius: 8,\r\n borderBottomLeftRadius: 8,\r\n },\r\n '&.sizeMedium': {\r\n borderTopLeftRadius: 8,\r\n borderBottomLeftRadius: 8,\r\n },\r\n '&.sizeSmall': {\r\n borderTopLeftRadius: 6,\r\n borderBottomLeftRadius: 6,\r\n },\r\n },\r\n },\r\n },\r\n '&>[class*=\"withTitle\"]:not(:last-child)': {\r\n '&>button': {\r\n borderTopRightRadius: 0,\r\n borderBottomRightRadius: 0,\r\n '&.separated': {\r\n '&.sizeLarge': {\r\n borderTopRightRadius: 8,\r\n borderBottomRightRadius: 8,\r\n },\r\n '&.sizeMedium': {\r\n borderTopRightRadius: 8,\r\n borderBottomRightRadius: 8,\r\n },\r\n '&.sizeSmall': {\r\n borderTopRightRadius: 6,\r\n borderBottomRightRadius: 6,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n /* Styles applied to the children if `orientation=\"vertical\"`. */\r\n groupedVertical: {\r\n '&:not(:first-child)': {\r\n marginTop: -1,\r\n borderTop: '1px solid transparent',\r\n borderTopLeftRadius: 0,\r\n borderTopRightRadius: 0,\r\n '&.separated': {\r\n '&.sizeLarge': {\r\n borderTopLeftRadius: 8,\r\n borderTopRightRadius: 8,\r\n },\r\n '&.sizeMedium': {\r\n borderTopLeftRadius: 8,\r\n borderTopRightRadius: 8,\r\n },\r\n '&.sizeSmall': {\r\n borderTopLeftRadius: 6,\r\n borderTopRightRadius: 6,\r\n },\r\n },\r\n },\r\n '&:not(:last-child)': {\r\n borderBottomLeftRadius: 0,\r\n borderBottomRightRadius: 0,\r\n '&.separated': {\r\n '&.sizeLarge': {\r\n borderBottomLeftRadius: 8,\r\n borderBottomRightRadius: 8,\r\n },\r\n '&.sizeMedium': {\r\n borderBottomLeftRadius: 8,\r\n borderBottomRightRadius: 8,\r\n },\r\n '&.sizeSmall': {\r\n borderBottomLeftRadius: 6,\r\n borderBottomRightRadius: 6,\r\n },\r\n },\r\n },\r\n '&>[class*=\"withTitle\"]:not(:first-child)': {\r\n '&>button': {\r\n marginTop: -1,\r\n borderTop: '1px solid transparent',\r\n borderTopLeftRadius: 0,\r\n borderTopRightRadius: 0,\r\n '&.separated': {\r\n '&.sizeLarge': {\r\n borderTopLeftRadius: 8,\r\n borderTopRightRadius: 8,\r\n },\r\n '&.sizeMedium': {\r\n borderTopLeftRadius: 8,\r\n borderTopRightRadius: 8,\r\n },\r\n '&.sizeSmall': {\r\n borderTopLeftRadius: 6,\r\n borderTopRightRadius: 6,\r\n },\r\n },\r\n },\r\n },\r\n '&>[class*=\"withTitle\"]:not(:last-child)': {\r\n '&>button': {\r\n borderBottomLeftRadius: 0,\r\n borderBottomRightRadius: 0,\r\n '&.separated': {\r\n '&.sizeLarge': {\r\n borderBottomLeftRadius: 8,\r\n borderBottomRightRadius: 8,\r\n },\r\n '&.sizeMedium': {\r\n borderBottomLeftRadius: 8,\r\n borderBottomRightRadius: 8,\r\n },\r\n '&.sizeSmall': {\r\n borderBottomLeftRadius: 6,\r\n borderBottomRightRadius: 6,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n} as Partial;\r\nexport const MuiToggleButtonOverride = {\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: '10px',\r\n textTransform: 'none',\r\n boxShadow: 'unset',\r\n boxSizing: 'border-box',\r\n border: '1px solid transparent',\r\n borderRadius: '8px',\r\n minWidth: '40px',\r\n height: '40px',\r\n ...buttonS,\r\n padding: '4px 16px',\r\n '&.hasMainIcon': {\r\n padding: '4px 10px',\r\n },\r\n '&.hasStartIcon.hasEndIcon': {\r\n padding: '4px 12px',\r\n },\r\n '&.hasStartIcon': {\r\n padding: '4px 16px 4px 12px',\r\n },\r\n '&.hasEndIcon': {\r\n padding: '4px 12px 4px 16px',\r\n },\r\n '&.fullWidth': {\r\n width: '100%',\r\n },\r\n '&.variantMain': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n '&$selected': {\r\n color: bookitColors.base.white,\r\n backgroundColor: bookitColors.primary.regular,\r\n border: `1px solid ${bookitColors.primary.borders}`,\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.hover,\r\n border: '1px solid transparent',\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.regular,\r\n color: bookitColors.base.white,\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: bookitColors.primary.regular,\r\n color: bookitColors.base.white,\r\n border: `1px solid ${bookitColors.primary.borders}`,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.primary.disabled,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&.variantText': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.regular,\r\n padding: '0px',\r\n '&$selected': {\r\n color: bookitColors.primary.hover,\r\n backgroundColor: 'transparent',\r\n textDecoration: 'underline',\r\n '&:hover': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.hover,\r\n textDecoration: 'underline',\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.hover,\r\n textDecoration: 'underline',\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.hover,\r\n textDecoration: 'underline',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n '&.variantTextgray': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.graySubtitles,\r\n padding: '0px',\r\n '&$selected': {\r\n color: bookitColors.grayscale.blackComponents,\r\n backgroundColor: 'transparent',\r\n textDecoration: 'underline',\r\n '&:hover': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.blackComponents,\r\n textDecoration: 'underline',\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.blackComponents,\r\n textDecoration: 'underline',\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.blackComponents,\r\n textDecoration: 'underline',\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n '&.variantGray': {\r\n backgroundColor: bookitColors.primary.bgLight,\r\n color: bookitColors.grayscale.blackRegular,\r\n '&$selected': {\r\n color: bookitColors.primary.regular,\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n '&:hover': {\r\n backgroundColor: bookitColors.grayscale.graySelection,\r\n color: bookitColors.primary.regular,\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.primary.regular,\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.primary.regular,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantAccent': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.grayscale.blackRegular,\r\n '&$selected': {\r\n color: bookitColors.base.white,\r\n backgroundColor: bookitColors.grayscale.graySubtitles,\r\n '&:hover': {\r\n backgroundColor: bookitColors.grayscale.blackRegular,\r\n color: bookitColors.base.white,\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantDanger': {\r\n backgroundColor: bookitColors.danger.background,\r\n color: bookitColors.grayscale.blackRegular,\r\n '&$selected': {\r\n color: bookitColors.base.white,\r\n backgroundColor: bookitColors.danger.regular,\r\n '&:hover': {\r\n backgroundColor: bookitColors.danger.hover,\r\n color: bookitColors.base.white,\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.danger.background,\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: bookitColors.danger.background,\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.danger.disabled,\r\n color: bookitColors.base.white,\r\n },\r\n },\r\n '&.variantWhite': {\r\n backgroundColor: bookitColors.base.white,\r\n color: bookitColors.grayscale.blackRegular,\r\n '&$selected': {\r\n color: bookitColors.grayscale.blackRegular,\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n '&:hover': {\r\n backgroundColor: bookitColors.grayscale.graySelection,\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantGhostcolor': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.primary.regular,\r\n '&$selected': {\r\n color: bookitColors.primary.hover,\r\n backgroundColor: bookitColors.primary.bgHover,\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '&.variantGhost': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.blackRegular,\r\n '&$selected': {\r\n color: bookitColors.primary.hover,\r\n backgroundColor: bookitColors.primary.bgHover,\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '& + &': {\r\n borderLeft: 0,\r\n marginLeft: 0,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&:active, &:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n color: bookitColors.primary.hover,\r\n },\r\n '&$disabled': {\r\n backgroundColor: 'transparent',\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n },\r\n sizeLarge: {\r\n padding: '4px 20px',\r\n borderRadius: '8px',\r\n minWidth: '48px',\r\n height: '48px',\r\n '&.hasMainIcon': {\r\n padding: '4px 14px',\r\n },\r\n '&.hasStartIcon.hasEndIcon': {\r\n padding: '4px 16px',\r\n },\r\n '&.hasStartIcon': {\r\n padding: '4px 20px 4px 16px',\r\n },\r\n '&.hasEndIcon': {\r\n padding: '4px 16px 4px 20px',\r\n },\r\n '&>$label': {\r\n gap: '12px',\r\n },\r\n },\r\n sizeSmall: {\r\n padding: '4px 12px',\r\n borderRadius: '8px',\r\n minWidth: '32px',\r\n height: '32px',\r\n '&.separated': {\r\n borderRadius: '6px',\r\n },\r\n '&.hasMainIcon': {\r\n padding: '4px 8px',\r\n },\r\n '&.hasStartIcon.hasEndIcon': {\r\n padding: '4px 8px',\r\n },\r\n '&.hasStartIcon': {\r\n padding: '4px 12px 4px 8px',\r\n },\r\n '&.hasEndIcon': {\r\n padding: '4px 8px 4px 12px',\r\n },\r\n },\r\n label: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '0px',\r\n margin: 0,\r\n gap: '8px',\r\n '& .startIcon': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n flex: 'none',\r\n order: 0,\r\n flexGrow: 0,\r\n margin: 0,\r\n },\r\n '& .endIcon': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n flex: 'none',\r\n order: 2,\r\n flexGrow: 0,\r\n margin: 0,\r\n },\r\n '& .mainIcon': {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '10px',\r\n },\r\n '& .buttonLabel': {\r\n height: '18px',\r\n whiteSpace: 'nowrap',\r\n },\r\n '& .iconSizeSmall': {\r\n fontSize: '14px',\r\n '&>:first-child': {\r\n fontSize: '14px',\r\n width: '14px',\r\n height: '14px',\r\n },\r\n },\r\n '& .iconSizeMedium': {\r\n fontSize: '16px',\r\n '&>:first-child': {\r\n fontSize: '16px',\r\n width: '16px',\r\n height: '16px',\r\n },\r\n },\r\n '& .iconSizeLarge': {\r\n fontSize: '16px',\r\n '&>:first-child': {\r\n fontSize: '16px',\r\n width: '16px',\r\n height: '16px',\r\n },\r\n },\r\n },\r\n} as Partial;\r\n","import { fade, ThemeOptions } from '@material-ui/core';\r\nimport createBreakpoints from '@material-ui/core/styles/createBreakpoints';\r\nimport { unstable_createMuiStrictModeTheme as createMuiTheme } from '@material-ui/core';\r\n// import convertLength from 'convert-css-length';\r\nimport { grey, green } from '@material-ui/core/colors';\r\nimport { bookitColors } from './colors/bookitColors';\r\nimport infoColors from './colors/info';\r\nimport {\r\n bodyS,\r\n boldS,\r\n bookitTypography,\r\n buttonM,\r\n inputLabelXS,\r\n inputValueS,\r\n tipsRegular,\r\n} from './typography/bookitTypography';\r\nimport {\r\n MuiButtonOverride,\r\n MuiIconButtonOverride,\r\n MuiToggleButtonGroupOverride,\r\n MuiToggleButtonOverride,\r\n} from './MUIExtend/themeOverrides';\r\nimport transitions from '@material-ui/core/styles/transitions';\r\nimport {\r\n COVER_WIDTH,\r\n //DRAWER_MOBILE_WIDTH,\r\n DRAWER_WIDTH,\r\n} from './constantVariables';\r\nimport { box_shadow_m, box_shadow_s } from './shadows/bookitShadow';\r\n\r\nconst breakpoints = createBreakpoints({});\r\n// xs: 0,\r\n// sm: 600,\r\n// md: 960,\r\n// lg: 1280,\r\n// xl: 1920\r\nconst lato_Light = {\r\n fontFamily: `'Lato', sans-serif`,\r\n fontStyle: 'normal',\r\n fontWeight: 300,\r\n src: `\r\n local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Light.woff') format('woff'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Light.woff2') format('woff2'),\r\n `,\r\n};\r\nconst lato_Regular = {\r\n fontFamily: `'Lato', sans-serif`,\r\n fontStyle: 'normal',\r\n fontWeight: 400,\r\n src: `\r\n local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Regular.woff') format('woff'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Regular.woff2') format('woff2'),\r\n `,\r\n};\r\nconst lato_Bold = {\r\n fontFamily: `'Lato', sans-serif`,\r\n fontStyle: 'normal',\r\n fontWeight: 700,\r\n src: `\r\n local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Bold.woff') format('woff'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Bold.woff2') format('woff2'),\r\n `,\r\n};\r\nconst lato_Black = {\r\n fontFamily: `'Lato', sans-serif`,\r\n fontStyle: 'normal',\r\n fontWeight: 900,\r\n src: `\r\n local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Black.woff') format('woff'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Black.woff2') format('woff2'),\r\n `,\r\n};\r\nconst lato = {\r\n fontFamily: `'Lato', sans-serif`,\r\n fontStyle: 'normal',\r\n fontWeight: 400,\r\n src: `\r\n local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Regular.woff') format('woff'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Regular.woff2') format('woff2'),\r\n `,\r\n unicodeRange:\r\n 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF',\r\n};\r\n//const convert = convertLength('16px');\r\nexport type BaseTheme = 'default' | 'animals' | 'bookit' | 'dark' | undefined;\r\n// customizes the mui theme defaults/overrides\r\n// colors: https://material-ui.com/customization/color/#color\r\nexport const DefaultThemeSettings: ThemeOptions = {\r\n typography: {\r\n fontFamily: `'Lato', sans-serif`,\r\n },\r\n overrides: {\r\n MuiCssBaseline: {\r\n '@global': {\r\n '@font-face': [lato],\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const BookitThemeSettings: ThemeOptions = {\r\n zIndex: {\r\n mobileStepper: 1000,\r\n speedDial: 1050,\r\n appBar: 1100,\r\n drawer: 1200,\r\n modal: 1300,\r\n snackbar: 1400,\r\n tooltip: 1500,\r\n },\r\n palette: {\r\n primary: {\r\n dark: bookitColors.primary.dark,\r\n main: bookitColors.primary.regular,\r\n light: bookitColors.primary.background,\r\n textHover: bookitColors.primary.hover,\r\n bgHover: bookitColors.primary.bgHover,\r\n contrastText: bookitColors.base.white,\r\n },\r\n\r\n secondary: {\r\n dark: '#BFA44A',\r\n main: '#FFDB63',\r\n light: '#F4ECCE',\r\n textHover: '#E0BC40',\r\n bgHover: '#FFEBA9',\r\n contrastText: '#000',\r\n },\r\n info: {\r\n dark: infoColors.colorInfoDark,\r\n main: infoColors.colorInfoRegular,\r\n light: infoColors.colorInfoBg,\r\n textHover: infoColors.colorInfoBgHover,\r\n bgHover: infoColors.colorInfoHover,\r\n contrastText: bookitColors.base.white,\r\n },\r\n accent: {\r\n dark: bookitColors.secondary.violet.dark,\r\n main: bookitColors.secondary.violet.regular,\r\n light: bookitColors.secondary.violet.background,\r\n bgHover: bookitColors.secondary.violet.bgHover,\r\n textHover: bookitColors.secondary.violet.hover,\r\n contrastText: bookitColors.base.white,\r\n },\r\n danger: {\r\n dark: bookitColors.danger.dark,\r\n main: bookitColors.danger.regular,\r\n light: bookitColors.danger.background,\r\n textHover: bookitColors.danger.hover,\r\n bgHover: bookitColors.danger.bgHover,\r\n contrastText: bookitColors.base.white,\r\n },\r\n success: {\r\n dark: bookitColors.success.dark,\r\n main: bookitColors.success.regular,\r\n light: bookitColors.success.background,\r\n textHover: bookitColors.success.hover,\r\n bgHover: bookitColors.success.bgHover,\r\n contrastText: bookitColors.base.white,\r\n },\r\n error: {\r\n dark: bookitColors.danger.dark,\r\n main: bookitColors.danger.regular,\r\n light: bookitColors.danger.background,\r\n bgHover: bookitColors.danger.bgHover,\r\n textHover: bookitColors.danger.hover,\r\n contrastText: bookitColors.base.white,\r\n },\r\n default: {\r\n dark: bookitColors.grayscale.blackComponents,\r\n main: bookitColors.grayscale.graybgComponents,\r\n light: bookitColors.grayscale.grayBackground,\r\n bgHover: bookitColors.base.white,\r\n textHover: bookitColors.grayscale.graySubtitles,\r\n contrastText: bookitColors.base.black,\r\n },\r\n filters: {\r\n dark: bookitColors.primary.dark,\r\n main: bookitColors.grayscale.graySelection,\r\n textHover: bookitColors.primary.dark,\r\n bgHover: bookitColors.primary.bgHover,\r\n light: bookitColors.grayscale.grayComponents,\r\n contrastText: bookitColors.grayscale.blackRegular,\r\n },\r\n common: {\r\n black: bookitColors.base.black,\r\n blackRegular: bookitColors.grayscale.blackRegular,\r\n blackComponent: bookitColors.grayscale.blackComponents,\r\n graySubtitle: bookitColors.grayscale.graySubtitles,\r\n grayComponents: bookitColors.grayscale.grayComponents,\r\n grayComponentsLight: bookitColors.grayscale.grayComponentsLight,\r\n background: bookitColors.grayscale.grayBackground,\r\n backgroundHover: bookitColors.grayscale.graybgComponents,\r\n grayBorders: bookitColors.grayscale.grayBorders,\r\n grayDividers: bookitColors.grayscale.graySelection,\r\n white: bookitColors.base.white,\r\n },\r\n background: {\r\n default: bookitColors.grayscale.grayBackground,\r\n paper: bookitColors.base.white,\r\n },\r\n },\r\n shape: {\r\n borderRadius: 8,\r\n },\r\n typography: {\r\n fontFamily: ['Lato', 'sans-serif'].join(','),\r\n h1: bookitTypography.h1,\r\n h2: bookitTypography.h2,\r\n h3: bookitTypography.h3,\r\n h4: bookitTypography.h4,\r\n bodyL: bookitTypography.bodyL,\r\n bodyM: bookitTypography.bodyM,\r\n bodyS: bookitTypography.bodyS,\r\n boldL: bookitTypography.boldL,\r\n boldM: bookitTypography.boldM,\r\n boldS: bookitTypography.boldS,\r\n buttonM: bookitTypography.buttonM,\r\n buttonS: bookitTypography.buttonS,\r\n captionRegular: bookitTypography.captionRegular,\r\n captionBold: bookitTypography.captionBold,\r\n\r\n subtitle1: bookitTypography.subtitle1,\r\n subtitle2: bookitTypography.subtitle2,\r\n tipsRegular: bookitTypography.tipsRegular,\r\n tipsBold: bookitTypography.tipsBold,\r\n inputLabelM: bookitTypography.inputLabelM,\r\n inputLabelXS: bookitTypography.inputLabelXS,\r\n inputValueM: bookitTypography.inputValueM,\r\n inputValueS: bookitTypography.inputValueS,\r\n uppercase: bookitTypography.uppercase,\r\n },\r\n overrides: {\r\n MuiTypography: {\r\n root: {\r\n '&.variantH1': {\r\n ...bookitTypography.h1,\r\n },\r\n '&.variantH2': {\r\n ...bookitTypography.h2,\r\n },\r\n '&.variantH3': {\r\n ...bookitTypography.h3,\r\n },\r\n '&.variantH4': {\r\n ...bookitTypography.h4,\r\n },\r\n '&.variantSubtitle1': {\r\n ...bookitTypography.subtitle1,\r\n },\r\n '&.variantSubtitle2': {\r\n ...bookitTypography.subtitle2,\r\n },\r\n '&.variantBodyl': {\r\n ...bookitTypography.bodyL,\r\n },\r\n '&.variantBodym': {\r\n ...bookitTypography.bodyM,\r\n },\r\n '&.variantBodys': {\r\n ...bookitTypography.bodyS,\r\n },\r\n '&.variantBoldl': {\r\n ...bookitTypography.boldL,\r\n },\r\n '&.variantBoldm': {\r\n ...bookitTypography.boldM,\r\n },\r\n '&.variantBolds': {\r\n ...bookitTypography.boldS,\r\n },\r\n '&.variantCaptionbold': {\r\n ...bookitTypography.captionBold,\r\n },\r\n '&.variantCaptionregular': {\r\n ...bookitTypography.captionRegular,\r\n },\r\n '&.variantUppercase': {\r\n ...bookitTypography.uppercase,\r\n },\r\n '&.variantTipsbold': {\r\n ...bookitTypography.tipsBold,\r\n },\r\n '&.variantTipsregular': {\r\n ...bookitTypography.tipsRegular,\r\n },\r\n '&.variantInputlabelm': {\r\n ...bookitTypography.inputLabelM,\r\n },\r\n '&.variantInputlabelxs': {\r\n ...bookitTypography.inputLabelXS,\r\n },\r\n '&.variantInputvaluem': {\r\n ...bookitTypography.inputValueM,\r\n },\r\n '&.variantInputvalues': {\r\n ...bookitTypography.inputValueS,\r\n },\r\n '&.variantButtonm': {\r\n ...bookitTypography.buttonM,\r\n },\r\n '&.variantButtons': {\r\n ...bookitTypography.buttonS,\r\n },\r\n '&.italic': {\r\n fontStyle: 'italic',\r\n },\r\n },\r\n colorError: {\r\n color: bookitColors.danger.components,\r\n },\r\n colorPrimary: {\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n colorSecondary: { color: bookitColors.grayscale.grayComponents },\r\n colorTextPrimary: { color: bookitColors.primary.regular },\r\n colorTextSecondary: { color: bookitColors.success.regular },\r\n },\r\n MuiAppBar: {\r\n colorDefault: { backgroundColor: bookitColors.grayscale.grayBackground },\r\n },\r\n MuiLink: {\r\n root: {\r\n color: bookitColors.primary.regular,\r\n '&:hover': {\r\n textDecoration: 'underline',\r\n },\r\n '&:focus': {\r\n textDecoration: 'underline',\r\n },\r\n },\r\n },\r\n MuiCssBaseline: {\r\n '@global': {\r\n '@font-face': [lato_Light, lato_Regular, lato_Bold, lato_Black],\r\n ':root': {\r\n '--drawer-width': 240,\r\n },\r\n },\r\n },\r\n MuiSelect: {\r\n select: {\r\n '&:focus': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n MuiInputBase: {\r\n root: {\r\n ...inputValueS,\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n adornedStart: {\r\n paddingLeft: 12,\r\n },\r\n adornedEnd: {\r\n paddingRight: 12,\r\n },\r\n input: {\r\n '.textTable &': {\r\n minWidth: '80px',\r\n },\r\n },\r\n // marginDense: {\r\n // width: '100px',\r\n // }\r\n },\r\n MuiFilledInput: {\r\n root: {\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n backgroundColor: bookitColors.base.white,\r\n borderRadius: 8,\r\n borderTopLeftRadius: 8,\r\n borderTopRightRadius: 8,\r\n '&:hover': {\r\n backgroundColor: bookitColors.base.white,\r\n '@media (hover: none)': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.90)',\r\n },\r\n },\r\n '&$focused': {\r\n backgroundColor: bookitColors.base.white,\r\n },\r\n '&$disabled': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n },\r\n },\r\n /* Styles applied to the root element if color secondary. */\r\n colorSecondary: {\r\n '&$underline:after': {\r\n borderBottomColor: bookitColors.danger.regular,\r\n },\r\n },\r\n underline: {\r\n '&:after': {\r\n borderBottom: `1px solid ${bookitColors.primary.regular}`,\r\n left: 0,\r\n bottom: -1,\r\n // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\r\n content: '\"\"',\r\n position: 'absolute',\r\n right: 0,\r\n transform: 'scaleX(0)',\r\n pointerEvents: 'none', // Transparent to the hover style.\r\n transition: transitions.create('transform', {\r\n duration: transitions.duration.shorter,\r\n easing: transitions.easing.easeOut,\r\n }),\r\n marginInline: 8,\r\n },\r\n '&$focused:after': {\r\n transform: 'scaleX(1)',\r\n },\r\n '&$error:after': {\r\n borderBottomColor: bookitColors.danger.regular,\r\n transform: 'scaleX(1)', // error is always underlined in red\r\n },\r\n '&:before': {\r\n borderBottom: 'none',\r\n left: 0,\r\n bottom: -1,\r\n // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\r\n content: '\"\\\\00a0\"',\r\n // content: '\"\"',\r\n position: 'absolute',\r\n right: 0,\r\n transition: transitions.create('border-bottom-color', {\r\n duration: transitions.duration.shorter,\r\n }),\r\n pointerEvents: 'none', // Transparent to the hover style.\r\n marginInline: 8,\r\n },\r\n '&:hover:before': {\r\n borderBottom: 'none',\r\n },\r\n '&$disabled:before': {\r\n borderBottomStyle: 'none',\r\n },\r\n '&$focused:before': {\r\n borderBottom: `1px solid ${bookitColors.primary.regular}`,\r\n transform: 'scaleX(1)',\r\n },\r\n '&$error:before': {\r\n borderBottom: `1px solid ${bookitColors.danger.regular}`,\r\n transform: 'scaleX(1)',\r\n },\r\n },\r\n /* Pseudo-class applied to the root element if the component is focused. */\r\n focused: {},\r\n\r\n /* Pseudo-class applied to the root element if `disabled={true}`. */\r\n disabled: {},\r\n\r\n /* Styles applied to the root element if `startAdornment` is provided. */\r\n adornedStart: {\r\n paddingLeft: 12,\r\n },\r\n\r\n /* Styles applied to the root element if `endAdornment` is provided. */\r\n adornedEnd: {\r\n paddingRight: 12,\r\n },\r\n\r\n /* Pseudo-class applied to the root element if `error={true}`. */\r\n error: {},\r\n\r\n /* Styles applied to the `input` element if `margin=\"dense\"`. */\r\n marginDense: {},\r\n\r\n /* Styles applied to the root element if `multiline={true}`. */\r\n multiline: {\r\n padding: '27px 12px 10px',\r\n '&$marginDense': {\r\n paddingTop: 23,\r\n paddingBottom: 6,\r\n },\r\n },\r\n // input: {\r\n // height: '20px',\r\n // padding: '22px 12px 4px',\r\n // },\r\n // inputMarginDense: {\r\n // paddingTop: '16px',\r\n // paddingBottom: '6px',\r\n // },\r\n /* Styles applied to the `input` element. */\r\n input: {\r\n height: '20px',\r\n padding: '26px 12px 8px',\r\n '&:-webkit-autofill': {\r\n // WebkitBoxShadow:\r\n // theme.palette.type === 'light' ? null : '0 0 0 100px #266798 inset',\r\n // WebkitTextFillColor: theme.palette.type === 'light' ? null : '#fff',\r\n // caretColor: theme.palette.type === 'light' ? null : '#fff',\r\n borderTopLeftRadius: 'inherit',\r\n borderTopRightRadius: 'inherit',\r\n },\r\n '.inputSizeLarge &': {\r\n paddingTop: 22,\r\n paddingBottom: 4,\r\n },\r\n '.inputSizeLarge.noLabel &': {\r\n paddingTop: 14,\r\n paddingBottom: 12,\r\n },\r\n '.inputSizeMedium &': {\r\n paddingTop: 9,\r\n paddingBottom: 9,\r\n },\r\n '.inputSizeSmall &': {\r\n paddingTop: 5,\r\n paddingBottom: 5,\r\n },\r\n },\r\n\r\n /* Styles applied to the `input` element if `margin=\"dense\"`. */\r\n inputMarginDense: {\r\n paddingTop: 22,\r\n paddingBottom: 4,\r\n },\r\n\r\n /* Styles applied to the `input` if in ``. */\r\n inputHiddenLabel: {\r\n paddingTop: 17,\r\n paddingBottom: 17,\r\n '&$inputMarginDense': {\r\n paddingTop: 9,\r\n paddingBottom: 9,\r\n },\r\n },\r\n\r\n /* Styles applied to the `input` element if `multiline={true}`. */\r\n inputMultiline: {\r\n padding: 0,\r\n },\r\n\r\n /* Styles applied to the `input` element if `startAdornment` is provided. */\r\n inputAdornedStart: {\r\n paddingLeft: 0,\r\n },\r\n\r\n /* Styles applied to the `input` element if `endAdornment` is provided. */\r\n inputAdornedEnd: {\r\n paddingRight: 0,\r\n },\r\n },\r\n MuiFormHelperText: {\r\n /* Styles applied to the root element. */\r\n root: {\r\n display: 'flex',\r\n paddingLeft: '4px',\r\n alignItems: 'center',\r\n gap: 0,\r\n alignSelf: 'stretch',\r\n color: bookitColors.grayscale.blackRegular,\r\n ...tipsRegular,\r\n textAlign: 'left',\r\n marginTop: 0,\r\n margin: 0,\r\n '&$disabled': {\r\n color: bookitColors.grayscale.graySelection,\r\n },\r\n '&$error': {\r\n color: bookitColors.danger.regular,\r\n },\r\n '&.boxed': {\r\n gap: 0,\r\n },\r\n '&.shiftRight': {\r\n gap: 28,\r\n },\r\n // '&.separate-picker': {\r\n // position: 'absolute',\r\n // top: 0,\r\n // left: 0,\r\n // '&.inputSizeLarge': {\r\n // transform: 'translate(0px, 54px) scale(1)',\r\n // },\r\n // '&.inputSizeMedium': {\r\n // transform: 'translate(0px, 46px) scale(1)',\r\n // },\r\n // '&.inputSizeSmall': {\r\n // transform: 'translate(0px, 38px) scale(1)',\r\n // },\r\n // },\r\n // empty helperText results in zero element height. So when field is validated the appearance of the\r\n // error message in the helperText causes the form element to increase in height and forces a redraw\r\n // empty char \\00a0 causes the FormHelperText to always occupy one line height and prevents reflows\r\n '&::before': {\r\n content: '\"\\\\00a0\"',\r\n },\r\n // marginLeft: '6px',\r\n // ...tipsRegular,\r\n },\r\n\r\n /* Pseudo-class applied to the root element if `error={true}`. */\r\n error: {},\r\n\r\n /* Pseudo-class applied to the root element if `disabled={true}`. */\r\n disabled: {},\r\n\r\n /* Styles applied to the root element if `margin=\"dense\"`. */\r\n marginDense: {\r\n marginTop: 4,\r\n },\r\n\r\n /* Styles applied to the root element if `variant=\"filled\"` or `variant=\"outlined\"`. */\r\n contained: {\r\n marginLeft: 0,\r\n marginRight: 0,\r\n },\r\n\r\n /* Pseudo-class applied to the root element if `focused={true}`. */\r\n focused: {},\r\n\r\n /* Pseudo-class applied to the root element if `filled={true}`. */\r\n filled: {},\r\n\r\n /* Pseudo-class applied to the root element if `required={true}`. */\r\n required: {},\r\n },\r\n MuiFormGroup: {\r\n /* Styles applied to the root element. */\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexWrap: 'wrap',\r\n gap: 8,\r\n '&.boxed': {\r\n display: 'flex',\r\n height: 'auto',\r\n minHeight: '56px',\r\n //justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: '10px',\r\n alignSelf: 'stretch',\r\n padding: '16px',\r\n borderRadius: '8px',\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n background: bookitColors.base.white,\r\n '&.toggleSizeSmall': {\r\n minHeight: '48px',\r\n padding: '12px',\r\n },\r\n '&.boxedError': {\r\n border: `1px solid ${bookitColors.danger.borders}`,\r\n },\r\n '&.boxedChecked': {\r\n border: `1px solid ${bookitColors.primary.borders}`,\r\n background: bookitColors.primary.background,\r\n // '&.boxedSecondary': {\r\n // border: `1px solid ${bookitColors.success.borders}`,\r\n // background: bookitColors.success.background,\r\n // },\r\n '&.boxedError': {\r\n border: `1px solid ${bookitColors.danger.borders}`,\r\n background: bookitColors.danger.background,\r\n },\r\n },\r\n },\r\n '&.horizontal': {\r\n gap: '16px',\r\n },\r\n '&.vertical': {\r\n gap: '16px',\r\n alignItems: 'flex-start',\r\n width: '100%',\r\n },\r\n },\r\n /* Styles applied to the root element if `row={true}`. */\r\n row: {\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n },\r\n },\r\n MuiFormLabel: {\r\n root: {\r\n color: bookitColors.grayscale.graySubtitles,\r\n ...bodyS,\r\n '&$focused': {\r\n color: bookitColors.grayscale.graySubtitles,\r\n },\r\n '&.ghosInputLabel': {\r\n display: 'flex',\r\n height: '17px',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignSelf: 'stretch',\r\n color: bookitColors.grayscale.graySubtitles,\r\n ...bookitTypography.captionRegular,\r\n '&.ghosInputLabelBold': {\r\n fontWeight: '900',\r\n },\r\n },\r\n },\r\n // focused: {\r\n // color: bookitColors.grayscale.graySubtitles,\r\n // },\r\n asterisk: {\r\n color: bookitColors.danger.regular,\r\n },\r\n },\r\n MuiInputLabel: {\r\n root: {\r\n color: bookitColors.grayscale.grayComponents,\r\n ...inputValueS,\r\n display: 'block',\r\n transformOrigin: 'top left',\r\n '&.datetime-picker': {\r\n position: 'relative',\r\n transform: 'unset',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n width: '13ch',\r\n display: 'inline-block',\r\n },\r\n },\r\n /* Pseudo-class applied to the root element if `focused={true}`. */\r\n focused: {},\r\n\r\n /* Pseudo-class applied to the root element if `disabled={true}`. */\r\n disabled: {},\r\n\r\n /* Pseudo-class applied to the root element if `error={true}`. */\r\n error: {},\r\n\r\n /* Pseudo-class applied to the root element if `required={true}`. */\r\n required: {},\r\n\r\n /* Pseudo-class applied to the asterisk element. */\r\n asterisk: {},\r\n /* Styles applied to the root element if the component is a descendant of `FormControl`. */\r\n formControl: {\r\n position: 'absolute',\r\n left: 0,\r\n top: 0,\r\n // slight alteration to spec spacing to match visual spec result\r\n transform: 'translate(0, 24px) scale(1)',\r\n '&.date-dropdown-picker': {\r\n transform: 'translate(0px, -20px) scale(1)',\r\n },\r\n '&.time-options-picker': {\r\n transform: 'translate(0px, -26px) scale(1)',\r\n },\r\n '&.noLabelInline': {\r\n transform: 'translate(0px, 0px) scale(1)',\r\n },\r\n },\r\n /* Styles applied to the root element if `margin=\"dense\"`. */\r\n marginDense: {\r\n // Compensation for the `Input.inputDense` style.\r\n transform: 'translate(0, 21px) scale(1)',\r\n },\r\n /* Styles applied to the `input` element if `disableAnimation={false}`. */\r\n animated: {\r\n transition: transitions.create(['color', 'transform'], {\r\n duration: transitions.duration.shorter,\r\n easing: transitions.easing.easeOut,\r\n }),\r\n },\r\n /* Styles applied to the `input` element if `shrink={true}`. */\r\n shrink: {\r\n transform: 'translate(0, -2.5px) scale(1.1)',\r\n //transform: 'translate(0, 1.5px) scale(0.75)',\r\n transformOrigin: 'top left',\r\n ...inputLabelXS,\r\n },\r\n /* Styles applied to the root element if `variant=\"filled\"`. */\r\n filled: {\r\n // Chrome's autofill feature gives the input field a yellow background.\r\n // Since the input field is behind the label in the HTML tree,\r\n // the input field is drawn last and hides the label with an opaque background color.\r\n // zIndex: 1 will raise the label above opaque background-colors of input.\r\n zIndex: 1,\r\n pointerEvents: 'none',\r\n height: '16px',\r\n transform: 'translate(12px, 18px) scale(1)',\r\n '&.inputSizeLarge': {\r\n transform: 'translate(12px, 14px) scale(1)',\r\n '&.separate-picker': {\r\n transform: 'translate(0px, -20px) scale(1)',\r\n },\r\n '&.date-dropdown-picker': {\r\n transform: 'translate(0px, -20px) scale(1)',\r\n },\r\n '&.time-options-picker': {\r\n transform: 'translate(0px, -26px) scale(1)',\r\n },\r\n },\r\n '&.inputSizeMedium': {\r\n transform: 'translate(12px, 10px) scale(1)',\r\n '&.separate-picker': {\r\n transform: 'translate(0px, -20px) scale(1)',\r\n },\r\n '&.date-dropdown-picker': {\r\n transform: 'translate(0px, -20px) scale(1)',\r\n },\r\n '&.time-options-picker': {\r\n transform: 'translate(0px, -26px) scale(1)',\r\n },\r\n },\r\n '&.inputSizeSmall': {\r\n transform: 'translate(12px, 6px) scale(1)',\r\n '&.separate-picker,': {\r\n transform: 'translate(0px, -20px) scale(1)',\r\n },\r\n '&.date-dropdown-picker': {\r\n transform: 'translate(0px, -20px) scale(1)',\r\n },\r\n '&.time-options-picker': {\r\n transform: 'translate(0px, -26px) scale(1)',\r\n },\r\n },\r\n '&$marginDense': {\r\n transform: 'translate(12px, 8px) scale(1)',\r\n },\r\n '&$shrink': {\r\n // letterSpacing: '0.2px',\r\n ...inputLabelXS,\r\n '&.inputSizeLarge': {\r\n transform: 'translate(12px, 6px) scale(1)',\r\n },\r\n '&.inputSizeMedium': {\r\n transform: 'translate(12px, -18px) scale(1)',\r\n },\r\n '&.inputSizeSmall': {\r\n transform: 'translate(12px, -18px) scale(1)',\r\n },\r\n transform: 'translate(12px, 8px) scale(1)',\r\n '&$marginDense': {\r\n transform: 'translate(12px, 4px) scale(0.75)',\r\n },\r\n },\r\n '&.datetime-picker': {\r\n transform: 'unset',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n width: '13ch',\r\n display: 'inline-block',\r\n },\r\n // transform: 'translate(12px, 20px) scale(1)',\r\n // '&$marginDense': {\r\n // transform: 'translate(12px, 17px) scale(1)',\r\n // },\r\n // '&$shrink': {\r\n // transform: 'translate(12px, 10px) scale(0.75)',\r\n // '&$marginDense': {\r\n // transform: 'translate(12px, 7px) scale(0.75)',\r\n // },\r\n // },\r\n },\r\n /* Styles applied to the root element if `variant=\"outlined\"`. */\r\n outlined: {\r\n // see comment above on filled.zIndex\r\n zIndex: 1,\r\n pointerEvents: 'none',\r\n transform: 'translate(14px, 20px) scale(1)',\r\n '&$marginDense': {\r\n transform: 'translate(14px, 12px) scale(1)',\r\n },\r\n '&$shrink': {\r\n transform: 'translate(14px, -6px) scale(0.75)',\r\n },\r\n },\r\n },\r\n MuiInputAdornment: {\r\n positionStart: {\r\n cursor: 'pointer',\r\n '& svg': {\r\n width: '16px',\r\n height: '16px',\r\n },\r\n },\r\n positionEnd: {\r\n '&.date-picker': {\r\n marginLeft: 0,\r\n },\r\n },\r\n filled: {\r\n '&$positionStart:not($hiddenLabel)': {\r\n marginTop: 0,\r\n },\r\n width: '18px',\r\n height: '20px',\r\n cursor: 'pointer',\r\n '& svg': {\r\n height: '16px',\r\n width: '16px',\r\n },\r\n },\r\n marginDense: {\r\n '& svg': {\r\n fontSize: '0.8rem',\r\n cursor: 'pointer',\r\n },\r\n },\r\n },\r\n MuiSvgIcon: {\r\n root: {\r\n cursor: 'auto',\r\n },\r\n fontSizeSmall: {\r\n fontSize: '0.8rem',\r\n },\r\n },\r\n MuiList: {\r\n root: {\r\n '&.sideBarList': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n '& .sideBarListGroup': {\r\n display: 'flex',\r\n padding: '12px 0px',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n alignSelf: 'stretch',\r\n borderBottom: `1px solid ${bookitColors.grayscale.graySelection}`,\r\n },\r\n '&.sideBarCollapsed': {\r\n alignSelf: 'stretch',\r\n },\r\n '&.sideBarExpanded': {\r\n width: '240px',\r\n '&.sideBarListMobile': {\r\n width: '100%',\r\n },\r\n },\r\n },\r\n '&.secondMenuItem': {\r\n display: 'flex',\r\n paddingBottom: '12px',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n background: bookitColors.grayscale.graybgComponents,\r\n '.sideBarListMobile &': {\r\n width: '100%',\r\n },\r\n '& .menuItem': {\r\n display: 'flex',\r\n width: '240px',\r\n height: '32px',\r\n padding: '0px 8px 0px 16px',\r\n alignItems: 'center',\r\n gap: '8px',\r\n '.sideBarListMobile &': {\r\n width: '100%',\r\n },\r\n '&:hover, &:focus': {\r\n background: bookitColors.primary.bgHover,\r\n '& .menuItemContent': {\r\n '& .menuItemText': {\r\n ...bookitTypography.bodyS,\r\n },\r\n },\r\n },\r\n '&:active': {\r\n background: bookitColors.primary.bgHover,\r\n '& .menuItemContent': {\r\n '& .menuItemText': {\r\n ...bookitTypography.bodyS,\r\n },\r\n },\r\n },\r\n '&.Mui-selected': {\r\n background: bookitColors.primary.bgHover,\r\n '& .menuItemContent': {\r\n '& .menuItemText': {\r\n ...bookitTypography.bodyS,\r\n fontWeight: 600,\r\n },\r\n },\r\n },\r\n '& .menuItemContent': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n paddingLeft: '8px',\r\n gap: '8px',\r\n flex: '1 0 0',\r\n '& .menuItemIcon': {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '7.5px',\r\n width: 'auto',\r\n height: 12,\r\n color: bookitColors.grayscale.grayComponents,\r\n '& > svg': {\r\n width: '12px',\r\n },\r\n },\r\n '& .menuItemText': {\r\n flex: '1 0 0',\r\n color: bookitColors.grayscale.blackRegular,\r\n ...bookitTypography.bodyS,\r\n cursor: 'pointer',\r\n whiteSpace: 'inherit',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n MuiListItem: {\r\n root: {\r\n '&.assetListItemLink': {\r\n display: 'flex',\r\n width: '100%',\r\n padding: '4px 8px',\r\n alignItems: 'center',\r\n gap: '12px',\r\n\r\n borderRadius: '4px',\r\n background: bookitColors.base.white,\r\n '&:hover, &:focus': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n },\r\n '&:active': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n },\r\n },\r\n '&.menuItem': {\r\n padding: 0,\r\n '&.mainTabMenu': {\r\n display: 'flex',\r\n height: '40px',\r\n padding: '0px 16px',\r\n alignItems: 'center',\r\n gap: '8px',\r\n alignSelf: 'stretch',\r\n backgroundColor: 'transparent',\r\n '& .menuItemContent': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n flex: '1 0 0',\r\n '& .menuItemIcon': {\r\n display: 'flex',\r\n paddingBottom: '1px',\r\n alignItems: 'flex-start',\r\n gap: '10px',\r\n width: 'auto',\r\n height: 20,\r\n color: bookitColors.grayscale.grayComponents,\r\n '& > svg': {\r\n width: '19px',\r\n },\r\n },\r\n '& .menuItemText': {\r\n flex: '1 0 0',\r\n color: bookitColors.grayscale.blackRegular,\r\n ...bookitTypography.buttonS,\r\n cursor: 'pointer',\r\n whiteSpace: 'initial',\r\n },\r\n },\r\n '&:hover, &:focus': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n },\r\n '&:active': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n },\r\n '&.mainTabExpanded': {\r\n '& .menuItemContent': {\r\n '& .menuItemIcon': {\r\n minWidth: 'initial',\r\n },\r\n },\r\n },\r\n '&.mainTabShort': {\r\n '& .menuItemContent': {\r\n '& .menuItemIcon': {\r\n minWidth: '60px',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n '.hoverItem &': {\r\n display: 'flex',\r\n width: '60px',\r\n height: '40px',\r\n padding: '0px 16px',\r\n alignItems: 'center',\r\n gap: '8px',\r\n backgroundColor: 'transparent',\r\n '& .menuItemHoverContent': {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: '8px',\r\n flex: '1 0 0',\r\n '& .menuItemIcon': {\r\n display: 'flex',\r\n paddingBottom: '1px',\r\n alignItems: 'flex-start',\r\n gap: '10px',\r\n width: 'auto',\r\n height: 20,\r\n color: bookitColors.grayscale.grayComponents,\r\n '& > svg': {\r\n width: '19px',\r\n },\r\n },\r\n },\r\n '&:hover, &:focus': {\r\n backgroundColor: bookitColors.grayscale.graySelection,\r\n '& .menuItemHoverContent': {\r\n '& .menuItemIcon': {\r\n color: bookitColors.grayscale.grayComponents,\r\n },\r\n },\r\n },\r\n '&:focus': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n '& .menuItemHoverContent': {\r\n '& .menuItemIcon': {\r\n color: bookitColors.primary.components,\r\n },\r\n },\r\n },\r\n '&:active': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n '& .menuItemHoverContent': {\r\n '& .menuItemIcon': {\r\n color: bookitColors.primary.components,\r\n },\r\n },\r\n },\r\n '&.Mui-selected': {\r\n backgroundColor: bookitColors.primary.bgHover,\r\n '& .menuItemHoverContent': {\r\n '& .menuItemIcon': {\r\n color: bookitColors.primary.components,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n MuiListItemText: {\r\n root: {\r\n '.assetListItemLink &': {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '8px',\r\n flex: '1 0 0',\r\n margin: 0,\r\n },\r\n },\r\n primary: {\r\n '.assetListItemLink &': {\r\n display: 'inline-block',\r\n maxWidth: '50%',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n ...boldS,\r\n },\r\n },\r\n secondary: {\r\n '.assetListItemLink &': {\r\n display: 'flex',\r\n height: '20px',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n flex: '1 0 0',\r\n color: bookitColors.grayscale.blackRegular,\r\n ...bodyS,\r\n },\r\n },\r\n },\r\n MuiListItemIcon: {\r\n root: {\r\n minWidth: 20,\r\n '.assetListItemLink &': {\r\n display: 'flex',\r\n width: '32px',\r\n height: '32px',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: '10px',\r\n flexShrink: 0,\r\n borderRadius: '4px',\r\n },\r\n },\r\n },\r\n MuiAvatar: {\r\n root: {\r\n '.assetListItemLink &': {\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n backgroundColor: bookitColors.grayscale.graySelection,\r\n width: '32px',\r\n height: '32px',\r\n borderRadius: '4px',\r\n },\r\n },\r\n },\r\n MuiTableContainer: {\r\n root: {\r\n overflowX: 'unset',\r\n height: 'inherit',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflowY: 'hidden',\r\n },\r\n },\r\n MuiTable: {\r\n root: {\r\n //flex test -----\r\n // display: 'flex',\r\n // flexFlow: 'column nowrap',\r\n // flex: '1 1 auto',\r\n //---------------\r\n padding: 0,\r\n borderRadius: '8px',\r\n boxShadow: `inset 0px 0px 1px 1px ${bookitColors.grayscale.grayBorders}`,\r\n [breakpoints.down('md')]: {\r\n display: 'block',\r\n overflowX: 'auto',\r\n height: '100%',\r\n },\r\n },\r\n },\r\n MuiTableHead: {\r\n root: {\r\n //flex test -----\r\n // display: 'flex',\r\n // flexFlow: 'row nowrap',\r\n // alignItems: 'flex-start',\r\n //width: 'inherit',\r\n //---------------\r\n padding: 0,\r\n },\r\n },\r\n MuiTableBody: {\r\n root: {\r\n //flex test -----\r\n // display: 'flex',\r\n // flexFlow: 'row wrap',\r\n // width: 'inherit',\r\n //---------------\r\n padding: 0,\r\n },\r\n },\r\n MuiTableRow: {\r\n root: {\r\n //flex test -----\r\n // display: 'flex',\r\n // flex: '1 1 auto',\r\n // width: 'inherit',\r\n //---------------\r\n '& td:first-child ': {\r\n boxShadow: `0px 1px 0px 0px ${bookitColors.grayscale.grayBorders}`,\r\n },\r\n '& th:first-child ': {\r\n boxShadow: `0px 1px 0px 0px ${bookitColors.grayscale.grayBorders}`,\r\n },\r\n },\r\n },\r\n MuiTableCell: {\r\n root: {\r\n //flex test -----\r\n // display: 'flex',\r\n // flexFlow: 'row nowrap',\r\n // flexGrow: 1,\r\n // flexBasis: 0,\r\n //---------------\r\n //height: '32px',\r\n ...bodyS,\r\n boxShadow: `-1px 1px 0px ${bookitColors.grayscale.grayBorders}`,\r\n borderBottom: 'unset',\r\n height: '56px',\r\n color: bookitColors.grayscale.blackRegular,\r\n [breakpoints.down('md')]: {\r\n whiteSpace: 'nowrap',\r\n },\r\n },\r\n head: {\r\n lineHeight: '164%',\r\n fontWeight: 'bold',\r\n padding: '4px 12px',\r\n gap: '10px',\r\n whiteSpace: 'nowrap',\r\n },\r\n body: {\r\n fontWeight: 'normal',\r\n lineHeight: '141%',\r\n padding: '8px 12px',\r\n gap: '10px',\r\n '& > span a': {\r\n color: bookitColors.primary.regular, // accentColors.colorAccentRegular,\r\n },\r\n '& > span > button': {\r\n color: bookitColors.primary.regular, //accentColors.colorAccentRegular,\r\n },\r\n '& > a': {\r\n color: bookitColors.primary.regular, // accentColors.colorAccentRegular,\r\n },\r\n '& > button': {\r\n color: bookitColors.primary.regular, // accentColors.colorAccentRegular,\r\n },\r\n // '& > span': {\r\n // display: 'inline-block',\r\n // whiteSpace: 'break-spaces',\r\n // maxWidth: '25ch',\r\n // minWidth: '6ch',\r\n // //overflow: 'hidden',\r\n // //textOverflow: 'ellipsis',\r\n // },\r\n },\r\n sizeSmall: {\r\n height: '40px',\r\n padding: '0px 12px',\r\n gap: '10px',\r\n },\r\n footer: {\r\n lineHeight: '164%',\r\n fontWeight: 'bold',\r\n padding: '12px',\r\n },\r\n },\r\n MuiTableSortLabel: {\r\n root: {\r\n cursor: 'pointer',\r\n '&$active': {\r\n // && instead of & is a workaround for https://github.com/cssinjs/jss/issues/1045\r\n '&& $icon': {\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n },\r\n '&:focus': {\r\n '&& $icon': {\r\n fontSize: 16,\r\n opacity: 0.5,\r\n },\r\n },\r\n },\r\n icon: {\r\n fontSize: '12px',\r\n cursor: 'pointer',\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n },\r\n MuiTablePagination: {\r\n root: {\r\n fontSize: '14px',\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n caption: {\r\n fontSize: '14px', // convert('14px', 'em'),\r\n fontWeight: 'bold',\r\n letterSpacing: '0.1px',\r\n lineHeight: '151%',\r\n },\r\n spacer: {\r\n flex: 'none',\r\n },\r\n input: {\r\n marginRight: 'auto',\r\n marginLeft: 0,\r\n },\r\n selectRoot: {\r\n fontWeight: 'bold',\r\n },\r\n select: {\r\n '&:focus': {\r\n border: `1px solid ${bookitColors.primary.hover}`,\r\n background: bookitColors.primary.background,\r\n borderRadius: '6px',\r\n fontWeight: 'bold',\r\n color: bookitColors.primary.dark,\r\n },\r\n },\r\n toolbar: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: '16px',\r\n fontWeight: 'bold',\r\n fontSize: '14px',\r\n minHeight: '40px',\r\n },\r\n menuItem: {\r\n padding: '10px 16px',\r\n gap: '12px',\r\n fontSize: '14px',\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n },\r\n MuiTextField: {\r\n root: {\r\n '&.startIcon': {\r\n '& > label': {\r\n marginLeft: '24px',\r\n },\r\n },\r\n // '&.textTable': {\r\n // minWidth: '80px',\r\n // },\r\n },\r\n },\r\n MuiChip: {\r\n root: {\r\n '&.recentItem': {\r\n display: 'flex',\r\n height: '32px',\r\n padding: '0px 8px',\r\n alignItems: 'center',\r\n gap: '12px',\r\n flexShrink: 0,\r\n justifyContent: 'flex-start',\r\n ...bodyS,\r\n borderRadius: '4px',\r\n background: bookitColors.base.white,\r\n '& [class*=\"MuiChip-avatar\"]': {\r\n margin: 0,\r\n width: 16,\r\n height: 16,\r\n color: bookitColors.grayscale.grayComponents,\r\n },\r\n '&$disabled': {\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n opacity: 1,\r\n },\r\n '&:hover, &:focus': {\r\n backgroundColor: bookitColors.grayscale.grayBackground,\r\n },\r\n '&:active': {\r\n backgroundColor: bookitColors.grayscale.graybgComponents,\r\n boxShadow: 'none',\r\n },\r\n '& [class*=\"MuiChip-label\"]': {\r\n flex: '1 0 0',\r\n padding: 0,\r\n },\r\n },\r\n },\r\n clickable: {\r\n '&:focus': {\r\n backgroundColor: bookitColors.grayscale.grayComponentsLight,\r\n color: bookitColors.base.black,\r\n },\r\n '&:hover': {\r\n backgroundColor: bookitColors.grayscale.grayComponentsLight,\r\n color: bookitColors.base.black,\r\n },\r\n },\r\n },\r\n MuiButton: MuiButtonOverride,\r\n MuiIconButton: MuiIconButtonOverride,\r\n MuiToggleButtonGroup: MuiToggleButtonGroupOverride,\r\n MuiToggleButton: MuiToggleButtonOverride,\r\n MuiSwitch: {\r\n //TO DO: set a padding: '0px' after Toggle component will replace a Switch component\r\n /* Styles applied to the root element. */\r\n root: {\r\n display: 'inline-flex',\r\n width: 36,\r\n height: 20,\r\n overflow: 'hidden',\r\n padding: '0px',\r\n boxSizing: 'border-box',\r\n position: 'relative',\r\n flexShrink: 0,\r\n zIndex: 0,\r\n // Reset the stacking context.\r\n verticalAlign: 'middle',\r\n // For correct alignment with the text.\r\n '@media print': {\r\n colorAdjust: 'exact',\r\n },\r\n // '&>[class*=\"PrivateSwitchBase-root\"]': {\r\n // padding: 2,\r\n // },\r\n },\r\n /* Styles applied to the internal `SwitchBase` component's `root` class. */\r\n switchBase: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n zIndex: 1,\r\n // Render above the focus ripple.\r\n color: bookitColors.grayscale.grayComponents,\r\n transition: transitions.create(['left', 'transform'], {\r\n duration: transitions.duration.shortest,\r\n }),\r\n padding: '2px',\r\n border: 0,\r\n '&$checked': {\r\n transform: 'translateX(16px)',\r\n },\r\n '&$disabled': {\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n '&$checked + $track': {\r\n opacity: 'unset',\r\n },\r\n '&$disabled + $track': {\r\n opacity: 'unset',\r\n },\r\n },\r\n /* Pseudo-class applied to the internal `SwitchBase` component's `checked` class. */\r\n checked: {},\r\n\r\n /* Pseudo-class applied to the internal SwitchBase component's disabled class. */\r\n disabled: {},\r\n\r\n /* Styles applied to the internal SwitchBase component's input element. */\r\n input: {\r\n left: '-100%',\r\n width: '300%',\r\n },\r\n /* Styles applied to the internal SwitchBase component's root element if `color=\"primary\"`. */\r\n colorPrimary: {\r\n '&$checked': {\r\n color: bookitColors.primary.components,\r\n '&:hover': {\r\n //backgroundColor: bookitColors.primary.componentsLight,\r\n '@media (hover: none)': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n '&$disabled': {\r\n color: bookitColors.grayscale.graySelection,\r\n //backgroundColor: bookitColors.grayscale.graySelection,\r\n },\r\n '&$checked + $track': {\r\n backgroundColor: bookitColors.primary.components,\r\n },\r\n '&.Mui-checked.Mui-disabled + $track': {\r\n backgroundColor: bookitColors.primary.disabled,\r\n },\r\n '&$disabled + $track': {\r\n backgroundColor: bookitColors.grayscale.graySelection,\r\n },\r\n },\r\n /* Styles applied to the internal SwitchBase component's root element if `color=\"secondary\"`. */\r\n colorSecondary: {\r\n '&$checked': {\r\n color: bookitColors.danger.regular,\r\n '&:hover': {\r\n '@media (hover: none)': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n '&$disabled': {\r\n color: bookitColors.danger.disabled,\r\n },\r\n '&$checked + $track': {\r\n backgroundColor: bookitColors.danger.regular,\r\n },\r\n '&.Mui-checked.Mui-disabled + $track': {\r\n backgroundColor: bookitColors.danger.disabled,\r\n },\r\n '&$disabled + $track': {\r\n backgroundColor: bookitColors.grayscale.graySelection,\r\n border: `1px solid ${bookitColors.danger.borders}`,\r\n },\r\n },\r\n /* Styles applied to the root element if `size=\"small\"`. */\r\n sizeSmall: {\r\n width: 36,\r\n height: 20,\r\n padding: 0,\r\n '& $thumb': {\r\n width: 16,\r\n height: 16,\r\n },\r\n '& $switchBase': {\r\n padding: 2,\r\n '&$checked': {\r\n transform: 'translateX(16px)',\r\n },\r\n },\r\n },\r\n /* Styles used to create the thumb passed to the internal `SwitchBase` component `icon` prop. */\r\n thumb: {\r\n backgroundColor: bookitColors.base.white,\r\n borderRadius: '8px',\r\n height: '16px',\r\n position: 'relative',\r\n width: '16px',\r\n boxShadow: box_shadow_s,\r\n },\r\n /* Styles applied to the track element. */\r\n track: {\r\n borderRadius: '100px',\r\n padding: '0px',\r\n height: '100%',\r\n width: '100%',\r\n zIndex: -1,\r\n transition: 'unset',\r\n backgroundColor: bookitColors.grayscale.grayComponentsLight,\r\n opacity: 'unset',\r\n },\r\n },\r\n MuiFormControl: {\r\n /* Styles applied to the root element. */\r\n root: {\r\n display: 'inline-flex',\r\n flexDirection: 'column',\r\n position: 'relative',\r\n // Reset fieldset default style.\r\n minWidth: 0,\r\n padding: 0,\r\n margin: 0,\r\n border: 0,\r\n verticalAlign: 'top', // Fix alignment issue on Safari.\r\n\r\n minHeight: '20px',\r\n // alignItems: 'center',\r\n gap: '8px',\r\n flexShrink: 0,\r\n '&.boxed': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'flex-start',\r\n gap: '8px',\r\n },\r\n '&.inputSizeMedium.withLabel': {\r\n marginTop: '16px',\r\n },\r\n '&.inputSizeSmall.withLabel': {\r\n marginTop: '16px',\r\n },\r\n '&.separate-picker': {\r\n // flexDirection: 'row',\r\n // flexShrink: 1,\r\n // marginBottom: '18px',\r\n '& .separate-picker-inputs': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flex: '1 1 auto',\r\n alignSelf: 'stretch',\r\n alignItems: 'center',\r\n gap: 8,\r\n },\r\n '&.withLabel': {\r\n marginTop: '16px',\r\n },\r\n },\r\n '&.separate-time-picker': {\r\n flexShrink: 1,\r\n },\r\n '&.separate-date-picker': {\r\n flexShrink: 1,\r\n },\r\n '&.datetime-picker': {\r\n // flexDirection: 'row',\r\n // flexShrink: 1,\r\n // marginBottom: '18px',\r\n '& .datetime-picker-inputs': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flex: '1 1 auto',\r\n alignSelf: 'stretch',\r\n alignItems: 'center',\r\n gap: 8,\r\n },\r\n // '&.withLabel': {\r\n // marginTop: '16px',\r\n // },\r\n },\r\n '&.datetime-time-picker': {\r\n flexShrink: 1,\r\n },\r\n '&.datetime-date-picker': {\r\n flexShrink: 1,\r\n },\r\n '&.date-dropdown-picker': {\r\n // flexDirection: 'row',\r\n // flexShrink: 1,\r\n // marginBottom: '18px',\r\n '& .date-dropdown-picker-inputs': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flex: '1 1 auto',\r\n alignSelf: 'stretch',\r\n alignItems: 'center',\r\n gap: 8,\r\n },\r\n '&.withLabel': {\r\n marginTop: '16px',\r\n },\r\n },\r\n '&.time-options-picker': {\r\n marginTop: '20px',\r\n '&.withLabel': {\r\n marginTop: '20px',\r\n },\r\n },\r\n '&.formLabelText': {\r\n gap: 0,\r\n },\r\n '&.ghostInput': {\r\n display: 'flex',\r\n minHeight: '48px',\r\n padding: '5px 0px',\r\n alignItems: 'center',\r\n gap: '10px',\r\n flexShrink: 0,\r\n borderRadius: '8px',\r\n '& .ghosInputText': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: '1 1 0',\r\n alignItems: 'flex-start',\r\n alignSelf: 'stretch',\r\n width: '100%',\r\n },\r\n },\r\n },\r\n\r\n /* Styles applied to the root element if `margin=\"normal\"`. */\r\n marginNormal: {\r\n marginTop: 16,\r\n marginBottom: 8,\r\n },\r\n\r\n /* Styles applied to the root element if `margin=\"dense\"`. */\r\n marginDense: {\r\n marginTop: 8,\r\n marginBottom: 4,\r\n },\r\n\r\n /* Styles applied to the root element if `fullWidth={true}`. */\r\n fullWidth: {\r\n width: '100%',\r\n },\r\n },\r\n MuiFormControlLabel: {\r\n /* Styles applied to the root element. */\r\n root: {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n cursor: 'pointer',\r\n // For correct alignment with the text.\r\n verticalAlign: 'middle',\r\n WebkitTapHighlightColor: 'transparent',\r\n marginLeft: 0,\r\n marginRight: 0,\r\n gap: 8,\r\n // used for row presentation of radio/checkbox\r\n '&$disabled': {\r\n cursor: 'default',\r\n },\r\n '&.boldLabel': {\r\n '& $label': {\r\n ...boldS,\r\n '&$disabled': {\r\n color: bookitColors.grayscale.graySubtitles,\r\n },\r\n },\r\n },\r\n },\r\n /* Styles applied to the root element if `labelPlacement=\"start\"`. */\r\n labelPlacementStart: {\r\n flexDirection: 'row-reverse',\r\n marginLeft: 16,\r\n // used for row presentation of radio/checkbox\r\n marginRight: -11,\r\n },\r\n\r\n /* Styles applied to the root element if `labelPlacement=\"top\"`. */\r\n labelPlacementTop: {\r\n flexDirection: 'column-reverse',\r\n marginLeft: 0,\r\n marginRight: 2,\r\n },\r\n\r\n /* Styles applied to the root element if `labelPlacement=\"bottom\"`. */\r\n labelPlacementBottom: {\r\n flexDirection: 'column',\r\n marginLeft: 16,\r\n },\r\n\r\n /* Pseudo-class applied to the root element if `disabled={true}`. */\r\n disabled: {},\r\n\r\n /* Styles applied to the label's Typography component. */\r\n label: {\r\n ...bodyS,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n // maxWidth: '25ch',\r\n '&$disabled': {\r\n color: bookitColors.grayscale.graySubtitles,\r\n },\r\n },\r\n },\r\n MuiCheckbox: {\r\n root: {\r\n color: bookitColors.grayscale.graySelection,\r\n // '&[class*=\"PrivateSwitchBase-root\"]': {\r\n // padding: 0,\r\n // },\r\n },\r\n colorPrimary: {\r\n color: bookitColors.primary.borders,\r\n '&$checked': {\r\n color: bookitColors.primary.regular,\r\n '&:hover': {\r\n backgroundColor: bookitColors.base.white,\r\n // Reset on touch devices, it doesn't add specificity\r\n '@media (hover: none)': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n '&$disabled': {\r\n color: bookitColors.primary.disabled,\r\n },\r\n },\r\n /* Styles applied to the root element if `color=\"secondary\"`. */\r\n colorSecondary: {\r\n color: bookitColors.danger.borders,\r\n '&$checked': {\r\n color: bookitColors.danger.regular,\r\n '&:hover': {\r\n backgroundColor: bookitColors.base.white,\r\n // Reset on touch devices, it doesn't add specificity\r\n '@media (hover: none)': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n '&$disabled': {\r\n color: bookitColors.danger.disabled,\r\n },\r\n },\r\n },\r\n MuiRadio: {\r\n /* Styles applied to the root element. */\r\n root: {\r\n color: bookitColors.base.white,\r\n },\r\n\r\n /* Pseudo-class applied to the root element if `checked={true}`. */\r\n checked: {},\r\n\r\n /* Pseudo-class applied to the root element if `disabled={true}`. */\r\n disabled: {},\r\n\r\n /* Styles applied to the root element if `color=\"primary\"`. */\r\n colorPrimary: {\r\n '&$checked': {\r\n color: bookitColors.primary.components,\r\n '&:hover': {\r\n backgroundColor: bookitColors.primary.regular,\r\n // Reset on touch devices, it doesn't add specificity\r\n '@media (hover: none)': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n '&$disabled': {\r\n color: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n\r\n /* Styles applied to the root element if `color=\"secondary\"`. */\r\n colorSecondary: {\r\n '&$checked': {\r\n color: bookitColors.danger.components,\r\n '&:hover': {\r\n backgroundColor: bookitColors.danger.regular,\r\n // Reset on touch devices, it doesn't add specificity\r\n '@media (hover: none)': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n '&$disabled': {\r\n color: bookitColors.danger.disabled,\r\n },\r\n },\r\n },\r\n PrivateSwitchBase: {\r\n root: {\r\n padding: 0,\r\n },\r\n checked: {},\r\n disabled: {},\r\n input: {\r\n cursor: 'inherit',\r\n position: 'absolute',\r\n opacity: 0,\r\n width: '100%',\r\n height: '100%',\r\n top: 0,\r\n left: 0,\r\n margin: 0,\r\n padding: 0,\r\n zIndex: 1,\r\n },\r\n },\r\n MuiBadge: {\r\n badge: {\r\n whiteSpace: 'nowrap',\r\n height: '14px',\r\n padding: '2px 0px',\r\n fontSize: '8px',\r\n minWidth: '14px',\r\n lineHeight: '168%',\r\n letterSpacing: '0.8px',\r\n },\r\n },\r\n MUIDataTableBodyCell: {\r\n root: {\r\n padding: '0px 8px 0px 8px',\r\n //textAlign: 'center',\r\n },\r\n // stackedCommon: {\r\n // display: 'flex',\r\n // // alignItems: 'center',\r\n // // flexWrap: 'nowrap',\r\n // // justifyContent: 'center',\r\n // },\r\n },\r\n MUIDataTableBody: {\r\n root: {\r\n border: '1px solid #ccc',\r\n },\r\n },\r\n MUIDataTableHeadCell: {\r\n root: {\r\n border: '1px solid #ccc',\r\n },\r\n contentWrapper: {\r\n //justifyContent: 'center',\r\n },\r\n data: {\r\n fontWeight: 'bold',\r\n },\r\n fixedHeader: {\r\n //textAlign: 'center',\r\n fontWeight: 'bold',\r\n border: '1px solid #ccc',\r\n },\r\n toolButton: {\r\n whiteSpace: 'nowrap',\r\n },\r\n },\r\n MUIDataTableToolbarSelect: {\r\n title: {\r\n paddingRight: '26px',\r\n paddingLe: '26px',\r\n fontSize: '1rem',\r\n fontWeight: 700,\r\n lineHeight: '1.5rem',\r\n },\r\n },\r\n MuiDialog: {\r\n root: {},\r\n paper: {\r\n //width: '100%',\r\n borderRadius: '12px',\r\n '.coverRoot &': {\r\n margin: '0px 4px',\r\n overflowY: 'hidden',\r\n borderRadius: '12px 12px 0px 0px',\r\n },\r\n },\r\n paperWidthXs: {\r\n maxWidth: '480px',\r\n },\r\n scrollPaper: {\r\n '.coverRoot &': {\r\n justifyContent: 'flex-end',\r\n alignItems: 'flex-end',\r\n },\r\n },\r\n paperWidthFalse: {\r\n '.coverRoot &': {\r\n maxWidth: COVER_WIDTH,\r\n },\r\n },\r\n paperScrollPaper: {\r\n '.coverRoot &': {\r\n maxHeight: 'calc(100% - 50px)',\r\n // height: '100vh',\r\n },\r\n },\r\n paperFullWidth: {\r\n '.coverRoot &': {\r\n width: '100%',\r\n },\r\n },\r\n },\r\n MuiBackdrop: {\r\n root: {\r\n '&.sidePanelBackdrop': {\r\n zIndex: 1201,\r\n },\r\n },\r\n },\r\n MuiAlert: {\r\n root: {\r\n padding: '0px 12px',\r\n '&.showMore': {\r\n alignItems: 'center',\r\n },\r\n },\r\n action: {\r\n flexDirection: 'column',\r\n justifyContent: 'space-between',\r\n },\r\n },\r\n MuiMenu: {\r\n paper: {\r\n '.hoverChildMenu &': {\r\n boxShadow: box_shadow_m,\r\n background: bookitColors.base.white,\r\n borderRadius: '8px',\r\n },\r\n },\r\n list: {\r\n '.hoverChildMenu &': {\r\n display: 'flex',\r\n padding: '8px 0px 12px 0px',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n '& .menuItemName': {\r\n display: 'flex',\r\n padding: '4px 12px 8px 16px',\r\n alignItems: 'flex-start',\r\n gap: '10px',\r\n alignSelf: 'stretch',\r\n cursor: 'unset',\r\n color: bookitColors.grayscale.blackRegular,\r\n '&:hover': {\r\n background: 'inherit',\r\n },\r\n },\r\n '& .menuItem': {\r\n display: 'flex',\r\n width: '240px',\r\n height: '32px',\r\n padding: '0px 8px',\r\n alignItems: 'center',\r\n gap: '8px',\r\n '& .menuItemContent': {\r\n display: 'flex',\r\n paddingLeft: '8px',\r\n alignItems: 'center',\r\n gap: '8px',\r\n flex: '1 0 0',\r\n '& .menuItemIcon': {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '7.5px',\r\n width: 'auto',\r\n height: 16,\r\n color: bookitColors.grayscale.grayComponents,\r\n '& > svg': {\r\n width: '16px',\r\n },\r\n },\r\n '& .menuItemText': {\r\n flex: '1 0 0',\r\n color: bookitColors.grayscale.blackRegular,\r\n ...bookitTypography.bodyS,\r\n cursor: 'pointer',\r\n whiteSpace: 'initial',\r\n },\r\n },\r\n '&:hover, &:focus': {\r\n background: bookitColors.primary.bgHover,\r\n '& .menuItemContent': {\r\n '& .menuItemText': {\r\n ...bookitTypography.bodyS,\r\n },\r\n },\r\n },\r\n '&:active': {\r\n background: bookitColors.primary.bgHover,\r\n '& .menuItemContent': {\r\n '& .menuItemText': {\r\n ...bookitTypography.bodyS,\r\n },\r\n },\r\n },\r\n '&.Mui-selected': {\r\n background: bookitColors.primary.bgHover,\r\n '& .menuItemContent': {\r\n '& .menuItemText': {\r\n ...bookitTypography.bodyS,\r\n fontWeight: 600,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n MuiMenuItem: {\r\n root: {\r\n gap: 12,\r\n },\r\n dense: {\r\n paddingTop: '2px',\r\n paddingBottom: '2px',\r\n },\r\n },\r\n MuiPickersDatePickerRoot: {\r\n toolbar: {\r\n alignItems: 'flex-start',\r\n flexDirection: 'column',\r\n gap: '8px',\r\n },\r\n toolbarLandscape: {\r\n padding: 16,\r\n },\r\n dateLandscape: {\r\n marginRight: 16,\r\n },\r\n },\r\n MuiPickerDTToolbar: {\r\n toolbar: {\r\n paddingLeft: 16,\r\n paddingRight: 16,\r\n justifyContent: 'space-around',\r\n },\r\n separator: {\r\n margin: '0 4px 0 2px',\r\n cursor: 'default',\r\n ...buttonM,\r\n },\r\n },\r\n MuiDrawer: {\r\n root: {\r\n '&.sideBarDrawer': {\r\n gap: 8,\r\n width: DRAWER_WIDTH,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n backgroundColor: bookitColors.base.white,\r\n zIndex: 1200,\r\n '&.sideBarMobile': {\r\n width: 'calc(100% - 48px)', //DRAWER_MOBILE_WIDTH,\r\n },\r\n '&.drawerOpen': {\r\n width: DRAWER_WIDTH,\r\n transition: transitions.create('width', {\r\n easing: transitions.easing.sharp,\r\n duration: transitions.duration.enteringScreen,\r\n }),\r\n '&.sideBarMobile': {\r\n width: 'calc(100% - 48px)', //DRAWER_MOBILE_WIDTH,\r\n },\r\n },\r\n '&.drawerClose': {\r\n transition: transitions.create('width', {\r\n easing: transitions.easing.sharp,\r\n duration: transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: 0,\r\n [breakpoints.up('sm')]: {\r\n width: '60px',\r\n },\r\n },\r\n },\r\n },\r\n paper: {\r\n '.sideBarDrawer &': {\r\n background: bookitColors.base.white,\r\n position: 'fixed',\r\n whiteSpace: 'nowrap',\r\n width: DRAWER_WIDTH,\r\n transition: transitions.create('width', {\r\n easing: transitions.easing.sharp,\r\n duration: transitions.duration.enteringScreen,\r\n }),\r\n gap: '16px',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n paddingTop: '12px',\r\n '& .sideBarHeader': {\r\n // minHeight: '48px',\r\n // display: 'flex',\r\n // flexDirection: 'row',\r\n // justifyContent: 'space-between',\r\n // alignItems: 'center',\r\n // padding: props => (props.isOpen ? '0px 16px' : '0px 8px'),\r\n // gap: 16,\r\n display: 'flex',\r\n padding: '0px 8px 0px 16px',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n alignSelf: 'stretch',\r\n height: '32px',\r\n '&.sideBarHeaderMobile': {},\r\n '& .headerButtons': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n '& .headerButtonsMobile': {\r\n gap: '4px',\r\n },\r\n },\r\n '& .sideBarQickAction': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n alignSelf: 'stretch',\r\n padding: '0px 16px',\r\n gap: '10px',\r\n '&.sideBarQickActionMobile': {\r\n padding: '16px 16px 8px 16px',\r\n gap: '12px',\r\n },\r\n },\r\n },\r\n '.sideBarDrawer.sideBarMobile &': {\r\n width: 'calc(100% - 48px)', // DRAWER_MOBILE_WIDTH,\r\n gap: 0,\r\n },\r\n '.sideBarDrawer.drawerClose &': {\r\n overflowX: 'hidden',\r\n transition: transitions.create('width', {\r\n easing: transitions.easing.sharp,\r\n duration: transitions.duration.leavingScreen,\r\n }),\r\n width: '60px',\r\n '& .sideBarHeader': {\r\n padding: '0px 8px',\r\n },\r\n '& .sideBarQickAction': {\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n // [breakpoints.up('sm')]: {\r\n // width: 7 * 8 + 1,\r\n // },\r\n },\r\n },\r\n paperAnchorDockedLeft: {\r\n '.sideBarDrawer &': {\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n },\r\n },\r\n },\r\n // MuiPickerDTTabs: {\r\n // tabs: {\r\n // color: theme.palette.getContrastText(tabsBackground),\r\n // backgroundColor: tabsBackground,\r\n // },\r\n // },\r\n MuiPickersToolbar: {\r\n toolbar: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: 100,\r\n backgroundColor: bookitColors.primary.regular,\r\n // theme.palette.type === 'light'\r\n // ? theme.palette.primary.main\r\n // : theme.palette.background.default,\r\n },\r\n toolbarLandscape: {\r\n height: 'auto',\r\n maxWidth: 150,\r\n padding: 8,\r\n justifyContent: 'flex-start',\r\n },\r\n },\r\n MuiPickersToolbarButton: {\r\n toolbarBtn: {\r\n padding: 0,\r\n minWidth: '32px',\r\n textTransform: 'none',\r\n },\r\n },\r\n MuiPickersToolbarText: {\r\n toolbarTxt: {\r\n color: fade(bookitColors.base.white, 0.54),\r\n ...buttonM,\r\n },\r\n toolbarBtnSelected: {\r\n color: bookitColors.base.white,\r\n // color: theme.palette.type === 'light'\r\n // ? theme.palette.primary.contrastText\r\n // : theme.palette.getContrastText(theme.palette.background.default);,\r\n },\r\n },\r\n MuiAutocomplete: {\r\n inputRoot: {\r\n flexWrap: 'wrap',\r\n '.atable &': {\r\n flexWrap: 'nowrap',\r\n },\r\n '& $input': {\r\n width: 'auto',\r\n minWidth: 56,\r\n },\r\n '.date-dropdown-picker-inputs &': {\r\n '& $input': {\r\n width: '100%',\r\n minWidth: 30,\r\n },\r\n },\r\n },\r\n },\r\n MuiTabs: {\r\n root: {\r\n minHeight: '40px',\r\n '&.sizeSmall': {\r\n minHeight: '32px',\r\n },\r\n },\r\n flexContainer: {\r\n '.tabsHorizontal &': {\r\n gap: 24,\r\n },\r\n '.sizeSmall &': {\r\n '.tabsHorizontal &': {\r\n gap: 20,\r\n },\r\n },\r\n },\r\n scrollable: {},\r\n indicator: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n backgroundColor: bookitColors.primary.regular,\r\n // '& > span': {\r\n // maxWidth: 40,\r\n // width: '100%',\r\n // backgroundColor: '#635ee7',\r\n // },\r\n },\r\n },\r\n MuiTab: {\r\n root: {\r\n textTransform: 'none',\r\n ...bookitTypography.boldM,\r\n '.tabsHorizontal &': {\r\n padding: '8px 0px 0px',\r\n minHeight: '40px',\r\n alignItems: 'flex-start',\r\n gap: '4px',\r\n '&.tabSizeSmall': {\r\n minHeight: '32px',\r\n padding: '4px 0px 0px',\r\n ...bookitTypography.boldS,\r\n },\r\n [breakpoints.up('sm')]: {\r\n minWidth: 'auto',\r\n },\r\n },\r\n },\r\n wrapper: {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '100%',\r\n flexDirection: 'column',\r\n '.startIcon &': {\r\n flexDirection: 'row',\r\n gap: '8px',\r\n },\r\n '.endIcon &': {\r\n flexDirection: 'row',\r\n gap: '8px',\r\n },\r\n },\r\n textColorInherit: {\r\n color: bookitColors.grayscale.graySubtitles,\r\n opacity: 1,\r\n '&$selected': {\r\n color: bookitColors.grayscale.blackRegular,\r\n },\r\n '&$disabled': {\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n },\r\n },\r\n },\r\n MuiTooltip: {\r\n tooltip: {\r\n display: 'flex',\r\n padding: 12,\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n color: bookitColors.base.white,\r\n backgroundColor: bookitColors.overlays.overlayBlack,\r\n flex: '1 0 0',\r\n ...bookitTypography.bodyS,\r\n '.colorDark &': {\r\n color: bookitColors.base.white,\r\n backgroundColor: bookitColors.overlays.overlayBlack,\r\n },\r\n '.colorLight &': {\r\n color: bookitColors.base.black,\r\n backgroundColor: bookitColors.base.white,\r\n boxShadow: box_shadow_s,\r\n },\r\n '& .content': {\r\n maxHeight: 360,\r\n overflowY: 'auto',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: bookitColors.grayscale.grayBorders,\r\n '.colorDark &': {\r\n backgroundColor: bookitColors.overlays.overlayBlack,\r\n },\r\n },\r\n },\r\n },\r\n arrow: {\r\n color: bookitColors.overlays.overlayBlack,\r\n '.colorDark &': {\r\n color: bookitColors.overlays.overlayBlack,\r\n },\r\n '.colorLight &': {\r\n color: bookitColors.base.white,\r\n '&::before': {\r\n border: `1px solid ${bookitColors.grayscale.graySelection}`,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n};\r\nexport const darkTheme: ThemeOptions = {\r\n palette: {\r\n background: { default: grey[400], paper: grey[100] },\r\n primary: { main: green[100] },\r\n secondary: {\r\n main: '#4a4a4a',\r\n },\r\n text: {\r\n primary: '#e1dada',\r\n secondary: 'rgba(255, 255, 255, 0.54)',\r\n disabled: '#757575',\r\n },\r\n },\r\n};\r\nexport const animalsThemeSettings: ThemeOptions = {\r\n palette: {\r\n primary: {\r\n main: '#ffdc64',\r\n dark: '#c9ab33',\r\n light: '#ffff95',\r\n contrastText: '#000000',\r\n },\r\n secondary: {\r\n main: '#3247e1',\r\n dark: '#001fae',\r\n light: '#7673ff',\r\n contrastText: '#ffffff',\r\n },\r\n error: {\r\n main: '#E53F58',\r\n dark: '#AC2F42',\r\n light: '#F195A3',\r\n contrastText: '#ffffff',\r\n },\r\n background: {\r\n default: '#F3F3F3',\r\n paper: '#FFF',\r\n },\r\n default: {\r\n main: '#ffdc64',\r\n dark: '#c9ab33',\r\n light: '#ffff95',\r\n contrastText: '#000000',\r\n },\r\n },\r\n shape: {\r\n borderRadius: 12,\r\n },\r\n\r\n typography: {\r\n fontFamily: [\"'Open Sans Hebrew'\", 'system-ui'].join(','),\r\n h1: {\r\n //styleName: Bkt/Header 1;\r\n fontSize: '2.5rem',\r\n fontWeight: 700,\r\n lineHeight: '3rem',\r\n },\r\n h2: {\r\n //styleName: Bkt/Header 2;\r\n fontSize: '2rem',\r\n fontWeight: 700,\r\n lineHeight: '2.875rem', //46/16\r\n },\r\n h3: {\r\n //styleName: Bkt/Header 3;\r\n fontSize: '1.5rem',\r\n fontWeight: 700,\r\n lineHeight: '2.375rem', //46/16\r\n },\r\n h4: {\r\n //styleName: Bkt/Header 4:\r\n fontSize: '1.5rem',\r\n fontWeight: 700,\r\n lineHeight: '2rem',\r\n },\r\n h5: {\r\n fontSize: '1.25rem',\r\n fontWeight: 700,\r\n lineHeight: '1.5rem',\r\n },\r\n h6: {\r\n fontSize: '1rem',\r\n fontWeight: 700,\r\n lineHeight: '1.375rem',\r\n },\r\n subtitle1: {\r\n fontSize: '1.25rem',\r\n lineHeight: '2rem',\r\n fontWeight: 700,\r\n },\r\n subtitle2: {\r\n fontSize: '1.25rem',\r\n lineHeight: '2rem',\r\n fontWeight: 400,\r\n },\r\n body1: {\r\n fontSize: '1rem',\r\n lineHeight: '1.375rem',\r\n fontWeight: 400,\r\n },\r\n body2: {\r\n fontSize: '1rem',\r\n lineHeight: '1.375rem',\r\n fontWeight: 400,\r\n //color: grey[600],\r\n },\r\n },\r\n overrides: {\r\n MuiTextField: {},\r\n MuiAppBar: {},\r\n },\r\n};\r\n\r\nexport const CreateTheme = (direction, baseTheme: BaseTheme) =>\r\n createMuiTheme(getBaseTheme(baseTheme), { direction: direction }); //DefaultThemeSettings\r\n\r\nconst getBaseTheme = (type: BaseTheme) => {\r\n switch (type) {\r\n case 'bookit':\r\n return BookitThemeSettings;\r\n case 'animals':\r\n return animalsThemeSettings;\r\n case 'dark':\r\n return darkTheme;\r\n case 'default':\r\n default:\r\n return DefaultThemeSettings;\r\n }\r\n};\r\n","/**\r\n *\r\n * BuildingPickerFilter\r\n *\r\n */\r\nimport { BuildingPicker } from 'app/components/pickers/AutocompletePickers/BuildingPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const BuildingPickerFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * LocationPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ILocationListDto } from 'api/odata/generated/entities/ILocationListDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface LocationPickerProps\r\n extends Omit, 'loadData'> {\r\n withoutServiceGroups?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/LocationList';\r\nexport const initLocationData = (\r\n initval: string | undefined,\r\n): Promise => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as ILocationListDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select:\r\n 'Id,Name,LocationTypeId,LocationType,RoomId,RoomName,SubLocationListCount,ServiceGroups',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as ILocationListDto[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter?: Entity[],\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'LocationType',\r\n 'LocationTypeId',\r\n 'RoomId',\r\n 'RoomName',\r\n 'SubLocationListCount',\r\n 'ServiceGroups',\r\n ],\r\n globalServiceGroupFilter:\r\n globalServiceGroupFilter?.map(\r\n serviceGroup =>\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n serviceGroup.Id,\r\n 'Id',\r\n ),\r\n ) ?? [],\r\n isOptionalServiceGroup: true,\r\n });\r\nexport function LocationPicker(props: LocationPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n !props.withoutServiceGroups\r\n ? globalServiceGroupFilter || undefined\r\n : undefined,\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ServiceGroupsPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport {\r\n AutocompleteMultiPickerEx,\r\n AutocompleteMultiPickerExProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport { IServiceGroupDto } from 'api/odata/generated/entities/IServiceGroupDto';\r\nimport { GroupUrl } from '../../ServiceGroupPicker';\r\nimport { splitFilterValue } from 'app/components/BasicTable/types/FilterParam';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectIsAuthenticated } from 'app/slice/selectors';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\n\r\nexport interface ServiceGroupsPickerProps\r\n extends Omit, 'loadData'> {\r\n inputProps?: InputBaseComponentProps;\r\n selectArray?: Array;\r\n urlType?: GroupUrl;\r\n separator?: string;\r\n useSearchOrPredicate?: boolean;\r\n}\r\nconst url = '/api/odata/v4/servicegroups';\r\nconst adminUrl = '/api/odata/v4/servicegroups/GetAdminServiceGroups';\r\nconst publicUrl = '/api/odata/v4/servicegroups/GetPublicServiceGroups';\r\nconst regPublicUrl = '/api/odata/v4/servicegroups/GetRegistrationServiceGroups';\r\n\r\nexport const initServiceGroupsMultiData = (\r\n initval: string | undefined,\r\n sourceUrl?: GroupUrl,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IServiceGroupDto[]);\r\n });\r\n } else {\r\n let ids = splitFilterValue(initval).map(item => {\r\n return { Id: parseInt(item) };\r\n }) as Identifiable[];\r\n let filters: string | undefined = undefined;\r\n if (ids.length > 0) {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(new Condition('Id', ODataOperators.Includes, ids));\r\n filters = predicates.map(f => f.toString()).join(' and ');\r\n }\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: filters,\r\n $select: 'Id,Name,DivisionId,DivisionName',\r\n };\r\n let initUrl =\r\n sourceUrl === undefined\r\n ? url\r\n : sourceUrl === 'public'\r\n ? publicUrl\r\n : sourceUrl === 'regpublic'\r\n ? regPublicUrl\r\n : sourceUrl === 'admin'\r\n ? adminUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as IServiceGroupDto[]);\r\n }\r\n};\r\n\r\nexport const initFiltersServiceGroupsData = (filter: string | undefined) => {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: filter,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n isAuthenticated?: boolean,\r\n urlType?: GroupUrl,\r\n useSearchOrPredicate?: boolean,\r\n) => {\r\n const sourceUrl =\r\n urlType === 'public' || !isAuthenticated\r\n ? publicUrl\r\n : urlType === 'regpublic'\r\n ? regPublicUrl\r\n : urlType === 'admin'\r\n ? adminUrl\r\n : url;\r\n let filters: (string | Condition)[] = [];\r\n if (sourceUrl === url) {\r\n if (!!predicates && predicates.length > 0) {\r\n filters = [...predicates, ...['Active eq true']];\r\n } else {\r\n filters = ['Active eq true'];\r\n }\r\n }\r\n\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: filters,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name', 'DivisionId', 'DivisionName'],\r\n useSearchOrPredicate: useSearchOrPredicate,\r\n });\r\n};\r\nexport const ServiceGroupByDivisionsFilter = (value: FilterValueType) => {\r\n if (value !== undefined && value !== null && Array.isArray(value)) {\r\n return [\r\n `${new Condition(\r\n 'DivisionId',\r\n ODataOperators.Includes,\r\n (value as Identifiable[]).map(f => f.Id),\r\n ).toString()}`,\r\n ];\r\n }\r\n return [];\r\n};\r\nexport function ServiceGroupsPicker(props: ServiceGroupsPickerProps) {\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n const { predicates, urlType, useSearchOrPredicate, ...other } = props;\r\n const innerLoadData = loadData(\r\n predicates,\r\n isAuth,\r\n urlType,\r\n useSearchOrPredicate,\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useEffectOnMount } from './useEffectOnMount';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\n\r\nexport const useGlobalServiceGroupsFilter = (\r\n applyGlobalServiceGroupsFilter: boolean,\r\n) => {\r\n const dispatch = useDispatch();\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const gloabalSettings = useSelector(selectglobalSettings);\r\n const { actions } = useAppSettingsSlice();\r\n useEffectOnMount(() => {\r\n dispatch(\r\n actions.showGlobalServiceGroupFilter(\r\n !gloabalSettings.GetBooleanByKey(\r\n AllowedSettings.HideTopServiceGroupFilter,\r\n ) && applyGlobalServiceGroupsFilter,\r\n ),\r\n );\r\n });\r\n const serviceGroups = React.useMemo(() => {\r\n return applyGlobalServiceGroupsFilter ? selectedServiceGroups || [] : [];\r\n }, [applyGlobalServiceGroupsFilter, selectedServiceGroups]);\r\n return { serviceGroups };\r\n};\r\n","/**\r\n *\r\n * ButtonConfirm\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\n\r\nexport interface ButtonConfirmProps extends Omit {\r\n onClick: React.MouseEventHandler;\r\n confirmationDialogTitle?: string;\r\n confirmationDialogBody?: string;\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * Button with a confirmation dialog\r\n * @param param0 primary click handler\r\n * @returns\r\n */\r\nexport function ButtonConfirm({\r\n onClick,\r\n confirmationDialogTitle,\r\n confirmationDialogBody,\r\n ...props\r\n}: ButtonConfirmProps) {\r\n const { t } = useTranslation();\r\n const [open, setOpen] = React.useState(false);\r\n const title = confirmationDialogTitle ?? t(translations.Confirm);\r\n const body = confirmationDialogBody ?? t(translations.AreYouSure);\r\n const handleConfirmClick = e => {\r\n setOpen(false);\r\n onClick(e);\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 function ArrayRenderer(\r\n callback: (value: T, original: IAsset | undefined) => ReactNode | undefined,\r\n) {\r\n const mapper = (props: AttributeValue) => {\r\n if (!!props.value && !!props.value.length) {\r\n return (\r\n //
      \r\n // {props.value.map(v => (\r\n //
    • {callback(v, props.original)}
    • \r\n // ))}\r\n //
    \r\n \r\n {props.value.map((v, indx) => (\r\n \r\n \r\n {callback(v, props.original)}\r\n \r\n \r\n ))}\r\n \r\n );\r\n }\r\n };\r\n return mapper;\r\n}\r\nexport const AssetDetailsImageRender = (\r\n props: AttributeValue,\r\n): ReactNode => {\r\n const theme = useTheme();\r\n const defaultImgSrc = process.env.PUBLIC_URL + `/images/400x300.png`;\r\n const defaultImgMobileSrc = process.env.PUBLIC_URL + `/images/200x150.png`;\r\n const defaultImg = React.useMemo(() => {\r\n return props.shortView ? defaultImgMobileSrc : defaultImgSrc;\r\n }, [defaultImgMobileSrc, defaultImgSrc, props.shortView]);\r\n\r\n const [pathSrc, setPathSrc] = React.useState(defaultImg);\r\n\r\n const [loadingImg, setLoadingImg] = React.useState(\r\n undefined,\r\n );\r\n const [imageDimensions, setImageDimensions] = React.useState<\r\n DemSize | undefined\r\n >(undefined);\r\n const checkImage = React.useCallback(\r\n async (path: any) =>\r\n new Promise<{\r\n path?: string;\r\n status: string;\r\n height: number;\r\n width: number;\r\n }>(resolve => {\r\n const img = new Image();\r\n img.src = props.value;\r\n img.onload = () =>\r\n resolve({ path, status: 'ok', height: img.height, width: img.width });\r\n img.onerror = () =>\r\n resolve({\r\n path,\r\n status: 'error',\r\n height: props.shortView ? 150 : 300,\r\n width: props.shortView ? 200 : 400,\r\n });\r\n }),\r\n [props.shortView, props.value],\r\n );\r\n React.useEffect(() => {\r\n let active = props.value !== undefined && loadingImg === undefined;\r\n if (active) {\r\n if (loadingImg) return;\r\n setLoadingImg(true);\r\n (async () => {\r\n try {\r\n const res = await checkImage(props.value);\r\n if (res.status === 'ok') {\r\n setPathSrc(res.path);\r\n setImageDimensions({\r\n height: res.height,\r\n width: res.width,\r\n });\r\n setLoadingImg(false);\r\n } else {\r\n setPathSrc(defaultImg);\r\n setImageDimensions({\r\n height: res.height,\r\n width: res.width,\r\n });\r\n setLoadingImg(false);\r\n }\r\n } catch {\r\n setPathSrc(defaultImg);\r\n setImageDimensions({\r\n height: props.shortView ? 150 : 300,\r\n width: props.shortView ? 200 : 400,\r\n });\r\n setLoadingImg(false);\r\n }\r\n })();\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [checkImage, defaultImg, loadingImg, props.shortView, props.value]);\r\n const backgroundSize = React.useMemo(() => {\r\n if (!!imageDimensions) {\r\n let horizontal = imageDimensions.width - imageDimensions.height > 0;\r\n if (\r\n imageDimensions.height === imageDimensions.width ||\r\n (horizontal && imageDimensions.width / 1.1 < imageDimensions.height) ||\r\n (!horizontal && imageDimensions.height / 1.1 < imageDimensions.width)\r\n ) {\r\n return 'contain';\r\n }\r\n if (!horizontal) {\r\n if (imageDimensions.height < (props.shortView ? 220 : 340) / 1.8) {\r\n return 'contain';\r\n } else {\r\n return imageDimensions.height / imageDimensions.width > 1.8\r\n ? 'cover'\r\n : 'contain';\r\n }\r\n } else {\r\n if (imageDimensions.width < (props.shortView ? 220 : 340) / 1.8) {\r\n return 'contain';\r\n } else {\r\n return imageDimensions.width / imageDimensions.height < 1.8\r\n ? 'cover'\r\n : 'contain';\r\n }\r\n }\r\n }\r\n return undefined;\r\n }, [imageDimensions, props.shortView]);\r\n return !!pathSrc && loadingImg === false ? (\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\nexport function UsersRenderer() {\r\n return ArrayRenderer(v => (\r\n
    \r\n \r\n {v.Name}\r\n \r\n {!!v.Email && (\r\n \r\n {v.Email}\r\n \r\n )}\r\n\r\n {!!v.OfficeTel && (\r\n \r\n {v.OfficeTel}\r\n \r\n )}\r\n
    \r\n ));\r\n}\r\n","import React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { IAsset } from './IAsset';\r\n\r\nexport interface IAssetRow extends Entity {\r\n Cell?: (value: AttributeValue) => React.ReactNode | undefined;\r\n PropName?: keyof IAsset;\r\n NoHeader?: boolean;\r\n Header?: (value: AttributeValue) => React.ReactNode;\r\n dependencies?: string[];\r\n validToRender?: (value: AttributeValue) => boolean;\r\n State?: AssetRowState;\r\n}\r\n\r\nexport interface AttributeValue {\r\n original: T;\r\n value: any;\r\n shortView?: boolean;\r\n}\r\n\r\nexport enum AssetRowState {\r\n SectionName,\r\n Mandatory,\r\n}\r\n","import * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { IAssetBarcodeScanLogDto } from 'api/odata/generated/entities/IAssetBarcodeScanLogDto';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n/**\r\n * Fetches & shows last location update details (user/date) for a given asset\r\n */\r\n\r\nexport function AssetLocationLastUpdate(props: { assetId: number }) {\r\n const f = React.useCallback(async (assetId: number) => {\r\n const url = `/api/odata/v4/AssetDetails2/${assetId}/BarcodeScanLog`;\r\n const result: IODataQueryResponse = await httpClient.get(url, {\r\n $select: 'Date,User',\r\n $expand: 'User($select=Id,Name)',\r\n $top: 1,\r\n $orderBy: 'Date desc',\r\n });\r\n return result.value[0];\r\n }, []);\r\n type IState = Pick;\r\n\r\n const [fetchState, fetch] = usePromise(f);\r\n const [state, setState] = useAsyncExtendedState(\r\n undefined,\r\n );\r\n useEffectOnMount(() => setState(fetch(props.assetId)));\r\n const { t } = useTranslation();\r\n\r\n if (fetchState.status === 'resolved' && state !== undefined) {\r\n return (\r\n <>\r\n  {t(translations.Updated)}:{' '}\r\n {dateUtils.shortDateFormat(state?.Date)} {state?.User?.Name}\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n}\r\n","import * as React from 'react';\r\n\r\nexport interface DoubleRenderProps {\r\n value?: number | null;\r\n}\r\n\r\nexport const DoubleRender = (props: DoubleRenderProps) => {\r\n return {props.value};\r\n};\r\n","import { Comments } from 'app/components/Comments';\r\nimport { useUploadToNewComment } from 'app/components/LargeFilesUpload/Components/useUploadToNewComment';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { useTheme } from '@material-ui/core';\r\nimport styled from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { FormFieldsSection } from 'app/components/Forms/FormsLayout';\r\nexport interface AssetCommentsprops {\r\n assetId: number;\r\n isAdmin: boolean;\r\n staffonly: boolean;\r\n}\r\nexport const FloatingComments = styled('div')(({ theme }) => ({\r\n '&.floatingComments': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 8,\r\n height: 'auto',\r\n maxHeight: '540px',\r\n zIndex: 1070, //zIndex: 1500,\r\n padding: '16px 8px',\r\n //bottom: 'unset',\r\n position: 'fixed',\r\n bottom: '0px',\r\n width: '100%',\r\n left: 0,\r\n background: bookitColors.grayscale.grayBackground,\r\n //borderRadius: 8,\r\n boxShadow: '0px 2px 18px rgba(8, 24, 41, 0.16)',\r\n },\r\n}));\r\nexport const AssetComments = ({\r\n assetId,\r\n isAdmin,\r\n staffonly,\r\n}: AssetCommentsprops) => {\r\n const { onCommentAdded } = useUploadToNewComment();\r\n return (\r\n \r\n );\r\n};\r\nexport const AssetMobileComments = ({\r\n assetId,\r\n isAdmin,\r\n staffonly,\r\n}: AssetCommentsprops) => {\r\n const { t } = useTranslation();\r\n const theme = useTheme();\r\n const { onCommentAdded } = useUploadToNewComment();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { toRootedURL } from 'utils/url-utils';\r\nimport { AvailabilityTypesUnion } from 'api/odata/generated/enums/AvailabilityTypes';\r\n\r\nexport const getAssetEditLink = (\r\n availabilityType: AvailabilityTypesUnion,\r\n assetId?: number,\r\n serviceId?: number,\r\n serviceGroupId?: number,\r\n divisionId?: number,\r\n) => {\r\n switch (availabilityType) {\r\n case 'NotAvailable':\r\n case 'AvailableNotBookable':\r\n case 'FreelyBookable':\r\n case 'TrainingProgram':\r\n case 'LoanableEquipment':\r\n case 'LectureRoom':\r\n return toRootedURL(\r\n `/NewResource.aspx?Edit=${serviceId}&back=assetdetails&assetid=${assetId}`,\r\n );\r\n case 'ServiceRelated':\r\n return toRootedURL(\r\n `/OfflineServiceType.aspx?ID=${serviceId}&back=assetdetails&assetid=${assetId}`,\r\n );\r\n case 'RequestRelated':\r\n return toRootedURL(\r\n `/SampleType.aspx?ID=${serviceId}&back=assetdetails&assetid=${assetId}`,\r\n );\r\n case 'ServiceGroup':\r\n return toRootedURL(`/newgroup.aspx?edit=${serviceGroupId}`);\r\n case 'SuperGroup':\r\n return toRootedURL(`/newsupergroup.aspx?edit=${divisionId}`);\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","import { BooleanRender } from 'app/components/BasicTable/components/BooleanRender';\r\nimport * as React from 'react';\r\nimport { ExternalLink, Link } from 'app/components/ExternalLink';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Fragment } from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport {\r\n ArrayRenderer,\r\n AssetDetailsImageRender,\r\n DateRenderer,\r\n HtmlRenderer,\r\n UsersRenderer,\r\n} from './AttributeRenderers';\r\nimport { AssetRowState, IAssetRow } from './IAssetRow';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { getAssetImageSrc } from 'app/components/AssetThumbImage/getAssetImageSrc';\r\nimport { AssetLocationLastUpdate } from './AssetLocationLastUpdate';\r\nimport { DoubleRender } from 'app/components/BasicTable/components/DoubleRenderer';\r\nimport { H4 } from 'app/components/Typography';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { Tooltip } from '@material-ui/core';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IAssetAssemblyStructure } from './IAssetAssemblyStructure';\r\nimport { AssetComments } from './components/AssetComments';\r\nimport { BookitChip } from 'app/components/BasicChip';\r\nimport { SidePanelOpenState } from 'app/hooks/useSidePanelOpen';\r\nimport { AssetsSelectionProps } from '../MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IMyAssetsRow } from '../MyAssetsPage/IMyAssetsRow';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { getAssetEditLink } from './getAssetEditLink';\r\nimport { AssetLink } from './OpenAssetDetails';\r\nimport { Skeleton } from '@material-ui/lab';\r\n\r\nexport const getRows = (\r\n t: TFunction,\r\n setting: GlobalSettings,\r\n openPanel: (state: SidePanelOpenState) => void,\r\n publicUrl?: string,\r\n isCover?: boolean,\r\n useSidePanel?: boolean,\r\n // setCover?: Dispatch>,\r\n isAdmin?: boolean,\r\n isMobile?: boolean,\r\n isAuthenticated?: boolean,\r\n): IAssetRow[] => {\r\n return [\r\n {\r\n Id: 'ImageName',\r\n PropName: 'ImageName',\r\n Name: t(translations.Image) as string,\r\n Cell: ({ value, original }) =>\r\n !!value &&\r\n AssetDetailsImageRender({\r\n value: getAssetImageSrc(\r\n value,\r\n undefined,\r\n (setting.GetNullableByKey(AllowedSettings.AssetImageSizeType) ??\r\n '2') === '1' && !isMobile\r\n ? '/images/400x300.png'\r\n : '/images/200x150.png',\r\n ),\r\n original: original,\r\n shortView: isMobile,\r\n }),\r\n\r\n // \r\n NoHeader: true,\r\n validToRender: ({ value }) => !!value,\r\n },\r\n {\r\n Id: 'ServiceGroup',\r\n Name: t(translations.ServiceGroup) as string,\r\n Cell: ({ value, original }) => {\r\n const editLink = getAssetEditLink(\r\n 'ServiceGroup',\r\n original.Id,\r\n original.ServiceId ?? undefined,\r\n original.ServiceGroup?.Id ?? undefined,\r\n original.ServiceGroup?.DivisionId ?? undefined,\r\n );\r\n return (\r\n \r\n openPanel({\r\n renderPageType: RenderPageType.AssetDetails,\r\n renderPageProps: {\r\n Id: original.ServiceGroup.AssetId ?? undefined,\r\n useSidePanel: true,\r\n },\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n })\r\n }\r\n >\r\n {value.Name}\r\n \r\n );\r\n },\r\n // Cell: ({ value, original }) => {\r\n // const editLink = getAssetEditLink(\r\n // 'ServiceGroup',\r\n // original.Id,\r\n // original.ServiceId ?? undefined,\r\n // original.ServiceGroup?.Id ?? undefined,\r\n // original.ServiceGroup?.DivisionId ?? undefined,\r\n // );\r\n // if (editLink !== undefined) {\r\n // return (\r\n // \r\n // {value.Name}\r\n // \r\n // );\r\n // }\r\n // },\r\n },\r\n {\r\n Id: 'AvailabilityType',\r\n PropName: 'AvailabilityType',\r\n Name: t(translations.Availability),\r\n Cell: ({ value, original }) => {\r\n return (\r\n \r\n {original.ApprovalRequired ? (\r\n \r\n {`${value.Name} - ${t(translations.ApprovalRequired)}`}\r\n \r\n ) : (\r\n {value.Name}\r\n )}\r\n \r\n );\r\n },\r\n },\r\n {\r\n Id: 'ForceTutoring',\r\n Name: t(translations.TrainingMandatory) as string,\r\n validToRender: ({ value, original }) =>\r\n value === true && original.NotAllowReservations === false,\r\n Cell: ({ value }) => {\r\n return (\r\n \r\n {t(translations.ApprovalRequired)}\r\n \r\n );\r\n },\r\n },\r\n {\r\n Id: 'minorder',\r\n Name: t(translations.MinimumReservationDurationH) as string,\r\n validToRender: ({ value, original }) =>\r\n !!value && value > 0 && original.NotAllowReservations === false,\r\n Cell: DoubleRender,\r\n },\r\n {\r\n Id: 'maxorder',\r\n Name: t(translations.MaximumReservationDurationH) as string,\r\n validToRender: ({ value, original }) =>\r\n !!value && value > 0 && original.NotAllowReservations === false,\r\n Cell: DoubleRender,\r\n },\r\n {\r\n Id: 'ReservationMinimumGap',\r\n Name: t(translations.ReservationMinimumGap) as string,\r\n validToRender: ({ value, original }) =>\r\n !!value && value > 0 && original.NotAllowReservations === false,\r\n Cell: DoubleRender,\r\n },\r\n {\r\n Id: 'CarryOverTimeSlotTypeId',\r\n Name: t(translations.CarryOverTimeSlotGap) as string,\r\n validToRender: ({ value, original }) =>\r\n !!value &&\r\n value !== null &&\r\n value > 0 &&\r\n original.NotAllowReservations === false,\r\n Cell: ({ value, original }) => {\r\n return (\r\n <>{`${original.CarryOverTimeSlotGap} hours over timeslot ${original.CarryOverTimeSlotTypeName}`}\r\n );\r\n },\r\n dependencies: ['CarryOverTimeSlotGap', 'CarryOverTimeSlotTypeName'],\r\n },\r\n // {\r\n // Id: 'MinimumTimeAhead',\r\n // Name: t(translations.MinimumTimeAhead) as string,\r\n // validToRender: ({ value, original }) => {\r\n // return (\r\n // original.ReservationEnabled &&\r\n // ((original.MinTimeAheadPeriodType !== undefined &&\r\n // !!original.MinTimeAheadPeriodValue) ||\r\n // !!original.MinTimeAheadMinutesSinceMidnight)\r\n // );\r\n // },\r\n // Cell: ({ value, original }) => {\r\n // let results = '';\r\n // if (!!original.MinTimeAheadPeriodValue) {\r\n // results = `${t(\r\n // translations.Before,\r\n // )}: ${original.MinTimeAheadPeriodValue.toFixed(2)}\r\n // ${(t(translations.AdvancedReservation) as string).replace(\r\n // '{0}',\r\n // enumToEntityArray(MinTimeAheadPeriodTypes).filter(\r\n // f => f.Id === original.MinTimeAheadPeriodType,\r\n // )[0].Name,\r\n // )}`;\r\n // } else if (!!original.MinTimeAheadMinutesSinceMidnight) {\r\n // results = `${t(translations.OnTheSameDay)}: ${(t(\r\n // translations.ToBeBookedBy,\r\n // ) as string).replace(\r\n // '{0}',\r\n // dateUtils.dateFnsUtils.format(\r\n // new Date(0, 0, 0, 0, original.MinTimeAheadMinutesSinceMidnight),\r\n // dateUtils.DateIOFormats.fullDateTime24h,\r\n // ),\r\n // )}`;\r\n // }\r\n // if (results !== '') {\r\n // return (\r\n // \r\n // {results}\r\n // \r\n // \r\n // \r\n // \r\n // \r\n // \r\n // );\r\n // }\r\n // },\r\n // },\r\n // {\r\n // Id: 'RestrictedReservationsOption',\r\n // Name: t(translations.InstrumentRestrictions) as string,\r\n // validToRender: ({ value, original }) => {\r\n // return (\r\n // (value !== null &&\r\n // value !== (RestrictedReservationsOptions.NoLimitations as number) &&\r\n // original.ReservationEnabled &&\r\n // original.ServiceType === 'Online' &&\r\n // !setting.GetBooleanByKey(\r\n // AllowedSettings.HideInstrumentRestrictions,\r\n // ) &&\r\n // original.AssemblyId === null) ||\r\n // original.PrerequisiteEquipments?.length > 0\r\n // );\r\n // },\r\n // //dependencies: ['PrerequisiteEquipments'],\r\n // Cell: ({ value, original }) => {\r\n // return (\r\n // \r\n // \r\n // !!setCover &&\r\n // setCover(() => {\r\n // return (\r\n // setCover(undefined)}\r\n // onClose={() => setCover(undefined)}\r\n // />\r\n // );\r\n // })\r\n // }\r\n // >\r\n // {t(translations.CheckTrainingStatus)}\r\n // \r\n // \r\n // );\r\n // },\r\n // },\r\n {\r\n Id: 'Division',\r\n Name: t(translations.AssetsInstituteBusiness) as string,\r\n Cell: ({ original }) => original.ServiceGroup.DivisionName,\r\n },\r\n {\r\n Id: 'AssetAccessories',\r\n Name: t(translations.Accessories) as string,\r\n Cell: ArrayRenderer>(v => <>{v.Name}),\r\n },\r\n {\r\n Id: 'AssetCatGroup',\r\n Name: t(translations.AssetCatGroupName) as string,\r\n Cell: ({ value, original }) => {\r\n if (\r\n !!value &&\r\n setting.GetBooleanByKey(AllowedSettings.AssetCatEnabled)\r\n ) {\r\n return (\r\n
    \r\n {value}\r\n {isAuthenticated && (\r\n \r\n \r\n {\r\n let setProps = {\r\n useSidePanel: true,\r\n actionType: 'AssetSearch',\r\n assetCatGroupId: original.AssetCat.GroupId,\r\n customPredicates: [\r\n `${new Condition(\r\n 'AssetCatGroupId',\r\n ODataOperators.Equals,\r\n original.AssetCat.GroupId,\r\n ).toString()}`,\r\n ],\r\n hideCoresToggle: true,\r\n } as AssetsSelectionProps;\r\n\r\n openPanel({\r\n renderPageType: RenderPageType.AssetsSelection,\r\n renderPageProps: setProps,\r\n expanded: !useSidePanel,\r\n isCover: isCover,\r\n useSidePanel: !isCover,\r\n } as SidePanelOpenState);\r\n }}\r\n // onClick={() =>\r\n // window.open(\r\n // toRootedURL(\r\n // '/AssetSearch?active=true&AssetCatGroupId=' +\r\n // original.AssetCat.GroupId,\r\n // ),\r\n // '_blank',\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 Id: 'AssetCat',\r\n Name: t(translations.AssetCategory) as string,\r\n PropName: 'AssetCat',\r\n validToRender: ({ value }) => {\r\n return (\r\n !!value && setting.GetBooleanByKey(AllowedSettings.AssetCatEnabled)\r\n );\r\n },\r\n Cell: ({ original }) => {\r\n return (\r\n
    \r\n {original.AssetCat.Name}\r\n\r\n <>\r\n {!!original.AssetCat.InternalServiceAvaliable && (\r\n <>{t(translations.InternalServiceAvaliable)}\r\n )}\r\n \r\n {isAuthenticated && (\r\n \r\n \r\n {\r\n let setProps = {\r\n useSidePanel: true,\r\n actionType: 'AssetSearch',\r\n assetCatId: original.AssetCat.Id,\r\n customPredicates: [\r\n `${new Condition(\r\n 'AssetCatId',\r\n ODataOperators.Equals,\r\n original.AssetCat.Id,\r\n ).toString()}`,\r\n ],\r\n hideCoresToggle: true,\r\n } as AssetsSelectionProps;\r\n\r\n openPanel({\r\n renderPageType: RenderPageType.AssetsSelection,\r\n renderPageProps: setProps,\r\n expanded: !useSidePanel,\r\n isCover: isCover,\r\n useSidePanel: !isCover,\r\n } as SidePanelOpenState);\r\n }}\r\n // onClick={() =>\r\n // window.open(\r\n // toRootedURL(\r\n // '/AssetSearch?active=true&AssetCatId=' +\r\n // original.AssetCat.Id,\r\n // ),\r\n // '_blank',\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 Id: 'NickName',\r\n Name: t(translations.NickName) as string,\r\n },\r\n {\r\n Id: 'OtherNames',\r\n Name: t(translations.OtherNames) as string,\r\n },\r\n {\r\n Id: 'Brand',\r\n Name: t(translations.Brand),\r\n },\r\n {\r\n Id: 'Model',\r\n Name: t(translations.Model) as string,\r\n },\r\n {\r\n Id: 'ModelID',\r\n Name: t(translations.Model) as string,\r\n validToRender: ({ value }) => !!value,\r\n Cell: ({ original, value }) => (\r\n \r\n {value}\r\n \r\n ),\r\n },\r\n {\r\n Id: 'ModelNumber',\r\n Name: t(translations.ModelNumber) as string,\r\n },\r\n {\r\n Id: 'Campus',\r\n Name: t(translations.Campus) as string,\r\n },\r\n {\r\n Id: 'Building',\r\n Name: t(translations.Building) as string,\r\n },\r\n {\r\n Id: 'Room',\r\n Name: t(translations.RoomNumber) as string,\r\n validToRender: ({ value, original }) => !!value,\r\n Cell: ({ value, original }) => (\r\n <>\r\n {!!value && <>{value}}\r\n {isAdmin === true && (\r\n \r\n )}\r\n \r\n ),\r\n },\r\n {\r\n Id: 'LocationsList',\r\n Name: t(translations.LocationsList) as string,\r\n PropName: 'LocationsList',\r\n },\r\n {\r\n Id: 'SubLocationName',\r\n Name: t(translations.LocationsList) as string,\r\n PropName: 'SubLocationsList',\r\n },\r\n {\r\n Id: 'Experts',\r\n Name: t(translations.EquipmentExpert) as string,\r\n validToRender: ({ value }) => !!value && value.length > 0,\r\n Cell: UsersRenderer(),\r\n },\r\n {\r\n Id: 'Contacts',\r\n Name: t(translations.ContactsPersonForEquipment) as string,\r\n validToRender: ({ value }) => !!value && value.length > 0,\r\n Cell: UsersRenderer(),\r\n },\r\n {\r\n Id: 'Suppliers',\r\n Name: t(translations.ExternalCompany) as string,\r\n validToRender: ({ value }) => !!value && value.length > 0,\r\n Cell: ArrayRenderer>(v => <>{v.Name}),\r\n },\r\n {\r\n Id: 'MainSpecRange',\r\n Name: t(translations.MainSpecificationRange) as string,\r\n },\r\n {\r\n Id: 'ElectricalSpecs',\r\n Name: t(translations.ElectricalSpecs) as string,\r\n },\r\n {\r\n Id: 'FunctionalCharacteristics',\r\n Name: t(translations.FunctionalCharacteristics) as string,\r\n },\r\n {\r\n Id: 'Description',\r\n Name: t(translations.Description) as string,\r\n Cell: HtmlRenderer,\r\n },\r\n {\r\n Id: 'WebLink',\r\n Name: t(translations.WebLink) as string,\r\n Cell: ({ value }) => value && {value},\r\n },\r\n {\r\n Id: 'Raac',\r\n Name: t(translations.RoutineActiveAnalysisCapable) as string,\r\n Cell: BooleanRender,\r\n },\r\n {\r\n Id: 'Tags',\r\n Name: t(translations.Tags) as string,\r\n validToRender: ({ value }) => !!value && value.length > 0,\r\n Cell: ArrayRenderer>(v => <>{v.Name}),\r\n },\r\n {\r\n Id: 'ExtraDate0',\r\n Name: t(translations.Asset_ExtraDate0) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate1',\r\n Name: t(translations.Asset_ExtraDate1) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate2',\r\n Name: t(translations.Asset_ExtraDate2) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate3',\r\n Name: t(translations.Asset_ExtraDate3) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate4',\r\n Name: t(translations.Asset_ExtraDate4) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate5',\r\n Name: t(translations.Asset_ExtraDate5) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate6',\r\n Name: t(translations.Asset_ExtraDate6) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate7',\r\n Name: t(translations.Asset_ExtraDate7) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate8',\r\n Name: t(translations.Asset_ExtraDate8) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraDate9',\r\n Name: t(translations.Asset_ExtraDate9) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'ExtraText0',\r\n Name: t(translations.Asset_ExtraText0) as string,\r\n },\r\n {\r\n Id: 'ExtraText1',\r\n Name: t(translations.Asset_ExtraText1) as string,\r\n },\r\n {\r\n Id: 'ExtraText2',\r\n Name: t(translations.Asset_ExtraText2) as string,\r\n },\r\n {\r\n Id: 'ExtraText3',\r\n Name: t(translations.Asset_ExtraText3) as string,\r\n },\r\n {\r\n Id: 'ExtraText4',\r\n Name: t(translations.Asset_ExtraText4) as string,\r\n },\r\n {\r\n Id: 'ExtraText5',\r\n Name: t(translations.Asset_ExtraText5) as string,\r\n },\r\n {\r\n Id: 'ExtraText6',\r\n Name: t(translations.Asset_ExtraText6) as string,\r\n },\r\n {\r\n Id: 'ExtraText7',\r\n Name: t(translations.Asset_ExtraText7) as string,\r\n },\r\n {\r\n Id: 'ExtraText8',\r\n Name: t(translations.Asset_ExtraText8) as string,\r\n },\r\n {\r\n Id: 'ExtraText9',\r\n Name: t(translations.Asset_ExtraText9) as string,\r\n },\r\n {\r\n Id: 'ExtraText10',\r\n Name: t(translations.Asset_ExtraText10) as string,\r\n },\r\n {\r\n Id: 'ExtraText11',\r\n Name: t(translations.Asset_ExtraText11) as string,\r\n },\r\n {\r\n Id: 'ExtraText12',\r\n Name: t(translations.Asset_ExtraText12) as string,\r\n },\r\n {\r\n Id: 'ExtraText13',\r\n Name: t(translations.Asset_ExtraText13) as string,\r\n },\r\n {\r\n Id: 'ExtraText14',\r\n Name: t(translations.Asset_ExtraText14) as string,\r\n },\r\n {\r\n Id: 'ExtraText15',\r\n Name: t(translations.Asset_ExtraText15) as string,\r\n },\r\n {\r\n Id: 'ExtraInt0',\r\n Name: t(translations.Asset_ExtraInt0) as string,\r\n },\r\n {\r\n Id: 'ExtraInt1',\r\n Name: t(translations.Asset_ExtraInt1) as string,\r\n },\r\n {\r\n Id: 'ExtraInt2',\r\n Name: t(translations.Asset_ExtraInt2) as string,\r\n },\r\n {\r\n Id: 'ExtraInt3',\r\n Name: t(translations.Asset_ExtraInt3) as string,\r\n },\r\n {\r\n Id: 'ExtraInt4',\r\n Name: t(translations.Asset_ExtraInt4) as string,\r\n },\r\n {\r\n Id: 'ExtraDec0',\r\n Name: t(translations.Asset_ExtraDec0) as string,\r\n },\r\n {\r\n Id: 'ExtraDec1',\r\n Name: t(translations.Asset_ExtraDec1) as string,\r\n },\r\n {\r\n Id: 'ExtraDec2',\r\n Name: t(translations.Asset_ExtraDec2) as string,\r\n },\r\n {\r\n Id: 'ExtraDec3',\r\n Name: t(translations.Asset_ExtraDec3) as string,\r\n },\r\n {\r\n Id: 'ExtraDec4',\r\n Name: t(translations.Asset_ExtraDec4) as string,\r\n },\r\n {\r\n Id: 'ExtraBool0',\r\n Name: t(translations.Asset_ExtraBool0) as string,\r\n Cell: BooleanRender,\r\n },\r\n {\r\n Id: 'ExtraBool1',\r\n Name: t(translations.Asset_ExtraBool1) as string,\r\n Cell: BooleanRender,\r\n },\r\n {\r\n Id: 'ExtraBool2',\r\n Name: t(translations.Asset_ExtraBool2) as string,\r\n Cell: BooleanRender,\r\n },\r\n {\r\n Id: 'ExtraBool3',\r\n Name: t(translations.Asset_ExtraBool3) as string,\r\n Cell: BooleanRender,\r\n },\r\n {\r\n Id: 'ExtraBool4',\r\n Name: t(translations.Asset_ExtraBool4) as string,\r\n Cell: BooleanRender,\r\n },\r\n {\r\n Id: 'ExtraUrl0',\r\n Name: t(translations.Asset_ExtraUrl0) as string,\r\n },\r\n {\r\n Id: 'ExtraUrl1',\r\n Name: t(translations.Asset_ExtraUrl1) as string,\r\n },\r\n {\r\n Id: 'ExtraUrl2',\r\n Name: t(translations.Asset_ExtraUrl2) as string,\r\n },\r\n {\r\n Id: 'ExtraUrl3',\r\n Name: t(translations.Asset_ExtraUrl3) as string,\r\n },\r\n {\r\n Id: 'ExtraUrl4',\r\n Name: t(translations.Asset_ExtraUrl4) as string,\r\n },\r\n {\r\n Id: 'ExtraRichText0',\r\n Name: t(translations.Asset_ExtraRichText0) as string,\r\n },\r\n {\r\n Id: 'ExtraRichText1',\r\n Name: t(translations.Asset_ExtraRichText1) as string,\r\n },\r\n {\r\n Id: 'ExtraRichText2',\r\n Name: t(translations.Asset_ExtraRichText2) as string,\r\n },\r\n {\r\n Id: 'ExtraRichText3',\r\n Name: t(translations.Asset_ExtraRichText3) as string,\r\n },\r\n {\r\n Id: 'ExtraRichText4',\r\n Name: t(translations.Asset_ExtraRichText4) as string,\r\n },\r\n {\r\n Id: 'ExtraDDL0',\r\n Name: t(translations.Asset_ExtraDDL0) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL0?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL1',\r\n Name: t(translations.Asset_ExtraDDL1) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL1?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL2',\r\n Name: t(translations.Asset_ExtraDDL2) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL2?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL3',\r\n Name: t(translations.Asset_ExtraDDL3) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL3?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL4',\r\n Name: t(translations.Asset_ExtraDDL4) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL4?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL5',\r\n Name: t(translations.Asset_ExtraDDL5) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL5?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL6',\r\n Name: t(translations.Asset_ExtraDDL6) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL6?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL7',\r\n Name: t(translations.Asset_ExtraDDL7) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL7?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL8',\r\n Name: t(translations.Asset_ExtraDDL8) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL8?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL9',\r\n Name: t(translations.Asset_ExtraDDL9) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL9?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL10',\r\n Name: t(translations.Asset_ExtraDDL10) as string,\r\n Cell: ({ value, original }) =>\r\n !!value && <>{original.ExtraDDL10?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL11',\r\n Name: t(translations.Asset_ExtraDDL11) as string,\r\n Cell: ({ value, original }) =>\r\n !!value && <>{original.ExtraDDL11?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL12',\r\n Name: t(translations.Asset_ExtraDDL12) as string,\r\n Cell: ({ value, original }) =>\r\n !!value && <>{original.ExtraDDL12?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL13',\r\n Name: t(translations.Asset_ExtraDDL13) as string,\r\n Cell: ({ value, original }) =>\r\n !!value && <>{original.ExtraDDL13?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL14',\r\n Name: t(translations.Asset_ExtraDDL14) as string,\r\n Cell: ({ value, original }) =>\r\n !!value && <>{original.ExtraDDL14?.Name},\r\n },\r\n {\r\n Id: 'ExtraDDL15',\r\n Name: t(translations.Asset_ExtraDDL15) as string,\r\n Cell: ({ value, original }) =>\r\n !!value && <>{original.ExtraDDL15?.Name},\r\n },\r\n {\r\n Id: 'BrandCode',\r\n Name: t(translations.BrandBarcodeNumber) as string,\r\n },\r\n {\r\n Id: 'ServiceContract',\r\n Name: t(translations.ServiceContract) as string,\r\n },\r\n {\r\n Id: 'POnumber',\r\n Name: t(translations.PurchaseOrder) as string,\r\n },\r\n {\r\n Id: 'WarrantyEndDate',\r\n Name: t(translations.WarrantyEndDate) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Id: 'LifeDate',\r\n Name: t(translations.LifeDateView) as string,\r\n validToRender: ({ value }) => !!value,\r\n Cell: ({ value, original }) =>\r\n value !== null && <>{dateUtils.formatDistanceToNow(value)},\r\n },\r\n {\r\n Id: 'ExportLicense',\r\n Name: t(translations.ExportLicense) as string,\r\n },\r\n {\r\n Id: 'InternalCode',\r\n Name: t(translations.InternalEquipmentBarcodeNumber) as string,\r\n },\r\n {\r\n Id: 'AccountingId',\r\n Name: t(translations.AccountingId) as string,\r\n },\r\n {\r\n Id: 'Active',\r\n Name: t(translations.Active) as string,\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Id: 'Details',\r\n Name: t(translations.AssetDetails) as string,\r\n State: AssetRowState.SectionName,\r\n Cell: ({ value, original }) => (\r\n

    \r\n {t('AssetDetails')}\r\n

    \r\n ),\r\n },\r\n {\r\n Id: 'Classification',\r\n Name: t(translations.AssetClassification) as string,\r\n State: AssetRowState.SectionName,\r\n Cell: ({ value, original }) => (\r\n

    \r\n {t('AssetClassification')}\r\n

    \r\n ),\r\n },\r\n {\r\n Id: 'Location',\r\n Name: t(translations.AssetLocation) as string,\r\n State: AssetRowState.SectionName,\r\n Cell: ({ value, original }) => (\r\n

    \r\n {t('AssetLocation')}\r\n

    \r\n ),\r\n },\r\n {\r\n Id: 'SectionContacts',\r\n Name: t(translations.AssetContacts) as string,\r\n State: AssetRowState.SectionName,\r\n Cell: ({ value, original }) => (\r\n

    \r\n {t('AssetContacts')}\r\n

    \r\n ),\r\n },\r\n {\r\n Id: 'Identifiers',\r\n Name: t(translations.AssetIdentifiers) as string,\r\n State: AssetRowState.SectionName,\r\n Cell: ({ value, original }) => (\r\n

    \r\n {t('AssetIdentifiers')}\r\n

    \r\n ),\r\n },\r\n {\r\n Id: 'AdditionalInfo',\r\n Name: t(translations.AssetAdditionalInfo) as string,\r\n State: AssetRowState.SectionName,\r\n Cell: ({ value, original }) => (\r\n

    \r\n {t('AssetAdditionalInfo')}\r\n

    \r\n ),\r\n },\r\n {\r\n Id: 'SectionLabel7',\r\n Name: t(translations.AssetSectionLabel7) as string,\r\n State: AssetRowState.SectionName,\r\n },\r\n {\r\n Id: 'SectionLabel8',\r\n Name: t(translations.AssetSectionLabel8) as string,\r\n State: AssetRowState.SectionName,\r\n },\r\n {\r\n Id: 'SectionLabel9',\r\n Name: t(translations.AssetSectionLabel9) as string,\r\n State: AssetRowState.SectionName,\r\n },\r\n {\r\n Id: 'SectionLabel10',\r\n Name: t(translations.AssetSectionLabel10) as string,\r\n State: AssetRowState.SectionName,\r\n },\r\n {\r\n Id: 'DOI',\r\n Name: t(translations.Doi) as string,\r\n Cell: ({ value, original }) => {\r\n const doiURL = `https://doi.org/${value}`;\r\n return (\r\n \r\n \r\n \r\n {value}\r\n \r\n \r\n \r\n );\r\n },\r\n },\r\n {\r\n Id: 'Status',\r\n Name: t(translations.Status) as string,\r\n Cell: ({ value, original }) => {\r\n let color = bookitColors.base.black;\r\n let backgroundColor = bookitColors.base.white;\r\n switch (original.StatusId) {\r\n case 1:\r\n color = bookitColors.success.dark;\r\n backgroundColor = bookitColors.success.background;\r\n break;\r\n case 2:\r\n color = bookitColors.warning.dark;\r\n backgroundColor = bookitColors.warning.background;\r\n break;\r\n case 3:\r\n color = bookitColors.danger.dark;\r\n backgroundColor = bookitColors.danger.background;\r\n break;\r\n default:\r\n color = bookitColors.base.black;\r\n backgroundColor = bookitColors.base.white;\r\n }\r\n const RenderStatus = (props: {}) => {\r\n return (\r\n <>\r\n \r\n {value !== ' ' ? (\r\n <>{value}\r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n custombgcolor={backgroundColor}\r\n customcolor={color}\r\n shape=\"squar\"\r\n key={'status'}\r\n notremoved={true}\r\n />\r\n \r\n );\r\n };\r\n return ;\r\n },\r\n },\r\n {\r\n Id: 'AssetAssemblyStructure',\r\n Name: t(translations.AssemblyStructure) as string,\r\n Cell: ({ value, original }) => {\r\n const AssetDetailsLink = (props: { name: string; id: number }) => {\r\n // const history = useHistory();\r\n // const dispatch = useDispatch();\r\n // const { actions: layoutActions } = useLayoutSlice();\r\n return (\r\n \r\n {props.name}\r\n \r\n // {\r\n // history.push(`/Assets/Details?id=${props.id}`);\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }}\r\n // >\r\n // {props.name}\r\n // \r\n );\r\n };\r\n const renderItem = (item: IAssetAssemblyStructure) => {\r\n if (item.Children.length > 0) {\r\n let res: React.ReactNode[] = [];\r\n for (const v of item.Children) {\r\n res.push(\r\n
  • \r\n \r\n {v.Name}\r\n \r\n
  • ,\r\n );\r\n let childRes = renderItem(v);\r\n if (childRes !== undefined && childRes.length > 0) {\r\n res.push(\r\n
      {childRes.map((v, i) => v)}
    ,\r\n );\r\n }\r\n }\r\n return res;\r\n } else return undefined;\r\n };\r\n return (\r\n <>\r\n
  • \r\n \r\n
  • \r\n
      {renderItem(value)}
    \r\n \r\n );\r\n },\r\n },\r\n {\r\n Id: 'Range',\r\n Name: t(translations.Range) as string,\r\n Cell: ({ value, original }) => {\r\n return (\r\n <>\r\n {value.map(v => {\r\n if (v.MinValue !== undefined) {\r\n if (v.MaxValue !== undefined) {\r\n return (\r\n
    \r\n {v.MinValue} {' - '}\r\n {v.MaxValue} {' '}\r\n {v.UnitTypeName}\r\n
    \r\n );\r\n } else {\r\n return (\r\n
    \r\n {v.MinValue} {' '}\r\n {v.UnitTypeName} {'(Min)'}\r\n
    \r\n );\r\n }\r\n } else {\r\n if (v.MaxValue !== undefined) {\r\n return (\r\n
    \r\n {v.MaxValue} {' '}\r\n {v.UnitTypeName} {'(Max)'}\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\n {\r\n Id: 'Comments',\r\n Name: t(translations.CommentsAndAttachments) as string,\r\n validToRender: val => {\r\n return (\r\n isAuthenticated === true &&\r\n (!val.original.CommentsAreStaffonly || !!isAdmin)\r\n );\r\n },\r\n State: AssetRowState.Mandatory,\r\n Cell(value) {\r\n return (\r\n \r\n );\r\n },\r\n },\r\n // stub, could be used when full screen asset details will be migrated to react https://prog4biz.atlassian.net/browse/BKT-6902\r\n // {\r\n // Id: 'Articles',\r\n // PropName: 'Articles',\r\n // Name: t(translations.RelatedPublications),\r\n // Cell: ({ value }: { value?: IArticleDto[] }) => {\r\n // return ;\r\n // },\r\n // },\r\n ];\r\n};\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IAssetDetails2Dto } from 'api/odata/generated/entities/IAssetDetails2Dto';\r\nimport {\r\n AvailabilityTypes,\r\n AvailabilityTypesUnion,\r\n} from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { AutoMode } from 'enums/GlobalEnums';\r\nimport { ServiceTypeUnion } from 'enums/ServiceTypes';\r\nimport { IAsset } from '../IAsset';\r\nimport { AssetRowState, IAssetRow } from '../IAssetRow';\r\nimport {\r\n AssetDetailsAdditionalData,\r\n RawSection,\r\n Section,\r\n Sections,\r\n} from './types';\r\n\r\nexport const isBookable = (availabilityType?: AvailabilityTypesUnion) => {\r\n if (availabilityType === undefined) {\r\n return false;\r\n }\r\n const bookable: AvailabilityTypesUnion[] = [\r\n 'FreelyBookable',\r\n 'LectureRoom',\r\n 'LoanableEquipment',\r\n 'TrainingProgram',\r\n ];\r\n return bookable.includes(availabilityType);\r\n};\r\nexport const isOnlineService = (availabilityType?: AvailabilityTypesUnion) => {\r\n if (availabilityType === undefined) {\r\n return false;\r\n }\r\n const notOnline: AvailabilityTypesUnion[] = [\r\n 'ServiceGroup',\r\n 'ServiceRelated',\r\n 'RequestRelated',\r\n 'SuperGroup',\r\n ];\r\n return !notOnline.includes(availabilityType);\r\n};\r\nexport function removeArrayItem(target, id: string) {\r\n const ri = target.findIndex(v => v.Id === id);\r\n if (ri >= 0) {\r\n const rows = target.splice(ri, 1);\r\n return rows[0];\r\n } else return null;\r\n}\r\nexport function moveArrayItem(target, id: string, pos: number) {\r\n const ri = target.findIndex(v => v.Id === id);\r\n if (pos < target.length && ri >= 0 && pos !== ri) {\r\n const row = target.splice(ri, 1);\r\n target.splice(pos, 0, row[0]);\r\n }\r\n}\r\nexport function moveArrayItemToEnd(target, id: string) {\r\n const ri = target.findIndex(v => v.Id === id);\r\n if (ri >= 0) {\r\n const row = target.splice(ri, 1);\r\n target.splice(target.length, 0, row[0]);\r\n }\r\n}\r\nexport function moveArrayItemByName(target, id: string, name: string) {\r\n if (id !== name) {\r\n const ri = target.findIndex(v => v.Id === id);\r\n if (ri >= 0) {\r\n const rn = target.findIndex(v => v.Id === name);\r\n if (rn >= 0) {\r\n const row = target.splice(ri, 1);\r\n if (rn < ri) {\r\n target.splice(rn + 1, 0, row[0]);\r\n } else {\r\n target.splice(rn, 0, row[0]);\r\n }\r\n }\r\n }\r\n }\r\n}\r\nexport function addArrayItemByName(target, id: string, name: string) {\r\n const ri = target.findIndex(v => v.Id === id);\r\n if (ri < 0) {\r\n const rn = target.findIndex(v => v.Id === name);\r\n if (rn > 0) {\r\n target.splice(rn + 1, 0, {\r\n Id: id,\r\n Visible: true,\r\n });\r\n } else {\r\n target.unshift({\r\n Id: id,\r\n Visible: true,\r\n });\r\n }\r\n }\r\n}\r\nexport function moveArrayItemByKey(target, key: string, pos: number) {\r\n const ri = target.findIndex(v => v.key === key);\r\n if (pos < target.length && ri >= 0 && pos !== ri) {\r\n const row = target.splice(ri, 1);\r\n target.splice(pos, 0, row[0]);\r\n }\r\n}\r\n\r\nexport function GetReservationEnabled(\r\n availabilityType: AvailabilityTypes,\r\n active: boolean,\r\n notAllowReservations: boolean,\r\n) {\r\n let reservationEnabled: boolean = false;\r\n switch (availabilityType) {\r\n case AvailabilityTypes.FreelyBookable:\r\n case AvailabilityTypes.LoanableEquipment:\r\n case AvailabilityTypes.LectureRoom:\r\n reservationEnabled = notAllowReservations === false && active === true;\r\n break;\r\n case AvailabilityTypes.TrainingProgram:\r\n reservationEnabled = active === true;\r\n break;\r\n case AvailabilityTypes.ServiceRelated:\r\n case AvailabilityTypes.ServiceGroup:\r\n case AvailabilityTypes.SuperGroup:\r\n case AvailabilityTypes.NotAvailable:\r\n case AvailabilityTypes.AvailableNotBookable:\r\n default:\r\n reservationEnabled = false;\r\n break;\r\n }\r\n return reservationEnabled;\r\n}\r\n\r\nexport function GetUsageEnabled(\r\n availabilityType: AvailabilityTypes,\r\n active: boolean,\r\n autoMode?: number,\r\n) {\r\n var result: boolean = autoMode === AutoMode?.LocalAppEnabled;\r\n switch (availabilityType) {\r\n case AvailabilityTypes.FreelyBookable:\r\n case AvailabilityTypes.TrainingProgram:\r\n case AvailabilityTypes.LoanableEquipment:\r\n case AvailabilityTypes.LectureRoom:\r\n result = result && active === true;\r\n break;\r\n case AvailabilityTypes.ServiceRelated:\r\n case AvailabilityTypes.ServiceGroup:\r\n case AvailabilityTypes.SuperGroup:\r\n case AvailabilityTypes.NotAvailable:\r\n case AvailabilityTypes.AvailableNotBookable:\r\n default:\r\n result = result && false;\r\n break;\r\n }\r\n return result;\r\n}\r\n\r\nexport function GetAlertsEnabled(\r\n availabilityType: AvailabilityTypes,\r\n active: boolean,\r\n) {\r\n let alertsEnabled: boolean = false;\r\n switch (availabilityType) {\r\n case AvailabilityTypes.FreelyBookable:\r\n case AvailabilityTypes.LoanableEquipment:\r\n case AvailabilityTypes.LectureRoom:\r\n case AvailabilityTypes.TrainingProgram:\r\n case AvailabilityTypes.NotAvailable:\r\n case AvailabilityTypes.AvailableNotBookable:\r\n alertsEnabled = active === true;\r\n break;\r\n case AvailabilityTypes.ServiceGroup:\r\n case AvailabilityTypes.SuperGroup:\r\n case AvailabilityTypes.ServiceRelated:\r\n case AvailabilityTypes.RequestRelated:\r\n default:\r\n alertsEnabled = false;\r\n break;\r\n }\r\n return alertsEnabled;\r\n}\r\nexport const isValid = (row: IAssetRow, data: IAsset) => {\r\n if (\r\n row.State === AssetRowState.SectionName ||\r\n row.State === AssetRowState.Mandatory\r\n ) {\r\n return true;\r\n }\r\n const value = data![row.PropName ?? row.Id];\r\n if (value !== null && value !== undefined && value !== '') {\r\n if (Array.isArray(value)) {\r\n return value.length > 0;\r\n } else {\r\n return true;\r\n }\r\n } else {\r\n return false;\r\n }\r\n};\r\nexport function GetValidRos(rows: IAssetRow[], data: IAsset): IAssetRow[] {\r\n return rows.filter(row => isValid(row, data));\r\n}\r\nexport function RemoveLastEmptySections(rows: IAssetRow[]) {\r\n if (rows.length > 0) {\r\n if (rows[rows.length - 1].State === AssetRowState.SectionName) {\r\n do {\r\n rows.pop();\r\n } while (\r\n rows.length > 0 &&\r\n rows[rows.length - 1].State === AssetRowState.SectionName\r\n );\r\n }\r\n }\r\n return rows;\r\n}\r\n\r\nexport function GetRawSections(rows: IAssetRow[]): RawSection[] {\r\n const sections: RawSection[] = rows\r\n .map((r, index) => {\r\n return {\r\n Id: r.Id,\r\n Index: index,\r\n SectionName: r.State === AssetRowState.SectionName,\r\n remove: false,\r\n };\r\n })\r\n .filter(f => f.SectionName);\r\n return sections;\r\n}\r\nexport function CheckEmptyRawSections(sections: RawSection[]) {\r\n if (sections.length > 1) {\r\n for (let i = 0; i < sections.length - 1; i++) {\r\n const s = sections[i];\r\n const s1 = sections[i + 1];\r\n if (s1.Index - s.Index === 1) {\r\n s.remove = true;\r\n }\r\n }\r\n }\r\n}\r\nexport function RemoveEmptySections(sections: RawSection[], rows: IAssetRow[]) {\r\n for (let i = 0; i < sections.length - 1; i++) {\r\n const s = sections[i];\r\n if (s.remove) {\r\n const ri = rows.findIndex(v => v.Id === s.Id);\r\n rows.splice(ri, 1);\r\n }\r\n }\r\n}\r\n\r\nexport function GetSections(rows: IAssetRow[]): Section[] {\r\n const noNameSection: Section = { Id: '', row: {} as IAssetRow, rows: [] };\r\n const sections: Section[] = [];\r\n let section: number = -1;\r\n for (let r of rows) {\r\n if (r.State === AssetRowState.SectionName) {\r\n section++;\r\n sections.push({\r\n Id: r.Id,\r\n Index: -1,\r\n row: r,\r\n rows: [],\r\n } as Section);\r\n } else {\r\n if (section >= 0) {\r\n sections[section].rows.push(r);\r\n } else {\r\n noNameSection.rows.push(r);\r\n }\r\n }\r\n }\r\n if (noNameSection.rows.length > 0) {\r\n sections.unshift(noNameSection);\r\n }\r\n return sections;\r\n}\r\nexport function RowsToSections(rows: IAssetRow[]): Section[] {\r\n const sections: Section[] = [];\r\n for (let r of rows) {\r\n sections.push({\r\n Id: r.Id,\r\n Index: -1,\r\n row: r,\r\n rows: [r],\r\n } as Section);\r\n }\r\n return sections;\r\n}\r\nexport function RowToSections(rows: IAssetRow[], id: string): Section | null {\r\n const row = removeArrayItem(rows, id);\r\n if (row !== null) {\r\n const section = {\r\n Id: row.Id,\r\n Index: -1,\r\n row: row,\r\n rows: [row],\r\n } as Section;\r\n return section;\r\n } else return null;\r\n}\r\nexport function GetRowsWithSections(\r\n rows: IAssetRow[],\r\n data: IAsset,\r\n): IAssetRow[] {\r\n let res: IAssetRow[] = GetValidRos(rows, data);\r\n res = RemoveLastEmptySections(res);\r\n const sections = GetRawSections(res);\r\n CheckEmptyRawSections(sections);\r\n RemoveEmptySections(sections, res);\r\n return res;\r\n}\r\nexport function GetRowsSections(\r\n rows: IAssetRow[],\r\n data: IAsset,\r\n isMobile?: boolean,\r\n): Sections {\r\n let leftRes: IAssetRow[] = [];\r\n let rightRes: IAssetRow[] = [];\r\n const checkSection = (row: IAssetRow) => {\r\n return isMobile\r\n ? ['Description', 'Comments', 'AssetAssemblyStructure'].includes(\r\n row.Id,\r\n ) === false\r\n : [\r\n 'ImageName',\r\n 'Description',\r\n 'Comments',\r\n 'AssetAssemblyStructure',\r\n ].includes(row.Id) === false;\r\n };\r\n for (const row of rows) {\r\n if (isValid(row, data)) {\r\n if (checkSection(row)) {\r\n leftRes.push(row);\r\n } else {\r\n rightRes.push(row);\r\n }\r\n }\r\n }\r\n leftRes = RemoveLastEmptySections(leftRes);\r\n const sections = GetRawSections(leftRes);\r\n CheckEmptyRawSections(sections);\r\n RemoveEmptySections(sections, leftRes);\r\n if (isMobile) {\r\n if (rightRes.length > 0) {\r\n moveArrayItem(rightRes, 'Description', 0);\r\n moveArrayItem(rightRes, 'AssetAssemblyStructure', 1);\r\n moveArrayItem(rightRes, 'Comments', 2);\r\n }\r\n } else {\r\n if (rightRes.length > 0) {\r\n moveArrayItem(rightRes, 'ImageName', 0);\r\n moveArrayItem(rightRes, 'Description', 1);\r\n moveArrayItem(rightRes, 'AssetAssemblyStructure', 2);\r\n moveArrayItem(rightRes, 'Comments', 3);\r\n }\r\n }\r\n\r\n leftRes = leftRes.filter(getSectionsFilter(data));\r\n rightRes = rightRes.filter(getSectionsFilter(data));\r\n const resSections: Sections = {} as Sections;\r\n if (isMobile) {\r\n const imageSection = RowToSections(leftRes, 'ImageName');\r\n resSections.leftSections = GetSections(leftRes);\r\n if (imageSection !== null) {\r\n resSections.leftSections.unshift(imageSection);\r\n }\r\n } else {\r\n resSections.leftSections = GetSections(leftRes);\r\n }\r\n resSections.rightSections = RowsToSections(rightRes);\r\n return resSections;\r\n}\r\n\r\nconst getSectionsFilter = (data: IAssetDetails2Dto) => (row: IAssetRow) => {\r\n return (\r\n row.validToRender === undefined ||\r\n row.validToRender({\r\n value: data![row.PropName ?? row.Id],\r\n original: data,\r\n })\r\n );\r\n};\r\n\r\nexport async function fetchAssetBy(props: {\r\n Id?: number;\r\n ServiceType?: ServiceTypeUnion;\r\n ServiceId?: number;\r\n params: Record;\r\n isAuth?: boolean;\r\n}) {\r\n const url = props.isAuth\r\n ? `/api/odata/v4/AssetDetails2`\r\n : `/api/odata/v4/PublicAsset`;\r\n if (props.Id !== undefined) {\r\n const res: IAssetDetails2Dto = await httpClient.get(\r\n `${url}/${props.Id}`,\r\n props.params,\r\n );\r\n return res;\r\n } else if (props.ServiceId !== undefined && props.ServiceType !== undefined) {\r\n const res: IODataQueryResponse = await httpClient.get(\r\n url,\r\n {\r\n ...props.params,\r\n $filter: `ServiceType eq '${props.ServiceType}' and ServiceId eq ${props.ServiceId}`,\r\n },\r\n );\r\n return res.value[0];\r\n }\r\n}\r\nexport async function fetchAssetAdditionalData(props: {\r\n Id: number;\r\n typeId: number;\r\n isAuth?: boolean;\r\n buttonsData?: boolean;\r\n}) {\r\n try {\r\n const res = await httpClient.post(\r\n props.isAuth\r\n ? `/api/odata/v4/AssetDetails2/GetAdditionalDetails`\r\n : `/api/odata/v4/PublicAsset/GetAdditionalDetails`,\r\n { key: props.Id, buttonsData: props.buttonsData, typeId: props.typeId },\r\n );\r\n return res;\r\n } catch {}\r\n}\r\n","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { CalendarButton } from 'app/components/CalendarButton';\r\nimport { MenuItemLinkProps } from 'app/components/Menu/MenuItemLink';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { IAsset, mapToAssetDto } from '../IAsset';\r\nimport { alertsEnabled } from '..';\r\nimport { getAssetEditLink } from '../getAssetEditLink';\r\nimport { isBookable } from './Utils';\r\nimport { RenderTypes } from 'app/pages/Actions/GlobalSelectedActions/ValidToRender/renderTypes';\r\nimport { useAssetsPermissions } from 'app/pages/Actions/GlobalSelectedActions/ValidToRender/useAssetsPermissionsUtils';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { PrintSelectedAssetLabelsButton } from 'app/components/LabelPrint/PrintSelectedAssetLabelsButton';\r\nimport { IMyAssetsRow } from 'app/pages/MyAssetsPage/IMyAssetsRow';\r\nimport { ExportQRCodesButton } from 'app/components/QrCodeExport';\r\nimport { Roles } from 'api/odata/generated/enums/Roles';\r\n\r\nexport interface TopAssetActionsDropDownProps {\r\n data: IAsset;\r\n buttonsData: IAsset;\r\n}\r\n\r\nconst ButtonOrLink = (props: MenuItemLinkProps) => {\r\n const { icon, target, text, disabled, ...rest } = props;\r\n return (\r\n }\r\n size={'small'}\r\n variant=\"white\"\r\n component={'a'}\r\n disabled={disabled}\r\n target={!!target ? '_blank' : '_self'}\r\n {...rest}\r\n >\r\n {text}\r\n \r\n );\r\n};\r\nexport const useTopAssetActionsDropDown = ({\r\n isMismatchCore,\r\n isAdmin,\r\n}: {\r\n isMismatchCore?: boolean;\r\n isAdmin: boolean;\r\n}) => {\r\n const { t } = useTranslation();\r\n const appSettings = useSelector(selectAppSettings);\r\n const globalSettings = useSelector(selectglobalSettings);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const roles = authenticatedUser?.Roles;\r\n const canAddQuiz = React.useCallback((): boolean => {\r\n return (\r\n authenticatedUser !== undefined &&\r\n authenticatedUser.Roles.indexOf(Roles.GroupAdministrators) >= 0\r\n );\r\n }, [authenticatedUser]);\r\n const { allowedToView } = useAssetsPermissions();\r\n\r\n const getMenuItems = React.useCallback(\r\n ({ data, buttonsData }: TopAssetActionsDropDownProps) => {\r\n const rows = [\r\n {\r\n Id: data.Id,\r\n Name: data.Name,\r\n AssetCatId: data?.AssetCat?.Id,\r\n AvailabilityTypeId: AvailabilityTypes[data.AvailabilityType.Id],\r\n AvailabilityTypeName: data.AvailabilityType.Name,\r\n ServiceGroupId: data.ServiceGroup?.Id,\r\n ServiceGroupName: data.ServiceGroup?.Name,\r\n ServiceId: data?.ServiceId,\r\n ServiceTypeId:\r\n data?.ServiceType === null\r\n ? null\r\n : (ServiceType[data.ServiceType] as number) ?? null,\r\n ServiceGroupAssetId: data?.ServiceGroup?.AssetId,\r\n },\r\n ];\r\n const NotificationIsAvailable = [\r\n 'FreelyBookableBillable',\r\n 'ApprovalRequiredBillable',\r\n 'FreelyBookable',\r\n 'BookableWApproval',\r\n 'TrainingProgram',\r\n 'LoanableEquipment',\r\n 'LectureRoom',\r\n ].includes(data.AvailabilityType.Id);\r\n let items: React.ReactNode[] = [];\r\n if (\r\n isAdmin &&\r\n [\r\n 'NotAvailable',\r\n 'AvailableNotBookable',\r\n 'FreelyBookableBillable',\r\n 'ApprovalRequiredBillable',\r\n 'FreelyBookable',\r\n 'BookableWApproval',\r\n 'TrainingProgram',\r\n 'LoanableEquipment',\r\n 'LectureRoom',\r\n 'ServiceRelated',\r\n 'RequestRelated',\r\n 'ServiceGroup',\r\n 'SuperGroup',\r\n ].includes(data.AvailabilityType.Id)\r\n ) {\r\n const editLink = getAssetEditLink(\r\n data.AvailabilityType.Id,\r\n data.Id,\r\n data.ServiceId ?? undefined,\r\n data.ServiceGroup?.Id ?? undefined,\r\n data.ServiceGroup?.DivisionId ?? undefined,\r\n );\r\n if (editLink !== undefined) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n }\r\n /*items.push(\r\n ,\r\n );*/\r\n if (\r\n (buttonsData.ReservationEnabled &&\r\n roles?.includes(Roles.Administrators)) ||\r\n roles?.includes(Roles.LabTech)\r\n ) {\r\n items.push(\r\n }\r\n variant=\"white\"\r\n component={'a'}\r\n size={'small'}\r\n >\r\n {t(translations.Calendar)}\r\n ,\r\n );\r\n }\r\n if (\r\n buttonsData.ReservationEnabled &&\r\n isBookable(data.AvailabilityType?.Id)\r\n ) {\r\n items.push(\r\n }\r\n size={'small'}\r\n >\r\n {t(translations.Timeline)}\r\n ,\r\n );\r\n if (\r\n allowedToView(\r\n ((rows as unknown) as IMyAssetsRow[]).map(mapToAssetDto),\r\n RenderTypes.ExportQRCodes,\r\n )\r\n ) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (\r\n allowedToView(\r\n ((rows as unknown) as IMyAssetsRow[]).map(mapToAssetDto),\r\n RenderTypes.PrintAssetLabels,\r\n )\r\n ) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (isBookable(data.AvailabilityType?.Id)) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n }\r\n if (buttonsData.UsageEnabled) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (data.ServiceType === 'Offline' && data.AllowToUser) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (\r\n data.ServiceType === 'Online' &&\r\n IsModuleEnabled(appSettings, KnownModules.Quizzes) &&\r\n canAddQuiz()\r\n ) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (alertsEnabled(data.AvailabilityType.Id)) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (buttonsData.PlanedEventsEnabled) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (data.ServiceType === 'Offline' && data.AllowToUser) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (\r\n data.ServiceType === 'Sample' &&\r\n data.CanBeCreatedFromLinkOnly === false\r\n ) {\r\n items.push(\r\n ,\r\n );\r\n /*items.push(\r\n ,\r\n );*/\r\n }\r\n if (\r\n isBookable(data.AvailabilityType?.Id) &&\r\n data.ServiceType === 'Online' &&\r\n buttonsData.ReservationEnabled &&\r\n (IsModuleEnabled(appSettings, KnownModules.ResCancelNotifications) ||\r\n IsModuleEnabled(appSettings, KnownModules.ReservationNotification)) &&\r\n NotificationIsAvailable\r\n ) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (\r\n buttonsData.ShowFeed &&\r\n globalSettings.GetBoolean('CalendarPublicIntegrationFeed')\r\n ) {\r\n items.push(\r\n void;\r\n}) {\r\n const { t } = useTranslation();\r\n const [state, setState] = useAsyncExtendedState([]);\r\n const [fetchAlertTypesState, fetchAlertTypes] = usePromise(\r\n fetchAlertTypesPromise,\r\n );\r\n React.useEffect(() => {\r\n setState(fetchAlertTypes(props.assetId));\r\n }, [fetchAlertTypes, props.assetId, setState]);\r\n const downtimeProps = React.useMemo(() => {\r\n return props.downtime ? { offH: true, down: true } : {};\r\n }, [props.downtime]);\r\n return (\r\n }\r\n title={t(translations.CreateAnAssetRelatedEvent)}\r\n processing={fetchAlertTypesState.status === 'pending'}\r\n color=\"primary\"\r\n variant={/*!props.bookable ? 'main' : */ 'white'}\r\n disabled={props.mismatchCore}\r\n addChevron\r\n menuChildren={onClose => [\r\n \r\n {t(translations.PleaseSelectAnEventType)}\r\n ,\r\n\r\n ...state.map(\r\n a =>\r\n a.Name !== null && (\r\n {\r\n !!props.openPanel &&\r\n props.openPanel({\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: {\r\n queryParams: {\r\n aType: a.Id.toString(),\r\n assetId: props.assetId.toString(),\r\n down: !!downtimeProps.down\r\n ? downtimeProps.down.toString()\r\n : undefined,\r\n offH: !!downtimeProps.offH\r\n ? downtimeProps.offH.toString()\r\n : undefined,\r\n },\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n expanded: false,\r\n useSidePanel: props.useSidePanel,\r\n isCover: props.useSidePanel,\r\n });\r\n onClose();\r\n }}\r\n >\r\n {a.Name}\r\n \r\n ),\r\n ),\r\n ]}\r\n menuProps={{}}\r\n >\r\n {t(translations.Event)}\r\n \r\n );\r\n}\r\nexport const fetchAlertTypesPromise = async (assetId: number) => {\r\n const response: IODataQueryResponse = await httpClient.get(\r\n `/api/odata/v4/AssetDetails2(${assetId})/AlertTypes`,\r\n );\r\n return response.value;\r\n};\r\n","import { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { DocumentsTable } from 'app/pages/Documents/DocumentsTable';\r\nimport { IDocumentsDirectoryRow } from 'app/pages/Documents/IDocumentsDirectoryRow';\r\n//import { useFilters } from './TableFilters';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IBasicTableState } from 'app/components/BasicTable';\r\nimport React from 'react';\r\nimport { getColumns } from 'app/pages/Documents/Columns';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Column } from 'react-table';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nconst ExcludeAssetDocumentsColumns: string[] = ['AssetName', 'ServiceGroup'];\r\nexport interface AssetDetailsFilesProps {\r\n assetId: number;\r\n getFiltersDefinition?: GetPageFilters;\r\n isMobile?: boolean;\r\n serviceGroupId?: number;\r\n availabilityType?: string;\r\n user?: AuthenticatedUser;\r\n}\r\nexport function AssetDetailsFiles(props: AssetDetailsFilesProps) {\r\n const { t } = useTranslation();\r\n const documentsColumns = React.useMemo(() => getColumns(t), [t]);\r\n const { assetId, isMobile, serviceGroupId, availabilityType } = props;\r\n const columns = React.useMemo(() => {\r\n let res: Column[] = documentsColumns.filter(\r\n f =>\r\n f.accessor !== undefined &&\r\n !ExcludeAssetDocumentsColumns.includes(f.accessor as string),\r\n );\r\n return res;\r\n }, [documentsColumns]);\r\n const predicates: Array<\r\n Condition | string\r\n > = React.useMemo(() => {\r\n // The asset matches and the service group matches or there is only a service group and it matches.\r\n const res: Array | string> = [];\r\n const assetPredicate = new Condition(\r\n 'AssetId',\r\n ODataOperators.Equals,\r\n assetId,\r\n );\r\n const groupPredicate = new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Equals,\r\n serviceGroupId,\r\n );\r\n if (!!availabilityType && availabilityType === 'ServiceGroup') {\r\n res.push(\r\n `(${[assetPredicate.toString(), groupPredicate.toString()].join(\r\n ' or ',\r\n )})`,\r\n );\r\n } else {\r\n res.push(assetPredicate);\r\n }\r\n return res;\r\n }, [assetId, availabilityType, serviceGroupId]);\r\n /*const {\r\n allfilters,\r\n appliedFilters,\r\n handleFilterChange,\r\n getFilterValue,\r\n setFilterValue,\r\n } = useFilters(props.getFiltersDefinition, 'AssetId');*/\r\n const initialState: IBasicTableState = React.useMemo(\r\n () => ({\r\n sortBy: [{ id: 'Id', desc: false }],\r\n }),\r\n [],\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","import { IAsset } from '../IAsset';\r\nimport { Section, SectionsProps } from './types';\r\nimport { AttributeValue } from '../IAssetRow';\r\nimport React from 'react';\r\nimport { FormFieldsSection, FormRow } from 'app/components/Forms/FormsLayout';\r\nimport { GhostInput } from 'app/components/BasicInputs/GhostInput';\r\n\r\nexport interface SectionRowsProps {\r\n sections: Section[];\r\n data?: IAsset;\r\n noLabel?: boolean;\r\n}\r\nexport const notFullWidth = ['Status', 'DOI'];\r\nexport const noLabelRendersArray = ['ImageName', 'Comments'];\r\nexport const asHtmlRenderArray = ['Comments', 'ImageName'];\r\nexport const DefautltCell = ({ value }: AttributeValue) => (\r\n {value}\r\n);\r\nexport function RenderRows({\r\n sections,\r\n data,\r\n noLabel,\r\n ...props\r\n}: SectionRowsProps) {\r\n // const rows = React.useCallback(\r\n // (rows: IAssetRow[]) => {\r\n // if (!!data) {\r\n // return (\r\n // <>\r\n // {rows\r\n // .filter(f => {\r\n // return (\r\n // f.validToRender === undefined ||\r\n // f.validToRender({\r\n // value: data![f.PropName ?? f.Id],\r\n // original: data,\r\n // })\r\n // );\r\n // })\r\n // .map(r => {\r\n // let cell = r.Cell ?? DefautltCell;\r\n // let cellData = {\r\n // original: data,\r\n // value: data![r.PropName ?? r.Id],\r\n // };\r\n // return (\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 // [data, noLabel],\r\n // );\r\n return !!data ? (\r\n \r\n {sections.map(s => {\r\n return (\r\n \r\n {s.rows\r\n .filter(f => {\r\n return (\r\n f.validToRender === undefined ||\r\n f.validToRender({\r\n value: data![f.PropName ?? f.Id],\r\n original: data,\r\n })\r\n );\r\n })\r\n .map(r => {\r\n let cell = r.Cell ?? DefautltCell;\r\n let cellData = {\r\n original: data,\r\n value: data![r.PropName ?? r.Id],\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 ) : null;\r\n}\r\nexport const RenderLeftSection = React.memo(function RenderSection({\r\n sections,\r\n data,\r\n ...props\r\n}: SectionsProps) {\r\n return sections.length > 0 ? (\r\n \r\n ) : null;\r\n});\r\nexport const RenderRightSection = React.memo(function RenderSection({\r\n sections,\r\n data,\r\n}: SectionsProps) {\r\n return sections.length > 0 ? (\r\n \r\n ) : null;\r\n});\r\n","import { IAssetDetails2Dto } from 'api/odata/generated/entities/IAssetDetails2Dto';\r\nimport { BasicAlert } from 'app/components/BasicAlert';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Body } from 'app/components/Typography';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\n\r\nexport function MismatchCore(\r\n data: IAssetDetails2Dto | undefined,\r\n isAuthenticated: boolean | undefined,\r\n topServiceGroupsIsHidden: boolean,\r\n selectedServiceGroups: Entity[] | undefined,\r\n): boolean {\r\n if (isAuthenticated && !topServiceGroupsIsHidden) {\r\n const showAllCores =\r\n !!data &&\r\n !!data.ServiceGroup &&\r\n selectedServiceGroups?.find(f => f.Id === data?.ServiceGroup.Id) ===\r\n undefined;\r\n return showAllCores\r\n ? !!data &&\r\n !!data.AvailabilityType &&\r\n data.AvailabilityType?.Id !== 'ServiceGroup' &&\r\n data.AvailabilityType?.Id !== 'SuperGroup' &&\r\n !!selectedServiceGroups &&\r\n selectedServiceGroups.length > 0 &&\r\n !selectedServiceGroups.some(f => f.Id === data.ServiceGroup.Id)\r\n : false;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport interface MismatchCoreMessageProps {\r\n data: IAssetDetails2Dto | undefined;\r\n mismatchCore: boolean;\r\n}\r\nexport function MismatchCoreMessage({\r\n data,\r\n mismatchCore,\r\n}: MismatchCoreMessageProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const { actions } = useAppSettingsSlice();\r\n const updateGlobalServiceGroup = React.useCallback(() => {\r\n const showAllCores =\r\n !!data &&\r\n !!data.ServiceGroup &&\r\n selectedServiceGroups?.find(f => f.Id === data?.ServiceGroup.Id) ===\r\n undefined;\r\n if (showAllCores && !!data && !!data.ServiceGroup.Id) {\r\n const groups = [\r\n ...(selectedServiceGroups ?? []),\r\n ...(data.ServiceGroup !== null ? [data.ServiceGroup] : []).map(sg => ({\r\n Id: sg.Id,\r\n Name: sg.Name,\r\n })),\r\n ];\r\n\r\n dispatch(actions.saveGlobalServiceGroupFilter(groups));\r\n }\r\n }, [actions, data, dispatch, selectedServiceGroups]);\r\n return mismatchCore ? (\r\n \r\n \r\n {t(translations.MismatchAssetCore_warning) as string}\r\n \r\n \r\n \r\n ),\r\n variant: 'outlined',\r\n }}\r\n />\r\n ) : (\r\n <>\r\n );\r\n}\r\n","import { IAssetRow } from '../IAssetRow';\r\nimport React from 'react';\r\nimport { IAsset } from '../IAsset';\r\nimport { AssetDetailsFiles } from './AssetDetailsFiles';\r\nimport {\r\n FormLeftSection,\r\n FormRightSection,\r\n StyledFormFieldsContainer,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { GetRowsSections } from './Utils';\r\nimport { RenderLeftSection, RenderRightSection } from './RenderAssetRows';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectGlobalSettingBool,\r\n selectIsAuthenticated,\r\n} from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { MismatchCore, MismatchCoreMessage } from './MismatchCoreMessage';\r\n\r\nexport interface AssetDetailsTabContentProps {\r\n rows: IAssetRow[];\r\n data: IAsset;\r\n loadingAdditionalData?: boolean;\r\n isAdmin: boolean;\r\n commentsForStaff?: boolean;\r\n shortView?: boolean;\r\n isCover?: boolean;\r\n}\r\n\r\nexport function AssetDetailsTabContent(props: AssetDetailsTabContentProps) {\r\n const { rows, data, shortView, isCover } = props;\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n const topServiceGroupsIsHidden = useSelector(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.HideTopServiceGroupFilter),\r\n );\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const sections = React.useMemo(() => {\r\n return GetRowsSections(rows, data, shortView);\r\n }, [data, shortView, rows]);\r\n const leftSections = React.useMemo(() => {\r\n return sections.leftSections;\r\n }, [sections]);\r\n const rightSections = React.useMemo(() => {\r\n return sections.rightSections;\r\n }, [sections]);\r\n // const getMobileRows = React.useCallback(() => {\r\n // let res = leftSections;\r\n // if (rightSections.length > 0 && rightSections[0].rows.length > 0) {\r\n // res.unshift(...rightSections);\r\n // }\r\n // return res;\r\n // }, [leftSections, rightSections]);\r\n const mismatchCore = React.useMemo(() => {\r\n return MismatchCore(\r\n data,\r\n isAuthenticated,\r\n topServiceGroupsIsHidden,\r\n selectedServiceGroups,\r\n );\r\n }, [data, isAuthenticated, selectedServiceGroups, topServiceGroupsIsHidden]);\r\n return (\r\n <>\r\n \r\n \r\n {shortView && (\r\n \r\n )}\r\n \r\n \r\n \r\n {!shortView && (\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {!!data && isAuthenticated && (\r\n \r\n )}\r\n\r\n {/*TODO: should be implemented mobile floating comment component and separate input from comments section\r\n Jira task BKT-9685*/}\r\n {/* {isMobile && (\r\n \r\n )} */}\r\n \r\n );\r\n}\r\n","import { InstrumentRestrictions } from 'app/pages/InstrumentRestrictionsPage/Details/InstrumentRestrictions';\r\n\r\nexport interface AssetBookingRulesProps {\r\n serviceId?: number;\r\n serviceGroupId?: number;\r\n user?: string;\r\n useShortView?: boolean;\r\n useSidePanel?: boolean;\r\n}\r\n\r\nexport function AssetBookingRules(props: AssetBookingRulesProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { IRow } from 'app/components/BasicTable';\r\nimport { getDependencyFilters } from 'app/components/BasicTable/BasicFilter';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { getFilterValue } from 'app/components/BasicTable/getFilterValue';\r\nimport { initFilterData } from 'app/components/BasicTable/initFilterData';\r\nimport { visibleFiltersFilter } from 'app/components/BasicTable/withSavedHistory';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectGlobalServiceGroupFilter,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport React from 'react';\r\nimport { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\n\r\nexport interface FilterValue {\r\n Name: string;\r\n Value: FilterValueType | null;\r\n}\r\nexport class BaseFilterValues {\r\n GetFilter = (): Array => {\r\n const res: Array = Object.entries(this)\r\n .filter(v => typeof v[1] !== 'function')\r\n .map(v => {\r\n return { Name: v[0], Value: v[1] as FilterValueType | null };\r\n });\r\n return res;\r\n };\r\n SetValue = (name: string, value: FilterValueType | null) => {\r\n this[name] = value;\r\n };\r\n}\r\nexport function useFilters(\r\n GetFiltersDefinition: GetPageFilters,\r\n filterBy?: FilterValue[],\r\n setValue?: (name: string, value: FilterValueType | null) => void,\r\n) {\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const showFiltersFn = React.useCallback(visibleFiltersFilter, []);\r\n const getLocalizedFilters = useMemo(() => {\r\n const result = GetFiltersDefinition(\r\n t,\r\n appSettings,\r\n authenticatedUser ?? null,\r\n settings,\r\n );\r\n return result;\r\n }, [GetFiltersDefinition, appSettings, authenticatedUser, settings, t]);\r\n\r\n const allFilters = useMemo(() => {\r\n var result = getLocalizedFilters('');\r\n // get the necessary filters\r\n if (filterBy !== undefined && filterBy.length > 0) {\r\n result = result.filter(\r\n f => filterBy.findIndex(v => v.Name === f.fieldName) >= 0,\r\n );\r\n // Set saved values\r\n for (const f of filterBy) {\r\n let rf = result.find(r => r.fieldName === f.Name);\r\n if (rf !== undefined) {\r\n rf.value = f.Value;\r\n }\r\n }\r\n }\r\n return result;\r\n }, [filterBy, getLocalizedFilters]);\r\n\r\n const [appliedFilters, setAppliedFilters] = useAsyncExtendedState<\r\n IFilterSettings[] | undefined\r\n >(undefined);\r\n const handleFilterChange: (\r\n items: IFilterSettings[],\r\n ) => void = React.useCallback(\r\n items => {\r\n const newState = [...items.filter(showFiltersFn)];\r\n\r\n setAppliedFilters(getDependencyFilters(newState));\r\n\r\n // Save values\r\n if (setValue !== undefined) {\r\n for (const f of newState) {\r\n setValue(\r\n f.fieldName as string,\r\n f.value !== undefined ? f.value : null,\r\n );\r\n }\r\n }\r\n },\r\n [setAppliedFilters, setValue, showFiltersFn],\r\n );\r\n const setFilterValueCallback = React.useCallback(\r\n (id: string, value: FilterValueType) => {\r\n if (allFilters === undefined) {\r\n return;\r\n }\r\n const filter = allFilters?.find(f => f.id === id);\r\n // in cases when applied filter is not defined call to setAppliedFilters will just only mutate appliedFilters array and cause duplicate/unnecessary invocation of hooks that have appliedFilters as a dependency\r\n if (filter !== undefined) {\r\n filter.value = value;\r\n const x = allFilters\r\n .map(f => (f === filter ? { ...filter, ...{ value: value } } : f))\r\n .filter(showFiltersFn);\r\n handleFilterChange(x);\r\n }\r\n },\r\n [allFilters, handleFilterChange, showFiltersFn],\r\n );\r\n const getFilterValueCallback = React.useCallback(\r\n (id: string) => {\r\n const f = getFilterValue(appliedFilters, id);\r\n return f;\r\n },\r\n [appliedFilters],\r\n );\r\n React.useEffect(() => {\r\n if (authenticatedUser === undefined) {\r\n return;\r\n }\r\n // get the filters\r\n let visibleFilters = allFilters?.filter(showFiltersFn);\r\n let depFilters = getDependencyFilters(visibleFilters);\r\n setAppliedFilters(depFilters);\r\n setAppliedFilters(initFilterData(depFilters, globalServiceGroupFilter));\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [globalServiceGroupFilter]);\r\n return {\r\n allfilters: allFilters,\r\n appliedFilters,\r\n handleFilterChange,\r\n getFilterValue: getFilterValueCallback,\r\n setFilterValue: setFilterValueCallback,\r\n };\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { buildParams } from 'api/odata/ODataParamsBuilder';\r\nimport { IRow } from 'app/components/BasicTable';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { Entity } from 'types/common';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\n\r\nfunction getUrlAndParams(\r\n api: string | IPathAndQuery,\r\n oDataParams: {\r\n $count?: boolean;\r\n $select?: string;\r\n $filter?: string | undefined;\r\n },\r\n) {\r\n var url = typeof api === 'string' ? api : (api as IPathAndQuery).path;\r\n var search = (api as IPathAndQuery).search;\r\n const params = { ...oDataParams, ...search };\r\n return { url, params };\r\n}\r\nexport async function GettableCount(state: {\r\n api: string;\r\n predicates: Array | string>;\r\n columns: Array;\r\n globalFilterValue?: string;\r\n customFilter: IFilterSettings[];\r\n serviceGroups: Entity[];\r\n isOptionalServiceGroup: boolean;\r\n}) {\r\n const oDataParams = buildParams({\r\n ...state,\r\n select: state.columns,\r\n serviceGroups: state.serviceGroups,\r\n pageSize: 1,\r\n pageIndex: 0,\r\n });\r\n var { url, params } = getUrlAndParams(state.api, oDataParams);\r\n const response = await httpClient.get(url, params /*, cancelToken*/);\r\n const dataLength = response['@odata.count'];\r\n return dataLength;\r\n}\r\n","import { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IBasicTableState, IRow } from 'app/components/BasicTable';\r\nimport { PageActionRenderer } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport { FormSectionTitle } from 'app/components/Forms/FormsLayout/FormSectionTitle';\r\nimport { GetFilters as getTrainingFilters } from 'app/pages/TrainingSessionsPage/Filter';\r\nimport { getColumns } from 'app/pages/TrainingSessionsPage/Columns';\r\nimport { ITrainingSessionsRow } from 'app/pages/TrainingSessionsPage/ITrainingSessionsRow';\r\nimport { TrainingSessionsTable } from 'app/pages/TrainingSessionsPage/TrainingSessionsTable';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Column } from 'react-table';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { BaseFilterValues, useFilters } from './TableFilters';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { GettableCount } from './GetTableCount';\r\nimport { PrimaryAction } from 'app/components/BasicTable/components/TableCard/PrimaryAction';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport trainingSessionPrimaryAction from 'app/pages/TrainingSessionsPage/PrimaryAction';\r\nimport { SidePanelOpenState } from 'app/hooks/useSidePanelOpen';\r\n\r\nconst AssetTrainingSessionsColumns: string[] = [\r\n 'Id',\r\n 'TrainingState',\r\n 'TrainerName',\r\n 'StartDate',\r\n 'EndDate',\r\n 'Duration',\r\n 'Campus',\r\n 'Building',\r\n 'Room',\r\n 'hasReservation',\r\n 'myReservationId',\r\n 'MinAttendance',\r\n 'MaxAttendance',\r\n 'RemainedSlots',\r\n 'Remarks',\r\n];\r\nconst url = '/api/odata/v4/TrainingSessions';\r\nconst GetPredicates = (\r\n assetId: number,\r\n serviceGroupId?: number,\r\n availabilityType?: string,\r\n): Array | string> => {\r\n const res: Array | string> = [];\r\n const assetPredicate = new Condition(\r\n 'AssetId',\r\n ODataOperators.Equals,\r\n assetId,\r\n );\r\n const serviceGroupPredicate = new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Equals,\r\n serviceGroupId,\r\n );\r\n if (!!availabilityType && availabilityType === 'ServiceGroup') {\r\n res.push(serviceGroupPredicate);\r\n } else {\r\n res.push(assetPredicate);\r\n }\r\n res.push(\r\n new Condition(\r\n 'IsUpcoming',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n\r\n return res;\r\n};\r\nclass FilterValues extends BaseFilterValues {\r\n TrainingState: FilterValueType | null = null;\r\n Trainer: FilterValueType | null = null;\r\n}\r\nconst filterValues = new FilterValues();\r\nexport interface AssetTrainingSessionsProps {\r\n assetId: number;\r\n serviceId: number | null;\r\n serviceTypeId?: ServiceType;\r\n isMobile?: boolean;\r\n serviceGroupId?: number;\r\n availabilityType?: string;\r\n useSidePanel?: boolean;\r\n openPanel: (state: SidePanelOpenState) => void;\r\n}\r\nexport async function GetTrainingSessionsTableCount(\r\n assetId: number,\r\n name: string,\r\n updateCounters: (name: string, count: number) => void,\r\n serviceGroupId?: number,\r\n availabilityType?: string,\r\n) {\r\n const res = await GettableCount({\r\n api: url,\r\n predicates: GetPredicates(\r\n assetId,\r\n serviceGroupId,\r\n availabilityType,\r\n ) as Array | string>,\r\n columns: ['Id'],\r\n globalFilterValue: '',\r\n customFilter: [],\r\n serviceGroups: [],\r\n isOptionalServiceGroup: true,\r\n });\r\n updateCounters(name, res);\r\n}\r\nexport function AssetTrainingSessions(props: AssetTrainingSessionsProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const user = useSelector(selectAuthenticatedUser);\r\n const history = useHistory();\r\n const { actions } = useLayoutSlice();\r\n const {\r\n assetId,\r\n serviceId,\r\n serviceTypeId,\r\n isMobile,\r\n serviceGroupId,\r\n availabilityType,\r\n useSidePanel,\r\n openPanel,\r\n } = props;\r\n const {\r\n allfilters,\r\n appliedFilters,\r\n handleFilterChange,\r\n getFilterValue,\r\n setFilterValue,\r\n } = useFilters(\r\n getTrainingFilters,\r\n filterValues.GetFilter(),\r\n filterValues.SetValue,\r\n );\r\n const trainingSessionsColumns = React.useMemo(() => getColumns(t), [t]);\r\n const columns = React.useMemo(() => {\r\n let res: Column[] = [];\r\n for (const c of AssetTrainingSessionsColumns) {\r\n const column = trainingSessionsColumns.find(f => f.accessor === c);\r\n if (column !== undefined) {\r\n res.push(column);\r\n }\r\n }\r\n return res;\r\n }, [trainingSessionsColumns]);\r\n const { newDate, getOffsetDate } = useSystemDate();\r\n /*const menuItems: React.ReactNode[] = React.useMemo(() => {\r\n let items: React.ReactNode[] = [\r\n \r\n window.open(\r\n toRootedURL('/TrainingSession/Details.aspx', {\r\n eqid: serviceId,\r\n }),\r\n '_blank',\r\n )\r\n }\r\n >\r\n {t(translations.menu_DetailsTrainingSessions)}\r\n ,\r\n ];\r\n return items;\r\n }, [serviceId, t]);*/\r\n\r\n const pageActions: PageActionRenderer[] = React.useMemo(() => {\r\n const actions: PageActionRenderer[] = [];\r\n if (serviceTypeId !== undefined && serviceId !== null) {\r\n if (\r\n user?.HasAdminServicePermissions(serviceTypeId, serviceId) ||\r\n user?.HasLabTechServicePermissions(serviceTypeId, serviceId)\r\n ) {\r\n actions.push(() => (\r\n {\r\n window.open(\r\n toRootedURL('/TrainingSession/AddNew.aspx', {\r\n eqid: serviceId,\r\n }),\r\n '_blank',\r\n );\r\n }}\r\n />\r\n ));\r\n actions.push(() => (\r\n {\r\n window.open(\r\n toRootedURL('/TrainingSession/Details.aspx', {\r\n eqid: serviceId,\r\n }),\r\n '_blank',\r\n );\r\n }}\r\n />\r\n ));\r\n }\r\n }\r\n return actions;\r\n }, [isMobile, serviceId, serviceTypeId, t, user]);\r\n const goToTrainingSessions = React.useCallback(() => {\r\n history.push(`trainingsessions?eqid=${serviceId}`);\r\n dispatch(actions.toggleSidePanel(false));\r\n }, [actions, dispatch, history, serviceId]);\r\n const customScreenName: React.ReactNode = React.useMemo(() => {\r\n const result = (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n );\r\n return result;\r\n }, [goToTrainingSessions, t]);\r\n const primaryAction: PrimaryAction = React.useCallback(\r\n (...args) => {\r\n const hasNextSession =\r\n getOffsetDate(args[0].original.StartDate) >\r\n dateUtils.truncateTime(newDate());\r\n if (hasNextSession) {\r\n trainingSessionPrimaryAction(\r\n openPanel,\r\n args[0],\r\n args[1],\r\n args[2],\r\n useSidePanel,\r\n );\r\n }\r\n },\r\n [getOffsetDate, newDate, openPanel, useSidePanel],\r\n );\r\n const initialState: IBasicTableState = React.useMemo(\r\n () => ({\r\n sortBy: [{ id: 'StartDate', desc: false }],\r\n }),\r\n [],\r\n );\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","import { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport React from 'react';\r\nimport { ArticlesTable } from 'app/pages/ArticlesPage/ArticlesTable';\r\nimport { IBasicTableState, IRow } from 'app/components/BasicTable';\r\nimport { GettableCount } from './GetTableCount';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { SidePanelOpenState } from 'app/hooks/useSidePanelOpen';\r\nimport { PrimaryAction } from 'app/components/BasicTable/components/TableCard/PrimaryAction';\r\nimport articlePrimaryAction from 'app/pages/ArticlesPage/PrimaryAction';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nconst url = '/api/odata/v4/articles';\r\nconst GetPredicates = (\r\n assetId: number,\r\n serviceGroupId: number | undefined,\r\n availabilityType?: string,\r\n): string[] => {\r\n // The asset matches and the service group matches or there is only a service group and it matches.\r\n const res: string[] = [];\r\n if (!!availabilityType && availabilityType === 'ServiceGroup') {\r\n res.push(\r\n `Assets/any(a: a/Id eq ${assetId} ${\r\n !!serviceGroupId ? 'or a/ServiceGroupId eq ' + serviceGroupId : ''\r\n })`,\r\n );\r\n } else {\r\n res.push(\r\n `Assets/any(a: a/Id eq ${assetId} ${\r\n !!serviceGroupId ? 'and a/ServiceGroupId eq ' + serviceGroupId : ''\r\n })`,\r\n );\r\n }\r\n return res;\r\n};\r\nexport async function GetArticlesTableCount(\r\n assetId: number,\r\n serviceGroupId: number | undefined,\r\n name: string,\r\n updateCounters: (name: string, count: number) => void,\r\n availabilityType: string,\r\n) {\r\n let res = 0;\r\n res = await GettableCount({\r\n api: url,\r\n predicates: GetPredicates(\r\n assetId,\r\n serviceGroupId,\r\n availabilityType,\r\n ) as Array | string>,\r\n columns: ['Id'],\r\n globalFilterValue: '',\r\n customFilter: [],\r\n serviceGroups: [],\r\n isOptionalServiceGroup: true,\r\n });\r\n updateCounters(name, res);\r\n}\r\nexport interface AssetArticlesTableProps {\r\n assetId: number;\r\n serviceGroupId?: number;\r\n isMobile?: boolean;\r\n useSidePanel?: boolean;\r\n openPanel: (state: SidePanelOpenState) => void;\r\n availabilityType?: string;\r\n user?: AuthenticatedUser;\r\n}\r\nexport function AssetArticlesTable(props: AssetArticlesTableProps) {\r\n //const { serviceGroups } = useGlobalServiceGroupsFilter(true);\r\n /*const {\r\n allfilters,\r\n appliedFilters,\r\n handleFilterChange,\r\n getFilterValue,\r\n setFilterValue,\r\n } = useFilters(props.getFiltersDefinition, 'AssetId');*/\r\n const predicates = React.useMemo(() => {\r\n return GetPredicates(\r\n props.assetId,\r\n props.serviceGroupId,\r\n props.availabilityType,\r\n );\r\n }, [props.assetId, props.availabilityType, props.serviceGroupId]);\r\n const initialState: IBasicTableState = React.useMemo(\r\n () => ({\r\n sortBy: [{ id: 'Id', desc: false }],\r\n }),\r\n [],\r\n );\r\n const primaryAction: PrimaryAction = React.useCallback(\r\n (...args) => {\r\n articlePrimaryAction(\r\n props.openPanel,\r\n args[0],\r\n undefined,\r\n args[2],\r\n props.useSidePanel,\r\n );\r\n },\r\n [props.openPanel, props.useSidePanel],\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","import { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IDocumentsDirectoryRow } from 'app/pages/Documents/IDocumentsDirectoryRow';\r\n//import { useFilters } from './TableFilters';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { WorkOrdersTable } from 'app/pages/WorkOrdersPage/WorkOrdersTable';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { FormSectionTitle } from 'app/components/Forms/FormsLayout/FormSectionTitle';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { PageActionRenderer } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport { NewWorkOrderButton } from 'app/pages/WorkOrdersPage/Actions/NewWorkOrder';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { getColumns } from 'app/pages/WorkOrdersPage/Columns';\r\nimport { Column } from 'react-table';\r\nimport { IBasicTableState, IRow } from 'app/components/BasicTable';\r\nimport { GettableCount } from './GetTableCount';\r\nimport { SidePanelOpenState } from 'app/hooks/useSidePanelOpen';\r\nimport workOrderPrimaryAction from 'app/pages/WorkOrdersPage/PrimaryAction';\r\nimport { PrimaryAction } from 'app/components/BasicTable/components/TableCard/PrimaryAction';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nconst AssetWorkOrdersColumns: string[] = [\r\n 'Id',\r\n 'AlertType',\r\n 'AlertTitle',\r\n 'AlertDescription',\r\n 'AssignedUsers',\r\n 'AlertOfflineTime',\r\n 'ReportedBy',\r\n 'LastUpdated',\r\n 'LastComment',\r\n 'LastCommentAt',\r\n 'LastCommentBy',\r\n];\r\nconst AssetCalibrationColumns: string[] = [\r\n 'Id',\r\n 'AlertType',\r\n 'EventStart',\r\n 'EventEnd',\r\n 'AlertTitle',\r\n 'AlertDescription',\r\n 'ReportedBy',\r\n];\r\nconst url = '/api/odata/v4/WorkOrders';\r\n\r\nconst GetPredicates = (\r\n assetId: number,\r\n availabilityType?: string,\r\n serviceGroupId?: number,\r\n calibration?: boolean,\r\n): Array | string> => {\r\n const res: Array | string> = [];\r\n const assetPredicate = new Condition(\r\n 'AssetId',\r\n ODataOperators.Equals,\r\n assetId,\r\n );\r\n const groupPredicate = new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Equals,\r\n serviceGroupId,\r\n );\r\n const calibrationPredicate = `(${[\r\n new Condition(\r\n 'ShowOnCalibrationHistory',\r\n ODataOperators.Equals,\r\n true,\r\n ).toString(),\r\n new Condition(\r\n 'IsClosed',\r\n ODataOperators.Equals,\r\n true,\r\n ).toString(),\r\n ].join(' and ')})`;\r\n\r\n if (\r\n !!availabilityType &&\r\n availabilityType === 'ServiceGroup' &&\r\n !!serviceGroupId\r\n ) {\r\n res.push(groupPredicate);\r\n } else {\r\n res.push(assetPredicate);\r\n }\r\n if (calibration) {\r\n res.push(calibrationPredicate);\r\n }\r\n\r\n return res;\r\n};\r\nexport async function GetWorkOrdersTableCount(\r\n assetId: number,\r\n calibration: boolean,\r\n name: string,\r\n updateCounters: (name: string, count: number) => void,\r\n serviceGroupId?: number,\r\n availabilityType?: string,\r\n) {\r\n const res = await GettableCount({\r\n api: url,\r\n predicates: GetPredicates(\r\n assetId,\r\n availabilityType,\r\n serviceGroupId,\r\n calibration,\r\n ) as Array | string>,\r\n columns: ['Id'],\r\n globalFilterValue: '',\r\n customFilter: [],\r\n serviceGroups: [],\r\n isOptionalServiceGroup: true,\r\n });\r\n updateCounters(name, res);\r\n}\r\nexport interface AssetWorkOrdersProps {\r\n assetId: number;\r\n assetName: string;\r\n serviceGroupId: number | undefined;\r\n calibration?: boolean;\r\n getFiltersDefinition?: GetPageFilters;\r\n isMobile?: boolean;\r\n useSidePanel?: boolean;\r\n openPanel: (state: SidePanelOpenState) => void;\r\n allowToAddNew?: boolean;\r\n availabilityType?: string;\r\n user?: AuthenticatedUser;\r\n}\r\nexport function AssetWorkOrders(props: AssetWorkOrdersProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const { actions } = useLayoutSlice();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n /*const {\r\n allfilters,\r\n appliedFilters,\r\n handleFilterChange,\r\n getFilterValue,\r\n setFilterValue,\r\n } = useFilters(props.getFiltersDefinition, 'AssetId');*/\r\n const workOrdersColumns = React.useMemo(\r\n () =>\r\n getColumns(\r\n t,\r\n undefined,\r\n undefined,\r\n authenticatedUser,\r\n props.useSidePanel,\r\n props.openPanel,\r\n ),\r\n [authenticatedUser, props.openPanel, props.useSidePanel, t],\r\n );\r\n const columns = React.useMemo(() => {\r\n let res: Column[] = [];\r\n if (props.calibration) {\r\n for (const c of AssetCalibrationColumns) {\r\n const column = workOrdersColumns.find(f => f.accessor === c);\r\n if (column !== undefined) {\r\n res.push(column);\r\n }\r\n }\r\n return res;\r\n } else {\r\n for (const c of AssetWorkOrdersColumns) {\r\n const column = workOrdersColumns.find(f => f.accessor === c);\r\n if (column !== undefined) {\r\n res.push(column);\r\n }\r\n }\r\n return res;\r\n }\r\n }, [props.calibration, workOrdersColumns]);\r\n\r\n const PageActions: PageActionRenderer[] = React.useMemo(() => {\r\n if (props.calibration || !props.allowToAddNew) {\r\n return [];\r\n } else {\r\n return [\r\n () => (\r\n \r\n ),\r\n ];\r\n }\r\n }, [\r\n props.allowToAddNew,\r\n props.assetId,\r\n props.assetName,\r\n props.calibration,\r\n props.openPanel,\r\n props.useSidePanel,\r\n t,\r\n ]);\r\n const primaryAction: PrimaryAction = React.useCallback(\r\n (...args) => {\r\n workOrderPrimaryAction(\r\n props.openPanel,\r\n args[0],\r\n args[1],\r\n args[2],\r\n props.useSidePanel,\r\n );\r\n },\r\n [props.openPanel, props.useSidePanel],\r\n );\r\n const goToWorkOrders = React.useCallback(() => {\r\n dispatch(actions.toggleSidePanel(false));\r\n history.push('/workorders?aid=' + props.assetId);\r\n }, [actions, dispatch, history, props.assetId]);\r\n\r\n const predicates = React.useMemo(() => {\r\n return GetPredicates(\r\n props.assetId,\r\n props.availabilityType,\r\n props.serviceGroupId,\r\n props.calibration,\r\n );\r\n }, [\r\n props.assetId,\r\n props.availabilityType,\r\n props.calibration,\r\n props.serviceGroupId,\r\n ]);\r\n const initialState: IBasicTableState = React.useMemo(\r\n () => ({\r\n sortBy: [{ id: 'Id', desc: true }],\r\n }),\r\n [],\r\n );\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n hideMenuOnMobile={true}\r\n screenNameVariant=\"section\"\r\n tablePaddingVariant={'dense'}\r\n compactTable={props.isMobile}\r\n />\r\n );\r\n}\r\n","import styled from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport clsx from 'clsx';\r\n\r\nexport interface BadgeCounterProps {\r\n count?: number;\r\n}\r\nconst Badge = styled('div')(({ theme }) => ({\r\n '&.badgeRoot': {\r\n display: 'flex',\r\n width: '16px',\r\n height: '16px',\r\n //padding: '1.5px 0px 2px 0px',\r\n padding: 0,\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n borderRadius: '100px',\r\n background: bookitColors.grayscale.grayComponentsLight,\r\n '&.hasValue': {\r\n background: bookitColors.primary.components,\r\n },\r\n '& .badgeText': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n flex: '1 0 0',\r\n alignSelf: 'stretch',\r\n color: bookitColors.base.white,\r\n textAlign: 'center',\r\n /* Bkt/Tips Regular */\r\n fontFamily: `'Lato', sans-serif`,\r\n fontSize: '10px',\r\n fontStyle: 'normal',\r\n lineHeight: '141%' /* 19.2px */,\r\n fontWeight: 400,\r\n letterSpacing: '0.2px',\r\n },\r\n },\r\n}));\r\nexport function BadgeCounter(props: BadgeCounterProps) {\r\n return (\r\n 0,\r\n })}\r\n >\r\n {props.count ?? 0}\r\n \r\n );\r\n}\r\n","import {\r\n ListItemSecondaryAction,\r\n ListItemText,\r\n MenuItem,\r\n useTheme,\r\n} from '@material-ui/core';\r\nimport { TabContent } from 'app/components/BasicTabs/TabContent';\r\nimport styled from 'styled-components';\r\nimport * as React from 'react';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { TabPanel, TabPanelProps } from 'app/components/BasicTabs/TabPanel';\r\n\r\nexport interface AssetMobileDropDownTabsProps {\r\n tabs: TabContent[];\r\n tabsId: string;\r\n tabsPanelId: string;\r\n isMobile?: boolean;\r\n handleTabChange: (tab: TabContent) => void;\r\n selectedTab: TabContent;\r\n tabPanels?: Array>;\r\n}\r\nexport const DropDownTabsWrapper = styled('div')(({ theme }) => ({\r\n '&.drpTabsWrapper': {\r\n display: 'flex',\r\n padding: '0px 16px',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n alignSelf: 'stretch',\r\n gap: '16px',\r\n width: '100%',\r\n overflow: 'hidden',\r\n '& .asset-mobile-tabs': {\r\n '& .asset-mobile-tabs-paper': {\r\n width: '100%',\r\n },\r\n },\r\n },\r\n}));\r\n\r\nexport function AssetMobileDropDownTabs(props: AssetMobileDropDownTabsProps) {\r\n const {\r\n tabs,\r\n tabsId,\r\n tabsPanelId,\r\n isMobile,\r\n handleTabChange,\r\n selectedTab,\r\n tabPanels,\r\n } = props;\r\n const theme = useTheme();\r\n // const [selectedOption, setSelectedOption] = React.useState(\r\n // tabs[0],\r\n // );\r\n const handleSelectedTabIndexChange = (newValue: TabContent) => {\r\n handleTabChange(newValue);\r\n };\r\n const getTabProps = React.useCallback(\r\n (item: TabContent) => {\r\n return {\r\n id: `${tabsId}-${item.Id}`,\r\n 'aria-controls': `${tabsPanelId}-${item.Id}`,\r\n label: item.Name,\r\n };\r\n },\r\n [tabsId, tabsPanelId],\r\n );\r\n return (\r\n \r\n \r\n tabs.map(tab => (\r\n {\r\n handleSelectedTabIndexChange(tab);\r\n close();\r\n }}\r\n selected={selectedTab.Id === tab.Id}\r\n {...getTabProps(tab)}\r\n >\r\n \r\n {!!tab.endIcon && (\r\n {tab.endIcon}\r\n )}\r\n \r\n ))\r\n }\r\n menuProps={{\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n },\r\n transformOrigin: {\r\n vertical: 'top',\r\n horizontal: 'left',\r\n },\r\n getContentAnchorEl: null,\r\n className: 'asset-mobile-tabs',\r\n PaperProps: {\r\n style: { width: isMobile ? '100%' : '340px' },\r\n className: 'asset-mobile-tabs-paper',\r\n },\r\n }}\r\n addChevron\r\n >\r\n {selectedTab.Name}\r\n \r\n {!!tabPanels && tabPanels.length > 0 ? (\r\n {tabPanels}\r\n ) : (\r\n \r\n {tabs.map((item, index) => (\r\n \r\n {item.Content}\r\n \r\n ))}\r\n \r\n )}\r\n {/* {tabs.map((item, index) => (\r\n \r\n {item.Content}\r\n \r\n ))} */}\r\n \r\n );\r\n}\r\n","import { BasicTabs } from 'app/components/BasicTabs';\r\nimport { TabContent } from 'app/components/BasicTabs/TabContent';\r\nimport { TabPanel, TabPanelProps } from 'app/components/BasicTabs/TabPanel';\r\nimport * as React from 'react';\r\nimport { AssetMobileDropDownTabs } from './AssetMobileDropDownTabs';\r\n\r\nexport interface AssetDetailsTabsProps {\r\n tabs: TabContent[];\r\n shortView: boolean;\r\n isMobile: boolean;\r\n}\r\nexport function AssetDetailsTabs(props: AssetDetailsTabsProps) {\r\n const { tabs, shortView, isMobile } = props;\r\n\r\n const [selectedTab, setSelectedTab] = React.useState(tabs[0]);\r\n\r\n const tabsId = 'assetdetails-tab';\r\n const tabsPanelId = 'assetdetails-tabpanel';\r\n\r\n const handleSelectedTabChange = (newValue: TabContent) => {\r\n setSelectedTab(newValue);\r\n };\r\n const tabsPanels: Array> = React.useMemo(() => {\r\n return tabs.map((item, index) => (\r\n f.Id === selectedTab.Id)}\r\n index={index}\r\n tabsId={tabsId}\r\n tabsPanelId={tabsPanelId}\r\n scrollableContent={true}\r\n key={item.Id}\r\n >\r\n {item.Content}\r\n \r\n ));\r\n }, [selectedTab.Id, tabs]);\r\n return (\r\n \r\n {shortView ? (\r\n \r\n ) : (\r\n f.Id === selectedTab.Id)}\r\n scrollableContent={true}\r\n handleTabChange={handleSelectedTabChange}\r\n tabPanels={tabsPanels}\r\n />\r\n )}\r\n \r\n );\r\n}\r\n","import { IAssetRangeDto } from 'api/odata/generated/complexTypes/IAssetRangeDto';\r\nimport { Entity } from 'types/common';\r\nimport { AlertInfo, IAsset } from '../IAsset';\r\nimport { IAssetAssemblyStructure } from '../IAssetAssemblyStructure';\r\nimport { IAssetRow } from '../IAssetRow';\r\n\r\nexport interface RawSection {\r\n Id: string;\r\n Index: number;\r\n SectionName: boolean;\r\n remove: boolean;\r\n}\r\nexport interface Section {\r\n Id: string;\r\n row: IAssetRow;\r\n rows: IAssetRow[];\r\n}\r\nexport interface Sections {\r\n leftSections: Section[];\r\n rightSections: Section[];\r\n}\r\nexport interface SectionsProps {\r\n sections: Section[];\r\n data?: IAsset;\r\n}\r\nexport interface AssetDetailsAdditionalData {\r\n ApprovalRequired: boolean;\r\n Status: string;\r\n StatusId: number;\r\n AssemblyStructure?: IAssetAssemblyStructure;\r\n HideTrainingSession: boolean;\r\n Range: IAssetRangeDto[];\r\n ForceTutoring: boolean;\r\n AutoMode?: number;\r\n Allowed_ByTraining?: boolean;\r\n CanStartUsage: boolean;\r\n CanEndUsage: boolean;\r\n UsageId?: number;\r\n EndUsageIds?: number[];\r\n Alerts?: Entity[];\r\n PlanedEventsEnabled: boolean;\r\n AlertInfo?: AlertInfo;\r\n NotifyExists?: boolean;\r\n CanBeCreatedFromLinkOnly?: boolean;\r\n NotAllowReservations: boolean | null;\r\n ShowFeed?: boolean;\r\n AssemblyId: number | null;\r\n CanRequestAccess: boolean;\r\n ApprovalStatusId: number | null;\r\n}\r\n\r\nexport class CountersForTabs {\r\n Reservations: { Enabled: boolean; Count: number } = {\r\n Enabled: true,\r\n Count: 0,\r\n };\r\n Schedule: { Enabled: boolean; Count: number } = {\r\n Enabled: true,\r\n Count: 0,\r\n };\r\n WorkOrders: { Enabled: boolean; Count: number } = {\r\n Enabled: true,\r\n Count: 0,\r\n };\r\n Calibrations: { enabled: boolean; Count: number } = {\r\n enabled: true,\r\n Count: 0,\r\n };\r\n Publications: { Enabled: boolean; Count: number } = {\r\n Enabled: true,\r\n Count: 0,\r\n };\r\n TrainingSessions: { Enabled: boolean; Count: number } = {\r\n Enabled: true,\r\n Count: 0,\r\n };\r\n}\r\nexport const ExpandableRows: Array = [\r\n //'Alerts',\r\n 'Tags',\r\n 'Suppliers',\r\n 'Contacts',\r\n 'Experts',\r\n 'AssetAccessories',\r\n 'ServiceGroup',\r\n 'AssetCat',\r\n 'AvailabilityType',\r\n 'ExtraDDL0',\r\n 'ExtraDDL1',\r\n 'ExtraDDL2',\r\n 'ExtraDDL3',\r\n 'ExtraDDL4',\r\n 'ExtraDDL5',\r\n 'ExtraDDL6',\r\n 'ExtraDDL7',\r\n 'ExtraDDL8',\r\n 'ExtraDDL9',\r\n 'ExtraDDL10',\r\n 'ExtraDDL11',\r\n 'ExtraDDL12',\r\n 'ExtraDDL13',\r\n 'ExtraDDL14',\r\n 'ExtraDDL15',\r\n //'Articles',\r\n];\r\nexport const DefaultRows: Array = [\r\n //'ImageName',\r\n //'DivisionName',\r\n //'AvailabilityType',\r\n 'Articles',\r\n 'Comments',\r\n];\r\nexport const DefaultAttributes: Array = [\r\n 'Id',\r\n 'Name',\r\n 'ImageName',\r\n 'ServiceId',\r\n 'ServiceType',\r\n 'AvailabilityType',\r\n 'CommentsAreStaffonly',\r\n];\r\n","import * as React from 'react';\r\nimport { useCallback, useEffect, useMemo, useState, Fragment } from 'react';\r\nimport {\r\n selectAppSettings,\r\n selectAssetPopupSettings,\r\n selectAuthenticatedUser,\r\n selectGlobalServiceGroupFilter,\r\n selectGlobalSettingBool,\r\n selectglobalSettings,\r\n selectIsAuthenticated,\r\n selectPublicUrl,\r\n} from 'app/slice/selectors';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\n\r\nimport { IAsset } from './IAsset';\r\nimport { IAssetRow } from './IAssetRow';\r\nimport { getRows } from './Rows';\r\nimport { Badge, MenuItem } from '@material-ui/core';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { translations } from 'locales/translations';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { buildURL, toRootedURL } from 'utils/url-utils';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { useTopAssetActionsDropDown } from './components/TopAssetActionsDropDown';\r\nimport { CalendarButton } from 'app/components/CalendarButton';\r\nimport { ServiceType, ServiceTypeUnion } from 'enums/ServiceTypes';\r\nimport { CreateAnAssetRelatedEvent } from './CreateAnAssetRelatedEvent';\r\nimport {\r\n AvailabilityTypes,\r\n AvailabilityTypesUnion,\r\n} from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { IAssetDetails2Dto } from 'api/odata/generated/entities/IAssetDetails2Dto';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { AssetDetailsTabContent } from './components/AssetDetailsTabContent';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { AssetBookingRules } from './components/AssetBookingRules';\r\nimport {\r\n AssetTrainingSessions,\r\n GetTrainingSessionsTableCount,\r\n} from './components/AssetTrainingSessions';\r\nimport {\r\n AssetArticlesTable,\r\n GetArticlesTableCount,\r\n} from './components/AssetArcticlesTable';\r\nimport {\r\n AssetWorkOrders,\r\n GetWorkOrdersTableCount,\r\n} from './components/AssetWorkOrders';\r\nimport {\r\n GetAlertsEnabled,\r\n GetReservationEnabled,\r\n GetUsageEnabled,\r\n addArrayItemByName,\r\n isBookable,\r\n moveArrayItem,\r\n fetchAssetBy,\r\n fetchAssetAdditionalData,\r\n moveArrayItemByName,\r\n isOnlineService,\r\n} from './components/Utils';\r\nimport { TabContent } from 'app/components/BasicTabs/TabContent';\r\nimport { BadgeCounter } from './components/BadgeCounter';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { EndUsageConfirm, EndUsageData } from 'app/components/EndUsageConfirm';\r\nimport { AssetDetailsApi } from 'api/AssetDetailsApi';\r\nimport { AssetDetailsTabs } from './components/AssetDetailsTabs';\r\nimport { MismatchCore } from './components/MismatchCoreMessage';\r\nimport { ServiceGroupRegistrationStatus } from 'enums/ServiceGroupRegistrationStatus';\r\nimport {\r\n AssetDetailsAdditionalData,\r\n CountersForTabs,\r\n DefaultAttributes,\r\n DefaultRows,\r\n ExpandableRows,\r\n} from './components/types';\r\nimport {\r\n AssetTypes,\r\n GetAssetTypeFrom,\r\n IsAssetFieldEnabled,\r\n IsAssetFieldIsPublic,\r\n} from 'types/AppSettings';\r\nimport { AssetAttributes } from 'enums/AssetAttributes';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { ReservationCreateButton } from 'app/components/ReservationCreateButton';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { WorkOrderDetailsProps } from '../WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { TrendingUpRounded } from '@material-ui/icons';\r\nimport { ReportConsumablesProps } from '../OtherServiceDetails/ReportConsumables';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport { Messages } from 'app/components/Messages';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\n\r\nexport function alertsEnabled(availabilityType: AvailabilityTypesUnion) {\r\n switch (availabilityType) {\r\n case 'FreelyBookable':\r\n case 'LoanableEquipment':\r\n case 'LectureRoom':\r\n case 'TrainingProgram':\r\n case 'NotAvailable':\r\n case 'AvailableNotBookable':\r\n return true;\r\n case 'ServiceGroup':\r\n case 'SuperGroup':\r\n case 'ServiceRelated':\r\n case 'RequestRelated':\r\n return false;\r\n default:\r\n assertExhaustive(availabilityType);\r\n }\r\n}\r\n\r\nconst maxLeftTopButtonsLength = 2;\r\nconst countersForTabs = new CountersForTabs();\r\n\r\nexport interface AssetPopUpProps extends CoverProps {\r\n Id?: number;\r\n serviceId?: number;\r\n serviceType?: ServiceTypeUnion;\r\n onClose?: () => void;\r\n showAllCores?: boolean;\r\n useSidePanel: boolean;\r\n useRedirectToDash?: boolean;\r\n addFromCalendar?: boolean;\r\n}\r\n\r\nexport const AssetPopUp = ({\r\n Id,\r\n serviceId,\r\n onClose,\r\n showAllCores,\r\n useSidePanel = true,\r\n useRedirectToDash,\r\n isCover,\r\n addFromCalendar = true,\r\n serviceType,\r\n closeCover,\r\n ...props\r\n}: AssetPopUpProps) => {\r\n const { t } = useTranslation();\r\n const globalSettings = useSelector(selectglobalSettings);\r\n const history = useHistory();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n\r\n const [rows, setRows] = useState([]);\r\n const [selectColumns, setSelectColumns] = useState('');\r\n const [expandColumns, setExpandColumns] = useState('');\r\n const [data, setData] = useState();\r\n const [buttonsData, setButtonsData] = useState();\r\n const [loading, setLoading] = useState(false);\r\n const [loadingAdditionalData, setLoadingAdditionalData] = useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [\r\n loadingButtonsAdditionalData,\r\n setLoadingButtonsAdditionalData,\r\n ] = useState(undefined);\r\n const [openEndUsage, setOpenEndUsage] = useState(false);\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n // const [assetCover, setAssetCover] = useState();\r\n const {\r\n cover: assetCover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState();\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n // const isExpanded = useSelector(selectIsExpanded);\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const topServiceGroupsIsHidden = useSelector(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.HideTopServiceGroupFilter),\r\n );\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const [counters, setCounters] = useState(countersForTabs);\r\n const location = useLocation();\r\n const isMobile = DetectIsMobile();\r\n const appSettings = useSelector(selectAppSettings);\r\n const assetProps = useSelector(selectAssetPopupSettings);\r\n const shortView = React.useMemo(() => {\r\n return isMobile || (useSidePanel === true && !sidePanelExpanded) || isCover;\r\n }, [isCover, isMobile, sidePanelExpanded, useSidePanel]);\r\n const isAdmin = React.useMemo(() => {\r\n if (data === undefined) {\r\n return false;\r\n }\r\n const serviceGroupId = data?.ServiceGroup?.Id ?? undefined;\r\n const serviceId = data?.ServiceId ?? undefined;\r\n const serviceTypeId =\r\n data?.ServiceType === null\r\n ? undefined\r\n : ServiceType[data.ServiceType] ?? undefined;\r\n const result =\r\n authenticatedUser?.HasAdminGroupOnlyPermissions(serviceGroupId) ||\r\n authenticatedUser?.HasAdminServiceOnlyPermissions(\r\n serviceTypeId !== undefined ? serviceTypeId : 1,\r\n serviceId,\r\n );\r\n console.debug('foo', result);\r\n return result ?? false;\r\n }, [authenticatedUser, data]);\r\n const isDashboardCore = React.useMemo(() => {\r\n var path = location.pathname;\r\n return path.toLowerCase() === '/dashboards/core/' + data?.ServiceGroup?.Id;\r\n }, [data?.ServiceGroup?.Id, location.pathname]);\r\n const assetFieldEnabled = React.useCallback(\r\n (\r\n AssetField: AssetAttributes,\r\n AssetAvailabilityType?: AssetTypes,\r\n ): boolean => {\r\n if (isAuthenticated) {\r\n return IsAssetFieldEnabled(\r\n appSettings,\r\n AssetField,\r\n AssetAvailabilityType,\r\n );\r\n } else {\r\n return (\r\n IsAssetFieldEnabled(appSettings, AssetField, AssetAvailabilityType) &&\r\n IsAssetFieldIsPublic(appSettings, AssetField, AssetAvailabilityType)\r\n );\r\n }\r\n },\r\n [appSettings, isAuthenticated],\r\n );\r\n const updateCounters = useCallback(\r\n (name: string, count: number) => {\r\n const tempCounters = Object.assign({}, counters);\r\n tempCounters[name].Count = count;\r\n setCounters(tempCounters);\r\n },\r\n [counters],\r\n );\r\n const updateCountersEnable = useCallback(\r\n (name: string, enabled: boolean) => {\r\n const tempCounters = counters;\r\n tempCounters[name].Enabled = enabled;\r\n setCounters(tempCounters);\r\n },\r\n [counters],\r\n );\r\n const dict: Record = useMemo(() => {\r\n return getRows(\r\n t,\r\n globalSettings,\r\n openPanel,\r\n publicUrl,\r\n isCover,\r\n useSidePanel,\r\n isAdmin,\r\n shortView,\r\n isAuthenticated,\r\n ).reduce((res, current) => {\r\n res[current.Id] = current;\r\n return res;\r\n }, {});\r\n }, [\r\n t,\r\n globalSettings,\r\n openPanel,\r\n publicUrl,\r\n isCover,\r\n useSidePanel,\r\n isAdmin,\r\n shortView,\r\n isAuthenticated,\r\n ]);\r\n\r\n const mismatchCore = useMemo(() => {\r\n return MismatchCore(\r\n data,\r\n isAuthenticated,\r\n topServiceGroupsIsHidden,\r\n selectedServiceGroups,\r\n );\r\n }, [data, isAuthenticated, selectedServiceGroups, topServiceGroupsIsHidden]);\r\n const loadAdditionalData = useCallback(\r\n async (data: IAssetDetails2Dto) => {\r\n const res = Object.assign({}, data);\r\n if (!!res) {\r\n setLoadingAdditionalData(true);\r\n try {\r\n const ad:\r\n | AssetDetailsAdditionalData\r\n | undefined = await fetchAssetAdditionalData({\r\n Id: res.Id,\r\n typeId: AvailabilityTypes[res.AvailabilityType.Id] as number,\r\n isAuth: isAuthenticated,\r\n buttonsData: false,\r\n });\r\n if (!!ad) {\r\n res.ApprovalRequired = ad.ApprovalRequired;\r\n res.Status = ad.Status;\r\n res.StatusId = ad.StatusId;\r\n res.AssetAssemblyStructure = ad.AssemblyStructure;\r\n res.HideTrainingSession = ad.HideTrainingSession;\r\n res.Range = ad.Range;\r\n res.ForceTutoring = ad.ForceTutoring;\r\n res.Allowed_ByTraining = ad.Allowed_ByTraining;\r\n res.EndUsageIds = ad.EndUsageIds;\r\n if (res.ServiceGroup !== undefined && res.ServiceGroup !== null) {\r\n res.ServiceGroup.CanRequestAccess = ad.CanRequestAccess;\r\n res.ServiceGroup.ApprovalStatusId = ad.ApprovalStatusId;\r\n }\r\n res.CanBeCreatedFromLinkOnly = ad.CanBeCreatedFromLinkOnly;\r\n res.NotAllowReservations = ad.NotAllowReservations;\r\n res.ReservationEnabled = GetReservationEnabled(\r\n AvailabilityTypes[res.AvailabilityType.Id],\r\n res.Active,\r\n !!res.NotAllowReservations,\r\n );\r\n setData(res);\r\n }\r\n } finally {\r\n setLoadingAdditionalData(false);\r\n }\r\n }\r\n },\r\n [isAuthenticated],\r\n );\r\n const loadButtonsAdditionalData = useCallback(\r\n async (data: IAssetDetails2Dto) => {\r\n const res = Object.assign({}, buttonsData);\r\n if (!!data) {\r\n setLoadingButtonsAdditionalData(true);\r\n try {\r\n const ad:\r\n | AssetDetailsAdditionalData\r\n | undefined = await fetchAssetAdditionalData({\r\n Id: data.Id,\r\n typeId: AvailabilityTypes[data.AvailabilityType.Id] as number,\r\n isAuth: isAuthenticated,\r\n buttonsData: true,\r\n });\r\n if (!!ad) {\r\n res.AutoMode = ad.AutoMode;\r\n res.UsageEnabled = GetUsageEnabled(\r\n AvailabilityTypes[data.AvailabilityType.Id],\r\n data.Active,\r\n res.AutoMode,\r\n );\r\n res.UsageId = ad.UsageId;\r\n res.CanStartUsage = ad.CanStartUsage;\r\n res.CanEndUsage = ad.CanEndUsage;\r\n res.Alerts = ad.Alerts;\r\n res.PlanedEventsEnabled = ad.PlanedEventsEnabled;\r\n res.AlertInfo = ad.AlertInfo;\r\n res.NotifyExists = ad.NotifyExists;\r\n res.NotAllowReservations = ad.NotAllowReservations;\r\n res.AssemblyId = ad.AssemblyId;\r\n res.ReservationEnabled = GetReservationEnabled(\r\n AvailabilityTypes[data.AvailabilityType.Id],\r\n data.Active,\r\n !!res.NotAllowReservations,\r\n );\r\n res.ShowFeed = ad.ShowFeed;\r\n setButtonsData(res);\r\n }\r\n } finally {\r\n setLoadingButtonsAdditionalData(false);\r\n }\r\n }\r\n },\r\n [buttonsData, isAuthenticated],\r\n );\r\n\r\n const loadCounters = useCallback(\r\n (data: IAssetDetails2Dto) => {\r\n if (Id !== undefined) {\r\n if (counters.TrainingSessions.Enabled) {\r\n GetTrainingSessionsTableCount(\r\n Id,\r\n 'TrainingSessions',\r\n updateCounters,\r\n data.ServiceGroup.Id,\r\n data.AvailabilityType.Id,\r\n );\r\n }\r\n GetWorkOrdersTableCount(\r\n Id,\r\n false,\r\n 'WorkOrders',\r\n updateCounters,\r\n data.ServiceGroup.Id,\r\n data.AvailabilityType.Id,\r\n );\r\n GetWorkOrdersTableCount(\r\n Id,\r\n true,\r\n 'Calibrations',\r\n updateCounters,\r\n data.ServiceGroup.Id,\r\n data.AvailabilityType.Id,\r\n );\r\n GetArticlesTableCount(\r\n Id,\r\n data.ServiceGroup?.Id,\r\n 'Publications',\r\n updateCounters,\r\n data.AvailabilityType.Id,\r\n );\r\n }\r\n },\r\n [Id, counters.TrainingSessions.Enabled, updateCounters],\r\n );\r\n // useEffect(() => {\r\n // if (!useSidePanel) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }\r\n // }, [useSidePanel, dispatch, layoutActions]);\r\n\r\n const enabledAssetProps = React.useMemo(() => {\r\n const id = data?.AvailabilityType?.Id;\r\n if (id !== undefined) {\r\n const res = assetProps.filter(a =>\r\n assetFieldEnabled(\r\n AssetAttributes[a.Id],\r\n GetAssetTypeFrom(AvailabilityTypes[id]),\r\n ),\r\n );\r\n return res;\r\n } else {\r\n return assetProps;\r\n }\r\n }, [assetFieldEnabled, assetProps, data?.AvailabilityType?.Id]);\r\n const columnNamesFilter = React.useCallback((r: IAssetRow) => {\r\n return (\r\n r.State === undefined &&\r\n [\r\n 'AssetAssemblyStructure',\r\n 'Status',\r\n 'Division',\r\n 'AssetCatGroup',\r\n 'Range',\r\n ].includes(r.PropName ?? r.Id) === false &&\r\n r.Id !== 'ForceTutoring'\r\n );\r\n }, []);\r\n const setRequestParams = React.useCallback(\r\n (rows: IAssetRow[]) => {\r\n if (rows.length > 0) {\r\n let columns = [\r\n ...rows\r\n .filter(r => columnNamesFilter(r))\r\n .map(v => v.PropName ?? v.Id),\r\n ...DefaultAttributes,\r\n ];\r\n setSelectColumns('Active,' + columns.join(','));\r\n setExpandColumns(\r\n columns\r\n .filter(column => ExpandableRows.includes(column))\r\n .concat('ServiceGroup')\r\n .join(','),\r\n );\r\n }\r\n },\r\n [columnNamesFilter],\r\n );\r\n useEffect(() => {\r\n moveArrayItem(enabledAssetProps, 'ImageName', 0);\r\n addArrayItemByName(\r\n enabledAssetProps,\r\n 'AssetAssemblyStructure',\r\n 'ImageName',\r\n );\r\n moveArrayItemByName(enabledAssetProps, 'Status', 'ServiceGroup');\r\n const rs = [\r\n ...DefaultRows.map(r => dict[r]),\r\n ...enabledAssetProps.flatMap(assetProp => {\r\n let val = dict[assetProp.Id];\r\n if (!!val) {\r\n val.Name = assetProp.DisplayName ?? val.Name;\r\n if (val.dependencies && !!val.dependencies.length) {\r\n return [val, ...val.dependencies.map(v => dict[v])];\r\n }\r\n }\r\n return val;\r\n }),\r\n ].filter(v => !!v);\r\n setRequestParams(rs);\r\n setRows(rs);\r\n }, [assetProps, dict, enabledAssetProps, setRequestParams]);\r\n useEffect(() => {\r\n if (rows.length === 0 || data !== undefined) return;\r\n setLoading(true);\r\n let active = true;\r\n const cancelToken = httpClient.cancelToken.source();\r\n async function fetchData() {\r\n try {\r\n const params = {\r\n $select: selectColumns,\r\n $expand: expandColumns,\r\n };\r\n\r\n const res = await fetchAssetBy({\r\n Id: Id,\r\n ServiceType: serviceType ?? 'Online',\r\n ServiceId: serviceId,\r\n params,\r\n isAuth: isAuthenticated,\r\n });\r\n if (active && res !== undefined) {\r\n res.Division = res.ServiceGroup?.DivisionName;\r\n res.AssetCatGroup =\r\n res.AssetCat !== null && !!res.AssetCat\r\n ? res.AssetCat.AssetCatGroupName\r\n : null;\r\n res.Status = ' ';\r\n res.AlertsEnabled = isAuthenticated\r\n ? GetAlertsEnabled(\r\n AvailabilityTypes[res.AvailabilityType.Id],\r\n res.Active,\r\n )\r\n : false;\r\n setData(res);\r\n loadButtonsAdditionalData(res);\r\n loadAdditionalData(res);\r\n if (isAuthenticated) {\r\n loadCounters(res);\r\n }\r\n }\r\n setLoading(false);\r\n } catch (error) {\r\n console.error(error);\r\n setLoading(false);\r\n }\r\n }\r\n\r\n fetchData();\r\n\r\n return () => {\r\n active = false;\r\n setLoading(false);\r\n cancelToken.cancel('cancelled');\r\n };\r\n }, [\r\n Id,\r\n data,\r\n expandColumns,\r\n isAuthenticated,\r\n loadAdditionalData,\r\n loadButtonsAdditionalData,\r\n loadCounters,\r\n rows.length,\r\n selectColumns,\r\n serviceId,\r\n serviceType,\r\n ]);\r\n\r\n const handleEndUsage = React.useCallback(\r\n (usageData: EndUsageData) => {\r\n if (buttonsData?.UsageId)\r\n AssetDetailsApi.endUsage(buttonsData?.UsageId, usageData)\r\n .then(response => {\r\n setOpenEndUsage(false);\r\n if (data !== undefined) {\r\n loadButtonsAdditionalData(data);\r\n }\r\n if (response.ErrorMessages.length > 0) {\r\n response.ErrorMessages.forEach(errmsg =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: errmsg,\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n response.SuccessMessages.forEach(msg =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'success',\r\n message: msg,\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n response.WarningMessages.forEach(wrnmsg =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'warning',\r\n message: wrnmsg,\r\n }),\r\n ),\r\n );\r\n }\r\n })\r\n .catch(e => console.error(e));\r\n },\r\n [actions, buttonsData?.UsageId, data, dispatch, loadButtonsAdditionalData],\r\n );\r\n\r\n const getTopAssetActionsDropDown = useTopAssetActionsDropDown({\r\n isMismatchCore: mismatchCore,\r\n isAdmin: isAdmin,\r\n });\r\n // const rightTopActions = useMemo(() => {\r\n // let actions = [] as ActionRenderer[];\r\n // if (isExpanded || isCover) {\r\n // actions.push(() => (\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 actions;\r\n // }, [data, isExpanded, isCover, t]);\r\n const topActions = useMemo(() => {\r\n let buttonActions = [] as ActionRenderer[];\r\n if (\r\n data !== undefined &&\r\n buttonsData !== undefined &&\r\n data.AvailabilityType !== undefined &&\r\n loading === false &&\r\n loadingButtonsAdditionalData === false\r\n ) {\r\n const bookable = isBookable(data.AvailabilityType.Id);\r\n const addWorkOrder = () => {\r\n if (alertsEnabled(data.AvailabilityType.Id) && isAuthenticated) {\r\n buttonActions.push(() => (\r\n \r\n ));\r\n }\r\n };\r\n const addReservation = () => {\r\n if (!buttonsData.AssemblyId && buttonsData.ReservationEnabled) {\r\n buttonActions.push(() => (\r\n }\r\n variant={bookable ? 'main' : 'white'}\r\n title={t(translations.PlaceAReservation)}\r\n disabled={mismatchCore}\r\n instruments={data.ServiceId === null ? [] : [data.ServiceId]}\r\n useSidePanel={useSidePanel}\r\n openPanelOrCover={openPanel}\r\n >\r\n {t(translations.Reservation)}\r\n \r\n ));\r\n }\r\n };\r\n const addServiceRequest = () => {\r\n if (\r\n data.ServiceType === 'Sample' &&\r\n data.CanBeCreatedFromLinkOnly === false\r\n ) {\r\n buttonActions.push(() => (\r\n {\r\n history.push(\r\n '/ServiceRequests?OfflineServiceTypeId=' +\r\n data.ServiceId +\r\n '&Active=true',\r\n );\r\n }}\r\n title={t(translations.SampleRequests)}\r\n startIcon={}\r\n disabled={mismatchCore}\r\n >\r\n {t(translations.SampleRequests)}\r\n \r\n ));\r\n }\r\n };\r\n const addReservationFromCalendar = () => {\r\n if (!buttonsData.AssemblyId && buttonsData.ReservationEnabled) {\r\n buttonActions.push(() => (\r\n }\r\n title={t(translations.PlaceAReservation)}\r\n equipments={data.ServiceId === null ? [] : [data.ServiceId]}\r\n disabled={mismatchCore}\r\n openToBook={true}\r\n target={isAuthenticated ? '_self' : '_blank'}\r\n >\r\n {t(translations.Reservation)}\r\n \r\n ));\r\n }\r\n };\r\n const addUsage = () => {\r\n if (!!buttonsData.UsageEnabled) {\r\n if (!!buttonsData.CanStartUsage && !buttonsData.AssemblyId) {\r\n buttonActions.push(() => (\r\n }\r\n href={toRootedURL(`/Usage.aspx?id=${data.ServiceId}`)}\r\n target={'_blank'}\r\n title={t(translations.StartUsage)}\r\n disabled={mismatchCore}\r\n >\r\n {t(translations.Use)}\r\n \r\n ));\r\n }\r\n if (!!buttonsData.CanEndUsage && !!buttonsData.UsageId) {\r\n buttonActions.push(() => (\r\n }\r\n title={t(translations.StopUsage)}\r\n onClick={() => setOpenEndUsage(true)}\r\n disabled={mismatchCore}\r\n >\r\n {t(translations.Stop)}\r\n \r\n ));\r\n }\r\n }\r\n };\r\n const addTakeDown = () => {\r\n if (\r\n isBookable(data.AvailabilityType?.Id) &&\r\n buttonsData.AlertInfo !== undefined &&\r\n !!buttonsData.PlanedEventsEnabled &&\r\n !!buttonsData.AlertInfo.show &&\r\n isAuthenticated\r\n ) {\r\n if (!buttonsData.AlertInfo.hasDownActive) {\r\n if (\r\n !!buttonsData.AlertInfo.isAdmin &&\r\n !!buttonsData.AlertInfo.assetId\r\n ) {\r\n buttonActions.push(() => (\r\n {\r\n let res = [\r\n \r\n {t(translations.PleaseSelectAnEventType)}\r\n ,\r\n ];\r\n if (buttonsData.Alerts !== undefined) {\r\n res.push(\r\n ...buttonsData.Alerts.map(a => (\r\n \r\n openPanel({\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: {\r\n queryParams: {\r\n aType: a.Id.toString(),\r\n assetId:\r\n !!buttonsData.AlertInfo &&\r\n !!buttonsData.AlertInfo.assetId\r\n ? buttonsData.AlertInfo.assetId.toString()\r\n : undefined,\r\n down: true.toString(),\r\n\r\n offH: true.toString(),\r\n },\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n })\r\n }\r\n key={a.Id + a.Name + 'key'}\r\n >\r\n {a.Name}\r\n \r\n // \r\n // {a.Name}\r\n // \r\n )),\r\n );\r\n }\r\n return res;\r\n }}\r\n >\r\n \r\n \r\n ));\r\n }\r\n } else if (\r\n !!buttonsData.AlertInfo.noAlerts ||\r\n !!buttonsData.AlertInfo.hasActive\r\n ) {\r\n if (\r\n !!buttonsData.AlertInfo.isAdmin &&\r\n !!buttonsData.AlertInfo.alertId\r\n ) {\r\n buttonActions.push(() => (\r\n \r\n openPanel({\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: {\r\n queryParams: {\r\n id: (buttonsData.AlertInfo?.alertId ?? -1).toString(),\r\n Up: TrendingUpRounded.toString(),\r\n },\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState)\r\n }\r\n // href={toRootedURL(\r\n // `/workorders/details?id=${buttonsData.AlertInfo?.alertId}&Up=True`,\r\n // )}\r\n >\r\n \r\n \r\n ));\r\n }\r\n }\r\n }\r\n };\r\n\r\n const addConsumable = () => {\r\n if (data.ServiceType === 'Offline' && isAuthenticated) {\r\n buttonActions.push(() => (\r\n }\r\n title={t(translations.ReportAConsumable)}\r\n onClick={() => {\r\n let params = {\r\n useSidePanel: true,\r\n queryParams: {\r\n stid: data.ServiceId?.toString(),\r\n user: authenticatedUser?.Id,\r\n },\r\n } as ReportConsumablesProps;\r\n openPanel({\r\n renderPageType: RenderPageType.ReportConsumables,\r\n renderPageProps: params,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n }}\r\n //href={toRootedURL(`/reportConsumables?stid=${data.ServiceId}`)}\r\n >\r\n {t(translations.LogConsumables)}\r\n \r\n ));\r\n }\r\n };\r\n\r\n const addCoreBoard = () => {\r\n if (!isDashboardCore) {\r\n buttonActions.push(() => (\r\n {\r\n dispatch(\r\n actions.saveGlobalServiceGroupFilter([\r\n {\r\n Id: data.ServiceGroup?.Id,\r\n Name: data.ServiceGroup?.Name,\r\n },\r\n ]),\r\n );\r\n dispatch(layoutActions.resetSidePanel());\r\n history.push('/dashboards/core/' + data.ServiceGroup?.Id ?? '');\r\n }}\r\n >\r\n {t(translations.CoreBoard)}\r\n \r\n ));\r\n }\r\n };\r\n const addRequestAccess = () => {\r\n if (!isAdmin && isAuthenticated) {\r\n const approvalStatus =\r\n data.ServiceGroup?.ApprovalStatusId ===\r\n ServiceGroupRegistrationStatus.Approved;\r\n if (data.ServiceGroup?.CanRequestAccess && !approvalStatus) {\r\n buttonActions.push(() => (\r\n {\r\n window.open(\r\n toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${data.ServiceGroup?.Id}`,\r\n ),\r\n '_blank',\r\n );\r\n }}\r\n >\r\n {t(translations.RequestAccess)}\r\n \r\n ));\r\n } else {\r\n buttonActions.push(() => (\r\n \r\n {t(\r\n translations[\r\n ServiceGroupRegistrationStatus[\r\n data.ServiceGroup?.ApprovalStatusId ?? 0\r\n ]\r\n ],\r\n )}\r\n \r\n ));\r\n }\r\n }\r\n };\r\n if (\r\n data.ServiceType === 'Sample' &&\r\n data.CanBeCreatedFromLinkOnly === false\r\n ) {\r\n addServiceRequest();\r\n }\r\n if (bookable) {\r\n if (addFromCalendar) {\r\n addReservationFromCalendar();\r\n } else {\r\n addReservation();\r\n }\r\n\r\n addUsage();\r\n addWorkOrder();\r\n addTakeDown();\r\n } else {\r\n addWorkOrder();\r\n addTakeDown();\r\n addUsage();\r\n addReservation();\r\n addConsumable();\r\n }\r\n addCoreBoard();\r\n addRequestAccess();\r\n if (isAuthenticated) {\r\n const assetActionsDropDown = getTopAssetActionsDropDown({\r\n data,\r\n buttonsData,\r\n });\r\n\r\n buttonActions.push(...assetActionsDropDown.map(item => () => item));\r\n }\r\n }\r\n return buttonActions;\r\n }, [\r\n actions,\r\n addFromCalendar,\r\n authenticatedUser?.Id,\r\n buttonsData,\r\n data,\r\n dispatch,\r\n getTopAssetActionsDropDown,\r\n history,\r\n isAdmin,\r\n isAuthenticated,\r\n isDashboardCore,\r\n layoutActions,\r\n loading,\r\n loadingButtonsAdditionalData,\r\n mismatchCore,\r\n openPanel,\r\n t,\r\n useSidePanel,\r\n ]);\r\n\r\n const tabs = useMemo(() => {\r\n if (data !== undefined) {\r\n const res: TabContent[] = [];\r\n res.push({\r\n Name: t(translations.AssetDetailsTab_Details),\r\n Id: 'details',\r\n Content: (\r\n \r\n ),\r\n });\r\n if (isBookable(data.AvailabilityType?.Id) && isAuthenticated) {\r\n res.push({\r\n Name: t(translations.BookingRules),\r\n Id: 'BookingRules',\r\n Content: (\r\n \r\n ),\r\n });\r\n }\r\n if (isBookable(data.AvailabilityType?.Id) && isAuthenticated) {\r\n if (\r\n data.AvailabilityType?.Id !== 'LectureRoom' ||\r\n (!data.HideTrainingSession && data.Active)\r\n ) {\r\n const serviceType =\r\n data.ServiceType !== null\r\n ? ServiceType[data.ServiceType]\r\n : undefined;\r\n res.push({\r\n Name: t(translations.TrainingSessions),\r\n Id: 'trainingSessions',\r\n Content: (\r\n \r\n ),\r\n endIcon: ,\r\n });\r\n updateCountersEnable('TrainingSessions', true);\r\n } else {\r\n updateCountersEnable('TrainingSessions', false);\r\n }\r\n }\r\n if (isAuthenticated) {\r\n res.push({\r\n Name: t(translations.AssetDetailsTab_WorkOrders),\r\n Id: 'workOrders',\r\n Content: (\r\n \r\n ),\r\n endIcon: ,\r\n });\r\n }\r\n if (isAuthenticated) {\r\n res.push({\r\n Name: t(translations.Calibrations),\r\n Id: 'calibrations',\r\n Content: (\r\n \r\n ),\r\n endIcon: ,\r\n });\r\n }\r\n if (isAuthenticated) {\r\n res.push({\r\n Name: t(translations.Publications),\r\n Id: 'publications',\r\n Content: (\r\n \r\n ),\r\n endIcon: ,\r\n });\r\n }\r\n /*res.push({\r\n Name:\r\n t(translations.AssetDetailsTab_MyReservations) +\r\n ` (${counters.Reservations.Count})`,\r\n Id: 'my_reservations',\r\n Content: <>reservations,\r\n });*/\r\n /*res.push({\r\n Name: t(translations.AssetDetailsTab_Schedule),\r\n Id: 'schedule',\r\n Content: <>schedule,\r\n });*/\r\n return res;\r\n } else return [];\r\n }, [\r\n counters.Calibrations.Count,\r\n counters.Publications.Count,\r\n counters.TrainingSessions.Count,\r\n counters.WorkOrders.Count,\r\n data,\r\n isAdmin,\r\n isAuthenticated,\r\n isCover,\r\n loadingAdditionalData,\r\n openPanel,\r\n rows,\r\n shortView,\r\n t,\r\n updateCountersEnable,\r\n useSidePanel,\r\n ]);\r\n\r\n const handleCloselClick = React.useCallback(() => {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n onClose: () => {\r\n !!onClose && onClose();\r\n },\r\n } as SidePanelCloseState);\r\n // if (onClose) {\r\n // onClose();\r\n // } else {\r\n // if (sidePanelExpanded) {\r\n // dispatch(layoutActions.setExpanded(false));\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }\r\n // }\r\n }, [closePanel, isCover, onClose, useSidePanel]);\r\n // if (\r\n // data !== undefined &&\r\n // data.AvailabilityType !== undefined &&\r\n // data?.AvailabilityType.Id === 'ServiceGroup' &&\r\n // redirectToDashOnCoreClick &&\r\n // useRedirectToDash &&\r\n // !!selectedServiceGroups &&\r\n // selectedServiceGroups.length === 1\r\n // ) {\r\n // if (onClose) {\r\n // onClose();\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }\r\n // return ;\r\n // }\r\n return (\r\n \r\n {data && tabs !== undefined && tabs.length > 0 ? (\r\n \r\n \r\n {isAuthenticated && (\r\n \r\n setOpenEndUsage(false)}\r\n onConfirm={handleEndUsage}\r\n />\r\n \r\n )}\r\n \r\n \r\n ) : (\r\n <>{t(translations.err_Equipment_NotFound)}\r\n )}\r\n \r\n }\r\n closeSidePanel={handleCloselClick}\r\n rightTopActions={!shortView ? topActions : undefined}\r\n rightActionsLoading={!shortView && loadingButtonsAdditionalData}\r\n leftTopActions={shortView ? topActions : undefined}\r\n leftActionsLoading={shortView && loadingButtonsAdditionalData}\r\n maxLeftTopButtonsLength={\r\n data?.ReservationEnabled ? maxLeftTopButtonsLength : 1\r\n }\r\n rightTopActionsLength={data?.ReservationEnabled ? 2 : 1}\r\n isCover={isCover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n cover={assetCover}\r\n coverClosed={coverClosed}\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * Link\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport * as H from 'history';\r\nimport { IPathAndQuery, toQueryString } from 'utils/url-utils';\r\nimport {\r\n Link as RouterLink,\r\n LinkProps as RouterLinkProps,\r\n} from 'react-router-dom';\r\n\r\nexport interface LinkProps extends Omit, 'to'> {\r\n to: t;\r\n}\r\n\r\ntype routerLinkType = H.LocationDescriptor;\r\n//| ((location: H.Location) => H.LocationDescriptor);\r\n\r\ntype t = routerLinkType | IPathAndQuery;\r\n/**\r\n * Link to a resource inside the larger system but external to the React app\r\n * Renders ({ to, ...props }: LinkProps) {\r\n const toto = toLocationDescriptor(to);\r\n return ;\r\n}\r\n\r\nexport function toLocationDescriptor(\r\n tt: t,\r\n): H.LocationDescriptorObject {\r\n if (isPathAndQuery(tt)) {\r\n return toLocationDescriptorObject(tt as IPathAndQuery);\r\n } else {\r\n return tt as H.LocationDescriptorObject;\r\n }\r\n}\r\n\r\nfunction isPathAndQuery(value: t) {\r\n var s = value as IPathAndQuery;\r\n if (value === null) {\r\n return false;\r\n }\r\n\r\n return (\r\n s.path !== undefined &&\r\n s.search !== undefined &&\r\n typeof s.search === 'object'\r\n );\r\n}\r\n\r\nfunction toLocationDescriptorObject(\r\n to: IPathAndQuery,\r\n): H.LocationDescriptorObject {\r\n return {\r\n pathname: to.path,\r\n search: toQueryString(to.search).toString(),\r\n };\r\n}\r\n","/**\r\n *\r\n * ActionIconButton\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { ButtonsVariant } from '../Button';\r\n\r\nexport interface ActionIconButtonProps {\r\n onClick?: React.MouseEventHandler;\r\n disabled?: boolean;\r\n icon: IconProp;\r\n title: string;\r\n variant?: ButtonsVariant;\r\n size?: 'large' | 'medium' | 'small' | 'xs';\r\n autoFocus?: boolean;\r\n shape?: 'circle' | 'square';\r\n customIcon?: React.ReactNode;\r\n to?: string;\r\n href?: string | IPathAndQuery;\r\n id?: string;\r\n target?: string;\r\n}\r\n\r\nexport function ActionIconButton({\r\n disabled,\r\n onClick,\r\n title,\r\n icon,\r\n variant,\r\n size,\r\n autoFocus,\r\n shape,\r\n customIcon,\r\n to,\r\n href,\r\n id,\r\n target,\r\n ...other\r\n}: ActionIconButtonProps) {\r\n return (\r\n \r\n \r\n \r\n {customIcon ? customIcon : }\r\n \r\n \r\n \r\n );\r\n}\r\n","import { BaseToggleButtonGroup } from 'app/components/BasicButtons/BaseToggleButtonGroup';\r\nimport { useProfileSetting } from 'app/components/BasicTable/useProfileSetting';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { ReservationDetailsProps } from 'app/pages/ReservationDetails/Details';\r\nimport { WorkOrderDetailsProps } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { EmptySlotAdminClick } from 'enums/EmptySlotAdminClick';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface SwitchActionsProps {\r\n target: SwitchTarget;\r\n getProps: () => ReservationDetailsProps | WorkOrderDetailsProps;\r\n}\r\nexport enum SwitchTarget {\r\n WorkOrder = 1,\r\n Reservation = 2,\r\n}\r\n\r\nexport function SwitchActions(props: SwitchActionsProps) {\r\n const { target, getProps } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const { updateValue: updateX } = useProfileSetting({\r\n profileSettingKey: 'EmptySlotAdminClick',\r\n });\r\n const openReservation = React.useCallback(() => {\r\n let params = getProps() as ReservationDetailsProps;\r\n setTimeout(\r\n () =>\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.ReservationDetails,\r\n props: params,\r\n }),\r\n ),\r\n null,\r\n );\r\n updateX(EmptySlotAdminClick.ReservationsOnly.toString());\r\n }, [actions, dispatch, getProps, updateX]);\r\n const openWorkOrder = React.useCallback(() => {\r\n let params = getProps() as WorkOrderDetailsProps;\r\n setTimeout(\r\n () =>\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.WorkOrderDetails,\r\n props: params,\r\n }),\r\n ),\r\n null,\r\n );\r\n updateX(EmptySlotAdminClick.DownTimeOnly.toString());\r\n }, [actions, dispatch, getProps, updateX]);\r\n const options = [\r\n {\r\n Id: 2,\r\n Name: t(translations.SwitchToReservationTitle),\r\n },\r\n {\r\n Id: 1,\r\n Name: t(translations.SwitchToDowntime),\r\n },\r\n ];\r\n const [selectedOption, setSelectedOption] = React.useState>(\r\n options.filter(f => f.Id !== (target as number))[0],\r\n );\r\n const handleChange = (item: Entity | null) => {\r\n let selected = item === null ? options[0] : item;\r\n if (selected.Id === (target as number)) {\r\n setSelectedOption(selected);\r\n if (selected.Id === (SwitchTarget.WorkOrder as number)) {\r\n openWorkOrder();\r\n } else {\r\n openReservation();\r\n }\r\n }\r\n };\r\n return (\r\n \r\n []}\r\n onChange={handleChange}\r\n fullWidth={true}\r\n value={selectedOption}\r\n orientation={'horizontal'}\r\n variant={'white'}\r\n />\r\n {/* openReservation()}\r\n >\r\n {t(translations.SwitchToReservationTitle)}\r\n \r\n openWorkOrder()}\r\n >\r\n {t(translations.SwitchToDowntime)}\r\n */}\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Body } from 'app/components/Typography';\r\nimport styled from 'styled-components';\r\n\r\nexport interface FormSectionTitleProps {\r\n title: React.ReactNode;\r\n link?: React.ReactNode;\r\n}\r\nconst SectionTitle = styled('div')`\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n padding: 0px 0px 4px;\r\n gap: 16px;\r\n`;\r\nexport function FormSectionTitle(props: FormSectionTitleProps) {\r\n return (\r\n \r\n {props.title}\r\n {props.link !== undefined && props.link}\r\n \r\n );\r\n}\r\n","import { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { WorkOrderDetailsProps } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Link as MuiLink } from '@material-ui/core';\r\nimport React from 'react';\r\n\r\nexport interface OpenWorkOrderButtonProps extends ButtonProps {\r\n buttonName: React.ReactNode;\r\n orderId: number;\r\n bringBackUp?: boolean;\r\n useSidePanel?: boolean;\r\n openPanelWithCover?: (state: SidePanelOpenState) => void;\r\n}\r\nexport function OpenWorkOrderButton(props: OpenWorkOrderButtonProps) {\r\n const {\r\n buttonName,\r\n orderId,\r\n bringBackUp,\r\n useSidePanel,\r\n openPanelWithCover,\r\n } = props;\r\n const { t } = useTranslation();\r\n const { openPanel } = useSidePanelState();\r\n const openOrder = () => {\r\n let orderProps = {\r\n queryParams: {\r\n id: orderId.toString(),\r\n Up: (bringBackUp === true).toString(),\r\n },\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps;\r\n let panelProps = {\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: orderProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState;\r\n !!openPanelWithCover\r\n ? openPanelWithCover(panelProps)\r\n : openPanel(panelProps);\r\n };\r\n\r\n return (\r\n openOrder()}\r\n >\r\n {buttonName || t(translations.menu_EditWorkOrder)}\r\n \r\n );\r\n}\r\nexport const WorkOrderLink = (props: {\r\n id: number;\r\n Up?: boolean;\r\n children: React.ReactNode;\r\n title?: string;\r\n useSidePanel?: boolean;\r\n openPanelWithCover?: (state: SidePanelOpenState) => void;\r\n}) => {\r\n const { t } = useTranslation();\r\n const openOrder = useOpenWorkOrderPopUp();\r\n const open = () => {\r\n openOrder(\r\n {\r\n id: props.id,\r\n Up: props.Up,\r\n useSidePanel: props.useSidePanel,\r\n },\r\n props.openPanelWithCover,\r\n );\r\n };\r\n return (\r\n \r\n open()}\r\n color=\"textPrimary\"\r\n >\r\n {props.children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport const useOpenWorkOrderPopUp = () => {\r\n const { openPanel } = useSidePanelState();\r\n return React.useCallback(\r\n (\r\n props: { id: number; Up?: boolean; useSidePanel?: boolean },\r\n openPanelWithCover?: (state: SidePanelOpenState) => void,\r\n ) => {\r\n let orderProps = {\r\n queryParams: {\r\n id: props.id.toString(),\r\n Up: (props.Up === true).toString(),\r\n },\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps;\r\n const panelState = {\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: orderProps,\r\n expanded: false,\r\n useSidePanel: props.useSidePanel,\r\n isCover: props.useSidePanel,\r\n } as SidePanelOpenState;\r\n if (!!openPanelWithCover) {\r\n openPanelWithCover(panelState);\r\n } else {\r\n openPanel({\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: orderProps,\r\n expanded: false,\r\n useSidePanel: false,\r\n isCover: false,\r\n } as SidePanelOpenState);\r\n }\r\n },\r\n [openPanel],\r\n );\r\n};\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport {\r\n OfflineServiceTypePicker,\r\n OfflineServiceTypePickerProps,\r\n} from '../pickers/AutocompletePickers/OfflineServiceTypePicker';\r\n\r\nexport const FormOfflineServiceTypePicker = (\r\n props: FieldHookConfig &\r\n Omit,\r\n) => {\r\n const [field, meta, helpers] = useField(\r\n props,\r\n );\r\n const handleChange = val => {\r\n props.onChange?.(val);\r\n helpers.setValue(val, true);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n","import { makeStyles, Theme, createStyles } from '@material-ui/core';\r\n\r\nexport const useCommentStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n commentSection: {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n padding: theme.spacing(2, 0),\r\n gap: '16px',\r\n alignSelf: 'stretch',\r\n borderBottom: `1px solid ${theme.palette.common.grayDividers}`,\r\n width: '100%',\r\n },\r\n commentTextFiles: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n flex: '1 0 0',\r\n gap: '16px',\r\n },\r\n commentText: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: '8px',\r\n alignSelf: 'stretch',\r\n },\r\n nameAndTime: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: '4px',\r\n alignSelf: 'stretch',\r\n },\r\n nameTitleButtons: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px',\r\n alignSelf: 'stretch',\r\n },\r\n nameTitle: {\r\n flex: '1 0 0',\r\n },\r\n }),\r\n);\r\nexport const useContainerStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n commentsContainer: {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n flexDirection: 'column',\r\n gap: '8px',\r\n width: '100%',\r\n },\r\n sectionTitle: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n paddingBottom: '0px',\r\n gap: '16px',\r\n alignSelf: 'stretch',\r\n },\r\n controlBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n //paddingTop: '16px',\r\n alignItems: 'flex-start',\r\n gap: '24px',\r\n alignSelf: 'stretch',\r\n },\r\n addCommentBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '12px',\r\n alignSelf: 'stretch',\r\n },\r\n }),\r\n);\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n section: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n //padding: theme.spacing(0, 4),\r\n maxWidth: '100%',\r\n },\r\n leftSide: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n flexGrow: 1,\r\n padding: 0,\r\n width: '100%',\r\n },\r\n rightSide: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n flexGrow: 0,\r\n padding: 0,\r\n },\r\n form: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n width: '100%',\r\n },\r\n fields: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n boxSizing: 'border-box',\r\n width: '100%',\r\n gap: '16px',\r\n //paddingBottom: '36px',\r\n },\r\n // fieldsSpacing: {\r\n // width: 'calc(100% + 24px)',\r\n // margin: '-12px',\r\n // '& > $row': {\r\n // padding: theme.spacing(0.75, 0, 0.75, 0),\r\n // },\r\n // },\r\n row: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n width: '100%',\r\n gap: '16px',\r\n },\r\n sectionTitle: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: theme.spacing(0, 0, 2.5),\r\n },\r\n alertSpacing: {\r\n width: 'calc(100% + 24px)',\r\n margin: '12px -12px 12px -12px',\r\n },\r\n item: {\r\n flexBasis: '100%',\r\n maxWidth: '100%',\r\n },\r\n itemCheck: {\r\n display: 'flex',\r\n justifyContent: 'start',\r\n alignItems: 'center',\r\n flexDirection: 'row',\r\n },\r\n }),\r\n);\r\n","import { Grid } from '@material-ui/core';\r\nimport { Body, InputLabel } from '../Typography';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { CommentFile } from './IComment';\r\nimport { Button } from '../BasicButtons/Button';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { Link } from '../ExternalLink';\r\nimport { DialogConfirm } from '../DialogConfirm';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useCallback, useState } from 'react';\r\nimport { CommentsApi } from 'api/CommentsApi';\r\nimport { useResponseModel } from 'app/hooks/useResponseModel';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\n\r\nconst fileSizeToString = (size: number, dp: number = 1) => {\r\n const thresh = 1000;\r\n if (Math.abs(size) < thresh) {\r\n return size + ' B';\r\n }\r\n const units = ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n let i = -1;\r\n const r = 10 ** dp;\r\n do {\r\n size /= thresh;\r\n i++;\r\n } while (\r\n Math.round(Math.abs(size) * r) / r >= thresh &&\r\n i < units.length - 1\r\n );\r\n return size.toFixed(dp) + ' ' + units[i];\r\n};\r\n\r\nexport const FileButton = ({\r\n file,\r\n canRemove,\r\n onDeleteFile,\r\n}: {\r\n file: CommentFile;\r\n canRemove: Boolean;\r\n onDeleteFile: (id: string) => void;\r\n}) => {\r\n const shortenName = (name: string) => {\r\n const [rawName, suffix] = name.split('.');\r\n if (rawName.length < 25) return name;\r\n return rawName.slice(0, 24) + '...' + suffix;\r\n };\r\n const { t } = useTranslation();\r\n const [openDelete, setOpenDelete] = useState(false);\r\n const sendNotifications = useResponseModel();\r\n const close = () => setOpenDelete(false);\r\n const onDelete = useCallback(() => {\r\n close();\r\n onDeleteFile(file.Id);\r\n sendNotifications({\r\n ErrorMessages: [],\r\n SuccessMessages: [t(translations.msg_DeleteFile)],\r\n WarningMessages: [],\r\n });\r\n }, [file.Id, onDeleteFile, sendNotifications, t]);\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 {shortenName(file.Name)}\r\n \r\n \r\n \r\n \r\n {file.Size && {fileSizeToString(file.Size)}}\r\n \r\n \r\n {canRemove && (\r\n \r\n setOpenDelete(true)}\r\n />\r\n \r\n CommentsApi.removeFile(file.Id)\r\n .then(onDelete)\r\n .catch(e => {\r\n console.error(e);\r\n sendNotifications({\r\n ErrorMessages: [t(translations.err_DeleteFileFailure)],\r\n SuccessMessages: [],\r\n WarningMessages: [],\r\n });\r\n })\r\n }\r\n onCancel={close}\r\n onClose={close}\r\n body={undefined}\r\n title={t(translations.AreYouSure)}\r\n isOpen={openDelete}\r\n />\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.largeFilesUpload || initialState;\r\n\r\nexport const selectLargeFilesUpload = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\nexport const selectLargeFilesCanUpload = createSelector(\r\n [selectLargeFilesUpload],\r\n state => state.canUpload,\r\n);\r\nexport const selectLargeFilesUploading = createSelector(\r\n [selectLargeFilesUpload],\r\n state => state.uploading,\r\n);\r\nexport const selectLargeFilesStartedToUpload = createSelector(\r\n [selectLargeFilesUpload],\r\n state => state.startedToUpload,\r\n);\r\nexport const selectLargeFilesUploadTargetId = createSelector(\r\n [selectLargeFilesUpload],\r\n state => state.targetId,\r\n);\r\nexport const selectLargeFilesUploadFilesNumber = createSelector(\r\n [selectLargeFilesUpload],\r\n state => state.numberOfUploadedFiles,\r\n);\r\nexport const selectLargeFilesUploadSelectedFiles = createSelector(\r\n [selectLargeFilesUpload],\r\n state => state.selectedFiles,\r\n);\r\n","import axios from 'axios';\r\nimport { CancelTokenSource } from 'axios';\r\nimport { UploadLargeFileApi } from './Api';\r\nimport { CancelToken } from 'axios';\r\nimport { Guid } from 'guid-typescript';\r\n\r\nexport interface AddFileResponse {\r\n Result: boolean;\r\n FileId: Guid | null;\r\n UploadId: string | null;\r\n ETag: string | null;\r\n PartNumber: number | null;\r\n Message: string | null;\r\n NeedCompleteMultipartUpload: boolean;\r\n}\r\nexport interface S3DS_UploadRespunse {\r\n ETag: string;\r\n PartNumber: number;\r\n}\r\n// Each part must be at least 5 MB in size, except the last part.\r\n// https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\r\nexport const minChunkSize = 5 * 1024 * 1024;\r\nexport class UploadLargeFile {\r\n private cancelTokenSource?: CancelTokenSource;\r\n private cancelToken?: any;\r\n private _pause: boolean = false;\r\n private _busy: boolean = false;\r\n public finished: boolean = false;\r\n public fileId: Guid | null = null;\r\n public uploadId: string | null = null;\r\n public NeedCompleteMultipartUpload: boolean = false;\r\n private uploadResponses: S3DS_UploadRespunse[] = [];\r\n public get pause() {\r\n return this._pause;\r\n }\r\n public set pause(value: boolean) {\r\n if (this._pause !== value) {\r\n this._pause = value;\r\n if (value) {\r\n this.cancel();\r\n }\r\n }\r\n }\r\n public get busy() {\r\n return this._busy;\r\n }\r\n public set busy(value: boolean) {\r\n this._busy = value;\r\n }\r\n public cancel() {\r\n this.cancelTokenSource?.cancel();\r\n }\r\n public stopAndCancel() {\r\n this.cancelTokenSource?.cancel();\r\n this.pause = true;\r\n }\r\n conscreateCancelToken() {\r\n this.cancelTokenSource = axios.CancelToken.source();\r\n this.cancelToken = this.cancelTokenSource.token;\r\n }\r\n public async deleteUnfinishedLargeFiles() {\r\n if (!this.finished && this.fileId !== null) {\r\n await DeleteUnfinishedLargeFiles([this.fileId], this.uploadId);\r\n this.fileId = null;\r\n this.uploadId = null;\r\n this.uploadResponses = [];\r\n }\r\n }\r\n private finish() {\r\n this.finished = true;\r\n this.fileId = null;\r\n this.uploadId = null;\r\n }\r\n async upload(\r\n file: File,\r\n chunkSendResult: (\r\n res: boolean,\r\n pos: number,\r\n part: number,\r\n error?: string,\r\n ) => void,\r\n continueFrom: { start: number; part: number } | null,\r\n uploadEnd: () => void,\r\n targetId: number,\r\n CompletionResult: (value: boolean) => void,\r\n ) {\r\n if (this.finished === false && this.busy === false && targetId > 0) {\r\n this.busy = true;\r\n let start = 0;\r\n let part = 0;\r\n this.conscreateCancelToken();\r\n try {\r\n this.pause = false;\r\n if (file !== undefined && file.size > 0) {\r\n const size = Math.floor(file.size / 100);\r\n const chunkSize: number = size < minChunkSize ? minChunkSize : size;\r\n if (continueFrom !== null) {\r\n start = continueFrom.start;\r\n part = continueFrom.part;\r\n } else {\r\n this.fileId = null;\r\n this.uploadResponses = [];\r\n }\r\n while (start < file.size) {\r\n const res = await uploadChunk(\r\n file,\r\n file.slice(start, start + chunkSize),\r\n start,\r\n part,\r\n targetId,\r\n this.fileId,\r\n this.uploadId,\r\n this.cancelToken,\r\n );\r\n if (res.Result) {\r\n this.fileId = res.FileId;\r\n this.uploadId = res.UploadId;\r\n this.NeedCompleteMultipartUpload =\r\n res.NeedCompleteMultipartUpload;\r\n if (\r\n this.uploadId !== null &&\r\n this.uploadId !== '' &&\r\n res.ETag !== null &&\r\n res.PartNumber !== null &&\r\n res.NeedCompleteMultipartUpload\r\n ) {\r\n this.uploadResponses.push({\r\n ETag: res.ETag,\r\n PartNumber: res.PartNumber,\r\n });\r\n }\r\n start += chunkSize;\r\n part++;\r\n chunkSendResult(true, start, part);\r\n if (this.pause) {\r\n uploadEnd();\r\n return;\r\n }\r\n } else {\r\n chunkSendResult(false, start, part, res.Message ?? undefined);\r\n return;\r\n }\r\n }\r\n }\r\n } finally {\r\n if (start >= file.size) {\r\n if (\r\n this.uploadId !== null &&\r\n this.uploadResponses.length > 0 &&\r\n this.NeedCompleteMultipartUpload\r\n ) {\r\n const res = await CompleteMultipartUpload(\r\n this.fileId,\r\n this.uploadId,\r\n this.uploadResponses,\r\n );\r\n if (res) {\r\n this.finish();\r\n } else {\r\n CompletionResult(false);\r\n }\r\n } else {\r\n this.finish();\r\n }\r\n }\r\n uploadEnd();\r\n this.busy = false;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst Api = new UploadLargeFileApi();\r\nasync function uploadChunk(\r\n file: File,\r\n chunk: Blob,\r\n pos: number,\r\n part: number,\r\n targetId: number,\r\n fileId: Guid | null,\r\n uploadId: string | null,\r\n cancel?: CancelToken,\r\n): Promise {\r\n try {\r\n const res = await Api.uploadChunck(\r\n //'api/LargeFilesUpload/Upload',\r\n '/api/odata/v4/Comments/AddFile',\r\n file.name,\r\n file.size,\r\n chunk,\r\n pos,\r\n part,\r\n targetId,\r\n fileId,\r\n uploadId,\r\n cancel,\r\n );\r\n return Promise.resolve(res.data);\r\n } catch (error: unknown) {\r\n return Promise.resolve({\r\n Result: false,\r\n FileId: null,\r\n UploadId: null,\r\n ETag: null,\r\n PartNumber: null,\r\n Message: null,\r\n NeedCompleteMultipartUpload: false,\r\n });\r\n }\r\n}\r\n\r\nexport async function CompleteMultipartUpload(\r\n fileId: Guid | null,\r\n uploadId: string | null,\r\n uploadResponses: S3DS_UploadRespunse[],\r\n): Promise {\r\n const url = '/api/odata/v4/Comments/CompleteMultipartUpload';\r\n try {\r\n await Api.CompleteMultipartUpload(url, fileId, uploadId, uploadResponses);\r\n return Promise.resolve(true);\r\n } catch {\r\n return Promise.resolve(false);\r\n }\r\n}\r\n\r\nexport async function DeleteUnfinishedLargeFiles(\r\n ids: Guid[],\r\n uploadId: string | null,\r\n): Promise {\r\n const url = '/api/odata/v4/Comments/DeleteUnfinishedLargeFileIds';\r\n try {\r\n await Api.DeleteUnfinishedLargeFiles(url, ids, uploadId);\r\n return Promise.resolve(true);\r\n } catch {\r\n return Promise.resolve(false);\r\n }\r\n}\r\n","import axios, { CancelToken } from 'axios';\r\nimport { Guid } from 'guid-typescript';\r\nimport { S3DS_UploadRespunse } from '.';\r\n\r\nexport class UploadLargeFileApi {\r\n uploadChunck = async (\r\n url: string,\r\n fileName: string,\r\n fileSize: number,\r\n chunck: Blob,\r\n pos: number,\r\n part: number,\r\n targetId: number,\r\n fileId: Guid | null,\r\n uploadId: string | null,\r\n cancel?: CancelToken,\r\n ) => {\r\n const formData = new FormData();\r\n formData.append('File', chunck);\r\n formData.append('rawFileName', fileName);\r\n formData.append('fileSize', fileSize.toString());\r\n formData.append('pos', pos.toString());\r\n formData.append('part', part.toString());\r\n formData.append('targetId', targetId.toString());\r\n formData.append('uploadId', uploadId ?? '');\r\n formData.append('fileId', fileId !== null ? fileId.toString() : Guid.EMPTY);\r\n const response = await axios.post(url, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n cancelToken: cancel,\r\n });\r\n return response;\r\n };\r\n CompleteMultipartUpload = async (\r\n url: string,\r\n fileId: Guid | null,\r\n uploadId: string | null,\r\n uploadResponses: S3DS_UploadRespunse[],\r\n ) => {\r\n const data = {\r\n fileId: fileId,\r\n uploadId: uploadId,\r\n uploadResponses: uploadResponses,\r\n };\r\n return axios.post(url, data);\r\n };\r\n DeleteUnfinishedLargeFiles = async (\r\n url: string,\r\n ids: Guid[],\r\n uploadId: string | null,\r\n ) => {\r\n const data = { ids: ids, uploadId: uploadId };\r\n return axios.post(url, data);\r\n };\r\n}\r\n","import {\r\n Card,\r\n CardContent,\r\n createStyles,\r\n LinearProgress,\r\n makeStyles,\r\n} from '@material-ui/core';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Body } from 'app/components/Typography';\r\nimport { translations } from 'locales/translations';\r\nimport React, { useCallback, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectLargeFilesCanUpload,\r\n selectLargeFilesUploadTargetId,\r\n} from '../slice/selectoes';\r\nimport { UploadLargeFile } from '../Upload';\r\nimport { useLargeFilesUploadSlice } from '../slice';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\n\r\nexport interface FileSize {\r\n size: number;\r\n name: string;\r\n}\r\nexport interface FileData {\r\n name: string;\r\n path: string;\r\n size: FileSize;\r\n}\r\nexport interface FileCardProps {\r\n file: File;\r\n remorFile: (name: string) => void;\r\n}\r\nexport const FileCard = ({ file, remorFile }: FileCardProps) => {\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const canUplpoad = useSelector(selectLargeFilesCanUpload);\r\n const targetId = useSelector(selectLargeFilesUploadTargetId);\r\n const [inProgress, setInProgress] = React.useState(false);\r\n const [progress, setProgress] = React.useState(0);\r\n const [part, setPart] = React.useState(0);\r\n const [error, setError] = React.useState(false);\r\n const [show, setShow] = React.useState(true);\r\n const [pause, setPause] = React.useState(false);\r\n const fileSize = getFileSize(file.size);\r\n const dispatch = useDispatch();\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const { actions: notificationActions } = useAppSettingsSlice();\r\n const fileName = React.useMemo(() => file.name, [file.name]);\r\n const uploadLargeFile = React.useMemo(() => new UploadLargeFile(), []);\r\n const closeHandler = useCallback(async () => {\r\n if (!inProgress) {\r\n setShow(false);\r\n await uploadLargeFile.deleteUnfinishedLargeFiles();\r\n remorFile(file.name);\r\n } else {\r\n setPause(true);\r\n uploadLargeFile.pause = true;\r\n }\r\n }, [file.name, inProgress, remorFile, uploadLargeFile]);\r\n const chunkSendResult = useCallback(\r\n (res: boolean, pos: number, part: number, error?: string) => {\r\n if (res) {\r\n setProgress(pos);\r\n setPart(part);\r\n } else {\r\n setProgress(pos);\r\n setPart(part);\r\n setInProgress(false);\r\n if (uploadLargeFile.pause === false) {\r\n setError(true);\r\n }\r\n if (error !== undefined) {\r\n dispatch(\r\n notificationActions.addNotification({\r\n variant: 'error',\r\n message: error,\r\n }),\r\n );\r\n }\r\n }\r\n },\r\n [dispatch, notificationActions, uploadLargeFile.pause],\r\n );\r\n const CompletionResult = useCallback(\r\n (value: boolean) => {\r\n if (!value) {\r\n setError(true);\r\n dispatch(\r\n notificationActions.addNotification({\r\n variant: 'error',\r\n message: 'Upload is failed',\r\n }),\r\n );\r\n }\r\n },\r\n [dispatch, notificationActions],\r\n );\r\n\r\n const uploadEnd = useCallback(() => {\r\n if (pause) {\r\n setInProgress(false);\r\n } else {\r\n setInProgress(false);\r\n dispatch(largeFileActions.removeFile(fileName));\r\n setShow(false);\r\n }\r\n }, [dispatch, fileName, largeFileActions, pause]);\r\n useEffect(() => {\r\n if (canUplpoad) {\r\n setInProgress(true);\r\n dispatch(largeFileActions.addFile(fileName));\r\n uploadLargeFile.upload(\r\n file,\r\n chunkSendResult,\r\n null,\r\n uploadEnd,\r\n targetId,\r\n CompletionResult,\r\n );\r\n }\r\n return () => {\r\n uploadLargeFile.stopAndCancel();\r\n uploadLargeFile.deleteUnfinishedLargeFiles();\r\n dispatch(largeFileActions.removeFile(fileName));\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [canUplpoad]);\r\n return (\r\n <>\r\n {show === true ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {error === false ? (\r\n <>\r\n \r\n \r\n \r\n {file.name}\r\n \r\n \r\n \r\n {inProgress ? (\r\n 0 ? 'determinate' : 'query'}\r\n value={\r\n progress > 0\r\n ? (progress / file.size) * 100\r\n : undefined\r\n }\r\n />\r\n ) : (\r\n <>\r\n {pause === false && (\r\n \r\n {fileSize.size + fileSize.name}\r\n \r\n )}\r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n \r\n {file.name}\r\n \r\n \r\n {t(translations.ErrorDueUpload)}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {(error || pause) && (\r\n \r\n }\r\n onClick={() => {\r\n if (uploadLargeFile.busy === false) {\r\n setPause(false);\r\n setInProgress(true);\r\n setError(false);\r\n uploadLargeFile.upload(\r\n file,\r\n chunkSendResult,\r\n {\r\n start: progress,\r\n part: part,\r\n },\r\n uploadEnd,\r\n targetId,\r\n CompletionResult,\r\n );\r\n }\r\n }}\r\n >\r\n {t(translations.ReUploadFile)}\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\nconst getFileSize = (size): FileSize => {\r\n var string;\r\n if (size >= 1024 * 1024 * 1024 * 1024) {\r\n size = size / (1024 * 1024 * 1024 * 1024);\r\n string = 'TiB';\r\n } else if (size >= 1024 * 1024 * 1024) {\r\n size = size / (1024 * 1024 * 1024);\r\n string = 'GiB';\r\n } else if (size >= 1024 * 1024) {\r\n size = size / (1024 * 1024);\r\n string = 'MiB';\r\n } else if (size >= 1024) {\r\n size = size / 1024;\r\n string = 'KiB';\r\n } else {\r\n string = 'b';\r\n }\r\n return { size: Math.round(size), name: string };\r\n};\r\n\r\nconst useStyles = makeStyles(theme =>\r\n createStyles({\r\n base: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n backgroundColor: theme.palette.background.default,\r\n //height: '163px',\r\n borderRadius: '8px',\r\n //width: '400px',\r\n marginTop: '8px',\r\n },\r\n container: {\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n //alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n content: {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n justifyContent: 'center',\r\n width: '100%',\r\n },\r\n }),\r\n);\r\n","import * as React from 'react';\r\nimport { FieldHookConfig } from 'formik';\r\nimport { useDropzone } from 'react-dropzone';\r\nimport { styled } from '@material-ui/core';\r\nimport { TextFieldProps } from 'app/components/TextField';\r\nimport { FileCard } from './FileCard';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useLargeFilesUploadSlice } from '../slice';\r\n\r\nexport interface SelectFileProps {\r\n accept: any;\r\n downloadFileName?: string;\r\n filesPlaceholder: React.ReactNode;\r\n height?: number;\r\n maxFilesCount?: number;\r\n maxSize: number;\r\n}\r\n\r\nexport const SelectFile = ({\r\n label,\r\n onBlur,\r\n value,\r\n name,\r\n error,\r\n helperText,\r\n accept,\r\n downloadFileName,\r\n filesPlaceholder,\r\n maxFilesCount,\r\n maxSize,\r\n ...props\r\n}: FieldHookConfig & TextFieldProps & SelectFileProps) => {\r\n const dispatch = useDispatch();\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const isMobile = DetectIsMobile();\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const showShortView = isMobile || (sidePanelOpen && !sidePanelExpanded);\r\n const maxFiles =\r\n maxFilesCount === undefined ? 1 : maxFilesCount > 20 ? 20 : maxFilesCount;\r\n const onDrop = React.useCallback(\r\n (acceptedFiles: File[]) => {\r\n dispatch(largeFileActions.setSeletedFiles(acceptedFiles.length));\r\n },\r\n [dispatch, largeFileActions],\r\n );\r\n\r\n const { acceptedFiles, getRootProps, getInputProps } = useDropzone({\r\n onDrop,\r\n maxFiles: maxFiles,\r\n //minSize: minChunkSize,\r\n maxSize: maxSize,\r\n accept: accept,\r\n });\r\n const remorFile = React.useCallback(\r\n (filename: string) => {\r\n const index = acceptedFiles.findIndex(item => item.name === filename);\r\n acceptedFiles.splice(index, 1);\r\n dispatch(largeFileActions.setSeletedFiles(acceptedFiles.length));\r\n },\r\n [acceptedFiles, dispatch, largeFileActions],\r\n );\r\n return (\r\n <>\r\n \r\n \r\n \r\n

    {filesPlaceholder}

    \r\n
    \r\n {acceptedFiles.length > 0 && (\r\n
    \r\n {acceptedFiles.map(file => (\r\n \r\n ))}\r\n
    \r\n )}\r\n
    \r\n \r\n );\r\n};\r\nconst StyledDropboxContainer = styled('div')(({ theme }) => ({\r\n flex: 1,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n padding: '20px',\r\n borderWidth: '2px',\r\n borderRadius: '2px',\r\n borderColor: theme.palette.common.grayBorders,\r\n borderStyle: 'dashed',\r\n backgroundColor: theme.palette.background.paper,\r\n color: '#bdbdbd',\r\n outline: 'none',\r\n transition: 'border .24s ease-in-out',\r\n}));\r\n","import { useTranslation } from 'react-i18next';\r\nimport { SelectFile } from './Components/SelectFile';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { Body } from '../Typography';\r\nimport BasicTypography from '../Typography/BasicTypography';\r\nimport { Box } from '../basic/Wrappers/Box';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectglobalSettings } from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\n\r\nexport interface LargeFilesUpdateProps {\r\n maxFilesCount?: number;\r\n}\r\nexport function LargeFilesUpdate({ maxFilesCount }: LargeFilesUpdateProps) {\r\n const { t } = useTranslation();\r\n const systemSettings = useSelector(selectglobalSettings);\r\n const AllowLargeFilesUpload = systemSettings.GetBooleanByKey(\r\n AllowedSettings.AllowLargeFilesUpload,\r\n );\r\n const fh = React.useMemo((): React.ReactNode => {\r\n let s = AllowLargeFilesUpload\r\n ? t(translations.MaxLargeFileSize)\r\n : t(translations.MaxUploadFileSize);\r\n s = s.replace('{0}', AllowLargeFilesUpload ? '2' : '20');\r\n return (\r\n <>\r\n {t(translations.DragTheFilesOrBrowse)}\r\n
    {s}
    \r\n \r\n );\r\n }, [AllowLargeFilesUpload, t]);\r\n return (\r\n <>\r\n \r\n {t(translations.Attachments)}\r\n \r\n \r\n \r\n );\r\n}\r\n","import { MenuItem } from '@material-ui/core';\r\nimport { useMemo, useState, useRef } from 'react';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { CommentFile, IComment, NewComment } from './IComment';\r\nimport { parse } from './commentParser';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Caption } from '../Typography';\r\nimport { Box } from '../basic/Wrappers/Box';\r\nimport * as Yup from 'yup';\r\nimport { Entity } from 'types/common';\r\nimport { Form, Formik } from 'formik';\r\nimport { Button } from '../BasicButtons/Button';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { FormRichTextField } from '../Forms/FormRichTextField';\r\nimport { TextField } from '../TextField';\r\nimport clsx from 'clsx';\r\nimport { useCommentStyles, useContainerStyles, useStyles } from './styles';\r\nimport { DropDown } from '../DropDown';\r\nimport { IEmail } from 'api/EmailApi';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { useSendMail } from 'app/hooks/useSendMail';\r\nimport { renderToStaticMarkup } from 'react-dom/server';\r\nimport { FormListener } from '../Forms/FormRender/FormRenderer';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { Avatar } from '../Avatar';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { EmailTypeUnion } from 'api/odata/generated/enums/EmailType';\r\nimport { Alert } from '@material-ui/lab';\r\nimport { Body } from '../Typography';\r\nimport * as React from 'react';\r\nimport BasicTypography from '../Typography/BasicTypography';\r\nimport { FileButton } from './FileButton';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\r\nimport { LargeFilesUpdate } from '../LargeFilesUpload';\r\nimport { useLargeFilesUploadSlice } from '../LargeFilesUpload/slice';\r\nimport {\r\n selectLargeFilesStartedToUpload,\r\n selectLargeFilesUpload,\r\n selectLargeFilesUploadFilesNumber,\r\n selectLargeFilesUploadSelectedFiles,\r\n selectLargeFilesUploadTargetId,\r\n selectLargeFilesUploading,\r\n} from '../LargeFilesUpload/slice/selectoes';\r\nimport { CommentsApi } from 'api/CommentsApi';\r\n\r\nexport interface CommentsContainerProps extends EmailRelated {\r\n Comments: IComment[];\r\n onSubmit: (comment: NewComment) => void;\r\n withMentions?: boolean;\r\n isAdmin?: boolean;\r\n onEditComment?: (comment: IComment, newComment: NewComment) => void;\r\n onDeleteComment?: (comment: IComment) => void;\r\n shouldSendEmail?: boolean;\r\n disabled?: boolean;\r\n bindSubmitComment?: any;\r\n defaultComment?: Partial;\r\n cannotComment?: boolean;\r\n sectionTitle?: React.ReactNode;\r\n noTitle?: boolean;\r\n}\r\n\r\nexport interface EmailRelated {\r\n emailBody?: string;\r\n emailSubject?: string;\r\n emailType?: EmailTypeUnion;\r\n pageName?: string;\r\n referenceName?: string;\r\n linkUrl?: string;\r\n}\r\n\r\nconst AddComment = ({\r\n onSubmit,\r\n onClose,\r\n withMentions,\r\n isAdmin,\r\n defaultComment,\r\n disabled,\r\n bindSubmitComment,\r\n}: {\r\n onSubmit: (comment: NewComment) => void;\r\n onClose: () => void;\r\n withMentions: boolean;\r\n isAdmin?: boolean;\r\n defaultComment?: Partial;\r\n disabled?: boolean;\r\n bindSubmitComment?: any;\r\n}) => {\r\n const { t } = useTranslation();\r\n const formRef = useRef(null);\r\n const dispatch = useDispatch();\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const selectedFiles = useSelector(selectLargeFilesUploadSelectedFiles);\r\n const classes = useStyles();\r\n\r\n useEffectOnMount(() => {\r\n formRef.current?.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'nearest',\r\n inline: 'nearest',\r\n });\r\n });\r\n React.useEffect(() => {\r\n dispatch(largeFileActions.setCanUpload(0));\r\n }, [dispatch, largeFileActions]);\r\n const userSchema: Yup.SchemaOf> = Yup.object({\r\n Id: Yup.string().ensure(),\r\n Name: Yup.string().ensure(),\r\n });\r\n\r\n const schema: Yup.SchemaOf = Yup.object({\r\n Users: Yup.array().of(userSchema),\r\n Files: Yup.mixed().notRequired(),\r\n Text: Yup.string()\r\n .notRequired()\r\n .test(val => (val ?? '').length > 0),\r\n IsInternal: Yup.boolean().nullable(),\r\n });\r\n\r\n const initial: NewComment = {\r\n Text: defaultComment?.Text,\r\n Users: [],\r\n IsInternal: defaultComment?.IsInternal,\r\n };\r\n\r\n const handleSubmit = ({ Files, ...values }: NewComment) => {\r\n const comment: NewComment = {\r\n ...values,\r\n };\r\n onSubmit(comment);\r\n if (selectedFiles === 0) onClose();\r\n };\r\n return (\r\n {\r\n handleSubmit(values);\r\n action.resetForm();\r\n }}\r\n initialValues={initial}\r\n validationSchema={schema}\r\n >\r\n {formik => {\r\n if (bindSubmitComment && formik.isValid) {\r\n bindSubmitComment(formik.submitForm);\r\n }\r\n const additionalButtons = [\r\n (className, key) => {\r\n return isAdmin ? (\r\n [\r\n \r\n }\r\n onClick={() => {\r\n formik.getFieldHelpers('IsInternal').setValue(false);\r\n close();\r\n }}\r\n >\r\n {t(translations.VisibleToUsers)}\r\n \r\n ,\r\n \r\n }\r\n onClick={() => {\r\n formik.getFieldHelpers('IsInternal').setValue(true);\r\n close();\r\n }}\r\n >\r\n {t(translations.StaffOnly)}\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\n {}} fields={[]} />\r\n \r\n \r\n \r\n \r\n formik.getFieldHelpers('Users').setValue(v, true)\r\n }\r\n additionalButtons={additionalButtons}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.Save)}\r\n \r\n \r\n {t(translations.Close)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }}\r\n \r\n );\r\n};\r\n\r\nconst CommentCell = ({\r\n comment,\r\n onSubmit,\r\n onClose,\r\n withMentions,\r\n isAdmin,\r\n onEditComment,\r\n onDeleteComment,\r\n disabled,\r\n bindSubmitComment,\r\n}: {\r\n comment: IComment;\r\n onSubmit: (comment: NewComment) => void;\r\n onClose: () => void;\r\n withMentions: boolean;\r\n isAdmin?: boolean;\r\n onEditComment?: (comment: IComment, newComment: NewComment) => void;\r\n onDeleteComment?: (comment: IComment) => void;\r\n disabled?: boolean;\r\n bindSubmitComment?: any;\r\n}) => {\r\n const dispatch = useDispatch();\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const [hover, setHover] = useState(false);\r\n const [edit, setEdit] = useState(false);\r\n const { t } = useTranslation();\r\n const { newDate, withoutOffset } = useSystemDate();\r\n const classes = useCommentStyles();\r\n const [files, setFiles] = useState([]);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const currentUserComment = authenticatedUser?.Id === comment.CreatedBy.Id;\r\n const uploadedFiles = useSelector(selectLargeFilesUploadFilesNumber);\r\n const commentId = useSelector(selectLargeFilesUploadTargetId);\r\n const startedToUpload = useSelector(selectLargeFilesStartedToUpload);\r\n const uploading = useSelector(selectLargeFilesUploading);\r\n const filesUpload = useSelector(selectLargeFilesUpload);\r\n React.useEffect(() => {\r\n setFiles(comment.Files);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n React.useEffect(() => {\r\n const getComments = async () => {\r\n if (\r\n filesUpload.commentType !== undefined &&\r\n filesUpload.referenceId !== undefined\r\n ) {\r\n var result = await CommentsApi.GetComments(\r\n filesUpload.commentType,\r\n filesUpload.referenceId,\r\n commentId,\r\n );\r\n if (result.length > 0) {\r\n setFiles(result[0].Files);\r\n }\r\n }\r\n dispatch(largeFileActions.resetNumberOfUploadedFiles());\r\n };\r\n if (\r\n commentId === comment.Id &&\r\n startedToUpload &&\r\n !uploading &&\r\n uploadedFiles > 0\r\n ) {\r\n getComments();\r\n onClose();\r\n }\r\n }, [\r\n commentId,\r\n startedToUpload,\r\n uploading,\r\n uploadedFiles,\r\n dispatch,\r\n largeFileActions,\r\n filesUpload.commentType,\r\n filesUpload.referenceId,\r\n comment.Id,\r\n onClose,\r\n ]);\r\n return (\r\n \r\n {onEditComment && edit ? (\r\n <>\r\n {\r\n onEditComment(comment, newComment);\r\n setEdit(false);\r\n }}\r\n onClose={() => setEdit(false)}\r\n bindSubmitComment={bindSubmitComment}\r\n />\r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n setHover(true)}\r\n onMouseLeave={() => setHover(false)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {comment.CreatedBy.Name}\r\n \r\n {isAdmin && comment.IsInternal && }\r\n \r\n {withMentions && hover && (\r\n <>\r\n {isAdmin && (\r\n <>\r\n {onEditComment && (\r\n }\r\n size=\"small\"\r\n onClick={() => setEdit(true)}\r\n >\r\n {t(translations.Edit)}\r\n \r\n )}\r\n {onDeleteComment && (\r\n }\r\n size=\"small\"\r\n onClick={() => onDeleteComment(comment)}\r\n >\r\n {t(translations.Delete)}\r\n \r\n )}\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {Math.abs(\r\n dateUtils.differenceInDays(\r\n dateUtils.dateOrStringToDate(comment.CreatedAt),\r\n newDate(),\r\n ),\r\n ) > 30\r\n ? dateUtils.format(\r\n comment.CreatedAt,\r\n dateUtils.DateIOFormats.keyboardDateTime24h, //'PP hh:mm',\r\n )\r\n : dateUtils.formatDistanceToNow(\r\n withoutOffset(comment.CreatedAt),\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {comment.Text.trim() !== '' ? parse(comment.Text) : ''}\r\n \r\n \r\n\r\n {files.map(f => {\r\n return (\r\n <>\r\n {\r\n setFiles(prev => prev.filter(file => file.Id !== id));\r\n }}\r\n key={f.Id}\r\n file={f}\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 CommentsContainer = ({\r\n Comments,\r\n onSubmit,\r\n withMentions,\r\n isAdmin,\r\n onEditComment,\r\n onDeleteComment,\r\n emailBody,\r\n emailSubject,\r\n pageName,\r\n referenceName,\r\n emailType,\r\n linkUrl,\r\n disabled,\r\n shouldSendEmail = true,\r\n bindSubmitComment,\r\n defaultComment,\r\n cannotComment,\r\n sectionTitle,\r\n noTitle,\r\n}: CommentsContainerProps) => {\r\n const [count, setCount] = useState(5);\r\n const sortedComments = useMemo(() => {\r\n Comments.sort(\r\n (a, b) =>\r\n -1 *\r\n (new Date(a.CreatedAt).getTime() - new Date(b.CreatedAt).getDate()),\r\n );\r\n return Comments.filter(c => !c.IsInternal || isAdmin);\r\n }, [Comments, isAdmin]);\r\n const [writeCommentOpen, setWriteCommentOpen] = useState(false);\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const sendMail = useSendMail();\r\n const handleSubmit = (comment: NewComment) => {\r\n if (shouldSendEmail && withMentions) {\r\n const email = createEmail({\r\n emailBody: emailBody ?? t(translations.DefaultEmailTemplateBody),\r\n emailSubject:\r\n emailSubject ?? t(translations.DefaultEmailTemplateSubject),\r\n pageName: pageName ?? t(translations.DefaultPageName),\r\n referenceName: referenceName ?? t(translations.DefaultReferenceName),\r\n emailType: emailType,\r\n linkUrl: linkUrl ?? '',\r\n userName: authenticatedUser?.Name ?? '',\r\n comment: comment,\r\n });\r\n if (email) {\r\n sendMail(email);\r\n }\r\n }\r\n onSubmit(comment);\r\n };\r\n const classes = useContainerStyles();\r\n return (\r\n \r\n {!noTitle && (\r\n \r\n \r\n {sectionTitle || t(translations.CommentsCount)}\r\n \r\n \r\n )}\r\n {sortedComments\r\n .slice(0, count < sortedComments.length ? count : undefined)\r\n .map((c, i) => (\r\n setWriteCommentOpen(false)}\r\n withMentions={!!withMentions}\r\n isAdmin={isAdmin}\r\n onEditComment={onEditComment}\r\n onDeleteComment={onDeleteComment}\r\n bindSubmitComment={bindSubmitComment}\r\n />\r\n ))}\r\n \r\n {count < sortedComments.length && (\r\n setCount(prev => prev + 5)}\r\n >\r\n {(('Load more ' + t(translations.CommentsCount)) as string) +\r\n ' (' +\r\n (sortedComments.length - count) +\r\n ')'}\r\n \r\n )}\r\n {!cannotComment && (\r\n \r\n {writeCommentOpen ? (\r\n setWriteCommentOpen(false)}\r\n withMentions={!!withMentions}\r\n isAdmin={isAdmin}\r\n bindSubmitComment={bindSubmitComment}\r\n />\r\n ) : (\r\n setWriteCommentOpen(true)}\r\n />\r\n )}\r\n \r\n )}\r\n {cannotComment && sortedComments.length === 0 && (\r\n {t(translations.Comments_EmptyMessage)}\r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nconst createEmail = ({\r\n comment,\r\n emailBody,\r\n emailSubject,\r\n pageName,\r\n referenceName,\r\n emailType,\r\n userName,\r\n linkUrl,\r\n}: {\r\n emailBody: string;\r\n emailSubject: string;\r\n emailType?: EmailTypeUnion;\r\n pageName: string;\r\n referenceName: string;\r\n comment: NewComment;\r\n userName: string;\r\n linkUrl: string;\r\n}) => {\r\n if (emailType === undefined || comment.Users.length === 0) return;\r\n const subject = emailSubject\r\n .replaceAll('{@UserName}', userName)\r\n .replaceAll('{@PageName}', pageName)\r\n .replaceAll('{@Reference}', referenceName);\r\n const body = emailBody\r\n .replaceAll('{@UserName}', userName)\r\n .replaceAll('{@PageName}', pageName)\r\n .replaceAll('{@Reference}', referenceName)\r\n .replaceAll('{@Link}', linkUrl)\r\n .replaceAll(\r\n '{@Body}',\r\n renderToStaticMarkup(<>{parse(comment.Text ?? '')}),\r\n );\r\n return {\r\n Subject: subject,\r\n Body: body,\r\n Files: comment.Files,\r\n SaveToLog: true,\r\n To: [],\r\n Cc: [],\r\n Bcc: comment.Users,\r\n Type: emailType,\r\n } as IEmail;\r\n};\r\n","export enum ReservationOrDowntimeEnum {\r\n All = 0,\r\n ReservationsOnly = 1,\r\n DownTimeOnly = 2,\r\n}\r\n","import { capitalize } from 'lodash';\r\nimport { BookitDatePicker, BookitDatePickerProps } from '.';\r\nimport * as React from 'react';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport FormControl from '../Forms/FormControls/FormControl';\r\nimport FormHelperText from '../Forms/FormControls/FormHelperText';\r\nimport clsx from 'clsx';\r\nimport { InputLabel } from '@material-ui/core';\r\nimport { ParsableDate } from '@material-ui/pickers/constants/prop-types';\r\nimport { useUtils } from '@material-ui/pickers';\r\nimport { validateError } from '../DatePicker/utils/pickerDateValidate';\r\nimport { v4 as uuid } from 'uuid';\r\n\r\nexport interface BookitDateTimePickerProps extends BookitDatePickerProps {\r\n labelInline?: boolean;\r\n}\r\n\r\nexport function BookitDateTimePicker({\r\n value,\r\n endTime,\r\n onChange,\r\n truncateTime,\r\n label,\r\n helperText,\r\n error,\r\n size,\r\n labelInline = false,\r\n dateLabel,\r\n timeLabel,\r\n maskIfEmpty,\r\n id = 'datetime_picker',\r\n ...props\r\n}: BookitDateTimePickerProps) {\r\n const utils = useUtils();\r\n const inputLabelId = label && id ? `${id}-label` : undefined;\r\n const helperTextId = id ? `${id}-helper-text` : undefined;\r\n const dateId = !!id ? `${id}-date` : uuid();\r\n const timeId = !!id ? `${id}-time` : uuid();\r\n const dateName = !!props.name ? `${props.name}-date` : uuid();\r\n const timeName = !!props.name ? `${props.name}-time` : uuid();\r\n const sizeClass = `inputSize${capitalize(size ?? 'large')}`;\r\n const dateLabelInline = labelInline\r\n ? dateLabel ?? `${label} Date`\r\n : undefined;\r\n const timeLabelInline = labelInline\r\n ? timeLabel ?? `${label} Time`\r\n : undefined;\r\n const dateTimeValue = React.useMemo(() => {\r\n return value;\r\n }, [value]);\r\n const [dateValue, setDateValue] = React.useState<\r\n Date | string | null | undefined\r\n >(() => {\r\n if (dateTimeValue === null || dateTimeValue === undefined) {\r\n return null;\r\n } else {\r\n let parsedValue = dateUtils.dateOrStringToDate(dateTimeValue);\r\n return parsedValue === null ? null : dateUtils.truncateTime(parsedValue);\r\n }\r\n });\r\n const [timeValue, setTimeValue] = React.useState<\r\n Date | string | null | undefined\r\n >(() => {\r\n if (dateTimeValue === null || dateTimeValue === undefined) {\r\n return null;\r\n } else {\r\n return dateUtils.dateOrStringToDate(dateTimeValue);\r\n }\r\n });\r\n React.useEffect(() => {\r\n setTimeValue(() => {\r\n if (dateTimeValue === null || dateTimeValue === undefined) {\r\n return null;\r\n } else {\r\n return dateUtils.dateOrStringToDate(dateTimeValue);\r\n }\r\n });\r\n setDateValue(() => {\r\n if (dateTimeValue === null || dateTimeValue === undefined) {\r\n return null;\r\n } else {\r\n let parsedValue = dateUtils.dateOrStringToDate(dateTimeValue);\r\n return parsedValue === null\r\n ? null\r\n : dateUtils.truncateTime(parsedValue);\r\n }\r\n });\r\n }, [dateTimeValue]);\r\n\r\n const handleChange = React.useCallback(\r\n (date: MaterialUiPickersDate, inpValue?: string | null): void => {\r\n let error = validateError(\r\n date,\r\n {\r\n maxDate: props.maxDate,\r\n minDate: props.minDate,\r\n disablePast: props.disablePast,\r\n disableFuture: props.disableFuture,\r\n maxDateMessage: props.maxDateMessage,\r\n minDateMessage: props.minDateMessage,\r\n invalidDateMessage: props.invalidDateMessage,\r\n strictCompareDates: props.strictCompareDates,\r\n },\r\n utils,\r\n );\r\n if (!!error) {\r\n setDateError(error);\r\n } else {\r\n if (!(date?.toString() === 'Invalid Date')) {\r\n if (props.required && (date === null || date === undefined)) {\r\n setDateError(`${label} is a required field`);\r\n if (!!props.onError) {\r\n props.onError(`${label} is a required field`, date);\r\n }\r\n } else {\r\n onChange(\r\n date === null || date === undefined\r\n ? null\r\n : new CustomDate(date, 'complete'),\r\n inpValue,\r\n );\r\n }\r\n }\r\n }\r\n // onChange(\r\n // date === null || date === undefined\r\n // ? null\r\n // : new CustomDate(date, 'complete'),\r\n // inpValue,\r\n // );\r\n },\r\n [label, onChange, props, utils],\r\n );\r\n const handleDateChange = React.useCallback(\r\n (displayValue: MaterialUiPickersDate): void => {\r\n const finalValue =\r\n displayValue === null\r\n ? null\r\n : displayValue === undefined\r\n ? null\r\n : displayValue;\r\n setDateValue(finalValue);\r\n if (finalValue !== null) {\r\n if (timeValue === null || timeValue === undefined) {\r\n setTimeValue(dateUtils.startOfDay(finalValue));\r\n if (props.saveOnSelect) {\r\n handleChange(dateUtils.startOfDay(finalValue));\r\n }\r\n } else {\r\n let time = dateUtils.dateOrStringToDate(timeValue);\r\n let val = dateUtils.set(dateUtils.truncateTime(finalValue), {\r\n hours: time === null ? 0 : time.getHours(),\r\n minutes: time === null ? 0 : time.getMinutes(),\r\n seconds: time === null ? 0 : time.getSeconds(),\r\n });\r\n handleChange(val);\r\n }\r\n } else {\r\n if (props.saveOnSelect) {\r\n setTimeValue(null);\r\n handleChange(null);\r\n } else {\r\n if (timeValue === null || timeValue === undefined) {\r\n handleChange(null);\r\n }\r\n }\r\n }\r\n },\r\n [handleChange, props.saveOnSelect, timeValue],\r\n );\r\n const handleTimeChange = React.useCallback(\r\n (displayValue: MaterialUiPickersDate): void => {\r\n const finalValue =\r\n displayValue === null\r\n ? null\r\n : displayValue === undefined\r\n ? null\r\n : displayValue;\r\n setTimeValue(finalValue);\r\n if (finalValue !== null) {\r\n if (dateValue !== null && dateValue !== undefined) {\r\n let val = dateUtils.set(dateUtils.truncateTime(dateValue), {\r\n hours: finalValue.getHours(),\r\n minutes: finalValue.getMinutes(),\r\n seconds: finalValue.getSeconds(),\r\n });\r\n handleChange(val);\r\n }\r\n } else {\r\n if (dateValue === null || dateValue === undefined) {\r\n handleChange(null);\r\n }\r\n }\r\n },\r\n [dateValue, handleChange],\r\n );\r\n const [dateError, setDateError] = React.useState(\r\n undefined,\r\n );\r\n const [timeError, setTimeError] = React.useState(\r\n undefined,\r\n );\r\n const validationError = React.useMemo(() => {\r\n return dateError || timeError || undefined;\r\n }, [dateError, timeError]);\r\n const handleOnError = React.useCallback(\r\n (error: React.ReactNode, value: MaterialUiPickersDate | ParsableDate) => {\r\n if (!!props.onError) {\r\n props.onError(validationError, value);\r\n }\r\n },\r\n [props, validationError],\r\n );\r\n const onDateError = React.useCallback(\r\n (error: React.ReactNode, value: MaterialUiPickersDate | ParsableDate) => {\r\n setDateError(error);\r\n if (!!props.onError) {\r\n handleOnError(error, value);\r\n }\r\n },\r\n [handleOnError, props.onError],\r\n );\r\n const onTimeError = React.useCallback(\r\n (error: React.ReactNode, value: MaterialUiPickersDate | ParsableDate) => {\r\n setTimeError(error);\r\n if (!!props.onError) {\r\n handleOnError(error, value);\r\n }\r\n },\r\n [handleOnError, props.onError],\r\n );\r\n\r\n return (\r\n \r\n
    \r\n {label && !labelInline && (\r\n \r\n {label}\r\n \r\n )}\r\n \r\n \r\n
    \r\n {(!!helperText || !!validationError) && (\r\n \r\n {helperText || validationError}\r\n \r\n )}\r\n
    \r\n );\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.assetInventory || initialState;\r\n\r\nexport const selectAssetInventory = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n\r\nexport const selectRoomSelected = createSelector(\r\n [selectAssetInventory],\r\n state => state.selectedRoomState,\r\n);\r\nexport const selectLocationSelected = createSelector(\r\n [selectAssetInventory],\r\n state => state.selectedLocationState,\r\n);\r\nexport const selectSubLocationSelected = createSelector(\r\n [selectAssetInventory],\r\n state => state.selectedSubLocationState,\r\n);\r\nexport const selectScanProcessing = createSelector(\r\n [selectAssetInventory],\r\n state => state.scanProcessing,\r\n);\r\nexport const selectNoRoomAccessProcessing = createSelector(\r\n [selectAssetInventory],\r\n state => state.noRoomAccessProcessing,\r\n);\r\nexport const selectInventoryLogFilters = createSelector(\r\n [selectAssetInventory],\r\n state => state.logFilters,\r\n);\r\n","export enum MultipleInstrumentReservations {\r\n NotAllowed = 0,\r\n AllowedDefaultMultiple = 1,\r\n AllowedDefaultSingle = 2,\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { IWorkingHoursDto } from 'api/odata/generated/entities/IWorkingHoursDto';\r\nimport { IEquipmentTimeSlot } from 'api/odata/generated/complexTypes/IEquipmentTimeSlot';\r\nimport { TimelineGroupByUnion } from 'api/odata/generated/enums/TimelineGroupBy';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { SchedulerDatePositionUnion } from 'app/components/BasicTable/Filters/DatesPeriodFilter';\r\nimport { IOptionWithIcon } from 'app/components/Dashboard/TableViewEdit/ViewTypePicker';\r\nimport { EmptySlotAdminClick } from 'enums/EmptySlotAdminClick';\r\nimport { RestrictDurationUnitTypes } from 'enums/RestrictDurationUnitTypes';\r\nimport { Entity } from 'types/common';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { ISchedulerParseEvent } from '../types/ISchedulerParseEvent';\r\n\r\n/* --- STATE --- */\r\n\r\nexport interface SchedulerState {\r\n viewState?: IViewState;\r\n previousViewState?: IViewState;\r\n selectedServices?: Array;\r\n derivedServices?: Array;\r\n filters?: ISerializableFilterSettings;\r\n events: Record>;\r\n offlineHours:Record>;\r\n trainingSessions:Record>;\r\n nonWorkingHours?:Array;\r\n tempReservations?: INewEvent;\r\n multipleInstrumentsMode?: boolean;\r\n notUseLocation?:boolean;\r\n emptySlotAdminClick: EmptySlotAdminClick;\r\n selectedReservationEvents: Array;\r\n loadingEvents?: boolean;\r\n TimelineGroupBy: TimelineGroupByUnion;\r\n exportToPDF: boolean;\r\n}\r\nexport type ViewTypes = 'calendar' | 'timeline';\r\nexport type ViewMultiToggleType = 'single' | 'multi';\r\nexport const ViewLengthsArray = ['day' , 'twodays' , 'customdays', 'week' , 'month', 'quarter', 'year', 'customPeriod' ] as const;\r\ntype ViewLengthsTuple = typeof ViewLengthsArray;\r\nexport type ViewLengths = ViewLengthsTuple[number];\r\nexport const viewLengthOptions: IOptionWithIcon[] = [\r\n { Id: 'day', Name: 'SchedulerDay', shortName: 'SchedulerShortDay'},\r\n { Id: 'twodays', Name: 'TimelineTwoDays', shortName: 'TimelineShortTwoDays'},\r\n { Id: 'customdays', Name: 'TimelineCustomDays', shortName: 'TimelineShortCustomDays'},\r\n { Id: 'week', Name: 'SchedulerWeek', shortName: 'SchedulerShortWeek'},\r\n { Id: 'month', Name: 'SchedulerMonth', shortName: 'SchedulerShortMonth'},\r\n { Id: 'quarter', Name: 'TimelinePeriodQuarter', shortName: 'TimelineShortQuarter'},\r\n { Id: 'year', Name: 'TimelinePeriodYear', shortName: 'TimelineShortYear'},\r\n { Id: 'customPeriod', Name: 'TimelineCustomDays', shortName: 'TimelineShortCustomDays', Icon: 'cog'},\r\n \r\n];\r\nexport const viewTypeOptions: IOptionWithIcon[] =\r\n [\r\n {\r\n Id: 'calendar',\r\n Name: 'Calendar',\r\n Icon: 'calendar',\r\n },\r\n {\r\n Id: 'timeline',\r\n Name: 'Timeline',\r\n Icon: 'list-timeline',\r\n },\r\n ];\r\nexport type ISerializableFilterSettings = Record\r\n}>;\r\nexport const getViewType = (type: ViewTypes) => {\r\n return viewTypeOptions.find(f=>f.Id === type);\r\n}\r\nexport const getViewLength = (length: ViewLengths) => {\r\n return viewLengthOptions.find(f=>f.Id === length);\r\n}\r\n// Parsing error: Type expected.\r\n// TODO: upgrade prettier to support Template Literal Types (https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html)\r\n// prettier v2.2.0 + - https://prettier.io/blog/2020/11/20/2.2.0.html#typescript\r\n// eslint-disable-next-line prettier/prettier\r\nexport type ViewModesTimeline = `${ViewLengths}_timeline`;\r\n// eslint-disable-next-line prettier/prettier\r\nexport type ViewModesUnit = `${ViewLengths}_unit`\r\nexport type ViewModes = ViewLengths | ViewModesTimeline | ViewModesUnit;\r\n \r\n\r\nexport interface IInstrument extends Entity {\r\n ServiceGroup: Entity;\r\n Color: string;\r\n}\r\n\r\nexport interface IChangeViewModePayload{\r\n current: IViewState;\r\n withNoChangeLocation?: boolean;\r\n forceEvents?: boolean;\r\n}\r\n\r\nexport interface IEventBase{\r\n start_date: Timestamp;\r\n end_date: Timestamp;\r\n service_id: number;\r\n service_name: string;\r\n color?: string|null;\r\n}\r\n\r\nexport interface IEvent extends IEventBase{\r\n id: number;\r\n reservation_id?: number;\r\n alert_id?:number;\r\n service_id: number;\r\n service_name: string;\r\n user_id: string;\r\n user_name: string;\r\n}\r\n\r\nexport interface INonWorkingHours extends IEventBase{\r\n id: `nonworking_${number}`\r\n}\r\nexport interface IOfflineHours extends IEventBase{\r\n id: `offline_${number}`\r\n offline: true;\r\n}\r\n\r\nexport type ISchedulerService = IServiceFilterDto\r\n\r\nexport interface INewEvent {\r\n id: string|number;\r\n start_date: Timestamp;\r\n end_date: Timestamp;\r\n service_id?: number | Array;\r\n alert_type?: number;\r\n sample_run_id?: number;\r\n defaultMulti?:boolean;\r\n}\r\nexport interface IEditEvent extends ISchedulerParseEvent{\r\n \r\n}\r\n\r\nexport type EventType = 'offline' | 'reservation' | 'trainingsession';\r\n\r\nexport interface IViewState {\r\n preset: SchedulerDatePositionUnion|null;\r\n viewType: ViewTypes;\r\n viewLength: ViewLengths;\r\n date: Timestamp;\r\n search:string;\r\n customDays?: number;\r\n customStart?: boolean;\r\n groupBy?: TimelineGroupByUnion\r\n \r\n}\r\nexport interface RestrictDuration {\r\n durationType: RestrictDurationUnitTypes;\r\n durationAmount: number;\r\n}\r\n\r\nexport type ChangeViewModeAction = PayloadAction;\r\nexport type GetServicesAction = PayloadAction|undefined>;\r\nexport type ChangeServicesAction = PayloadAction>;\r\nexport type SetFilterAction = PayloadAction;\r\n\r\nexport interface IOnlineEventDto\r\n{\r\n StartTime: string;\r\n EndTime: string;\r\n EquipmentId: number;\r\n ServiceGroupId: number;\r\n AssetRoomId: number|null;\r\n AssetCampusId: number|null;\r\n AssetBuildingId: number|null;\r\n AssetGroupId: number|null;\r\n AssetCatId: number|null;\r\n AvailabilityTypeId: number|null;\r\n BookedById: string;\r\n}\r\nexport interface DateSection {\r\n date: Date;\r\n section?: number;\r\n}\r\nexport interface LeftTop {\r\n left: number;\r\n top: number;\r\n}\r\nexport type ScrollPosition = DateSection | LeftTop | Date | number;","import { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { OnlineServiceMultiPicker } from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const ServiceMultiFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport const ServiceAdminFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport const ServiceReservationFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\n","import { makeStyles, Theme } from '@material-ui/core/styles';\r\nexport const autocompleteExtendStyles = makeStyles((theme: Theme) => ({\r\n extendRoot: {\r\n '&.Mui-focused $infoWidthPlus': {\r\n right: '48px',\r\n },\r\n '@media (pointer: fine)': {\r\n '&:hover $infoWidthPlus': {\r\n right: '48px',\r\n },\r\n },\r\n },\r\n infoIcon: {\r\n padding: '4px',\r\n top: 'calc(50% - 14px)',\r\n position: 'absolute',\r\n cursor: 'auto',\r\n zIndex: 4,\r\n '& > svg': {\r\n width: '12px',\r\n height: '12px',\r\n },\r\n },\r\n infoWidthPlus: {\r\n right: '26px',\r\n },\r\n infoWidthMinus: {\r\n right: '26px',\r\n },\r\n}));\r\n/* These styles was taken from original place https://github.com/mui-org/material-ui/blob/master/packages/material-ui-lab/src/Autocomplete/Autocomplete.js\r\n and partially redefined for for our components */\r\nexport const autocompleteStyles = makeStyles((theme: Theme) => ({\r\n /* Styles applied to the root element. */\r\n root: {\r\n '&$focused $clearIndicatorDirty': {\r\n visibility: 'visible',\r\n //display: 'inline-flex',\r\n },\r\n /* Avoid double tap issue on iOS */\r\n '@media (pointer: fine)': {\r\n '&:hover $clearIndicatorDirty': {\r\n visibility: 'visible',\r\n //display: 'inline-flex',\r\n },\r\n // '&:hover $infoWidthPlus': {\r\n // right: '54px',\r\n // },\r\n },\r\n // '&$focused $infoWidthPlus': {\r\n // right: '54px',\r\n // },\r\n '&>[class*=\"MuiFormControl-root\"]': {\r\n '&>[class*=\"multiSelect\"]': {\r\n maxWidth: '400px',\r\n // paddingTop: '6px',\r\n // paddingBottom: '6px',\r\n '&>[class*=\"shortView\"]': {\r\n maxWidth: 360,\r\n },\r\n '&.hasLabel': {\r\n '& > $tag:first-child': {\r\n marginTop: '6px',\r\n //marginBottom: '6px',\r\n },\r\n },\r\n [theme.breakpoints.up('sm')]: {\r\n maxWidth: '100%',\r\n '&>[class*=\"shortView\"]': {\r\n maxWidth: '100%',\r\n },\r\n },\r\n },\r\n '&>[class*=\"MuiInputLabel-filled\"]': {\r\n transform: 'translate(12px, 16px) scale(1)',\r\n // long placeholder/label might break in 2+ lines - show only single line here\r\n // setting up width to minimum assuming there might be clear as well as other adornments just in case\r\n // 12px is the left translate value, the other sum equals to max paddingRight of filled inputRoot\r\n width: 'calc(100% - 12px - (52px + 4px + 9px))',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n '&.adornedStart-label': {\r\n transform: 'translate(41px, 16px) scale(0.85)',\r\n },\r\n '&[class*=\"MuiInputLabel-shrink\"]': {\r\n letterSpacing: '0.2px',\r\n transform: 'translate(12px, 8px) scale(1)',\r\n // '&$marginDense': {\r\n // transform: 'translate(12px, 4px) scale(0.75)',\r\n // },\r\n '&.adornedStart-label': {\r\n transform: 'translate(41px, 27px) scale(0.85)',\r\n },\r\n },\r\n '&[class*=\"multiSelect\"][class*=\"MuiInputLabel-shrink\"]': {\r\n letterSpacing: '0.2px',\r\n transform: 'translate(12px, 4px) scale(1)',\r\n // '&$marginDense': {\r\n // transform: 'translate(12px, 4px) scale(0.75)',\r\n // },\r\n '&.adornedStart-label': {\r\n transform: 'translate(41px, 27px) scale(0.85)',\r\n },\r\n },\r\n },\r\n },\r\n '&>[class*=\"MuiInputLabel-shrink\"]': {\r\n transform: 'translate(0, -2.5px) scale(1.1)',\r\n },\r\n },\r\n /* Styles applied to the root element if `fullWidth={true}`. */\r\n fullWidth: {\r\n width: '100%',\r\n '&>[class*=\"MuiFormControl-root\"]': {\r\n '&>[class*=\"multiSelect\"]': {\r\n maxWidth: '100%',\r\n },\r\n '&>[class*=\"shortView\"]': {\r\n maxWidth: 360,\r\n },\r\n [theme.breakpoints.up('sm')]: {\r\n maxWidth: '100%',\r\n '&>[class*=\"shortView\"]': {\r\n maxWidth: '100%',\r\n },\r\n },\r\n },\r\n },\r\n /* Pseudo-class applied to the root element if focused. */\r\n focused: {},\r\n /* Styles applied to the tag elements, e.g. the chips. */\r\n tag: {\r\n margin: 0,\r\n // maxWidth: 400, //'calc(100% - 56px)',\r\n // //width: 'inherit',\r\n // [theme.breakpoints.down('sm')]: {\r\n // maxWidth: 300,\r\n // },\r\n },\r\n /* Styles applied to the tag elements, e.g. the chips if `size=\"small\"`. */\r\n tagSizeSmall: {\r\n margin: 0,\r\n maxWidth: 'calc(100% - 4px)',\r\n },\r\n /* Styles applied when the popup icon is rendered. */\r\n hasPopupIcon: {},\r\n /* Styles applied when the clear icon is rendered. */\r\n hasClearIcon: {\r\n '& > * > * > [class*=\"infoWidthPlus\"]': {\r\n right: '48px',\r\n },\r\n },\r\n /* Styles applied to the Input element. */\r\n // inputRoot: {\r\n // backgroundColor: theme.palette.common.white,\r\n // border: `1px solid ${theme.palette.common.grayBorders}`,\r\n // borderRadius: 6,\r\n // cursor: 'auto',\r\n // flexWrap: 'wrap',\r\n // height: 32,\r\n // '$hasPopupIcon &, $hasClearIcon &': {\r\n // paddingRight: 26 + 4,\r\n // },\r\n // '$hasPopupIcon$hasClearIcon &': {\r\n // paddingRight: 24 + 4,\r\n // },\r\n // gap: 4,\r\n // // 'label + &': {\r\n // // marginTop: '21px',\r\n // // },\r\n // // 'label + &[class*=\"MuiFilledInput-root\"]': {\r\n // // marginTop: '0',\r\n // // },\r\n // '& $input': {\r\n // width: 'auto',\r\n // minWidth: 30,\r\n // padding: '7px 12px',\r\n // },\r\n // '&:hover': {\r\n // backgroundColor: 'unset', //'rgba(255, 255, 255, 0.80)',\r\n // // Reset on touch devices, it doesn't add specificity\r\n // '@media (hover: none)': {\r\n // backgroundColor: 'unset', //'rgba(255, 255, 255, 0.90)',\r\n // },\r\n // },\r\n // '&[class*=\"Mui-focused\"]': {\r\n // backgroundColor: 'rgba(255, 255, 255, 0.90)',\r\n // border: `1px solid ${theme.palette.primary.main}`,\r\n // },\r\n // '&[class*=\"Mui-disabled\"]': {\r\n // backgroundColor: theme.palette.common.backgroundHover,\r\n // },\r\n // '&[class*=\"MuiInput-root\"]': {\r\n // paddingBottom: 1,\r\n // '& $input': {\r\n // padding: 4,\r\n // },\r\n // '& $input:first-child': {\r\n // padding: '6px 0',\r\n // },\r\n // },\r\n // '&[class*=\"marginDense\"]': {\r\n // borderRadius: 4,\r\n // '& $input': {\r\n // padding: '4px 4px 5px',\r\n // },\r\n // '& $input:first-child': {\r\n // padding: '1px 0px 1px 6px',\r\n // },\r\n // },\r\n // '&[class*=\"MuiOutlinedInput-root\"]': {\r\n // padding: 9,\r\n // '$hasPopupIcon &, $hasClearIcon &': {\r\n // paddingRight: 26 + 4 + 9,\r\n // },\r\n // '$hasPopupIcon$hasClearIcon &': {\r\n // paddingRight: 52 + 4 + 9,\r\n // },\r\n // '& $input': {\r\n // padding: '9.5px 4px',\r\n // },\r\n // '& $input:first-child': {\r\n // paddingLeft: 6,\r\n // },\r\n // '& $endAdornment': {\r\n // right: 9,\r\n // },\r\n // },\r\n // '&[class*=\"MuiOutlinedInput-root\"][class*=\"MuiOutlinedInput-marginDense\"]': {\r\n // padding: 6,\r\n // '& $input': {\r\n // padding: '4.5px 4px',\r\n // },\r\n // },\r\n // '&[class*=\"MuiFilledInput-root\"]': {\r\n // paddingTop: 16,\r\n // paddingLeft: 8,\r\n // '$hasPopupIcon &, $hasClearIcon &': {\r\n // paddingRight: 26 + 4 + 9,\r\n // },\r\n // '$hasPopupIcon$hasClearIcon &': {\r\n // paddingRight: 52 + 4 + 9,\r\n // },\r\n // '& $input': {\r\n // padding: '6px 4px 4px',\r\n // },\r\n // '& $endAdornment': {\r\n // right: 4,\r\n // },\r\n // '&[class*=\"MuiFilledInput-adornedStart\"]': {\r\n // //paddingLeft: '36px',\r\n // '&>.adornedStart': {\r\n // cursor: 'auto',\r\n // position: 'absolute',\r\n // left: 12,\r\n // top: 'calc(50% - 3px)',\r\n // },\r\n // },\r\n // },\r\n // '&[class*=\"MuiFilledInput-root\"][class*=\"MuiFilledInput-marginDense\"]': {\r\n // paddingTop: 14,\r\n // paddingBottom: 0,\r\n // '& $input': {\r\n // padding: '4.5px 4px',\r\n // },\r\n // },\r\n // '&[class*=\"MuiFilledInput-root\"][class*=\"MuiFilledInput-marginDense\"][class*=\"miniDense\"]': {\r\n // paddingTop: 2,\r\n // paddingBottom: 2,\r\n // //borderRadius: '6px',\r\n // border: `1px solid ${theme.palette.primary.main}`,\r\n // '& $input': {\r\n // padding: '3.5px 3px',\r\n // },\r\n // },\r\n // },\r\n inputRoot: {\r\n flexWrap: 'wrap',\r\n backgroundColor: theme.palette.common.white,\r\n border: `1px solid ${theme.palette.common.grayBorders}`,\r\n borderRadius: 6,\r\n cursor: 'auto',\r\n minHeight: 32,\r\n '$hasPopupIcon &, $hasClearIcon &': {\r\n paddingRight: 56, //26 + 4,\r\n },\r\n '$hasPopupIcon$hasClearIcon &': {\r\n paddingRight: 56, //24 + 4,\r\n },\r\n gap: 4,\r\n '& $input': {\r\n width: 'auto',\r\n minWidth: 30,\r\n //padding: '6px 12px',\r\n },\r\n '&[class*=\"MuiInput-root\"]': {\r\n paddingBottom: 0,\r\n '& $input': {\r\n padding: 4,\r\n },\r\n '& $input:first-child': {\r\n padding: '6px 12px',\r\n },\r\n },\r\n '&[class*=\"MuiInput-root\"][class*=\"MuiInput-marginDense\"]': {\r\n // '& $input': {\r\n // padding: '4px 4px 5px',\r\n // },\r\n // '& $input:first-child': {\r\n // padding: '4px 4px 5px', //'3px 0 6px',\r\n // },\r\n borderRadius: 6,\r\n '& $input': {\r\n padding: '4px 4px 5px',\r\n },\r\n '& $input:first-child': {\r\n padding: '1px 0px 1px 7px',\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.80)',\r\n // Reset on touch devices, it doesn't add specificity\r\n '@media (hover: none)': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.90)',\r\n },\r\n },\r\n '&[class*=\"Mui-focused\"]': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.90)',\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n '&[class*=\"Mui-disabled\"]': {\r\n backgroundColor: theme.palette.common.backgroundHover,\r\n },\r\n '&[class*=\"MuiOutlinedInput-root\"]': {\r\n padding: 9,\r\n '$hasPopupIcon &, $hasClearIcon &': {\r\n paddingRight: 26 + 4 + 9,\r\n },\r\n '$hasPopupIcon$hasClearIcon &': {\r\n paddingRight: 52 + 4 + 9,\r\n },\r\n '& $input': {\r\n padding: '9.5px 4px',\r\n },\r\n '& $input:first-child': {\r\n paddingLeft: 6,\r\n },\r\n '& $endAdornment': {\r\n right: 9,\r\n },\r\n },\r\n '&[class*=\"MuiOutlinedInput-root\"][class*=\"MuiOutlinedInput-marginDense\"]': {\r\n padding: 6,\r\n '& $input': {\r\n padding: '4.5px 4px',\r\n },\r\n },\r\n '&[class*=\"MuiFilledInput-root\"]': {\r\n paddingTop: 16,\r\n paddingLeft: 8,\r\n minHeight: 48,\r\n height: 'auto',\r\n '$hasPopupIcon &, $hasClearIcon &': {\r\n paddingRight: 26 + 4 + 9,\r\n },\r\n '$hasPopupIcon$hasClearIcon &': {\r\n paddingRight: 52 + 4 + 9,\r\n },\r\n '& $input': {\r\n padding: '6px 4px 4px',\r\n },\r\n '& $endAdornment': {\r\n right: 4,\r\n },\r\n '&[class*=\"MuiFilledInput-adornedStart\"]': {\r\n //paddingLeft: '36px',\r\n '&>.adornedStart': {\r\n cursor: 'auto',\r\n position: 'absolute',\r\n left: 12,\r\n top: 'calc(50% - 3px)',\r\n },\r\n },\r\n },\r\n '&[class*=\"MuiFilledInput-root\"][class*=\"MuiFilledInput-marginDense\"]': {\r\n paddingTop: 14,\r\n paddingBottom: 0,\r\n '& $input': {\r\n padding: '4.5px 4px',\r\n },\r\n },\r\n },\r\n /* Styles applied to the input element. */\r\n input: {\r\n flexGrow: 1,\r\n textOverflow: 'ellipsis',\r\n opacity: 0,\r\n padding: '6px 12px',\r\n },\r\n /* Styles applied to the input element if tag focused. */\r\n inputFocused: {\r\n opacity: 1,\r\n },\r\n /* Styles applied to the endAdornment element. */\r\n endAdornment: {\r\n // We use a position absolute to support wrapping tags.\r\n position: 'absolute',\r\n right: 8,\r\n top: 'calc(50% - 11px)', // Center vertically\r\n },\r\n /* Styles applied to the clear indicator. */\r\n clearIndicator: {\r\n marginRight: 2,\r\n padding: 4,\r\n '& > * > svg': {\r\n width: 12,\r\n height: 12,\r\n cursor: 'pointer',\r\n },\r\n visibility: 'hidden',\r\n //display: 'none',\r\n },\r\n /* Styles applied to the clear indicator if the input is dirty. */\r\n clearIndicatorDirty: { visibility: 'visible', display: 'inline-flex' },\r\n /* Styles applied to the popup indicator. */\r\n popupIndicator: {\r\n padding: 4,\r\n marginRight: 0,\r\n '& > * > svg': {\r\n width: 12,\r\n height: 12,\r\n },\r\n },\r\n /* Styles applied to the popup indicator if the popup is open. */\r\n popupIndicatorOpen: {\r\n transform: 'rotate(180deg)',\r\n },\r\n /* Styles applied to the popper element. */\r\n popper: {\r\n zIndex: theme.zIndex.modal,\r\n },\r\n /* Styles applied to the popper element if `disablePortal={true}`. */\r\n popperDisablePortal: {\r\n position: 'absolute',\r\n },\r\n /* Styles applied to the `Paper` component. */\r\n paper: {\r\n ...theme.typography.bodyM,\r\n overflow: 'hidden',\r\n margin: '4px 0',\r\n },\r\n /* Styles applied to the `listbox` component. */\r\n listbox: {\r\n listStyle: 'none',\r\n margin: 0,\r\n padding: '8px 0',\r\n maxHeight: '40vh',\r\n overflow: 'auto',\r\n },\r\n /* Styles applied to the loading wrapper. */\r\n loading: {\r\n color: theme.palette.text.disabled,\r\n padding: '14px 16px',\r\n },\r\n /* Styles applied to the no option wrapper. */\r\n noOptions: {\r\n color: theme.palette.text.secondary,\r\n padding: '14px 16px',\r\n },\r\n /* Styles applied to the option elements. */\r\n option: {\r\n minHeight: 48,\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n cursor: 'pointer',\r\n paddingTop: 6,\r\n boxSizing: 'border-box',\r\n outline: '0',\r\n WebkitTapHighlightColor: 'transparent',\r\n paddingBottom: 6,\r\n paddingLeft: 16,\r\n paddingRight: 16,\r\n [theme.breakpoints.up('sm')]: {\r\n minHeight: 'auto',\r\n },\r\n '&[aria-selected=\"true\"]': {\r\n backgroundColor: theme.palette.action.selected,\r\n },\r\n '&[data-focus=\"true\"]': {\r\n backgroundColor: theme.palette.action.hover,\r\n },\r\n '&:active': {\r\n backgroundColor: theme.palette.action.selected,\r\n },\r\n '&[aria-disabled=\"true\"]': {\r\n opacity: theme.palette.action.disabledOpacity,\r\n pointerEvents: 'none',\r\n },\r\n },\r\n /* Styles applied to the group's label elements. */\r\n groupLabel: {\r\n backgroundColor: theme.palette.background.paper,\r\n top: -8,\r\n },\r\n /* Styles applied to the group's ul elements. */\r\n groupUl: {\r\n padding: 0,\r\n '& $option': {\r\n paddingLeft: 24,\r\n },\r\n },\r\n}));\r\n","import { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { intersection } from 'lodash';\r\nimport { Identifiable } from 'types/common';\r\n\r\nexport const initFilterData = async (\r\n filters: IFilterSettings[],\r\n serviceGroups?: Identifiable[],\r\n): Promise[]> => {\r\n var result = Promise.all(\r\n filters.map(async item => {\r\n if (item.initData === undefined) {\r\n return item;\r\n }\r\n if (item.value === undefined) {\r\n return item;\r\n }\r\n if (item.value === null) {\r\n return item;\r\n }\r\n if (typeof item.value === 'string') {\r\n return item;\r\n }\r\n if (\r\n Array.isArray(item.value) &&\r\n item.value.some(f => f.Name !== undefined)\r\n ) {\r\n return item;\r\n }\r\n try {\r\n const data = await item.initData(item.value, serviceGroups);\r\n if (data !== undefined) {\r\n return {\r\n ...item,\r\n ...{\r\n value: filterByServiceGroups(\r\n data,\r\n serviceGroups?.map(f => f.Id) ?? [],\r\n ),\r\n initCompleted: item.refreshAfterInit ? true : undefined,\r\n },\r\n };\r\n } else {\r\n return item;\r\n }\r\n } catch {\r\n return item;\r\n }\r\n }),\r\n );\r\n return result;\r\n};\r\n\r\nfunction filterByServiceGroups(item, serviceGroups: number[]) {\r\n if (serviceGroups.length === 0) {\r\n return item;\r\n }\r\n if (item.ServiceGroupId !== undefined) {\r\n if (serviceGroups.includes(item.ServiceGroupId)) {\r\n return item;\r\n } else {\r\n return null;\r\n }\r\n } else if (item.ServiceGroups !== undefined) {\r\n const a = item.ServiceGroups.map(f => f.Id);\r\n if (item.ServiceGroups.length === 0) {\r\n return item;\r\n }\r\n const intersectsWithServiceGroups =\r\n intersection(a, serviceGroups).length > 0;\r\n if (intersectsWithServiceGroups) {\r\n return item;\r\n } else {\r\n return null;\r\n }\r\n } else if (Array.isArray(item)) {\r\n return item\r\n .map(c => filterByServiceGroups(c, serviceGroups))\r\n .filter(f => f != null);\r\n }\r\n return item;\r\n}\r\n","export enum InvoiceStatuses {\r\n New,\r\n SentToBilling,\r\n SentToReview,\r\n BillingRejected,\r\n Paid,\r\n ReviewApproved,\r\n ReviewRejected,\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.printPDF || initialState;\r\n\r\nexport const selectPrintPDF = createSelector([selectSlice], state => state);\r\nexport const selectPrintPDFPrinting = createSelector(\r\n [selectPrintPDF],\r\n state => state.printing,\r\n);\r\nexport const selectPrintPDFSections = createSelector([selectPrintPDF], state =>\r\n state.useSections ? state.Sections : [],\r\n);\r\nexport const selectPrintPDFisLoading = createSelector(\r\n [selectPrintPDF],\r\n state => state.isLoading,\r\n);\r\n","import { AsyncDataState } from 'types/common';\r\nimport { IRepetitiveDto } from 'types/IRepetitiveDto';\r\nimport { FieldHandlerProps } from '../../FormRender/FormRenderer';\r\n\r\n/* --- STATE --- */\r\nexport interface RepetitiveState extends AsyncDataState {\r\n repetitiveValueHandler?: FieldHandlerProps;\r\n}\r\nexport enum RepetitiveFor {\r\n WorkOrder = 1,\r\n Reservations = 2,\r\n Schedule = 3,\r\n}\r\n","import {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport {\r\n ALL_PERIOD_TYPES,\r\n PeriodTypes,\r\n PeriodTypesEntity,\r\n} from 'app/components/DatePeriods';\r\nimport i18next from 'i18next';\r\nimport * as React from 'react';\r\n\r\nconst DATE_PERIODS = (periods?: Array) => {\r\n const all = ALL_PERIOD_TYPES.map((value, index) => {\r\n return { Id: value, Name: value };\r\n });\r\n if (periods === undefined) {\r\n return all;\r\n } else {\r\n return all.filter(f => periods.includes(f.Name));\r\n }\r\n};\r\n\r\nexport interface DatePeriodsPickerProps\r\n extends Omit, 'getOptions'> {\r\n periods?: Array;\r\n twoDaysDisabled?: boolean;\r\n}\r\nexport function getPeriods(periods?: Array) {\r\n return DATE_PERIODS(periods);\r\n}\r\nconst getOptions = (\r\n searchTerm: string | null,\r\n periods?: Array,\r\n) => {\r\n let items = DATE_PERIODS(periods).map(item => {\r\n return {\r\n Id: item.Id,\r\n Name: i18next.t(item.Name),\r\n type: item.Name as PeriodTypes,\r\n };\r\n });\r\n\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\nexport function DatePeriodsPicker(props: DatePeriodsPickerProps) {\r\n const getOptionsCallback = React.useCallback(\r\n (searchTerm: string | null) => {\r\n return getOptions(searchTerm, props.periods);\r\n },\r\n [props.periods],\r\n );\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AssetThumbImage\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Avatar, createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { getAssetImageThumbSrc } from './getAssetImageSrc';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectImageExist } from 'app/slice/selectors';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n// asset thumbs have max size of 64px\r\nconst MAX_SIZE_DEFAULT = 64;\r\n\r\nexport interface AssetThumbImageProps {\r\n maxSize?: number;\r\n imageName: string | null;\r\n}\r\n\r\nexport const defaultImgSrc =\r\n process.env.PUBLIC_URL + `/images/DefaultImage.png`;\r\n\r\nexport function AssetThumbImage(props: AssetThumbImageProps) {\r\n const [hasImgeBroken, setHasImgeBroken] = React.useState(\r\n undefined,\r\n );\r\n const handleImgError = event => {\r\n setHasImgeBroken(true);\r\n };\r\n const imageExist = useSelector(state =>\r\n selectImageExist(state, props.imageName),\r\n );\r\n const classes = useStyles(props);\r\n const src = imageExist\r\n ? getAssetImageThumbSrc(props.imageName, 'thumb')\r\n : null;\r\n return (\r\n
    \r\n {src === null || hasImgeBroken ? (\r\n \r\n {'A'}\r\n \r\n ) : (\r\n \r\n )}\r\n
    \r\n );\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n maxWidth: props =>\r\n Math.min(props.maxSize ?? MAX_SIZE_DEFAULT, MAX_SIZE_DEFAULT),\r\n maxHeight: props =>\r\n Math.min(props.maxSize ?? MAX_SIZE_DEFAULT, MAX_SIZE_DEFAULT),\r\n },\r\n image: {\r\n maxWidth: props =>\r\n Math.min(props.maxSize ?? MAX_SIZE_DEFAULT, MAX_SIZE_DEFAULT),\r\n maxHeight: props =>\r\n Math.min(props.maxSize ?? MAX_SIZE_DEFAULT, MAX_SIZE_DEFAULT),\r\n borderRadius: '4px',\r\n },\r\n avatar: {\r\n color: theme.palette.getContrastText(bookitColors.grayscale.grayBorders),\r\n backgroundColor: theme.palette.common.grayDividers,\r\n width: '32px',\r\n height: '32px',\r\n borderRadius: '4px',\r\n },\r\n }),\r\n);\r\n","import * as React from 'react';\r\nimport { EntityType } from 'types/common';\r\nimport { FormAutocomplete, FormAutocompleteProps } from './FormAutocomplete';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport interface FormAutocompleteOptionsProps\r\n extends Omit, 'loadData'>,\r\n IFieldProps {\r\n getOptions: (searchTerm: string | null) => T[];\r\n disabled?: boolean;\r\n id?: string;\r\n}\r\n\r\nexport function FormAutocompleteOptions({\r\n getOptions,\r\n ...props\r\n}: FormAutocompleteOptionsProps) {\r\n const loadData = async (searchTerm: string | null): Promise =>\r\n new Promise(resolve => {\r\n const opts = getOptions(searchTerm);\r\n resolve(opts);\r\n });\r\n return ;\r\n}\r\n","import * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n FormAutocompleteMulti,\r\n FormAutocompleteMultiProps,\r\n} from './FormAutocompleteMulti';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport interface FormAutocompleteMultiOptionsProps\r\n extends Omit, 'loadData'>,\r\n IFieldProps {\r\n getOptions: (searchTerm: string | null) => Entity[];\r\n disabled?: boolean;\r\n id?: string;\r\n}\r\n\r\nexport function FormAutocompleteMultiOptions({\r\n getOptions,\r\n ...props\r\n}: FormAutocompleteMultiOptionsProps) {\r\n const loadData = async (searchTerm: string | null): Promise[]> =>\r\n new Promise[]>(resolve => {\r\n const opts = getOptions(searchTerm);\r\n resolve(opts);\r\n });\r\n return (\r\n \r\n );\r\n}\r\n","import { httpClient } from './HttpClient';\r\n\r\nexport const ExternalApi = {\r\n getExternalItems(\r\n formFieldId: number,\r\n payload: { filter: string | null; pageSize: number; pageIndex: number },\r\n ) {\r\n const url = `/api/externalitems/${formFieldId}/query`;\r\n const data = { param: payload };\r\n return httpClient.get(url, data);\r\n },\r\n};\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { Entity } from 'types/common';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { IFormFieldOptionDto } from 'api/odata/generated/entities/IFormFieldOptionDto';\r\nimport { FormAutocompleteOptions } from 'app/components/Forms/FormAutocompleteOptions';\r\nimport { FormAutocompleteMultiOptions } from 'app/components/Forms/FormAutocompleteMultiOptions';\r\nimport { ExternalApi } from 'api/ExternalApi';\r\nimport { FormAutocompleteMulti } from 'app/components/Forms/FormAutocompleteMulti';\r\nimport { FormAutocomplete } from 'app/components/Forms/FormAutocomplete';\r\n\r\nexport const initCustomDropDownData = (\r\n initialValue: string | undefined,\r\n formField: IFormFieldDto | undefined,\r\n) => {\r\n if (initialValue === undefined || formField === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n const options = createOptions(formField);\r\n resolve(\r\n getDropDownInitValue(initialValue, formField.IsMultiple, options),\r\n );\r\n });\r\n }\r\n};\r\nexport const getDropDownInitValue = (\r\n initialValue: string | undefined,\r\n isMultiple: boolean,\r\n options: IFormFieldOptionDto[],\r\n) => {\r\n if (initialValue === undefined) {\r\n return [] as Entity[];\r\n } else {\r\n if (isMultiple) {\r\n let values = initialValue.split(',');\r\n return options.filter(item => values.includes(item.Id));\r\n } else {\r\n return options.filter(item => item.Id === initialValue);\r\n }\r\n }\r\n};\r\nexport const createOptions = (\r\n field: Pick,\r\n): IFormFieldOptionDto[] => {\r\n if (field.Options && field.Options !== null) {\r\n switch (field.OptionsSourceType) {\r\n case 'Internal':\r\n return deserializeOptions(field.Options);\r\n\r\n case 'SimpleList':\r\n return deserializeOptions(field.Options.split(','));\r\n case 'External':\r\n return [] as IFormFieldOptionDto[];\r\n }\r\n } else {\r\n return [] as IFormFieldOptionDto[];\r\n }\r\n};\r\nconst deserializeOptions = (options: any): IFormFieldOptionDto[] => {\r\n let optsArray = [] as IFormFieldOptionDto[];\r\n if (Array.isArray(options)) {\r\n optsArray = options.map(opt => {\r\n return { Id: opt, Name: opt, Parent: null } as IFormFieldOptionDto;\r\n });\r\n } else {\r\n try {\r\n let items = JSON.parse(options);\r\n if (Array.isArray(items)) {\r\n let arr = items.map(o => {\r\n if (typeof o == 'string') {\r\n return { Id: o, Name: o, Parent: null } as IFormFieldOptionDto;\r\n } else if (o.hasOwnProperty('id') && o.hasOwnProperty('text')) {\r\n return {\r\n Id: o.id,\r\n Name: o.text,\r\n Parent: o.parent,\r\n } as IFormFieldOptionDto;\r\n } else {\r\n return undefined;\r\n }\r\n });\r\n optsArray =\r\n (arr.filter(o => o !== undefined) as IFormFieldOptionDto[]) ||\r\n ([] as IFormFieldOptionDto[]);\r\n }\r\n return optsArray;\r\n } catch {\r\n return optsArray;\r\n }\r\n }\r\n\r\n return optsArray;\r\n};\r\n\r\nexport function CustomFormDropDown({\r\n formField,\r\n readonly,\r\n parentValue,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n const getOptions = (searchTerm: string | null): Entity[] => {\r\n if (formField) {\r\n let options = createOptions(formField);\r\n if (formField.ParentId !== null && parentValue !== undefined) {\r\n return options.filter(\r\n item =>\r\n parentValue === undefined ||\r\n parentValue.length < 1 ||\r\n parentValue.filter(p => p.Id === item.Parent).length > 0,\r\n ) as Entity[];\r\n } else {\r\n return options as Entity[];\r\n }\r\n } else {\r\n return [] as Entity[];\r\n }\r\n };\r\n const externalLoadData = (searchTerm: string | null) => {\r\n const params: {\r\n filter: string | null;\r\n pageSize: number;\r\n pageIndex: number;\r\n } = {\r\n filter: searchTerm,\r\n pageSize: 50,\r\n pageIndex: 0,\r\n };\r\n\r\n return ExternalApi.getExternalItems(formField.Id, params).then(response => {\r\n if (!!response.data.data) {\r\n let options = response.data.data.map(option => {\r\n return { Id: option.name, Name: option.value };\r\n });\r\n return options as Entity[];\r\n } else if (!!response.data && response.data.length > 0) {\r\n let options = response.data.map(option => {\r\n return { Id: option.name, Name: option.value };\r\n });\r\n return options as Entity[];\r\n } else {\r\n return [] as Entity[];\r\n }\r\n });\r\n };\r\n return (\r\n \r\n {formField.OptionsSourceType === 'External' ? (\r\n formField.IsMultiple ? (\r\n \r\n ) : (\r\n \r\n )\r\n ) : formField.IsMultiple ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { Theme } from '@material-ui/core';\r\nimport { PropTypes } from '@material-ui/core';\r\nimport { PaletteColor } from '@material-ui/core/styles/createPalette';\r\n\r\nexport type TypeColor =\r\n | Exclude\r\n | 'danger'\r\n | 'accent'\r\n | 'filters'\r\n | 'success'\r\n | 'black'\r\n | 'info'\r\n | 'warning';\r\nexport type TypeColorOptions =\r\n | 'dark'\r\n | 'main'\r\n | 'light'\r\n | 'textHover'\r\n | 'bgHover'\r\n | 'contrastText';\r\nexport const getColor = (\r\n theme: Theme,\r\n color: TypeColor | undefined = 'primary',\r\n options: TypeColorOptions | undefined = 'main',\r\n): string | undefined => {\r\n switch (color) {\r\n case 'black':\r\n return getBlackColorOption(options, theme);\r\n case 'accent':\r\n case 'danger':\r\n case 'default':\r\n case 'filters':\r\n case 'info':\r\n case 'primary':\r\n case 'secondary':\r\n case 'success':\r\n case 'warning':\r\n return getColorOption(options, theme.palette[color]);\r\n default:\r\n return getColorOption(options, theme.palette.primary);\r\n }\r\n};\r\nfunction getBlackColorOption(options: string, theme: Theme) {\r\n switch (options) {\r\n case 'main':\r\n return theme.palette.common.graySubtitle;\r\n case 'dark':\r\n return theme.palette.common.blackRegular;\r\n case 'light':\r\n return theme.palette.common.grayComponentsLight;\r\n case 'textHover':\r\n return theme.palette.common.blackComponent;\r\n case 'bgHover':\r\n return theme.palette.common.backgroundHover;\r\n case 'contrastText':\r\n return theme.palette.common.white;\r\n default:\r\n return theme.palette.common.graySubtitle;\r\n }\r\n}\r\nfunction getColorOption(options: string | undefined, color: PaletteColor) {\r\n switch (options) {\r\n case 'main':\r\n return color.main;\r\n case 'dark':\r\n return color.dark;\r\n case 'light':\r\n return color.light;\r\n case 'textHover':\r\n return color.textHover;\r\n case 'bgHover':\r\n return color.bgHover;\r\n case 'contrastText':\r\n return color.contrastText;\r\n default:\r\n return color.main;\r\n }\r\n}\r\n","import { Timestamp } from '../../../../../types/Timestamp';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport const serializeSchedulerDateOrUndefined = (\r\n d: Date | null | undefined,\r\n): Timestamp | undefined => {\r\n if (d === null || d === undefined) {\r\n return undefined;\r\n }\r\n return serializeSchedulerDate(d);\r\n};\r\nexport const serializeSchedulerDate = (d: Date): Timestamp => {\r\n try {\r\n return dateUtils.formatISO(d);\r\n } catch (error) {\r\n throw error;\r\n }\r\n};\r\n","export enum FileTypes {\r\n Undefined = -1,\r\n ServiceFile = 0,\r\n ServiceRequestFile = 1,\r\n ServiceRequestComment = 2,\r\n ServiceRequestRowFile = 3,\r\n ServiceRequestRowComment = 4,\r\n ExperimentFile = 5,\r\n ExperimentComment = 6,\r\n AssetFile = 7,\r\n SrpFile = 8,\r\n SrpComment = 9,\r\n AlertFile = 10,\r\n BudgetExperimentFile = 11,\r\n Expense = 12,\r\n ReservationFile = 13,\r\n AlertComment = 14,\r\n AlertTypeFile = 15,\r\n ServiceGroupFile = 16,\r\n InvoiceTemplate = 17,\r\n}\r\n","import { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\n\r\nexport interface UpdateFilesModel {\r\n files: IFormFileValue[];\r\n typeId: number;\r\n referenceId: number;\r\n formType: number;\r\n operation: string;\r\n updateOption: number;\r\n reccurentAssetId: number | null;\r\n recurrentGroupId: number | null;\r\n alertTypeId: number | null;\r\n}\r\nexport const getFilesModel = (\r\n original: IFormFileValue[],\r\n current: IFormFileValue[],\r\n type: number,\r\n referenceId: number,\r\n formType: number,\r\n updateOption: number,\r\n reccurentAssetId: number | null,\r\n recurrentGroupId: number | null,\r\n alertTypeId: number | null,\r\n) => {\r\n const filesData: UpdateFilesModel[] = [];\r\n if (current.length > 0 || original.length > 0) {\r\n let added =\r\n current.length > 0\r\n ? current.filter(f => f.Value === null && f.PostedFile !== null)\r\n : [];\r\n let removed =\r\n original.length > 0 && current.length > 0\r\n ? original.filter(\r\n f => f.Value !== null && !current.some(s => s.Value === f.Value),\r\n )\r\n : [];\r\n if (added.length > 0) {\r\n filesData.push({\r\n files: added,\r\n typeId: type,\r\n referenceId: referenceId,\r\n formType: formType,\r\n operation: 'added',\r\n updateOption: updateOption,\r\n reccurentAssetId: reccurentAssetId,\r\n recurrentGroupId: recurrentGroupId,\r\n alertTypeId: alertTypeId,\r\n });\r\n }\r\n if (removed.length > 0) {\r\n filesData.push({\r\n files: removed,\r\n typeId: type,\r\n referenceId: referenceId,\r\n formType: formType,\r\n operation: 'removed',\r\n updateOption: updateOption,\r\n reccurentAssetId: reccurentAssetId,\r\n recurrentGroupId: recurrentGroupId,\r\n alertTypeId: alertTypeId,\r\n });\r\n }\r\n }\r\n return filesData;\r\n};\r\n","/**\r\n *\r\n * auto generated interface for Default.Roles\r\n *\r\n */\r\n\r\nexport enum Roles {\r\n Administrators = 1,\r\n GroupAdministrators = 2,\r\n InstituteCoord = 3,\r\n HeadOfLab = 4,\r\n CagesAdministrators = 5,\r\n LabTech = 6,\r\n FinAdmin = 7,\r\n RepAdmin = 8,\r\n InventoryAdmin = 9,\r\n UserGroupCoord = 10,\r\n InstrumentEventsAdmin = 11,\r\n GroupBudgetsAdmin = 12,\r\n CalendarOnly = 13,\r\n Readonly = 14,\r\n LoanDeskManager = 15,\r\n EquipmentAdministrator = 16,\r\n UserInquiryAdmin = 17,\r\n ModelAdmin = 18,\r\n RoomOnly = 19,\r\n InvoicesReader = 20,\r\n KioskAdmin = 21,\r\n CustomRole = 22,\r\n BudgetAdmin = 23,\r\n GroupAdminAffiliated = 24,\r\n AnimalAdmin = 25,\r\n LargeAnimalsOperatingRoomUser = 26,\r\n LargeAnimalsOperatingRoomTechnician = 27,\r\n LargeAnimalsOperatingRoomVeterinarian = 28,\r\n CoreBudgetsAdmin = 29,\r\n ConsumableKiosk = 30,\r\n CreateNewAssetsAdmin = 31,\r\n}\r\nexport type RolesUnion = keyof typeof Roles;\r\nexport const RolesUnionArray: Array = [\r\n 'Administrators',\r\n 'GroupAdministrators',\r\n 'InstituteCoord',\r\n 'HeadOfLab',\r\n 'CagesAdministrators',\r\n 'LabTech',\r\n 'FinAdmin',\r\n 'RepAdmin',\r\n 'InventoryAdmin',\r\n 'UserGroupCoord',\r\n 'InstrumentEventsAdmin',\r\n 'GroupBudgetsAdmin',\r\n 'CalendarOnly',\r\n 'Readonly',\r\n 'LoanDeskManager',\r\n 'EquipmentAdministrator',\r\n 'UserInquiryAdmin',\r\n 'ModelAdmin',\r\n 'RoomOnly',\r\n 'InvoicesReader',\r\n 'KioskAdmin',\r\n 'CustomRole',\r\n 'BudgetAdmin',\r\n 'GroupAdminAffiliated',\r\n 'AnimalAdmin',\r\n 'LargeAnimalsOperatingRoomUser',\r\n 'LargeAnimalsOperatingRoomTechnician',\r\n 'LargeAnimalsOperatingRoomVeterinarian',\r\n 'CoreBudgetsAdmin',\r\n 'ConsumableKiosk',\r\n 'CreateNewAssetsAdmin',\r\n];\r\n","export enum PurchaseOrderOptions {\r\n Hidden = 0,\r\n Optional = 1,\r\n Mandatory = 2,\r\n}\r\n","import { Dictionary, keyBy, omit, orderBy, transform } from 'lodash';\r\nimport {\r\n IServiceRequestTableRowModel,\r\n IServiceRequestTableRowValueModel,\r\n} from './types';\r\nimport { fromDtoValue } from './selectors';\r\nimport { IServiceRequestRowDto } from 'api/odata/generated/entities/IServiceRequestRowDto';\r\nimport { IServiceRequestRowValueDto } from 'api/odata/generated/entities/IServiceRequestRowValueDto';\r\nimport { serializeCustomFormRowValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { ServiceRequestTableColumnsCollection } from './utils/ServiceRequestTableColumn';\r\n\r\nexport function prepareServiceRequestRowModel(\r\n rows: Array,\r\n columns: ServiceRequestTableColumnsCollection,\r\n) {\r\n const result: IServiceRequestTableRowModel[] | undefined = orderBy(\r\n rows,\r\n f => f.Id,\r\n )?.map(row => {\r\n const values = keyBy(row.Values, value => value.ColumnId);\r\n const rowValues: Dictionary = transform(\r\n columns.columnsObj,\r\n (result, column, columnId) => {\r\n result[column.getFieldName()] = fromDtoValue(\r\n column.ColumnType,\r\n values[column.Id],\r\n );\r\n },\r\n {},\r\n );\r\n const model: IServiceRequestTableRowModel = {\r\n ...omit(row, 'Values', '@odata.context'),\r\n ...{\r\n Values: rowValues,\r\n },\r\n };\r\n return model;\r\n });\r\n return result;\r\n}\r\n\r\nexport function serviceRequestModelToDto(\r\n model: Partial,\r\n columns: ServiceRequestTableColumnsCollection,\r\n) {\r\n const result: Partial<\r\n Omit & {\r\n Values: Array>;\r\n }\r\n > = {\r\n ...omit(model, 'Values'),\r\n Values: columns\r\n .getArray()\r\n .filter(column => column.CopyPrevValues)\r\n .map(column => {\r\n const dto: Partial = {\r\n ColumnId: column.Id,\r\n };\r\n const modelValue = model.Values?.[column.Id];\r\n if (modelValue !== undefined) {\r\n Object.assign(dto, serializeCustomFormRowValue(modelValue));\r\n }\r\n return dto;\r\n }),\r\n };\r\n return result;\r\n}\r\n","import { Button } from 'app/components/BasicButtons/Button';\r\nimport {\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectExpandedSidePanel,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { selectPublicUrl } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { omit } from 'lodash';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { push } from 'connected-react-router';\r\nimport { DeatilsOperations } from './ditails';\r\nimport { SaveFormButton } from 'app/pages/UserTrainings/TrainingDetailsPage/Details/Actions/TrainingActions';\r\nimport { TFunction } from 'i18next';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { INotification } from '../Actions/Actions';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\n\r\nexport interface DetailsFormProps {\r\n initialValues?: LocationDetailsProps;\r\n ModelDetails: any;\r\n isEdit?: boolean;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n onSubmit: (item: any) => void;\r\n onCancel?: () => void;\r\n}\r\n\r\nexport interface LocationDetailsProps extends SidePanelContentProps {\r\n Id: number;\r\n Title: string;\r\n AddNew: string;\r\n ModelDetails: any;\r\n PageComponent: string;\r\n component: React.FC;\r\n operation: DeatilsOperations;\r\n submitcall: (\r\n t: TFunction,\r\n Id: number,\r\n operation: DeatilsOperations,\r\n details: any,\r\n handleSubmitCallResult: (values: INotification[]) => void,\r\n ) => void;\r\n}\r\n\r\nexport function LocationDetails(props: LocationDetailsProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const initialValues: LocationDetailsProps = props;\r\n const hasChanges = useSelector(selectHasNotSavedChanges, shallowEqual);\r\n const edit = initialValues.operation === DeatilsOperations.edit;\r\n const busy = false;\r\n const isMobile = DetectIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const requestCompleted = true;\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const handleSubmitForm = e => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const handleCancelClick = React.useCallback(() => {\r\n if (props.useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/' + initialValues.PageComponent));\r\n }\r\n }, [\r\n dispatch,\r\n initialValues.PageComponent,\r\n layoutActions,\r\n props.useSidePanel,\r\n ]);\r\n const handleClose = () => {\r\n if (hasChanges) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n } else {\r\n handleCancelClick();\r\n }\r\n };\r\n\r\n React.useEffect(() => {\r\n if (confirmApproved) {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n if (confirmRejected) {\r\n dispatch(layoutActions.resetConfirmState());\r\n }\r\n });\r\n\r\n const submitFormRef = React.useRef(null);\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n const handleSubmitCallResult = React.useCallback(\r\n (values: INotification[]) => {\r\n values.forEach(v =>\r\n dispatch(\r\n actions.addNotification({ variant: v.variant, message: v.message }),\r\n ),\r\n );\r\n dispatch(layoutActions.resetSidePanel());\r\n dispatch(layoutActions.setRefreshTable(true));\r\n },\r\n [actions, dispatch, layoutActions],\r\n );\r\n const handleSubmit = React.useCallback(\r\n values => {\r\n initialValues.submitcall(\r\n t,\r\n initialValues.Id,\r\n initialValues.operation,\r\n values,\r\n handleSubmitCallResult,\r\n );\r\n },\r\n [handleSubmitCallResult, initialValues, t],\r\n );\r\n const LocationContent = React.useMemo(() => {\r\n return (\r\n \r\n );\r\n }, [bindSubmitForm, handleSubmit, initialValues]);\r\n const leftActions = React.useMemo(() => {\r\n return [\r\n () => (\r\n \r\n }\r\n onClick={handleSubmitForm}\r\n disabled={busy}\r\n processing={!requestCompleted && busy}\r\n edit={edit}\r\n text={t(translations.Save)}\r\n />\r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [busy, edit, isMobile, requestCompleted, sidePanelExpanded, t]);\r\n\r\n const rightActions = React.useMemo(() => {\r\n return [\r\n () => (\r\n \r\n }\r\n onClick={handleCancelClick}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [handleCancelClick, isMobile, sidePanelExpanded, t]);\r\n return (\r\n <>\r\n \r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n}\r\n","/**\r\n * Bookit.Data.CatRate.CatRateTypes\r\n */\r\nexport enum CatRateTypes {\r\n Usage = 1,\r\n\r\n FixedUsage = 2,\r\n\r\n Reservation = 3,\r\n\r\n FixedReservation = 4,\r\n\r\n TutoringUsage = 5,\r\n\r\n FixedTutoringUsage = 6,\r\n\r\n TutoringReservation = 7,\r\n\r\n FixedTutoringReservation = 8,\r\n\r\n ReservationCancelation = 9,\r\n\r\n OfflineService = 10,\r\n\r\n ServiceRequestLine = 11,\r\n\r\n ServiceRequest = 12,\r\n\r\n Other = 13,\r\n\r\n UsageExceededReservation = 16,\r\n\r\n /// \r\n /// This Fee Type is used for display purposes in the invoice rows to differentiate offlin services from service requests\r\n /// \r\n\r\n ServiceRequestServices = 17,\r\n /// \r\n /// This Fee Type is used for setup Milistones Requests in the Price Sheet screen\r\n /// \r\n\r\n ServiceRequestMilestones = 18,\r\n\r\n TrainingSessions = 19,\r\n\r\n FixedTrainingSessions = 20,\r\n\r\n Subscription = 21,\r\n\r\n PartialReservationCancellation = 22,\r\n\r\n Refund = 23,\r\n}\r\n","import { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport * as Yup from 'yup';\r\nimport { BudgetEntitySechema, ServiceGroupEntitySchema } from '..';\r\n\r\n/**\r\n *\r\n * @param t localization TFunction\r\n * @returns base validation schema for paymet or charge\r\n */\r\nexport function InvoiceChildRowBaseSchema(t: TFunction) {\r\n return Yup.object({\r\n Id: Yup.number().notRequired(),\r\n InvoiceId: Yup.number().notRequired(),\r\n Budget: BudgetEntitySechema.nullable().required(\r\n t(translations.PleaseSelectABudgetNumber),\r\n ),\r\n ServiceGroup: ServiceGroupEntitySchema.required(\r\n t(translations.PleaseSelectServiceGroup),\r\n ).nullable(),\r\n Date: Yup.date().required(t(translations.PleaseSelectADate)),\r\n });\r\n}\r\n","export enum AllowCreateInvoicesBy {\r\n AlllowCreateInvoicesBy_AllowToChooseOnCreation,\r\n AlllowCreateInvoicesBy_BudgetsOnly,\r\n AlllowCreateInvoicesBy_UserGroupOnly,\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { PaymentApi } from 'api/PaymentApi';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\n// import { FormAdminServiceGroupPicker } from 'app/components/Forms/FormAdminServiceGroupPicker';\r\nimport { FormBudgetPicker } from 'app/components/Forms/FormBudgetPicker';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { FormPaymentMethodPicker } from 'app/components/Forms/FormPaymentMethodPicker';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { FormServiceGroupPicker } from 'app/components/Forms/FormServiceGroupPicker';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { serviceGroupFilterUrl } from 'app/components/pickers/ServiceGroupPicker';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useResponseModel } from 'app/hooks/useResponseModel';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { selectAppSettings } from 'app/slice/selectors';\r\nimport { Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { Entity } from 'types/common';\r\nimport * as Yup from 'yup';\r\nimport { IPayment } from './IPayment';\r\nimport { getPaymentSchema } from './PaymentSchema';\r\nimport { getPaymentSchemaWithBudgetNotRequired } from './PaymentSchema';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { FormBookitDatePicker } from 'app/components/Forms/FormBookitDatePicker';\r\n\r\nexport interface PaymentProps extends CoverProps {\r\n invoiceId?: number;\r\n budget: Entity | null;\r\n serviceGroup: Entity | null;\r\n amount?: number;\r\n paymentId?: number;\r\n serviceGroupPredicate?: (string | Condition>)[];\r\n userGroupId?: string;\r\n}\r\n\r\nexport const AddPayment = (props: PaymentProps) => {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const appSettings = useSelector(selectAppSettings);\r\n const { actions: notifyActions } = useAppSettingsSlice();\r\n const submitRef = useRef();\r\n const [busy, setBusy] = useState(false);\r\n const close = useCallback(() => {\r\n if (props.isCover) {\r\n props.closeCover?.();\r\n } else {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n }, [props, dispatch, actions]);\r\n const refreshTable = useCallback(() => {\r\n dispatch(actions.setRefreshTable(true));\r\n }, [dispatch, actions]);\r\n const sendResponse = useResponseModel();\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const closeApproved = useSelector(selectConfirmApproved);\r\n const closeRejected = useSelector(selectConfirmRejected);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const isEdit = !!props.paymentId && !!props.invoiceId;\r\n const { newDate } = useSystemDate();\r\n const submit = useCallback(\r\n (payment: IPayment) => {\r\n setBusy(true);\r\n if (!isEdit) {\r\n PaymentApi.AddPayment(payment)\r\n .then(v => {\r\n if (v.SuccessMessages.length > 0) {\r\n dispatch(\r\n notifyActions.addNotification({\r\n key: 'payment_success',\r\n message: v.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n v.SuccessMessages = [];\r\n }\r\n sendResponse(v);\r\n })\r\n .catch(() => {\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: t(translations.err_InvoicePaymentAdd),\r\n variant: 'error',\r\n }),\r\n );\r\n })\r\n .finally(() => {\r\n close();\r\n refreshTable();\r\n });\r\n } else {\r\n PaymentApi.UpdatePayment(props.paymentId!, payment)\r\n .then(() => {\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: t(translations.success_EditInvoicePayment),\r\n variant: 'success',\r\n }),\r\n );\r\n })\r\n .catch(() => {\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: t(translations.err_EditInvoicePayment),\r\n variant: 'error',\r\n }),\r\n );\r\n })\r\n .finally(() => {\r\n close();\r\n refreshTable();\r\n });\r\n }\r\n },\r\n [\r\n close,\r\n dispatch,\r\n isEdit,\r\n notifyActions,\r\n props.paymentId,\r\n refreshTable,\r\n sendResponse,\r\n t,\r\n ],\r\n );\r\n const [initialValues, setinitialValues] = useState({\r\n InvoiceId: props.invoiceId,\r\n Budget: props.budget,\r\n ServiceGroup: props.serviceGroup,\r\n Amount: props.amount,\r\n Method: null,\r\n Date: newDate(),\r\n });\r\n useEffect(() => {\r\n if (closeApproved) {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n if (closeRejected) {\r\n dispatch(actions.resetConfirmState());\r\n }\r\n }, [actions, closeApproved, closeRejected, dispatch]);\r\n useEffectOnMount(() => {\r\n //dispatch(layoutActions.setUpSnackBarIndex(true)); // increase snack bar z-index\r\n if (!isEdit) {\r\n if (props.serviceGroup === null) {\r\n setBusy(true);\r\n let isMounted = true;\r\n (async () => {\r\n const res = await getAutoCompleteLoadDataFn>({\r\n url: serviceGroupFilterUrl,\r\n predicates: authenticatedUser\r\n ? [\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n authenticatedUser.AdminServiceGroups,\r\n ),\r\n ]\r\n : undefined,\r\n })('', props.serviceGroupPredicate).then(v => v.value);\r\n if (isMounted) {\r\n if (res && res.length === 1) {\r\n setinitialValues(prev => ({ ...prev, ServiceGroup: res[0] }));\r\n }\r\n setBusy(false);\r\n }\r\n })();\r\n return () => {\r\n isMounted = false;\r\n };\r\n }\r\n return;\r\n }\r\n setBusy(true);\r\n let mounted = true;\r\n (async () => {\r\n try {\r\n let res = await httpClient.get(\r\n '/api/odata/v4/InvoicePayments(' + props.paymentId + ')',\r\n {\r\n id: props.invoiceId,\r\n $select: [\r\n 'InvoiceId',\r\n 'MethodId',\r\n 'PaymentMethodName',\r\n 'Amount',\r\n 'Date',\r\n 'Remarks',\r\n 'Reference',\r\n 'BudgetId',\r\n 'BudgetNumber',\r\n 'ServiceGroupId',\r\n 'ServiceGroupName',\r\n ].join(','),\r\n },\r\n );\r\n if (mounted) {\r\n setinitialValues({\r\n Id: props.paymentId,\r\n InvoiceId: res.InvoiceId,\r\n Budget: res.BudgetId\r\n ? { Id: res.BudgetId, Name: res.BudgetNumber }\r\n : null,\r\n ServiceGroup: res.ServiceGroupId\r\n ? { Id: res.ServiceGroupId, Name: res.ServiceGroupName }\r\n : null,\r\n Method: { Id: res.MethodId, Name: res.PaymentMethodName },\r\n Date: res.Date,\r\n Amount: res.Amount,\r\n Reference: res.Reference ?? undefined,\r\n Remarks: res.Remarks ?? undefined,\r\n });\r\n setBusy(false);\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n })();\r\n return () => {\r\n //dispatch(layoutActions.setUpSnackBarIndex(false)); // decrease snack bar z-index\r\n mounted = false;\r\n };\r\n });\r\n\r\n const PaymentSchema: Yup.SchemaOf = getPaymentSchema(t);\r\n const PaymentSchemaWithBudgetNotRequired: Yup.SchemaOf = getPaymentSchemaWithBudgetNotRequired(\r\n t,\r\n );\r\n if (isEdit) {\r\n PaymentSchema.fields.ServiceGroup = PaymentSchema.fields.ServiceGroup.notRequired();\r\n }\r\n\r\n const Paymentform = () => (\r\n \r\n {formik => {\r\n submitRef.current = formik.submitForm;\r\n return (\r\n \r\n {/* By using FormListener, the fields become not editable */}\r\n {/* {}} /> */}\r\n \r\n \r\n \r\n \r\n \r\n {IsModuleEnabled(appSettings, KnownModules.Budgets) && (\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 \r\n );\r\n }}\r\n \r\n );\r\n const leftActions = [\r\n () => (\r\n <>\r\n submitRef.current?.()}\r\n size=\"small\"\r\n disabled={busy}\r\n >\r\n {t(translations.Submit)}\r\n \r\n \r\n ),\r\n ];\r\n const rightActions = [\r\n () => (\r\n <>\r\n }\r\n onClick={close}\r\n disabled={busy}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ];\r\n return (\r\n }\r\n leftActions={leftActions}\r\n rightActions={rightActions}\r\n disableExpandToggle\r\n closeSidePanel={() => {\r\n if (hasChanges) {\r\n dispatch(actions.setConfirmOpen(true));\r\n } else {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n }}\r\n isCover={props.isCover}\r\n closeCover={props.closeCover}\r\n />\r\n );\r\n};\r\n","import {\r\n BudgetEntitySechema,\r\n FeeTypeEntitySchema,\r\n OfflineServiceTypeEntitySchema,\r\n OnlineServiceEntitySchema,\r\n PaymentMethodEntitySchema,\r\n ServiceGroupEntitySchema,\r\n UserEntitySchema,\r\n} from 'app/components/Forms/Schemas';\r\nimport { InvoiceChildRowBaseSchema } from 'app/components/Forms/Schemas/InvoiceChildRowBaseSchema';\r\nimport { CatRateTypes } from 'enums/CatRateTypes';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Entity } from 'types/common';\r\nimport * as Yup from 'yup';\r\n\r\nimport { IPayment } from './IPayment';\r\n\r\nexport function getPaymentSchema(t: TFunction): Yup.SchemaOf {\r\n return InvoiceChildRowBaseSchema(t).shape({\r\n Budget: BudgetEntitySechema.nullable().notRequired().optional(),\r\n Method: PaymentMethodEntitySchema.required(\r\n t(translations.err_PaymentMethodRequired),\r\n ).nullable(),\r\n Amount: Yup.number()\r\n .required(t(translations.PleaseEnterAnAmount))\r\n .positive(t(translations.InvalidValue)),\r\n\r\n Reference: Yup.string().notRequired(),\r\n Remarks: Yup.string().notRequired(),\r\n });\r\n}\r\n\r\nexport function getPaymentSchemaWithBudgetNotRequired(\r\n t: TFunction,\r\n): Yup.SchemaOf {\r\n return InvoiceChildRowBaseSchema(t).shape({\r\n Method: PaymentMethodEntitySchema.required(\r\n t(translations.err_PaymentMethodRequired),\r\n ).nullable(),\r\n Amount: Yup.number()\r\n .required(t(translations.PleaseEnterAnAmount))\r\n .positive(t(translations.InvalidValue)),\r\n\r\n Reference: Yup.string().notRequired(),\r\n Remarks: Yup.string().notRequired(),\r\n Budget: BudgetEntitySechema.nullable().notRequired().optional(),\r\n });\r\n}\r\n\r\nexport function foo(t: TFunction) {\r\n return InvoiceChildRowBaseSchema(t).shape({\r\n User: UserEntitySchema.nullable().when(\r\n 'FeeType',\r\n (catRateType, schema: Yup.SchemaOf>) =>\r\n [CatRateTypes.Refund, CatRateTypes.Other].includes(\r\n (catRateType as Entity)?.Id,\r\n )\r\n ? schema.notRequired()\r\n : schema.required(),\r\n ),\r\n Resource: OnlineServiceEntitySchema.notRequired().nullable(),\r\n OtherService: OfflineServiceTypeEntitySchema.notRequired().nullable(),\r\n SampleType: OfflineServiceTypeEntitySchema.notRequired().nullable(),\r\n FeeType: FeeTypeEntitySchema.required().nullable(),\r\n Quantity: Yup.number().defined(),\r\n Rate: Yup.number()\r\n .defined()\r\n .when('FeeType', (catRateType, schema: Yup.NumberSchema) => {\r\n return (catRateType as Entity)?.Id === CatRateTypes.Refund\r\n ? schema.negative()\r\n : schema.positive();\r\n }),\r\n Amount: Yup.number()\r\n .defined()\r\n .when('FeeType', (catRateType, schema: Yup.NumberSchema) => {\r\n return (catRateType as Entity)?.Id === CatRateTypes.Refund\r\n ? schema.negative()\r\n : schema.positive();\r\n }),\r\n\r\n ServiceGroup: ServiceGroupEntitySchema.required().nullable(),\r\n });\r\n}\r\n","import { ICharge } from 'app/pages/AddChargePage/ICharge';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { httpClient } from './HttpClient';\r\nconst url = '/api/odata/v4/Charge';\r\nexport const ChargeApi = {\r\n AddCharge: (charge: ICharge) => {\r\n const data = {\r\n Id: charge.Id,\r\n Username: charge.User?.Id,\r\n BudgetId: charge.Budget?.Id,\r\n EquipmentId: charge.Resource?.Id,\r\n OfflineServiceTypeId: charge.OtherService?.Id,\r\n Quantity: charge.Quantity,\r\n BaseRate: charge.Rate,\r\n CatRateTypeId: charge.FeeType?.Id,\r\n Date: charge.Date,\r\n SampleTypeId: charge.SampleType?.Id,\r\n ServiceGroupId: charge.ServiceGroup?.Id,\r\n UserGroupId: charge.UserGroup?.Id,\r\n Remarks: charge.Remarks,\r\n };\r\n return httpClient.post(url, data);\r\n },\r\n UpdateCharge: (charge: ICharge, rowId: number) => {\r\n const data = {\r\n Id: charge.Id,\r\n Username: charge.User?.Id,\r\n BudgetId: charge.Budget?.Id,\r\n EquipmentId: charge.Resource?.Id,\r\n OfflineServiceTypeId: charge.OtherService?.Id,\r\n Quantity: charge.Quantity,\r\n BaseRate: charge.Rate,\r\n CatRateTypeId: charge.FeeType?.Id,\r\n Date: charge.Date,\r\n SampleTypeId: charge.SampleType?.Id,\r\n ServiceGroupId: charge.ServiceGroup?.Id,\r\n ActualRate: charge.ActualRate,\r\n UserGroupId: charge.UserGroup?.Id,\r\n Remarks: charge.Remarks,\r\n };\r\n return httpClient.put(url + '(' + rowId + ')', data);\r\n },\r\n};\r\n","import { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n CatRateTypePicker,\r\n CatRateTypeProps,\r\n} from '../pickers/AutocompletePickers/CatRateTypePicker';\r\n\r\ninterface FormCatRateTypePickerIntrinsicProps\r\n extends Omit {\r\n serviceGroupId?: number;\r\n}\r\nexport const FormCatRateTypePicker = ({\r\n onChange,\r\n onBlur,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n FormCatRateTypePickerIntrinsicProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n helpers.setValue(value, true)}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n {...props}\r\n />\r\n \r\n );\r\n};\r\n","import {\r\n BaseURLPicker,\r\n BaseURLPickerProps,\r\n} from 'app/components/BasicPickers/BaseURLPicker';\r\nimport { Entity } from 'types/common';\r\nconst url = '/api/odata/v4/OfflineServiceFilter';\r\nconst filter = 'TypeId eq 2 and Active eq true';\r\nexport interface OfflineServicePickerProps\r\n extends Omit>, 'url'> {}\r\n// this picker is redundand, instead use OfflineServiceTyePicker\r\nexport const OfflineServicePicker = (props: OfflineServicePickerProps) => {\r\n const { queryfilter, ...other } = props;\r\n const predicate =\r\n queryfilter && queryfilter !== ''\r\n ? [queryfilter, filter].join(' and ')\r\n : filter;\r\n return (\r\n \r\n );\r\n};\r\n","import { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n OfflineServicePicker,\r\n OfflineServicePickerProps,\r\n} from '../pickers/AutocompletePickers/OfflineServicePicker';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\ninterface FormOfflineServicePickerIntrinsicProps\r\n extends Omit<\r\n OfflineServicePickerProps,\r\n 'onBlur' | 'value' | 'error' | 'onChange'\r\n > {\r\n serviceGroupId?: number;\r\n}\r\nexport const FormOfflineServicePicker = ({\r\n onChange,\r\n onBlur,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps &\r\n FormOfflineServicePickerIntrinsicProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (onChange) {\r\n onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n variant=\"filled\"\r\n queryfilter={\r\n props.serviceGroupId\r\n ? new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Equals,\r\n props.serviceGroupId,\r\n ).toString()\r\n : undefined\r\n }\r\n {...props}\r\n />\r\n \r\n );\r\n};\r\n","import { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n SampleTypePicker,\r\n SampleTypePickerProps,\r\n} from '../pickers/AutocompletePickers/SampleTypePicker.index';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\n\r\ninterface FormOfflineServicePickerIntrinsicProps\r\n extends Omit<\r\n SampleTypePickerProps,\r\n 'onBlur' | 'value' | 'error' | 'onChange'\r\n > {\r\n serviceGroupId?: number;\r\n}\r\nexport const FormSampleTypePicker = ({\r\n onChange,\r\n onBlur,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n FormOfflineServicePickerIntrinsicProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n helpers.setValue(value, true)}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n queryfilter={\r\n props.serviceGroupId\r\n ? new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Equals,\r\n props.serviceGroupId,\r\n ).toString()\r\n : undefined\r\n }\r\n {...props}\r\n />\r\n \r\n );\r\n};\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport { ServiceUserGroupPicker } from '../pickers/AutocompletePickers/ServiceUserGroupPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport const FormServiceUserGroupPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n predicates={props.predicates}\r\n disabled={props.disabled}\r\n />\r\n );\r\n};\r\n","import { ChargeApi } from 'api/ChargeApi';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { InputLabel } from 'app/components/Typography';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { FormBudgetPicker } from 'app/components/Forms/FormBudgetPicker';\r\nimport { FormCatRateTypePicker } from 'app/components/Forms/FormCatRateTypePicker';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { FormOfflineServicePicker } from 'app/components/Forms/FormOfflineServicePicker';\r\nimport { FormSampleTypePicker } from 'app/components/Forms/FormSampleTypePicker';\r\nimport { FormServiceGroupPicker } from 'app/components/Forms/FormServiceGroupPicker';\r\nimport { FormServiceUserGroupPicker } from 'app/components/Forms/FormServiceUserGroupPicker';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormUserPicker } from 'app/components/Forms/FormUserPicker';\r\nimport { loadBudgets } from 'app/components/pickers/AutocompletePickers/BudgetPicker';\r\nimport { serviceGroupFilterUrl } from 'app/components/pickers/ServiceGroupPicker';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n selectContinueToLink,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { AllowCreateInvoicesBy } from 'enums/allowCreateInvoicesBy';\r\nimport { Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { GetChargeSchema } from './ChargeSchema';\r\nimport { ICharge } from './ICharge';\r\nimport { FormOnlineServicesSinglePicker } from 'app/components/Forms/FormEquipmentsPicker';\r\nimport { ServiceGroupFilter } from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { FormBookitDatePicker } from 'app/components/Forms/FormBookitDatePicker';\r\n\r\nexport interface ChargeProps extends CoverProps {\r\n invoiceId?: number;\r\n budget: Entity | null;\r\n serviceGroup: Entity | null;\r\n rowId?: number;\r\n serviceGroupPredicate?: (string | Condition>)[];\r\n}\r\n\r\nconst onlyManual = true;\r\n\r\nexport const AddCharge = ({ serviceGroupPredicate, ...props }: ChargeProps) => {\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const { actions: notifyActions } = useAppSettingsSlice();\r\n const submitRef = useRef();\r\n const [busy, setBusy] = useState(false);\r\n const continueLink = useSelector(selectContinueToLink);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const closeApproved = useSelector(selectConfirmApproved);\r\n const closeRejected = useSelector(selectConfirmRejected);\r\n const continueToOther = useSelector(selectContinueState);\r\n\r\n const [insertedAt, setinsertedAt] = useState(null);\r\n const [insertedBy, setinsertedBy] = useState(null);\r\n const isEdit = !!props.rowId;\r\n const userGroupByBudeget = settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.ReservationUserGroupGroupByBudgetUserGroup],\r\n );\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const [initialValues, setInitialValue] = useState({\r\n Id: props.invoiceId,\r\n Quantity: 0,\r\n Rate: 0,\r\n Amount: 0,\r\n Date: new Date(),\r\n User: null,\r\n FeeType: null,\r\n OtherService: null,\r\n Resource: null,\r\n SampleType: null,\r\n Budget: props.budget,\r\n ServiceGroup: props.serviceGroup,\r\n Manual: true,\r\n UserGroup: null,\r\n Remarks: '',\r\n });\r\n\r\n useEffect(() => {\r\n if (closeApproved) {\r\n if (continueToOther.continueOnApprove) {\r\n dispatch(actions.resetSidePanel());\r\n setTimeout(() => {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: continueToOther.pageType,\r\n props: continueToOther.pageProps,\r\n expanded: continueToOther.expanded,\r\n }),\r\n );\r\n dispatch(actions.resetContinueState());\r\n }, 200);\r\n } else if (continueLink !== undefined) {\r\n dispatch(notifyActions.navigate(continueLink));\r\n dispatch(actions.resetSidePanel());\r\n } else {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n }\r\n if (closeRejected) {\r\n dispatch(actions.resetConfirmState());\r\n }\r\n }, [\r\n actions,\r\n closeApproved,\r\n closeRejected,\r\n continueLink,\r\n continueToOther,\r\n dispatch,\r\n notifyActions,\r\n ]);\r\n useEffect(() => {\r\n if (!isEdit) {\r\n if (props.budget !== null) {\r\n setBusy(true);\r\n let isMounted = true;\r\n (async () => {\r\n try {\r\n let queryBudg = loadBudgets([\r\n new Condition('Id', ODataOperators.Equals, props.budget!.Id),\r\n ]);\r\n const budgetRes = await queryBudg(null);\r\n const serviceGroupRes = await (() => {\r\n if (props.serviceGroup !== null) return Promise.resolve([]);\r\n return getAutoCompleteLoadDataFn>({\r\n url: serviceGroupFilterUrl,\r\n predicates: authenticatedUser\r\n ? [\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n authenticatedUser.AdminServiceGroups,\r\n ),\r\n ]\r\n : undefined,\r\n })('', serviceGroupPredicate).then(v => v.value);\r\n })();\r\n if (isMounted) {\r\n const values = { ...initialValues };\r\n if (budgetRes && budgetRes.value.length > 0) {\r\n const budegtval = budgetRes.value[0];\r\n values.UserGroup =\r\n budegtval.UserGroupId && budegtval.UserGroupName\r\n ? {\r\n Id: budegtval.UserGroupId,\r\n Name: budegtval.UserGroupName,\r\n }\r\n : values.UserGroup;\r\n }\r\n if (serviceGroupRes && serviceGroupRes.length === 1) {\r\n values.ServiceGroup = serviceGroupRes[0];\r\n }\r\n setInitialValue(values);\r\n setBusy(false);\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n })();\r\n return () => {\r\n isMounted = false;\r\n };\r\n }\r\n return;\r\n }\r\n setBusy(true);\r\n let mounted = true;\r\n (async () => {\r\n try {\r\n const res = await httpClient.get(\r\n '/api/odata/v4/InvoiceRows(' + props.rowId + ')',\r\n {\r\n id: props.invoiceId ?? 'null',\r\n $select: [\r\n 'InvoiceId',\r\n 'BudgetId',\r\n 'Budget',\r\n 'OnlineService',\r\n 'OnlineServiceId',\r\n 'OfflineServiceType',\r\n 'OfflineServiceTypeId',\r\n 'SampleService',\r\n 'SampleServiceId',\r\n 'CatRateTypeId',\r\n 'CatRateType',\r\n 'Quantity',\r\n 'BaseRate',\r\n 'Amount',\r\n 'SubsProfPercentage',\r\n 'User',\r\n 'UserId',\r\n 'Date',\r\n 'ServiceGroupId',\r\n 'ServiceGroupName',\r\n 'Manual',\r\n 'ActualRate',\r\n 'UserGroupId',\r\n 'UserGroup',\r\n 'InsertedAt',\r\n 'InsertedByDisplay',\r\n 'Remarks',\r\n ].join(','),\r\n },\r\n );\r\n if (mounted) {\r\n setInitialValue({\r\n Id: res.InvoiceId ?? 0,\r\n Budget: res.BudgetId\r\n ? { Id: res.BudgetId, Name: res.Budget }\r\n : null,\r\n User: res.UserId ? { Id: res.UserId, Name: res.User } : null,\r\n Resource: res.OnlineServiceId\r\n ? { Id: res.OnlineServiceId, Name: res.OnlineService }\r\n : null,\r\n OtherService: res.OfflineServiceTypeId\r\n ? { Id: res.OfflineServiceTypeId, Name: res.OfflineServiceType }\r\n : null,\r\n FeeType: { Id: res.CatRateTypeId, Name: res.CatRateType },\r\n SampleType: res.SampleServiceId\r\n ? { Id: res.SampleServiceId, Name: res.SampleService }\r\n : null,\r\n Quantity: res.Quantity,\r\n Rate: res.BaseRate,\r\n Amount: res.Amount,\r\n Date: res.Date,\r\n ServiceGroup: res.ServiceGroupId\r\n ? { Id: res.ServiceGroupId, Name: res.ServiceGroupName }\r\n : null,\r\n Manual: res.Manual,\r\n ActualRate: res.ActualRate,\r\n UserGroup: res.UserGroupId\r\n ? {\r\n Id: res.UserGroupId,\r\n Name: res.UserGroup,\r\n }\r\n : null,\r\n Remarks: res.Remarks,\r\n });\r\n setinsertedAt(res.InsertedAt);\r\n setinsertedBy(res.InsertedBy);\r\n setBusy(false);\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n })();\r\n return () => {\r\n mounted = false;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [props.rowId]);\r\n const close = useCallback(() => {\r\n if (props.isCover) {\r\n props.closeCover?.();\r\n } else {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n }, [props, dispatch, actions]);\r\n const refreshTable = useCallback(() => {\r\n dispatch(actions.setRefreshTable(true));\r\n }, [dispatch, actions]);\r\n const submit = useCallback(\r\n (charge: ICharge) => {\r\n setBusy(true);\r\n if (!isEdit) {\r\n ChargeApi.AddCharge(charge)\r\n .then(() => {\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: t(translations.msg_addedChargeSuccessfully),\r\n variant: 'success',\r\n }),\r\n );\r\n })\r\n .catch(e => console.error(e))\r\n .finally(() => {\r\n close();\r\n refreshTable();\r\n });\r\n } else {\r\n ChargeApi.UpdateCharge(charge, props.rowId!)\r\n .then(res => {\r\n if (res.ErrorMessages.length > 0) {\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: res.ErrorMessages[0],\r\n variant: 'error',\r\n }),\r\n );\r\n setBusy(false);\r\n return;\r\n }\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: t(translations.success_EditInvoiceLine),\r\n variant: 'success',\r\n }),\r\n );\r\n close();\r\n refreshTable();\r\n })\r\n .catch(e => console.error(e));\r\n }\r\n },\r\n [close, dispatch, isEdit, notifyActions, props.rowId, refreshTable, t],\r\n );\r\n const budgetOnly = useMemo(() => {\r\n return (\r\n settings.GetString(AllowedSettings.CreateInovicesBy) ===\r\n AllowCreateInvoicesBy[\r\n AllowCreateInvoicesBy.AlllowCreateInvoicesBy_BudgetsOnly\r\n ]\r\n );\r\n }, [settings]);\r\n const ChargeSchema = GetChargeSchema(t, isEdit);\r\n const ChargeForm = () => {\r\n return (\r\n \r\n {formik => {\r\n submitRef.current = formik.submitForm;\r\n const setAmount = (rate: number, quantity: number) => {\r\n formik\r\n .getFieldHelpers('Amount')\r\n .setValue(+(quantity * rate).toFixed(2), true);\r\n };\r\n const serviceGroupChanged = () => {\r\n formik.getFieldHelpers('Resource').setValue(null, true);\r\n formik.getFieldHelpers('OtherService').setValue(null, true);\r\n formik.getFieldHelpers('SampleType').setValue(null, true);\r\n };\r\n return (\r\n \r\n {/* By using FormListener, the fields become not editable */}\r\n {/* {}} /> */}\r\n \r\n \r\n \r\n \r\n \r\n {IsModuleEnabled(appSettings, KnownModules.Budgets) && (\r\n \r\n {\r\n if (!userGroupByBudeget && val && val.UserGroupId) {\r\n formik.getFieldHelpers('UserGroup').setValue(\r\n {\r\n Id: val.UserGroupId,\r\n Name: val.UserGroup,\r\n },\r\n true,\r\n );\r\n }\r\n }}\r\n name=\"Budget\"\r\n fullWidth\r\n placeholder={t(translations.Budget)}\r\n label={t(translations.Budget)}\r\n predicates={\r\n formik.values.UserGroup\r\n ? [\r\n new Condition(\r\n 'UserGroupId',\r\n ODataOperators.Equals,\r\n formik.values.UserGroup.Id,\r\n ),\r\n ]\r\n : undefined\r\n }\r\n disabled={\r\n (initialValues.Budget !== null && budgetOnly) ||\r\n (isEdit && !initialValues.Manual)\r\n }\r\n />\r\n \r\n )}\r\n \r\n v !== undefined) as Condition[]\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n {onlyManual && (\r\n <>\r\n \r\n \r\n setAmount(\r\n +formik\r\n .getFieldMeta('Rate')\r\n .value.toFixed(2),\r\n +v.target.value,\r\n )\r\n }\r\n />\r\n \r\n \r\n \r\n setAmount(\r\n +v.target.value,\r\n +formik\r\n .getFieldMeta('Quantity')\r\n .value.toFixed(2),\r\n )\r\n }\r\n />\r\n \r\n \r\n )}\r\n \r\n {\r\n formik.getFieldHelpers('Quantity').setValue(1, false);\r\n formik\r\n .getFieldHelpers('Rate')\r\n .setValue(+v.target.value, true);\r\n }}\r\n disabled={isEdit && !initialValues.Manual}\r\n />\r\n \r\n\r\n \r\n (\r\n 'UserGroups',\r\n ODataOperators.Any,\r\n formik.values.UserGroup.Id,\r\n 'Id',\r\n )\r\n : undefined,\r\n ].filter(v => v !== undefined) as Condition[]\r\n }\r\n name=\"User\"\r\n fullWidth\r\n placeholder={t(translations.User)}\r\n label={t(translations.User)}\r\n disabled={isEdit && !initialValues.Manual}\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 {insertedAt && (\r\n \r\n \r\n {t(translations.InsertedAt)}\r\n \r\n {dateUtils.shortDateTimeFormat(insertedAt)}\r\n \r\n )}\r\n {insertedBy && (\r\n \r\n \r\n {t(translations.InsertedBy)}\r\n \r\n {insertedBy}\r\n \r\n )}\r\n \r\n \r\n );\r\n }}\r\n \r\n );\r\n };\r\n const leftActions = [\r\n () => (\r\n <>\r\n submitRef.current?.()}\r\n size=\"small\"\r\n disabled={busy}\r\n >\r\n {t(translations.Submit)}\r\n \r\n \r\n ),\r\n ];\r\n const rightActions = [\r\n () => (\r\n <>\r\n }\r\n onClick={close}\r\n size=\"small\"\r\n disabled={busy}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ];\r\n return (\r\n }\r\n leftActions={leftActions}\r\n rightActions={rightActions}\r\n disableExpandToggle={true}\r\n closeSidePanel={() => {\r\n if (hasChanges) {\r\n dispatch(actions.setConfirmOpen(true));\r\n } else {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n }}\r\n isCover={props.isCover}\r\n closeCover={props.closeCover}\r\n />\r\n );\r\n};\r\n","import {\r\n FeeTypeEntitySchema,\r\n OfflineServiceTypeEntitySchema,\r\n OnlineServiceEntitySchema,\r\n UserEntitySchema,\r\n UserGroupEntitySchema,\r\n} from 'app/components/Forms/Schemas';\r\nimport { InvoiceChildRowBaseSchema } from 'app/components/Forms/Schemas/InvoiceChildRowBaseSchema';\r\nimport { CatRateTypes } from 'enums/CatRateTypes';\r\nimport { TFunction } from 'i18next';\r\nimport { Entity } from 'types/common';\r\nimport * as Yup from 'yup';\r\nimport { ICharge } from '../AddChargePage/ICharge';\r\n\r\nexport function GetChargeSchema(\r\n t: TFunction,\r\n isEdit: boolean,\r\n): Yup.SchemaOf {\r\n const result = InvoiceChildRowBaseSchema(t).concat(\r\n Yup.object({\r\n User: UserEntitySchema.nullable().notRequired(),\r\n Resource: OnlineServiceEntitySchema.notRequired().nullable(),\r\n OtherService: OfflineServiceTypeEntitySchema.notRequired().nullable(),\r\n UserGroup: UserGroupEntitySchema.nullable().when(\r\n 'User',\r\n (_, schema: Yup.SchemaOf>) =>\r\n isEdit ? schema.notRequired() : schema.required(),\r\n ),\r\n SampleType: OfflineServiceTypeEntitySchema.notRequired().nullable(),\r\n FeeType: FeeTypeEntitySchema.required().nullable(),\r\n Quantity: Yup.number().defined(),\r\n Rate: Yup.number()\r\n .defined()\r\n .when('FeeType', (catRateType, schema: Yup.NumberSchema) => {\r\n return (catRateType as Entity)?.Id === CatRateTypes.Refund\r\n ? schema.negative().max(0)\r\n : schema.positive().min(0);\r\n }),\r\n Amount: Yup.number()\r\n .defined()\r\n .when('FeeType', (catRateType, schema: Yup.NumberSchema) => {\r\n return (catRateType as Entity)?.Id === CatRateTypes.Refund\r\n ? schema.negative().max(0)\r\n : schema.positive().min(0);\r\n }),\r\n Manual: Yup.bool().notRequired(),\r\n ActualRate: Yup.number().notRequired(),\r\n Remarks: Yup.string().nullable().default('').notRequired(),\r\n }),\r\n );\r\n return result;\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for LabelTypePage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const LabelTypePage = lazyLoad(\r\n () => import('./index'),\r\n module => module.LabelTypeEdit,\r\n);\r\n","import { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { ArticleStatus } from 'enums/Article';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectArticleDetailsForm } from '../slice/selectors';\r\n\r\nexport type AllowedToChangeStatusFunc = (asset: IAssetDto) => boolean;\r\nexport const useAllowedToChangeStatus = (): AllowedToChangeStatusFunc => {\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const admin = authenticatedUser?.Roles.includes(Roles.GroupAdministrators);\r\n const readOnlyUser =\r\n authenticatedUser?.Roles.includes(Roles.Readonly) ||\r\n authenticatedUser?.Roles.includes(Roles.CalendarOnly);\r\n const allowedToChangeStatus = React.useCallback(\r\n asset => {\r\n if (admin && asset !== undefined && asset !== null && !readOnlyUser) {\r\n return asset.ServiceGroupId !== null &&\r\n asset.ServiceGroupId !== undefined &&\r\n (authenticatedUser?.HasAdminGroupOnlyPermissions(\r\n asset.ServiceGroupId,\r\n ) ||\r\n authenticatedUser?.HasLabTechGroupPermissions(asset.ServiceGroupId))\r\n ? true\r\n : false;\r\n } else {\r\n return false;\r\n }\r\n },\r\n [admin, authenticatedUser, readOnlyUser],\r\n );\r\n return allowedToChangeStatus;\r\n};\r\n\r\nexport const useCanEdit = (): [boolean, string] => {\r\n const { t } = useTranslation();\r\n const articleDetailsForm = useSelector(selectArticleDetailsForm);\r\n const allowedToChangeStatus = useAllowedToChangeStatus();\r\n if (allowedToChangeStatus(articleDetailsForm?.ServiceGroupAssets[0])) {\r\n return [true, ''];\r\n } else {\r\n // simple user rights\r\n if (articleDetailsForm?.CreatedByMe) {\r\n if (articleDetailsForm?.Status === ArticleStatus.Approved) {\r\n return [false, t(translations.PublicationRecordApproved_info)];\r\n } else {\r\n return [true, ''];\r\n }\r\n } else {\r\n return [false, ''];\r\n }\r\n }\r\n};\r\n\r\nexport const useCanAdd = (): boolean => {\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const readOnlyUser =\r\n authenticatedUser?.Roles.includes(Roles.Readonly) ||\r\n authenticatedUser?.Roles.includes(Roles.CalendarOnly);\r\n return !readOnlyUser;\r\n};\r\n","/**\r\n *\r\n * ArticleDetails\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useArticlesSlice } from 'app/pages/ArticlesPage/slice';\r\nimport { InputLabel } from 'app/components/Typography';\r\nimport {\r\n selectArticleDetails,\r\n selectArticleDetailsBusy,\r\n selectArticleDetailsForm,\r\n selectRefreshEditArticleAssociation,\r\n} from 'app/pages/ArticlesPage/slice/selectors';\r\nimport { AssetLink } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { ArticleStatus } from 'enums/Article';\r\nimport { useCanAdd, useCanEdit } from '../Hooks/useAllowedToChangeStatus';\r\nimport { WorkOrderLink } from 'app/pages/Actions/GlobalSelectedActions/OpenWorkOrder';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { selectDoRefreshTable } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRightSection,\r\n FormRow,\r\n StyledFormFieldsContainer,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { GhostInput } from 'app/components/BasicInputs/GhostInput';\r\nimport { DateTimeLabel } from 'app/components/DateTimeLabel';\r\nimport { ArticleDoiLink } from '../ArticleDoiLink';\r\n\r\nexport interface ArticleDetailsProps extends SidePanelContentProps, CoverProps {\r\n value?: IArticleDto;\r\n Id?: number;\r\n externalId?: string;\r\n externalIdSource?: string;\r\n onClose?: () => void;\r\n}\r\n\r\nexport function ArticleDetails({\r\n useSidePanel = true,\r\n closeCover,\r\n isCover,\r\n ...props\r\n}: ArticleDetailsProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useArticlesSlice();\r\n const selectedArticle = useSelector(selectArticleDetails);\r\n const articleDetails = useSelector(selectArticleDetailsForm);\r\n const refreshDetails = useSelector(selectRefreshEditArticleAssociation);\r\n const busy = useSelector(selectArticleDetailsBusy);\r\n const refresh = useSelector(selectDoRefreshTable);\r\n\r\n const isSaved = React.useMemo(() => {\r\n return articleDetails?.Id !== undefined && articleDetails?.Id > 0;\r\n }, [articleDetails?.Id]);\r\n const [canEdit, msg] = useCanEdit();\r\n const canAdd = useCanAdd();\r\n\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n\r\n if (active && !busy) {\r\n setFirstLoad(false);\r\n dispatch(\r\n actions.showDetails({\r\n Id: props.Id,\r\n externalId: props.externalId,\r\n externalIdSource: props.externalIdSource,\r\n article: props.value,\r\n }),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n busy,\r\n dispatch,\r\n firstLoad,\r\n props.Id,\r\n props.externalId,\r\n props.externalIdSource,\r\n props.value,\r\n refresh,\r\n ]);\r\n React.useEffect(() => {\r\n let active = refreshDetails === true;\r\n\r\n if (active && !busy) {\r\n dispatch(\r\n actions.showDetails({\r\n Id: selectedArticle?.Id,\r\n externalId: selectedArticle?.ExternalId ?? undefined,\r\n externalIdSource: selectedArticle?.ExternalIdSource ?? undefined,\r\n article: selectedArticle,\r\n }),\r\n );\r\n dispatch(actions.refreshEditArticleAssociation(undefined));\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [actions, busy, dispatch, refreshDetails, selectedArticle]);\r\n\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState(() => false, undefined, isCover, useSidePanel);\r\n const openExternalEntry = React.useCallback(\r\n (article: IArticleDto | undefined) => {\r\n openPanel({\r\n renderPageType: RenderPageType.ArticleEdit,\r\n renderPageProps: {\r\n useSidePanel: true,\r\n value: article,\r\n },\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [openPanel, useSidePanel],\r\n );\r\n const editArticle = React.useCallback(() => {\r\n openPanel({\r\n renderPageType: RenderPageType.ArticleForm,\r\n renderPageProps: {\r\n useSidePanel: true,\r\n },\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n }, [openPanel, useSidePanel]);\r\n // const setCover = React.useCallback(\r\n // showCover => {\r\n // if (\r\n // selectedArticle !== undefined &&\r\n // selectedArticle.ExternalIdSource === 'Manual Entry'\r\n // ) {\r\n // const sidePanelProps: EditArticleDetailsFormProps = {\r\n // useSidePanel: true,\r\n // value: selectedArticle,\r\n // };\r\n // dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.ArticleEdit,\r\n // props: sidePanelProps,\r\n // }),\r\n // );\r\n // } else {\r\n // dispatch(actions.showEditArticleAssociation(showCover));\r\n // }\r\n // },\r\n // [actions, dispatch, selectedArticle],\r\n // );\r\n // const showEditArticle = useSelector(selectShowEditArticleAssociation);\r\n\r\n //CSS\r\n /*const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n articleLabelColorPaddingTop: {\r\n color: 'grey',\r\n paddingTop: '10px',\r\n },\r\n articleValueLabelBold: {\r\n fontWeight: 'bold',\r\n },\r\n }),\r\n );*/\r\n //const classes = useStyles();\r\n const handleCancelClick = React.useCallback(() => {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: false,\r\n onClose: () => {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n },\r\n } as SidePanelCloseState);\r\n }, [closePanel, dispatch, isCover, useSidePanel]);\r\n const isEmpty = React.useCallback(value => {\r\n if (value === undefined || value === null) {\r\n return true;\r\n } else {\r\n if (typeof value === 'string') {\r\n const res = value.trim();\r\n return res !== '' ? false : true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }, []);\r\n const getValue = React.useCallback(\r\n value => {\r\n if (value === undefined || value === null) {\r\n return t(translations.NA);\r\n } else {\r\n if (typeof value === 'string') {\r\n const res = value.trim();\r\n return res !== '' ? res : t(translations.NA);\r\n } else {\r\n return value;\r\n }\r\n }\r\n },\r\n [t],\r\n );\r\n return (\r\n 0 && canEdit) ||\r\n (selectedArticle !== undefined &&\r\n selectedArticle.Id === 0 &&\r\n !busy &&\r\n canAdd)\r\n ? [\r\n () => (\r\n <>\r\n \r\n selectedArticle !== undefined &&\r\n selectedArticle.ExternalIdSource === 'Manual Entry'\r\n ? openExternalEntry(selectedArticle)\r\n : editArticle()\r\n }\r\n disabled={!canEdit}\r\n />\r\n \r\n ),\r\n ]\r\n : undefined\r\n }\r\n // cover={\r\n // cover\r\n // // && setCover(false)} />\r\n // }\r\n cover={cover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n isCover={isCover}\r\n coverClosed={coverClosed}\r\n useSwitchActions={true}\r\n >\r\n \r\n \r\n \r\n {/*\r\n \r\n {msg !== '' && (\r\n \r\n {msg}\r\n \r\n )}\r\n \r\n {t(translations.Title)}\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.Abstract)}\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.Authors)}\r\n \r\n \r\n \r\n \r\n {!isNullOrUndefined(articleDetails.ExternalIdSource) && (\r\n <>\r\n \r\n {t(translations.Source)}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {t(translations.EnteredBy)}\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.InsertedAt)}\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.Doi)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.ArticleDataset)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.ISSN)}\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.ORCID)}\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.Year)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.ArticleStatus)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.RelatedUser)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.CalibrationRecord)}\r\n \r\n \r\n \r\n {articleDetails.CalibrationRecord !== undefined &&\r\n articleDetails.CalibrationRecord !== null && (\r\n \r\n {articleDetails.CalibrationRecord}\r\n \r\n )}\r\n \r\n \r\n {t(translations.Journal)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.ArticlePageNumber)}\r\n \r\n \r\n \r\n \r\n \r\n {isSaved && (\r\n <>\r\n \r\n \r\n {t(translations.ParticipatedLabs)}\r\n \r\n \r\n \r\n {articleDetails.ServiceGroupAssets.length === 0 ? (\r\n t(translations.NA)\r\n ) : (\r\n
      \r\n {articleDetails.ServiceGroupAssets.map(asset => (\r\n
    • \r\n \r\n {asset.Name}\r\n \r\n
    • \r\n ))}\r\n
    \r\n )}\r\n
    \r\n \r\n \r\n {t(translations.ParticipatedInstruments)}\r\n \r\n \r\n \r\n {articleDetails.InstrumentAssets.length === 0 ? (\r\n t(translations.NA)\r\n ) : (\r\n
      \r\n {articleDetails.InstrumentAssets.map(asset => (\r\n
    • \r\n \r\n {asset.Name}\r\n \r\n
    • \r\n ))}\r\n
    \r\n )}\r\n
    \r\n \r\n )}\r\n \r\n
    */}\r\n {msg !== '' && (\r\n \r\n {msg}\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {!isNullOrUndefined(articleDetails.ExternalIdSource) && (\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 t(translations.NA)\r\n )\r\n }\r\n />\r\n \r\n \r\n \r\n ) : (\r\n t(translations.NA)\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 \r\n \r\n \r\n {articleDetails.CalibrationRecord}\r\n \r\n ) : (\r\n t(translations.NA)\r\n )\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isSaved && (\r\n <>\r\n \r\n \r\n {articleDetails.ServiceGroupAssets.map(asset => (\r\n
  • \r\n \r\n {asset.Name}\r\n \r\n
  • \r\n ))}\r\n \r\n )\r\n }\r\n />\r\n
    \r\n \r\n \r\n {articleDetails.InstrumentAssets.map(asset => (\r\n
  • \r\n \r\n {asset.Name}\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 );\r\n}\r\nfunction EditAssociationButton({\r\n item,\r\n onClick,\r\n disabled,\r\n}: {\r\n item?: IArticleDto;\r\n onClick: () => void;\r\n disabled: boolean;\r\n}) {\r\n const { t } = useTranslation();\r\n //const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n if (item === undefined) {\r\n return <>;\r\n }\r\n /*const show =\r\n authenticatedUser?.Roles?.includes(Roles.GroupAdministrators) === true;\r\n if (!show) {\r\n return <>;\r\n }*/\r\n if (item.Id > 0) {\r\n if (item.ExternalIdSource === 'Manual Entry') {\r\n return (\r\n }\r\n onClick={onClick}\r\n disabled={disabled}\r\n >\r\n {t(translations.EditArticle)}\r\n \r\n );\r\n } else {\r\n return (\r\n }\r\n onClick={onClick}\r\n disabled={disabled}\r\n >\r\n {t(translations.EditAssociation)}\r\n \r\n );\r\n }\r\n } else {\r\n return (\r\n }\r\n onClick={onClick}\r\n >\r\n {t(translations.AssociateThisPublication)}\r\n \r\n );\r\n }\r\n}\r\n","/**\r\n *\r\n * AssetsPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { avTypes } from '../pickers/MultiSelectPickers/AssetsPicker/index';\r\nimport { AssetPicker } from '../pickers/AutocompletePickers/AssetPicker';\r\n\r\nexport const FormAssetPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps & {\r\n restrictByAvType?: avTypes;\r\n admin?: boolean;\r\n showOnlyActiveAssets?: boolean;\r\n }) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n restrictByAvType={props.restrictByAvType}\r\n admin={props.admin}\r\n showOnlyActiveAssets={props.showOnlyActiveAssets}\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n required={props.required}\r\n />\r\n );\r\n};\r\n","import { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Entity } from 'types/common';\r\nimport * as Yup from 'yup';\r\n\r\nexport interface IArticleNewEditForm {\r\n Title: string;\r\n Authors: string;\r\n Abstract: string;\r\n Doi?: string | null;\r\n Dataset?: string | null;\r\n ISSN?: string | null;\r\n ORCIDs?: string | null;\r\n Year: number;\r\n RelatedUser: Entity | null;\r\n ServiceGroupAsset: IAssetDto | null;\r\n Journal?: string | null;\r\n PageNumber?: number | null;\r\n //ServiceGroupAssets: Array;\r\n InstrumentAssets: Array;\r\n Status: Entity;\r\n CalibrationRecord: Entity | null;\r\n}\r\n\r\nexport const assetSchema = Yup.mixed();\r\nexport const assetsSchema = Yup.array().of(\r\n Yup.mixed() as Yup.SchemaOf,\r\n);\r\n\r\nexport const GetInstrumentFilter = (serviceGroups: IAssetDto[]) => {\r\n const sv = serviceGroups.filter(f => f !== null && f !== undefined);\r\n if (sv.length > 0) {\r\n const f = [\r\n `(ServiceGroupId in (${sv.map(f => f.ServiceGroupId).join(',')}))`,\r\n ];\r\n return f;\r\n } else {\r\n return [];\r\n }\r\n};\r\nexport const GetCalibrationRecordFilter = (assets: IAssetDto[]) => {\r\n const services = assets.filter(f => f !== null && f !== undefined);\r\n if (services.length > 0) {\r\n const test = services.map(f => f.Id);\r\n const test_s = test.join(',');\r\n const f = [`(AssetId in (${test_s}))`];\r\n return f;\r\n } else {\r\n return [];\r\n }\r\n};\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { FormControl } from '@material-ui/core';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { Entity } from 'types/common';\r\nimport CustomPickerFilter from '../BasicTable/Filters/CustomPickerFilter';\r\n\r\nexport interface FormCustomPickerProps extends IFieldProps {\r\n data: Entity[];\r\n}\r\nexport const FormCustomPicker = ({\r\n label,\r\n disableFuture,\r\n disablePast,\r\n data,\r\n ...props\r\n}: FieldHookConfig | null> & FormCustomPickerProps) => {\r\n const [field, , helpers] = useField | null>(props);\r\n return (\r\n \r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n value={field.value}\r\n customData={data}\r\n fullWidth={true}\r\n open={false}\r\n placeholder={props.placeholder}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","import {\r\n BaseURLPicker,\r\n BaseURLPickerProps,\r\n} from 'app/components/BasicPickers/BaseURLPicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface ArticleWorkOrdersPickerProps\r\n extends Omit>, 'url'> {}\r\n\r\nexport function ArticleWorkOrdersPicker(props: ArticleWorkOrdersPickerProps) {\r\n return ;\r\n}\r\n","import { IFieldProps } from 'app/components/Forms/FormRender/IFormFieldSetting';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport { ArticleWorkOrdersPicker } from '../ArticlePickers';\r\n\r\nexport const ArticleFormPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * NewArticleDetailsForm\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport * as Yup from 'yup';\r\nimport { selectEditArticleAssociationBusy } from '../slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Formik } from 'formik';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormAssetsPicker } from 'app/components/Forms/FormAssetsPicker';\r\nimport { useArticlesSlice } from '../slice';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { InputLabel } from 'app/components/Typography';\r\nimport { ValueLabel } from 'app/components/ValueLabel';\r\nimport {\r\n EntityNumberSchema,\r\n UserEntitySchema,\r\n} from 'app/components/Forms/Schemas';\r\nimport { FormUserPicker } from 'app/components/Forms/FormUserPicker';\r\nimport { FormAssetPicker } from 'app/components/Forms/FormAssetPicker';\r\nimport { FormListener } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport {\r\n assetSchema,\r\n assetsSchema,\r\n GetCalibrationRecordFilter,\r\n GetInstrumentFilter,\r\n IArticleNewEditForm,\r\n} from '../utils';\r\nimport { ArticleStatus } from 'enums/Article';\r\nimport { FormCustomPicker } from 'app/components/Forms/FormCustomPicker';\r\nimport { Entity } from 'types/common';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { useAllowedToChangeStatus } from '../Hooks/useAllowedToChangeStatus';\r\nimport { Roles } from 'app/slice/types';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { ArticleFormPicker } from '../ArticleFormPickers';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface NewArticleDetailsFormProps\r\n extends SidePanelContentProps,\r\n CoverProps {\r\n Journal?: string | null;\r\n PageNumber?: number | null;\r\n}\r\n\r\nexport function NewArticleDetailsForm(props: NewArticleDetailsFormProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const [oldServiceGroups, setOldServiceGroups] = React.useState(\r\n [],\r\n );\r\n const [serviceGroups, setServiceGroups] = React.useState([]);\r\n const [instruments, setInstruments] = React.useState([]);\r\n\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const processing = useSelector(selectEditArticleAssociationBusy);\r\n const admin = authenticatedUser?.Roles.includes(Roles.GroupAdministrators);\r\n const dispatch = useDispatch();\r\n const { actions } = useArticlesSlice();\r\n const [canEditStatus, setCanEditStatus] = React.useState(false);\r\n const allowedToChangeStatus = useAllowedToChangeStatus();\r\n const schema: Yup.SchemaOf = Yup.object().shape(\r\n {\r\n Title: Yup.string().required().label(t(translations.Title)).trim(),\r\n Authors: Yup.string().required().label(t(translations.Authors)).trim(),\r\n Abstract: Yup.string().required().label(t(translations.Abstract)).trim(),\r\n Doi: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.Doi))\r\n .trim(),\r\n Dataset: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.ArticleDataset))\r\n .trim(),\r\n ISSN: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.ISSN))\r\n .trim(),\r\n ORCIDs: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.ORCID))\r\n .trim(),\r\n Year: Yup.number().required().label(t(translations.Year)).min(1),\r\n RelatedUser: UserEntitySchema.nullable().notRequired(),\r\n CalibrationRecord: Yup.mixed().nullable().notRequired(),\r\n /*ServiceGroupAssets: assetsSchema.when(['InstrumentAssets'], {\r\n is: v => (v === undefined ? true : v.length === 0),\r\n then: assetsSchema\r\n .required()\r\n .label(t(translations.ServiceGroup))\r\n .min(1)\r\n otherwise: assetsSchema.notRequired(),\r\n }),*/\r\n ServiceGroupAsset: assetSchema.when(['InstrumentAssets'], {\r\n is: v => (v === undefined ? true : v.length === 0),\r\n then: assetSchema\r\n .required()\r\n .label(t(translations.ServiceGroup))\r\n .nullable(),\r\n otherwise: assetSchema.nullable().notRequired(),\r\n }),\r\n /*InstrumentAssets: assetsSchema.when(['ServiceGroupAssets'], {\r\n is: v => (v === undefined ? true : v.length === 0),\r\n then: assetsSchema.required().label(t(translations.Instruments)).min(1),\r\n otherwise: assetsSchema.notRequired(),\r\n }),*/\r\n InstrumentAssets: assetsSchema.when(['ServiceGroupAsset'], {\r\n is: v => v === null,\r\n then: assetsSchema.required().label(t(translations.Instruments)).min(1),\r\n otherwise: assetsSchema.notRequired(),\r\n }),\r\n Status: EntityNumberSchema.required().label(\r\n t(translations.ArticleStatus),\r\n ),\r\n Journal: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.Journal))\r\n .trim(),\r\n PageNumber: Yup.number(),\r\n },\r\n [['ServiceGroupAsset', 'InstrumentAssets']],\r\n );\r\n const initialValues: IArticleNewEditForm = React.useMemo(\r\n () => ({\r\n Title: '',\r\n Authors: '',\r\n Abstract: '',\r\n Doi: null,\r\n Dataset: null,\r\n ISSN: null,\r\n ORCIDs: null,\r\n Year: 0,\r\n RelatedUser: null,\r\n CalibrationRecord: null,\r\n InstrumentAssets: [],\r\n //ServiceGroupAssets: [],\r\n ServiceGroupAsset: null,\r\n Status: admin\r\n ? { Id: 1, Name: t('Article' + ArticleStatus[1]) }\r\n : { Id: 0, Name: t('Article' + ArticleStatus[0]) },\r\n }),\r\n [admin, t],\r\n );\r\n\r\n const { cover, closePanel, coverClosed, onCloseCover } = useSidePanelState();\r\n\r\n const handleCloseClick = React.useCallback(() => {\r\n closePanel({\r\n isCover: props.isCover,\r\n useSidePanel: props.useSidePanel,\r\n showConfirm: undefined,\r\n onClose: () => {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n dispatch(actions.resetArticleAssociationState());\r\n },\r\n } as SidePanelCloseState);\r\n }, [\r\n actions,\r\n closePanel,\r\n dispatch,\r\n layoutActions,\r\n props.isCover,\r\n props.useSidePanel,\r\n ]);\r\n\r\n React.useEffect(() => {\r\n if (processing === false) {\r\n handleCloseClick();\r\n }\r\n return () => undefined;\r\n }, [processing, handleCloseClick]);\r\n\r\n const instrumentFilter = React.useCallback(() => {\r\n return GetInstrumentFilter(serviceGroups);\r\n }, [serviceGroups]);\r\n const CalibrationRecordFilter = React.useCallback(() => {\r\n return GetCalibrationRecordFilter(instruments);\r\n }, [instruments]);\r\n\r\n const handleFormChange = React.useCallback(\r\n (\r\n values: IArticleNewEditForm,\r\n isValid,\r\n dirty,\r\n setValue,\r\n setTouched,\r\n validateField,\r\n setError,\r\n validate,\r\n ) => {\r\n if (\r\n serviceGroups.length !== oldServiceGroups.length ||\r\n serviceGroups[0] !== oldServiceGroups[0]\r\n ) {\r\n setOldServiceGroups(serviceGroups);\r\n setValue('InstrumentAssets', []);\r\n return;\r\n }\r\n if (\r\n values.ServiceGroupAsset === null &&\r\n values.InstrumentAssets.length > 0\r\n ) {\r\n setOldServiceGroups(serviceGroups);\r\n setValue('ServiceGroupAsset', {\r\n Id: values.InstrumentAssets[0].ServiceGroupAssetId,\r\n Name: values.InstrumentAssets[0].ServiceGroupName,\r\n ServiceGroupId: values.InstrumentAssets[0].ServiceGroupId,\r\n ServiceGroupName: values.InstrumentAssets[0].ServiceGroupName,\r\n });\r\n }\r\n setCanEditStatus(allowedToChangeStatus(serviceGroups[0]));\r\n },\r\n [allowedToChangeStatus, oldServiceGroups, serviceGroups],\r\n );\r\n const handleSubmit = React.useCallback(\r\n (values: IArticleNewEditForm) => {\r\n if (\r\n //values.ServiceGroupAssets.length === 0 &&\r\n (values.ServiceGroupAsset === null &&\r\n values.InstrumentAssets.length === 0) ||\r\n values.Status === null\r\n ) {\r\n return;\r\n }\r\n const payload: IArticleDto = {\r\n Id: 0,\r\n Title: values.Title.trim(),\r\n Authors: values.Authors.trim().split(','),\r\n Abstract: values.Abstract.trim(),\r\n Year: values.Year,\r\n ExternalId: null,\r\n ExternalIdSource: 'Manual Entry',\r\n Doi:\r\n values.Doi !== undefined && values.Doi !== null\r\n ? values.Doi.trim()\r\n : null,\r\n Dataset:\r\n values.Dataset !== undefined && values.Dataset !== null\r\n ? values.Dataset.trim()\r\n : null,\r\n ISSN:\r\n values.ISSN !== undefined && values.ISSN !== null\r\n ? values.ISSN.trim()\r\n : null,\r\n Journal: values.Journal !== undefined ? values.Journal : null,\r\n PageNumber: values.PageNumber !== undefined ? values.PageNumber : null,\r\n ORCIDs:\r\n values.ORCIDs !== undefined && values.ORCIDs !== null\r\n ? values.ORCIDs.trim().split(',')\r\n : [],\r\n ArticleContributionLevelId: null,\r\n FirstInstrumentAssetName: null,\r\n FirstServiceGroupAssetName: null,\r\n ...{\r\n //Assets: values.ServiceGroupAssets.concat(values.InstrumentAssets),\r\n Assets:\r\n values.ServiceGroupAsset !== null\r\n ? values.InstrumentAssets.concat([values.ServiceGroupAsset])\r\n : values.InstrumentAssets,\r\n },\r\n Status: values.Status.Id,\r\n EnteredBy: null,\r\n UserDisplayName: null,\r\n EnteredAt: null,\r\n RelatedUser:\r\n values.RelatedUser !== null ? values.RelatedUser?.Id : null,\r\n RelatedUserDisplayName: null,\r\n CalibrationRecord:\r\n values.CalibrationRecord !== null\r\n ? values.CalibrationRecord?.Id\r\n : null,\r\n CalibrationRecordName: null,\r\n UserGroupId: null,\r\n UserGroupName: null,\r\n DepartmentId: null,\r\n DepartmentName: null,\r\n InstituteId: null,\r\n InstituteName: null,\r\n InstituteTypeId: null,\r\n InstituteTypeName: null,\r\n CreatedByMe: false,\r\n };\r\n dispatch(actions.saveArticleAssociation(payload));\r\n },\r\n [actions, dispatch],\r\n );\r\n\r\n const statusPickerData: Entity[] = React.useMemo(() => {\r\n const data = [\r\n {\r\n Id: ArticleStatus.AwaitingApproval,\r\n Name: t('Article' + ArticleStatus[ArticleStatus.AwaitingApproval]),\r\n },\r\n {\r\n Id: ArticleStatus.Approved,\r\n Name: t('Article' + ArticleStatus[ArticleStatus.Approved]),\r\n },\r\n ] as Entity[];\r\n return data;\r\n }, [t]);\r\n\r\n return (\r\n \r\n \r\n \r\n {formik => (\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 {t(translations.Source)}\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 \r\n \r\n \r\n \r\n \r\n \r\n 0\r\n ? t(translations.CalibrationRecord)\r\n : t(translations.ArticlePleaseSelectEquipmentFirst)\r\n }\r\n placeholder={\r\n instruments.length > 0\r\n ? t(translations.PleaseSelectWorkOrder)\r\n : t(translations.ArticlePleaseSelectEquipmentFirst)\r\n }\r\n disabled={\r\n formik.isSubmitting ||\r\n !canEditStatus ||\r\n instruments.length === 0\r\n }\r\n filter={CalibrationRecordFilter()}\r\n info={t(translations.CalibrationRecord_info)}\r\n fullWidth\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {\r\n setOldServiceGroups(serviceGroups);\r\n setServiceGroups([value]);\r\n }}\r\n />\r\n \r\n \r\n {\r\n setInstruments(value);\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","import { CommentsApi } from 'api/CommentsApi';\r\nimport {\r\n ConvertNewToComment,\r\n IComment,\r\n NewComment,\r\n} from 'app/components/CommentsContainer/IComment';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { CommentsContainer } from 'app/components/CommentsContainer';\r\nimport { translations } from 'locales/translations';\r\nimport { Portal } from '@material-ui/core';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport { useUploadToNewComment } from 'app/components/LargeFilesUpload/Components/useUploadToNewComment';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useLargeFilesUploadSlice } from 'app/components/LargeFilesUpload/slice';\r\n\r\nexport interface ArticleCommentsProps {\r\n isAdmin?: boolean;\r\n article: IArticleDto;\r\n disabled?: boolean;\r\n commentsFormRef: React.MutableRefObject;\r\n isEdit?: boolean;\r\n user?: AuthenticatedUser;\r\n sectionTitle?: React.ReactNode;\r\n}\r\n\r\nexport const ArticleComments = (props: ArticleCommentsProps) => {\r\n const {\r\n article,\r\n isAdmin,\r\n disabled,\r\n commentsFormRef,\r\n isEdit,\r\n user,\r\n sectionTitle,\r\n } = props;\r\n const { t } = useTranslation();\r\n const { newDate } = useSystemDate();\r\n const [changed, setchanged] = React.useState(false);\r\n const dispatch = useDispatch();\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const [newSavedComments, setNewSavedComments] = React.useState(\r\n [],\r\n );\r\n const [newComments, setNewComments] = React.useState([]);\r\n const comments = useAsyncGetWthEffect(\r\n () =>\r\n CommentsApi.GetComments(\r\n CommentReferenceTypes.Article,\r\n article.Id > 0 ? article.Id : -1,\r\n ),\r\n [],\r\n [changed],\r\n );\r\n const bindSubmitComment = React.useCallback(\r\n submitForm => {\r\n commentsFormRef.current = submitForm;\r\n },\r\n [commentsFormRef],\r\n );\r\n const { onCommentAdded } = useUploadToNewComment();\r\n\r\n React.useEffect(() => {\r\n dispatch(\r\n largeFileActions.setCommentProperties({\r\n commentType: CommentReferenceTypes.Article,\r\n referenceId: article.Id,\r\n }),\r\n );\r\n }, [article.Id, dispatch, largeFileActions]);\r\n\r\n const portalRef = React.useRef(null);\r\n return (\r\n \r\n
    \r\n \r\n {\r\n if (!disabled) {\r\n if (isEdit) {\r\n CommentsApi.SendComment(\r\n CommentReferenceTypes.Article,\r\n article.Id,\r\n c,\r\n )\r\n .then(res => onCommentAdded?.(res))\r\n .finally(() => setchanged(prev => !prev));\r\n } else {\r\n setNewSavedComments(() => [...newSavedComments, c]);\r\n setNewComments(() => [\r\n ...newComments,\r\n ConvertNewToComment(c, newComments.length + 1, newDate(), {\r\n Id: user?.Id || '',\r\n Name: user?.Name || '',\r\n }),\r\n ]);\r\n }\r\n }\r\n }}\r\n isAdmin={isAdmin}\r\n withMentions\r\n pageName={t(translations.Publications)}\r\n referenceName={article?.Id?.toString()}\r\n />\r\n \r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * EditArticleDetailsForm\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport * as Yup from 'yup';\r\nimport {\r\n selectArticleDetails,\r\n selectArticleDetailsBusy,\r\n selectArticleDetailsForm,\r\n selectEditArticleAssociationBusy,\r\n} from '../slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Formik } from 'formik';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormAssetsPicker } from 'app/components/Forms/FormAssetsPicker';\r\nimport { useArticlesSlice } from '../slice';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { InputLabel } from 'app/components/Typography';\r\nimport { ValueLabel } from 'app/components/ValueLabel';\r\nimport { Entity } from 'types/common';\r\nimport { FormUserPicker } from 'app/components/Forms/FormUserPicker';\r\nimport { FormAssetPicker } from 'app/components/Forms/FormAssetPicker';\r\nimport { FormListener } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport {\r\n assetSchema,\r\n assetsSchema,\r\n GetCalibrationRecordFilter,\r\n GetInstrumentFilter,\r\n IArticleNewEditForm,\r\n} from '../utils';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { ArticleStatus } from 'enums/Article';\r\nimport { EntityNumberSchema } from 'app/components/Forms/Schemas';\r\nimport { FormCustomPicker } from 'app/components/Forms/FormCustomPicker';\r\nimport { useAllowedToChangeStatus } from '../Hooks/useAllowedToChangeStatus';\r\nimport { ArticleComments } from '../ArticleComments';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { ArticleFormPicker } from '../ArticleFormPickers';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface EditArticleDetailsFormProps\r\n extends SidePanelContentProps,\r\n CoverProps {\r\n value: IArticleDto;\r\n onClose?: () => void;\r\n Journal?: string | null;\r\n PageNumber?: number | null;\r\n}\r\nexport function EditArticleDetailsForm(props: EditArticleDetailsFormProps) {\r\n const { t } = useTranslation();\r\n const editProcessing = useSelector(selectEditArticleAssociationBusy);\r\n const detailsLoading = useSelector(selectArticleDetailsBusy);\r\n const articleDetailsForm = useSelector(selectArticleDetailsForm);\r\n const articleDetails = useSelector(selectArticleDetails);\r\n const user = useSelector(selectAuthenticatedUser);\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const [canEditStatus, setCanEditStatus] = React.useState(false);\r\n const allowedToChangeStatus = useAllowedToChangeStatus();\r\n const submitCommentRef = React.useRef(null);\r\n const dispatch = useDispatch();\r\n const { actions } = useArticlesSlice();\r\n const { cover, closePanel, coverClosed, onCloseCover } = useSidePanelState(\r\n undefined,\r\n undefined,\r\n props.isCover,\r\n props.useSidePanel,\r\n undefined,\r\n );\r\n\r\n const handleCloseClick = React.useCallback(() => {\r\n closePanel({\r\n isCover: props.isCover,\r\n useSidePanel: props.useSidePanel,\r\n showConfirm: false,\r\n onClose: () => {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n dispatch(actions.resetArticleAssociationState());\r\n },\r\n } as SidePanelCloseState);\r\n }, [\r\n actions,\r\n closePanel,\r\n dispatch,\r\n layoutActions,\r\n props.isCover,\r\n props.useSidePanel,\r\n ]);\r\n\r\n React.useEffect(() => {\r\n if (editProcessing === false) {\r\n handleCloseClick();\r\n }\r\n return () => undefined;\r\n }, [editProcessing, handleCloseClick]);\r\n\r\n const schema: Yup.SchemaOf = Yup.object().shape(\r\n {\r\n Title: Yup.string().required().label(t(translations.Title)).trim(),\r\n Authors: Yup.string().required().label(t(translations.Authors)).trim(),\r\n Abstract: Yup.string().required().label(t(translations.Abstract)).trim(),\r\n Doi: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.Doi))\r\n .trim(),\r\n Dataset: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.ArticleDataset))\r\n .trim(),\r\n ISSN: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.ISSN))\r\n .trim(),\r\n ORCIDs: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.ORCID))\r\n .trim(),\r\n Year: Yup.number().required().label(t(translations.Year)).min(1),\r\n CalibrationRecord: Yup.mixed().nullable().notRequired(),\r\n RelatedUser: Yup.mixed().nullable().notRequired(),\r\n /*ServiceGroupAssets: assetsSchema.when(['InstrumentAssets'], {\r\n is: v => (v === undefined ? true : v.length === 0),\r\n then: assetsSchema\r\n .required()\r\n .label(t(translations.ServiceGroup))\r\n .min(1)\r\n otherwise: assetsSchema.notRequired(),\r\n }),*/\r\n ServiceGroupAsset: assetSchema.when(['InstrumentAssets'], {\r\n is: v => (v === undefined ? true : v.length === 0),\r\n then: assetSchema\r\n .required()\r\n .label(t(translations.ServiceGroup))\r\n .nullable(),\r\n otherwise: assetSchema.nullable().notRequired(),\r\n }),\r\n /*InstrumentAssets: assetsSchema.when(['ServiceGroupAssets'], {\r\n is: v => (v === undefined ? true : v.length === 0),\r\n then: assetsSchema.required().label(t(translations.Instruments)).min(1),\r\n otherwise: assetsSchema.notRequired(),\r\n }),*/\r\n InstrumentAssets: assetsSchema.when(['ServiceGroupAsset'], {\r\n is: v => v === null,\r\n then: assetsSchema.required().label(t(translations.Instruments)).min(1),\r\n otherwise: assetsSchema.notRequired(),\r\n }),\r\n Status: EntityNumberSchema.required().label(\r\n t(translations.ArticleStatus),\r\n ),\r\n Journal: Yup.string()\r\n .notRequired()\r\n .nullable()\r\n .label(t(translations.Journal))\r\n .trim(),\r\n PageNumber: Yup.number().nullable().default(null),\r\n },\r\n [['ServiceGroupAsset', 'InstrumentAssets']],\r\n );\r\n const GetServiceGroupAsset = React.useCallback(asset => {\r\n /*if (asset !== undefined && asset !== null) {\r\n return asset.ServiceGroupId !== null &&\r\n asset.ServiceGroupId !== undefined &&\r\n (authenticatedUser?.HasAdminGroupOnlyPermissions(\r\n asset.ServiceGroupId,\r\n ) ||\r\n authenticatedUser?.HasLabTechGroupPermissions(asset.ServiceGroupId))\r\n ? asset\r\n : null;\r\n } else {\r\n return null;\r\n }*/\r\n return asset;\r\n }, []);\r\n const initialValues: IArticleNewEditForm = React.useMemo(\r\n () => ({\r\n Title:\r\n articleDetailsForm.Title === null ||\r\n articleDetailsForm.Title === undefined\r\n ? ''\r\n : articleDetailsForm.Title,\r\n Authors:\r\n articleDetailsForm.Authors === null ||\r\n articleDetailsForm.Authors === undefined\r\n ? ''\r\n : articleDetailsForm.Authors.join(','),\r\n Abstract:\r\n articleDetailsForm.Abstract === null ||\r\n articleDetailsForm.Abstract === undefined\r\n ? ''\r\n : articleDetailsForm?.Abstract?.trim(),\r\n Doi: articleDetailsForm.Doi,\r\n Dataset: articleDetailsForm.Dataset,\r\n ISSN: articleDetailsForm.ISSN,\r\n ORCIDs:\r\n articleDetailsForm.ORCIDs === null\r\n ? null\r\n : articleDetailsForm.ORCIDs.join(','),\r\n Year: articleDetailsForm.Year ?? 0,\r\n Journal: articleDetailsForm.Journal,\r\n PageNumber: articleDetailsForm.PageNumber,\r\n RelatedUser: {\r\n Id: articleDetailsForm.RelatedUser,\r\n Name: articleDetailsForm.RelatedUserDisplayName,\r\n } as Entity,\r\n CalibrationRecord: {\r\n Id: articleDetailsForm.CalibrationRecord,\r\n Name: !!articleDetailsForm.CalibrationRecord\r\n ? '#' +\r\n articleDetailsForm.CalibrationRecord?.toString() +\r\n ': ' +\r\n articleDetailsForm.CalibrationRecordName ?? ''\r\n : '',\r\n } as Entity,\r\n InstrumentAssets:\r\n articleDetailsForm !== undefined\r\n ? articleDetailsForm?.InstrumentAssets\r\n : /*? articleDetailsForm?.InstrumentAssets.filter(\r\n asset =>\r\n asset.ServiceId !== null &&\r\n asset.ServiceId !== undefined &&\r\n (authenticatedUser?.HasAdminServicePermissions(\r\n asset.ServiceTypeId ?? 1,\r\n asset.ServiceId,\r\n ) ||\r\n authenticatedUser?.HasLabTechServicePermissions(\r\n asset.ServiceTypeId ?? 1,\r\n asset.ServiceId,\r\n ) ||\r\n authenticatedUser?.HasAdminGroupPermissions(\r\n asset.ServiceGroupId ?? undefined,\r\n ) ||\r\n authenticatedUser?.HasLabTechGroupPermissions(\r\n asset.ServiceGroupId ?? undefined,\r\n )),\r\n )*/\r\n [],\r\n /*ServiceGroupAssets:\r\n articleDetailsForm !== undefined\r\n ? articleDetailsForm?.ServiceGroupAssets.filter(\r\n asset =>\r\n asset.ServiceGroupId !== null &&\r\n asset.ServiceGroupId !== undefined &&\r\n (authenticatedUser?.HasAdminGroupPermissions(\r\n asset.ServiceGroupId,\r\n ) ||\r\n authenticatedUser?.HasLabTechGroupPermissions(\r\n asset.ServiceGroupId,\r\n )),\r\n )\r\n : [],*/\r\n ServiceGroupAsset:\r\n articleDetailsForm !== undefined\r\n ? GetServiceGroupAsset(articleDetailsForm?.ServiceGroupAssets[0])\r\n : null,\r\n Status:\r\n articleDetailsForm !== undefined &&\r\n articleDetailsForm.Status !== undefined\r\n ? {\r\n Id: articleDetailsForm.Status,\r\n Name: t('Article' + ArticleStatus[articleDetailsForm.Status]),\r\n }\r\n : { Id: 0, Name: t('Article' + ArticleStatus[0]) },\r\n }),\r\n [GetServiceGroupAsset, articleDetailsForm, t],\r\n );\r\n const [oldServiceGroups, setOldServiceGroups] = React.useState(\r\n //initialValues.ServiceGroupAssets,\r\n initialValues.ServiceGroupAsset === null\r\n ? []\r\n : [initialValues.ServiceGroupAsset],\r\n );\r\n const [serviceGroups, setServiceGroups] = React.useState(\r\n //initialValues.ServiceGroupAssets,\r\n initialValues.ServiceGroupAsset === null\r\n ? []\r\n : [initialValues.ServiceGroupAsset],\r\n );\r\n const [instruments, setInstruments] = React.useState(\r\n initialValues.InstrumentAssets,\r\n );\r\n const instrumentFilter = React.useCallback(() => {\r\n return GetInstrumentFilter(serviceGroups);\r\n }, [serviceGroups]);\r\n const CalibrationRecordFilter = React.useCallback(() => {\r\n return GetCalibrationRecordFilter(instruments);\r\n }, [instruments]);\r\n const handleFormChange = React.useCallback(\r\n (\r\n values: IArticleNewEditForm,\r\n isValid,\r\n dirty,\r\n setValue,\r\n setTouched,\r\n validateField,\r\n setError,\r\n validate,\r\n ) => {\r\n if (\r\n serviceGroups.length !== oldServiceGroups.length ||\r\n serviceGroups[0] !== oldServiceGroups[0]\r\n ) {\r\n setOldServiceGroups(serviceGroups);\r\n setValue('InstrumentAssets', []);\r\n return;\r\n }\r\n if (\r\n values.ServiceGroupAsset === null &&\r\n values.InstrumentAssets.length > 0\r\n ) {\r\n setOldServiceGroups(serviceGroups);\r\n setValue('ServiceGroupAsset', {\r\n Id: values.InstrumentAssets[0].ServiceGroupAssetId,\r\n Name: values.InstrumentAssets[0].ServiceGroupName,\r\n ServiceGroupId: values.InstrumentAssets[0].ServiceGroupId,\r\n ServiceGroupName: values.InstrumentAssets[0].ServiceGroupName,\r\n });\r\n }\r\n setCanEditStatus(allowedToChangeStatus(serviceGroups[0]));\r\n },\r\n [allowedToChangeStatus, oldServiceGroups, serviceGroups],\r\n );\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: IArticleNewEditForm) => {\r\n if (\r\n //values.ServiceGroupAssets.length === 0 &&\r\n (values.ServiceGroupAsset === null &&\r\n values.InstrumentAssets.length === 0) ||\r\n values.Status === null\r\n ) {\r\n return;\r\n }\r\n const payload: IArticleDto = {\r\n ...props.value,\r\n Title: values.Title.trim(),\r\n Authors: values.Authors.trim().split(','),\r\n Abstract: values.Abstract.trim(),\r\n Doi:\r\n values.Doi !== undefined && values.Doi !== null\r\n ? values.Doi.trim()\r\n : null,\r\n Dataset:\r\n values.Dataset !== undefined && values.Dataset !== null\r\n ? values.Dataset.trim()\r\n : null,\r\n ISSN:\r\n values.ISSN !== undefined && values.ISSN !== null\r\n ? values.ISSN.trim()\r\n : null,\r\n ORCIDs:\r\n values.ORCIDs !== undefined && values.ORCIDs !== null\r\n ? values.ORCIDs.trim().split(',')\r\n : [],\r\n Year: values.Year,\r\n Status: values.Status.Id,\r\n Journal: values.Journal !== undefined ? values.Journal : null,\r\n PageNumber: values.PageNumber !== undefined ? values.PageNumber : null,\r\n RelatedUser:\r\n values.RelatedUser !== null ? values.RelatedUser?.Id : null,\r\n CalibrationRecord:\r\n values.CalibrationRecord !== null\r\n ? values.CalibrationRecord?.Id\r\n : null,\r\n ExternalId: articleDetailsForm?.ExternalId ?? null,\r\n ExternalIdSource: 'Manual Entry',\r\n ...{\r\n //Assets: values.ServiceGroupAssets.concat(values.InstrumentAssets),\r\n Assets:\r\n values.ServiceGroupAsset !== null\r\n ? values.InstrumentAssets.concat([values.ServiceGroupAsset])\r\n : values.InstrumentAssets,\r\n },\r\n };\r\n dispatch(actions.saveArticleAssociation(payload));\r\n },\r\n [props.value, articleDetailsForm?.ExternalId, dispatch, actions],\r\n );\r\n\r\n const statusPickerData: Entity[] = React.useMemo(() => {\r\n const data = [\r\n {\r\n Id: ArticleStatus.AwaitingApproval,\r\n Name: t('Article' + ArticleStatus[ArticleStatus.AwaitingApproval]),\r\n },\r\n {\r\n Id: ArticleStatus.Approved,\r\n Name: t('Article' + ArticleStatus[ArticleStatus.Approved]),\r\n },\r\n ] as Entity[];\r\n return data;\r\n }, [t]);\r\n\r\n return (\r\n \r\n \r\n {!detailsLoading && (\r\n \r\n {formik => (\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 {t(translations.Source)}\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 \r\n \r\n \r\n \r\n \r\n \r\n {!!articleDetails && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n 0\r\n ? t(translations.CalibrationRecord)\r\n : t(translations.ArticlePleaseSelectEquipmentFirst)\r\n }\r\n placeholder={\r\n instruments.length > 0\r\n ? t(translations.PleaseSelectWorkOrder)\r\n : t(translations.ArticlePleaseSelectEquipmentFirst)\r\n }\r\n disabled={\r\n formik.isSubmitting ||\r\n !canEditStatus ||\r\n instruments.length === 0\r\n }\r\n filter={CalibrationRecordFilter()}\r\n info={t(translations.CalibrationRecord_info)}\r\n fullWidth\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {\r\n setOldServiceGroups(serviceGroups);\r\n setServiceGroups([value]);\r\n }}\r\n />\r\n \r\n \r\n {\r\n setInstruments(value);\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 * UserAttributesActions\r\n *\r\n */\r\n\r\nimport { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\n\r\nexport interface SaveFormButtonProps extends ButtonProps {\r\n edit: boolean;\r\n text: string;\r\n onClick: (e: any) => void;\r\n}\r\n\r\nexport function SaveFormButton({\r\n edit,\r\n text,\r\n onClick,\r\n ...props\r\n}: SaveFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { IUserAttributesDto } from 'api/odata/generated/entities/IUserAttributesDto';\r\nimport { AsyncDataState } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\n\r\n/* --- STATE --- */\r\nexport interface UserAttributesState {\r\n createState: AsyncDataState;\r\n updateState: AsyncDataState;\r\n processing: boolean;\r\n}\r\n\r\nexport interface UserAttributesDetailsState {\r\n Id: number;\r\n Attribute?: string | null;\r\n AttributeLocalized: string;\r\n Disabled?: boolean | null;\r\n SSO?: boolean | null;\r\n SSOAttribute?: string | null;\r\n Mandatory?: boolean | null;\r\n RegistrationForm?: boolean | null;\r\n UserDetails?: boolean | null;\r\n UserSidePanel?: boolean | null;\r\n UserProfile?: boolean | null;\r\n Order?: number | null;\r\n}\r\n\r\nexport interface UserAttributesDetailsQStringParameters {\r\n id?: string;\r\n attr?: string;\r\n attrL?: string;\r\n disabled?: string;\r\n sso?: string;\r\n ssoAttr?: string;\r\n mandatory?: string;\r\n regForm?: string;\r\n usrDetails?: string;\r\n usrSidePanel?: string;\r\n usrProfile?: string;\r\n order?: string;\r\n}\r\n\r\nexport interface UserAttributesDetailsResponse extends IResponseType {\r\n Id?: number;\r\n}\r\n\r\nexport function ConvertModelToEntityUserAttributesDetails(\r\n entity: IUserAttributesDto,\r\n): UserAttributesDetailsState | undefined {\r\n if (!entity) {\r\n return undefined;\r\n } else {\r\n return {\r\n Id: entity.Id,\r\n Attribute: entity.Attribute,\r\n AttributeLocalized: entity.AttributeLocalized,\r\n Disabled: entity.Disabled,\r\n SSO: entity.SSO,\r\n SSOAttribute: entity.SSOAttribute,\r\n Mandatory: entity.Mandatory,\r\n RegistrationForm: entity.RegistrationForm,\r\n UserDetails: entity.UserDetails,\r\n UserSidePanel: entity.UserSidePanel,\r\n UserProfile: entity.UserProfile,\r\n Order: entity.Order,\r\n } as UserAttributesDetailsState;\r\n }\r\n}\r\n\r\nexport function ConvertEntityToModelUserAttributesDetails(\r\n model: UserAttributesDetailsState,\r\n original: UserAttributesDetailsState | undefined,\r\n): IUserAttributesDto {\r\n let entity = {\r\n Id: original?.Id === undefined ? model.Id : original.Id,\r\n Attribute: model.Attribute,\r\n AttributeLocalized: model.AttributeLocalized,\r\n Disabled: model.Disabled,\r\n SSO: model.SSO,\r\n SSOAttribute: model.SSOAttribute,\r\n Mandatory: model.Mandatory,\r\n RegistrationForm: model.RegistrationForm,\r\n UserDetails: model.UserDetails,\r\n UserSidePanel: model.UserSidePanel,\r\n UserProfile: model.UserProfile,\r\n Order: model.Order,\r\n } as IUserAttributesDto;\r\n return entity;\r\n}\r\n","import { UserAttributesDetailsQStringParameters } from 'app/pages/UserAttributes/UserAttributesDetailsPage/Details/slice/types';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { httpClient } from './HttpClient';\r\nimport { IUserAttributesDto } from './odata/generated/entities/IUserAttributesDto';\r\n\r\nexport const UserAttributesApi = {\r\n initCreateData: (payload: UserAttributesDetailsQStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = '/api/odata/v4/UserAttributes/InitUserAttributes';\r\n return httpClient.post(url, data);\r\n },\r\n initUpdateData: (payload: UserAttributesDetailsQStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n console.log(data);\r\n const url = '/api/odata/v4/UserAttributes/InitUserAttributes';\r\n return httpClient.post(url, data);\r\n },\r\n insertUserAttributesDetails: (payload: IUserAttributesDto) => {\r\n const url = '/api/odata/v4/UserAttributes'; //POST action in Controller\r\n return httpClient.post(url, payload);\r\n },\r\n updateUserAttributesDetails: (payload: IUserAttributesDto) => {\r\n const url = `/api/odata/v4/UserAttributes(${payload.Id})`; //PUT action in Controller\r\n return httpClient.put(url, payload);\r\n },\r\n deleteUserAttributesDetails: (\r\n rows: IUserAttributesDto[],\r\n ): Promise => {\r\n const userAttributesIds: number[] = rows.map(item => item.Id);\r\n const data = { userAttributesIds };\r\n const url = '/api/odata/v4/UserAttributes/DeleteUserAttributes';\r\n return httpClient.post(url, data);\r\n },\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, takeLatest } from 'redux-saga/effects';\r\nimport {\r\n ConvertEntityToModelUserAttributesDetails,\r\n UserAttributesDetailsQStringParameters,\r\n UserAttributesDetailsResponse,\r\n UserAttributesDetailsState,\r\n} from './types';\r\nimport { userAttributesDetailsActions as actions } from '.';\r\nimport { UserAttributesApi } from '../../../../../../api/UserAttributesApi';\r\nimport { IUserAttributesDto } from 'api/odata/generated/entities/IUserAttributesDto';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { UserAttributesDetailsProps } from '..';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { AxiosError } from 'axios';\r\n\r\nfunction* doInitCreate(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n const data = yield call(UserAttributesApi.initCreateData, action.payload);\r\n yield put(actions.initUserAttributesDetails_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initUserAttributesDetails_Error(error));\r\n }\r\n}\r\n\r\nfunction* doInitUpdate(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n const data = yield call(UserAttributesApi.initUpdateData, action.payload);\r\n yield put(actions.initUpdateUserAttributesDetails_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initUpdateUserAttributesDetails_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doCreate(action: PayloadAction) {\r\n const httpPayloads: IUserAttributesDto = ConvertEntityToModelUserAttributesDetails(\r\n action.payload,\r\n undefined,\r\n );\r\n try {\r\n const result = yield call(\r\n UserAttributesApi.insertUserAttributesDetails,\r\n httpPayloads,\r\n );\r\n let response: UserAttributesDetailsResponse = result as UserAttributesDetailsResponse;\r\n\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: 'userAttributesInsert',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'userAttributesInsert',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n if (response.Id) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'userAttributesInsert',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: true,\r\n itemName: i18next.t(translations.menu_UserAttributes),\r\n detailsType: RenderPageType.UserAttributesDetails,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + response.Id,\r\n } as UserAttributesDetailsQStringParameters,\r\n useSidePanel: true,\r\n } as UserAttributesDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'userAttributesInsertSuccess',\r\n message: response.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.createUserAttributesDetails_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'userAttributesInsert',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createUserAttributesDetails_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doUpdate(\r\n action: PayloadAction<{\r\n current: UserAttributesDetailsState;\r\n original: UserAttributesDetailsState | undefined;\r\n }>,\r\n) {\r\n const httpPayloads: IUserAttributesDto = ConvertEntityToModelUserAttributesDetails(\r\n action.payload.current,\r\n action.payload.original,\r\n );\r\n try {\r\n const results = yield call(\r\n UserAttributesApi.updateUserAttributesDetails,\r\n httpPayloads,\r\n );\r\n let response = results as UserAttributesDetailsResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: 'userAttributesUpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'userAttributesUpdateWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'userAttributesUpdate',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: false,\r\n itemName: i18next.t(translations.menu_UserAttributes),\r\n detailsType: RenderPageType.UserAttributesDetails,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + response.Id,\r\n } as UserAttributesDetailsQStringParameters,\r\n useSidePanel: true,\r\n } as UserAttributesDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.updateUserAttributesDetails_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'userAttributesUpdateErr',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateUserAttributesDetails_Error(Error));\r\n }\r\n}\r\n\r\nexport function* userAttributesDetailsSaga() {\r\n yield takeLatest(actions.initUserAttributesDetails.type, doInitCreate);\r\n yield takeLatest(actions.initUpdateUserAttributesDetails.type, doInitUpdate);\r\n yield takeLatest(actions.createUserAttributesDetails.type, doCreate);\r\n yield takeLatest(actions.updateUserAttributesDetails.type, doUpdate);\r\n}\r\n","import {\r\n ConvertModelToEntityUserAttributesDetails,\r\n UserAttributesDetailsQStringParameters,\r\n UserAttributesDetailsState,\r\n UserAttributesState,\r\n} from './types';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IUserAttributesDto } from 'api/odata/generated/entities/IUserAttributesDto';\r\nimport { userAttributesDetailsSaga } from './saga';\r\n\r\nexport const initialState: UserAttributesState = {\r\n processing: false,\r\n createState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n updateState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'userAttributesDetail',\r\n initialState,\r\n reducers: {\r\n initUserAttributesDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = true;\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initUpdateUserAttributesDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = true;\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initUserAttributesDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.createState.data = ConvertModelToEntityUserAttributesDetails(\r\n action.payload,\r\n );\r\n },\r\n initUpdateUserAttributesDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.updateState.data = ConvertModelToEntityUserAttributesDetails(\r\n action.payload,\r\n );\r\n },\r\n initUserAttributesDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n initUpdateUserAttributesDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n //====================================================================\r\n resetUpdateUserAttributesDetailsState(state, action: PayloadAction) {\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n resetCreateUserAttributesDetailsState(state, action: PayloadAction) {\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n //====================================================================\r\n updateUserAttributesDetails(\r\n state,\r\n action: PayloadAction<{\r\n current: UserAttributesDetailsState;\r\n original: UserAttributesDetailsState | undefined;\r\n }>,\r\n ) {\r\n state.updateState.processing = true;\r\n state.updateState.completed = undefined;\r\n state.updateState.hasErrors = undefined;\r\n },\r\n updateUserAttributesDetails_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.updateState.processing = false;\r\n state.updateState.hasErrors = action.payload.hasErrors;\r\n state.updateState.completed = true;\r\n },\r\n updateUserAttributesDetails_Error(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n state.updateState.hasErrors = true;\r\n },\r\n //====================================================================\r\n createUserAttributesDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.createState.processing = true;\r\n state.createState.completed = undefined;\r\n state.createState.hasErrors = undefined;\r\n },\r\n createUserAttributesDetails_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.createState.processing = false;\r\n state.createState.hasErrors = action.payload.hasErrors;\r\n state.createState.completed = true;\r\n },\r\n createUserAttributesDetails_Error(state, action: PayloadAction) {\r\n state.createState.processing = false;\r\n state.createState.completed = true;\r\n state.createState.hasErrors = true;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: userAttributesDetailsActions } = slice;\r\n\r\nexport const useUserAttributesDetailsSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: userAttributesDetailsSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.userAttributesDetail || initialState;\r\n\r\nexport const selectUserAttributesDetails = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n//====================================================================\r\nexport const selectCreateUserAttributesDetails = createSelector(\r\n [selectUserAttributesDetails],\r\n state => state.createState.data,\r\n);\r\n\r\nexport const selectCreateUserAttributesDetailsCompleted = createSelector(\r\n [selectUserAttributesDetails],\r\n state => state.createState.completed,\r\n);\r\n\r\nexport const selectCreateUserAttributesDetailsHasError = createSelector(\r\n [selectUserAttributesDetails],\r\n state => state.createState.hasErrors,\r\n);\r\n//====================================================================\r\nexport const selectUpdateUserAttributesDetails = createSelector(\r\n [selectUserAttributesDetails],\r\n state => state.updateState.data,\r\n);\r\n\r\nexport const selectUpdateUserAttributesDetailsCompleted = createSelector(\r\n [selectUserAttributesDetails],\r\n state => state.updateState.completed,\r\n);\r\nexport const selectUpdateUserAttributesDetailsHasError = createSelector(\r\n [selectUserAttributesDetails],\r\n state => state.updateState.hasErrors,\r\n);\r\n//====================================================================\r\nexport const selectUserAttributesDetailsProcessing = createSelector(\r\n [selectUserAttributesDetails],\r\n state => state.processing,\r\n);\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { UserAttributesDetailsState } from '../slice/types';\r\nimport * as Yup from 'yup';\r\nimport { translations } from 'locales/translations';\r\nimport i18next from 'i18next';\r\nimport { Formik } from 'formik';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRightSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormSwitch } from 'app/components/Forms/Switch';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { FormLabelText } from 'app/components/Forms/FormLabelText';\r\n\r\nexport interface UserAttributesFormProps {\r\n initialValues: UserAttributesDetailsState;\r\n onSubmit: (item: UserAttributesDetailsState) => void;\r\n isEdit: boolean;\r\n isAdmin: boolean;\r\n bindSubmitForm: any;\r\n}\r\n\r\nexport const UserAttributesForm = React.memo(function UserAttributesForm({\r\n initialValues,\r\n onSubmit,\r\n isEdit,\r\n isAdmin,\r\n bindSubmitForm,\r\n}: UserAttributesFormProps): JSX.Element {\r\n //SETTINGS\r\n const { t } = useTranslation();\r\n\r\n //STATES\r\n //const [ssoChanged, setSsoChanged] = useState(false);\r\n /* const [ssoAttributeChanged, setSsoAttributeChanged] = useState(\r\n false,\r\n ); */\r\n\r\n //FUNCTIONS\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value);\r\n }\r\n };\r\n\r\n //check if the field's props (Disabled, Mandatory) can't be editted\r\n const isNotEditableField = () => {\r\n if (initialValues.Attribute === 'UserName') {\r\n return true;\r\n }\r\n if (initialValues.Attribute === 'Password') {\r\n return true;\r\n }\r\n if (initialValues.Attribute === 'Email') {\r\n return true;\r\n }\r\n if (initialValues.Attribute === 'UserGroup') {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n /* const handleFormChange = useCallback(\r\n (values, isValid, dirty, setValue) => {\r\n if (\r\n initialValues.Attribute === 'UserName' ||\r\n initialValues.Attribute === 'Password' ||\r\n initialValues.Attribute === 'Email' ||\r\n initialValues.Attribute === 'UserGroup'\r\n ) {\r\n setValue('Disabled', false, false);\r\n setValue('Mandatory', true, false);\r\n }\r\n /* if (ssoChanged) {\r\n if (values.SSO === true) {\r\n setValue('Mandatory', false, false);\r\n setValue('RegistrationForm', false, false);\r\n setValue('UserDetails', false, false);\r\n setValue('UserSidePanel', false, false);\r\n setValue('UserProfile', false, false);\r\n setValue('Order', 0, false);\r\n } else {\r\n setValue('SSOAttribute', '', false);\r\n setValue('Mandatory', false, false);\r\n }\r\n setSsoChanged(false);\r\n }\r\n if (ssoAttributeChanged) {\r\n if (values.SSOAttribute !== '') {\r\n setValue('Mandatory', true, false);\r\n } else {\r\n setValue('Mandatory', false, false);\r\n }\r\n setSsoAttributeChanged(false);\r\n } */\r\n // },\r\n // [initialValues.Attribute],\r\n //);\r\n\r\n //SCHEMA\r\n const userAttributesDetailsSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().notRequired().default(-1),\r\n Attribute: Yup.string().default('').notRequired().nullable(),\r\n AttributeLocalized: Yup.string()\r\n .default('')\r\n .nullable()\r\n .required()\r\n .label(i18next.t(translations.Attribute)),\r\n Disabled: Yup.boolean()\r\n .notRequired()\r\n .nullable()\r\n .default(false)\r\n .label(i18next.t(translations.Disabled)),\r\n SSO: Yup.boolean()\r\n .notRequired()\r\n .default(false)\r\n .nullable()\r\n .label(i18next.t(translations.SSO)),\r\n SSOAttribute: Yup.string()\r\n .label(i18next.t(translations.SSOAttribute))\r\n .when('SSO', {\r\n is: sso => sso === true,\r\n then: Yup.string().nullable().required(),\r\n otherwise: Yup.string().notRequired().nullable().default(''),\r\n }),\r\n Mandatory: Yup.boolean()\r\n .notRequired()\r\n .nullable()\r\n .default(false)\r\n .label(i18next.t(translations.Mandatory)),\r\n RegistrationForm: Yup.boolean()\r\n .notRequired()\r\n .nullable()\r\n .default(false)\r\n .label(i18next.t(translations.RegistrationForm)),\r\n UserDetails: Yup.boolean()\r\n .notRequired()\r\n .nullable()\r\n .default(false)\r\n .label(i18next.t(translations.UserDetails)),\r\n UserSidePanel: Yup.boolean()\r\n .notRequired()\r\n .nullable()\r\n .default(false)\r\n .label(i18next.t(translations.UserSidePanel)),\r\n UserProfile: Yup.boolean()\r\n .notRequired()\r\n .nullable()\r\n .default(false)\r\n .label(i18next.t(translations.UserProfile)),\r\n Order: Yup.number()\r\n .notRequired()\r\n .nullable()\r\n .default(0)\r\n .label(i18next.t(translations.Order)),\r\n },\r\n );\r\n\r\n //RENDER\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n console.debug('Submitting: ', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n //console.log('User Attributes Details Errors: ', formik.errors);\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 \r\n \r\n \r\n {/* \r\n setSsoChanged(true)}\r\n />\r\n \r\n \r\n setSsoAttributeChanged(true)}\r\n fullWidth\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 \r\n \r\n \r\n );\r\n }}\r\n \r\n \r\n );\r\n});\r\n","import Box from '@material-ui/core/Box';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectHasNotSavedChanges,\r\n selectContinueToLink,\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { push } from 'connected-react-router';\r\nimport { translations } from 'locales/translations';\r\nimport { Fragment, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\r\nimport { buildURL } from 'utils/url-utils';\r\nimport { SaveFormButton } from './Actions/UserAttributesActions';\r\nimport { useUserAttributesDetailsSlice } from './slice';\r\nimport {\r\n selectUserAttributesDetailsProcessing,\r\n selectCreateUserAttributesDetailsCompleted,\r\n selectUpdateUserAttributesDetailsCompleted,\r\n selectCreateUserAttributesDetails,\r\n selectUpdateUserAttributesDetails,\r\n} from './slice/selectors';\r\nimport {\r\n UserAttributesDetailsQStringParameters,\r\n UserAttributesDetailsState,\r\n} from './slice/types';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { UserAttributesForm } from './UserAttributesForm';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\n\r\nexport interface UserAttributesDetailsProps extends SidePanelContentProps {\r\n queryParams: UserAttributesDetailsQStringParameters;\r\n}\r\n\r\nexport function UserAttributesDetails(\r\n props: UserAttributesDetailsProps,\r\n): JSX.Element {\r\n //PROPS\r\n const { queryParams, useSidePanel } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n\r\n //PERMISSIONS\r\n const User = useSelector(selectAuthenticatedUser);\r\n const IsAdmin =\r\n User !== undefined && User.Roles.includes(Roles.Administrators);\r\n\r\n //SLICES\r\n const { actions } = useUserAttributesDetailsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n\r\n //SELECTORS\r\n const publicUrl = useSelector(selectPublicUrl);\r\n //====================================================================\r\n const hasUnsavedChanges = useSelector(selectHasNotSavedChanges, shallowEqual);\r\n const continueLink = useSelector(selectContinueToLink);\r\n const loading = useSelector(selectUserAttributesDetailsProcessing);\r\n //====================================================================\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const continueToOther = useSelector(selectContinueState);\r\n //====================================================================\r\n const requestCreateCompleted = useSelector(\r\n selectCreateUserAttributesDetailsCompleted,\r\n );\r\n const requestUpdateCompleted = useSelector(\r\n selectUpdateUserAttributesDetailsCompleted,\r\n );\r\n //====================================================================\r\n const createModel = useSelector(\r\n selectCreateUserAttributesDetails,\r\n shallowEqual,\r\n );\r\n const editModel = useSelector(\r\n selectUpdateUserAttributesDetails,\r\n shallowEqual,\r\n );\r\n const baseModel = createModel || editModel;\r\n //====================================================================\r\n\r\n //STATES\r\n const [edit, setEdit] = useState(false);\r\n const [busy, setBusy] = useState(false);\r\n const [requestCompleted, setRequestCompleted] = useState(\r\n undefined,\r\n );\r\n\r\n //REF\r\n const submitFormRef = useRef(null);\r\n\r\n //FUNCTIONS\r\n const bindSubmitForm = useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n\r\n const handleSaveClick = (e: any) => {\r\n handleSubmitForm(e);\r\n };\r\n\r\n const handleSubmit = useCallback(\r\n (values: UserAttributesDetailsState) => {\r\n setBusy(true);\r\n if (edit) {\r\n dispatch(\r\n actions.updateUserAttributesDetails({\r\n current: values,\r\n original: baseModel,\r\n }),\r\n );\r\n } else {\r\n let value = values as UserAttributesDetailsState;\r\n console.debug('Data: ', value);\r\n dispatch(actions.createUserAttributesDetails(values));\r\n }\r\n },\r\n [actions, baseModel, dispatch, edit],\r\n );\r\n\r\n const handleCancelClick = useCallback(() => {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/UserAttributes'));\r\n }\r\n if (edit) {\r\n dispatch(actions.resetUpdateUserAttributesDetailsState());\r\n } else {\r\n dispatch(actions.resetCreateUserAttributesDetailsState());\r\n }\r\n }, [actions, dispatch, edit, layoutActions, useSidePanel]);\r\n\r\n const handleClose = () => {\r\n if (hasUnsavedChanges) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n } else {\r\n handleCancelClick();\r\n }\r\n };\r\n\r\n //USE EFFECT ON MOUNT\r\n useEffectOnMount(() => {\r\n if (\r\n queryParams.id !== undefined &&\r\n !isNaN(parseInt(queryParams.id || ''))\r\n ) {\r\n dispatch(actions.initUpdateUserAttributesDetails(queryParams));\r\n } else {\r\n dispatch(actions.initUserAttributesDetails(queryParams));\r\n }\r\n setBusy(false);\r\n setEdit(false);\r\n setRequestCompleted(undefined);\r\n return () => {};\r\n });\r\n\r\n //USE EFFECT\r\n useEffect(() => {\r\n let active = loading === false;\r\n if (active) {\r\n if (queryParams.id !== undefined && !isNaN(parseInt(queryParams.id))) {\r\n setEdit(true);\r\n }\r\n if (requestCreateCompleted === true || requestUpdateCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n } else if (\r\n requestCreateCompleted === false ||\r\n requestUpdateCompleted === false\r\n ) {\r\n setRequestCompleted(false);\r\n setBusy(false);\r\n }\r\n if (requestUpdateCompleted === true || requestCreateCompleted === true) {\r\n handleCancelClick();\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n handleCancelClick,\r\n loading,\r\n queryParams.id,\r\n requestCreateCompleted,\r\n requestUpdateCompleted,\r\n ]);\r\n\r\n //USE EFFECT 2\r\n useEffect(() => {\r\n if (confirmApproved) {\r\n if (edit) {\r\n dispatch(actions.resetUpdateUserAttributesDetailsState());\r\n } else {\r\n dispatch(actions.resetCreateUserAttributesDetailsState());\r\n }\r\n if (continueToOther.continueOnApprove) {\r\n dispatch(layoutActions.resetSidePanel());\r\n setTimeout(() => {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: continueToOther.pageType,\r\n props: continueToOther.pageProps,\r\n expanded: continueToOther.expanded,\r\n }),\r\n );\r\n dispatch(layoutActions.resetContinueState());\r\n }, 200);\r\n } else if (continueLink !== undefined) {\r\n dispatch(appSettingsActions.navigate(continueLink));\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n }\r\n if (confirmRejected) {\r\n dispatch(layoutActions.resetConfirmState());\r\n }\r\n return () => undefined;\r\n }, [\r\n actions,\r\n appSettingsActions,\r\n confirmApproved,\r\n confirmRejected,\r\n continueLink,\r\n continueToOther,\r\n dispatch,\r\n edit,\r\n layoutActions,\r\n ]);\r\n\r\n //LEFT ACTIONS\r\n const leftActions = [\r\n () => (\r\n \r\n }\r\n onClick={handleSaveClick}\r\n disabled={busy}\r\n processing={!requestCompleted && busy}\r\n edit={edit}\r\n text={t(translations.Save)}\r\n />\r\n \r\n ),\r\n ] as ActionRenderer[];\r\n\r\n //RIGHT ACTIONS\r\n const rightActions = [\r\n () => (\r\n \r\n }\r\n onClick={handleCancelClick}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n\r\n //RENDER\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 {hasUnsavedChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * auto generated interface for Bookit.Data.Enums.Priorities\r\n *\r\n */\r\n\r\nexport enum Priorities {\r\n Lowest = 0,\r\n Low = 1,\r\n Medium = 2,\r\n High = 3,\r\n Highest = 4,\r\n}\r\nexport type PrioritiesUnion = keyof typeof Priorities;\r\nexport const PrioritiesUnionArray: Array = [\r\n 'Lowest',\r\n 'Low',\r\n 'Medium',\r\n 'High',\r\n 'Highest',\r\n];\r\n","import { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport { IServiceRequestTicketDto } from 'api/odata/generated/entities/IServiceRequestTicketDto';\r\nimport { IUserBaseDto } from 'api/odata/generated/entities/IUserBaseDto';\r\nimport { PrioritiesUnion } from 'api/odata/generated/enums/Priorities';\r\nimport { TFunction } from 'i18next';\r\nimport * as Yup from 'yup';\r\n\r\nexport interface IServiceRequestTicketEdit {\r\n AssignedTo?: IUserBaseDto;\r\n Status?: IServiceRequestStatusDto;\r\n Priority?: PrioritiesUnion;\r\n ParentTicketId?: number | null;\r\n SamplesCount?: number | null;\r\n}\r\n\r\nexport type ServiceRequestSubTicketSchema = Pick<\r\n IServiceRequestTicketDto,\r\n 'AssignedTo' | 'Priority' | 'Status' | 'SamplesCount'\r\n>;\r\nexport const getInitialValues = (\r\n item: IServiceRequestTicketDto,\r\n t: TFunction,\r\n) => ({\r\n AssignedTo: item.AssignedTo,\r\n Status: item.Status,\r\n Priority: item.Priority,\r\n ParentTicketId: item.ParentTicketId,\r\n SamplesCount: item.ParentTicketId === null ? undefined : item.SamplesCount,\r\n});\r\n\r\nexport const getTicketSchema = (\r\n t: TFunction,\r\n item: IServiceRequestTicketDto,\r\n samplesAutomationEnabled: boolean,\r\n): Yup.SchemaOf => {\r\n const base = {\r\n AssignedTo: Yup.mixed().optional(),\r\n Priority: Yup.mixed().required(),\r\n Status: Yup.mixed().required(),\r\n ParentTicketId: Yup.number().optional().nullable(),\r\n };\r\n const isSubTicket =\r\n item.ParentTicketId !== null &&\r\n item.ParentTicketId !== undefined &&\r\n !isNaN(item.ParentTicketId);\r\n if (!isSubTicket) {\r\n return Yup.object({\r\n ...base,\r\n SamplesCount: Yup.number().optional(),\r\n });\r\n } else {\r\n const parentSamplesCount = item.ParentTicket?.SamplesCount ?? 0;\r\n const samplesRequired = samplesAutomationEnabled && parentSamplesCount > 0;\r\n const max = parentSamplesCount + (item.SamplesCount ?? 0);\r\n return Yup.object({\r\n ...base,\r\n SamplesCount: samplesRequired\r\n ? Yup.number().required().min(0).max(max)\r\n : Yup.number().optional(),\r\n });\r\n }\r\n};\r\n","/**\r\n *\r\n * PriorityPicker\r\n *\r\n */\r\n\r\nimport {\r\n PrioritiesUnion,\r\n PrioritiesUnionArray,\r\n} from 'api/odata/generated/enums/Priorities';\r\nimport {\r\n EnumPicker,\r\n withEnumOptions,\r\n} from 'app/components/BasicPickers/EnumPicker';\r\n\r\nexport const PriorityPicker = withEnumOptions(\r\n PrioritiesUnionArray,\r\n)(EnumPicker);\r\n","/**\r\n *\r\n * FormPriorityPicker\r\n *\r\n */\r\n\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { PriorityPicker } from '../pickers/StaticOptionsPickers/PriorityPicker';\r\nimport { PrioritiesUnion } from 'api/odata/generated/enums/Priorities';\r\n\r\nexport const FormPriorityPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * FormServiceRequestStatusPicker\r\n *\r\n */\r\n\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { ServiceRequestStatusPicker } from '../pickers/AutocompletePickers/ServiceRequestStatusPicker';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\n\r\ntype optionType = IServiceRequestStatusDto;\r\nexport const FormServiceRequestStatusPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { IServiceRequestTicketDto } from 'api/odata/generated/entities/IServiceRequestTicketDto';\r\nimport { Formik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n FormFieldsSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormUserPicker } from 'app/components/Forms/FormUserPicker';\r\nimport { FormPriorityPicker } from 'app/components/Forms/FormPriorityPicker';\r\nimport { FormServiceRequestStatusPicker } from 'app/components/Forms/FormServiceRequestStatusPicker';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IServiceRequestTicketEdit } from 'app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails/schema';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectKnownModule } from 'app/slice/selectors';\r\nimport { KnownModules } from 'types/KnownModules';\r\n\r\ninterface FormProps {\r\n schema: Yup.SchemaOf;\r\n initialValues: IServiceRequestTicketEdit;\r\n item: Partial;\r\n onSubmit: (values: IServiceRequestTicketEdit) => void;\r\n onCancel: () => void;\r\n processing: boolean;\r\n}\r\nexport const Form = ({\r\n schema,\r\n initialValues,\r\n onSubmit,\r\n onCancel,\r\n processing,\r\n item,\r\n}: FormProps) => {\r\n const { t } = useTranslation();\r\n\r\n const samplesAutomationEnabled = useSelector(state =>\r\n selectKnownModule(state, KnownModules.SamplesAutomation),\r\n );\r\n return (\r\n \r\n {formik => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {samplesAutomationEnabled &&\r\n item.ParentTicketId !== null &&\r\n item.SamplesCount !== undefined && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n }\r\n disabled={processing}\r\n processing={processing}\r\n >\r\n {t(translations.Submit)}\r\n \r\n }\r\n color=\"default\"\r\n onClick={onCancel}\r\n disabled={processing}\r\n variant=\"ghost\"\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * ServiceRequestTicketDetails\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { IServiceRequestTicketDto } from 'api/odata/generated/entities/IServiceRequestTicketDto';\r\n\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n IServiceRequestTicketEdit,\r\n getInitialValues,\r\n getTicketSchema,\r\n} from 'app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails/schema';\r\nimport { useServiceRequestsKanbanSlice } from 'app/pages/ServiceRequestsKanbanPage/slice';\r\n\r\nimport { Form } from '../Form';\r\nimport { Dto } from 'app/pages/ServiceRequestsKanbanPage/slice/types';\r\nimport { selectServiceRequestsKanbanProcessingInsert } from 'app/pages/ServiceRequestsKanbanPage/slice/selectors';\r\nimport { selectKnownModule } from 'app/slice/selectors';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { omit } from 'lodash';\r\n\r\nexport interface AddSubTicketProps {\r\n parentTicket: IServiceRequestTicketDto;\r\n useSidePanel: boolean;\r\n}\r\nexport function AddSubTicket({ parentTicket, ...props }: AddSubTicketProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useServiceRequestsKanbanSlice();\r\n const processing = useSelector(selectServiceRequestsKanbanProcessingInsert);\r\n const samplesAutomationEnabled = useSelector(state =>\r\n selectKnownModule(state, KnownModules.SamplesAutomation),\r\n );\r\n\r\n const schema = React.useMemo(\r\n () =>\r\n getTicketSchema(\r\n t,\r\n {\r\n Id: 0,\r\n AssignedTo: parentTicket.AssignedTo,\r\n AssignedTo_Id: parentTicket.AssignedTo_Id,\r\n Index: parentTicket.Index + 1,\r\n Priority: parentTicket.Priority,\r\n SamplesCount: null,\r\n ServiceRequest: parentTicket.ServiceRequest,\r\n ServiceRequestId: parentTicket.ServiceRequestId,\r\n ServiceRequestStatusId: parentTicket.ServiceRequestStatusId,\r\n Status: parentTicket.Status,\r\n SubSamplesCount: parentTicket.SubSamplesCount,\r\n TotalSamplesCount: parentTicket.TotalSamplesCount,\r\n ParentTicketId: parentTicket.Id,\r\n ParentTicket: parentTicket,\r\n },\r\n samplesAutomationEnabled,\r\n ),\r\n [parentTicket, samplesAutomationEnabled, t],\r\n );\r\n const initialValues = React.useMemo(\r\n () =>\r\n getInitialValues(\r\n {\r\n ParentTicketId: parentTicket.Id,\r\n AssignedTo: parentTicket.AssignedTo,\r\n Status: parentTicket.Status,\r\n Priority: parentTicket.Priority,\r\n } as Dto,\r\n t,\r\n ),\r\n [parentTicket, t],\r\n );\r\n const handleSubmit = React.useCallback(\r\n (values: IServiceRequestTicketEdit) => {\r\n dispatch(\r\n actions.insert({\r\n ...values,\r\n ParentTicket: parentTicket,\r\n // insert after the parent ticket\r\n Index: parentTicket.Index + 1,\r\n ServiceRequestId: parentTicket.ServiceRequestId,\r\n }),\r\n );\r\n },\r\n [actions, dispatch, parentTicket],\r\n );\r\n const item: Partial = {\r\n ...omit(parentTicket, 'Id', 'SamplesCount'),\r\n ParentTicketId: parentTicket.Id,\r\n SamplesCount: parentTicket.SamplesCount,\r\n };\r\n\r\n const handleCancel = () => dispatch(actions.showAddSubTicket());\r\n\r\n const title = t(translations.AddSubServiceRequestTicket);\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 * ServiceRequestTicketDetails\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { IServiceRequestTicketDto } from 'api/odata/generated/entities/IServiceRequestTicketDto';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { getInitialValues, getTicketSchema } from './schema';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { IServiceRequestTicketEdit } from 'app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails/schema';\r\nimport { useServiceRequestsKanbanSlice } from 'app/pages/ServiceRequestsKanbanPage/slice';\r\nimport { PartialExceptId } from 'utils/typeUtils';\r\nimport { Form } from './components/Form';\r\nimport {\r\n selectEdit,\r\n selectServiceRequestsKanbanProcessingUpdate,\r\n selectShowAddSubTicket,\r\n} from 'app/pages/ServiceRequestsKanbanPage/slice/selectors';\r\nimport { AddSubTicket } from './components/AddSubTicket';\r\nimport { Comments } from 'app/components/Comments';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectKnownModule,\r\n} from 'app/slice/selectors';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { getServiceRequestTicketTitle } from 'app/pages/ServiceRequestsKanbanPage/components/getServiceRequestTicketTitle';\r\nimport { ParentTicketDetailsButton } from 'app/pages/ServiceRequestsKanbanPage/components/ParentTicketDetailsButton';\r\nimport { useUploadToNewComment } from 'app/components/LargeFilesUpload/Components/useUploadToNewComment';\r\n\r\nexport interface ServiceRequestTicketDetailsProps {\r\n item: IServiceRequestTicketDto;\r\n useSidePanel: boolean;\r\n}\r\nexport function ServiceRequestTicketDetails({\r\n item,\r\n ...props\r\n}: ServiceRequestTicketDetailsProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useServiceRequestsKanbanSlice();\r\n const showAddSubTicket = useSelector(selectShowAddSubTicket);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const samplesAutomationEnabled = useSelector(state =>\r\n selectKnownModule(state, KnownModules.SamplesAutomation),\r\n );\r\n const processing = useSelector(selectServiceRequestsKanbanProcessingUpdate);\r\n const editState = useSelector(selectEdit);\r\n const editItem = editState.value;\r\n const enableAddSubTicket =\r\n !samplesAutomationEnabled || (editItem?.SamplesCount ?? 0) > 0;\r\n\r\n const handleAddSubTicketClick = React.useCallback(() => {\r\n dispatch(actions.showAddSubTicket(editItem));\r\n }, [actions, dispatch, editItem]);\r\n const rightTopActions: ActionRenderer[] = React.useMemo(() => {\r\n const result: ActionRenderer[] = [];\r\n if (editItem?.ParentTicketId === null) {\r\n result.push(() => (\r\n \r\n ));\r\n } else {\r\n result.push(() => );\r\n }\r\n return result;\r\n }, [editItem, handleAddSubTicketClick, enableAddSubTicket, t]);\r\n\r\n const schema = React.useMemo(\r\n () =>\r\n editItem === undefined\r\n ? undefined\r\n : getTicketSchema(t, editItem, samplesAutomationEnabled),\r\n [editItem, samplesAutomationEnabled, t],\r\n );\r\n const initialValues = React.useMemo(\r\n () => getInitialValues(editItem as IServiceRequestTicketDto, t),\r\n [editItem, t],\r\n );\r\n const handleSubmit = React.useCallback(\r\n (values: IServiceRequestTicketEdit) => {\r\n const updated: Partial = {\r\n ...editItem,\r\n ...{\r\n AssignedTo: values.AssignedTo,\r\n Status: values.Status,\r\n Priority: values.Priority,\r\n SamplesCount: values.SamplesCount,\r\n },\r\n };\r\n if (\r\n (updated as PartialExceptId).Id === undefined\r\n ) {\r\n return;\r\n }\r\n dispatch(\r\n actions.update(updated as PartialExceptId),\r\n );\r\n },\r\n [actions, dispatch, editItem],\r\n );\r\n\r\n const handleCancel = () => dispatch(layoutActions.resetSidePanel());\r\n const cover = React.useMemo(() => {\r\n return (\r\n showAddSubTicket &&\r\n editItem !== undefined && (\r\n \r\n )\r\n );\r\n }, [editItem, showAddSubTicket]);\r\n const isAdmin = React.useMemo(\r\n () =>\r\n (editItem !== undefined &&\r\n authenticatedUser?.IsAdminOf({\r\n ServiceGroupId: editItem.ServiceRequest.Service.ServiceGroup.Id,\r\n ServiceId: editItem.ServiceRequest.Service.Id,\r\n ServiceTypeId: ServiceType.Sample,\r\n })) ??\r\n false,\r\n [authenticatedUser, editItem],\r\n );\r\n const title =\r\n editItem === undefined ? undefined : getServiceRequestTicketTitle(editItem);\r\n const { onCommentAdded } = useUploadToNewComment();\r\n return (\r\n \r\n {schema !== undefined && editItem !== undefined && (\r\n <>\r\n \r\n\r\n {editItem.ParentTicketId === null && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { Formik, FormikProps } from 'formik';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { StockRenewalState } from '../Details/slice/types';\r\nimport React from 'react';\r\nimport * as Yup from 'yup';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\n\r\nimport {\r\n selectEditCreatableService,\r\n selectStockRenewalHasErrors,\r\n selectStockRenewalValueHandler,\r\n} from '../Details/slice/selectors';\r\nimport { useOfflineServiceStateSlice } from '../Details/slice';\r\nimport { isEmpty } from 'lodash';\r\nimport {\r\n FieldHandler,\r\n FormListener,\r\n SubmittingHandler,\r\n} from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { BookQuickServices } from '../Details/components/BookQuickServices';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { FormCheckbox } from 'app/components/Forms/FormCheckbox';\r\nimport { loadOfflineServiceData } from 'app/components/pickers/AutocompletePickers/OfflineServiceTypePicker';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { ErrorsSummury } from 'app/components/Forms/FormsLayout/FormErrorSummury';\r\nimport { FormBookitDateTimePicker } from 'app/components/Forms/FormBookitDateTimePicker';\r\n\r\nexport interface StockRenewalFormProps {\r\n onSubmit: (item: StockRenewalState) => void;\r\n onAddServiceClick: (services: number[]) => void;\r\n initialValues: StockRenewalState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n innerFormRef: React.RefObject>;\r\n globalSettings: GlobalSettingsType;\r\n onRenewStockClick?: (service: IOtherServices) => void;\r\n editCreatable?: boolean;\r\n onAddBatchClick: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n}\r\n\r\nexport const StockRenewalForm = React.memo(function StockRenewalForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isAdmin,\r\n user,\r\n globalSettings,\r\n innerFormRef,\r\n onRenewStockClick,\r\n onAddServiceClick,\r\n editCreatable,\r\n onAddBatchClick,\r\n}: StockRenewalFormProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n\r\n const fieldHandler = useSelector(selectStockRenewalValueHandler);\r\n const hasError = useSelector(selectStockRenewalHasErrors);\r\n const editCreatableService = useSelector(selectEditCreatableService);\r\n const { newDate } = useSystemDate();\r\n // const readonly = !isAdmin;\r\n const [submitting, setSubmitting] = React.useState(\r\n undefined,\r\n );\r\n const resetSubmitting = () => {\r\n setSubmitting(true);\r\n };\r\n const handleSubmit = (values: StockRenewalState) => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(values);\r\n validateForms(true);\r\n }\r\n };\r\n const resetFieldHandler = () => {\r\n dispatch(actions.resetStockRenewalValueHandler());\r\n };\r\n\r\n /// Local State ///\r\n const [serviceChanged, setServiceChanged] = React.useState(false);\r\n const [\r\n recentMostBatchesChanged,\r\n setRecentMostBatchesChanged,\r\n ] = React.useState(false);\r\n const [allIsValid, setAllIsValid] = React.useState(true);\r\n const [servicesSelected, setServicesSelected] = useAsyncExtendedState<\r\n IOtherServices[]\r\n >(initialValues.Services ?? []);\r\n // const [serviceTypeSelected, setServiceTypeSelected] = useAsyncExtendedState<\r\n // IOfflineServiceFilterDto | undefined\r\n // >(initialValues.ServiceType ?? undefined);\r\n // const IsAdmin = React.useCallback(\r\n // (service: IOtherServices) => {\r\n // return user?.IsAllGroupOrLabTechAdmin(\r\n // [service.ServiceGroupId ?? 0],\r\n // [\r\n // {\r\n // Id: service.ServiceTypeID,\r\n // Name: service.ServiceType,\r\n // ServiceTypeId: ServiceType.Offline,\r\n // } as IServiceTypeFilterDto,\r\n // ],\r\n // );\r\n // },\r\n // [user],\r\n // );\r\n // const [errorMessages, setErrorMessages] = React.useState([]);\r\n // const addErrorMessages = React.useCallback((data: string[]) => {\r\n // if (data.length > 0) {\r\n // setErrorMessages([]);\r\n // messagesHandler(data, 'error', (nodes: IndexNode[]) =>\r\n // setErrorMessages(() => nodes),\r\n // );\r\n // }\r\n // }, []);\r\n const handleFormChange = React.useCallback(\r\n (\r\n values: StockRenewalState,\r\n isValid,\r\n dirty,\r\n setValue,\r\n setTouched,\r\n validateField,\r\n setError,\r\n validate,\r\n ) => {\r\n if (recentMostBatchesChanged) {\r\n setRecentMostBatchesChanged(false);\r\n }\r\n if (serviceChanged) {\r\n setServiceChanged(false);\r\n }\r\n },\r\n [recentMostBatchesChanged, serviceChanged],\r\n );\r\n const validateForms = React.useCallback((isValid: boolean) => {\r\n setAllIsValid(isValid);\r\n }, []);\r\n\r\n // useEffects\r\n React.useEffect(() => {\r\n if (innerFormRef.current) {\r\n innerFormRef.current.validateForm();\r\n }\r\n }, [innerFormRef]);\r\n\r\n // React.useEffect(() => {\r\n // if (!!serviceChangeState) {\r\n // console.log('service settings: ', serviceSettings);\r\n // if (!!serviceChangeState) {\r\n // if (serviceSettings.budgetVisible) {\r\n // dispatch(\r\n // connectedFiltersActions.setConnectedValue({\r\n // fieldKey: 'Budget',\r\n // fieldValue: serviceChangeState.DefaultBudget,\r\n // }),\r\n // );\r\n // if (\r\n // serviceSettings.ReservationUserGroupGroupByBudgetUserGroup &&\r\n // serviceChangeState.DefaultBudget !== null\r\n // ) {\r\n // dispatch(\r\n // connectedFiltersActions.setConnectedValue({\r\n // fieldKey: 'UserGroup',\r\n // fieldValue: {\r\n // Id: serviceChangeState.DefaultBudget.UserGroupId,\r\n // Name: serviceChangeState.DefaultBudget.UserGroupName,\r\n // },\r\n // }),\r\n // );\r\n // }\r\n // if (\r\n // serviceSettings.budgetExpirementVisible &&\r\n // serviceChangeState.DefaultExperiment !== null\r\n // ) {\r\n // dispatch(\r\n // connectedFiltersActions.setConnectedValue({\r\n // fieldKey: 'BudgetExperiment',\r\n // fieldValue: serviceChangeState.DefaultExperiment,\r\n // }),\r\n // );\r\n // }\r\n // } else {\r\n // if (serviceSettings.isUserGroupCoordinator) {\r\n // dispatch(\r\n // connectedFiltersActions.setConnectedValue({\r\n // fieldKey: 'UserGroup',\r\n // fieldValue: {\r\n // Id: user?.ActiveUserGroup?.Id,\r\n // Name: user?.ActiveUserGroup?.Name,\r\n // },\r\n // }),\r\n // );\r\n // }\r\n // }\r\n // }\r\n // dispatch(actions.resetServiceChangeState());\r\n // }\r\n // }, [\r\n // actions,\r\n // connectedFiltersActions,\r\n // dispatch,\r\n // serviceChangeState,\r\n // serviceSettings,\r\n // user?.ActiveUserGroup?.Id,\r\n // user?.ActiveUserGroup?.Name,\r\n // ]);\r\n React.useEffect(() => {\r\n dispatch(\r\n actions.setStockRenewalValue({\r\n fieldKey: 'Services',\r\n fieldValue: servicesSelected,\r\n }),\r\n );\r\n }, [actions, dispatch, servicesSelected]);\r\n\r\n const otherServicesSchema = Yup.array().of(\r\n Yup.mixed() as Yup.SchemaOf,\r\n );\r\n const changeOfflineServices = React.useCallback(\r\n (services: IOtherServices[], operation: 'add' | 'remove' | 'update') => {\r\n if (operation === 'add') {\r\n let addedServ = services.filter(\r\n f => !servicesSelected.some(s => s.ServiceTypeID === f.ServiceTypeID),\r\n );\r\n setServicesSelected([...servicesSelected, ...addedServ]);\r\n setServiceChanged(true);\r\n }\r\n if (operation === 'remove') {\r\n let otherServices = servicesSelected.filter(f => {\r\n return !services.some(a => a.ServiceTypeID === f.ServiceTypeID);\r\n });\r\n setServicesSelected(otherServices);\r\n setServiceChanged(true);\r\n }\r\n if (operation === 'update') {\r\n setServicesSelected(\r\n servicesSelected.map(f => {\r\n let service = services.find(\r\n s => s.ServiceTypeID === f.ServiceTypeID,\r\n );\r\n if (!!service && service !== null) {\r\n return Object.assign({}, f, service);\r\n } else {\r\n return f;\r\n }\r\n }),\r\n );\r\n }\r\n },\r\n [servicesSelected, setServicesSelected],\r\n );\r\n const stockRenwevalSchema: Yup.SchemaOf = Yup.object({\r\n Services: otherServicesSchema\r\n .min(1)\r\n .label(t(translations.Consumables) as string)\r\n .required(t(translations.err_OfflineServiceTypeRequired) as string),\r\n DateReceived: Yup.date()\r\n .default(newDate())\r\n .label(t(translations.DateReceived) as string)\r\n .required(t(translations.err_DateReceived_required) as string),\r\n AutoGenerateNewBatches: Yup.boolean()\r\n .nullable()\r\n .default(true)\r\n .label(t(translations.AutoGenerateNewBatches) as string),\r\n });\r\n const initServices = async (): Promise => {\r\n return new Promise(async resolve => {\r\n resolve(servicesSelected);\r\n });\r\n };\r\n const prepareService = (\r\n serviceType: IOfflineServiceFilterDto,\r\n otherData?: StockRenewalState,\r\n ) => {\r\n let batch =\r\n otherData?.AutoGenerateNewBatches === false\r\n ? serviceType.InventoryBatches.length > 0\r\n ? serviceType.InventoryBatches.sort((a, b) => b.Id - a.Id)[0]\r\n : null\r\n : null;\r\n let data = {\r\n Id: 0,\r\n BookedBy: user?.Id,\r\n UserDisplayName: user?.Name,\r\n BudgetID: null,\r\n Budget: null,\r\n Quantity: serviceType.DefaultQuantity,\r\n DefaultQuantity: serviceType.DefaultQuantity,\r\n IntQuantityOnly: serviceType.IntQuantityOnly,\r\n DiscountFactor: 1,\r\n Mandatory: false,\r\n Remarks: t(translations.StockRenewal) as string,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(otherData?.DateReceived ?? newDate()),\r\n ),\r\n TrackInventory: serviceType.TrackInventory,\r\n ServiceTypeID: serviceType.Id,\r\n ServiceType: serviceType.Name,\r\n ServiceGroupId: serviceType.ServiceGroupId,\r\n Units: serviceType.UnitTypeName,\r\n UserGroup: user?.ActiveUserGroup?.Id,\r\n UserGroupName: user?.ActiveUserGroup?.Name,\r\n AllowToUser: serviceType.AllowToUser,\r\n BudgetsTurnedOn: serviceType.BudgetsTurnedOn,\r\n StaffOnly: serviceType.StaffOnly,\r\n InventoryBatchesEnabled: serviceType.InventoryBatchesEnabled,\r\n InventoryBatchId: batch === null ? null : batch.Id,\r\n InventoryBatchName: batch === null ? null : batch.Name,\r\n InventoryBatchAmount: batch === null ? null : batch.Inventory,\r\n RenewStockInventory: true,\r\n AutoGenerateNewBatches: otherData?.AutoGenerateNewBatches ?? true,\r\n } as IOtherServices;\r\n return data;\r\n };\r\n const createService = (values: StockRenewalState) => async (\r\n serviceType: IOfflineServiceFilterDto,\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n let staticService = prepareService(serviceType, values);\r\n changeOfflineServices([staticService], 'add');\r\n resolve(staticService);\r\n });\r\n };\r\n const createServices = (values: StockRenewalState) => async (\r\n serviceTypes: IOfflineServiceFilterDto[],\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n let staticServices = serviceTypes.map(f => prepareService(f, values));\r\n changeOfflineServices(staticServices, 'add');\r\n resolve(staticServices);\r\n });\r\n };\r\n const onRemoveService = async (service: IOtherServices) => {\r\n return new Promise(async (resolve, reject) => {\r\n changeOfflineServices([service], 'remove');\r\n resolve(service);\r\n });\r\n };\r\n const onRemoveServices = async (services: IOtherServices[]) => {\r\n return new Promise(async (resolve, reject) => {\r\n changeOfflineServices(services, 'remove');\r\n resolve(services);\r\n });\r\n };\r\n const onUpdateService = async (service: IOtherServices) => {\r\n return new Promise(async (resolve, reject) => {\r\n changeOfflineServices([service], 'update');\r\n resolve(service);\r\n });\r\n };\r\n const onAddAndRemoveServices = (values: StockRenewalState) => async (\r\n serviceTypes: IOfflineServiceFilterDto[],\r\n removed: IOtherServices[],\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n let staticServices = serviceTypes.map(f => prepareService(f, values));\r\n let addedServ = staticServices.filter(\r\n f => !servicesSelected.some(s => s.ServiceTypeID === f.ServiceTypeID),\r\n );\r\n let otherServices = servicesSelected.filter(f => {\r\n return !removed.some(a => a.ServiceTypeID === f.ServiceTypeID);\r\n });\r\n setServicesSelected([...otherServices, ...addedServ]);\r\n setServiceChanged(true);\r\n resolve([...otherServices, ...addedServ]);\r\n });\r\n };\r\n const loadServiceTypes = async (\r\n searchTerm: string | null,\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const data = await loadOfflineServiceData(\r\n undefined,\r\n 'base',\r\n [],\r\n undefined,\r\n 'InventoryBatches',\r\n )(searchTerm, undefined);\r\n resolve(data.value);\r\n } catch (error) {\r\n resolve([]);\r\n }\r\n });\r\n };\r\n\r\n React.useEffect(() => {\r\n if (\r\n !!editCreatableService &&\r\n servicesSelected.some(\r\n f => f.ServiceTypeID === editCreatableService.ServiceTypeID,\r\n )\r\n ) {\r\n changeOfflineServices([editCreatableService], 'update');\r\n dispatch(actions.setEditCreatableService(undefined));\r\n dispatch(actions.setRefreshConsumableOfflineServices(true));\r\n }\r\n }, [\r\n actions,\r\n changeOfflineServices,\r\n dispatch,\r\n editCreatableService,\r\n servicesSelected,\r\n ]);\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n if (allIsValid) {\r\n formikHelpers.validateForm(values).then(responseErrors => {\r\n if (!isEmpty(responseErrors)) {\r\n formikHelpers.setSubmitting(false);\r\n console.debug('errors', responseErrors);\r\n } else if (\r\n values.AutoGenerateNewBatches === false &&\r\n values.Services.some(\r\n f => f.InventoryBatchesEnabled && f.InventoryBatchId === null,\r\n )\r\n ) {\r\n // addErrorMessages([\r\n // `No batch associated with ${\r\n // values.Services.filter(\r\n // f =>\r\n // f.InventoryBatchesEnabled &&\r\n // f.InventoryBatchId === null,\r\n // )[0].ServiceType\r\n // }`,\r\n // ]);\r\n formikHelpers.setErrors({\r\n Services: `No batch associated with ${\r\n values.Services.filter(\r\n f =>\r\n f.InventoryBatchesEnabled &&\r\n f.InventoryBatchId === null,\r\n )[0].ServiceType\r\n }`,\r\n });\r\n formikHelpers.setSubmitting(false);\r\n } else if (values.Services.length < 1) {\r\n // addErrorMessages([\r\n // t(translations.err_OfflineServiceTypeRequired) as string,\r\n // ]);\r\n formikHelpers.setErrors({\r\n Services: t(\r\n translations.err_OfflineServiceTypeRequired,\r\n ) as string,\r\n });\r\n formikHelpers.setSubmitting(false);\r\n }\r\n // else if (errorMessages.length > 0) {\r\n // console.debug('errors', errorMessages);\r\n // formikHelpers.setSubmitting(false);\r\n // }\r\n else {\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }\r\n });\r\n } else {\r\n formikHelpers.setSubmitting(false);\r\n }\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n console.log('Consumables errors', formik.errors);\r\n }\r\n console.log('Consumables submitting', formik.isSubmitting);\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 0 &&\r\n !formik.values.Services.some(\r\n f => f.InventoryBatchesEnabled,\r\n )\r\n }\r\n >\r\n 1\r\n ? t(\r\n translations.AutoGenerateNewBatchesDisabled_info,\r\n )\r\n : t(translations.AutoGenerateNewBatches_info)\r\n }\r\n label={t(translations.AutoGenerateNewBatches)}\r\n disabled={\r\n formik.isSubmitting || servicesSelected.length > 0\r\n }\r\n onChange={() => setRecentMostBatchesChanged(true)}\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","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { selectHasNotSavedChanges } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { push } from 'connected-react-router';\r\nimport { FormikProps } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { useOfflineServiceStateSlice } from '../Details/slice';\r\nimport {\r\n selectStockRenewalCompleted,\r\n selectStockRenewalData,\r\n selectStockRenewalHasErrors,\r\n selectStockRenewalProcessing,\r\n} from '../Details/slice/selectors';\r\nimport {\r\n RenewStockState,\r\n StockRenewalParams,\r\n StockRenewalState,\r\n} from '../Details/slice/types';\r\nimport useGlobalSettingsHook from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { AssetsSelectionProps } from 'app/pages/MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { Roles, ScanTarget } from 'app/slice/types';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IMyAssetsRow } from 'app/pages/MyAssetsPage/IMyAssetsRow';\r\nimport { StockRenewalForm } from './StockRenewalForm';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\n\r\nexport interface StockRenewalProps extends CoverProps, SidePanelContentProps {\r\n queryParams: StockRenewalParams;\r\n initialServices: IOtherServices[];\r\n onClose?: () => void;\r\n}\r\nexport const StockRenewal = React.memo(function StockRenewal(\r\n props: StockRenewalProps,\r\n) {\r\n const {\r\n useSidePanel,\r\n queryParams,\r\n initialServices,\r\n closeCover,\r\n isCover,\r\n } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n const processing = useSelector(selectStockRenewalProcessing);\r\n const actionCompleted = useSelector(selectStockRenewalCompleted);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const hasError = useSelector(selectStockRenewalHasErrors);\r\n const stockRenewalServicesData = useSelector(selectStockRenewalData);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n // const { checkIsMobile } = useIsMobile();\r\n // const mobile = checkIsMobile();\r\n const globalSettings = useGlobalSettingsHook();\r\n //Local State\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState(\r\n () => {\r\n dispatch(actions.resetStockRenewalState());\r\n return true;\r\n },\r\n undefined,\r\n useSidePanel,\r\n isCover,\r\n );\r\n const [busy, setBusy] = React.useState(false);\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n // const [submitAllowed, setSubmitAllowed] = React.useState(\r\n // false,\r\n // );\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n\r\n //Refs\r\n const submitFormRef = React.useRef(null);\r\n const innerFormRef = React.useRef>(null);\r\n\r\n const isReadOnlyUser = React.useMemo(() => {\r\n return (\r\n User !== undefined &&\r\n (User.Roles.includes(Roles.CalendarOnly) ||\r\n User.Roles.includes(Roles.Readonly) ||\r\n User.Roles.includes(Roles.RoomOnly))\r\n );\r\n }, [User]);\r\n const assetsFilter = React.useMemo(() => {\r\n const userGroups = User?.AdminServiceGroups.map(f => f.Id);\r\n let filter: (string | Condition)[] | undefined = [];\r\n filter.push(\r\n new Condition(\r\n 'TrackInventory',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n filter.push(\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n userGroups || [],\r\n ),\r\n );\r\n return filter.length > 0 ? filter : undefined;\r\n }, [User?.AdminServiceGroups]);\r\n //Methods\r\n\r\n const handleCloselClick = React.useCallback(() => {\r\n if (useSidePanel) {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: hasChanges,\r\n onClose: () => {\r\n dispatch(actions.resetStockRenewalState());\r\n },\r\n } as SidePanelCloseState);\r\n } else {\r\n dispatch(push('/otherServices'));\r\n }\r\n }, [actions, closePanel, dispatch, hasChanges, isCover, useSidePanel]);\r\n const handleSaveClick = React.useCallback((e: any) => {\r\n handleSubmitForm(e);\r\n }, []);\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: StockRenewalState) => {\r\n setBusy(true);\r\n dispatch(actions.createStockRenewals(values));\r\n },\r\n [actions, dispatch],\r\n );\r\n const onRenewStockClick = React.useCallback(\r\n (service: IOtherServices) => {\r\n let renewProps = {\r\n initialService: service,\r\n editCreatable: true,\r\n queryParams: {\r\n id: '' + service.Id ?? -1,\r\n },\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.RenewStock,\r\n renderPageProps: renewProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [openPanel, useSidePanel],\r\n );\r\n const onAddBatchClick = React.useCallback(\r\n (batch: IInventoryBatchDto | null, serviceType: number) => {\r\n let batchProps = {\r\n initialBatch: batch ?? undefined,\r\n saveCreatable: true,\r\n queryParams: {\r\n id: '' + (batch?.Id ?? -1),\r\n stid: '' + serviceType,\r\n },\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.InventoryBatch,\r\n renderPageProps: batchProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [openPanel, useSidePanel],\r\n );\r\n const onAddServiceClick = React.useCallback(\r\n (services: number[]) => {\r\n let selParams = {\r\n actionType: 'OfflineService',\r\n offTypeIds: services,\r\n customPredicates: assetsFilter,\r\n } as AssetsSelectionProps;\r\n openPanel({\r\n renderPageType: RenderPageType.AssetsSelection,\r\n renderPageProps: selParams,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [assetsFilter, openPanel, useSidePanel],\r\n );\r\n //effects\r\n useEffectOnMount(() => {\r\n dispatch(\r\n appSettingsActions.setBarcodeScannigTarget(ScanTarget.Consumables),\r\n );\r\n return () => {\r\n dispatch(appSettingsActions.setBarcodeScannigTarget(ScanTarget.All));\r\n };\r\n });\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n if (globalSettings.loadCompleted && active) {\r\n setFirstLoad(false);\r\n dispatch(\r\n actions.initStockRenewal({\r\n query: queryParams,\r\n services: initialServices,\r\n }),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n dispatch,\r\n firstLoad,\r\n globalSettings,\r\n initialServices,\r\n queryParams,\r\n ]);\r\n React.useEffect(() => {\r\n let active = processing === false;\r\n if (active) {\r\n if (actionCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n handleCloselClick();\r\n }\r\n } else if (actionCompleted === false) {\r\n setRequestCompleted(undefined);\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actionCompleted,\r\n dispatch,\r\n handleCloselClick,\r\n hasError,\r\n layoutActions,\r\n processing,\r\n ]);\r\n\r\n // React.useEffect(() => {\r\n // setSubmitAllowed(\r\n // !!stockRenewalServicesData &&\r\n // stockRenewalServicesData.Services.length > 0,\r\n // );\r\n // }, [setSubmitAllowed, stockRenewalServicesData]);\r\n //memo\r\n const IsAdmin = React.useMemo(() => {\r\n return !!innerFormRef.current &&\r\n innerFormRef.current.values.Services.length > 0\r\n ? User?.IsAllGroupOrLabTechAdmin(\r\n innerFormRef.current.values.Services.map(g => g.ServiceGroupId || 0),\r\n innerFormRef.current.values.Services.map(f => {\r\n return {\r\n Id: f.ServiceTypeId,\r\n Name: f.ServiceTypeName,\r\n ServiceTypeId: ServiceType.Offline,\r\n } as IServiceTypeFilterDto;\r\n }),\r\n )\r\n : false;\r\n }, [User]);\r\n const rightActions = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n actions.push(() => (\r\n }\r\n onClick={handleSaveClick}\r\n disabled={busy} // || !submitAllowed\r\n processing={!requestCompleted && busy}\r\n >\r\n {t(translations.Save)}\r\n \r\n ));\r\n actions.push(() => (\r\n }\r\n onClick={handleCloselClick}\r\n >\r\n {t(translations.Close)}\r\n \r\n ));\r\n return actions;\r\n }, [busy, handleCloselClick, handleSaveClick, requestCompleted, t]);\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 pageLink={buildURL(publicUrl + 'stockRenewals', queryParams)}\r\n toPageLink={`stockRenewals?${toQueryString(queryParams)}`}\r\n isCover={isCover}\r\n cover={cover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n coverClosed={coverClosed}\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n});\r\n","import { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { Formik, FormikProps } from 'formik';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { RenewStockState } from '../Details/slice/types';\r\nimport React from 'react';\r\nimport * as Yup from 'yup';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\n\r\nimport {\r\n selectInventoryBatchEditable,\r\n selectRenewStockHasErrors,\r\n selectRenewStockValueHandler,\r\n} from '../Details/slice/selectors';\r\nimport { useOfflineServiceStateSlice } from '../Details/slice';\r\nimport { isEmpty } from 'lodash';\r\nimport {\r\n FieldHandler,\r\n FormListener,\r\n SubmittingHandler,\r\n} from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { RenewStockRelatedFilter } from 'app/components/pickers/AutocompletePickers/OfflineServiceTypePicker';\r\nimport { ServiceTypeSchema } from 'app/components/Forms/Schemas';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { FormOfflineServiceTypePicker } from 'app/components/Forms/FormOfflineServiceTypePicker';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { FormInventoryBatchPicker } from 'app/components/Forms/FormInventoryBatchPicker';\r\nimport { FormLabelText } from 'app/components/Forms/FormLabelText';\r\nimport { Box } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { BatchesByServiceTypeFilter } from 'app/components/pickers/AutocompletePickers/InventoryBatchesPicker';\r\nimport { FormBookitDateTimePicker } from 'app/components/Forms/FormBookitDateTimePicker';\r\n\r\nexport interface RenewStockFormProps {\r\n onSubmit: (item: RenewStockState) => void;\r\n initialValues: RenewStockState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n innerFormRef: React.RefObject>;\r\n globalSettings: GlobalSettingsType;\r\n isEdit: boolean;\r\n editCreatable?: boolean;\r\n onBatchClick: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n}\r\n\r\nexport const RenewStockForm = React.memo(function RenewStockForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isAdmin,\r\n user,\r\n globalSettings,\r\n innerFormRef,\r\n isEdit,\r\n editCreatable,\r\n onBatchClick,\r\n}: RenewStockFormProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n\r\n const fieldHandler = useSelector(selectRenewStockValueHandler);\r\n const hasError = useSelector(selectRenewStockHasErrors);\r\n const batchRequested = useSelector(selectInventoryBatchEditable);\r\n const { newDate } = useSystemDate();\r\n // const readonly = !isAdmin;\r\n const [submitting, setSubmitting] = React.useState(\r\n undefined,\r\n );\r\n const resetSubmitting = () => {\r\n setSubmitting(true);\r\n };\r\n const handleSubmit = (values: RenewStockState) => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(values);\r\n }\r\n };\r\n const resetFieldHandler = () => {\r\n dispatch(actions.resetRenewStockValueHandler());\r\n };\r\n\r\n /// Local State ///\r\n const [serviceChanged, setServiceChanged] = React.useState(false);\r\n const [batchChanged, setBatchChanged] = React.useState(false);\r\n\r\n const [serviceTypeSelected, setServiceTypeSelected] = useAsyncExtendedState<\r\n IOfflineServiceFilterDto | undefined\r\n >(initialValues.ServiceType ?? undefined);\r\n const minStep = React.useMemo(() => {\r\n return !!serviceTypeSelected\r\n ? serviceTypeSelected.IntQuantityOnly === true\r\n ? 1\r\n : 0.01\r\n : 1;\r\n }, [serviceTypeSelected]);\r\n const step = React.useMemo(() => {\r\n return !!serviceTypeSelected\r\n ? serviceTypeSelected.IntQuantityOnly === true\r\n ? 1\r\n : 0.01\r\n : 1;\r\n }, [serviceTypeSelected]);\r\n\r\n const maxStep = 9999;\r\n const inputProps = {\r\n step: step,\r\n min: minStep,\r\n max: maxStep,\r\n 'aria-label': 'Counter',\r\n };\r\n\r\n // const IsAdmin = React.useCallback(\r\n // (service: IOfflineServiceFilterDto) => {\r\n // return user?.IsAllGroupOrLabTechAdmin(\r\n // [service.ServiceGroupId ?? 0],\r\n // [\r\n // {\r\n // Id: service.Id,\r\n // Name: service.Name,\r\n // ServiceTypeId: ServiceType.Offline,\r\n // } as IServiceTypeFilterDto,\r\n // ],\r\n // );\r\n // },\r\n // [user],\r\n // );\r\n\r\n const handleFormChange = React.useCallback(\r\n (values: RenewStockState) => {\r\n if (serviceChanged) {\r\n setServiceTypeSelected(values.ServiceType ?? undefined);\r\n // dispatch(\r\n // connectedFiltersActions.extendSettingsState({\r\n // services:\r\n // values.Services.length < 1\r\n // ? []\r\n // : values.Services.map(f => {\r\n // return {\r\n // Id: f.ServiceTypeId,\r\n // Name: f.ServiceTypeName,\r\n // ServiceGroupId: f.ServiceGroupId,\r\n // ServiceTypeId: ServiceType.Offline,\r\n // Active: true,\r\n // BudgetsTurnedOn: f.BudgetsTurnedOn,\r\n // HideProject: f.HideProjects,\r\n // } as IServiceTypeFilterDto;\r\n // }),\r\n // globalSettings: globalSettings,\r\n // settings: serviceSettings,\r\n // isEdit: false,\r\n // data: connectedData,\r\n // }),\r\n // );\r\n // if (values.Services.length > 0 && connectedData?.User !== null) {\r\n // const parameters = {\r\n // ServiceTypes: values.Services.map(f => f.ServiceTypeID),\r\n // ReservationId: null,\r\n // UsageId: null,\r\n // BookedBy: connectedData?.User?.Id || null,\r\n // ADGroup: connectedData?.UserGroup?.Id || null,\r\n // Start: dateUtils.formatISO(\r\n // dateUtils.dateOrStringToDate(\r\n // connectedData?.StartTime || newDate(),\r\n // ),\r\n // ),\r\n // BudgetId: connectedData?.Budget?.Id || null,\r\n // FundingTypeId: connectedData?.FundingType?.Id || 0,\r\n // } as ServiceChangeStateParameters;\r\n // dispatch(actions.initServiceChangeStateData(parameters));\r\n // }\r\n //setServiceTypesSelected(values.Services);\r\n setServiceChanged(false);\r\n }\r\n if (batchChanged) {\r\n setBatchChanged(false);\r\n }\r\n },\r\n [batchChanged, serviceChanged, setServiceTypeSelected],\r\n );\r\n\r\n // useEffects\r\n React.useEffect(() => {\r\n if (innerFormRef.current) {\r\n innerFormRef.current.validateForm();\r\n }\r\n }, [innerFormRef]);\r\n React.useEffect(() => {\r\n if (batchRequested !== undefined) {\r\n dispatch(\r\n actions.setRenewStockValue({\r\n fieldKey: 'InventoryBatch',\r\n fieldValue: batchRequested,\r\n }),\r\n );\r\n dispatch(actions.setInventoryBatchEditable(undefined));\r\n }\r\n }, [actions, batchRequested, dispatch]);\r\n // React.useEffect(() => {\r\n // if (!!serviceChangeState) {\r\n // console.log('service settings: ', serviceSettings);\r\n // if (!!serviceChangeState) {\r\n // if (serviceSettings.budgetVisible) {\r\n // dispatch(\r\n // connectedFiltersActions.setConnectedValue({\r\n // fieldKey: 'Budget',\r\n // fieldValue: serviceChangeState.DefaultBudget,\r\n // }),\r\n // );\r\n // if (\r\n // serviceSettings.ReservationUserGroupGroupByBudgetUserGroup &&\r\n // serviceChangeState.DefaultBudget !== null\r\n // ) {\r\n // dispatch(\r\n // connectedFiltersActions.setConnectedValue({\r\n // fieldKey: 'UserGroup',\r\n // fieldValue: {\r\n // Id: serviceChangeState.DefaultBudget.UserGroupId,\r\n // Name: serviceChangeState.DefaultBudget.UserGroupName,\r\n // },\r\n // }),\r\n // );\r\n // }\r\n // if (\r\n // serviceSettings.budgetExpirementVisible &&\r\n // serviceChangeState.DefaultExperiment !== null\r\n // ) {\r\n // dispatch(\r\n // connectedFiltersActions.setConnectedValue({\r\n // fieldKey: 'BudgetExperiment',\r\n // fieldValue: serviceChangeState.DefaultExperiment,\r\n // }),\r\n // );\r\n // }\r\n // } else {\r\n // if (serviceSettings.isUserGroupCoordinator) {\r\n // dispatch(\r\n // connectedFiltersActions.setConnectedValue({\r\n // fieldKey: 'UserGroup',\r\n // fieldValue: {\r\n // Id: user?.ActiveUserGroup?.Id,\r\n // Name: user?.ActiveUserGroup?.Name,\r\n // },\r\n // }),\r\n // );\r\n // }\r\n // }\r\n // }\r\n // dispatch(actions.resetServiceChangeState());\r\n // }\r\n // }, [\r\n // actions,\r\n // connectedFiltersActions,\r\n // dispatch,\r\n // serviceChangeState,\r\n // serviceSettings,\r\n // user?.ActiveUserGroup?.Id,\r\n // user?.ActiveUserGroup?.Name,\r\n // ]);\r\n const computedSchema = React.useMemo(() => {\r\n const renewStockSchema: Yup.SchemaOf = Yup.object({\r\n Id: Yup.number().notRequired().default(-1),\r\n ServiceType: ServiceTypeSchema.nullable().required(\r\n t(translations.err_OfflineServiceTypeRequired),\r\n ),\r\n Quantity: Yup.number()\r\n .label(t(translations.Quantity) as string)\r\n .required(t(translations.err_Quantity_required))\r\n .nullable()\r\n .default(null)\r\n .max(maxStep)\r\n .min(minStep)\r\n .test(\r\n 'empty',\r\n t(translations.err_Quantity_required) as string,\r\n (value, context) => {\r\n let currVal = (context as any).from[0].value.Quantity;\r\n if (\r\n currVal === undefined ||\r\n currVal === null ||\r\n isNaN(currVal) ||\r\n currVal === 0\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n )\r\n .test(\r\n 'integerOnly',\r\n t(translations.err_IntQuantityOnly) as string,\r\n (value, context) => {\r\n let currVal = (context as any).from[0].value.Quantity;\r\n if (\r\n !!serviceTypeSelected &&\r\n serviceTypeSelected.IntQuantityOnly &&\r\n currVal % 1 !== 0\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n ),\r\n DateReceived: Yup.date()\r\n .default(newDate())\r\n .label(t(translations.DateReceived) as string)\r\n .required(t(translations.err_DateReceived_required) as string),\r\n Remarks: Yup.string()\r\n .nullable()\r\n .label(t(translations.Remarks) as string),\r\n InventoryBatch: (Yup.mixed() as Yup.SchemaOf)\r\n .nullable()\r\n .label(t(translations.Batch) as string),\r\n });\r\n if (!!serviceTypeSelected && serviceTypeSelected.TrackInventory) {\r\n if (serviceTypeSelected?.NotLessThanZero) {\r\n if (serviceTypeSelected.Inventory === 0) {\r\n renewStockSchema.fields.Quantity.withMutation(schema =>\r\n schema\r\n .label(t(translations.Quantity) as string)\r\n .required(t(translations.err_Quantity_required))\r\n .default(null)\r\n .nullable()\r\n .max(maxStep)\r\n .min(minStep)\r\n .test(\r\n 'empty',\r\n t(translations.err_Quantity_required) as string,\r\n (value, context) => {\r\n let currVal = context.from[0].value.Quantity;\r\n if (\r\n currVal === undefined ||\r\n currVal === null ||\r\n isNaN(currVal) ||\r\n currVal === 0\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n )\r\n .test(\r\n 'minQuantWithZero',\r\n t(\r\n translations.NotAllowNegativeInventory_currentEqualsZero_err,\r\n ) as string,\r\n (value, context) => {\r\n let currVal = context.from[0].value.Quantity;\r\n let current = currVal as number;\r\n if (current < 1) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n ),\r\n );\r\n } else {\r\n renewStockSchema.fields.Quantity.withMutation(schema =>\r\n schema\r\n .label(t(translations.Quantity) as string)\r\n .required(t(translations.err_Quantity_required))\r\n .max(maxStep)\r\n .min(minStep)\r\n .test(\r\n 'empty',\r\n t(translations.err_Quantity_required) as string,\r\n (value, context) => {\r\n let currVal = context.from[0].value.Quantity;\r\n if (\r\n currVal === undefined ||\r\n currVal === null ||\r\n isNaN(currVal) ||\r\n currVal === 0\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n )\r\n .test(\r\n 'minQuant',\r\n (t(\r\n translations.NotAllowNegativeInventory_currentMoreThanZero_err,\r\n ) as string).replace(\r\n '{0}',\r\n serviceTypeSelected.Inventory.toString(),\r\n ),\r\n (value, context) => {\r\n let currVal = context.from[0].value.Quantity;\r\n let current = currVal as number;\r\n if (serviceTypeSelected.Inventory - current < 0) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n ),\r\n );\r\n }\r\n }\r\n if (serviceTypeSelected?.InventoryBatchesEnabled) {\r\n renewStockSchema.fields.InventoryBatch.withMutation(schema =>\r\n schema\r\n .label(t(translations.Batch) as string)\r\n .nullable()\r\n .required(t(translations.err_InventoryBatch_required) as string),\r\n );\r\n }\r\n }\r\n return renewStockSchema;\r\n }, [minStep, newDate, serviceTypeSelected, t]);\r\n\r\n // const loadServiceTypes = async (\r\n // searchTerm: string | null,\r\n // ): Promise => {\r\n // return new Promise(async (resolve, reject) => {\r\n // try {\r\n // const data = await loadOfflineServiceType(\r\n // undefined,\r\n // [],\r\n // undefined,\r\n // 'InventoryBatches',\r\n // )(searchTerm, undefined);\r\n // resolve(data.value);\r\n // } catch (error) {\r\n // resolve([]);\r\n // }\r\n // });\r\n // };\r\n\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n\r\n formikHelpers.validateForm(values).then(responseErrors => {\r\n if (!isEmpty(responseErrors)) {\r\n formikHelpers.setSubmitting(false);\r\n console.debug('errors', responseErrors);\r\n } else {\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }\r\n });\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n console.log('Consumables errors', formik.errors);\r\n }\r\n console.log('Consumables submitting', formik.isSubmitting);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {editCreatable ? (\r\n \r\n \r\n {formik.values.ServiceType !== undefined &&\r\n formik.values.ServiceType !== null\r\n ? formik.values.ServiceType.Name\r\n : (t(translations.NA) as string)}\r\n \r\n }\r\n />\r\n \r\n ) : (\r\n \r\n {\r\n setServiceChanged(true);\r\n }}\r\n />\r\n \r\n )}\r\n \r\n {\r\n const precision =\r\n formik.values.ServiceType?.IntQuantityOnly === false\r\n ? 2\r\n : 0;\r\n const value = +(+event.target.value).toFixed(\r\n precision,\r\n );\r\n console.log('qyt', value);\r\n }}\r\n inputProps={inputProps}\r\n />\r\n \r\n \r\n \r\n \r\n {!!serviceTypeSelected &&\r\n serviceTypeSelected?.InventoryBatchesEnabled && (\r\n \r\n \r\n {\r\n setBatchChanged(true);\r\n }}\r\n predicates={BatchesByServiceTypeFilter(\r\n serviceTypeSelected.Id,\r\n )}\r\n />\r\n \r\n {formik.values.ServiceType !== null &&\r\n formik.values.ServiceType !== undefined && (\r\n \r\n \r\n onBatchClick(\r\n null,\r\n formik.values.ServiceType?.Id ?? 0,\r\n )\r\n }\r\n >\r\n {t(translations.AddNewBatch)}\r\n \r\n {formik.values.InventoryBatch !== null &&\r\n formik.values.InventoryBatch !==\r\n undefined && (\r\n \r\n onBatchClick(\r\n formik.values.InventoryBatch ?? null,\r\n formik.values.ServiceType?.Id ?? 0,\r\n )\r\n }\r\n >\r\n {t(translations.EditSelectedBatch)}\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","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { selectHasNotSavedChanges } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { push } from 'connected-react-router';\r\nimport { FormikProps } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { useOfflineServiceStateSlice } from '../Details/slice';\r\nimport {\r\n selectIsEdit,\r\n selectRenewStockCompleted,\r\n selectRenewStockData,\r\n selectRenewStockHasErrors,\r\n selectRenewStockProcessing,\r\n} from '../Details/slice/selectors';\r\nimport { RenewStockParams, RenewStockState } from '../Details/slice/types';\r\nimport useGlobalSettingsHook from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { RenewStockForm } from './RenewStockForm';\r\nimport { Roles } from 'app/slice/types';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\n\r\nexport interface RenewStockProps extends CoverProps, SidePanelContentProps {\r\n queryParams: RenewStockParams;\r\n initialService?: IOtherServices;\r\n editCreatable?: boolean;\r\n saveCreatable?: boolean;\r\n preventRefreshTable?: boolean;\r\n onClose?: () => void;\r\n}\r\nexport const RenewStock = React.memo(function RenewStock(\r\n props: RenewStockProps,\r\n) {\r\n const {\r\n useSidePanel,\r\n queryParams,\r\n initialService,\r\n editCreatable,\r\n preventRefreshTable,\r\n saveCreatable,\r\n isCover,\r\n closeCover,\r\n } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const processing = useSelector(selectRenewStockProcessing);\r\n const actionCompleted = useSelector(selectRenewStockCompleted);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const hasError = useSelector(selectRenewStockHasErrors);\r\n const renewStockData = useSelector(selectRenewStockData);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const isEdit = useSelector(selectIsEdit);\r\n // const { checkIsMobile } = useIsMobile();\r\n // const mobile = checkIsMobile();\r\n const globalSettings = useGlobalSettingsHook();\r\n //Local State\r\n // const [cover, setCover] = React.useState();\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState(\r\n () => {\r\n dispatch(actions.resetRenewStockState());\r\n return true;\r\n },\r\n undefined,\r\n useSidePanel,\r\n isCover,\r\n );\r\n const [busy, setBusy] = React.useState(false);\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n\r\n //Refs\r\n const submitFormRef = React.useRef(null);\r\n const innerFormRef = React.useRef>(null);\r\n\r\n const isReadOnlyUser = React.useMemo(() => {\r\n return (\r\n User !== undefined &&\r\n (User.Roles.includes(Roles.CalendarOnly) ||\r\n User.Roles.includes(Roles.Readonly) ||\r\n User.Roles.includes(Roles.RoomOnly))\r\n );\r\n }, [User]);\r\n\r\n //Methods\r\n // const closeCover = () => {\r\n // setCover(undefined);\r\n // };\r\n // const handleClose = () => {\r\n // if (hasChanges) {\r\n // dispatch(layoutActions.setConfirmOpen(true));\r\n // } else {\r\n // handleCloselClick();\r\n // }\r\n // };\r\n const handleCloselClick = React.useCallback(() => {\r\n if (useSidePanel) {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: hasChanges,\r\n onClose: () => {\r\n dispatch(actions.resetRenewStockState());\r\n },\r\n } as SidePanelCloseState);\r\n } else {\r\n dispatch(push('/otherServices'));\r\n }\r\n // if (!!onClose) {\r\n // onClose();\r\n // } else {\r\n // if (useSidePanel) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // } else {\r\n // dispatch(push('/otherServices'));\r\n // }\r\n // }\r\n // dispatch(actions.resetRenewStockState());\r\n }, [actions, closePanel, dispatch, hasChanges, isCover, useSidePanel]);\r\n const handleSaveClick = React.useCallback((e: any) => {\r\n handleSubmitForm(e);\r\n }, []);\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: RenewStockState) => {\r\n setBusy(true);\r\n if (isEdit) {\r\n dispatch(\r\n actions.updateRenewStock({\r\n current: values,\r\n original: renewStockData || values,\r\n editCreatable: editCreatable ?? false,\r\n autoGenerateBatch: initialService?.AutoGenerateNewBatches,\r\n }),\r\n );\r\n } else {\r\n dispatch(\r\n actions.createRenewStock({\r\n model: values,\r\n editCreatable: editCreatable ?? false,\r\n preventRefreshTable: preventRefreshTable,\r\n autoGenerateBatch: initialService?.AutoGenerateNewBatches,\r\n saveCreatable: saveCreatable,\r\n }),\r\n );\r\n }\r\n },\r\n [\r\n actions,\r\n dispatch,\r\n editCreatable,\r\n initialService?.AutoGenerateNewBatches,\r\n isEdit,\r\n preventRefreshTable,\r\n renewStockData,\r\n saveCreatable,\r\n ],\r\n );\r\n\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n if (globalSettings.loadCompleted && active) {\r\n setFirstLoad(false);\r\n dispatch(\r\n actions.initRenewStock({\r\n query: queryParams,\r\n service: initialService,\r\n }),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n dispatch,\r\n firstLoad,\r\n globalSettings,\r\n initialService,\r\n queryParams,\r\n ]);\r\n React.useEffect(() => {\r\n let active = processing === false;\r\n if (active) {\r\n if (actionCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n handleCloselClick();\r\n }\r\n } else if (actionCompleted === false) {\r\n setRequestCompleted(undefined);\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actionCompleted,\r\n dispatch,\r\n handleCloselClick,\r\n hasError,\r\n layoutActions,\r\n processing,\r\n ]);\r\n const onBatchClick = React.useCallback(\r\n (batch: IInventoryBatchDto | null, serviceType: number) => {\r\n let batchProps = {\r\n initialBatch:\r\n batch?.OfflineServiceTypeId === undefined ? undefined : batch,\r\n queryParams: {\r\n id: '' + (batch?.Id ?? -1),\r\n stid: '' + serviceType,\r\n },\r\n saveCreatable: true,\r\n useSidePanel: true,\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.InventoryBatch,\r\n renderPageProps: batchProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [openPanel, useSidePanel],\r\n );\r\n // React.useEffect(() => {\r\n // if (confirmApproved) {\r\n // dispatch(actions.resetRenewStockState());\r\n // if (continueToOther.continueOnApprove) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // setTimeout(() => {\r\n // dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: continueToOther.pageType,\r\n // props: continueToOther.pageProps,\r\n // expanded: continueToOther.expanded,\r\n // }),\r\n // );\r\n // dispatch(layoutActions.resetContinueState());\r\n // }, 200);\r\n // } else if (continueLink !== undefined) {\r\n // dispatch(appSettingsActions.navigate(continueLink));\r\n // dispatch(layoutActions.resetSidePanel());\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }\r\n // //dispatch(actions.setChangedState(false));\r\n // }\r\n // if (confirmRejected) {\r\n // dispatch(layoutActions.resetConfirmState());\r\n // }\r\n\r\n // return () => undefined;\r\n // }, [\r\n // actions,\r\n // appSettingsActions,\r\n // confirmApproved,\r\n // confirmRejected,\r\n // continueLink,\r\n // continueToOther,\r\n // dispatch,\r\n // layoutActions,\r\n // ]);\r\n\r\n //memo\r\n const IsAdmin = React.useMemo(() => {\r\n return !!innerFormRef.current &&\r\n innerFormRef.current.values.ServiceType !== null\r\n ? User?.IsAllGroupOrLabTechAdmin(\r\n [innerFormRef.current.values.ServiceType.ServiceGroupId],\r\n [\r\n {\r\n Id: innerFormRef.current.values.ServiceType.Id,\r\n Name: innerFormRef.current.values.ServiceType.Name,\r\n ServiceTypeId: ServiceType.Offline,\r\n } as IServiceTypeFilterDto,\r\n ],\r\n )\r\n : false;\r\n }, [User]);\r\n const rightActions = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n actions.push(() => (\r\n }\r\n onClick={handleSaveClick}\r\n disabled={\r\n busy ||\r\n !(\r\n !!innerFormRef.current &&\r\n (innerFormRef.current.values.ServiceType ?? null) !== null\r\n )\r\n }\r\n processing={!requestCompleted && busy}\r\n >\r\n {t(translations.Save)}\r\n \r\n ));\r\n actions.push(() => (\r\n }\r\n onClick={handleCloselClick}\r\n >\r\n {t(translations.Close)}\r\n \r\n ));\r\n return actions;\r\n }, [busy, handleCloselClick, handleSaveClick, requestCompleted, t]);\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 pageLink={buildURL(publicUrl + '/renwestock', queryParams)}\r\n toPageLink={`renwestock?${toQueryString(queryParams)}`}\r\n isCover={isCover}\r\n cover={cover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n coverClosed={coverClosed}\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n});\r\n","import { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { Formik, FormikProps } from 'formik';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { InventoryBatchState } from '../Details/slice/types';\r\nimport React from 'react';\r\nimport * as Yup from 'yup';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\n\r\nimport {\r\n selectInventoryBatchHasErrors,\r\n selectInventoryBatchValueHandler,\r\n} from '../Details/slice/selectors';\r\nimport { useOfflineServiceStateSlice } from '../Details/slice';\r\nimport { isEmpty } from 'lodash';\r\nimport {\r\n FieldHandler,\r\n FormListener,\r\n SubmittingHandler,\r\n} from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { InventoryBatchRelatedFilter } from 'app/components/pickers/AutocompletePickers/OfflineServiceTypePicker';\r\nimport { ServiceTypeSchema } from 'app/components/Forms/Schemas';\r\nimport { FormOfflineServiceTypePicker } from 'app/components/Forms/FormOfflineServiceTypePicker';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { FormBookitDatePicker } from 'app/components/Forms/FormBookitDatePicker';\r\n\r\nexport interface InventoryBatchFormProps {\r\n onSubmit: (item: InventoryBatchState) => void;\r\n initialValues: InventoryBatchState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n innerFormRef: React.RefObject>;\r\n globalSettings: GlobalSettingsType;\r\n isEdit: boolean;\r\n}\r\n\r\nexport const InventoryBatchForm = React.memo(function InventoryBatchForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isAdmin,\r\n user,\r\n globalSettings,\r\n innerFormRef,\r\n isEdit,\r\n}: InventoryBatchFormProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n\r\n const fieldHandler = useSelector(selectInventoryBatchValueHandler);\r\n const hasError = useSelector(selectInventoryBatchHasErrors);\r\n const { newDate } = useSystemDate();\r\n // const readonly = !isAdmin;\r\n const [submitting, setSubmitting] = React.useState(\r\n undefined,\r\n );\r\n const resetSubmitting = () => {\r\n setSubmitting(true);\r\n };\r\n const handleSubmit = (values: InventoryBatchState) => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(values);\r\n }\r\n };\r\n const resetFieldHandler = () => {\r\n dispatch(actions.resetInventoryBatchValueHandler());\r\n };\r\n\r\n /// Local State ///\r\n const [serviceChanged, setServiceChanged] = React.useState(false);\r\n const [batchChanged, setBatchChanged] = React.useState(false);\r\n\r\n const [serviceTypeSelected, setServiceTypeSelected] = useAsyncExtendedState<\r\n IOfflineServiceFilterDto | undefined\r\n >(initialValues.ServiceType ?? undefined);\r\n const minStep = React.useMemo(() => {\r\n return !!serviceTypeSelected\r\n ? serviceTypeSelected.NotLessThanZero === true\r\n ? 0\r\n : -9999\r\n : -9999;\r\n }, [serviceTypeSelected]);\r\n const maxStep = 9999;\r\n const inputProps = {\r\n step: 1,\r\n min: minStep,\r\n max: maxStep,\r\n 'aria-label': 'Inventory',\r\n };\r\n\r\n // const IsAdmin = React.useCallback(\r\n // (service: IOfflineServiceFilterDto) => {\r\n // return user?.IsAllGroupOrLabTechAdmin(\r\n // [service.ServiceGroupId ?? 0],\r\n // [\r\n // {\r\n // Id: service.Id,\r\n // Name: service.Name,\r\n // ServiceTypeId: ServiceType.Offline,\r\n // } as IServiceTypeFilterDto,\r\n // ],\r\n // );\r\n // },\r\n // [user],\r\n // );\r\n\r\n const handleFormChange = React.useCallback(\r\n (values: InventoryBatchState) => {\r\n if (serviceChanged) {\r\n setServiceTypeSelected(values.ServiceType ?? undefined);\r\n setServiceChanged(false);\r\n }\r\n if (batchChanged) {\r\n setBatchChanged(false);\r\n }\r\n },\r\n [batchChanged, serviceChanged, setServiceTypeSelected],\r\n );\r\n\r\n // useEffects\r\n React.useEffect(() => {\r\n if (innerFormRef.current) {\r\n innerFormRef.current.validateForm();\r\n }\r\n }, [innerFormRef]);\r\n\r\n const computedSchema = React.useMemo(() => {\r\n const inventoryBatchSchema: Yup.SchemaOf = Yup.object({\r\n Id: Yup.number().notRequired().default(-1),\r\n Name: Yup.string()\r\n .label(t(translations.BatchName) as string)\r\n .required(t(translations.err_BatchName_required) as string),\r\n ServiceType: ServiceTypeSchema.nullable().required(\r\n t(translations.err_OfflineServiceTypeRequired),\r\n ),\r\n ExpirationDate: Yup.date()\r\n .label(t(translations.BatchExpirationDate) as string)\r\n .nullable()\r\n .default(null),\r\n PurchaseDate: Yup.date()\r\n .default(newDate())\r\n .label(t(translations.BatchPurchaseDate) as string)\r\n .required(t(translations.err_BatchPurchaseDate_required) as string),\r\n Inventory: Yup.number()\r\n .label(t(translations.BatchInventory) as string)\r\n .required(t(translations.err_BatchInventory_required) as string)\r\n .max(maxStep)\r\n .min(minStep)\r\n .default(0)\r\n .test(\r\n 'empty',\r\n t(translations.err_BatchInventory_required) as string,\r\n (value, context) => {\r\n let currVal = (context as any).from[0].value.Inventory;\r\n if (currVal === undefined || currVal === null || isNaN(currVal)) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n ),\r\n Lot: Yup.string()\r\n .nullable()\r\n .label(t(translations.BatchLot) as string),\r\n PurchasePricePerUnit: Yup.number()\r\n .label(t(translations.BatchPurchasePricePerUnit) as string)\r\n .nullable(true)\r\n .default(null),\r\n });\r\n\r\n if (!!serviceTypeSelected && serviceTypeSelected.TrackInventory) {\r\n if (serviceTypeSelected?.NotLessThanZero) {\r\n inventoryBatchSchema.fields.Inventory.withMutation(schema =>\r\n schema\r\n .label(t(translations.BatchInventory) as string)\r\n .required(t(translations.err_BatchInventory_required))\r\n .max(maxStep)\r\n .min(minStep)\r\n .default(0)\r\n .test(\r\n 'empty',\r\n t(translations.err_BatchInventory_required) as string,\r\n (value, context) => {\r\n let currVal = context.from[0].value.Inventory;\r\n if (\r\n currVal === undefined ||\r\n currVal === null ||\r\n isNaN(currVal)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n )\r\n .test(\r\n 'noLessThanZero',\r\n t(translations.NotAllowNegativeInventory_err) as string,\r\n (value, context) => {\r\n let currVal = context.from[0].value.Inventory;\r\n if (\r\n currVal === undefined ||\r\n currVal === null ||\r\n isNaN(currVal) ||\r\n currVal >= 0\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n },\r\n ),\r\n );\r\n }\r\n }\r\n return inventoryBatchSchema;\r\n }, [minStep, newDate, serviceTypeSelected, t]);\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n formikHelpers.validateForm(values).then(responseErrors => {\r\n if (!isEmpty(responseErrors)) {\r\n formikHelpers.setSubmitting(false);\r\n console.debug('errors', responseErrors);\r\n } else {\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }\r\n });\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n console.log('Consumables errors', formik.errors);\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 setServiceChanged(true);\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 const value = +(+event.target.value).toFixed(0);\r\n console.log('qyt', value);\r\n }}\r\n inputProps={inputProps}\r\n />\r\n \r\n \r\n {\r\n const value = +(+event.target.value).toFixed(2);\r\n console.log('qyt', value);\r\n }}\r\n inputProps={{\r\n step: 1,\r\n min: 0,\r\n 'aria-label': 'PurchasePricePerUnit',\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","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { selectHasNotSavedChanges } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { push } from 'connected-react-router';\r\nimport { FormikProps } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { useOfflineServiceStateSlice } from '../Details/slice';\r\nimport {\r\n selectInventoryBatchCompleted,\r\n selectInventoryBatchData,\r\n selectInventoryBatchHasErrors,\r\n selectInventoryBatchIsEdit,\r\n selectInventoryBatchProcessing,\r\n} from '../Details/slice/selectors';\r\nimport {\r\n InventoryBatchParams,\r\n InventoryBatchState,\r\n} from '../Details/slice/types';\r\nimport useGlobalSettingsHook from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { InventoryBatchForm } from './InventoryBatchForm';\r\nimport { Roles } from 'app/slice/types';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface InventoryBatchProps extends CoverProps, SidePanelContentProps {\r\n queryParams: InventoryBatchParams;\r\n initialBatch?: IInventoryBatchDto;\r\n onClose?: () => void;\r\n saveCreatable?: boolean;\r\n preventRefreshTable?: boolean;\r\n}\r\nexport const InventoryBatch = React.memo(function InventoryBatch(\r\n props: InventoryBatchProps,\r\n) {\r\n const {\r\n useSidePanel,\r\n queryParams,\r\n initialBatch,\r\n saveCreatable,\r\n preventRefreshTable,\r\n closeCover,\r\n isCover,\r\n } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const processing = useSelector(selectInventoryBatchProcessing);\r\n const actionCompleted = useSelector(selectInventoryBatchCompleted);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const hasError = useSelector(selectInventoryBatchHasErrors);\r\n const inventoryBatchData = useSelector(selectInventoryBatchData);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const isEdit = useSelector(selectInventoryBatchIsEdit);\r\n // const { checkIsMobile } = useIsMobile();\r\n // const mobile = checkIsMobile();\r\n const globalSettings = useGlobalSettingsHook();\r\n //Local State\r\n // const [cover, setCover] = React.useState();\r\n const { cover, closePanel, coverClosed, onCloseCover } = useSidePanelState(\r\n () => {\r\n dispatch(actions.resetInventoryBatchState());\r\n return true;\r\n },\r\n undefined,\r\n useSidePanel,\r\n isCover,\r\n );\r\n const [busy, setBusy] = React.useState(false);\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n\r\n //Refs\r\n const submitFormRef = React.useRef(null);\r\n const innerFormRef = React.useRef>(null);\r\n\r\n const isReadOnlyUser = React.useMemo(() => {\r\n return (\r\n User !== undefined &&\r\n (User.Roles.includes(Roles.CalendarOnly) ||\r\n User.Roles.includes(Roles.Readonly) ||\r\n User.Roles.includes(Roles.RoomOnly))\r\n );\r\n }, [User]);\r\n\r\n //Methods\r\n // const closeCover = () => {\r\n // setCover(undefined);\r\n // };\r\n // const handleClose = () => {\r\n // if (hasChanges) {\r\n // dispatch(layoutActions.setConfirmOpen(true));\r\n // } else {\r\n // handleCloselClick();\r\n // }\r\n // };\r\n const handleCloselClick = React.useCallback(() => {\r\n // if (!!onClose) {\r\n // onClose();\r\n // } else {\r\n // if (useSidePanel) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // } else {\r\n // dispatch(push('/otherServices'));\r\n // }\r\n // }\r\n if (useSidePanel) {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: hasChanges,\r\n onClose: () => {\r\n dispatch(actions.resetInventoryBatchState());\r\n },\r\n } as SidePanelCloseState);\r\n } else {\r\n dispatch(push('/otherServices'));\r\n }\r\n }, [actions, closePanel, dispatch, hasChanges, isCover, useSidePanel]);\r\n const handleSaveClick = React.useCallback((e: any) => {\r\n handleSubmitForm(e);\r\n }, []);\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: InventoryBatchState) => {\r\n setBusy(true);\r\n if (isEdit) {\r\n dispatch(\r\n actions.updateInventoryBatch({\r\n current: values,\r\n original: inventoryBatchData || values,\r\n saveCreatable: saveCreatable,\r\n preventRefreshTable: preventRefreshTable,\r\n }),\r\n );\r\n } else {\r\n dispatch(\r\n actions.createInventoryBatch({\r\n model: values,\r\n saveCreatable: saveCreatable,\r\n preventRefreshTable: preventRefreshTable,\r\n }),\r\n );\r\n }\r\n },\r\n [\r\n actions,\r\n dispatch,\r\n inventoryBatchData,\r\n isEdit,\r\n preventRefreshTable,\r\n saveCreatable,\r\n ],\r\n );\r\n\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n if (globalSettings.loadCompleted && active) {\r\n setFirstLoad(false);\r\n dispatch(\r\n actions.initInventoryBatch({\r\n query: queryParams,\r\n batch: initialBatch,\r\n }),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [actions, dispatch, firstLoad, globalSettings, initialBatch, queryParams]);\r\n React.useEffect(() => {\r\n let active = processing === false;\r\n if (active) {\r\n if (actionCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n handleCloselClick();\r\n }\r\n } else if (actionCompleted === false) {\r\n setRequestCompleted(undefined);\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [actionCompleted, handleCloselClick, hasError, processing]);\r\n // React.useEffect(() => {\r\n // if (confirmApproved) {\r\n // dispatch(actions.resetInventoryBatchState());\r\n // if (continueToOther.continueOnApprove) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // setTimeout(() => {\r\n // dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: continueToOther.pageType,\r\n // props: continueToOther.pageProps,\r\n // expanded: continueToOther.expanded,\r\n // }),\r\n // );\r\n // dispatch(layoutActions.resetContinueState());\r\n // }, 200);\r\n // } else if (continueLink !== undefined) {\r\n // dispatch(appSettingsActions.navigate(continueLink));\r\n // dispatch(layoutActions.resetSidePanel());\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }\r\n // //dispatch(actions.setChangedState(false));\r\n // }\r\n // if (confirmRejected) {\r\n // dispatch(layoutActions.resetConfirmState());\r\n // }\r\n\r\n // return () => undefined;\r\n // }, [\r\n // actions,\r\n // appSettingsActions,\r\n // confirmApproved,\r\n // confirmRejected,\r\n // continueLink,\r\n // continueToOther,\r\n // dispatch,\r\n // layoutActions,\r\n // ]);\r\n\r\n //memo\r\n const IsAdmin = React.useMemo(() => {\r\n return !!innerFormRef.current &&\r\n innerFormRef.current.values.ServiceType !== null\r\n ? User?.IsAllGroupOrLabTechAdmin(\r\n [innerFormRef.current.values.ServiceType.ServiceGroupId],\r\n [\r\n {\r\n Id: innerFormRef.current.values.ServiceType.Id,\r\n Name: innerFormRef.current.values.ServiceType.Name,\r\n ServiceTypeId: ServiceType.Offline,\r\n } as IServiceTypeFilterDto,\r\n ],\r\n )\r\n : false;\r\n }, [User]);\r\n const rightActions = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n actions.push(() => (\r\n }\r\n onClick={handleSaveClick}\r\n disabled={\r\n busy ||\r\n !(\r\n !!innerFormRef.current &&\r\n (innerFormRef.current.values.ServiceType ?? null) !== null\r\n )\r\n }\r\n processing={!requestCompleted && busy}\r\n >\r\n {t(translations.Save)}\r\n \r\n ));\r\n actions.push(() => (\r\n }\r\n onClick={handleCloselClick}\r\n >\r\n {t(translations.Close)}\r\n \r\n ));\r\n return actions;\r\n }, [busy, handleCloselClick, handleSaveClick, requestCompleted, t]);\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 pageLink={buildURL(publicUrl + '/inventoryBatch', queryParams)}\r\n toPageLink={`inventoryBatch?${toQueryString(queryParams)}`}\r\n isCover={isCover}\r\n cover={cover}\r\n coverClosed={coverClosed}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n});\r\n","/**\r\n *\r\n * ArticleAssociationForm\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport * as Yup from 'yup';\r\nimport {\r\n selectArticleDetails,\r\n selectArticleDetailsForm,\r\n selectArticles,\r\n selectEditArticleAssociationBusy,\r\n} from '../slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Formik } from 'formik';\r\nimport {\r\n FormFieldsSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormAssetsPicker } from 'app/components/Forms/FormAssetsPicker';\r\nimport { useArticlesSlice } from '../slice';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { FormUserPicker } from 'app/components/Forms/FormUserPicker';\r\nimport { FormAssetPicker } from 'app/components/Forms/FormAssetPicker';\r\nimport { FormListener } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { GetCalibrationRecordFilter, GetInstrumentFilter } from '../utils';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { useAllowedToChangeStatus } from '../Hooks/useAllowedToChangeStatus';\r\nimport { ArticleStatus } from 'enums/Article';\r\nimport { ArticleComments } from '../ArticleComments';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { ArticleFormPicker } from '../ArticleFormPickers';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface ArticleAssociationFormProps\r\n extends SidePanelContentProps,\r\n CoverProps {}\r\nexport interface IArticleAssociationForm {\r\n RelatedUser: Entity | null;\r\n ServiceGroupAsset: IAssetDto | null;\r\n //ServiceGroupAssets: Array;\r\n InstrumentAssets: Array;\r\n CalibrationRecord: Entity | null;\r\n}\r\n\r\nconst assetSchema = Yup.mixed();\r\nconst assetsSchema = Yup.array().of(Yup.mixed() as Yup.SchemaOf);\r\n\r\nexport function ArticleAssociationForm(props: ArticleAssociationFormProps) {\r\n const { useSidePanel = true, closeCover, isCover } = props;\r\n const { t } = useTranslation();\r\n const state = useSelector(selectArticles);\r\n const articleDetails = useSelector(selectArticleDetails);\r\n const articleDetailsForm = useSelector(selectArticleDetailsForm);\r\n const user = useSelector(selectAuthenticatedUser);\r\n const editProcessing = useSelector(selectEditArticleAssociationBusy);\r\n const allowedToChangeStatus = useAllowedToChangeStatus();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const [canEditStatus, setCanEditStatus] = React.useState(false);\r\n const submitCommentRef = React.useRef(null);\r\n const dispatch = useDispatch();\r\n const { actions } = useArticlesSlice();\r\n const schema: Yup.SchemaOf = Yup.object().shape(\r\n {\r\n CalibrationRecord: Yup.mixed().nullable().notRequired(),\r\n RelatedUser: Yup.mixed().nullable().notRequired(),\r\n //ServiceGroupAssets: assetsSchema.required(),\r\n /*ServiceGroupAsset: assetSchema.nullable().required(),\r\n InstrumentAssets: assetsSchema.required(),*/\r\n ServiceGroupAsset: assetSchema.when(['InstrumentAssets'], {\r\n is: v => (v === undefined ? true : v.length === 0),\r\n then: assetSchema.required().nullable(),\r\n otherwise: assetSchema.nullable().notRequired(),\r\n }),\r\n InstrumentAssets: assetsSchema.when(['ServiceGroupAsset'], {\r\n is: v => v === null,\r\n then: assetsSchema.required().min(1),\r\n otherwise: assetsSchema.notRequired(),\r\n }),\r\n },\r\n [['ServiceGroupAsset', 'InstrumentAssets']],\r\n );\r\n const GetServiceGroupAsset = React.useCallback(asset => {\r\n /*if (asset !== undefined && asset !== null) {\r\n return asset.ServiceGroupId !== null &&\r\n asset.ServiceGroupId !== undefined &&\r\n (authenticatedUser?.HasAdminGroupOnlyPermissions(\r\n asset.ServiceGroupId,\r\n ) ||\r\n authenticatedUser?.HasLabTechGroupPermissions(asset.ServiceGroupId))\r\n ? asset\r\n : null;\r\n } else {\r\n return null;\r\n }*/\r\n return asset;\r\n }, []);\r\n const initialValues: IArticleAssociationForm = React.useMemo(\r\n () => ({\r\n CalibrationRecord: {\r\n Id: articleDetails?.CalibrationRecord,\r\n Name: !!articleDetails?.CalibrationRecord\r\n ? '#' +\r\n articleDetails?.CalibrationRecord?.toString() +\r\n ': ' +\r\n articleDetails?.CalibrationRecordName\r\n : '',\r\n } as Entity,\r\n RelatedUser: {\r\n Id: articleDetails?.RelatedUser,\r\n Name: articleDetails?.RelatedUserDisplayName,\r\n } as Entity,\r\n InstrumentAssets: articleDetailsForm?.InstrumentAssets,\r\n /*articleDetailsForm?.InstrumentAssets.filter(\r\n asset =>\r\n asset.ServiceId !== null &&\r\n asset.ServiceId !== undefined &&\r\n (authenticatedUser?.HasAdminServicePermissions(\r\n asset.ServiceTypeId ?? 1,\r\n asset.ServiceId,\r\n ) ||\r\n authenticatedUser?.HasLabTechServicePermissions(\r\n asset.ServiceTypeId ?? 1,\r\n asset.ServiceId,\r\n ) ||\r\n authenticatedUser?.HasAdminGroupPermissions(\r\n asset.ServiceGroupId ?? undefined,\r\n ) ||\r\n authenticatedUser?.HasLabTechGroupPermissions(\r\n asset.ServiceGroupId ?? undefined,\r\n )),\r\n ),*/\r\n /*ServiceGroupAssets: articleDetailsForm?.ServiceGroupAssets.filter(\r\n asset =>\r\n asset.ServiceGroupId !== null &&\r\n asset.ServiceGroupId !== undefined &&\r\n (authenticatedUser?.HasAdminGroupPermissions(asset.ServiceGroupId) ||\r\n authenticatedUser?.HasLabTechGroupPermissions(\r\n asset.ServiceGroupId,\r\n )),\r\n ),*/\r\n ServiceGroupAsset:\r\n articleDetailsForm !== undefined\r\n ? GetServiceGroupAsset(articleDetailsForm?.ServiceGroupAssets[0])\r\n : null,\r\n }),\r\n [\r\n GetServiceGroupAsset,\r\n articleDetails?.CalibrationRecord,\r\n articleDetails?.CalibrationRecordName,\r\n articleDetails?.RelatedUser,\r\n articleDetails?.RelatedUserDisplayName,\r\n articleDetailsForm,\r\n ],\r\n );\r\n const [oldServiceGroups, setOldServiceGroups] = React.useState(\r\n //initialValues.ServiceGroupAssets,\r\n initialValues.ServiceGroupAsset === null\r\n ? []\r\n : [initialValues.ServiceGroupAsset],\r\n );\r\n const [serviceGroups, setServiceGroups] = React.useState(\r\n //initialValues.ServiceGroupAssets,\r\n initialValues.ServiceGroupAsset === null\r\n ? []\r\n : [initialValues.ServiceGroupAsset],\r\n );\r\n const [instruments, setInstruments] = React.useState(\r\n initialValues.InstrumentAssets,\r\n );\r\n\r\n const { cover, closePanel, coverClosed, onCloseCover } = useSidePanelState();\r\n\r\n const handleCloseClick = React.useCallback(() => {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: undefined,\r\n onClose: () => {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n dispatch(actions.resetArticleAssociationState());\r\n },\r\n } as SidePanelCloseState);\r\n }, [actions, closePanel, dispatch, isCover, layoutActions, useSidePanel]);\r\n\r\n React.useEffect(() => {\r\n if (editProcessing === false) {\r\n handleCloseClick();\r\n }\r\n return () => undefined;\r\n }, [editProcessing, handleCloseClick]);\r\n\r\n const instrumentFilter = React.useCallback(() => {\r\n return GetInstrumentFilter(serviceGroups);\r\n }, [serviceGroups]);\r\n const CalibrationRecordFilter = React.useCallback(() => {\r\n return GetCalibrationRecordFilter(instruments);\r\n }, [instruments]);\r\n const handleFormChange = React.useCallback(\r\n (\r\n values: IArticleAssociationForm,\r\n isValid,\r\n dirty,\r\n setValue,\r\n setTouched,\r\n validateField,\r\n setError,\r\n validate,\r\n ) => {\r\n if (\r\n serviceGroups.length !== oldServiceGroups.length ||\r\n serviceGroups[0] !== oldServiceGroups[0]\r\n ) {\r\n setOldServiceGroups(serviceGroups);\r\n setValue('InstrumentAssets', []);\r\n return;\r\n }\r\n if (\r\n values.ServiceGroupAsset === null &&\r\n values.InstrumentAssets.length > 0\r\n ) {\r\n setOldServiceGroups(serviceGroups);\r\n setValue('ServiceGroupAsset', {\r\n Id: values.InstrumentAssets[0].ServiceGroupAssetId,\r\n Name: values.InstrumentAssets[0].ServiceGroupName,\r\n ServiceGroupId: values.InstrumentAssets[0].ServiceGroupId,\r\n ServiceGroupName: values.InstrumentAssets[0].ServiceGroupName,\r\n });\r\n }\r\n setCanEditStatus(allowedToChangeStatus(serviceGroups[0]));\r\n },\r\n [allowedToChangeStatus, oldServiceGroups, serviceGroups],\r\n );\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: IArticleAssociationForm) => {\r\n if (articleDetails === undefined) {\r\n return;\r\n }\r\n const payload: IArticleDto = {\r\n ...articleDetails,\r\n ...{\r\n RelatedUser:\r\n values.RelatedUser !== null && !!values.RelatedUser\r\n ? values.RelatedUser?.Id\r\n : null,\r\n },\r\n ...{\r\n CalibrationRecord:\r\n values.CalibrationRecord !== null && !!values.CalibrationRecord\r\n ? values.CalibrationRecord?.Id\r\n : null,\r\n },\r\n ...{\r\n //Assets: values.ServiceGroupAssets.concat(values.InstrumentAssets),\r\n Assets:\r\n values.ServiceGroupAsset !== null && !!values.ServiceGroupAsset\r\n ? values.InstrumentAssets.concat([values.ServiceGroupAsset])\r\n : values.InstrumentAssets,\r\n },\r\n Status: allowedToChangeStatus(serviceGroups[0])\r\n ? ArticleStatus.Approved\r\n : ArticleStatus.AwaitingApproval,\r\n };\r\n dispatch(actions.saveArticleAssociation(payload));\r\n },\r\n [actions, allowedToChangeStatus, articleDetails, dispatch, serviceGroups],\r\n );\r\n const processing = state.editArticleAssociationBusy;\r\n\r\n return (\r\n \r\n \r\n \r\n {formik => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 0\r\n ? t(translations.CalibrationRecord)\r\n : t(translations.ArticlePleaseSelectEquipmentFirst)\r\n }\r\n placeholder={\r\n instruments.length > 0\r\n ? t(translations.PleaseSelectWorkOrder)\r\n : t(translations.ArticlePleaseSelectEquipmentFirst)\r\n }\r\n disabled={\r\n formik.isSubmitting ||\r\n !canEditStatus ||\r\n instruments.length === 0\r\n }\r\n filter={CalibrationRecordFilter()}\r\n info={t(translations.CalibrationRecord_info)}\r\n fullWidth\r\n />\r\n \r\n \r\n setAssetChanged(true)}\r\n onChange={(value: any) => {\r\n setOldServiceGroups(serviceGroups);\r\n setServiceGroups([value]);\r\n }}\r\n fullWidth\r\n />\r\n \r\n \r\n setAssetChanged(true)}\r\n fullWidth\r\n withoutServiceGroups={true}\r\n onChange={(value: any) => {\r\n setInstruments(value);\r\n }}\r\n />\r\n \r\n {articleDetails && articleDetails.Id > 0 && (\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","import { PageTypeProps, RenderPageType } from '../../slice/type';\r\nimport * as React from 'react';\r\nimport {\r\n TrainingDetails,\r\n TrainingDetailsProps,\r\n} from 'app/pages/UserTrainings/TrainingDetailsPage/Details';\r\nimport { StartQuiz, StartQuizProps } from 'app/pages/QuizPage/StartQuiz';\r\nimport {\r\n QuizDetails,\r\n QuizDetailsProps,\r\n} from 'app/pages/QuizDetailsPage/QuizDetails';\r\nimport { AssetPopUp, AssetPopUpProps } from 'app/pages/AssetPopUp';\r\nimport {\r\n LocationDetails,\r\n LocationDetailsProps,\r\n} from 'app/pages/LocationsPage/Details';\r\nimport {\r\n WorkOrderDetails,\r\n WorkOrderDetailsProps,\r\n} from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { AddPayment, PaymentProps } from 'app/pages/AddPaymentPage';\r\nimport { AddCharge, ChargeProps } from 'app/pages/AddChargePage';\r\nimport {\r\n InvoiceDetailsSidePanel,\r\n InvoiceDetailsSidePanelProps,\r\n} from 'app/pages/InvoiceDetails/InvoiceDetailsSidePanel';\r\nimport {\r\n BillingActionsDetails,\r\n BillingActionsDetailsProps,\r\n} from 'app/pages/BillingActions/BillingActionsDetailsPage/Details';\r\nimport {\r\n SavedViewDetails,\r\n SavedViewDetailsProps,\r\n} from 'app/pages/SavedViewsPage/SavedViewPage/Details';\r\nimport { LabelTypePage } from 'app/pages/LabelTypesPage/LabelTypeEdit/Loadable';\r\nimport { LabelTypeEditProps } from 'app/pages/LabelTypesPage/LabelTypeEdit';\r\nimport {\r\n InstrumentRestrictions,\r\n InstrumentRestrictionsProps,\r\n} from 'app/pages/InstrumentRestrictionsPage/Details/InstrumentRestrictions';\r\nimport {\r\n ReservationDetails,\r\n ReservationDetailsProps,\r\n} from 'app/pages/ReservationDetails/Details';\r\nimport {\r\n InvoiceTemplatePopUp,\r\n InvoiceTemplatePopUpProps,\r\n} from 'app/pages/InvoiceTemplates/InvoiceTemplatePopUp';\r\nimport {\r\n OtherServiceDetails,\r\n OtherServiceDetailsProps,\r\n} from 'app/pages/OtherServiceDetails/Details';\r\nimport {\r\n PricePeriodDetails,\r\n PricePeriodDetailsProps,\r\n} from 'app/pages/PriceSheetPeriodDetails/Details';\r\nimport {\r\n ArticleDetails,\r\n ArticleDetailsProps,\r\n} from 'app/pages/ArticlesPage/ArticleDetails';\r\nimport {\r\n CoreSelection,\r\n CoreSelectionProps,\r\n} from 'app/pages/CoreSelectionPage/CoreSelection';\r\nimport {\r\n AssetsSelection,\r\n AssetsSelectionProps,\r\n} from 'app/pages/MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport {\r\n NewArticleDetailsForm,\r\n NewArticleDetailsFormProps,\r\n} from 'app/pages/ArticlesPage/NewArticleDetailsForm';\r\nimport {\r\n EditArticleDetailsForm,\r\n EditArticleDetailsFormProps,\r\n} from 'app/pages/ArticlesPage/EditArticleDetailsForm';\r\nimport {\r\n UserAttributesDetails,\r\n UserAttributesDetailsProps,\r\n} from 'app/pages/UserAttributes/UserAttributesDetailsPage/Details';\r\nimport {\r\n ServiceRequestDetails,\r\n ServiceRequestDetailsProps,\r\n} from 'app/pages/Samples/RequestSamplesPage';\r\nimport {\r\n ServiceRequestTicketDetails,\r\n ServiceRequestTicketDetailsProps,\r\n} from 'app/pages/ServiceRequestTicketDetailsPage/ServiceRequestTicketDetails';\r\nimport {\r\n ReportConsumables,\r\n ReportConsumablesProps,\r\n} from 'app/pages/OtherServiceDetails/ReportConsumables';\r\nimport {\r\n CalendarMessagesDetails,\r\n CalendarMessagesDetailsProps,\r\n} from 'app/pages/CalendarMessages/CalendarMessagesDetails/Details';\r\nimport {\r\n ServiceRequestMilestoneChargeDetails,\r\n ServiceRequestMilestoneChargeDetailsProps,\r\n} from 'app/pages/Samples/components/ServiceRequestMilestoneChargeDetails';\r\nimport {\r\n ServiceRequestMilestoneDetails,\r\n ServiceRequestMilestoneDetailsProps,\r\n} from 'app/pages/Samples/components/ServiceRequestMilestoneDetails';\r\nimport {\r\n StockRenewal,\r\n StockRenewalProps,\r\n} from 'app/pages/OtherServiceDetails/StockRenewal';\r\nimport {\r\n RenewStock,\r\n RenewStockProps,\r\n} from 'app/pages/OtherServiceDetails/RenewStock';\r\nimport {\r\n InventoryBatch,\r\n InventoryBatchProps,\r\n} from 'app/pages/OtherServiceDetails/InventoryBatch';\r\nimport {\r\n InvoiceBatchesComments,\r\n InvoiceBatchesCommentsProps,\r\n} from 'app/pages/InvoiceBatches/InvoiceBatchesComments';\r\nimport {\r\n InventoryLog,\r\n InventoryLogProps,\r\n} from 'app/pages/AssetsInventoryLog/InventoryLog';\r\nimport {\r\n ArticleAssociationForm,\r\n ArticleAssociationFormProps,\r\n} from 'app/pages/ArticlesPage/ArticleAssociationForm';\r\n\r\nexport interface SidePanelRendererProps {\r\n renderPageType?: RenderPageType;\r\n renderPageProps: PageTypeProps;\r\n}\r\n\r\nexport function SidePanelRenderer(props: SidePanelRendererProps) {\r\n const { renderPageType, renderPageProps } = props;\r\n\r\n switch (renderPageType) {\r\n case RenderPageType.TrainingDetails:\r\n return ;\r\n case RenderPageType.QuizCreate:\r\n return ;\r\n case RenderPageType.QuizzDetails:\r\n return ;\r\n case RenderPageType.LocationDetails:\r\n return ;\r\n case RenderPageType.AssetDetails:\r\n return ;\r\n case RenderPageType.WorkOrderDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.AddCharge:\r\n return ;\r\n case RenderPageType.AddPayment:\r\n return ;\r\n case RenderPageType.InvoiceDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.AddBillingAction:\r\n return (\r\n \r\n );\r\n case RenderPageType.SavedViewDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.LabelType:\r\n return ;\r\n case RenderPageType.OtherServiceDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.RestrictionDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.ReservationDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.PricePeriodsDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.Article:\r\n return ;\r\n case RenderPageType.ArticleNew:\r\n return (\r\n \r\n );\r\n case RenderPageType.ArticleEdit:\r\n return (\r\n \r\n );\r\n case RenderPageType.InvoiceTemplatePopUp:\r\n return (\r\n \r\n );\r\n case RenderPageType.CoreSelection:\r\n return ;\r\n case RenderPageType.AssetsSelection:\r\n return ;\r\n case RenderPageType.UserAttributesDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.ServiceRequestDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.ServiceRequestTicketDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.CalendarMessagesDetails:\r\n return (\r\n \r\n );\r\n case RenderPageType.ReportConsumables:\r\n return (\r\n \r\n );\r\n case RenderPageType.ServiceRequestMilestone:\r\n return (\r\n \r\n );\r\n case RenderPageType.ServiceRequestMilestoneCharge:\r\n return (\r\n \r\n );\r\n case RenderPageType.StockRenewal:\r\n return ;\r\n case RenderPageType.RenewStock:\r\n return ;\r\n case RenderPageType.InventoryBatch:\r\n return ;\r\n case RenderPageType.InvoiceBatchesComments:\r\n return (\r\n \r\n );\r\n case RenderPageType.AssetInventoryLog:\r\n return ;\r\n case RenderPageType.ArticleForm:\r\n return (\r\n \r\n );\r\n default:\r\n return ;\r\n }\r\n}\r\n","/**\r\n *\r\n * AssetCatGroupPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IAssetCatGroupDto } from 'api/odata/generated/entities/IAssetCatGroupDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectIsAuthenticated,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\n\r\nexport type CatGroupUrl = 'base' | 'assetBase' | 'public';\r\nexport interface AssetCatGroupPickerProps\r\n extends Omit, 'loadData'> {\r\n noGlobalServiceGroupFilter?: boolean;\r\n urlType?: CatGroupUrl;\r\n}\r\n\r\nconst url = '/api/odata/v4/AssetCatGroups';\r\nconst assetBaseUrl = '/api/odata/v4/AssetCatGroups/AssetCatGroupsFilter';\r\nconst publicUrl = '/api/odata/v4/AssetCatGroups/PublicAssetCatGroupsFilter';\r\nexport const initAssetCatGroupData = (\r\n initval: string | undefined,\r\n sourceUrl?: CatGroupUrl,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IAssetCatGroupDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,ServiceGroups',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n sourceUrl === 'public'\r\n ? publicUrl\r\n : sourceUrl === 'assetBase'\r\n ? assetBaseUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as IAssetCatGroupDto[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n isAuthenticated?: boolean,\r\n urlType?: CatGroupUrl,\r\n) => {\r\n const sourceUrl =\r\n urlType === 'public' || !isAuthenticated\r\n ? publicUrl\r\n : urlType === 'assetBase'\r\n ? assetBaseUrl\r\n : url;\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name', 'ServiceGroups'],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\n\r\nexport function AssetCatGroupPicker(props: AssetCatGroupPickerProps) {\r\n const { predicates, noGlobalServiceGroupFilter, urlType, ...other } = props;\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n const innerLoadData = loadData(\r\n predicates,\r\n isAuth\r\n ? !noGlobalServiceGroupFilter\r\n ? globalServiceGroupFilter || []\r\n : []\r\n : [],\r\n isAuth,\r\n urlType,\r\n );\r\n return (\r\n \r\n );\r\n}\r\nexport const AssetCatGroupByServiceGroupFilter = (value: FilterValueType) => {\r\n if (value !== undefined && value !== null) {\r\n return [\r\n `${new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.In,\r\n (value as Identifiable).Id,\r\n ).toString()}`,\r\n ];\r\n }\r\n return [];\r\n};\r\n","/**\r\n *\r\n * CampusPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface InstitutePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/InstituteFilter';\r\nexport const initInstituteData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function InstitutePicker(props: InstitutePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AssetCatPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { IAssetCatDto } from 'app/pages/CategoriesPage/IAssetCatDto';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectIsAuthenticated,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\nexport type CatUrl = 'base' | 'assetBase' | 'public';\r\nexport interface AssetCatPickerProps\r\n extends Omit, 'loadData'> {\r\n urlType?: CatUrl;\r\n}\r\n\r\nconst url = '/api/odata/v4/AssetCat';\r\nconst assetBaseUrl = '/api/odata/v4/AssetCat/AssetCatsFilter';\r\nconst publicUrl = '/api/odata/v4/AssetCat/PublicAssetCatsFilter';\r\nexport const initAssetCatData = (\r\n initval: string | undefined,\r\n sourceUrl?: CatUrl,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IAssetCatDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,GroupId,AssetCatGroupName',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n sourceUrl === 'public'\r\n ? publicUrl\r\n : sourceUrl === 'assetBase'\r\n ? assetBaseUrl\r\n : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as IAssetCatDto[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n isAuthenticated?: boolean,\r\n urlType?: CatUrl,\r\n) => {\r\n const sourceUrl =\r\n urlType === 'public' || !isAuthenticated\r\n ? publicUrl\r\n : urlType === 'assetBase'\r\n ? assetBaseUrl\r\n : url;\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name', 'GroupId', 'AssetCatGroupName', 'ServiceGroups'],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\n\r\nexport function AssetCatPicker(props: AssetCatPickerProps) {\r\n const { predicates, urlType, ...other } = props;\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n const innerLoadData = loadData(\r\n predicates,\r\n isAuth ? globalServiceGroupFilter || [] : [],\r\n isAuth,\r\n urlType,\r\n );\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport const AssetCatByCategoryFilter = (\r\n value: FilterValueType,\r\n fieldName: any,\r\n) => {\r\n if (value !== undefined && value !== null) {\r\n if (fieldName === 'AssetCatGroupId') {\r\n return [\r\n `${new Condition(\r\n 'GroupId',\r\n ODataOperators.Equals,\r\n (value as Identifiable).Id,\r\n ).toString()}`,\r\n ];\r\n }\r\n if (fieldName === 'ServiceGroupId') {\r\n return [\r\n `${new Condition('ServiceGroups', ODataOperators.AnyIn, [\r\n (value as Identifiable).Id,\r\n ]).toString()}`,\r\n ];\r\n }\r\n }\r\n return [];\r\n};\r\n","/**\r\n *\r\n * DepartmentPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface DepartmentPickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/DepartmentFilter';\r\nexport const initDepartmentData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function DepartmentPicker(props: DepartmentPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * RoomPickerFilter\r\n *\r\n */\r\nimport { RoomPicker } from 'app/components/pickers/AutocompletePickers/RoomPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const RoomPickerFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default RoomPickerFilter;\r\n","import { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { selectGlobalDbSetting_EnableLegacyScheduler } from 'app/slice/globalDbSettingsSelectors';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { ReservationDetailsProps } from '../../pages/ReservationDetails/Details';\r\nimport { ReservationQueryStringParameters } from '../../pages/ReservationDetails/Details/slice/types';\r\nimport ButtonLink, { ButtonLinkProps } from '../BasicLinks/ButtonLink';\r\n\r\nexport interface ReservationEditButtonProps extends ButtonProps {\r\n reservationId: number;\r\n useSidePanel?: boolean;\r\n}\r\n\r\nexport function ReservationEditButton({\r\n variant = 'white',\r\n size = 'small',\r\n onClick,\r\n startIcon,\r\n reservationId,\r\n useSidePanel,\r\n ...props\r\n}: ReservationEditButtonProps) {\r\n props.children = props.children ?? reservationId;\r\n const p = useReservationEditBehavior({\r\n onClick: onClick,\r\n useSidePanel: useSidePanel,\r\n });\r\n return (\r\n \r\n );\r\n}\r\nexport interface ReservationEditButtonLinkProps extends ButtonLinkProps {\r\n reservationId: number;\r\n}\r\nexport function ReservationEditButtonLink({\r\n onClick,\r\n reservationId,\r\n ...props\r\n}: ReservationEditButtonLinkProps) {\r\n props.children = props.children ?? reservationId;\r\n const p = useReservationEditBehavior({\r\n onClick: onClick,\r\n });\r\n return ;\r\n}\r\n\r\nexport interface ReservationEditBehaviorProps {\r\n onClick?: React.MouseEventHandler;\r\n useSidePanel?: boolean;\r\n}\r\nexport function useReservationEditBehavior(\r\n props: ReservationEditBehaviorProps,\r\n) {\r\n const { openPanel } = useSidePanelState();\r\n const User = useSelector(selectAuthenticatedUser);\r\n const EnableLegacyScheduler = useSelector(\r\n selectGlobalDbSetting_EnableLegacyScheduler,\r\n );\r\n return (reservationId: number) => {\r\n const params = {\r\n id: String(reservationId),\r\n un: User?.Id,\r\n } as ReservationQueryStringParameters;\r\n const handleClick = e => {\r\n if (!EnableLegacyScheduler) {\r\n openPanel({\r\n renderPageType: RenderPageType.ReservationDetails,\r\n renderPageProps: {\r\n queryParams: params,\r\n useSidePanel: true,\r\n } as ReservationDetailsProps,\r\n expanded: false,\r\n useSidePanel: props.useSidePanel,\r\n isCover: props.useSidePanel,\r\n } as SidePanelOpenState);\r\n }\r\n props.onClick?.(e);\r\n };\r\n const legacyURL: IPathAndQuery = {\r\n path: '/Reservation.aspx',\r\n search: { Edit: reservationId },\r\n };\r\n const p = EnableLegacyScheduler\r\n ? {\r\n component: ExternalLink,\r\n href: legacyURL,\r\n }\r\n : {\r\n onClick: handleClick,\r\n };\r\n return p;\r\n };\r\n}\r\n","/**\r\n *\r\n * InstituteTypePicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface InstituteTypePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/InstituteTypeFilter';\r\nexport const initInstituteTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function InstituteTypePicker(props: InstituteTypePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * Description\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport htmlParse from 'html-react-parser';\r\nimport styled from 'styled-components';\r\n\r\n/**\r\n * Predefined (column) widths\r\n */\r\ntype TextLength = 'short' | 'medium' | 'long' | 'auto';\r\n\r\nconst DEFAULT_WIDTH = 'medium';\r\n\r\nexport interface DescriptionProps\r\n extends Omit, 'children' | 'title'> {\r\n value?: string | null;\r\n //className?: string;\r\n title?: string | null | React.ReactNode;\r\n /**\r\n * predefined width - default = medium\r\n */\r\n width?: TextLength;\r\n /**\r\n * Makes a tooltip interactive, i.e. will not close when the user\r\n * hovers over the tooltip before the `leaveDelay` is expired.\r\n */\r\n interactive?: boolean;\r\n /**\r\n * The number of milliseconds to wait before hiding the tooltip.\r\n * This prop won't impact the leave touch delay (`leaveTouchDelay`).\r\n */\r\n leaveDelay?: number;\r\n /**\r\n * The number of milliseconds after the user stops touching an element before hiding the tooltip.\r\n */\r\n leaveTouchDelay?: number;\r\n}\r\n/**\r\n * Renders a long text Cell - truncates long text with a popup\r\n * @param param0 value to render\r\n * @returns\r\n */\r\nexport const Description = ({\r\n value,\r\n title,\r\n width = DEFAULT_WIDTH,\r\n interactive,\r\n leaveDelay,\r\n leaveTouchDelay,\r\n}: DescriptionProps) => {\r\n // cleanup html tags for inline display and trim white spaces\r\n\r\n const textValue = tryCleanValue(value);\r\n\r\n if (value === '' || value === null || value === undefined) {\r\n return <>;\r\n }\r\n\r\n // use the title if provided, otherwise tooltip will show full text value\r\n const titleValue = title ?? value;\r\n\r\n // parse html title value for html values e.g. remarks, email body, etc.\r\n const parsedTitle =\r\n typeof titleValue === 'string' ? htmlParse(titleValue) : titleValue;\r\n\r\n const maxChars = toCharsWidth(width);\r\n const foo =\r\n maxChars !== undefined &&\r\n maxChars > 0 &&\r\n typeof textValue === 'string' &&\r\n textValue.length > maxChars;\r\n if (foo) {\r\n return (\r\n \r\n \r\n \r\n );\r\n } else {\r\n return <>{String(textValue)};\r\n }\r\n};\r\n\r\n/***\r\n * Renders truncated text without tooltip\r\n */\r\nexport const TruncatedDescriptionText = React.forwardRef<\r\n HTMLSpanElement,\r\n DescriptionProps\r\n>(function TruncatedDescriptionText(\r\n { value, width = DEFAULT_WIDTH, title, ...props }: DescriptionProps,\r\n ref,\r\n) {\r\n if (value === '' || value === null || value === undefined) {\r\n return null;\r\n }\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n});\r\nconst Styled = styled('span')<{ width: string }>`\r\n display: inline-block;\r\n white-space: nowrap;\r\n max-width: ${props => props.width};\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n`;\r\n\r\n/**\r\n * Converts preset width to value that can be used to set css width\r\n * @param lengthType preset width\r\n * @returns\r\n */\r\nconst toCharsWidth = (lengthType?: TextLength) => {\r\n const length = lengthType ?? DEFAULT_WIDTH;\r\n switch (length) {\r\n case 'short':\r\n return 15;\r\n case 'medium':\r\n return 30;\r\n case 'long':\r\n return 70;\r\n case 'auto':\r\n return undefined;\r\n default:\r\n assertExhaustive(length);\r\n }\r\n};\r\n\r\n/**\r\n * Converts preset width to value that can be used to set css width\r\n * @param lengthType preset width\r\n * @returns\r\n */\r\nconst toCssWidth = (lengthType?: TextLength) => {\r\n const length = lengthType ?? DEFAULT_WIDTH;\r\n switch (length) {\r\n case 'short':\r\n case 'medium':\r\n case 'long':\r\n return `${toCharsWidth(length)}ch`;\r\n\r\n case 'auto':\r\n return 'auto';\r\n default:\r\n assertExhaustive(length);\r\n }\r\n};\r\n\r\nfunction tryCleanValue(value: string | null | undefined) {\r\n if (value === null || value === undefined) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n return value?.replace(/<[^>]+>/g, '')?.trim();\r\n } catch (error) {\r\n return value;\r\n }\r\n}\r\n","import clsx from 'clsx';\r\nimport {\r\n Card,\r\n CardActionArea,\r\n CardActions,\r\n CardContent,\r\n CardMedia,\r\n CardProps,\r\n Theme,\r\n useTheme,\r\n} from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { SimpleList } from 'app/components/BasicList/StyledList';\r\nimport React, { useState } from 'react';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { defaultImgSrc } from 'app/components/AssetThumbImage';\r\nimport { Body } from '../Typography';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport styled from 'styled-components';\r\nimport { bookitShadows } from 'styles/shadows/bookitShadow';\r\n// import useState from 'react-usestateref';\r\n\r\nexport type CardPosition = 'vertical' | 'horizontal';\r\nexport type CardBackground = 'white' | 'gray';\r\nexport type CardSize = 'small' | 'medium';\r\nexport type StatusType = 'info' | 'success' | 'warning' | 'error' | 'active';\r\nexport interface CardButton {\r\n key: React.Key | null | undefined;\r\n button: React.ReactNode;\r\n}\r\nexport interface CardContentRow {\r\n key: React.Key | null | undefined;\r\n label: React.ReactNode;\r\n text: React.ReactNode;\r\n}\r\nexport interface CardTopActions {\r\n key: React.Key | null | undefined;\r\n action: React.ReactNode;\r\n}\r\nexport interface DemSize {\r\n width: number;\r\n height: number;\r\n}\r\nexport interface BasicCardProps {\r\n position?: CardPosition;\r\n backStyle?: CardBackground;\r\n cardSize?: CardSize;\r\n mobileSize?: CardSize;\r\n useImage?: boolean;\r\n imageSrc?: string;\r\n showBullet?: boolean;\r\n useButtons?: boolean;\r\n useSelect?: boolean;\r\n selectVisible?: boolean;\r\n selected?: boolean;\r\n title?: React.ReactNode;\r\n disabled?: boolean;\r\n primaryAction?: () => void;\r\n checkBox?: React.ReactNode;\r\n topActions?: Array;\r\n hasTopActions?: boolean;\r\n buttons?: Array;\r\n cardContent?: React.ReactNode;\r\n cardContentRows?: Array;\r\n iconTitle?: React.ReactNode;\r\n status?: StatusType;\r\n maxContentHeight?: number;\r\n preventInnerClicks?: boolean;\r\n contentEditable?: boolean;\r\n loading?: boolean;\r\n info?: string;\r\n}\r\n\r\nexport function BasicCard(props: BasicCardProps) {\r\n const {\r\n position,\r\n cardSize,\r\n mobileSize,\r\n useButtons,\r\n useImage,\r\n useSelect,\r\n showBullet,\r\n selected,\r\n title,\r\n imageSrc,\r\n disabled,\r\n primaryAction,\r\n checkBox,\r\n topActions,\r\n buttons,\r\n cardContent,\r\n cardContentRows,\r\n selectVisible,\r\n iconTitle,\r\n status,\r\n maxContentHeight,\r\n preventInnerClicks,\r\n contentEditable,\r\n hasTopActions,\r\n loading,\r\n } = props;\r\n const theme = useTheme();\r\n const [imgError, setImageError] = React.useState(false);\r\n const imgSrc = React.useMemo(() => {\r\n return useImage\r\n ? imgError\r\n ? defaultImgSrc\r\n : imageSrc !== undefined\r\n ? imageSrc\r\n : defaultImgSrc\r\n : undefined;\r\n }, [imageSrc, imgError, useImage]);\r\n const [imageDimensions, setImageDimensions] = useState(\r\n undefined,\r\n );\r\n React.useEffect(() => {\r\n if (loading !== undefined) {\r\n if (loading === true && imageDimensions !== undefined) {\r\n setImageDimensions(undefined);\r\n }\r\n }\r\n }, [imageDimensions, loading]);\r\n const loadImage = (setImageDimensions, imageUrl) => {\r\n const img = new Image();\r\n img.src = imageUrl;\r\n img.onload = () => {\r\n setImageDimensions({\r\n height: img.height,\r\n width: img.width,\r\n });\r\n // console.debug('image loaded', img);\r\n };\r\n // img.onerror = err => {\r\n // console.log('img error');\r\n // console.error(err);\r\n // };\r\n };\r\n const backgroundSize = React.useMemo(() => {\r\n if (!!imageDimensions) {\r\n let horizontal = imageDimensions.width - imageDimensions.height > 0;\r\n if (imageDimensions.height === imageDimensions.width) {\r\n return 'contain';\r\n }\r\n if (position === 'vertical') {\r\n if (horizontal) {\r\n if (\r\n imageDimensions.height <\r\n (cardSize === 'medium' ? 180 : 150) / 1.8\r\n ) {\r\n return 'contain';\r\n } else {\r\n if (imageDimensions.width < imageDimensions.height * 1.33) {\r\n return 'contain';\r\n }\r\n return 'cover';\r\n }\r\n } else {\r\n return 'contain';\r\n }\r\n } else {\r\n if (!horizontal) {\r\n if (\r\n imageDimensions.height <\r\n (cardSize === 'medium' ? 180 : 150) / 1.8\r\n ) {\r\n return 'contain';\r\n } else {\r\n return 'cover';\r\n }\r\n } else {\r\n if (\r\n imageDimensions.width <\r\n (cardSize === 'medium' ? 180 : 150) / 1.8\r\n ) {\r\n return 'contain';\r\n } else {\r\n return 'cover';\r\n }\r\n }\r\n }\r\n }\r\n return undefined;\r\n }, [cardSize, imageDimensions, position]);\r\n const [showSelect, setShowSelect] = useState(selectVisible);\r\n React.useEffect(() => {\r\n let active =\r\n imgSrc !== undefined &&\r\n imageDimensions === undefined &&\r\n loading === false;\r\n if (active) {\r\n loadImage(setImageDimensions, imgSrc);\r\n }\r\n return () => {\r\n active = false;\r\n //setImageDimensions(undefined);\r\n };\r\n }, [imageDimensions, imgSrc, loading]);\r\n const showHeader = React.useMemo(() => {\r\n return !!title || !!iconTitle || (useSelect && showSelect) || hasTopActions;\r\n }, [iconTitle, showSelect, title, hasTopActions, useSelect]);\r\n // const headerHeight = React.useMemo(() => {\r\n // return showHeader ? 25 : 0;\r\n // }, [showHeader]);\r\n // const imageHeight = React.useMemo(() => {\r\n // return position === 'horizontal' || imgSrc === undefined\r\n // ? 0\r\n // : cardSize === 'medium'\r\n // ? 180\r\n // : 150;\r\n // }, [cardSize, imgSrc, position]);\r\n\r\n // const rowsHeight = 78;\r\n\r\n const contentHeight = React.useMemo(() => {\r\n let maxHeight = maxContentHeight || 60;\r\n return cardContent === undefined ? 0 : maxHeight;\r\n }, [cardContent, maxContentHeight]);\r\n // const otherHeight = React.useMemo(() => {\r\n // //paddings and gaps\r\n // return (\r\n // (rowsHeight > 0 || maxContentHeight === undefined\r\n // ? cardSize === 'medium'\r\n // ? 16 * 2\r\n // : 8 * 2\r\n // : 6) + (useButtons ? 16 : 8)\r\n // );\r\n // }, [cardSize, maxContentHeight, rowsHeight, useButtons]);\r\n\r\n // const buttonsHeight = React.useMemo(() => {\r\n // return useButtons ? 32 : 0;\r\n // }, [useButtons]);\r\n const [mouseUp, setMouseUp] = React.useState(false);\r\n // const [preventPrimary, setPreventPrimary] = React.useState(false);\r\n // const cardHeight = React.useMemo(() => {\r\n // return (\r\n // headerHeight + rowsHeight + buttonsHeight + otherHeight + contentHeight\r\n // );\r\n // }, [buttonsHeight, headerHeight, otherHeight, rowsHeight, contentHeight]);\r\n\r\n const trimTitleText = React.useMemo(() => {\r\n if (!!title && typeof title === 'string') {\r\n let trimmedTitle = title as string;\r\n let trimSize = cardSize === 'medium' ? 24 : 26;\r\n if (trimmedTitle.length > trimSize) {\r\n trimmedTitle = trimmedTitle.substring(0, trimSize).trim() + '...';\r\n }\r\n return trimmedTitle;\r\n }\r\n return title;\r\n }, [cardSize, title]);\r\n\r\n return (\r\n \r\n {\r\n if (useSelect) {\r\n setShowSelect(true);\r\n }\r\n }}\r\n onMouseLeave={() => {\r\n if (useSelect) setShowSelect(selectVisible);\r\n }}\r\n onMouseUp={event => {\r\n if ('type' in event.target && event.target.type === 'checkbox') {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n } else if (\r\n 'className' in event.target &&\r\n event.target.className !== undefined &&\r\n event.target.className !== null &&\r\n typeof event.target.className === 'string' &&\r\n event.target.className.indexOf('MuiCardMedia-root') > -1\r\n ) {\r\n setMouseUp(true);\r\n if (!!primaryAction) {\r\n primaryAction();\r\n }\r\n } else if (\r\n ('className' in event.target &&\r\n event.target.className !== undefined &&\r\n event.target.className !== null &&\r\n typeof event.target.className === 'string' &&\r\n event.target.className.indexOf('MuiLink-root') > -1) ||\r\n event.target?.parentElement?.nodeName === 'A'\r\n ) {\r\n setMouseUp(true);\r\n } else {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n }}\r\n onClick={() => {\r\n if (mouseUp) {\r\n setMouseUp(false);\r\n return;\r\n }\r\n if (!!primaryAction) {\r\n primaryAction();\r\n }\r\n }}\r\n >\r\n {imgSrc !== undefined && (\r\n \r\n \r\n {\r\n console.log('img event', e);\r\n }}\r\n onLoad={e => {\r\n console.log('img event', e);\r\n }}\r\n src=\"\"\r\n onError={() => setImageError(true)}\r\n >\r\n {useSelect &&\r\n (showSelect || selectVisible) &&\r\n position === 'vertical' &&\r\n !disabled &&
    {checkBox}
    }\r\n \r\n
    \r\n \r\n )}\r\n \r\n {showHeader && (\r\n
    \r\n
    \r\n {!!iconTitle && iconTitle}\r\n {title !== undefined && (\r\n
    \r\n \r\n \r\n \r\n {trimTitleText}\r\n \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n
    \r\n {(imgSrc === undefined || position === 'horizontal') &&\r\n useSelect &&\r\n (showSelect || selectVisible) &&\r\n !disabled && {checkBox}}\r\n {!!topActions &&\r\n topActions.map(c => {\r\n return (\r\n e.stopPropagation()}>\r\n {c.action}\r\n \r\n );\r\n })}\r\n
    \r\n
    \r\n )}\r\n {!!cardContent && (\r\n
    \r\n {cardContent}\r\n
    \r\n )}\r\n {!!cardContentRows && cardContentRows.length > 0 && (\r\n \r\n {cardContentRows.map(c => {\r\n return (\r\n
  • \r\n {showBullet && (\r\n \r\n )}\r\n\r\n {\r\n if (preventInnerClicks) {\r\n e.preventDefault();\r\n }\r\n }}\r\n className={'rowOverRule'}\r\n >\r\n \r\n {c.label}\r\n \r\n \r\n {c.text}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n \r\n )}\r\n\r\n {useButtons && !!buttons && (\r\n \r\n
    \r\n {buttons.map(c => {\r\n return (\r\n e.stopPropagation()}>\r\n {c.button}\r\n \r\n );\r\n })}\r\n
    \r\n {status !== undefined && (\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 ImageContainer = styled('div')(({ theme }) => ({\r\n '&.imgContainer': {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '10px',\r\n alignSelf: 'stretch',\r\n background: `${bookitColors.base.white}`,\r\n borderRadius: '12px 12px 0px 0px',\r\n '&.position_horizontal': {\r\n borderRadius: '12px 0px 0px 12px',\r\n '&.mobileSizeMedium, &.mobileSizeSmall': {\r\n padding: '16px 0px 16px 16px',\r\n },\r\n },\r\n '&.position_vertical': {\r\n '&.cardSize_medium': {\r\n height: '180px',\r\n },\r\n '&.cardSize_small': {\r\n height: '150px',\r\n },\r\n },\r\n '& .frame': {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n justifyContent: 'center',\r\n gap: '10px',\r\n flex: '1 0 0',\r\n alignSelf: 'stretch',\r\n borderRadius: '12px 12px 0px 0px',\r\n background: `${bookitColors.grayscale.graySelection}`,\r\n '&.position_horizontal': {\r\n height: 'auto',\r\n borderRadius: '12px 0px 0px 12px',\r\n '&.mobileSizeMedium': {\r\n alignItems: 'center',\r\n //padding: '16px 0px',\r\n borderRadius: '8px',\r\n height: '80px',\r\n },\r\n '&.mobileSizeSmall': {\r\n alignItems: 'center',\r\n //padding: '16px 0px',\r\n borderRadius: '8px',\r\n height: '64px',\r\n },\r\n },\r\n '& .mediaStyles': {\r\n imageRendering: '-webkit-optimize-contrast',\r\n backgroundSize: 'auto',\r\n width: '100%',\r\n backgroundBlendMode: 'multiply',\r\n minWidth: 'unset',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: 15,\r\n // '&.position_vertical': {\r\n // height: '100%',\r\n // width: '100%',\r\n // },\r\n '& .checkTop': {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n padding: '5px',\r\n borderRadius: '8px',\r\n },\r\n '&.position_horizontal': {\r\n height: '100%',\r\n minWidth: '64px',\r\n '&.cardSize_small': {\r\n width: '150px',\r\n '&.mobileSizeMedium': {\r\n width: '80px',\r\n height: '80px',\r\n },\r\n '&.mobileSizeSmall': {\r\n width: '64px',\r\n height: '64px',\r\n },\r\n },\r\n '&.cardSize_medium': {\r\n width: '180px',\r\n '&.mobileSizeMedium': {\r\n width: '80px',\r\n height: '80px',\r\n },\r\n '&.mobileSizeSmall': {\r\n width: '64px',\r\n height: '64px',\r\n },\r\n },\r\n },\r\n '&.position_vertical': {\r\n '&.cardSize_small': {\r\n height: 0,\r\n paddingTop: 150,\r\n },\r\n '&.cardSize_medium': {\r\n height: 0,\r\n paddingTop: 180,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n}));\r\nexport const StyledCard = styled(\r\n ({\r\n theme,\r\n children,\r\n ...other\r\n }: {\r\n theme: Theme;\r\n children: React.ReactNode;\r\n } & CardProps) => {children},\r\n)({\r\n '&.card': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n //justifyContent: 'flex-start',\r\n justifyContent: 'center',\r\n alignItems: 'flex-start',\r\n borderRadius: '12px',\r\n padding: 0,\r\n flex: '1 0 0',\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n boxShadow: 'unset',\r\n height: '100%',\r\n '&.cardActive': {\r\n boxShadow: bookitShadows.shadowS,\r\n border: `1px solid ${bookitColors.primary.components}`,\r\n background: bookitColors.primary.background,\r\n '&.cardInfo': {\r\n border: `1px solid ${bookitColors.primary.borders}`,\r\n background: bookitColors.primary.bgLight,\r\n },\r\n '&.cardSuccess': {\r\n border: `1px solid ${bookitColors.success.components}`,\r\n background: bookitColors.success.background,\r\n },\r\n '&.cardWarning': {\r\n border: `1px solid ${bookitColors.warning.components}`,\r\n background: bookitColors.warning.background,\r\n },\r\n '&.cardError': {\r\n border: `1px solid ${bookitColors.danger.components}`,\r\n background: bookitColors.danger.background,\r\n },\r\n // boxShadow: `2px 1px 1px -2px ${bookitColors.primary.components}, 0px 0px 1px 2px ${bookitColors.primary.components}, 0px 1px 1px 0px ${bookitColors.primary.components}`,\r\n },\r\n\r\n '& .cardActionArea': {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n flexDirection: 'column',\r\n alignSelf: 'stretch',\r\n borderRadius: '12px',\r\n height: '100%',\r\n '&.position_horizontal': {\r\n flexDirection: 'row',\r\n },\r\n //border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n '&.disabled': {\r\n backgroundColor: `${bookitColors.grayscale.grayBorders}`,\r\n },\r\n '&:hover': {\r\n opacity: 1,\r\n boxShadow: bookitShadows.shadowS,\r\n // border: `1px solid ${bookitColors.primary.components}`,\r\n background: bookitColors.primary.background,\r\n '&.cardInfo': {\r\n //border: `1px solid ${bookitColors.primary.borders}`,\r\n background: bookitColors.primary.bgLight,\r\n },\r\n '&.cardSuccess': {\r\n //border: `1px solid ${bookitColors.success.components}`,\r\n background: bookitColors.success.background,\r\n },\r\n '&.cardWarning': {\r\n //border: `1px solid ${bookitColors.warning.components}`,\r\n background: bookitColors.warning.background,\r\n },\r\n '&.cardError': {\r\n //border: `1px solid ${bookitColors.danger.components}`,\r\n background: bookitColors.danger.background,\r\n },\r\n },\r\n '& .cardContent': {\r\n // height: props => props.cardHeight - props.imageHeight, //isMobile ? 'auto' : `${cardcurrentHeight - 84}px`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n gap: 8,\r\n alignSelf: 'stretch',\r\n height: '100%',\r\n justifyContent: 'space-between',\r\n '&.cardSize_small': {\r\n padding: '8px 12px 12px 12px',\r\n },\r\n '&.cardSize_medium': {\r\n padding: '16',\r\n },\r\n '& .cardTitle': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n height: '25px',\r\n '& .title': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n gap: 8,\r\n '& .titleOverRule': {\r\n display: 'inline-block',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: '26ch',\r\n // [theme.breakpoints.down('sm')]: {\r\n // maxWidth: '29ch',\r\n // },\r\n },\r\n },\r\n '& .checkWithAction': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n gap: 8,\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n },\r\n },\r\n '& .content': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n margin: 0,\r\n gap: '8px',\r\n flexGrow: 1,\r\n overflowY: 'auto',\r\n overflowX: 'clip',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n '& .cardContentRows': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n margin: 0,\r\n gap: '8px',\r\n flexGrow: 2,\r\n overflowY: 'clip',\r\n overflowX: 'clip',\r\n height: '78px',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: bookitColors.grayscale.grayBorders,\r\n },\r\n '&.position_horizontal': {\r\n '& .contentRow': {\r\n '& .rowOverRule': {\r\n '& .rowTitle': {\r\n maxWidth: '14ch',\r\n },\r\n // '& .rowText': {\r\n // maxWidth: '14ch',\r\n // },\r\n },\r\n },\r\n '&.mobileSizeMedium, &.mobileSizeSmall': {\r\n '& .contentRow': {\r\n '& .rowOverRule': {\r\n '& .rowTitle': {\r\n maxWidth: '12ch',\r\n },\r\n // '& .rowText': {\r\n // maxWidth: '12ch',\r\n // },\r\n },\r\n },\r\n },\r\n },\r\n '& .contentRow': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: 8,\r\n height: 'auto',\r\n //height: '20px',\r\n // width: '100%',\r\n '& .rowOverRule': {\r\n display: 'flex',\r\n width: '100%',\r\n alignItems: 'flex-start',\r\n // whiteSpace: 'pre',\r\n // overflow: 'hidden',\r\n // textOverflow: 'ellipsis',\r\n // maxWidth: '36ch',\r\n '& .rowTitle': {\r\n color: bookitColors.grayscale.graySubtitles,\r\n paddingRight: 8,\r\n display: 'inline',\r\n whiteSpace: 'pre',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: '16ch',\r\n },\r\n '& .rowText': {\r\n color: bookitColors.grayscale.blackRegular,\r\n display: 'inline',\r\n whiteSpace: 'pre',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n //maxWidth: '18ch',\r\n '& > *': {\r\n display: 'initial',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n '& .cardActions': {\r\n justifyContent: 'space-between',\r\n padding: '0px',\r\n gap: 8,\r\n width: '100%',\r\n '& .cardActionsButtons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n gap: 8,\r\n justifyContent: 'flex-start',\r\n width: '100%',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n});\r\n\r\nexport const BasicCardWithInfo = (props: BasicCardProps) => {\r\n const { info, ...other } = props;\r\n return info ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n};\r\n","import { AssetLink } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport { CellProps, Renderer } from 'react-table';\r\nimport { IAssetRelated } from 'types/IAssetRelated';\r\n\r\n/**\r\n * Renders an Asset Link (Popup/sidepanel)\r\n * Requires for the AssetId property to be present on the row, otherwise the value is rendered without the link\r\n * @param param0\r\n * @returns\r\n */\r\nconst AssetRenderer: Renderer> = ({\r\n row: { original },\r\n value,\r\n}) =>\r\n !!original.AssetId ? (\r\n {value}\r\n ) : (\r\n <>{value}\r\n );\r\nexport default AssetRenderer;\r\n","import {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { Entity } from 'types/common';\r\nimport { IsEmptyArray, IsEntity } from '../BasicFilter/AppliedFilterComponent';\r\n\r\nimport { FilterValueType } from '../BasicFilter/FilterValueType';\r\n\r\nconst extractValuePart = function (\r\n value: FilterValueType | undefined,\r\n): FilterValueType | undefined {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n if (value === null) {\r\n return undefined;\r\n }\r\n if (IsEntity(value)) {\r\n return (value as Entity).Id;\r\n }\r\n\r\n return value;\r\n};\r\n\r\nexport function TableFilterBuilder>(\r\n appliedFilters?: Array>,\r\n globalFilterValue?: string | undefined,\r\n serviceGroups?: Entity[],\r\n searchColumns?: Array,\r\n additionalFilters?: (string | Condition)[],\r\n multipleServiceGroups?: boolean,\r\n) {\r\n return new ODataFilterBuilder({\r\n predicates: ((appliedFilters || [])\r\n .map(filterSettingToCondition)\r\n .filter(f => f !== null)\r\n .filter(f => f !== undefined) as (string | Condition)[]).concat(\r\n additionalFilters ?? [],\r\n ),\r\n globalServiceGroupFilter:\r\n serviceGroups === undefined || serviceGroups.length === 0\r\n ? undefined\r\n : [\r\n new Condition(\r\n multipleServiceGroups ? 'ServiceGroups' : 'ServiceGroupId',\r\n multipleServiceGroups\r\n ? ODataOperators.AnyIn\r\n : ODataOperators.Includes,\r\n serviceGroups,\r\n multipleServiceGroups ? 'Id' : undefined,\r\n ),\r\n ],\r\n stringColumns: searchColumns || [],\r\n stringSearch: globalFilterValue,\r\n }).toString();\r\n}\r\n\r\nexport function filterSettingToCondition>(\r\n filter: IFilterSettings,\r\n index: number,\r\n array: Array>,\r\n) {\r\n if (typeof filter === 'string') {\r\n return filter;\r\n }\r\n if (\r\n filter.value === undefined ||\r\n filter.value === null ||\r\n IsEmptyArray(filter.value)\r\n ) {\r\n return undefined;\r\n }\r\n if (filter.customFilter) {\r\n return filter.customFilter(filter.value, filter, array);\r\n }\r\n\r\n var value = extractValuePart(filter.value);\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n\r\n return new Condition(\r\n filter.fieldName,\r\n filter.operator,\r\n value,\r\n filter.fieldName1,\r\n filter.isInversed,\r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { call, put, select, takeLatest, takeLeading } from 'redux-saga/effects';\r\nimport { push } from 'connected-react-router';\r\nimport { internalIdLoginActions as actions } from '.';\r\nimport { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { LoginTypes, Roles } from 'app/slice/types';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\n\r\nconst SESSIONSTORAGE_KEY = 'internalIdLogin';\r\nfunction storeInternalIdLogin(item: IAuthenticatedUser | null): void {\r\n if (item === null) {\r\n sessionStorage.removeItem(SESSIONSTORAGE_KEY);\r\n } else {\r\n sessionStorage.setItem(SESSIONSTORAGE_KEY, JSON.stringify(item));\r\n }\r\n}\r\nfunction loadInternalIdLogin(): IAuthenticatedUser | null {\r\n const s = sessionStorage.getItem(SESSIONSTORAGE_KEY);\r\n if (s === null) {\r\n return null;\r\n }\r\n const d = JSON.parse(s);\r\n const f = d as IAuthenticatedUser;\r\n return f;\r\n}\r\nfunction* doInit(action: PayloadAction<{ isLargeAnimals: boolean }>) {\r\n // /try get identity stored in sessionstorage (saved during internalid entry)\r\n try {\r\n const storedIdentity: IAuthenticatedUser | null = yield call(\r\n loadInternalIdLogin,\r\n );\r\n if (storedIdentity !== null) {\r\n yield put(actions.success(storedIdentity));\r\n yield put(actions.init_success());\r\n return;\r\n }\r\n } catch (error: unknown) {\r\n console.error('ap init error', error);\r\n }\r\n\r\n // simulate internalid login for technicians so that they'll be able to enter the Kiosk cases list/details\r\n const user = yield select(selectAuthenticatedUser);\r\n if (!isNullOrUndefined(user)) {\r\n if (\r\n action.payload.isLargeAnimals &&\r\n user.Roles.indexOf(Roles.LargeAnimalsOperatingRoomTechnician) >= 0\r\n ) {\r\n yield put(actions.success(user));\r\n yield put(actions.init_success());\r\n return;\r\n }\r\n }\r\n\r\n yield put(actions.init_success());\r\n}\r\nfunction* doLogin(\r\n action: PayloadAction<{ internalId: string; General: boolean }>,\r\n) {\r\n const httpPayload = {\r\n internalId: action.payload.internalId,\r\n General: action.payload.General,\r\n };\r\n try {\r\n // send authentication request\r\n const requestURL = '/api/account/internalidlogin';\r\n const result = yield call(httpClient.post, requestURL, httpPayload);\r\n result.LoginType = LoginTypes.InternalId;\r\n //store authentication result in session storage\r\n yield call(storeInternalIdLogin, result);\r\n yield put(actions.success(result));\r\n } catch (err) {\r\n yield put(actions.error(err));\r\n }\r\n}\r\nfunction* doRedirectToLogin() {\r\n yield call(storeInternalIdLogin, null);\r\n yield put(push('/internalidlogin'));\r\n}\r\nexport function* internalIdLoginSaga() {\r\n yield takeLatest(actions.login.type, doLogin);\r\n yield takeLeading(actions.redirectToLogin, doRedirectToLogin);\r\n yield takeLeading(actions.logout, doRedirectToLogin);\r\n yield takeLatest(actions.init.type, doInit);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { internalIdLoginSaga } from './saga';\r\nimport { InternalIdLoginState } from './types';\r\n\r\nexport const initialState: InternalIdLoginState = {\r\n processing: false,\r\n error: false,\r\n internalId: '',\r\n initialized: false,\r\n isLargeAnimals: true,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'internalIdLogin',\r\n initialState,\r\n reducers: {\r\n init(\r\n state,\r\n action: PayloadAction<{ isLargeAnimals: boolean; returnUrl?: string }>,\r\n ) {\r\n state.isLargeAnimals = action.payload.isLargeAnimals;\r\n state.initialized = false;\r\n state.returnUrl = action.payload.returnUrl;\r\n },\r\n init_success(state, action: PayloadAction) {\r\n state.initialized = true;\r\n },\r\n login(\r\n state,\r\n action: PayloadAction<{ internalId: string; General: boolean }>,\r\n ) {\r\n state.processing = true;\r\n state.error = false;\r\n },\r\n success(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.identity = action.payload;\r\n state.internalId = '';\r\n },\r\n error(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.identity = undefined;\r\n state.error = true;\r\n state.internalId = '';\r\n },\r\n clearError(state, action: PayloadAction) {\r\n state.error = false;\r\n state.processing = false;\r\n },\r\n redirectToLogin(state, action: PayloadAction) {},\r\n logout(state, action: PayloadAction) {\r\n state.identity = undefined;\r\n state.internalId = '';\r\n state.processing = false;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: internalIdLoginActions } = slice;\r\n\r\nexport const useInternalIdLoginSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: internalIdLoginSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useInternalIdLoginSlice();\r\n *E\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { UserMultiPicker } from '../pickers/AutocompletePickers/UserMultiPicker';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\n\r\nexport const FormUsersPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig[] | null> & {\r\n selectArray?: Array;\r\n} & IFieldProps) => {\r\n const [field, meta, helpers] = useField[] | null>(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n disabled={props.disabled}\r\n onBlur={field?.onBlur}\r\n value={field.value as IUserFilterDto[]}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n selectArray={props.selectArray}\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * SubLocationListPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ISubLocationListDto } from 'api/odata/generated/entities/ISubLocationListDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface SubLocationListPickerProps\r\n extends Omit, 'loadData'> {\r\n withoutServiceGroups?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/SubLocationList';\r\nexport const initSubLocationListData = (\r\n initval: string | undefined,\r\n): Promise => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as ISubLocationListDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as ISubLocationListDto[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter?: Entity[],\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'LocationListId',\r\n 'LocationListLocationType',\r\n 'LocationListLocationType1Name',\r\n 'LocationListName',\r\n 'LocationType',\r\n 'LocationTypeId',\r\n 'RoomId',\r\n 'RoomName',\r\n 'ServiceGroups',\r\n ],\r\n globalServiceGroupFilter:\r\n globalServiceGroupFilter?.map(\r\n serviceGroup =>\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n serviceGroup.Id,\r\n 'Id',\r\n ),\r\n ) ?? [],\r\n isOptionalServiceGroup: true,\r\n });\r\n\r\nexport function SubLocationListPicker(props: SubLocationListPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n !props.withoutServiceGroups\r\n ? globalServiceGroupFilter || undefined\r\n : undefined,\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * MultiSelectBasicPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n AutocompleteMultiPicker,\r\n AutocompleteMultiPickerProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPicker';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface BaseOptionsMultiPickerProps\r\n extends Omit, 'loadData'> {\r\n getOptions: (searchTerm: string | null) => Entity[];\r\n}\r\n\r\nexport function BaseOptionsMultiPicker(\r\n props: BaseOptionsMultiPickerProps,\r\n) {\r\n const { getOptions, ...other } = props;\r\n const loadData = async (searchTerm: string | null): Promise =>\r\n new Promise(resolve => {\r\n const opts = getOptions(searchTerm);\r\n resolve(opts);\r\n });\r\n return ;\r\n}\r\n","import { RootState } from 'types';\r\nimport { createSelector } from '@reduxjs/toolkit';\r\n\r\nconst selectRouterSlice = (state: RootState) => {\r\n return state.router;\r\n};\r\nexport const selectRouterLocation = createSelector(\r\n [selectRouterSlice],\r\n state => state?.location,\r\n);\r\nexport const selectRouterAction = createSelector(\r\n [selectRouterSlice],\r\n state => state?.action,\r\n);\r\nexport const selectRouterSearch = createSelector(\r\n [selectRouterLocation],\r\n state => state?.search,\r\n);\r\nexport const selectRouterSearchParams = createSelector(\r\n [selectRouterSearch],\r\n state => new URLSearchParams(state),\r\n);\r\nexport const selectRouterPathname = createSelector(\r\n [selectRouterLocation],\r\n state => state?.pathname,\r\n);\r\n","export enum BudgetExperimentStatuses {\r\n Draft = 0,\r\n Pending = 1,\r\n Approved = 2,\r\n Rejected = 3,\r\n}\r\n","export enum OnlineServiceType {\r\n Software = 0,\r\n Relay = 1,\r\n IpRelay = 2,\r\n UsageForm = 3,\r\n DoorAccess = 4,\r\n WebRelayTm = 5,\r\n NiDAQmx = 7,\r\n LoanDesk = 6,\r\n Room = 10,\r\n KmTronicRelay = 11,\r\n WebRelayX600m = 12,\r\n RaspberryPi = 13,\r\n}\r\n","/**\r\n *\r\n * FundingTypePicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { selectAppSettings, selectglobalSettings } from 'app/slice/selectors';\r\nimport { OnlineServiceType } from 'enums/OnlineServiceTypeEnum';\r\nimport { useSelector } from 'react-redux';\r\nimport { AppSettings, IsModuleEnabled } from 'types/AppSettings';\r\nimport { Entity } from 'types/common';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\n\r\nexport interface OnlineServiceTypePickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const getSingleOnlineServiceType = (val: number): Entity => {\r\n return enumToEntityArray(OnlineServiceType).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\nexport const GetAvailableOnlineServiceTypes = (\r\n items: Entity[],\r\n appSettings: AppSettings | null,\r\n roomsEnabled: boolean,\r\n) => {\r\n return items.filter(f => {\r\n if (f.Id === OnlineServiceType.Software) {\r\n return IsModuleEnabled(appSettings, KnownModules.LocalApp);\r\n }\r\n if (f.Id === OnlineServiceType.Relay) {\r\n return IsModuleEnabled(appSettings, KnownModules.Relay);\r\n }\r\n if (f.Id === OnlineServiceType.IpRelay) {\r\n return IsModuleEnabled(appSettings, KnownModules.IpRelay);\r\n }\r\n if (f.Id === OnlineServiceType.WebRelayTm) {\r\n return IsModuleEnabled(appSettings, KnownModules.WebRelayTm);\r\n }\r\n if (f.Id === OnlineServiceType.WebRelayX600m) {\r\n return IsModuleEnabled(appSettings, KnownModules.WebRelayX600m);\r\n }\r\n if (f.Id === OnlineServiceType.UsageForm) {\r\n return IsModuleEnabled(appSettings, KnownModules.UsageForm);\r\n }\r\n if (f.Id === OnlineServiceType.LoanDesk) {\r\n return IsModuleEnabled(appSettings, KnownModules.LoanDesk);\r\n }\r\n if (f.Id === OnlineServiceType.DoorAccess) {\r\n return IsModuleEnabled(appSettings, KnownModules.DoorAccess);\r\n }\r\n if (f.Id === OnlineServiceType.Room) {\r\n return roomsEnabled;\r\n }\r\n if (f.Id === OnlineServiceType.NiDAQmx) {\r\n return IsModuleEnabled(appSettings, KnownModules.NiDAQmx);\r\n }\r\n if (f.Id === OnlineServiceType.KmTronicRelay) {\r\n return IsModuleEnabled(appSettings, KnownModules.KmTronicRelay);\r\n }\r\n if (f.Id === OnlineServiceType.RaspberryPi) {\r\n return IsModuleEnabled(appSettings, KnownModules.RaspberryPi);\r\n }\r\n return false;\r\n });\r\n};\r\nexport const initOnlineServiceTypeData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n enumToEntityArray(OnlineServiceType).filter(item => {\r\n return item.Id.toString() === initval;\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nexport function OnlineServiceTypePicker(props: OnlineServiceTypePickerProps) {\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const roomsEnabled = settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.RoomUserRoleEnabled],\r\n );\r\n const getOptions = (searchTerm: string | null) => {\r\n let items = GetAvailableOnlineServiceTypes(\r\n enumToEntityArray(OnlineServiceType),\r\n appSettings,\r\n roomsEnabled,\r\n );\r\n\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n };\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { AllowedToRender, RenderTypes } from './renderTypes';\r\n\r\nexport function useAssetsPermissions() {\r\n const user = useSelector(selectAuthenticatedUser);\r\n\r\n const allowedToView = React.useCallback(\r\n (rows: IAssetDto[], render: RenderTypes): boolean => {\r\n if (!user) return false;\r\n return rows.every(f => AllowedToRender(user, render, f));\r\n },\r\n [user],\r\n );\r\n return {\r\n allowedToView,\r\n };\r\n}\r\n","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport {\r\n Box,\r\n Divider,\r\n Grid,\r\n ListItemText,\r\n MenuItem,\r\n MenuList,\r\n Popover,\r\n} from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport {\r\n AssetsFilterForWorkOrder,\r\n AssetsPicker,\r\n} from 'app/components/pickers/MultiSelectPickers/AssetsPicker/index';\r\nimport { initWOTypeDataParams } from 'app/components/pickers/AutocompletePickers/WorkOrderTypePicker';\r\nimport { WorkOrderQueryStringParameters } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/types';\r\nimport { GetRawValue } from 'app/components/BasicTable/types/FilterParam';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { WorkOrderDetailsProps } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface AddWorkOrderProps {\r\n rows: TRow[];\r\n getAssets: (rows: TRow[]) => Promise;\r\n downtime?: boolean;\r\n buttonName?: string;\r\n primary?: boolean;\r\n useSidePanel?: boolean;\r\n openPanelWithCover?: (state: SidePanelOpenState) => void;\r\n}\r\nconst WorkButton = props => {\r\n return (\r\n }\r\n endIcon={}\r\n onClick={props.handleClick}\r\n aria-controls={props.id}\r\n aria-haspopup=\"true\"\r\n >\r\n {props.buttonName}\r\n \r\n );\r\n};\r\nexport function AddWorkOrder({\r\n rows,\r\n getAssets,\r\n downtime,\r\n buttonName,\r\n primary,\r\n useSidePanel,\r\n openPanelWithCover,\r\n}: AddWorkOrderProps) {\r\n const { t } = useTranslation();\r\n const location = useLocation();\r\n const { openPanel } = useSidePanelState();\r\n const [assets, setAssets] = React.useState([]);\r\n const [workTypes, setWorkTypes] = React.useState<\r\n IWorkOrderTypeDto[] | undefined\r\n >(undefined);\r\n const [workTypeLoading, setWorkTypeLoading] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [assetLoading, setAssetLoading] = React.useState(\r\n undefined,\r\n );\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const [open, setOpen] = React.useState(false);\r\n const handleAssetChange = React.useCallback((value: IAssetDto[] | []) => {\r\n setAssets(value);\r\n setWorkTypeLoading(undefined);\r\n // setWorkTypeLoading(true);\r\n // initWOTypeDataParams(value, undefined, downtime).then(types => {\r\n // setWorkTypes(types);\r\n // setWorkTypeLoading(false);\r\n // });\r\n }, []);\r\n const getParamFromUrl = (name: string): string | undefined => {\r\n return GetRawValue(new URLSearchParams(location.search), name) ?? undefined;\r\n };\r\n const handleWorkTypeClick = (event: IWorkOrderTypeDto) => {\r\n let params = {\r\n queryParams: {\r\n id: undefined,\r\n aType: event.Id.toString(),\r\n down: (downtime === true && event.AssetAlertType).toString(),\r\n source: getParamFromUrl('source'),\r\n Up: getParamFromUrl('Up'),\r\n title: getParamFromUrl('title'),\r\n eStart: getParamFromUrl('eStart'),\r\n sympt: getParamFromUrl('sympt'),\r\n aStatus: getParamFromUrl('aStatus'),\r\n aStart: getParamFromUrl('aStart'),\r\n desc: getParamFromUrl('desc'),\r\n assetId: !!assets ? assets.map(a => a.Id).join(',') : undefined,\r\n offH: (downtime === true && event.AssetAlertType).toString(),\r\n offStart: getParamFromUrl('offStart'),\r\n offEnd: getParamFromUrl('offStart'),\r\n reason: getParamFromUrl('reason'),\r\n eqid: getParamFromUrl('eqid'),\r\n sid: getParamFromUrl('sid'),\r\n } as WorkOrderQueryStringParameters,\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps;\r\n const panelProps = {\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: params,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState;\r\n\r\n !!openPanelWithCover\r\n ? openPanelWithCover(panelProps)\r\n : openPanel(panelProps);\r\n setOpen(false);\r\n };\r\n React.useEffect(() => {\r\n let active =\r\n open && !assetLoading && (assets === undefined || assets?.length < 1);\r\n if (active) {\r\n setAssetLoading(true);\r\n getAssets(rows).then(ass => {\r\n setAssets(() => ass);\r\n setAssetLoading(false);\r\n });\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [assetLoading, assets, getAssets, open, rows]);\r\n React.useEffect(() => {\r\n let active =\r\n open && !!assets && assets.length > 0 && workTypeLoading === undefined;\r\n if (active) {\r\n setWorkTypeLoading(true);\r\n initWOTypeDataParams(assets, undefined, downtime).then(types => {\r\n setWorkTypes(types);\r\n setWorkTypeLoading(false);\r\n });\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [assets, downtime, open, workTypeLoading]);\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n setOpen(prev => !prev);\r\n };\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n {t(translations.CreateAnAssetRelatedEvent)}\r\n \r\n {\r\n setOpen(false);\r\n setAssets([]);\r\n setWorkTypes([]);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n handleAssetChange(value);\r\n }}\r\n placeholder={t(translations.QuickWorkOrderPleaseSelectAssets)}\r\n fullWidth={true}\r\n name=\"assets\"\r\n variant=\"filled\"\r\n id=\"asset-id\"\r\n restrictByAvType=\"serviceRelated\"\r\n label={t(translations.Asset)}\r\n value={assets || undefined}\r\n />\r\n \r\n \r\n {assets && assets.length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.PleaseSelectAnEventType)}\r\n \r\n \r\n \r\n {workTypeLoading ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : workTypes && workTypes.length > 0 ? (\r\n workTypes.map(wt => (\r\n {\r\n handleWorkTypeClick(wt);\r\n setAssets([]);\r\n setWorkTypes([]);\r\n }}\r\n >\r\n \r\n {wt.Name}\r\n \r\n \r\n ))\r\n ) : (\r\n \r\n \r\n {t(translations.NoAlertTypesFoundForSelectedAssets)}\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","import { InputBaseComponentProps } from '@material-ui/core';\r\nimport { httpClient } from 'api/HttpClient';\r\n\r\nimport {\r\n AutocompleteMultiPickerEx,\r\n AutocompleteMultiPickerExProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface MyAssetAvailabilityTypeMultiPickerProps\r\n extends Omit>, 'loadData'> {\r\n inputProps?: InputBaseComponentProps;\r\n urlType?: 'allServices' | 'onlineServices';\r\n}\r\n\r\nconst url = '/api/odata/v4/AvailabilityTypesFilter/GetMyAsset';\r\nconst onlineUrl = '/api/odata/v4/AvailabilityTypesFilter/GetOnlineMyAsset';\r\nexport const initMyAssetAvailabilityTypeMultiData = (\r\n initval: string | undefined,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const ids = initval.split('|').map(v => parseInt(v));\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Id asc', //Must be ordered by ID to prevent re-rendering as a result of reordering.\r\n $filter: '(Id in (' + ids.join(',') + '))',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: ids.length,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nexport const initMyAssetAvailabilityTypeOnlineMultiData = (\r\n initval: string | undefined,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const ids = initval.split('|').map(v => parseInt(v));\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Id asc', //Must be ordered by ID to prevent re-rendering as a result of reordering.\r\n $filter: '(Id in (' + ids.join(',') + '))',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: ids.length,\r\n };\r\n return httpClient\r\n .get(onlineUrl, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nexport function MyAssetAvailabilityTypeMultiPicker(\r\n props: MyAssetAvailabilityTypeMultiPickerProps,\r\n) {\r\n const loadData = getAutoCompleteLoadDataFn>({\r\n url:\r\n !!props.urlType && props.urlType === 'onlineServices' ? onlineUrl : url,\r\n predicates: props.predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name'],\r\n });\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import { useAppSettingsSlice } from 'app/slice';\r\nimport { useCallback } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { IResponseType } from 'types/ResponseType';\r\n\r\nexport const useResponseModel = () => {\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const res = useCallback(\r\n (result: IResponseType) => {\r\n dispatch(\r\n actions.addNotifications(\r\n result.ErrorMessages.map(e => {\r\n return { variant: 'error', message: e };\r\n }),\r\n ),\r\n );\r\n dispatch(\r\n actions.addNotifications(\r\n result.WarningMessages.map(e => {\r\n return { variant: 'warning', message: e };\r\n }),\r\n ),\r\n );\r\n dispatch(\r\n actions.addNotifications(\r\n result.SuccessMessages.map(e => {\r\n return { variant: 'success', message: e };\r\n }),\r\n ),\r\n );\r\n },\r\n [dispatch, actions],\r\n );\r\n return res;\r\n};\r\n","import Badge from '@material-ui/core/Badge';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport * as React from 'react';\r\nimport { IconButton } from '../IconButton';\r\n\r\nexport interface FilterIconButtonProps {\r\n filterLength: number;\r\n handleClick: React.MouseEventHandler;\r\n innerRef?: React.RefObject;\r\n}\r\n\r\nexport function FilterIconButton({\r\n filterLength: filterLengs,\r\n handleClick: onClick,\r\n ...props\r\n}: FilterIconButtonProps) {\r\n return (\r\n \r\n \r\n 0 ? 'primary' : 'default'}\r\n colorExtend={filterLengs > 0 ? 'main' : 'dark'}\r\n />\r\n \r\n \r\n );\r\n}\r\n","import { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { selectGlobalDbSetting_EnableLegacyScheduler } from 'app/slice/globalDbSettingsSelectors';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { ReservationDetailsProps } from '../../pages/ReservationDetails/Details';\r\nimport { ReservationQueryStringParameters } from '../../pages/ReservationDetails/Details/slice/types';\r\n\r\nexport interface ReservationCreateButtonProps extends ButtonProps {\r\n instruments: number[];\r\n useSidePanel?: boolean;\r\n openPanelOrCover?: (state: SidePanelOpenState) => void;\r\n}\r\nexport function ReservationCreateButton({\r\n variant = 'white',\r\n size = 'small',\r\n onClick,\r\n startIcon,\r\n instruments,\r\n useSidePanel,\r\n openPanelOrCover,\r\n ...props\r\n}: ReservationCreateButtonProps) {\r\n const { openPanel } = useSidePanelState();\r\n const User = useSelector(selectAuthenticatedUser);\r\n const EnableLegacyScheduler = useSelector(\r\n selectGlobalDbSetting_EnableLegacyScheduler,\r\n );\r\n\r\n const params = {\r\n selectedIds: String(instruments.join(',')),\r\n un: User?.Id,\r\n } as ReservationQueryStringParameters;\r\n\r\n const handleClick = e => {\r\n if (!EnableLegacyScheduler) {\r\n const openProps = {\r\n renderPageType: RenderPageType.ReservationDetails,\r\n renderPageProps: {\r\n useSidePanel: true,\r\n queryParams: params,\r\n } as ReservationDetailsProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState;\r\n !!openPanelOrCover ? openPanelOrCover(openProps) : openPanel(openProps);\r\n }\r\n onClick?.(e);\r\n };\r\n const legacyURL: IPathAndQuery = {\r\n path: '/Reservation.aspx',\r\n search: { id: instruments.join(',') },\r\n };\r\n const p = EnableLegacyScheduler\r\n ? {\r\n component: ExternalLink,\r\n href: legacyURL,\r\n }\r\n : {};\r\n return (\r\n }\r\n onClick={handleClick}\r\n target={EnableLegacyScheduler ? '_blank' : undefined}\r\n {...p}\r\n {...props}\r\n />\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport Scheduler, { SchedulerProps } from './Scheduler';\r\nimport { useSchedulerSlice } from './Scheduler/slice';\r\nimport { IViewState, ViewLengths, ViewTypes } from './Scheduler/slice/types';\r\nimport {\r\n IWithSavedHistoryComponentProps,\r\n withSavedHistoryT,\r\n} from 'app/components/BasicTable/withSavedHistory';\r\n\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { presetPeriodToViewLength } from './Scheduler/utils/parseLength';\r\nimport { SchedulerDatePositionUnion } from 'app/components/BasicTable/Filters/DatesPeriodFilter';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { CalendarHeader } from './Scheduler/components/CalendarHeader';\r\nimport { ValueChangeHandler } from 'types/ValueChangeHandler';\r\nimport { CombinedSchedulerTRow, getFilters } from './Filter';\r\nimport { getDefaultFilter } from './getDefaultFilter';\r\nimport { getRequiredFilter } from './getRequiredFilter';\r\nimport { MyListFilter } from 'app/pages/ReservationHistoryPage/MyListFilter';\r\nimport { getPredicates } from 'api/odata/getPredicates';\r\nimport { ErrorBoundary } from 'app/components/ErrorBoundary';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport {\r\n selectCustomDaysTimelineButtonEnabled,\r\n selectDefaultCustomDaysTimelineValue,\r\n selectSchedulerLoadingEvents,\r\n selectSchedulerServicesLimit,\r\n selectSchedulerServicesLimitReached,\r\n selectTwoDaysTimelineButtonEnabled,\r\n} from './Scheduler/slice/selectors';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { translations } from 'locales/translations';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport {\r\n TableRowsSkeleton,\r\n TableSkeleton,\r\n} from 'app/components/BasicTable/components/TableSkeleton';\r\nimport {\r\n getPeriodFromViewLength,\r\n viewStateFromFilter,\r\n} from './Scheduler/utils';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useLocation } from 'react-router';\r\nimport { H1 } from 'app/components/Typography';\r\nimport {\r\n groupByFilterFieldName,\r\n periodFilterFieldName,\r\n} from './parseCalendarPageParams';\r\n\r\nexport type SchedulerWithFiltersProps = IWithSavedHistoryComponentProps<\r\n CombinedSchedulerTRow\r\n> &\r\n SchedulerProps;\r\nexport const SchedulerWithFilters = function ({\r\n appliedFilters,\r\n availableFilters,\r\n getFilterValue,\r\n setFilterValue,\r\n ...props\r\n}: SchedulerWithFiltersProps) {\r\n const dispatch = useDispatch();\r\n const { t } = useTranslation();\r\n const { actions } = useSchedulerSlice();\r\n const location = useLocation();\r\n const customDaysEnabled = useSelector(selectCustomDaysTimelineButtonEnabled);\r\n const customDays = useSelector(selectDefaultCustomDaysTimelineValue);\r\n const twoDaysEnabled = useSelector(selectTwoDaysTimelineButtonEnabled);\r\n const isMobile = DetectIsMobile();\r\n const loadingEvents = useSelector(selectSchedulerLoadingEvents);\r\n // change scheduler period & date when \"Date Period\" is changed in the filter\r\n React.useEffect(() => {\r\n const periodValue: PresetDatesRange = getFilterValue?.(\r\n periodFilterFieldName,\r\n ) as PresetDatesRange;\r\n const preset = (periodValue as PresetDatesRange)?.type?.Id;\r\n const date = (periodValue as PresetDatesRange)?.start;\r\n if (preset !== undefined && date !== undefined && date !== null) {\r\n const new_state: Partial = {\r\n viewLength: presetPeriodToViewLength(\r\n preset as SchedulerDatePositionUnion,\r\n props.viewType,\r\n ),\r\n date: dateUtils.formatISO(date),\r\n };\r\n\r\n dispatch(actions.changeViewModePartial(new_state));\r\n }\r\n }, [actions, dispatch, getFilterValue, props.viewType]);\r\n\r\n // collapsed state of the filters\r\n // reference to the show/hide filters button\r\n const [\r\n filtersButtonAnchorEl,\r\n setFiltersButtonAnchorEl,\r\n ] = React.useState(null);\r\n const filterRef = React.useRef(null);\r\n // collapsed state of the filters\r\n const [filterOpen, setFilterOpen] = React.useState(false);\r\n const handleFilterOpen = React.useCallback(() => {\r\n setFiltersButtonAnchorEl(filterRef.current);\r\n setFilterOpen(true);\r\n }, []);\r\n const handleFilterClose = React.useCallback(() => {\r\n setFiltersButtonAnchorEl(null);\r\n setFilterOpen(false);\r\n }, []);\r\n\r\n const fetchData = React.useCallback(() => {\r\n const serviceFilterId = 'service';\r\n const service = getFilterValue?.(serviceFilterId);\r\n // wait for a services value where service name is already populated\r\n // if the Name is empty then there the appliedFilters will immediately change after the population\r\n if (Array.isArray(service) && service.some(f => f.Name === undefined)) {\r\n return;\r\n }\r\n const foo = appliedFilters?.reduce((acc, current) => {\r\n if (current.id !== undefined) {\r\n let setValue: FilterValueType | undefined = undefined;\r\n if (current.id === 'period') {\r\n setValue = (current.value as PresetDatesRange)?.type?.Id;\r\n } else {\r\n setValue = current.value;\r\n }\r\n const predicate = {\r\n value: setValue,\r\n predicate: getPredicates(\r\n [current],\r\n // todo: deal with the customParams\r\n () => void 0,\r\n () => void 0,\r\n ).join(' and '),\r\n };\r\n if (predicate.predicate !== '') {\r\n acc[current.id] = predicate;\r\n }\r\n }\r\n return acc;\r\n }, {});\r\n dispatch(actions.setFilters(foo));\r\n }, [actions, appliedFilters, dispatch, getFilterValue]);\r\n\r\n const handleRefresh = React.useCallback(() => {\r\n fetchData();\r\n }, [fetchData]);\r\n\r\n React.useEffect(() => {\r\n fetchData();\r\n }, [fetchData]);\r\n\r\n const handleFilterChange = (\r\n value: IFilterSettings[],\r\n ) => {\r\n props.onFilterChange?.(value);\r\n };\r\n const handleSetPeriodFilter = React.useCallback(\r\n (length: ViewLengths, value?: Date) => {\r\n let changedValue = getPeriodFromViewLength(\r\n length,\r\n value ?? dateUtils.parseISO(props.date),\r\n customDays,\r\n );\r\n !!setFilterValue && setFilterValue(periodFilterFieldName, changedValue);\r\n },\r\n [customDays, props.date, setFilterValue],\r\n );\r\n const updateSearchPeriod = (\r\n preset: SchedulerDatePositionUnion | null,\r\n search?: string,\r\n ) => {\r\n if (preset !== null) {\r\n const params = new URLSearchParams(search ?? '');\r\n if (params.has(periodFilterFieldName)) {\r\n params.delete(periodFilterFieldName);\r\n }\r\n params.set(periodFilterFieldName, preset);\r\n return params.toString();\r\n }\r\n return search;\r\n };\r\n const handleViewTypeLengthChange = (\r\n type: ViewTypes,\r\n length: ViewLengths,\r\n value?: Date,\r\n noChangeLocation?: boolean,\r\n ) => {\r\n let presetValue = getPeriodFromViewLength(\r\n length,\r\n value ?? dateUtils.parseISO(props.date),\r\n customDays,\r\n );\r\n handleSetPeriodFilter(length, value);\r\n let searchComp =\r\n updateSearchPeriod(\r\n viewStateFromFilter(presetValue.type)?.preset ?? null,\r\n location.search,\r\n ) ?? location.search;\r\n dispatch(\r\n actions.changeViewMode({\r\n current: {\r\n viewType: type,\r\n viewLength: length,\r\n date: !!value ? dateUtils.formatISO(value) : props.date,\r\n preset: isMobile\r\n ? null\r\n : viewStateFromFilter(presetValue.type)?.preset ?? null,\r\n search: searchComp,\r\n customDays: customDays,\r\n customStart: undefined,\r\n },\r\n withNoChangeLocation: noChangeLocation,\r\n }),\r\n );\r\n };\r\n\r\n const handleMultipleModeChange: ValueChangeHandler = value => {\r\n dispatch(actions.updateMultiMode(value));\r\n };\r\n const servicesLimit = useSelector(selectSchedulerServicesLimit);\r\n const limitReached = useSelector(selectSchedulerServicesLimitReached);\r\n React.useEffect(() => {\r\n if (limitReached) {\r\n const msg = t(translations.SchedulerServicesLimitReachedWarningMessage, {\r\n servicesLimit: servicesLimit,\r\n });\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n key: translations.SchedulerServicesLimitReachedWarningMessage,\r\n variant: 'warning',\r\n message: msg,\r\n }),\r\n );\r\n }\r\n }, [dispatch, limitReached, servicesLimit, t]);\r\n\r\n if (appliedFilters === undefined) {\r\n return null;\r\n }\r\n\r\n const showSkeleton =\r\n props.services === undefined ||\r\n props.viewType === undefined ||\r\n props.viewLength === undefined;\r\n\r\n if (showSkeleton) {\r\n return ;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {loadingEvents ? (\r\n \r\n ) : (\r\n {t(translations.AnErrorOccurred)}}>\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const SchedulerConnectedWithFilters = withSavedHistoryT<\r\n CombinedSchedulerTRow,\r\n SchedulerWithFiltersProps\r\n>(\r\n SchedulerWithFilters,\r\n '/schedule',\r\n getFilters,\r\n getDefaultFilter,\r\n [periodFilterFieldName, groupByFilterFieldName],\r\n getRequiredFilter,\r\n MyListFilter,\r\n true,\r\n);\r\n","import { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\n/**\r\n * Gets the default filters for the calendar/timeline\r\n * @param user\r\n * @returns\r\n */\r\nexport const getDefaultFilter: (\r\n user: IAuthenticatedUser,\r\n) => URLSearchParams = user => {\r\n const result = new URLSearchParams();\r\n return result;\r\n};\r\n","export function getRequiredFilter(\r\n search: string,\r\n appSettings,\r\n): string | undefined {\r\n return undefined;\r\n}\r\n","import * as React from 'react';\r\nimport { Redirect } from 'react-router';\r\nimport { useProfileSetting } from 'app/components/BasicTable/useProfileSetting/index';\r\nimport {\r\n parseProfileUrl,\r\n undefinedIfIsEmpty,\r\n} from 'app/components/BasicTable/useProfileSetting/parseProfileUrl';\r\nimport { CalendarPageProps, calendarPathUserProfileKey } from './index';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { ViewTypes } from './Scheduler/slice/types';\r\nimport { trimEnd } from 'lodash';\r\n\r\n/**\r\n * Redirects to the last visited calendar view.\r\n * e.g. /schedule -> /schedule/timeline?eid=12150&un=&BookedById=\r\n * @param param0\r\n * @returns\r\n */\r\nexport function CalendarPageDefaultRedir({\r\n match,\r\n ...props\r\n}: CalendarPageProps) {\r\n const isMobile = DetectIsMobile();\r\n const { savedValue } = useProfileSetting({\r\n profileSettingKey: calendarPathUserProfileKey,\r\n });\r\n const defaultViewType: ViewTypes = isMobile ? 'calendar' : 'timeline';\r\n const defaultPathName = `/schedule/${defaultViewType}`;\r\n const { pathName: savedPathName, search: savedSearch } = parseProfileUrl(\r\n savedValue,\r\n );\r\n // mobile clients should always land on calendar, regardless last visited mode\r\n const pathName = trimEnd(\r\n isMobile ? defaultPathName : savedPathName ?? defaultPathName,\r\n '?',\r\n );\r\n // the saved search part will be applied anyway\r\n // setting it here will save one redir/replace that will happen in the useFilters componenent on the scheduler page\r\n const search = savedSearch;\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Helmet } from 'react-helmet-async';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { SchedulerEventEditHandler, ViewModeChangeHandler } from './Scheduler';\r\nimport { useSchedulerSlice } from './Scheduler/slice';\r\nimport {\r\n selectSchedulerParseEvents,\r\n selectNonWorkingHours,\r\n selectSchedulerServices,\r\n selectSchedulerViewState,\r\n selectSelectedReservationEvents,\r\n selectLoadedServices,\r\n} from './Scheduler/slice/selectors';\r\nimport { IBasePageProps } from '../IBasePageProps';\r\nimport { INewEvent, ViewTypes } from './Scheduler/slice/types';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { generatePath } from 'react-router';\r\nimport { useGlobalServiceGroupsFilter } from 'app/hooks/useGlobalServiceGroupsFilter';\r\nimport { BasicTableProps } from 'app/components/BasicTable';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { SchedulerConnectedWithFilters } from './SchedulerWithFiltersProps';\r\nimport { useProfileSetting } from 'app/components/BasicTable/useProfileSetting/index';\r\nimport { parseCalendarPageParams as parseViewState } from './parseCalendarPageParams';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { undefinedIfIsEmpty } from 'app/components/BasicTable/useProfileSetting/parseProfileUrl';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { SchedulerDatePositionUnion } from 'app/components/BasicTable/Filters/DatesPeriodFilter';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { URLSearchParamsCI } from 'app/components/BasicTable/types/FilterParam';\r\nimport { Messages } from 'app/components/Messages';\r\nexport { CalendarPageDefaultRedir } from './CalendarPageDefaultRedir';\r\n\r\nexport interface CalendarPageParams {\r\n type: ViewTypes;\r\n period: SchedulerDatePositionUnion;\r\n}\r\n\r\nexport const calendarPageDefaultPath = '/schedule';\r\nexport const calendarPageFullPath = '/schedule/:type';\r\nexport const CalendarPagePaths = [\r\n calendarPageFullPath,\r\n calendarPageDefaultPath,\r\n];\r\nexport interface CalendarPageProps\r\n extends IBasePageProps,\r\n Pick<\r\n BasicTableProps,\r\n 'filterOpen' | 'onFilterChange' | 'appliedFilters' | 'availableFilters'\r\n > {}\r\n\r\nexport const calendarPathUserProfileKey = calendarPageDefaultPath;\r\nexport function CalendarPage({ match, location, ...props }: CalendarPageProps) {\r\n // show the global service groups filter on the page\r\n useGlobalServiceGroupsFilter(true);\r\n const isMobile = DetectIsMobile();\r\n const dispatch = useDispatch();\r\n const { updateValue: updateX } = useProfileSetting({\r\n profileSettingKey: calendarPathUserProfileKey,\r\n });\r\n const { newDate } = useSystemDate();\r\n const viewStateSearchParams = React.useMemo(() => {\r\n return parseViewState(match, location.search, isMobile, newDate());\r\n }, [match, location.search, isMobile, newDate]);\r\n\r\n // search params that not affect the viewState\r\n const searchParams = React.useMemo(() => {\r\n const purlSearchParams = new URLSearchParamsCI(location.search);\r\n return {\r\n SampleRunId: tryParseInt(purlSearchParams.get('sampleRunId')),\r\n duration: tryParseInt(purlSearchParams.get('duration')),\r\n };\r\n }, [location.search]);\r\n\r\n React.useEffect(() => {\r\n if (isMobile) {\r\n return;\r\n }\r\n const pathName = generatePath(calendarPageFullPath, {\r\n type: viewStateSearchParams.viewType,\r\n });\r\n // the \"saved filter\" url setting have to have the search part in the URL\r\n // as it's primarily used for it's query string value in the filters component\r\n // see parseProfileURL.ts\r\n const url = pathName + (undefinedIfIsEmpty(location.search) ?? '?');\r\n updateX(url);\r\n }, [location.search, viewStateSearchParams.viewType, updateX, isMobile]);\r\n\r\n const { actions } = useSchedulerSlice();\r\n const events = useSelector(selectSchedulerParseEvents);\r\n const nonWorkingHours = useSelector(selectNonWorkingHours);\r\n const schedulerServices = useSelector(selectSchedulerServices);\r\n\r\n const viewState = useSelector(selectSchedulerViewState);\r\n const selectedMultipleEvents = useSelector(selectSelectedReservationEvents);\r\n\r\n useEffectOnMount(() => {\r\n dispatch(actions.init(viewStateSearchParams));\r\n });\r\n\r\n const handleViewModeChange: ViewModeChangeHandler = p => {\r\n dispatch(actions.changeViewMode(p));\r\n };\r\n\r\n const handleEdit: SchedulerEventEditHandler = React.useCallback(\r\n event => {\r\n dispatch(actions.edit(event));\r\n },\r\n [actions, dispatch],\r\n );\r\n const handleCreate = React.useCallback(\r\n (event: INewEvent | undefined) => {\r\n dispatch(\r\n actions.create(\r\n event === undefined\r\n ? undefined\r\n : {\r\n ...event,\r\n sample_run_id: searchParams.SampleRunId,\r\n },\r\n ),\r\n );\r\n },\r\n [actions, dispatch, searchParams.SampleRunId],\r\n );\r\n const selectedEquipment = useSelector(selectLoadedServices);\r\n\r\n if (viewState === undefined) {\r\n return <>;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n\r\n void 0}\r\n onViewModeChange={handleViewModeChange}\r\n onEdit={handleEdit}\r\n onCreate={handleCreate}\r\n reservationEditEvents={selectedMultipleEvents}\r\n savedListSettings={{\r\n enableSavedLists: true,\r\n savedListRelatedPickerName: 'EquipmentId',\r\n savedListSerializedKey: 'eid',\r\n }}\r\n />\r\n {selectedEquipment !== undefined && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * BooleanPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { AutocompletePickerProps } from '../BasicPickers/AutocompletePicker';\r\nimport { Entity } from 'types/common';\r\nimport { TFunction } from 'i18next';\r\nimport { BaseOptionsPicker } from '../BasicPickers/BaseOptionsPicker';\r\n\r\nexport interface BooleanPickerProps\r\n extends Omit>, 'loadData'> {\r\n trueName?: string;\r\n falseName?: string;\r\n}\r\nexport const GetBooleanFilterOptions = (\r\n t: TFunction,\r\n trueName?: string,\r\n falseName?: string,\r\n) => {\r\n return [\r\n {\r\n Id: true,\r\n Name: !!trueName ? trueName : t(translations.Yes),\r\n },\r\n { Id: false, Name: !!falseName ? falseName : t(translations.No) },\r\n ];\r\n};\r\nexport function BooleanPicker(props: BooleanPickerProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const getOptions = () =>\r\n GetBooleanFilterOptions(t, props.trueName, props.falseName);\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer } from 'utils/redux-injectors';\r\nimport { DialogAlertState } from './types';\r\n\r\nexport const initialState: DialogAlertState = {\r\n open: false,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'dialogAlert',\r\n initialState,\r\n reducers: {\r\n showAlert(state, action: PayloadAction) {\r\n state.open = true;\r\n state.content = action.payload;\r\n },\r\n hideAlert(state, action: PayloadAction) {\r\n state.open = false;\r\n state.content = undefined;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: dialogAlertActions } = slice;\r\n\r\nexport const useDialogAlertSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useAlertSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","/**\r\n *\r\n * ErrorBoundary\r\n *\r\n */\r\nimport { getLogger } from 'loglevel';\r\nimport * as React from 'react';\r\n\r\nexport class ErrorBoundary extends React.Component<\r\n { fallBack?: React.ReactElement; onError?: (error) => void },\r\n { hasError: boolean }\r\n> {\r\n private _log = getLogger('ErrorBoundary');\r\n private fallBack?: React.FC;\r\n private onError?: (error) => void;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = { hasError: false };\r\n this.fallBack = props.fallback;\r\n this.onError = props.onError;\r\n }\r\n\r\n static getDerivedStateFromError(error) {\r\n // Update state so the next render will show the fallback UI.\r\n return { hasError: true };\r\n }\r\n componentDidCatch(error, errorInfo) {\r\n // You can also log the error to an error reporting service\r\n this.onError?.(errorInfo);\r\n this._log.error(error, errorInfo);\r\n }\r\n render() {\r\n if (this.state.hasError) {\r\n // You can render any custom fallback UI\r\n return this.props.fallBack ||

    Something went wrong.

    ;\r\n }\r\n return this.props.children;\r\n }\r\n}\r\n","import { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport cliTruncate from 'cli-truncate';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { Body, H3 } from 'app/components/Typography';\r\nimport { OpenMenuButton } from '../../TopBar/components/openMenuButton';\r\nimport { useAbsolute } from 'utils/url-utils';\r\nimport styled from 'styled-components';\r\n\r\nexport interface TitlePageProps {\r\n // title of the current screen\r\n title: string;\r\n // link to open the details page as its own url on a new browser tab\r\n pageLink?: string;\r\n toPageLink?: string;\r\n useSidePanel?: boolean;\r\n buttonsLenth: number;\r\n expandPanel?: () => void;\r\n tooltip?: string;\r\n isCover?: boolean;\r\n toExpandPanel?: () => void;\r\n useShortView?: boolean;\r\n hideMenu?: boolean;\r\n}\r\nconst TitleSection = styled('div')`\r\n display: flex;\r\n gap: 4px;\r\n align-items: center;\r\n`;\r\nconst ShortTitle = styled('span')`\r\n cursor: pointer;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n display: -webkit-box;\r\n -webkit-line-clamp: 2;\r\n -webkit-box-orient: vertical;\r\n word-break: break-all;\r\n`;\r\nexport function TitlePage(props: TitlePageProps) {\r\n const { t } = useTranslation();\r\n const {\r\n title,\r\n pageLink,\r\n toPageLink,\r\n useSidePanel,\r\n buttonsLenth,\r\n expandPanel,\r\n tooltip,\r\n isCover,\r\n toExpandPanel,\r\n useShortView,\r\n hideMenu,\r\n } = props;\r\n const [showCopy, setShowCopy] = React.useState(false);\r\n const [copied, setCopied] = React.useState(false);\r\n const isMobile = DetectIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const showShortView = React.useMemo(() => {\r\n return (\r\n isMobile ||\r\n (useSidePanel && !sidePanelExpanded) ||\r\n isCover ||\r\n useShortView\r\n );\r\n }, [isCover, isMobile, sidePanelExpanded, useShortView, useSidePanel]);\r\n const truncatedTitle = React.useMemo(() => {\r\n return showCopy\r\n ? cliTruncate(\r\n title,\r\n buttonsLenth === 1\r\n ? isCover\r\n ? 22\r\n : 24\r\n : buttonsLenth === 2\r\n ? isCover\r\n ? 18\r\n : 18\r\n : isCover\r\n ? 14\r\n : 16,\r\n { position: 'middle' },\r\n )\r\n : cliTruncate(\r\n title,\r\n buttonsLenth === 1\r\n ? isCover\r\n ? 28\r\n : 30\r\n : buttonsLenth === 2\r\n ? isCover\r\n ? 22\r\n : 24\r\n : isCover\r\n ? 18\r\n : 20,\r\n { position: 'end' },\r\n );\r\n }, [buttonsLenth, isCover, showCopy, title]);\r\n const absolutePageLink = useAbsolute(pageLink, toPageLink);\r\n return pageLink || toPageLink ? (\r\n setShowCopy(true)}\r\n onMouseLeave={() => setShowCopy(false)}\r\n >\r\n {isMobile && !useSidePanel && !hideMenu && (\r\n \r\n )}\r\n {expandPanel && (\r\n \r\n \r\n \r\n )}\r\n {isMobile ? (\r\n \r\n \r\n {{title.replace(/-/g, '‑')}}\r\n \r\n \r\n ) : (\r\n \r\n {showShortView ? (\r\n \r\n \r\n {{title.replace(/-/g, '‑')}}\r\n \r\n \r\n ) : (\r\n

    {title}

    \r\n )}\r\n \r\n )}\r\n\r\n {showCopy && absolutePageLink !== undefined && !isMobile && (\r\n {\r\n navigator.clipboard.writeText(absolutePageLink);\r\n setCopied(true);\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 {showShortView ? (\r\n \r\n \r\n {{truncatedTitle}}\r\n \r\n \r\n ) : (\r\n

    {title}

    \r\n )}\r\n
    \r\n );\r\n}\r\n","import htmlParse from 'html-react-parser';\r\nimport { Mention } from '../RichTextEditor/RichEditor';\r\n\r\nexport const parse = (text: string) => {\r\n const options = {\r\n replace: (domNode: any) => {\r\n if (domNode.attribs?.class === 'MENTION') {\r\n const attribs = domNode.attribs;\r\n return (\r\n \r\n );\r\n }\r\n },\r\n };\r\n return htmlParse(text, options);\r\n};\r\n","import { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { groupBy, values } from 'lodash';\r\nimport {\r\n IEquipmentOfflineServiceTypeDto,\r\n IReservationEquipmentDto,\r\n} from './types';\r\n\r\n/**\r\n * Combines offline services from multiple instrument into a single list.\r\n * E.g. on multi instrument reservations, offline services section is shared across all instruments\r\n * @param equipments online services\r\n * @returns list of offline service types applicable to selected services\r\n */\r\nexport function combineOfflineServiceTypes(\r\n equipments: IReservationEquipmentDto[] | undefined,\r\n): IEquipmentOfflineServiceTypeDto[] | undefined {\r\n if (equipments === undefined) {\r\n return undefined;\r\n }\r\n let haidProject = equipments.every(f => f.HideProjects === true);\r\n return (\r\n values(\r\n groupBy(\r\n equipments\r\n //ignore equipments without offline services enabled\r\n .filter(f => f.ReservationOfflineServicesEnabled)\r\n .flatMap(f => f.OfflineServices),\r\n f => f.Id,\r\n ),\r\n )\r\n // offline service must be enabled on each instrument\r\n .filter(group => group.length === equipments.length)\r\n // offline service is mandatory if it's mandatory on one of the instruments\r\n .map(f => {\r\n return {\r\n ...f[0],\r\n Mandatory: f.some(g => g.Mandatory),\r\n };\r\n })\r\n .filter(o => o.HideProject === haidProject)\r\n );\r\n}\r\nexport function combineMandatoryOfflineServices(\r\n services: IOtherServices[] | undefined,\r\n): IOtherServices[] | undefined {\r\n if (services === undefined) {\r\n return undefined;\r\n }\r\n return values(groupBy(services, f => f.ServiceTypeID)).map(f => {\r\n return f[0];\r\n });\r\n}\r\n","import { GlobalSettingsType } from '../components/useGlobalSettingsHook';\r\nimport { IReservationEquipmentDto } from './types';\r\n\r\n/**\r\n * This function determines if the budgets are enabled and should be visible for particular online services selection\r\n * @param globalSettings global settings\r\n * @param equipments related online services\r\n * @returns\r\n */\r\n\r\nexport function getBudgetVisible(\r\n globalSettings: GlobalSettingsType,\r\n equipments: Array<\r\n Pick<\r\n IReservationEquipmentDto,\r\n 'HideProjects' | 'BudgetsTurnedOn' | 'Billable'\r\n >\r\n >,\r\n): boolean {\r\n return (\r\n globalSettings.budgetModuleEnabled &&\r\n !equipments.every(f => f.HideProjects) &&\r\n equipments.every(f => f.BudgetsTurnedOn === true) &&\r\n // Billable is only shown on the instrument details when the PriceSheetPricing is on. Otherwise the instruments will with Billable = false, which should be ignored since they are in fact billable\r\n (globalSettings.priceSheetPricing === true ||\r\n equipments.some(f => f.Billable === true))\r\n );\r\n}\r\n","/**\r\n *\r\n * TrainingSessionPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ITrainingSessionDto } from 'api/odata/generated/entities/ITrainingSessionDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport i18next from 'i18next';\r\n\r\nexport type UserUrl = 'restricted' | 'full' | 'admin';\r\nexport interface TrainingSessionPickerProps\r\n extends Omit, 'loadData'> {\r\n inputProps?: InputBaseComponentProps;\r\n selectArray?: Array;\r\n}\r\n\r\nconst url = '/api/odata/v4/TrainingSessions';\r\nexport const generateTrainingSessionName = (\r\n dto: ITrainingSessionDto,\r\n): ITrainingSessionDto => {\r\n let name = `${dateUtils.format(\r\n dto.StartDate,\r\n dateUtils.DateIOFormats.fullDateTime,\r\n )} ${dto.Duration}(h) ${dto.Trainer} ${\r\n dto.RemainedSlots === null\r\n ? i18next.t(translations.MaxAttendees_NA)\r\n : dto.RemainedSlots\r\n }`;\r\n return Object.assign({}, dto, { Name: name });\r\n};\r\nexport const initSessionsData = (id: string) => {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'StartDate asc',\r\n $filter: new Condition('Id', ODataOperators.Equals, id).toString(),\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(\r\n response =>\r\n (response.value as ITrainingSessionDto[]).map(f =>\r\n generateTrainingSessionName(f),\r\n ) as Entity[],\r\n );\r\n};\r\n\r\nexport function TrainingSessionPicker(props: TrainingSessionPickerProps) {\r\n const { t } = useTranslation();\r\n const loadData = getAutoCompleteLoadDataFn({\r\n url: url,\r\n predicates: props.predicates,\r\n select: props.selectArray ?? [\r\n 'Id',\r\n 'Name',\r\n 'StartDate',\r\n 'EndDate',\r\n 'RemainedSlots',\r\n 'TrainingState',\r\n 'Trainer',\r\n 'Duration',\r\n ],\r\n transformModel: generateTrainingSessionName,\r\n });\r\n return (\r\n \r\n );\r\n}\r\nexport function ReservRelatedFilter(\r\n EquipmentId?: number,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (EquipmentId !== undefined) {\r\n predicates.push(\r\n new Condition(\r\n 'ServiceId',\r\n ODataOperators.Equals,\r\n EquipmentId,\r\n ),\r\n );\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n","/**\r\n *\r\n * RemindBeforPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { RemindBefore } from 'enums/RemindBefore';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface RemindBeforePickerProps\r\n extends Omit>, 'getOptions'> {}\r\nexport const getSingleReminder = (val: number): Entity => {\r\n return enumToEntityArray(RemindBefore).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\nexport const initRemindBeforeData = (\r\n initval: number | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([getSingleReminder(initval)]);\r\n });\r\n }\r\n};\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(RemindBefore);\r\n\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\nexport function RemindBeforePicker(props: RemindBeforePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * WorkflowBookingPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IWorkflowBookingDto } from 'api/odata/generated/entities/IWorkflowBookingDto';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface WorkflowBookingPickerProps\r\n extends Omit, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/WorkflowBooking';\r\nexport const initWorkflowBookingData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,UserName',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nexport function WorkflowBookingPicker(props: WorkflowBookingPickerProps) {\r\n const loadData = getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: props.predicates,\r\n select: ['Id', 'Name', 'UserName'],\r\n });\r\n return (\r\n \r\n );\r\n}\r\n","import { makeStyles, Theme } from '@material-ui/core/styles';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) => ({\r\n tableRoot: {\r\n // paddingInline: theme.spacing(2),\r\n },\r\n filterPanel: {\r\n padding: theme.spacing(1),\r\n },\r\n tableScrolling: {\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'auto',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n height: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n },\r\n tableContent: {\r\n padding: theme.spacing(0, 2, 0, 4),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n /* will cause table footer to be at the bottom of the screen */\r\n //height: '100%',\r\n justifyContent: 'space-between',\r\n overflowY: 'hidden',\r\n '&.tablePaddingDense': {\r\n padding: '0',\r\n },\r\n },\r\n tableContentShort: {\r\n padding: theme.spacing(0, 1, 0, 2),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n justifyContent: 'space-between',\r\n overflowY: 'hidden',\r\n width: '100%',\r\n '&.tablePaddingDense': {\r\n padding: '0',\r\n },\r\n },\r\n table: {\r\n backgroundColor: theme.palette.background.paper,\r\n whiteSpace: 'pre',\r\n '&.withFooter': {\r\n borderRadius: '8px 8px 0px 0px',\r\n },\r\n },\r\n tableButtonsRoot: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '8px 32px 16px',\r\n gap: theme.spacing(1.5),\r\n flexWrap: 'wrap',\r\n '&.tablePaddingDense': {\r\n padding: '8px 0px 16px',\r\n },\r\n },\r\n tableButtonsRootShort: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'space-between',\r\n alignItems: 'normal',\r\n padding: '8px 16px 16px',\r\n gap: theme.spacing(1.5),\r\n '&.tablePaddingDense': {\r\n padding: '8px 0px 16px',\r\n },\r\n },\r\n filterDisplayRoot: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n padding: '0px 32px 16px',\r\n gap: theme.spacing(2),\r\n flexWrap: 'wrap',\r\n },\r\n filterDisplayRootShort: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'normal',\r\n justifyContent: 'flex-start',\r\n padding: '0px 32px 16px',\r\n gap: theme.spacing(2),\r\n flexWrap: 'wrap',\r\n },\r\n tableButtonsLeft: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: theme.spacing(1.5),\r\n flexWrap: 'wrap',\r\n },\r\n tableButtonsLeftShort: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: theme.spacing(1.5),\r\n flexWrap: 'wrap',\r\n justifyContent: 'space-between',\r\n maxWidth: '90%',\r\n },\r\n tableButtonWrap: {\r\n flexWrap: 'wrap',\r\n },\r\n tableButtonNoWrap: {\r\n flexWrap: 'nowrap',\r\n },\r\n tableButtonsRight: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: theme.spacing(1),\r\n marginLeft: 'auto',\r\n },\r\n tableButtonsRightShort: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: theme.spacing(1),\r\n justifyContent: 'space-between',\r\n },\r\n menuPaper: {\r\n width: '160px',\r\n },\r\n subHeader: {\r\n // same padding as in all child elements of the table container\r\n padding: '0px 32px 16px',\r\n },\r\n isAggregated: {\r\n fontWeight: 'bold',\r\n },\r\n tableFooter: {\r\n width: '100%',\r\n backgroundColor: bookitColors.base.white,\r\n minHeight: '42px',\r\n overflowX: 'auto',\r\n '&::-webkit-scrollbar': {\r\n height: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n // '&.tableFooterShortView': {\r\n // minHeight: '56px',\r\n // },\r\n },\r\n tableFooterWithBorder: {\r\n border: '1px solid ' + theme.palette.divider,\r\n borderTop: `1px solid ${theme.palette.common.grayBorders}`,\r\n borderRadius: '5px',\r\n borderTopLeftRadius: '0px',\r\n borderTopRightRadius: '0px',\r\n },\r\n}));\r\n","import * as React from 'react';\r\nimport { IFilterSettings } from './BasicFilter/IFilterSettings';\r\nimport { filterKey } from './BasicFilter/utils';\r\nimport { EntityType } from 'types/common';\r\n\r\n/**\r\n * Memoes the array of filter to be used in the fetch data functions. Tracks the current state of the filters by the filter key (fieldName,fieldName1/etc) + filter value without the display name in case of Entity value\r\n * @param props\r\n * @returns\r\n */\r\nexport const useMemoFilters = (props: {\r\n appliedFilters?: IFilterSettings[];\r\n}) => {\r\n const nonEmpty = props.appliedFilters?.filter(\r\n f => f.value !== null && f.value !== undefined,\r\n );\r\n const singleValueToId = value => {\r\n return (value as EntityType)?.Id !== undefined\r\n ? (value as EntityType)?.Id\r\n : value;\r\n };\r\n\r\n const singleValue = value => {\r\n return Array.isArray(value)\r\n ? value.map(singleValueToId)\r\n : singleValueToId(value);\r\n };\r\n const mapped = nonEmpty?.map(f => ({\r\n key: filterKey(f),\r\n value: singleValue(f.value),\r\n operator: f.operator,\r\n isInversed: f.isInversed,\r\n initCompleted: f.initCompleted ?? false,\r\n }));\r\n\r\n const customFilter = React.useMemo(() => {\r\n const result = nonEmpty;\r\n return result;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [JSON.stringify(mapped)]);\r\n return customFilter;\r\n};\r\n","/**\r\n *\r\n * ValueLabel\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface ValueLabelProps {\r\n value: string | number | undefined | null;\r\n}\r\n\r\nexport function ValueLabel({ value }: ValueLabelProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const isEmpty =\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'string' && value.trim() === '');\r\n const displayValue = isEmpty ? t(translations.NA) : value;\r\n return <>{displayValue};\r\n}\r\n","import { useTheme } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { TabPanelWrapper } from '../TabsWrapper';\r\nimport clsx from 'clsx';\r\n\r\nexport interface TabPanelProps {\r\n children?: React.ReactNode;\r\n index: any;\r\n value: any;\r\n styles?: React.CSSProperties;\r\n tabsId: string;\r\n tabsPanelId: string;\r\n scrollableContent?: boolean;\r\n}\r\n\r\nexport function TabPanel(props: TabPanelProps) {\r\n const {\r\n tabsPanelId,\r\n tabsId,\r\n children,\r\n value,\r\n index,\r\n styles,\r\n scrollableContent,\r\n ...other\r\n } = props;\r\n const theme = useTheme();\r\n return (\r\n
    \r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { FormAutocompleteMulti } from 'app/components/Forms/FormAutocompleteMulti';\r\nimport { FormAutocomplete } from 'app/components/Forms/FormAutocomplete';\r\n\r\nconst url = '/api/odata/v4/UserFilter/GetUserSelections';\r\nexport const initUserData = (\r\n id: string,\r\n formField: IFormFieldDto | undefined,\r\n) => {\r\n let filter: string | undefined = '';\r\n const initids = id.split(',').map(item => {\r\n return { Id: item };\r\n }) as Identifiable[];\r\n if (formField) {\r\n if (\r\n formField.UserSelectionType === 'FixedRoles' &&\r\n formField.FixedRoles !== null &&\r\n formField.FixedRoles !== ''\r\n ) {\r\n let ids = formField.FixedRoles.split(',').map(item => {\r\n return { Id: item };\r\n }) as Identifiable[];\r\n filter = new Condition(\r\n 'UserRoles',\r\n ODataOperators.AnyIn,\r\n ids,\r\n 'Name',\r\n ).toString();\r\n }\r\n if (\r\n formField.UserSelectionType === 'CustomRoles' &&\r\n formField.CustomRoles !== null &&\r\n formField.CustomRoles !== ''\r\n ) {\r\n let ids = formField.CustomRoles.split(',')\r\n .map(item => {\r\n let id = item.split('#');\r\n return { Id: parseInt(id[0]) };\r\n })\r\n .filter(item => !isNaN(item.Id)) as Identifiable[];\r\n filter = new Condition(\r\n 'CustomRoles',\r\n ODataOperators.AnyIn,\r\n ids,\r\n 'Id',\r\n ).toString();\r\n }\r\n }\r\n if (filter !== '') {\r\n filter += ` and ${new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n initids,\r\n ).toString()}`;\r\n } else {\r\n filter = new Condition('Id', ODataOperators.Includes, initids).toString();\r\n }\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: filter,\r\n $select: 'Id,Name,UserRoles,CustomRoles',\r\n $skip: 0,\r\n $top: initids.length,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport const getGetUserSelectionsAutocompleteFn = (\r\n formField: Pick<\r\n IFormFieldDto,\r\n 'UserSelectionType' | 'FixedRoles' | 'CustomRoles'\r\n >,\r\n) => (searchTerm: string | null) => {\r\n const params: {\r\n $orderby: string;\r\n $top: number;\r\n $filter?: string;\r\n $select?: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name,UserRoles,CustomRoles',\r\n $top: 100,\r\n };\r\n const predicates: Condition[] = [];\r\n if (\r\n formField.UserSelectionType === 'FixedRoles' &&\r\n formField.FixedRoles !== null &&\r\n formField.FixedRoles !== ''\r\n ) {\r\n let ids = formField.FixedRoles.split(',').map(item => {\r\n return { Id: item };\r\n }) as Identifiable[];\r\n predicates.push(\r\n new Condition('UserRoles', ODataOperators.AnyIn, ids, 'Name'),\r\n );\r\n }\r\n if (\r\n formField.UserSelectionType === 'CustomRoles' &&\r\n formField.CustomRoles !== null &&\r\n formField.CustomRoles !== ''\r\n ) {\r\n let ids = formField.CustomRoles.split(',')\r\n .map(item => {\r\n let id = item.split('#');\r\n return { Id: parseInt(id[0]) };\r\n })\r\n .filter(item => !isNaN(item.Id)) as Identifiable[];\r\n predicates.push(\r\n new Condition('CustomRoles', ODataOperators.AnyIn, ids, 'Id'),\r\n );\r\n }\r\n if (searchTerm !== null || predicates.length > 0) {\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm ?? undefined,\r\n }).toString();\r\n }\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function CustomFormUserSelection({\r\n formField,\r\n readonly,\r\n parentValue,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n const loadData = getGetUserSelectionsAutocompleteFn(formField);\r\n return (\r\n \r\n {formField.IsMultiple ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.repetitive || initialState;\r\n\r\nexport const selectRepetitive = createSelector([selectSlice], state => state);\r\n\r\nexport const selectRepetitiveProcessing = createSelector(\r\n [selectRepetitive],\r\n state => state.processing,\r\n);\r\n\r\nexport const selectRepetitiveError = createSelector(\r\n [selectRepetitive],\r\n state => state.error,\r\n);\r\n\r\nexport const selectRepetitiveData = createSelector(\r\n [selectRepetitive],\r\n state => state.data,\r\n);\r\nexport const selectRepetitiveFieldHandler = createSelector(\r\n [selectRepetitive],\r\n state => state.repetitiveValueHandler,\r\n);\r\n","import { httpClient } from 'api/HttpClient';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n BaseURLPicker,\r\n BaseURLPickerProps,\r\n} from 'app/components/BasicPickers/BaseURLPicker';\r\nimport { Entity } from 'types/common';\r\nconst url = '/api/odata/v4/OfflineServiceFilter';\r\nconst filter = 'TypeId eq 3 and Active eq true';\r\nexport interface SampleTypePickerProps\r\n extends Omit>, 'url'> {}\r\n\r\nexport const initSampleTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: new ODataFilterBuilder>({\r\n predicates: [filter, new Condition('Id', ODataOperators.Equals, id)],\r\n stringColumns: [],\r\n }).toString(),\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nexport const SampleTypePicker = (props: SampleTypePickerProps) => {\r\n const { queryfilter, ...other } = props;\r\n const predicate =\r\n queryfilter && queryfilter !== ''\r\n ? [queryfilter, filter].join(' and ')\r\n : filter;\r\n return (\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField, useFormikContext } from 'formik';\r\nimport { RadioGroup, RadioGroupProps } from '../RadioGroup';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport { FormHelperText, FormLabel, styled } from '@material-ui/core';\r\nimport { useIsRequired } from './ValidationSchemaProvider';\r\nimport { buttonM, buttonS } from 'styles/typography/bookitTypography';\r\n\r\nexport type FormRadioGroupProps = FieldHookConfig & RadioGroupProps;\r\nexport const FormRadioGroup = ({\r\n id,\r\n label,\r\n onChange,\r\n value,\r\n name,\r\n error,\r\n title,\r\n helperText,\r\n ...props\r\n}: FieldHookConfig & RadioGroupProps) => {\r\n const [field, meta] = useField({ name, ...props });\r\n const handleChange = (value, event) => {\r\n if (onChange !== undefined) {\r\n onChange(value, event);\r\n }\r\n field.onChange(event);\r\n };\r\n const { submitCount } = useFormikContext();\r\n const isRequired = useIsRequired(name);\r\n const hasError = meta?.error !== undefined;\r\n const showError = hasError && (meta.touched || submitCount > 0);\r\n return (\r\n \r\n \r\n {label}\r\n \r\n {title && {title}}\r\n \r\n \r\n {showError ? meta.error : helperText}\r\n \r\n \r\n );\r\n};\r\n\r\n// spacing is needed in the quizzes\r\nconst StyledFormControl = styled(FormControl)(props => ({\r\n marginBottom: props.theme.spacing(0),\r\n}));\r\n\r\n// the label needs to be stronger in quizzes\r\nconst StyledFormLabel = styled(FormLabel)(({ theme }) => ({\r\n color: theme.palette.common.blackRegular,\r\n ...buttonM,\r\n '&[class*=\"Mui-focused\"]': {\r\n color: theme.palette.common.blackRegular,\r\n },\r\n}));\r\n// the label needs to be stronger in quizzes\r\nconst StyledFormTitle = styled('label')(({ theme }) => ({\r\n color: theme.palette.common.blackRegular,\r\n ...buttonS,\r\n fontStyle: 'italic',\r\n marginBottom: theme.spacing(3),\r\n}));\r\nconst StyledFormHelperText = styled(FormHelperText)(props => ({\r\n // empty helperText results in zero element height. So when field is validated the appearance of the\r\n // error message in the helperText causes the form element to increase in height and forces a redraw\r\n // empty char \\00a0 causes the FormHelperText to always occupy one line height and prevents reflows\r\n '&::before': {\r\n content: '\"\\\\00a0\"',\r\n },\r\n}));\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nimport { FormRadioGroup } from 'app/components/Forms/FromRadioGroup';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { Entity } from 'types/common';\r\n\r\nexport function CustomFormAnswerQuestions({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n const { t } = useTranslation();\r\n const options = getOptions(formField);\r\n const title = `${formField.QuizScore} ${t(translations.Points) as string}`;\r\n return (\r\n \r\n );\r\n}\r\nconst indexToAlpha = (index: number): string => {\r\n return (index + 10).toString(36);\r\n};\r\n\r\nconst getOptions = (formField: IFormFieldDto): Entity[] => {\r\n switch (formField.OptionsSourceType) {\r\n case 'SimpleList':\r\n return (\r\n formField.Options?.split(';').map((s, index) => ({\r\n Id: s,\r\n Name: `${indexToAlpha(index)}. ${s}`,\r\n })) ?? []\r\n );\r\n default:\r\n console.error(\r\n `OptionsSourceType ${formField.OptionsSourceType} is not implemented`,\r\n );\r\n return [];\r\n }\r\n};\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormCheckbox } from 'app/components/Forms/FormCheckbox';\r\n\r\nexport function CustomFormCheckBox({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n //const title = `${formField.QuizScore} ${t(translations.Points) as string}`;\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormBookitDatePicker } from 'app/components/Forms/FormBookitDatePicker';\r\n\r\nexport function CustomFormDate({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n //const title = `${formField.QuizScore} ${t(translations.Points) as string}`;\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormCheckbox } from 'app/components/Forms/FormCheckbox';\r\n\r\nexport function CustomFormDisclimer({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n //const title = `${formField.QuizScore} ${t(translations.Points) as string}`;\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\n\r\nexport function CustomFormEmail({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\n\r\nexport function CustomFormNumberText({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormParagraph } from 'app/components/Forms/FormParagraph';\r\nimport parse from 'html-react-parser';\r\nexport function CustomFormParagraph({\r\n formField,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n return (\r\n \r\n }\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\n\r\nexport function CustomFormPositiveNumberText({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormRadioGroup\r\n *\r\n */\r\nimport React from 'react';\r\n\r\nimport { FormRadioGroup } from 'app/components/Forms/FromRadioGroup';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { Entity } from 'types/common';\r\n\r\nexport function CustomFormRadioGroup({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n const options = getOptions(formField);\r\n\r\n const title = formField.Description ?? undefined;\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst getOptions = (formField: IFormFieldDto): Entity[] => {\r\n if (formField) {\r\n return createOptions(formField);\r\n } else {\r\n return [] as Entity[];\r\n }\r\n};\r\nconst createOptions = (field: IFormFieldDto): Entity[] => {\r\n if (field.Options && field.Options !== null) {\r\n switch (field.OptionsSourceType) {\r\n case 'Internal':\r\n return deserializeOptions(field.Options);\r\n\r\n case 'SimpleList':\r\n return deserializeOptions(field.Options.split(','));\r\n case 'External':\r\n return [] as Entity[];\r\n }\r\n } else {\r\n return [] as Entity[];\r\n }\r\n};\r\nconst deserializeOptions = (options: any): Entity[] => {\r\n let optsArray = [] as Entity[];\r\n if (Array.isArray(options)) {\r\n optsArray = options.map(opt => {\r\n return { Id: opt, Name: opt } as Entity;\r\n });\r\n } else {\r\n try {\r\n let items = JSON.parse(options);\r\n if (Array.isArray(items)) {\r\n let arr = items.map(o => {\r\n if (typeof o == 'string') {\r\n return { Id: o, Name: o, Parent: null } as Entity;\r\n } else if (o.hasOwnProperty('id') && o.hasOwnProperty('text')) {\r\n return {\r\n Id: o.id,\r\n Name: o.text,\r\n } as Entity;\r\n } else {\r\n return undefined;\r\n }\r\n });\r\n optsArray =\r\n (arr.filter(o => o !== undefined) as Entity[]) ||\r\n ([] as Entity[]);\r\n }\r\n return optsArray;\r\n } catch {\r\n return optsArray;\r\n }\r\n }\r\n\r\n return optsArray;\r\n};\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\n\r\nexport function CustomFormRichText({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * CustomFormField\r\n *\r\n */\r\nimport React from 'react';\r\nimport { CustomFormFieldProps } from 'app/components/CustomForm/CustomFormFields';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\n\r\nexport function CustomFormShortText({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { FieldTypesUnion } from 'api/odata/generated/enums/FieldTypes';\r\nimport { Entity } from 'types/common';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { CustomFormAnswerQuestions } from './CustomFormFields/CustomFormAnswerQuestions';\r\nimport { CustomFormCheckBox } from './CustomFormFields/CustomFormCheckBox';\r\nimport { CustomFormDate } from './CustomFormFields/CustomFormDate';\r\nimport { CustomFormDisclimer as CustomFormDisclaimer } from './CustomFormFields/CustomFormDisclimer';\r\nimport { CustomFormDropDown } from './CustomFormFields/CustomFormDropDown';\r\nimport { CustomFormEmail } from './CustomFormFields/CustomFormEmail';\r\nimport { CustomFormFileUpload } from './CustomFormFields/CustomFormFileUpload';\r\nimport { CustomFormNumberText } from './CustomFormFields/CustomFormNumberText';\r\nimport { CustomFormParagraph } from './CustomFormFields/CustomFormParagraph';\r\nimport { CustomFormPositiveNumberText } from './CustomFormFields/CustomFormPositiveNumber';\r\nimport { CustomFormRadioGroup } from './CustomFormFields/CustomFormRadioGroup';\r\nimport { CustomFormRichText } from './CustomFormFields/CustomFormRichText';\r\nimport { CustomFormShortText } from './CustomFormFields/CustomFormShortText';\r\nimport { CustomFormUserSelection } from './CustomFormFields/CustomFormUserSelection';\r\n\r\nexport interface CustomFormFieldProps {\r\n name: string;\r\n id: string;\r\n formField: IFormFieldDto;\r\n readonly?: boolean;\r\n parentValue?: Entity[];\r\n disabled?: boolean;\r\n onChange?: (value: any) => void;\r\n autoFocus?: boolean;\r\n}\r\nexport function CustomFormField({\r\n formField,\r\n readonly,\r\n disabled,\r\n onChange,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n const requireComponent = (\r\n type: FieldTypesUnion,\r\n ): React.FC => {\r\n switch (type) {\r\n case 'MultipleAnswersQuestion':\r\n return CustomFormAnswerQuestions;\r\n case 'RadioButtons':\r\n return CustomFormRadioGroup;\r\n case 'CheckBox':\r\n return CustomFormCheckBox;\r\n case 'Disclaimer':\r\n return CustomFormDisclaimer;\r\n case 'Date':\r\n return CustomFormDate;\r\n case 'DropDownList':\r\n return CustomFormDropDown;\r\n case 'Email':\r\n return CustomFormEmail;\r\n case 'Number':\r\n return CustomFormNumberText;\r\n case 'PositiveNumber':\r\n return CustomFormPositiveNumberText;\r\n case 'Paragraph':\r\n return CustomFormParagraph;\r\n case 'RichText':\r\n return CustomFormRichText;\r\n case 'ShortText':\r\n return CustomFormShortText;\r\n case 'UserSelection':\r\n return CustomFormUserSelection;\r\n case 'File':\r\n return CustomFormFileUpload;\r\n case 'AlphanumericWithDashes':\r\n return CustomFormShortText;\r\n case 'FormSection':\r\n return CustomFormParagraph;\r\n default:\r\n assertExhaustive(type);\r\n }\r\n };\r\n const Component = requireComponent(formField.Type);\r\n return (\r\n \r\n );\r\n}\r\n","import { DropDown } from 'app/components/DropDown';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { Box, LinearProgress, ListItem, MenuItem } from '@material-ui/core';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { loadOfflineServiceData } from 'app/components/pickers/AutocompletePickers/OfflineServiceTypePicker';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\n\r\nexport interface AddServiceProps {\r\n getServiceTypes?: (\r\n searchTerm: string | null,\r\n ) => Promise;\r\n addService: (serviceType: IOfflineServiceFilterDto) => void;\r\n selected: IOtherServices[];\r\n disabled?: boolean;\r\n}\r\n\r\nexport function AddService({\r\n addService,\r\n getServiceTypes,\r\n selected,\r\n disabled,\r\n}: AddServiceProps) {\r\n const { t } = useTranslation();\r\n\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n\r\n const [input, setInnput] = React.useState();\r\n const fetchServiceTypes = async (): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n if (!!getServiceTypes) {\r\n try {\r\n const data = await getServiceTypes(input || null);\r\n resolve(\r\n data.filter(f => !selected.some(s => s.ServiceTypeID === f.Id)),\r\n );\r\n } catch {\r\n resolve([]);\r\n }\r\n } else {\r\n try {\r\n const data = await loadOfflineServiceData(\r\n undefined,\r\n 'base',\r\n globalServiceGroupFilter || [],\r\n )(input || null, undefined);\r\n resolve(\r\n data.value.filter(\r\n f => !selected.some(s => s.ServiceTypeID === f.Id),\r\n ),\r\n );\r\n } catch (error) {\r\n resolve([]);\r\n }\r\n }\r\n });\r\n };\r\n const [serviceTypes, setServiceTypes] = useAsyncExtendedState<\r\n IOfflineServiceFilterDto[]\r\n >([]);\r\n const [menuItems, setMenuItems] = React.useState(\r\n serviceTypes,\r\n );\r\n const [fetchServiceTypeState, fetchServiceTypePromise] = usePromise(\r\n fetchServiceTypes,\r\n );\r\n const stopImmediatePropagation = (e: any) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n React.useEffect(() => {\r\n if (serviceTypes.length === 0) {\r\n setMenuItems([]);\r\n } else {\r\n if (serviceTypes.length > 0) {\r\n if (input === undefined || input === '') {\r\n setMenuItems(serviceTypes);\r\n } else {\r\n setMenuItems(() =>\r\n serviceTypes.filter(\r\n f => f.Name.toLowerCase().indexOf(input.toLowerCase()) > -1,\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n }, [input, serviceTypes]);\r\n\r\n return (\r\n setServiceTypes(fetchServiceTypePromise())}\r\n onHandleClose={() => setInnput(undefined)}\r\n menuChildren={onClose => [\r\n e.stopPropagation()}\r\n onClickCapture={stopImmediatePropagation}\r\n >\r\n \r\n }\r\n value={input || ''}\r\n size=\"small\"\r\n aria-label={t(translations.SearchFilter)}\r\n inputProps={{\r\n 'aria-label': t(translations.SearchFilter),\r\n }}\r\n onChange={e => {\r\n setInnput(e.target.value);\r\n }}\r\n autoFocus\r\n fullWidth\r\n />\r\n ,\r\n ...[\r\n fetchServiceTypeState.status === 'pending'\r\n ? [\r\n \r\n \r\n \r\n \r\n ,\r\n ]\r\n : menuItems.length > 0\r\n ? [\r\n ...menuItems.map(s => (\r\n {\r\n addService(s);\r\n onClose();\r\n }}\r\n >\r\n {s.Name}\r\n \r\n )),\r\n ]\r\n : [\r\n \r\n \r\n \r\n {t(translations.NotFound)}\r\n \r\n \r\n ,\r\n ],\r\n ],\r\n ]}\r\n menuProps={{\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n },\r\n transformOrigin: {\r\n vertical: 'top',\r\n horizontal: 'left',\r\n },\r\n getContentAnchorEl: null,\r\n }}\r\n addChevron\r\n >\r\n {t(translations.AddConsumable)}\r\n \r\n );\r\n}\r\n","import { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { BookitChip } from 'app/components/BasicChip';\r\nimport {\r\n BatchesByServiceTypeFilter,\r\n convertInventoryBatchName,\r\n loadInventoryBatchesData,\r\n} from 'app/components/pickers/AutocompletePickers/InventoryBatchesPicker';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { InventoryBatchList } from './InventoryBatchList';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectCreatableService,\r\n selectInventoryBatchEditable,\r\n} from '../slice/selectors';\r\nimport { useOfflineServiceStateSlice } from '../slice';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport interface InventoryBatchChipProps {\r\n renderService: IOtherServices;\r\n onServiceClick?: (service: IOtherServices) => void;\r\n onAddBatchClick?: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n renewStock?: boolean;\r\n isAdmin?: boolean;\r\n handleServiceChange: (item: IOtherServices) => Promise;\r\n disabled?: boolean;\r\n onRenewStockClick?: (service: IOtherServices) => void;\r\n}\r\nexport const InventoryBatchChip = React.memo(function InventoryBatchChip(\r\n props: InventoryBatchChipProps,\r\n) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const {\r\n renderService,\r\n onServiceClick,\r\n onAddBatchClick,\r\n renewStock,\r\n isAdmin,\r\n handleServiceChange,\r\n disabled,\r\n onRenewStockClick,\r\n } = props;\r\n const batchRequested = useSelector(selectInventoryBatchEditable);\r\n const savedCreatableRenewal = useSelector(selectCreatableService);\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const handleBatchListOpen = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n const handleBatchListClose = () => {\r\n setAnchorEl(null);\r\n };\r\n const availableBatches = useAsyncGetWthEffect(\r\n async () =>\r\n loadInventoryBatchesData(\r\n BatchesByServiceTypeFilter(\r\n renderService.ServiceTypeID,\r\n renewStock === true ? undefined : true,\r\n ),\r\n )(null, undefined).then(res => res.value),\r\n [],\r\n [renderService, batchRequested, savedCreatableRenewal],\r\n );\r\n const currentBatch = React.useMemo(() => {\r\n return renderService.InventoryBatchesEnabled\r\n ? renderService.InventoryBatchId !== null\r\n ? availableBatches.find(f => f.Id === renderService.InventoryBatchId)\r\n : null\r\n : null;\r\n }, [\r\n availableBatches,\r\n renderService.InventoryBatchId,\r\n renderService.InventoryBatchesEnabled,\r\n ]);\r\n const onChipClick = event => {\r\n if (renewStock && !onAddBatchClick) {\r\n !!onServiceClick && onServiceClick(renderService);\r\n } else {\r\n if (isAdmin && !disabled) {\r\n handleBatchListOpen(event);\r\n }\r\n }\r\n };\r\n const handleChipSelect = React.useCallback(\r\n (batch: IInventoryBatchDto) => {\r\n return new Promise(async resolve => {\r\n try {\r\n handleBatchListClose();\r\n await handleServiceChange(\r\n Object.assign({}, renderService, {\r\n InventoryBatchId: batch.Id,\r\n InventoryBatchName: batch.Name,\r\n InventoryBatchAmount: batch.Inventory,\r\n }),\r\n );\r\n } catch (error) {}\r\n });\r\n },\r\n [handleServiceChange, renderService],\r\n );\r\n React.useEffect(() => {\r\n if (batchRequested !== undefined) {\r\n handleChipSelect(batchRequested);\r\n dispatch(actions.setInventoryBatchEditable(undefined));\r\n }\r\n }, [actions, batchRequested, dispatch, handleChipSelect]);\r\n React.useEffect(() => {\r\n if (savedCreatableRenewal !== undefined) {\r\n handleChipSelect({\r\n Id: savedCreatableRenewal.InventoryBatchId,\r\n Name: savedCreatableRenewal.InventoryBatchName,\r\n Inventory: savedCreatableRenewal.InventoryBatchAmount,\r\n } as IInventoryBatchDto);\r\n dispatch(actions.getCreatableService(undefined));\r\n }\r\n }, [actions, dispatch, handleChipSelect, savedCreatableRenewal]);\r\n return (\r\n \r\n \r\n {(!renewStock || (renewStock && !!onAddBatchClick)) && (\r\n {\r\n !!onAddBatchClick &&\r\n onAddBatchClick(null, renderService.ServiceTypeID);\r\n handleBatchListClose();\r\n }}\r\n isAdmin={isAdmin ?? false}\r\n onClose={handleBatchListClose}\r\n serviceTypeId={renderService.ServiceTypeID}\r\n onBatchClick={handleChipSelect}\r\n selectedBatch={currentBatch ?? undefined}\r\n showRenewStockButtons={!renewStock}\r\n createdRenewal={savedCreatableRenewal}\r\n onRenewStockClick={batchId => {\r\n !!onRenewStockClick &&\r\n onRenewStockClick(\r\n Object.assign({}, renderService, {\r\n InventoryBatchId: batchId ?? null,\r\n }),\r\n );\r\n handleBatchListClose();\r\n }}\r\n batches={[]}\r\n />\r\n )}\r\n \r\n );\r\n});\r\n","import { useTheme, FormHelperText } from '@material-ui/core';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\n\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport BaseTextField from 'app/components/BasicInputs/BaseTextField';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { AuthenticatedUser, IIsAdminOfParams } from 'types/AuthenticatedUser';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { ErrorServices } from '../slice/types';\r\nimport { InventoryBatchChip } from './InventoryBatchChip';\r\n\r\nexport interface QuickServiceItemProps {\r\n service: IOtherServices;\r\n handleRemove: (item: IOtherServices) => Promise;\r\n handleChange: (item: IOtherServices) => Promise;\r\n onServiceClick?: (item: IOtherServices) => void;\r\n mandatory?: boolean;\r\n isEditMode?: boolean;\r\n createdEditable?: boolean;\r\n count: number | null;\r\n minStep: number;\r\n step: number;\r\n maxStep: number;\r\n disabled?: boolean;\r\n renewStock?: boolean;\r\n user?: AuthenticatedUser;\r\n onAddBatchClick?: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n onRenewStockClick?: (service: IOtherServices) => void;\r\n setError?: (error: ErrorServices) => void;\r\n focused?: boolean;\r\n}\r\nconst QuickItem = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n background: theme.palette.common.white,\r\n boxShadow: 'inset 0px -1px 0px #E3E8EF',\r\n '& .errorsRoot': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n },\r\n '& .contentRoot': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '12px 12px',\r\n gap: '8px',\r\n '& .textandImage': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '0px',\r\n gap: '12px',\r\n width: '100%',\r\n flexGrow: 1,\r\n },\r\n '& .quantity': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '0px',\r\n gap: '8px',\r\n flexGrow: 0,\r\n },\r\n '& .adjustment': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: '0px 0px 0px 8px',\r\n gap: '10px',\r\n },\r\n },\r\n '& .bottomRoot': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n justifyContent: 'flex-end',\r\n padding: '0px 8px 8px 8px',\r\n },\r\n}));\r\n\r\nexport const QuickServiceItem = React.memo(function QuickServiceItem(\r\n props: QuickServiceItemProps,\r\n) {\r\n const { t } = useTranslation();\r\n const {\r\n service,\r\n mandatory,\r\n handleChange,\r\n handleRemove,\r\n onServiceClick,\r\n isEditMode,\r\n createdEditable,\r\n count,\r\n minStep,\r\n step,\r\n maxStep,\r\n disabled,\r\n renewStock,\r\n onAddBatchClick,\r\n onRenewStockClick,\r\n user,\r\n setError,\r\n focused,\r\n } = props;\r\n const theme = useTheme();\r\n const inputProps = {\r\n step: step,\r\n min: minStep,\r\n max: maxStep,\r\n 'aria-label': 'Counter',\r\n style: {\r\n minWidth: '30px',\r\n padding: '6px 6px',\r\n textAlign: 'center' as 'center',\r\n },\r\n };\r\n const [errorMessage, setErrorMessage] = React.useState(\r\n undefined,\r\n );\r\n const handleAddError = React.useCallback(\r\n (error: string | undefined) => {\r\n setErrorMessage(error);\r\n if (!!setError) {\r\n setError({\r\n id: service.ServiceTypeID,\r\n error: !!error ? `${service.ServiceType}: ${error}` : undefined,\r\n } as ErrorServices);\r\n }\r\n },\r\n [service.ServiceType, service.ServiceTypeID, setError],\r\n );\r\n const [quantity, setQuantity] = React.useState(count);\r\n React.useEffect(() => {\r\n setQuantity(count);\r\n }, [count]);\r\n React.useEffect(() => {\r\n if (quantity === null || quantity === undefined || quantity === 0) {\r\n handleAddError(t(translations.err_Quantity_required) as string);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [quantity, t]);\r\n\r\n // const IsGroupAdmin = React.useMemo(() => {\r\n // return user?.HasAdminGroupPermissions(service?.ServiceGroupId ?? undefined);\r\n // }, [service?.ServiceGroupId, user]);\r\n const IsAdminOfService = React.useMemo(() => {\r\n return user?.IsAdminOf({\r\n ServiceGroupId: service?.ServiceGroupId,\r\n ServiceId: service?.Id,\r\n ServiceTypeId: ServiceType.Offline,\r\n } as IIsAdminOfParams);\r\n }, [service?.Id, service?.ServiceGroupId, user]);\r\n const [counterUpdated, setCounterUpdated] = React.useState(false);\r\n const arrowTitle = React.useMemo(() => {\r\n if (service.TrackInventory && service.RenewStockInventory) {\r\n return t(translations.RenewStockArrow_info) as string;\r\n } else {\r\n return isEditMode && service.Id > 0\r\n ? (t(translations.ReservationOfflineServiceEditArrow_info) as string)\r\n : createdEditable\r\n ? (t(translations.ConsumableCreateArrow_info) as string)\r\n : (t(translations.ReservationOfflineServiceCreateArrow_info) as string);\r\n }\r\n }, [\r\n createdEditable,\r\n isEditMode,\r\n service.Id,\r\n service.RenewStockInventory,\r\n service.TrackInventory,\r\n t,\r\n ]);\r\n const serviceChange = React.useCallback(\r\n (change: number | null, item: IOtherServices, withError?: boolean) => {\r\n return new Promise(async resolve => {\r\n const precision = service.IntQuantityOnly === true ? 0 : 2;\r\n try {\r\n await handleChange(\r\n Object.assign({}, item, {\r\n Quantity: change === null ? null : +change.toFixed(precision),\r\n DefaultQuantity: change === null ? null : item.DefaultQuantity,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(item.ServiceDate),\r\n ),\r\n }),\r\n );\r\n\r\n setQuantity(change === null ? null : +change.toFixed(precision));\r\n setCounterUpdated(false);\r\n if (!withError) {\r\n handleAddError(undefined);\r\n }\r\n } catch (error) {\r\n handleAddError(error as string);\r\n setQuantity(change === null ? null : +change.toFixed(precision));\r\n setCounterUpdated(false);\r\n }\r\n });\r\n },\r\n [handleAddError, handleChange, service.IntQuantityOnly],\r\n );\r\n const remove = (service: IOtherServices) => {\r\n return new Promise(async resolve => {\r\n try {\r\n await handleRemove(service);\r\n resolve(undefined);\r\n setCounterUpdated(false);\r\n } catch (error) {\r\n handleAddError(error as string);\r\n setCounterUpdated(false);\r\n }\r\n });\r\n };\r\n const onInputChange = React.useCallback(\r\n event => {\r\n const precision = service.IntQuantityOnly === true ? 0 : 2;\r\n if (event.target.value === '') {\r\n //setCounterUpdated(true);\r\n setQuantity(null);\r\n serviceChange(null, service, true);\r\n handleAddError(\r\n (t(translations.err_LowQuantity) as string).replace(\r\n '{0}',\r\n minStep.toString(),\r\n ),\r\n );\r\n return;\r\n } else {\r\n const value = +(+event.target.value).toFixed(precision);\r\n if (value < minStep) {\r\n // event.preventDefault();\r\n // event.stopPropagation();\r\n setCounterUpdated(true);\r\n serviceChange(value, service, true);\r\n handleAddError(\r\n (t(translations.err_LowQuantity) as string).replace(\r\n '{0}',\r\n minStep.toString(),\r\n ),\r\n );\r\n } else if (value > 0 && value > maxStep) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n handleAddError(\r\n (t(translations.err_HighQuantity) as string).replace(\r\n '{0}',\r\n maxStep.toString(),\r\n ),\r\n );\r\n } else {\r\n handleAddError(undefined);\r\n // setCounterUpdated(true);\r\n serviceChange(value, service);\r\n }\r\n }\r\n },\r\n [handleAddError, maxStep, minStep, service, serviceChange, t],\r\n );\r\n return (\r\n \r\n
    \r\n \r\n {errorMessage}\r\n \r\n
    \r\n
    \r\n
    \r\n {`${service.ServiceType}`}\r\n
    \r\n
    \r\n {\r\n let valid = mandatory\r\n ? (quantity ?? 0) - step > 0\r\n : (quantity ?? 0) - step >= 0;\r\n if (\r\n !mandatory &&\r\n !valid &&\r\n (quantity === null || quantity <= 0)\r\n ) {\r\n setCounterUpdated(true);\r\n remove(service);\r\n return;\r\n }\r\n if (valid) {\r\n handleAddError(undefined);\r\n if (!mandatory && (quantity ?? 0) - step === 0) {\r\n setCounterUpdated(true);\r\n remove(service);\r\n } else {\r\n setCounterUpdated(true);\r\n serviceChange((quantity ?? 0) - step, service);\r\n }\r\n } else {\r\n handleAddError(\r\n (t(translations.err_LowQuantity) as string).replace(\r\n '{0}',\r\n minStep.toString(),\r\n ),\r\n );\r\n }\r\n }}\r\n >\r\n {(quantity ?? 0) <= step ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n {\r\n let valid = (quantity ?? 0) + step < maxStep;\r\n if (valid) {\r\n setCounterUpdated(true);\r\n serviceChange((quantity ?? 0) + step, service);\r\n } else {\r\n handleAddError(\r\n (t(translations.err_HighQuantity) as string).replace(\r\n '{0}',\r\n maxStep.toString(),\r\n ),\r\n );\r\n }\r\n }}\r\n >\r\n \r\n \r\n
    \r\n\r\n
    \r\n {counterUpdated ? (\r\n \r\n \r\n \r\n ) : (\r\n !!onServiceClick && onServiceClick(service)}\r\n >\r\n \r\n \r\n )}\r\n
    \r\n
    \r\n {service.InventoryBatchesEnabled && IsAdminOfService && (\r\n
    \r\n 0}\r\n onRenewStockClick={onRenewStockClick}\r\n />\r\n
    \r\n )}\r\n
    \r\n );\r\n});\r\nconst StyledBaseTextField = styled(BaseTextField)(({ theme }) => ({\r\n '& input[type=number]': {\r\n '-moz-appearance': 'textfield',\r\n },\r\n '& input[type=number]::-webkit-outer-spin-button': {\r\n '-webkit-appearance': 'none',\r\n margin: 0,\r\n },\r\n '& input[type=number]::-webkit-inner-spin-button': {\r\n '-webkit-appearance': 'none',\r\n margin: 0,\r\n },\r\n}));\r\n","import { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { GetRawValue } from 'app/components/BasicTable/types/FilterParam';\r\n\r\nimport { AssetsSelectionProps } from 'app/pages/MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport { PageTopActionsProps } from '../type';\r\n\r\nexport function AddConsumable(\r\n props: PageTopActionsProps & { services: number[] },\r\n) {\r\n const location = useLocation();\r\n //const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const { t } = useTranslation();\r\n const {\r\n size,\r\n text,\r\n variant,\r\n icon,\r\n services,\r\n disabled,\r\n compact = true,\r\n } = props;\r\n\r\n return (\r\n {\r\n let selParams = {\r\n useSidePanel: true,\r\n actionType: 'OfflineService',\r\n offTypeIds:\r\n services.length > 0\r\n ? services.join(',')\r\n : GetRawValue(new URLSearchParams(location.search), 'stid'),\r\n } as AssetsSelectionProps;\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.AssetsSelection,\r\n props: selParams,\r\n expanded: false,\r\n }),\r\n );\r\n }}\r\n />\r\n );\r\n}\r\nexport function AddCoverConsumable(\r\n props: PageTopActionsProps & {\r\n services: number[];\r\n onAddClick: (services: number[]) => void;\r\n },\r\n) {\r\n const { t } = useTranslation();\r\n const {\r\n size,\r\n text,\r\n variant,\r\n icon,\r\n services,\r\n disabled,\r\n onAddClick,\r\n compact = true,\r\n } = props;\r\n\r\n return (\r\n onAddClick(services)}\r\n />\r\n );\r\n}\r\n","import { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { AddCoverConsumable } from 'app/pages/Actions/PageTopActions/AddConsumable';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport {\r\n selectBarcodeScanned,\r\n selectSelectedServiceType,\r\n} from '../slice/selectors';\r\nimport * as React from 'react';\r\nimport { useOfflineServiceStateSlice } from '../slice';\r\nimport { loadOfflineServiceData } from 'app/components/pickers/AutocompletePickers/OfflineServiceTypePicker';\r\n\r\nexport interface AddServiceFromSelectionProps {\r\n onAddClick: (services: number[]) => void;\r\n getServiceTypes?: (\r\n searchTerm: string | null,\r\n ) => Promise;\r\n addServices: (serviceType: IOfflineServiceFilterDto[]) => void;\r\n removeServices: (services: IOtherServices[]) => void;\r\n addAndRemoveServices: (\r\n serviceType: IOfflineServiceFilterDto[],\r\n services: IOtherServices[],\r\n ) => void;\r\n selected: IOtherServices[];\r\n disabled?: boolean;\r\n}\r\nexport function AddServiceFromSelection(props: AddServiceFromSelectionProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const {\r\n getServiceTypes,\r\n addServices,\r\n selected,\r\n disabled,\r\n onAddClick,\r\n removeServices,\r\n addAndRemoveServices,\r\n } = props;\r\n const newSelectedServices = useSelector(selectSelectedServiceType);\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const [updated, setUpdated] = React.useState(undefined);\r\n const isBarcodeScanned = useSelector(selectBarcodeScanned);\r\n const fetchServiceTypes = async (): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n if (!!getServiceTypes) {\r\n try {\r\n const data = await getServiceTypes(null);\r\n resolve(\r\n data.filter(f => !selected.some(s => s.ServiceTypeID === f.Id)),\r\n );\r\n } catch {\r\n resolve([]);\r\n }\r\n } else {\r\n try {\r\n const data = await loadOfflineServiceData(\r\n undefined,\r\n 'base',\r\n globalServiceGroupFilter || [],\r\n undefined,\r\n 'InventoryBatches',\r\n )(null, undefined);\r\n resolve(\r\n data.value.filter(\r\n f => !selected.some(s => s.ServiceTypeID === f.Id),\r\n ),\r\n );\r\n } catch (error) {\r\n resolve([]);\r\n }\r\n }\r\n });\r\n };\r\n const [serviceTypes, setServiceTypes] = useAsyncExtendedState<\r\n IOfflineServiceFilterDto[]\r\n >([]);\r\n const [fetchServiceTypeState, fetchServiceTypePromise] = usePromise(\r\n fetchServiceTypes,\r\n );\r\n React.useEffect(() => {\r\n if (\r\n newSelectedServices.length > 0 &&\r\n !updated &&\r\n fetchServiceTypeState.status !== 'pending'\r\n ) {\r\n setServiceTypes(fetchServiceTypePromise());\r\n setUpdated(true);\r\n }\r\n }, [\r\n actions,\r\n dispatch,\r\n fetchServiceTypePromise,\r\n fetchServiceTypeState.status,\r\n newSelectedServices,\r\n newSelectedServices.length,\r\n selected,\r\n serviceTypes,\r\n setServiceTypes,\r\n updated,\r\n ]);\r\n React.useEffect(() => {\r\n let added = newSelectedServices.filter(\r\n f => !selected.some(s => s.ServiceTypeID === f),\r\n );\r\n let removed = isBarcodeScanned\r\n ? []\r\n : selected.filter(\r\n f => !newSelectedServices.some(c => c === f.ServiceTypeID),\r\n );\r\n if (\r\n (added.length > 0 || removed.length > 0) &&\r\n updated &&\r\n fetchServiceTypeState.status === 'resolved' &&\r\n serviceTypes.length > 0\r\n ) {\r\n setUpdated(undefined);\r\n dispatch(actions.resetSelectedServiceType());\r\n dispatch(actions.setBarcodeScanned(undefined));\r\n\r\n if (added.length > 0 && removed.length > 0) {\r\n addAndRemoveServices(\r\n serviceTypes.filter(f => added.includes(f.Id)),\r\n removed,\r\n );\r\n } else {\r\n if (added.length > 0) {\r\n addServices(serviceTypes.filter(f => added.includes(f.Id)));\r\n }\r\n if (removed.length > 0) {\r\n removeServices(removed);\r\n }\r\n }\r\n\r\n setServiceTypes([]);\r\n }\r\n }, [\r\n actions,\r\n addAndRemoveServices,\r\n addServices,\r\n dispatch,\r\n fetchServiceTypeState.status,\r\n isBarcodeScanned,\r\n newSelectedServices,\r\n removeServices,\r\n selected,\r\n serviceTypes,\r\n setServiceTypes,\r\n updated,\r\n ]);\r\n return (\r\n f.ServiceTypeID)}\r\n disabled={disabled}\r\n onAddClick={onAddClick}\r\n />\r\n );\r\n}\r\n","import { useTheme } from '@material-ui/core';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport * as React from 'react';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { AddService } from './AddService';\r\nimport { QuickServiceItem } from './QuickServiceItem';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { selectRefreshOfflineServices } from 'app/pages/ReservationDetails/Details/slice/selectors';\r\nimport { useReservationSlice } from 'app/pages/ReservationDetails/Details/slice';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { AddServiceFromSelection } from './AddServiceFromSelection';\r\nimport { AssetsSelectionProps } from 'app/pages/MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { ScannerView } from 'app/components/ScannerView';\r\nimport { selectRefreshConsumableServices } from '../slice/selectors';\r\nimport { useOfflineServiceStateSlice } from '../slice';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { ErrorServices } from '../slice/types';\r\nimport clsx from 'clsx';\r\nimport styled from 'styled-components';\r\n\r\nexport interface BookQuickServicesProps {\r\n initServicesFunc: () => Promise;\r\n loadSeviceTypes?: (\r\n searchTerm: string | null,\r\n ) => Promise;\r\n onServiceUpdate?: (service: IOtherServices) => Promise;\r\n onServiceRemove?: (service: IOtherServices) => Promise;\r\n onServicesRemove?: (service: IOtherServices[]) => Promise;\r\n onServiceClick?: (item: IOtherServices) => void;\r\n onRenewStockClick?: (service: IOtherServices) => void;\r\n onAddBatchClick?: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n createServiceFromServiceType?: (\r\n serviceTypes: IOfflineServiceFilterDto,\r\n ) => Promise;\r\n createServicesFromServiceType?: (\r\n serviceTypes: IOfflineServiceFilterDto[],\r\n ) => Promise;\r\n userName?: string;\r\n isEditMode?: boolean;\r\n disabled?: boolean;\r\n useAssetSelection?: boolean;\r\n onAddClick?: (services: number[]) => void;\r\n onAddAndRemoveServices?: (\r\n serviceType: IOfflineServiceFilterDto[],\r\n services: IOtherServices[],\r\n ) => Promise;\r\n createdEditable?: boolean;\r\n renewStock?: boolean;\r\n setError?: (errors: ErrorServices) => void;\r\n}\r\nconst QuickServiceItems = styled('div')(({ theme }) => ({\r\n width: '100%',\r\n '& .addNewSection': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: '16px',\r\n '&.hasServices': {\r\n padding: '16px 0px 0px',\r\n },\r\n '& .sectionRow': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: '0',\r\n gap: '12px',\r\n '& .sectionItems': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '0',\r\n gap: '8px',\r\n },\r\n },\r\n },\r\n}));\r\n\r\nexport const BookQuickServices = React.memo(function BookQuickServices(\r\n props: BookQuickServicesProps,\r\n) {\r\n const user = useSelector(selectAuthenticatedUser);\r\n const refreshServices = useSelector(selectRefreshOfflineServices);\r\n const refreshCosumables = useSelector(selectRefreshConsumableServices);\r\n const dispatch = useDispatch();\r\n const { actions } = useReservationSlice();\r\n const { actions: offlineActions } = useOfflineServiceStateSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const {\r\n initServicesFunc,\r\n onServiceRemove,\r\n onServicesRemove,\r\n onServiceUpdate,\r\n createServiceFromServiceType,\r\n createServicesFromServiceType,\r\n loadSeviceTypes,\r\n onServiceClick,\r\n userName,\r\n isEditMode,\r\n disabled,\r\n useAssetSelection,\r\n onAddClick,\r\n onAddAndRemoveServices,\r\n createdEditable,\r\n renewStock,\r\n onAddBatchClick,\r\n onRenewStockClick,\r\n setError,\r\n } = props;\r\n const theme = useTheme();\r\n const fetchServices = async (): Promise => {\r\n return new Promise(async resolve => {\r\n try {\r\n let data = await initServicesFunc();\r\n resolve(data);\r\n } catch {\r\n resolve([]);\r\n }\r\n });\r\n };\r\n const { newDate, getOffsetDate } = useSystemDate();\r\n const currentUser = React.useMemo(() => {\r\n return !!userName ? userName : user?.Id;\r\n }, [user?.Id, userName]);\r\n const [serviceCreated, setServiceCreated] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [services, setServices] = useAsyncExtendedState([]);\r\n const [fetchServicesState, fetchServicesPromise] = usePromise(fetchServices);\r\n React.useEffect(() => {\r\n if (\r\n !fetchServicesState.status ||\r\n (fetchServicesState.status !== 'pending' &&\r\n fetchServicesState.status !== 'resolved')\r\n ) {\r\n setServices(fetchServicesPromise());\r\n }\r\n return () => {};\r\n }, [\r\n fetchServicesPromise,\r\n fetchServicesState.status,\r\n initServicesFunc,\r\n setServices,\r\n ]);\r\n React.useEffect(() => {\r\n let active = refreshServices || refreshCosumables;\r\n if (active === true && fetchServicesState.status !== 'pending') {\r\n dispatch(actions.setRefreshOfflineServices(undefined));\r\n dispatch(offlineActions.setRefreshConsumableOfflineServices(undefined));\r\n setServices(fetchServicesPromise());\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n dispatch,\r\n fetchServicesPromise,\r\n fetchServicesState.status,\r\n initServicesFunc,\r\n offlineActions,\r\n refreshCosumables,\r\n refreshServices,\r\n setServices,\r\n ]);\r\n const handleServiceChange = async (service: IOtherServices) => {\r\n return new Promise(async (resolve, reject) => {\r\n if (!!onServiceUpdate) {\r\n try {\r\n let data = await onServiceUpdate(service);\r\n if (!!data) {\r\n setServices(\r\n services.map(f => {\r\n if (f.ServiceTypeID === service.ServiceTypeID) {\r\n return Object.assign({}, f, service);\r\n } else {\r\n return f;\r\n }\r\n }),\r\n );\r\n resolve(data);\r\n } else {\r\n reject('error occured');\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n } else {\r\n setServices(\r\n services.map(f => {\r\n if (f.ServiceTypeID === service.ServiceTypeID) {\r\n return Object.assign({}, f, service);\r\n } else {\r\n return f;\r\n }\r\n }),\r\n );\r\n resolve(service);\r\n }\r\n });\r\n };\r\n const handleRemoveService = async (service: IOtherServices) => {\r\n return new Promise(async (resolve, reject) => {\r\n if (!!onServiceRemove) {\r\n try {\r\n let res = await onServiceRemove(service);\r\n setServices(\r\n services.filter(f => {\r\n if (isEditMode) {\r\n return f.Id !== service.Id;\r\n } else {\r\n return f.ServiceTypeID !== service.ServiceTypeID;\r\n }\r\n }),\r\n );\r\n resolve(res);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n } else {\r\n setServices(\r\n services.filter(f => {\r\n return f.ServiceTypeID !== service.ServiceTypeID;\r\n }),\r\n );\r\n resolve(service);\r\n }\r\n });\r\n };\r\n const handleAddService = React.useCallback(\r\n (serviceType: IOfflineServiceFilterDto) => {\r\n setServiceCreated(true);\r\n setServices(\r\n new Promise(async resolve => {\r\n try {\r\n if (!!createServiceFromServiceType) {\r\n let data = await createServiceFromServiceType(serviceType);\r\n if (!!data) {\r\n resolve([...services, data]);\r\n } else {\r\n resolve([...services]);\r\n }\r\n } else {\r\n let batch = serviceType.InventoryBatchesEnabled\r\n ? !!serviceType.InventoryBatches &&\r\n serviceType.InventoryBatches.length > 0\r\n ? serviceType.InventoryBatches.filter(\r\n f =>\r\n (f.ExpirationDate === null ||\r\n getOffsetDate(f.ExpirationDate) > newDate()) &&\r\n (serviceType.NotLessThanZero\r\n ? f.Inventory > 0\r\n : true) &&\r\n (renewStock === true || f.StokRenewed === true),\r\n ).sort((a, b) => b.Id - a.Id)[0]\r\n : null\r\n : null;\r\n resolve([\r\n ...services,\r\n {\r\n Id: 0,\r\n ServiceTypeID: serviceType.Id,\r\n BookedBy: currentUser,\r\n DefaultQuantity: serviceType.DefaultQuantity,\r\n IntQuantityOnly: serviceType.IntQuantityOnly,\r\n Mandatory: false,\r\n Quantity: serviceType.DefaultQuantity,\r\n ServiceDate: newDate(),\r\n ServiceType: serviceType.Name,\r\n Units: serviceType.UnitTypeName,\r\n ServiceGroupId: serviceType.ServiceGroupId,\r\n NotLessThanZero: serviceType.NotLessThanZero,\r\n TrackInventory: serviceType.TrackInventory,\r\n InventoryBatchesEnabled: serviceType.InventoryBatchesEnabled,\r\n InventoryBatchId: batch === null ? null : batch.Id,\r\n InventoryBatchName: batch === null ? null : batch.Name,\r\n InventoryBatchAmount: batch === null ? null : batch.Inventory,\r\n } as IOtherServices,\r\n ]);\r\n }\r\n } catch {\r\n resolve([...services]);\r\n } finally {\r\n setServiceCreated(undefined);\r\n }\r\n }),\r\n );\r\n },\r\n [\r\n createServiceFromServiceType,\r\n currentUser,\r\n getOffsetDate,\r\n newDate,\r\n renewStock,\r\n services,\r\n setServices,\r\n ],\r\n );\r\n const handleAddServices = React.useCallback(\r\n (serviceTypes: IOfflineServiceFilterDto[]) => {\r\n setServiceCreated(true);\r\n setServices(\r\n new Promise(async resolve => {\r\n try {\r\n if (!!createServicesFromServiceType) {\r\n let data = await createServicesFromServiceType(serviceTypes);\r\n if (!!data && data.length > 0) {\r\n resolve([...services, ...data]);\r\n } else {\r\n resolve([...services]);\r\n }\r\n } else {\r\n resolve([\r\n ...services,\r\n ...serviceTypes.map(s => {\r\n let batch = s.InventoryBatchesEnabled\r\n ? !!s.InventoryBatches && s.InventoryBatches.length > 0\r\n ? s.InventoryBatches.filter(\r\n f =>\r\n (f.ExpirationDate === null ||\r\n getOffsetDate(f.ExpirationDate) > newDate()) &&\r\n (s.NotLessThanZero ? f.Inventory > 0 : true) &&\r\n (renewStock === true || f.StokRenewed === true),\r\n ).sort((a, b) => b.Id - a.Id)[0]\r\n : null\r\n : null;\r\n return {\r\n Id: 0,\r\n ServiceTypeID: s.Id,\r\n BookedBy: currentUser,\r\n DefaultQuantity: s.DefaultQuantity,\r\n IntQuantityOnly: s.IntQuantityOnly,\r\n Mandatory: false,\r\n Quantity: s.DefaultQuantity,\r\n ServiceDate: newDate(),\r\n ServiceType: s.Name,\r\n Units: s.UnitTypeName,\r\n UnitTypeId: s.UnitTypeID,\r\n ServiceGroupId: s.ServiceGroupId,\r\n NotLessThanZero: s.NotLessThanZero,\r\n TrackInventory: s.TrackInventory,\r\n InventoryBatchesEnabled: s.InventoryBatchesEnabled,\r\n InventoryBatchId: batch === null ? null : batch.Id,\r\n InventoryBatchName: batch === null ? null : batch.Name,\r\n InventoryBatchAmount:\r\n batch === null ? null : batch.Inventory,\r\n } as IOtherServices;\r\n }),\r\n ]);\r\n }\r\n } catch {\r\n resolve([...services]);\r\n } finally {\r\n setServiceCreated(undefined);\r\n }\r\n }),\r\n );\r\n },\r\n [\r\n createServicesFromServiceType,\r\n currentUser,\r\n getOffsetDate,\r\n newDate,\r\n renewStock,\r\n services,\r\n setServices,\r\n ],\r\n );\r\n const handleRemoveServices = async (items: IOtherServices[]) => {\r\n return new Promise(async (resolve, reject) => {\r\n if (!!onServicesRemove) {\r\n try {\r\n let res = await onServicesRemove(items);\r\n setServices(\r\n services.filter(f => {\r\n if (isEditMode) {\r\n return !items.some(a => a.Id === f.Id);\r\n } else {\r\n return !items.some(a => a.ServiceTypeID === f.ServiceTypeID);\r\n }\r\n }),\r\n );\r\n resolve(res);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n } else {\r\n let newServices = services.filter(f => {\r\n return !items.some(a => a.ServiceTypeID === f.ServiceTypeID);\r\n });\r\n setServices(newServices);\r\n resolve(newServices);\r\n }\r\n });\r\n };\r\n const handleAddAndRemoveServices = async (\r\n serviceTypes: IOfflineServiceFilterDto[],\r\n removed: IOtherServices[],\r\n ) => {\r\n return new Promise(async (resolve, reject) => {\r\n if (!!onAddAndRemoveServices) {\r\n try {\r\n let res = await onAddAndRemoveServices(serviceTypes, removed);\r\n setServices(res);\r\n resolve(res);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n } else {\r\n let staticServices = serviceTypes.map(s => {\r\n return {\r\n Id: 0,\r\n ServiceTypeID: s.Id,\r\n BookedBy: currentUser,\r\n DefaultQuantity: s.DefaultQuantity,\r\n IntQuantityOnly: s.IntQuantityOnly,\r\n Mandatory: false,\r\n Quantity: s.DefaultQuantity,\r\n ServiceDate: newDate(),\r\n ServiceType: s.Name,\r\n Units: s.UnitTypeName,\r\n ServiceGroupId: s.ServiceGroupId,\r\n } as IOtherServices;\r\n });\r\n let addedServ = staticServices.filter(\r\n f => !services.some(s => s.ServiceTypeID === f.ServiceTypeID),\r\n );\r\n let otherServices = services.filter(f => {\r\n return !removed.some(a => a.ServiceTypeID === f.ServiceTypeID);\r\n });\r\n setServices([...otherServices, ...addedServ]);\r\n resolve([...otherServices, ...addedServ]);\r\n }\r\n });\r\n };\r\n const focusedService = React.useMemo(() => {\r\n return services.some(f => f.Quantity === null && f.DefaultQuantity === null)\r\n ? services.filter(\r\n f => f.Quantity === null && f.DefaultQuantity === null,\r\n )[0]\r\n : services[0];\r\n }, [services]);\r\n return (\r\n \r\n {services.map(item => (\r\n \r\n ))}\r\n 0 })}\r\n >\r\n {useAssetSelection && services.length < 1 && }\r\n\r\n
    \r\n
    \r\n {useAssetSelection ? (\r\n \r\n {\r\n let selParams = {\r\n useSidePanel: true,\r\n actionType: 'OfflineService',\r\n offTypeIds: services,\r\n } as AssetsSelectionProps;\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.AssetsSelection,\r\n props: selParams,\r\n expanded: false,\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 * This file is only need if you want to extract messages into JSON files in locales folder\r\n * AND if you are also using the object syntax instead of string syntax. \\\r\n * Check the documentation section i18n for details\r\n */\r\nimport { translations } from 'locales/translations';\r\nimport { _t } from 'utils/messages';\r\n\r\nexport const messages = {\r\n bookitlab: () => _t(translations.BookitLab),\r\n};\r\n","import * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { ISchedulerState } from '../types/ISchedulerState';\r\nimport { ISchedulerParseEvent } from '../types/ISchedulerParseEvent';\r\nimport { ISchedulerEvent } from '../types/ISchedulerEvent';\r\nimport { EventType } from '../slice/types';\r\nimport { omit } from 'lodash';\r\nimport { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { IWorkingHoursDto } from 'api/odata/generated/entities/IWorkingHoursDto';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\n\r\n/**\r\n * Syncs the event provided from outside of the scheduler (props,state,etc.) into the scheduler instance\r\n * @param scheduler Scheduler instance\r\n * @param type event type\r\n * @param items events array\r\n * @param mapfn mapping from event to the type parsable by the scheduler\r\n * @returns nothing\r\n */\r\nexport function syncSchedulerEvents(\r\n scheduler: DHTMLX.SchedulerStatic | undefined,\r\n items: Array | undefined,\r\n) {\r\n if (scheduler === undefined) {\r\n return;\r\n }\r\n\r\n // events internally stored on the scheduler instance (not a part of a public API)\r\n const _events = (scheduler as any)['_events'] as Record;\r\n const mappedEvents = items ?? [];\r\n\r\n //cleanup events\r\n const mappedEventIds = new Set(mappedEvents.map(f => f.id));\r\n // clear currently displayed items on the current period\r\n // and replace these with the fresh data from the store\r\n // events need to be deleted in case and new filter has been applied\r\n const state: ISchedulerState = scheduler.getState();\r\n scheduler\r\n .getEvents(state.min_date, state.max_date)\r\n .filter(\r\n (f: ISchedulerEvent) =>\r\n typeof f.id === 'number' || !mappedEventIds.has(f.id),\r\n )\r\n .filter(event => event.type !== undefined)\r\n .forEach(event => delete _events[event.id]);\r\n if (items !== undefined && items.length > 0) {\r\n //push items into the the scheduler\r\n scheduler.parse(mappedEvents);\r\n }\r\n}\r\n\r\nexport function mapEvents<\r\n TIn extends object =\r\n | ITrainingSessionSlotDto\r\n | IWorkingHoursDto\r\n | ICalendarReservationDto\r\n>(\r\n type: EventType,\r\n items: Array | undefined,\r\n mapfn: (\r\n item: TIn,\r\n ) => Omit,\r\n) {\r\n const mappedEvents =\r\n items?.map(item => {\r\n const original: Omit = omit(item, 'Id') as Omit<\r\n TIn,\r\n 'Id'\r\n >;\r\n const result = {\r\n type: type,\r\n ...mapfn(item),\r\n\r\n original: original,\r\n };\r\n return result;\r\n }) ?? [];\r\n return mappedEvents;\r\n}\r\n","import { httpClient } from './HttpClient';\r\nimport { UpdateFilesModel } from 'utils/fileStoreHelper';\r\n\r\nexport const FileStoreApi = {\r\n saveFormFiles: (payload: UpdateFilesModel[]) => {\r\n const url = `/api/odata/v4/files/InsertFormFile`;\r\n const form = new FormData();\r\n form.append('TypeId', payload[0].typeId as any);\r\n form.append('ReferenceId', payload[0].referenceId as any);\r\n form.append('FormTypeId', payload[0].formType as any);\r\n form.append('UpdateOption', payload[0].updateOption as any);\r\n form.append('AlertTypeId', payload[0].alertTypeId as any);\r\n let added = payload.filter(f => f.operation === 'added')[0];\r\n if (!!added && added.files.length > 0) {\r\n added.files.forEach((file, ind) => {\r\n form.append(\r\n `FormField_${file.Id}_${ind}`,\r\n file.PostedFile ?? file.Id.toString(),\r\n file.PostedFile === null ? undefined : file.PostedFile.name,\r\n );\r\n });\r\n }\r\n return httpClient.post(url, form);\r\n },\r\n updateFormFiles: (payload: UpdateFilesModel[]) => {\r\n const url = `/api/odata/v4/files/UpdateFormFile`;\r\n const form = new FormData();\r\n form.append('TypeId', payload[0].typeId as any);\r\n form.append('ReferenceId', payload[0].referenceId as any);\r\n form.append('FormTypeId', payload[0].formType as any);\r\n form.append('UpdateOption', payload[0].updateOption as any);\r\n form.append('AlertTypeId', payload[0].alertTypeId as any);\r\n let deleted = payload.filter(f => f.operation === 'removed')[0];\r\n let added = payload.filter(f => f.operation === 'added')[0];\r\n if (!!deleted) {\r\n deleted.files.forEach((f, ind) => {\r\n form.append(`deleted_${ind}`, `FormField_${f.Id}_${f.Value}`);\r\n });\r\n }\r\n if (!!added && added.files.length > 0) {\r\n added.files.forEach((file, ind) => {\r\n form.append(\r\n `FormField_${file.Id}_${ind}`,\r\n file.PostedFile ?? file.Id.toString(),\r\n file.PostedFile === null ? undefined : file.PostedFile.name,\r\n );\r\n });\r\n }\r\n return httpClient.post(url, form);\r\n },\r\n};\r\n","import { useEffect, useRef } from 'react';\r\n\r\nexport function usePrevious(value: T): T | undefined {\r\n const ref = useRef();\r\n useEffect(() => {\r\n ref.current = value;\r\n }, [value]);\r\n return ref.current;\r\n}\r\n","import { Roles } from 'app/slice/types';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { IFixedRoleDto } from './IFixedRolesDto';\r\nimport { IServiceTypeFilterDto } from './IServiceTypeFilterDto';\r\nimport { IUserGroupDto } from './IUserGroupDto';\r\n\r\n/**\r\n *\r\n * auto generated interface for bkt_webApp.Api.OData.V4.Dto.UserFilterDto\r\n *\r\n */\r\nexport interface IUserFilterDto extends Identifiable {\r\n Id: string;\r\n Name: string;\r\n UserGroupId: string | null;\r\n UserGroupName: string | null;\r\n UserGroups: IUserGroupDto[];\r\n Budgets: number[];\r\n UserRoles: IFixedRoleDto[];\r\n CustomRoles: Entity[];\r\n Services: IServiceTypeFilterDto[];\r\n ServiceGroupIds: number[];\r\n IsAdminPanel: boolean;\r\n IsGroupAdmin: boolean;\r\n IsEquipmentAdmin: boolean;\r\n IsLabTech: boolean;\r\n AssetIds: number[];\r\n InstituteId: number | null;\r\n StaffEquipmentId: number | null;\r\n}\r\nexport const convertAuthToIUserFilterDto = (\r\n user: AuthenticatedUser,\r\n): IUserFilterDto => {\r\n return {\r\n Id: user.Id,\r\n Name: user.Name,\r\n UserGroupId: user.ActiveUserGroup?.Id,\r\n UserGroupName: user.ActiveUserGroup?.Name,\r\n Services: user.AdminEquipments.map(f => {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n ServiceTypeId: f.ServiceTypeId,\r\n } as IServiceTypeFilterDto;\r\n }),\r\n ServiceGroupIds: user.AdminServiceGroups.map(f => f.Id),\r\n IsAdminPanel: user.Roles.includes(Roles.Administrators),\r\n } as IUserFilterDto;\r\n};\r\n","export enum SamplePlatePositionNamingTypes {\r\n Alpha = 0,\r\n Numeric = 1,\r\n}\r\n","import { httpClient } from './HttpClient';\r\n\r\nexport const CustomFormApi = {\r\n getAll: (key: number) => {\r\n const url = `/api/odata/v4/CustomForm(${key})`;\r\n return httpClient.get(url);\r\n },\r\n getSingle: (key: number, customFormId: number) => {\r\n const url = `/api/odata/v4/CustomForm(${key})`;\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n //$select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Id asc',\r\n $filter: `(Id eq ${customFormId})`,\r\n //$select: 'Id,Name,FormFields,ServiceGroups,Active,Type',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient.get(url, params);\r\n },\r\n};\r\n","import * as React from 'react';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport * as Yup from 'yup';\r\nimport { FormikProps } from 'formik';\r\nimport { CustomFormField } from '../CustomFormFields';\r\nimport { getFieldsVisibilities } from '../CustomFormUtils';\r\nimport { ValidationSchemaProvider } from 'app/components/Forms/ValidationSchemaProvider';\r\nimport { FormFieldsSection, FormRow } from 'app/components/Forms/FormsLayout';\r\nimport { sortBy } from 'lodash';\r\n\r\nexport interface CustomFormContentProps {\r\n title?: string;\r\n formik: FormikProps>;\r\n schema: Yup.SchemaOf;\r\n formFields: IFormFieldDto[];\r\n validationEnabled?: boolean;\r\n isAdmin?: boolean;\r\n readonly?: boolean;\r\n disabled?: boolean;\r\n sectionStyles?: React.CSSProperties;\r\n withTopSeparator?: boolean;\r\n withBottomSeparator?: boolean;\r\n}\r\nexport function CustomFormContent({\r\n title,\r\n formik,\r\n schema,\r\n formFields,\r\n validationEnabled,\r\n isAdmin,\r\n readonly,\r\n disabled,\r\n sectionStyles,\r\n withTopSeparator,\r\n withBottomSeparator,\r\n}: CustomFormContentProps) {\r\n const isVisibleField = (\r\n field: IFormFieldDto,\r\n isAdmin: boolean,\r\n values: Record | undefined,\r\n visibleOnCompletion?: () => boolean,\r\n ): boolean => {\r\n let visibilities = getFieldsVisibilities(\r\n formFields,\r\n isAdmin,\r\n values,\r\n visibleOnCompletion,\r\n );\r\n if (visibilities) {\r\n return visibilities[field.Id];\r\n }\r\n return true;\r\n };\r\n const sortedActiveFormFields = React.useMemo(\r\n () =>\r\n sortBy(\r\n formFields.filter(f => f.Active === true),\r\n f => f.Index,\r\n ),\r\n [formFields],\r\n );\r\n return (\r\n \r\n \r\n {sortedActiveFormFields.map((formField, index) => {\r\n // paragraphs & form sections deserve to start from the new line in 2 column layout (full screen)\r\n const fullRow =\r\n formField.Type !== null &&\r\n ['Paragraph', 'FormSection'].includes(formField.Type);\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 * CustomForm\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport * as Yup from 'yup';\r\nimport { Formik } from 'formik';\r\nimport { CustomFormTypeEnum } from 'enums/CustomFormType';\r\nimport {\r\n serializeValues,\r\n IFormFileValue,\r\n useCustomFormSchema,\r\n} from '../../CustomFormUtils';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { CustomFormContent } from '../../CustomFormContent';\r\n\r\nexport interface CustomFormProps {\r\n formFields: IFormFieldDto[];\r\n formType: CustomFormTypeEnum;\r\n formValues?: Record;\r\n readonly?: boolean;\r\n onSubmit: (\r\n values: Record,\r\n files: IFormFileValue[],\r\n ) => void;\r\n bindSubmitForm?: any;\r\n isAdmin?: boolean;\r\n CustomFormId?: number;\r\n formName?: string;\r\n formIsValid?: (isValid: boolean) => void;\r\n disabled?: boolean;\r\n validationEnabled?: boolean;\r\n withTopSeparator?: boolean;\r\n withBottomSeparator?: boolean;\r\n}\r\n\r\nexport interface CustomFormValue extends Record {}\r\n\r\nexport const CustomForm = React.memo(function CustomForm({\r\n formFields,\r\n formValues,\r\n onSubmit,\r\n readonly,\r\n bindSubmitForm,\r\n formName,\r\n isAdmin,\r\n disabled,\r\n formIsValid,\r\n validationEnabled,\r\n withTopSeparator,\r\n withBottomSeparator,\r\n}: CustomFormProps) {\r\n const schema: Yup.SchemaOf = useCustomFormSchema(\r\n formFields,\r\n isAdmin || false,\r\n );\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n const { serialized, files } = serializeValues(formFields, value);\r\n onSubmit(serialized, files);\r\n }\r\n };\r\n\r\n const [initialValues, setInitialValues] = React.useState<\r\n Record | undefined\r\n >(undefined);\r\n useEffectOnMount(() => {\r\n setInitialValues(formValues);\r\n return () => {};\r\n });\r\n\r\n return initialValues ? (\r\n {\r\n // call setSubmit to finish submit cycle\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm?.(formik.submitForm);\r\n // if (!formik.isValid) {\r\n // console.log('Custom form errors', formik.errors);\r\n // }\r\n if (!!formIsValid) {\r\n formIsValid(formik.isValid);\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","import { Portal } from '@material-ui/core';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { CustomFormApi } from 'api/CustomFormApi';\r\nimport { ICustomFormDto } from 'api/odata/generated/entities/ICustomFormDto';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { CustomForm } from 'app/components/CustomForm/CusomFormControl/Form';\r\nimport { initUserData } from 'app/components/CustomForm/CustomFormFields/CustomFormUserSelection';\r\nimport {\r\n DeserializeValue,\r\n IFormFileValue,\r\n orderFields,\r\n ParseFormFieldEnums,\r\n} from 'app/components/CustomForm/CustomFormUtils';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { CustomFormTypeEnum } from 'enums/CustomFormType';\r\nimport React from 'react';\r\nimport { MutableRefObject } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { isEmptyOrWhitespace, isNullOrUndefined } from 'utils/typeUtils';\r\nimport { InitFormFiles } from '../CustomFormFields/CustomFormFileUpload';\r\n\r\nexport interface CustomFormControlProps {\r\n CustomFormId: number;\r\n FormType: CustomFormTypeEnum;\r\n values?: IFormValueDto[];\r\n submitFormRef: MutableRefObject;\r\n saveFormValues: (\r\n values: IFormValueDto[],\r\n files: IFormFileValue[],\r\n originalFiles: IFormFileValue[],\r\n ) => void;\r\n isAdmin?: boolean;\r\n formIsValid?: (isValid: boolean) => void;\r\n readonly?: boolean;\r\n formName?: string;\r\n disabled?: boolean;\r\n onLoadCompleted?: () => void;\r\n onLoadStarted?: () => void;\r\n validationEnabled?: boolean;\r\n withTopSeparator?: boolean;\r\n withBottomSeparator?: boolean;\r\n}\r\n\r\nexport function CustomFormControl(props: CustomFormControlProps) {\r\n const {\r\n CustomFormId,\r\n values,\r\n submitFormRef,\r\n saveFormValues,\r\n FormType,\r\n isAdmin,\r\n formIsValid,\r\n readonly,\r\n formName,\r\n disabled,\r\n onLoadCompleted,\r\n onLoadStarted,\r\n validationEnabled,\r\n withTopSeparator,\r\n withBottomSeparator,\r\n } = props;\r\n\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const [originalFiles, setOriginalFiles] = React.useState(\r\n [],\r\n );\r\n // const [currentFormId, setCurrentFormId] = React.useState(\r\n // CustomFormId,\r\n // );\r\n const fetchCustomForm = async (formType: number, customFormId: number) =>\r\n CustomFormApi.getSingle(formType, customFormId).then(response => {\r\n let item = response.value[0] as ICustomFormDto;\r\n ParseFormFieldEnums(item.FormFields);\r\n return item;\r\n });\r\n const loadValue = async (\r\n field: IFormFieldDto,\r\n value: IFormValueDto | null,\r\n ): Promise => {\r\n if (field.Type === 'UserSelection') {\r\n if (isNullOrUndefined(value?.Value)) {\r\n return new Promise(resolve => {\r\n resolve({\r\n fieldId: field.Id,\r\n value: field.IsMultiple ? [] : null,\r\n } as ValueResults);\r\n });\r\n } else {\r\n try {\r\n let data = await initUserData(value?.Value ?? '', field);\r\n return {\r\n fieldId: field.Id,\r\n value: field.IsMultiple ? data : data[0],\r\n } as ValueResults;\r\n } catch (ex) {\r\n return {\r\n fieldId: field.Id,\r\n value: null,\r\n } as ValueResults;\r\n }\r\n }\r\n } else if (field.Type === 'File') {\r\n if (isNullOrUndefined(value?.Value)) {\r\n return new Promise(resolve => {\r\n resolve({\r\n fieldId: field.Id,\r\n value: [],\r\n } as ValueResults);\r\n });\r\n } else {\r\n try {\r\n let results = await InitFormFiles(value?.Value ?? '', field);\r\n const files =\r\n results.length > 0\r\n ? results.map(r => {\r\n return {\r\n Id: field.Id,\r\n Value: r.Id,\r\n DisplayValue: r.Name,\r\n Size: r.Size,\r\n PostedFile: null,\r\n } as IFormFileValue;\r\n })\r\n : [];\r\n setOriginalFiles(prev => [...prev, ...files]);\r\n return {\r\n fieldId: field.Id,\r\n value: files,\r\n } as ValueResults;\r\n } catch (ex) {\r\n return {\r\n fieldId: field.Id,\r\n value: [],\r\n } as ValueResults;\r\n }\r\n }\r\n } else {\r\n return new Promise(resolve => {\r\n const opts = DeserializeValue(field, value);\r\n resolve({\r\n fieldId: field.Id,\r\n value: opts,\r\n } as ValueResults);\r\n });\r\n }\r\n };\r\n interface ValueResults {\r\n fieldId: number;\r\n value: any;\r\n }\r\n const [fetchFormValues, getFormValues] = usePromise(\r\n async (\r\n formFields: IFormFieldDto[],\r\n formValues: IFormValueDto[] | undefined,\r\n ) => {\r\n return Promise.all(\r\n formFields\r\n .filter(f => f.Active === true)\r\n .map(async field => {\r\n try {\r\n const resvalue = await loadValue(\r\n field,\r\n formValues?.find(v => v.FormFieldId === field.Id) || null,\r\n );\r\n return resvalue;\r\n } catch {\r\n return {\r\n fieldId: field.Id,\r\n value: null,\r\n } as ValueResults;\r\n }\r\n }),\r\n );\r\n },\r\n );\r\n const [fetchFormState, fetchFormPromise] = usePromise(fetchCustomForm);\r\n const [customForm, setState] = useAsyncExtendedState<\r\n ICustomFormDto | undefined\r\n >(undefined);\r\n const [loadedValues, setValues] = useAsyncExtendedState<\r\n Record | undefined\r\n >(undefined);\r\n // useEffectOnMount(() => {\r\n // setState(fetchFormPromise(FormType as number, currentFormId));\r\n // return () => {};\r\n // });\r\n React.useEffect(() => {\r\n if (CustomFormId) {\r\n !!onLoadStarted && onLoadStarted();\r\n setState(fetchFormPromise(FormType as number, CustomFormId));\r\n }\r\n return () => {\r\n setState(undefined);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [CustomFormId]);\r\n React.useEffect(() => {\r\n if (customForm) {\r\n const serializedvalues: Record = {};\r\n setValues(\r\n getFormValues(customForm.FormFields, values).then(vals => {\r\n vals.forEach(\r\n item => (serializedvalues[item.fieldId.toString()] = item.value),\r\n );\r\n return serializedvalues;\r\n }),\r\n );\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [customForm]);\r\n React.useEffect(() => {\r\n const messageKey = 'formLoad';\r\n let active = !!fetchFormState && !!fetchFormState.status;\r\n if (active) {\r\n if (fetchFormState.error) {\r\n let msg = fetchFormState.error.message;\r\n !!onLoadCompleted && onLoadCompleted();\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: 'Something went wrong. ' + msg,\r\n key: messageKey,\r\n }),\r\n );\r\n }\r\n if (\r\n fetchFormState.status === 'resolved' &&\r\n fetchFormValues?.status === 'resolved' &&\r\n !!customForm &&\r\n !!loadedValues\r\n ) {\r\n !!onLoadCompleted && onLoadCompleted();\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n dispatch,\r\n fetchFormValues,\r\n onLoadCompleted,\r\n customForm,\r\n loadedValues,\r\n fetchFormState,\r\n ]);\r\n\r\n const portalRef = React.useRef(null);\r\n const bindSubmitForm = React.useCallback(\r\n submitForm => {\r\n submitFormRef.current = submitForm;\r\n },\r\n [submitFormRef],\r\n );\r\n const handleSubmit = React.useCallback(\r\n (values: Record, files: IFormFileValue[]) => {\r\n const formValues: IFormValueDto[] = Object.entries(values).map(\r\n ([formFieldId, value]) => ({\r\n Id: -1,\r\n FormFieldId: +formFieldId,\r\n Value: isEmptyOrWhitespace(value) ? null : value,\r\n DisplayValue: null,\r\n SourceValueId: null,\r\n AlertId: null,\r\n AlertTypeId: null,\r\n Readonly: false,\r\n CustomFormId: customForm?.Id || CustomFormId,\r\n CustomFormName: customForm?.Name || null,\r\n BudgetExperimentId: null,\r\n ExperimentItemId: null,\r\n RequestId: null,\r\n ReservationId: null,\r\n ServiceGroupId: null,\r\n ServiceGroupUserId: null,\r\n }),\r\n );\r\n saveFormValues(formValues, files, originalFiles);\r\n },\r\n [\r\n CustomFormId,\r\n customForm?.Id,\r\n customForm?.Name,\r\n originalFiles,\r\n saveFormValues,\r\n ],\r\n );\r\n const formFields = React.useMemo(() => {\r\n return customForm !== undefined\r\n ? validationEnabled\r\n ? customForm.FormFields.sort(orderFields)\r\n : customForm.FormFields.sort(orderFields).map(field =>\r\n Object.assign(field, { Required: 0 }),\r\n )\r\n : [];\r\n }, [customForm, validationEnabled]);\r\n return (\r\n \r\n
    \r\n {fetchFormState.status === 'resolved' &&\r\n customForm !== undefined &&\r\n !!loadedValues &&\r\n fetchFormValues.status === 'resolved' ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { AxiosError } from 'axios';\r\nimport { IModelState } from 'types/Modelstate';\r\n\r\nexport function handleBadRequest(err: any): string[] | undefined {\r\n if (\r\n err.isAxiosError === true &&\r\n err.response &&\r\n err.response.status === 400 &&\r\n err.response.data &&\r\n err.response.data.ModelState\r\n ) {\r\n const ms = err.response.data.ModelState as IModelState;\r\n const messages = Object.keys(ms)\r\n .map(key => ms[key])\r\n .flat();\r\n return messages;\r\n }\r\n}\r\n\r\n/**\r\n * Extracts ModelState errors from odata responses\r\n * @param error http error\r\n * @returns\r\n */\r\nexport const getModelStateErrors = (\r\n error: unknown,\r\n): Record> | undefined => {\r\n const axiosError = error as AxiosError;\r\n const isAxiosError = axiosError.isAxiosError === true;\r\n if (!isAxiosError) {\r\n return undefined;\r\n }\r\n const message = axiosError.response?.data?.error?.innererror\r\n ?.message as string;\r\n if (message === undefined) {\r\n return axiosError.response?.data?.error?.message;\r\n }\r\n return message?.split('\\r\\n').reduce((accumulator, currentValue) => {\r\n const separator = currentValue.indexOf(':');\r\n const key = currentValue.substring(0, separator).trim();\r\n if (key.length > 0) {\r\n const message = currentValue.substring(separator + 1).trim();\r\n if (accumulator[key] === undefined) {\r\n accumulator[key] = [];\r\n }\r\n accumulator[key].push(message);\r\n }\r\n return accumulator;\r\n }, {});\r\n};\r\n\r\nexport function extractErrorMessages(error: unknown): string[] | undefined {\r\n if ((error as AxiosError).isAxiosError === true) {\r\n const response = (error as AxiosError).response;\r\n if (response?.data?.error?.message !== undefined) {\r\n return [response?.data?.error?.message];\r\n }\r\n if (response === undefined) {\r\n return [String(error)];\r\n }\r\n const status = (error as AxiosError)?.response?.status;\r\n switch (status) {\r\n case 400:\r\n return handleBadRequest(error);\r\n case 403:\r\n return ['NotAllowed'];\r\n default:\r\n return [String(error)];\r\n }\r\n } else if (typeof error === 'string') {\r\n return [error];\r\n } else if (error instanceof Error) {\r\n return [error.message];\r\n } else {\r\n return [String(error)];\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompleteMultiPicker,\r\n AutocompleteMultiPickerProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPicker';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\r\n\r\nconst url = '/api/odata/v4/ServiceRequestStatusFilter';\r\n\r\nexport interface ServiceRequestStatusMultiPickerProps\r\n extends Omit<\r\n AutocompleteMultiPickerProps,\r\n 'loadData'\r\n > {\r\n exclude?: InternalServiceRequestStatusesUnion[];\r\n}\r\n\r\nexport const initServiceRequestStatusMultiData = (\r\n initialValue: string | undefined,\r\n) => {\r\n if (initialValue === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IServiceRequestStatusDto[]);\r\n });\r\n } else {\r\n const ids = initialValue.split('|').map(v => parseInt(v));\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id in (' + ids.join(',') + '))',\r\n $select: 'Id,Name,InternalStatusId',\r\n $skip: 0,\r\n $top: ids.length,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as IServiceRequestStatusDto[]);\r\n }\r\n};\r\n\r\nconst getLoadDataFn = (exclude?: InternalServiceRequestStatusesUnion[]) => (\r\n searchTerm: string | null,\r\n) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n const predicates: Array> = [];\r\n if (exclude !== undefined && exclude.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'InternalStatusId',\r\n ODataOperators.Excludes,\r\n exclude,\r\n ),\r\n );\r\n }\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as IServiceRequestStatusDto[]);\r\n};\r\n\r\nexport function ServiceRequestStatusMultiPicker(\r\n props: ServiceRequestStatusMultiPickerProps,\r\n) {\r\n const loadData = React.useMemo(() => getLoadDataFn(props.exclude), [\r\n props.exclude,\r\n ]);\r\n return (\r\n \r\n );\r\n}\r\n","import styled from 'styled-components/macro';\r\n\r\nexport const P = styled.p`\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: black;\r\n margin: 0.625rem 0 1.5rem 0;\r\n`;\r\n","import * as React from 'react';\r\nimport styled from 'styled-components/macro';\r\nimport { P } from './P';\r\nimport { Helmet } from 'react-helmet-async';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { Button } from '../../components/BasicButtons/Button';\r\n\r\nexport function NotFoundPage() {\r\n return (\r\n <>\r\n \r\n 404 Page Not Found\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 \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

    Page not found!

    \r\n

    \r\n Unfortunately the page you a looking for doesn’t exist
    \r\n (anymore) or there was an error in the link that you
    \r\n followed or typed.\r\n

    \r\n window.open(toRootedURL('Divisions.aspx'), '_self')}\r\n >\r\n {' '}\r\n Go back to main{' '}\r\n \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nconst DivStyle = styled.div`\r\n display: inline-block;\r\n padding: 70px;\r\n`;\r\n\r\nconst Wrapper = styled.div`\r\n height: 100vh;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 320px;\r\n`;\r\n\r\n/* const Title = styled.div`\r\n margin-top: -8vh;\r\n font-weight: bold;\r\n color: black;\r\n font-size: 3.375rem;\r\n\r\n span {\r\n font-size: 3.125rem;\r\n }\r\n`;*/\r\n","import { RadioProps as MuiRadioProps, styled } from '@material-ui/core';\r\nimport { Radio as MuiRadio } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nexport interface RadioProps extends MuiRadioProps {\r\n danger?: boolean;\r\n label?: string;\r\n}\r\n\r\nexport default function Radio(props: RadioProps) {\r\n const { color, danger, label, size = 'medium', ...other } = props;\r\n const RadioIconUnchecked = styled('span')(({ theme, ...other }) => ({\r\n borderRadius: '1000px',\r\n width: 20,\r\n height: 20,\r\n backgroundColor: bookitColors.base.white,\r\n border:\r\n danger || color === 'secondary'\r\n ? `1px solid ${bookitColors.danger.borders}`\r\n : `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n 'input:hover ~ &': {\r\n border:\r\n danger || color === 'secondary'\r\n ? `1px solid ${bookitColors.danger.borders}`\r\n : props.disabled\r\n ? `1px solid ${bookitColors.grayscale.grayBorders}`\r\n : `1px solid ${bookitColors.primary.borders}`,\r\n },\r\n 'input:disabled ~ &': {\r\n //boxShadow: 'none',\r\n background:\r\n danger || color === 'secondary'\r\n ? bookitColors.danger.bgHover\r\n : bookitColors.grayscale.graybgComponents,\r\n },\r\n }));\r\n const RadioIconChecked = styled(RadioIconUnchecked)(({ theme }) => ({\r\n backgroundColor:\r\n danger || color === 'secondary'\r\n ? bookitColors.danger.components\r\n : bookitColors.primary.components,\r\n border: 'none',\r\n '&:before': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: 20,\r\n height: 20,\r\n backgroundImage: 'radial-gradient(#fff,#fff 16%,transparent 25%)',\r\n content: '\"\"',\r\n },\r\n 'input:hover ~ &': {\r\n backgroundColor:\r\n danger || color === 'secondary'\r\n ? bookitColors.danger.regular\r\n : bookitColors.primary.regular,\r\n border: 'none',\r\n },\r\n 'input:disabled ~ &': {\r\n background:\r\n danger || color === 'secondary'\r\n ? bookitColors.danger.disabled\r\n : bookitColors.grayscale.grayBorders,\r\n },\r\n }));\r\n return (\r\n }\r\n checkedIcon={}\r\n color={danger ? 'secondary' : color === 'default' ? 'primary' : color}\r\n size={size}\r\n inputProps={{ 'aria-label': !!label ? label : 'decorative radio' }}\r\n {...other}\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * RadioGroup\r\n *\r\n */\r\nimport { RadioGroup as MuiRadioGroup } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport Radio from '../BasicInputs/Radio';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\r\nimport FormControlLabel from '../Forms/FormControls/FormControlLabel';\r\n\r\nexport interface RadioGroupProps {\r\n options: Array>;\r\n value?: string;\r\n className?: string;\r\n onChange?: (\r\n value: string,\r\n event: React.ChangeEvent,\r\n ) => void;\r\n id: string;\r\n //formik\r\n name?: string;\r\n error?: boolean;\r\n label?: string;\r\n disabled?: boolean;\r\n helperText?: string;\r\n row?: boolean;\r\n}\r\n\r\nexport function RadioGroup({\r\n name,\r\n id,\r\n value,\r\n options,\r\n onChange,\r\n error,\r\n row,\r\n helperText,\r\n ...props\r\n}: RadioGroupProps) {\r\n const handleChange = (event: React.ChangeEvent) => {\r\n const value = event.target.value as string;\r\n if (onChange !== undefined) {\r\n onChange(value, event);\r\n }\r\n };\r\n return (\r\n \r\n {options.map((option, index) => (\r\n \r\n }\r\n label={option.Name}\r\n disabled={props.disabled}\r\n />\r\n {(option as any).Name.length > 28 && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n ))}\r\n \r\n );\r\n}\r\n","import { BillingActionsDetailsQStringParameters } from 'app/pages/BillingActions/BillingActionsDetailsPage/Details/slice/types';\r\nimport { httpClient } from './HttpClient';\r\nimport { IBillingActionsDto } from '../app/pages/BillingActions/BillingActionsPage/IBillingActionsDto';\r\nimport { IResponseType } from '../types/ResponseType';\r\nimport { IBillingDto } from 'app/pages/InvoiceBillingPage/IBillingDto';\r\nimport { IInvoiceBatchesDto } from 'app/pages/InvoiceBatches/IInvoiceBatchesDto';\r\nimport { IBillingActionInvoice } from 'app/pages/InvoiceBillingPage/SelectedRowActions/BillingActionsPopup/BillingActionsPopupTable/IBillingActionInvoice';\r\n\r\nexport const BillingActionsApi = {\r\n initCreateData: (payload: BillingActionsDetailsQStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = '/api/odata/v4/BillingActions/InitBillingActions';\r\n return httpClient.post(url, data);\r\n },\r\n initUpdateData: (payload: BillingActionsDetailsQStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = '/api/odata/v4/BillingActions/InitBillingActions';\r\n return httpClient.post(url, data);\r\n },\r\n insertBillingActionsDetails: (payload: IBillingActionsDto) => {\r\n const url = '/api/odata/v4/BillingActions'; //POST action in Controller\r\n return httpClient.post(url, payload);\r\n },\r\n updateBillingActionsDetails: (payload: IBillingActionsDto) => {\r\n const url = `/api/odata/v4/BillingActions(${payload.Id})`; //PUT action in Controller\r\n return httpClient.put(url, payload);\r\n },\r\n deleteBillingActionsDetails: (\r\n rows: IBillingActionsDto[],\r\n ): Promise => {\r\n const billingActionIds: number[] = rows.map(item => item.Id);\r\n const data = { billingActionIds };\r\n const url = '/api/odata/v4/BillingActions/DeleteBillingActions';\r\n return httpClient.post(url, data);\r\n },\r\n getBillingActions: (screen: number) => {\r\n const url = `/api/odata/v4/BillingActions(${screen})`;\r\n return httpClient.get(url, {\r\n $expand: ['EmailAttachmentTypes', 'EmailRecipientTypes'].join(','),\r\n });\r\n },\r\n getBillingActionById: (screen: number, billingActionId: number) => {\r\n const url = `/api/odata/v4/BillingActions(${screen})`;\r\n const params: {\r\n $filter?: string;\r\n $expand?: string;\r\n } = {\r\n $filter: '(Id eq ' + billingActionId + ')',\r\n $expand: ['EmailAttachmentTypes', 'EmailRecipientTypes'].join(','),\r\n };\r\n return httpClient.get(url, params);\r\n },\r\n getBillingActionInvoices: (\r\n batchInvoiceIds: IBillingDto[] | IInvoiceBatchesDto[],\r\n screen: number,\r\n ) => {\r\n const ids: string = batchInvoiceIds.map(item => item.Id).join(',');\r\n const data = { ids, screen };\r\n const url = '/api/odata/v4/BillingActions/GetBillingActionInvoices';\r\n return httpClient.post(url, data);\r\n },\r\n processEmailAction: (\r\n billingActionsParams: IBillingActionsDto,\r\n rows: IBillingDto[] | IInvoiceBatchesDto[],\r\n ) => {\r\n const billingActionId: number = billingActionsParams.Id;\r\n const invoiceIds: string = rows.map(item => item.Id).join(',');\r\n const data = { billingActionId, invoiceIds };\r\n const url = '/api/odata/v4/BillingActions/ProcessEmailAction';\r\n return httpClient.post(url, data);\r\n },\r\n ProcessSftpUploadAction: (\r\n billingActionsParams: IBillingActionsDto,\r\n rows: IBillingDto[] | IInvoiceBatchesDto[],\r\n ) => {\r\n const billingActionId: number = billingActionsParams.Id;\r\n const invoiceIds: string = rows.map(item => item.Id).join(',');\r\n const data = { billingActionId, invoiceIds };\r\n const url = '/api/odata/v4/BillingActions/ProcessSftpUploadAction';\r\n return httpClient.post(url, data);\r\n },\r\n processStatusAction: (\r\n billingActionsParams: IBillingActionsDto,\r\n rows: IBillingActionInvoice[],\r\n ) => {\r\n const billingActionId: number = billingActionsParams.Id;\r\n const invoiceIds: string = rows.map(item => item.Id).join(',');\r\n const data = { billingActionId, invoiceIds };\r\n const url = '/api/odata/v4/BillingActions/ProcessStatusAction';\r\n return httpClient.post(url, data);\r\n },\r\n getRecipientsEmailAddresses: (\r\n rows: IBillingDto[] | IInvoiceBatchesDto[],\r\n billingActionsRow: IBillingActionsDto,\r\n ) => {\r\n const invoiceIds: number[] = rows.map(item => item.Id);\r\n const emailTypes: number[] = billingActionsRow.EmailRecipientTypes.map(\r\n item => item.Id,\r\n );\r\n const screen: number = billingActionsRow.ShowOn;\r\n const specEmailAddresses: string | null =\r\n billingActionsRow.SpecificEmailAddresses;\r\n const data = { invoiceIds, emailTypes, screen, specEmailAddresses };\r\n const url = '/api/odata/v4/BillingActions/GetRecipientsEmailAddresses';\r\n return httpClient.post(url, data);\r\n },\r\n};\r\n","import { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { AsyncDataState, AsyncProgressState } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\n\r\nexport interface IChargeOnlineBudgetState\r\n extends AsyncProgressState> {\r\n currentRecord?: IInvoiceBudgetBalanceDto;\r\n errors?: string[];\r\n}\r\n\r\n/* --- STATE --- */\r\nexport interface OnlineBudgetsStatusState {\r\n endDate: string | null;\r\n needTableRefresh: boolean;\r\n tableState: AsyncDataState>;\r\n selected: IInvoiceBudgetBalanceDto[];\r\n generateInvoicesState: AsyncDataState;\r\n charge: IChargeOnlineBudgetState;\r\n pay: IPayState;\r\n generateInvoicesAndSendToSap: IGenerateInvoicesAndSendToSapState;\r\n}\r\n\r\nexport interface IPayState {\r\n currentRecord?: IInvoiceBudgetBalanceDto;\r\n selected?: IInvoiceBudgetBalanceDto[];\r\n progress?: number;\r\n status?: PromiseStatus;\r\n dialogOpen?: boolean;\r\n data?: IPayActionPayload;\r\n messages?: IResponseType[];\r\n}\r\nexport type PromiseStatus = `pending` | `resolved` | `rejected`;\r\n\r\nexport enum PaymentMethods {\r\n BudgetTransfer = 1,\r\n CreditCard = 2,\r\n Wire = 3,\r\n Cash = 4,\r\n Check = 5,\r\n Other = 6,\r\n}\r\n\r\nexport interface IPayActionPayload {\r\n PaymentMethod: PaymentMethods;\r\n EndDate: Date;\r\n Rows: Array;\r\n}\r\n\r\nexport interface IProgressAction {\r\n selected: T[];\r\n progress?: number;\r\n status?: PromiseStatus;\r\n}\r\n\r\nexport interface ChargeOnlineBudgetResponse {\r\n Messages: string[];\r\n SuccessTransactionsCount: number;\r\n TransactionsCount: number;\r\n FailedTransactionsCount: number;\r\n}\r\n\r\nexport interface IGenerateInvoicesAndSendToSapState {\r\n processing?: boolean;\r\n dialogOpen?: boolean;\r\n progress?: number;\r\n selected?: IInvoiceBudgetBalanceDto[];\r\n endDate?: Date;\r\n currentRecord?: IInvoiceBudgetBalanceDto;\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IPayment } from 'app/pages/AddPaymentPage/IPayment';\r\n//import { IResponseType } from 'types/ResponseType';\r\nconst url = '/api/odata/v4/Payment';\r\nexport interface IPaymentPayload extends IPayment {\r\n ShouldCloseInvoice?: boolean;\r\n}\r\nexport const PaymentApi = {\r\n AddPayment: (payment: IPaymentPayload) => {\r\n const data = {\r\n InvoiceId: payment.InvoiceId,\r\n MethodId: payment.Method?.Id,\r\n Amount: payment.Amount,\r\n Date: payment.Date,\r\n Remarks: payment.Remarks,\r\n Reference: payment.Reference,\r\n BudgetId: payment.Budget?.Id,\r\n ServiceGroupId: payment.ServiceGroup?.Id,\r\n ShouldCloseInvoice: payment.ShouldCloseInvoice,\r\n };\r\n return httpClient.post(url, data);\r\n },\r\n UpdatePayment: (paymentId: number, payment: IPaymentPayload) => {\r\n const data = {\r\n InvoiceId: payment.InvoiceId,\r\n MethodId: payment.Method?.Id,\r\n Amount: payment.Amount,\r\n Date: payment.Date,\r\n Remarks: payment.Remarks,\r\n Reference: payment.Reference,\r\n BudgetId: payment.Budget?.Id,\r\n ServiceGroupId: payment.ServiceGroup?.Id,\r\n ShouldCloseInvoice: payment.ShouldCloseInvoice,\r\n };\r\n return httpClient.put(url + '(' + paymentId + ')', data);\r\n },\r\n};\r\n","import * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport clsx from 'clsx';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport { RowSection } from '../wrappers';\r\n\r\nexport interface FormRowProps {\r\n children: React.ReactNode;\r\n fullRow?: boolean;\r\n minRow?: boolean;\r\n hide?: boolean;\r\n wrapOnMobile?: boolean;\r\n isCover?: boolean;\r\n}\r\nexport const FormRow = (props: FormRowProps) => {\r\n const { children, fullRow, hide, minRow, wrapOnMobile, isCover } = props;\r\n const isMobile = DetectIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const showShortView =\r\n isMobile || (sidePanelOpen && !sidePanelExpanded) || isCover;\r\n const theme = useTheme();\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.samplePlates || initialState;\r\n\r\nexport const selectSamplePlates = createSelector([selectSlice], state => state);\r\n\r\nexport const selectSamplePlatesData = createSelector(\r\n [selectSamplePlates],\r\n state => state.data,\r\n);\r\nexport const selectSamplePlatesTableState = createSelector(\r\n [selectSamplePlates],\r\n state => state.tableState,\r\n);\r\nexport const selectSamplePlatesCreate = createSelector(\r\n [selectSamplePlates],\r\n state => state.create,\r\n);\r\n\r\nexport const selectBulkSamplePlatesCreate = createSelector(\r\n [selectSamplePlates],\r\n state => state.bulckCreate,\r\n);\r\n\r\nexport const selectSamplePlatesUpdate = createSelector(\r\n [selectSamplePlates],\r\n state => state.update,\r\n);\r\n","import * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { Entity } from 'types/common';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\n\r\nconst url = '/api/odata/v4/UnitTypesFilter';\r\n\r\nexport interface UnitTypePickerProps\r\n extends Omit, 'loadData'> {\r\n type?: number;\r\n $select?: Array;\r\n}\r\n\r\nexport interface UnitType extends Entity {\r\n SourceUnits: Conversion[];\r\n TargetUnits: Conversion[];\r\n CategoryType: number | null;\r\n}\r\n\r\ninterface Conversion {\r\n ConversionRate: number;\r\n TargetId: number;\r\n}\r\n\r\nexport const initUnitTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return Promise.resolve([]);\r\n }\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as UnitType[]);\r\n};\r\nconst loadData = (\r\n $select?: Array | undefined,\r\n predicates?: (string | Condition)[],\r\n) => {\r\n return getAutoCompleteLoadDataFn({\r\n url: url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: $select ?? [\r\n 'Id',\r\n 'Name',\r\n 'CategoryType',\r\n 'SourceUnits',\r\n 'TargetUnits',\r\n ],\r\n });\r\n};\r\n// const getLoadData = (\r\n// type?: number,\r\n// $select?: Array | undefined,\r\n// ) => (searchTerm: string | null) => {\r\n// const params: {\r\n// $orderby: string;\r\n// $filter?: string;\r\n// $select?: string | undefined;\r\n// } = {\r\n// $orderby: 'Name asc',\r\n// $select: $select?.join(','),\r\n// };\r\n\r\n// const predicates: Condition[] = [];\r\n// if (type !== undefined) {\r\n// predicates.push(new Condition('CategoryType', ODataOperators.Equals, type));\r\n// }\r\n// params.$filter = new ODataFilterBuilder({\r\n// predicates: predicates,\r\n// stringColumns: ['Name'],\r\n// stringSearch: searchTerm,\r\n// }).toString();\r\n\r\n// return httpClient\r\n// .get(url, params)\r\n// .then(response => response.value as UnitType[]);\r\n// };\r\nexport const UnitTypePicker = ({\r\n type,\r\n $select,\r\n ...props\r\n}: UnitTypePickerProps) => {\r\n const predicates: Condition[] = React.useMemo(() => {\r\n return !!type\r\n ? [new Condition('CategoryType', ODataOperators.Equals, type)]\r\n : [];\r\n }, [type]);\r\n\r\n const innerLoadData = loadData($select, predicates);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * FilterBox\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport clsx from 'clsx';\r\n\r\nexport interface FilterBoxCoreProps {\r\n direction: Directions;\r\n}\r\nexport interface FilterBoxProps\r\n extends React.PropsWithChildren<\r\n FilterBoxCoreProps & React.HTMLAttributes\r\n > {}\r\n\r\nexport const FilterBox = React.forwardRef(function FilterBox(\r\n props: FilterBoxProps,\r\n ref: any,\r\n) {\r\n const isMobile = DetectIsMobile();\r\n const classes = useStyles({\r\n isMobile: isMobile,\r\n direction: props.direction,\r\n });\r\n return (\r\n \r\n {props.children}\r\n
    \r\n );\r\n});\r\n\r\nexport type Directions = 'vertical' | 'horizontal';\r\n\r\nconst useStyles = makeStyles((theme: Theme) => {\r\n return createStyles({\r\n root: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexWrap: 'nowrap',\r\n flexDirection: 'row',\r\n gap: 8,\r\n position: 'relative',\r\n '&.isMobile': {\r\n display: 'inline-flex',\r\n flexWrap: 'wrap',\r\n width: 'inherit',\r\n },\r\n '&.horizontal': {\r\n display: 'inline-flex',\r\n flexWrap: 'wrap',\r\n },\r\n },\r\n });\r\n});\r\n","import { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { selectglobalSettings } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport * as React from 'react';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface SaveFormButtonProps extends ButtonProps {\r\n edit: boolean;\r\n text: string;\r\n onClick: (e: any) => void;\r\n}\r\nexport interface ActivateButtonProps extends ButtonProps {\r\n edit: boolean;\r\n text: string;\r\n onClick: () => void;\r\n ServiceGroupId?: number;\r\n Active: boolean;\r\n}\r\n\r\nexport function SaveFormButton({\r\n edit,\r\n text,\r\n onClick,\r\n ...props\r\n}: SaveFormButtonProps) {\r\n const { t } = useTranslation();\r\n const settings = useSelector(selectglobalSettings);\r\n const [showConfirm, setShowConfirm] = React.useState(false);\r\n\r\n return edit &&\r\n settings.GetBooleanByKey(\r\n AllowedSettings.TrainingActivationAllowedBySGAOnly,\r\n ) ? (\r\n \r\n \r\n setShowConfirm(false)}\r\n />\r\n \r\n ) : (\r\n \r\n );\r\n}\r\nexport function ActivateButton({\r\n edit,\r\n text,\r\n onClick,\r\n ServiceGroupId,\r\n Active,\r\n ...props\r\n}: ActivateButtonProps) {\r\n const { t } = useTranslation();\r\n const [showConfirm, setShowConfirm] = React.useState(false);\r\n\r\n return (\r\n \r\n {Active ? (\r\n \r\n \r\n setShowConfirm(false)}\r\n />\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { dateUtils } from 'utils/date-utils';\r\n\r\nexport const TransformDate = (value, original, ctx) => {\r\n if (ctx.isType(value)) return value;\r\n return dateUtils.format(original, dateUtils.DateIOFormats.keyboardDate);\r\n};\r\n","/**\r\n *\r\n * WorkOrderPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface WorkOrderPickerProps\r\n extends Omit, 'loadData'> {\r\n name?: string;\r\n placeholder?: string;\r\n onBlur?: React.FocusEventHandler;\r\n error?: boolean;\r\n helperText?: string;\r\n useSearchOrPredicate?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/WorkOrders';\r\nexport const initWorkOrdersData = (\r\n initval: string | undefined,\r\n select?: (keyof IWorkOrderDetailsDto)[],\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n $select: string;\r\n $expand?: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n $select: !!select\r\n ? select.join(',')\r\n : [\r\n 'Id',\r\n 'Name',\r\n 'AssetName',\r\n 'AssetId',\r\n 'ServiceGroup',\r\n 'ServiceGroupId',\r\n 'ServiceId',\r\n 'ServiceTypeId',\r\n 'AssetCatId',\r\n 'AssetCatGroupId',\r\n 'AssetCatName',\r\n 'AssetCatGroupName',\r\n 'AlertTypeId',\r\n 'AlertTitle',\r\n 'AlertDescription',\r\n 'StatusName',\r\n 'AlertType',\r\n 'EventStart',\r\n 'ReportedBy',\r\n 'ReportedByDisplayName',\r\n 'LastUpdated',\r\n 'Reservation',\r\n 'AlertOfflineTime',\r\n 'OfflineEventEnd',\r\n 'OfflineEventStart',\r\n 'OfflineRemarks',\r\n 'ReasonTypeId',\r\n 'ReasonTypeName',\r\n 'StatusId',\r\n 'IsClosed',\r\n 'UserTicket',\r\n 'InstrumentWasDown',\r\n 'IsAutoCreatedType',\r\n 'AlertStart',\r\n 'CreateDate',\r\n 'DoneDate',\r\n 'RecurringGroupId',\r\n 'RecurringAssetId',\r\n 'WorkOrderType',\r\n 'StaffOnly',\r\n 'WorkingHoursId',\r\n 'ShowOnCalibrationHistory',\r\n 'NotEditable',\r\n ].join(','),\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n queryUrl?: string,\r\n useSearchOrPredicate?: boolean,\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url: url ?? queryUrl,\r\n predicates: predicates,\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'AssetName',\r\n 'AssetId',\r\n 'ServiceGroup',\r\n 'ServiceGroupId',\r\n 'ServiceId',\r\n 'ServiceTypeId',\r\n 'AssetCatId',\r\n 'AssetCatGroupId',\r\n 'AssetCatName',\r\n 'AssetCatGroupName',\r\n 'AlertTypeId',\r\n 'AlertTitle',\r\n 'AlertDescription',\r\n 'StatusName',\r\n 'AlertType',\r\n 'EventStart',\r\n 'ReportedBy',\r\n 'ReportedByDisplayName',\r\n 'LastUpdated',\r\n 'Reservation',\r\n 'AlertOfflineTime',\r\n 'OfflineEventEnd',\r\n 'OfflineEventStart',\r\n 'OfflineRemarks',\r\n 'ReasonTypeId',\r\n 'ReasonTypeName',\r\n 'StatusId',\r\n 'IsClosed',\r\n 'UserTicket',\r\n 'InstrumentWasDown',\r\n 'IsAutoCreatedType',\r\n 'AlertStart',\r\n 'CreateDate',\r\n 'DoneDate',\r\n 'RecurringGroupId',\r\n 'RecurringAssetId',\r\n 'WorkOrderType',\r\n 'StaffOnly',\r\n 'WorkingHoursId',\r\n 'ShowOnCalibrationHistory',\r\n 'NotEditable',\r\n ],\r\n useSearchOrPredicate: useSearchOrPredicate,\r\n });\r\nexport function WorkOrderPicker(props: WorkOrderPickerProps) {\r\n const innerLoadData = (predicates, queryUrl) =>\r\n loadData(props.predicates, queryUrl, props.useSearchOrPredicate);\r\n const queryUrl = '/api/odata/v4/WorkOrders';\r\n\r\n return (\r\n \r\n );\r\n}\r\nexport const WorkOrdersCalibrationFilter = (\r\n assetId?: number,\r\n woTypeId?: number,\r\n excludeIds?: number[],\r\n) => {\r\n const predicates: (string | Condition)[] = [];\r\n if (!!assetId) {\r\n predicates.push(\r\n new Condition(\r\n 'AssetId',\r\n ODataOperators.Equals,\r\n assetId,\r\n ),\r\n );\r\n }\r\n if (!!woTypeId) {\r\n predicates.push(\r\n new Condition(\r\n 'AlertTypeId',\r\n ODataOperators.Equals,\r\n woTypeId,\r\n ),\r\n );\r\n }\r\n if (!!excludeIds && excludeIds?.length > 0) {\r\n predicates.push(\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Excludes,\r\n excludeIds,\r\n ),\r\n );\r\n }\r\n predicates.push(\r\n new Condition(\r\n 'IsClosed',\r\n ODataOperators.NotEquals,\r\n true,\r\n ),\r\n );\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n};\r\nexport const loadWorkOrders = loadData;\r\n","/**\r\n *\r\n * FormRestrictedUserGroupPicker\r\n *\r\n */\r\nimport { IUserGroupDto } from 'api/odata/generated/entities/IUserGroupDto';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { RestrictedUserGroupPicker } from '../pickers/AutocompletePickers/UserGroupPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport const FormRestrictedUserGroupPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n predicates={props.predicates}\r\n disabled={props.disabled}\r\n />\r\n );\r\n};\r\n","import { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IServiceRequestDto } from 'api/odata/generated/entities/IServiceRequestDto';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport {\r\n URLSearchParamsCI,\r\n arrayToQueryString,\r\n getNumberEntityArray,\r\n initMultiPickerValue,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport {\r\n ServiceRequestStatusMultiPicker,\r\n initServiceRequestStatusMultiData,\r\n} from 'app/components/pickers/AutocompletePickers/ServiceRequestStatusMultiPicker';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport const StatusFilterId = 'Status';\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParamsCI(search);\r\n const result: IFilterSettings[] = [\r\n {\r\n id: StatusFilterId,\r\n fieldName: 'Status',\r\n queryStringSerializer: arrayToQueryString('RequestStatusInclude'),\r\n displayName: t(translations.IncludeStatus) as string,\r\n operator: ODataOperators.Includes,\r\n value: getNumberEntityArray(params, 'RequestStatusInclude'),\r\n component: ServiceRequestStatusMultiPicker,\r\n initData: initMultiPickerValue(initServiceRequestStatusMultiData),\r\n urlKey: 'RequestStatusInclude',\r\n },\r\n ];\r\n return result;\r\n};\r\n","import React from 'react';\r\n\r\nimport FirstPageIcon from '@material-ui/icons/FirstPage';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';\r\nimport KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';\r\nimport LastPageIcon from '@material-ui/icons/LastPage';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n flexShrink: 0,\r\n marginLeft: theme.spacing(2.5),\r\n },\r\n}));\r\n\r\nconst TablePaginationActions = props => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const { count, page, rowsPerPage, onChangePage } = props;\r\n\r\n const handleFirstPageButtonClick = event => {\r\n onChangePage(event, 0);\r\n };\r\n\r\n const handleBackButtonClick = event => {\r\n onChangePage(event, page - 1);\r\n };\r\n\r\n const handleNextButtonClick = event => {\r\n onChangePage(event, page + 1);\r\n };\r\n\r\n const handleLastPageButtonClick = event => {\r\n onChangePage(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));\r\n };\r\n\r\n return (\r\n
    \r\n \r\n {theme.direction === 'rtl' ? : }\r\n \r\n \r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n = Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"next page\"\r\n >\r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n = Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"last page\"\r\n >\r\n {theme.direction === 'rtl' ? : }\r\n \r\n
    \r\n );\r\n};\r\n\r\nTablePaginationActions.propTypes = {\r\n count: PropTypes.number.isRequired,\r\n onChangePage: PropTypes.func.isRequired,\r\n page: PropTypes.number.isRequired,\r\n rowsPerPage: PropTypes.number.isRequired,\r\n};\r\n\r\nexport default TablePaginationActions;\r\n","import * as React from 'react';\r\nimport {\r\n Table as MuiTable,\r\n TableBody,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableFooter,\r\n TableContainer,\r\n Table,\r\n} from '@material-ui/core/index';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport { Checkbox } from '@material-ui/core/index';\r\nimport {\r\n Column,\r\n useTable,\r\n useRowSelect,\r\n usePagination,\r\n PluginHook,\r\n useGlobalFilter,\r\n Row,\r\n} from 'react-table';\r\n\r\nimport TablePaginationActions from './TablePaginationActions';\r\nimport { GlobalFilter } from 'app/components/BasicTable/GlobalFilter';\r\nimport { useStyles } from 'app/components/BasicTable/styles';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { SelectedActions } from 'app/components/BasicTable/SelectedActions';\r\nimport { BasicTableProps } from 'app/components/BasicTable';\r\nimport { TableToolbar } from 'app/components/BasicTable/BasicFilter/TableToolbar';\r\nimport { useRowActionsColumn } from 'app/components/BasicTable/RowActions';\r\nimport { ConfigureColumnsButton } from 'app/components/BasicTable/components/ConfigureColumnsButton';\r\nimport { ExportButton } from 'app/components/BasicTable/ExportButton';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface EditableTableProps\r\n extends Pick<\r\n BasicTableProps,\r\n 'columns' | 'selectedRowsActions' | 'pageActions' | 'rowActions'\r\n > {\r\n columns: Column[];\r\n // defaultColumn: any;\r\n // skipPageReset: boolean;\r\n updateMyData?: any;\r\n data: TRow[];\r\n toolbar?: (selectedRows: TRow[]) => JSX.Element;\r\n // controlledPageCount: number;\r\n // fetchData: (state: ITableState) => void;\r\n toggleHideColumn?: (columnId: String, value: Boolean) => void;\r\n useRowSelect: boolean;\r\n onSelectedRowsChange?: (selectedRows: TRow[]) => void;\r\n useGlobalFilter: boolean;\r\n subHeader?: React.ReactNode;\r\n screenName: string | React.ReactNode;\r\n handleConfigurableColumns: () => void;\r\n handleExport: () => Promise;\r\n useImportLink?: boolean;\r\n importLink?: string;\r\n importHandler?: () => void;\r\n onExportForImport?: (rows: Row[]) => void;\r\n onDownloadTemplate?: () => void;\r\n}\r\n\r\nexport function EditableTable>({\r\n selectedRowsActions,\r\n onSelectedRowsChange,\r\n screenName,\r\n ...props\r\n}: EditableTableProps) {\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const {\r\n columns,\r\n data,\r\n // fetchData,\r\n // controlledPageCount,\r\n // skipPageReset,\r\n updateMyData,\r\n } = props;\r\n const tablePlugins: PluginHook[] = [useGlobalFilter, usePagination];\r\n\r\n if (props.useRowSelect) {\r\n tablePlugins.push(useRowSelect);\r\n tablePlugins.push(hooks => {\r\n hooks.visibleColumns.push(columns => [\r\n // Let's make a column for selection\r\n {\r\n id: 'selection',\r\n // The header can use the table's getToggleAllRowsSelectedProps method\r\n // to render a checkbox\r\n Header: ({ getToggleAllRowsSelectedProps }) => (\r\n
    \r\n \r\n
    \r\n ),\r\n // The cell can use the individual row's getToggleRowSelectedProps method\r\n // to the render a checkbox\r\n Cell: ({ row }) => (\r\n
    \r\n \r\n
    \r\n ),\r\n },\r\n ...columns,\r\n ]);\r\n });\r\n }\r\n\r\n useRowActionsColumn(props.rowActions, tablePlugins);\r\n const tableInstance = useTable(\r\n {\r\n columns,\r\n data,\r\n\r\n // use the skipPageReset option to disable page resetting temporarily\r\n // autoResetPage: !skipPageReset,\r\n // updateMyData isn't part of the API, but\r\n // anything we put into these options will\r\n // automatically be available on the instance.\r\n // That way we can call this function from our\r\n // cell renderer!\r\n updateMyData,\r\n autoResetPage: false,\r\n // initialState: { pageSize: 10 },\r\n // manualPagination: true, // Tell the usePagination\r\n // pageCount: controlledPageCount,\r\n },\r\n ...tablePlugins,\r\n );\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n page, // Instead of using 'rows', we'll use page,\r\n prepareRow,\r\n //pagination\r\n gotoPage,\r\n setPageSize,\r\n state: { pageIndex, pageSize, globalFilter, selectedRowIds },\r\n selectedFlatRows,\r\n toggleAllRowsSelected,\r\n setGlobalFilter,\r\n } = tableInstance;\r\n\r\n const isSomeselected = Object.keys(selectedRowIds || {}).length > 0;\r\n const [selected, setSelected] = React.useState>({});\r\n React.useEffect(\r\n () =>\r\n onSelectedRowsChange?.(Object.entries(selected).map(value => value[1])),\r\n [onSelectedRowsChange, selected],\r\n );\r\n\r\n React.useEffect(() => {\r\n setSelected(state =>\r\n Object.keys(selectedRowIds || {}).reduce((accumulator, key) => {\r\n accumulator[key] =\r\n state[key] ?? selectedFlatRows.find(row => row.id === key)?.original;\r\n return accumulator;\r\n }, {}),\r\n );\r\n }, [selectedRowIds, selectedFlatRows]);\r\n const selectedArray = Object.entries(selected).map(value => value[1]);\r\n\r\n const handleChangePage = (event, newPage) => {\r\n gotoPage(newPage);\r\n };\r\n\r\n const handleChangeRowsPerPage = event => {\r\n setPageSize(Number(event.target.value));\r\n };\r\n return (\r\n <>\r\n \r\n (\r\n {item(0, () => void 0)}\r\n )) ?? []\r\n }\r\n />\r\n {props.subHeader !== undefined && {props.subHeader}}\r\n \r\n \r\n <>\r\n {isSomeselected && selectedRowsActions !== undefined ? (\r\n \r\n ) : (\r\n <>\r\n {/* {screenId && AuthenticatedUser && (\r\n }\r\n onClick={handleConfigurableColumns}\r\n >\r\n {t(translations.Columns)}\r\n \r\n )} */}\r\n {/* {useExport && (\r\n \r\n )} */}\r\n {/* {useImportLink && importLink && (\r\n }\r\n onClick={() =>\r\n window.open(toRootedURL(importLink), '_self')\r\n }\r\n >\r\n {t(translations.Import)}\r\n \r\n )} */}\r\n\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {props.useImportLink && (props.importLink || props.importHandler) && (\r\n }\r\n onClick={() => {\r\n if (props.importHandler) {\r\n props.importHandler();\r\n } else {\r\n if (props.importLink) {\r\n window.open(toRootedURL(props.importLink), '_self');\r\n }\r\n }\r\n }}\r\n >\r\n {t(translations.Import)}\r\n \r\n )}\r\n \r\n \r\n\r\n
    \r\n \r\n \r\n {\r\n // Loop over the header rows\r\n headerGroups.map(headerGroup => (\r\n // Apply the header row props\r\n \r\n {\r\n // Loop over the headers in each row\r\n headerGroup.headers.map(column => (\r\n // Apply the header cell props\r\n \r\n {\r\n // Render the header\r\n column.render('Header')\r\n }\r\n \r\n ))\r\n }\r\n \r\n ))\r\n }\r\n \r\n {/* Apply the table body props */}\r\n \r\n {\r\n // Loop over the table rows\r\n page.map(row => {\r\n // Prepare the row for display\r\n\r\n prepareRow(row);\r\n return (\r\n // Apply the row props\r\n \r\n {\r\n // Loop over the rows cells\r\n row.cells.map(cell => {\r\n // Apply the cell props\r\n return (\r\n \r\n {\r\n // Render the cell contents\r\n cell.render('Cell')\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 );\r\n}\r\n","/**\r\n *\r\n * SamplePlatePositionsPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ISamplePlateDto } from 'api/odata/generated/entities/ISamplePlateDto';\r\nimport { SamplePlatePositionNamingTypes } from 'api/odata/generated/enums/SamplePlatePositionNamingTypes';\r\nimport {\r\n AutocompleteMultiPicker,\r\n AutocompleteMultiPickerProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPicker';\r\nimport {\r\n ISample,\r\n ISampleRun,\r\n} from 'app/pages/Samples/SamplesListPage/slice/types';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface SamplePlatePositionsPickerProps\r\n extends Omit<\r\n AutocompleteMultiPickerProps,\r\n 'loadData' | 'onChange' | 'value' | 'label' | 'multiple' | 'fullWidth'\r\n > {\r\n serviceGroupId?: number;\r\n name?: string;\r\n placeholder?: string;\r\n onBlur?: React.FocusEventHandler;\r\n error?: boolean;\r\n helperText?: string;\r\n values?: ISample;\r\n value: string | null;\r\n onChange: (value: string | null) => void;\r\n}\r\n\r\nexport interface ConnectedSamplePlatePositionsPickerProps\r\n extends SamplePlatePositionsPickerProps {\r\n samplePlateId: string | null;\r\n}\r\nfunction range(x) {\r\n return Array.apply(null, Array(x)).map(function (x, i) {\r\n return i;\r\n });\r\n}\r\nconst loadData = (plateId?: string | null) => async (\r\n searchTerm: string | null,\r\n): Promise[]> => {\r\n const plate = await httpClient.get(\r\n `/api/odata/v4/sampleplates('${plateId}')`,\r\n );\r\n\r\n const rowsCount = plate.SamplePlateTypeRows;\r\n const columnsCount = plate.SamplePlateTypeColumns;\r\n const rows = range(columnsCount)\r\n .map(i =>\r\n plate.SamplePlateTypeColumnsNaming ===\r\n SamplePlatePositionNamingTypes.Alpha\r\n ? String.fromCharCode(65 + i)\r\n : i + 1,\r\n )\r\n .flatMap(column =>\r\n range(rowsCount)\r\n .map(i =>\r\n plate.SamplePlateTypeRowsNaming ===\r\n SamplePlatePositionNamingTypes.Alpha\r\n ? String.fromCharCode(65 + i)\r\n : i + 1,\r\n )\r\n .map(row => `${column}${row}`),\r\n );\r\n const options = rows.map(a => ({ Id: a, Name: a }));\r\n return options;\r\n};\r\nexport function SamplePlatePositionsPicker({\r\n serviceGroupId,\r\n samplePlateId,\r\n value,\r\n values,\r\n onChange,\r\n ...props\r\n}: ConnectedSamplePlatePositionsPickerProps) {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const loadDatax = React.useCallback(loadData(samplePlateId), [\r\n serviceGroupId,\r\n samplePlateId,\r\n ]);\r\n const S2Value =\r\n value === null\r\n ? []\r\n : value\r\n .split(';')\r\n .filter(value => value !== '')\r\n .map(value => ({ Id: value, Name: value }));\r\n return (\r\n item.Name}\r\n size={props.size}\r\n onChange={value =>\r\n onChange(value?.map(item => item.Id)?.join(';') ?? null)\r\n }\r\n value={S2Value}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport function TargetSamplePlatePositionsPicker({\r\n values,\r\n\r\n ...props\r\n}: SamplePlatePositionsPickerProps) {\r\n const samplePlateId = (values as ISampleRun)?.TargetPlateId ?? null;\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from '../BasicPickers/AutocompletePicker';\r\nimport { httpClient } from 'api/HttpClient';\r\n\r\nexport interface FormGradientPickerProps\r\n extends Omit<\r\n AutocompletePickerProps,\r\n 'onBlur' | 'value' | 'error' | 'loadData' | 'onChange'\r\n > {\r\n serviceGroupId?: number;\r\n}\r\nexport interface IGradientDto extends Entity {\r\n EstimatedRuntimeMinutes: number;\r\n}\r\nexport const FormGradientPicker = ({\r\n serviceGroupId,\r\n onChange,\r\n onBlur,\r\n ...props\r\n}: FieldHookConfig & FormGradientPickerProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n const handleChange: (value: IGradientDto | null) => void = (\r\n value: IGradientDto | null,\r\n ) => helpers.setValue(value, true);\r\n const loadData = React.useCallback(\r\n async (searchTerm: string | null): Promise => {\r\n const data = await httpClient.get(`/odata.svc/Gradients`, {\r\n $filter:\r\n serviceGroupId === undefined\r\n ? undefined\r\n : `ServiceGroupId eq ${serviceGroupId}`,\r\n $orderby: 'Name',\r\n });\r\n const result: IGradientDto[] = data.d.map(item => ({\r\n Id: item.Id,\r\n Name: item.Name,\r\n EstimatedRuntimeMinutes: item.EstimatedRuntimeMinutes,\r\n }));\r\n return result;\r\n },\r\n [serviceGroupId],\r\n );\r\n return (\r\n <>\r\n \r\n \r\n );\r\n};\r\n","import {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n Grid,\r\n} from '@material-ui/core';\r\nimport { useRef, useState } from 'react';\r\nimport { toQueryString } from 'utils/url-utils';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { IRunDetails, ISample } from '../../SamplesListPage/slice/types';\r\nimport * as Yup from 'yup';\r\nimport { Form, Formik, FormikProps, FormikValues } from 'formik';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { Entity } from 'types/common';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport {\r\n FormGradientPicker,\r\n IGradientDto,\r\n} from 'app/components/Forms/FormGradientPicker';\r\nimport { FormOnlineServicesSinglePicker } from 'app/components/Forms/FormEquipmentsPicker';\r\nimport { ServiceGroupFilter } from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { useSamplesListSlice } from '../../SamplesListPage/slice';\r\nimport { useDispatch } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { GetSchedulerPagePath } from 'app/pages/CalendarPage/GetCalendarPagePath';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\n\r\nexport interface CreateReservationComponentProps {\r\n runDetails?: IRunDetails;\r\n sampleRunId?: number;\r\n rows: ISample[];\r\n}\r\ninterface ICreateReservationOptions {\r\n Gradient?: IGradientDto | null;\r\n SampleOverhead?: number | null;\r\n TotalOverhead?: number | null;\r\n Equipment?: Entity | null;\r\n SecondaryEquipment?: Entity | null;\r\n ACQUISITION_TYPE?: string | null;\r\n}\r\nconst schema: Yup.SchemaOf = Yup.object({\r\n Gradient: Yup.mixed().nullable(),\r\n SampleOverhead: Yup.number().positive().nullable(),\r\n TotalOverhead: Yup.number().positive().nullable(),\r\n Equipment: Yup.mixed().required().nullable(),\r\n SecondaryEquipment: Yup.mixed().notRequired().nullable(),\r\n ACQUISITION_TYPE: Yup.string().notRequired().nullable(),\r\n});\r\n\r\nexport const CreateReservationComponent = ({\r\n runDetails,\r\n sampleRunId,\r\n rows,\r\n}: CreateReservationComponentProps) => {\r\n const { t } = useTranslation();\r\n const [open, setOpen] = useState(false);\r\n const [save, setSave] = useState(false);\r\n const dispatch = useDispatch();\r\n const { actions } = useSamplesListSlice();\r\n const formikRef = useRef>(null);\r\n\r\n const serviceRequestId = rows?.map(item => item.ServiceRequestId)[0];\r\n const serviceGroupId = rows?.map(item => item.ServiceGroupId)[0];\r\n const handleCreateReservationButtonClick = (\r\n values: ICreateReservationOptions,\r\n ) => {\r\n if (save) {\r\n setSave(false);\r\n dispatch(\r\n actions.updateRun({\r\n SampleRunId: sampleRunId,\r\n InstrumentId:\r\n values.Equipment !== undefined && values.Equipment !== null\r\n ? values.Equipment.Id\r\n : undefined,\r\n SecondaryInstrumentId:\r\n values.SecondaryEquipment !== undefined &&\r\n values.SecondaryEquipment !== null\r\n ? values.SecondaryEquipment.Id\r\n : undefined,\r\n GradientId:\r\n values.Gradient !== undefined && values.Gradient !== null\r\n ? values.Gradient.Id\r\n : undefined,\r\n ACQUISITION_TYPE:\r\n values.ACQUISITION_TYPE !== null ? values.ACQUISITION_TYPE : null,\r\n }),\r\n );\r\n setOpen(false);\r\n } else {\r\n var p: Record = {\r\n srid: serviceRequestId,\r\n sampleRunId: sampleRunId,\r\n eid: [values.Equipment?.Id, values.SecondaryEquipment?.Id],\r\n srsid:\r\n sampleRunId === undefined\r\n ? rows?.map(r => r.Id).join(',')\r\n : undefined,\r\n duration: getReservationDuration(values, rows),\r\n };\r\n dispatch(\r\n push({\r\n pathname: GetSchedulerPagePath('calendar'),\r\n search: toQueryString(p).toString(),\r\n }),\r\n );\r\n setOpen(false);\r\n }\r\n };\r\n const initialValues: ICreateReservationOptions = {\r\n Gradient: runDetails?.Gradient as IGradientDto,\r\n //SampleOverhead: 0,\r\n //TotalOverhead: 0,\r\n Equipment: runDetails?.Instrument,\r\n SecondaryEquipment: runDetails?.SecondaryInstrument,\r\n ACQUISITION_TYPE: runDetails?.ACQUISITION_TYPE,\r\n };\r\n return (\r\n <>\r\n \r\n setOpen(false)}>\r\n {\r\n handleCreateReservationButtonClick(values);\r\n }}\r\n >\r\n {formik => (\r\n
    \r\n \r\n {t(translations.RunDetailsCreateReservation)} {' '}\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 \r\n \r\n \r\n \r\n setOpen(false)}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n {\r\n setSave(true);\r\n formikRef.current?.handleSubmit();\r\n }}\r\n >\r\n {t(translations.Save)}\r\n \r\n {\r\n setSave(false);\r\n formikRef.current?.handleSubmit();\r\n }}\r\n >\r\n {t(translations.CreateReservation)}\r\n \r\n \r\n
    \r\n )}\r\n \r\n
    \r\n \r\n );\r\n};\r\nfunction getReservationDuration(\r\n values: ICreateReservationOptions,\r\n rows: ISample[],\r\n) {\r\n var timePerSample =\r\n (values.Gradient?.EstimatedRuntimeMinutes ?? 0) +\r\n (values.SampleOverhead ?? 0);\r\n var totalMinutes = timePerSample * rows.length + (values?.TotalOverhead ?? 0);\r\n const duration = totalMinutes > 0 ? totalMinutes : undefined;\r\n return duration;\r\n}\r\n","import {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n} from '@material-ui/core';\r\nimport { H4 } from 'app/components/Typography';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { FormCheckbox } from 'app/components/Forms/FormCheckbox';\r\nimport { FormLocationPicker } from 'app/components/Forms/FormLocationPicker';\r\nimport { FormRoomPicker } from 'app/components/Forms/FormRoomPicker';\r\nimport { FormServiceGroupPicker } from 'app/components/Forms/FormServiceGroupPicker';\r\nimport { FormSamplePlateTypePicker } from 'app/components/Forms/FromSamplePlateTypePicker';\r\nimport { Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as Yup from 'yup';\r\nimport { ISampleCreateBase } from '../../SamplePlatesPage/slice/types';\r\nimport { ImportComponent, ImportProps } from './ImportComponent';\r\nimport { Check } from 'app/components/BasicInputs/Check';\r\n\r\nexport interface ImportSamplePlateProps extends ImportProps {\r\n onSubmit: (item: ISampleCreateBase | null, file: File) => void;\r\n onClose: () => void;\r\n initialValues: ISampleCreateBase;\r\n}\r\nfunction GetSchema(f: boolean): Yup.SchemaOf {\r\n if (f) {\r\n const schema: Yup.SchemaOf = Yup.object({\r\n Room: Yup.mixed(),\r\n Location: Yup.mixed(),\r\n ServiceGroup: Yup.mixed().required(),\r\n SamplePlateType: Yup.mixed().required(),\r\n Active: Yup.boolean(),\r\n IsRack: Yup.boolean(),\r\n });\r\n return schema;\r\n } else {\r\n const schema: Yup.SchemaOf = Yup.object({\r\n Room: Yup.mixed(),\r\n Location: Yup.mixed(),\r\n ServiceGroup: Yup.mixed(),\r\n SamplePlateType: Yup.mixed(),\r\n Active: Yup.boolean(),\r\n IsRack: Yup.boolean(),\r\n });\r\n return schema;\r\n }\r\n}\r\nexport function ImportSamplePlateForm({\r\n onSubmit,\r\n onClose,\r\n processing,\r\n initialValues,\r\n ...props\r\n}: ImportSamplePlateProps) {\r\n const { t } = useTranslation();\r\n const [file, setFile] = React.useState();\r\n const [generatePlatesonImport, setGeneratePlatesonImport] = React.useState<\r\n boolean\r\n >(false);\r\n const handleFileChange = (file: File) => {\r\n setFile(file);\r\n };\r\n const handleCheckboxChange = event => {\r\n setGeneratePlatesonImport(event.target.checked);\r\n };\r\n const handleSubmit = value => {\r\n if (file !== undefined) {\r\n if (generatePlatesonImport) {\r\n onSubmit(value, file);\r\n } else {\r\n onSubmit(null, file);\r\n }\r\n }\r\n };\r\n const handleClose = () => {\r\n onClose();\r\n };\r\n return (\r\n \r\n {\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => (\r\n <>\r\n
    \r\n \r\n \r\n

    \r\n {props.title ?? t(translations.ImportRecords)}\r\n

    \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.GeneratePlatesOnImport)}\r\n \r\n {generatePlatesonImport && (\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 \r\n )}\r\n \r\n
    \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useSamplesListSlice } from '../SamplesListPage/slice';\r\nimport { ImportSamplePlateForm } from './ImportComponents/PopupImport';\r\nimport { ISampleCreateBase } from '../SamplePlatesPage/slice/types';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport {\r\n selectImportingRunDetails,\r\n selectImportingRunDetailsFinished,\r\n} from '../SamplesListPage/slice/selectors';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface ImportButtonProps {\r\n onDownloadTemplateButtonClick: React.MouseEventHandler;\r\n}\r\n\r\nexport function ImportButton({\r\n onDownloadTemplateButtonClick,\r\n}: ImportButtonProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useSamplesListSlice();\r\n const [open, setOpen] = React.useState(false);\r\n const importStarted = useSelector(selectImportingRunDetails);\r\n const importFinished = useSelector(selectImportingRunDetailsFinished);\r\n\r\n const onImportButtonClick = () => {\r\n dispatch(actions.setShowImportDialog(false));\r\n setOpen(true);\r\n };\r\n const handleConfirm = (item: ISampleCreateBase | null, file: any) => {\r\n if (file !== undefined) {\r\n dispatch(actions.setShowImportDialog(true));\r\n dispatch(actions.readImportFile({ file: file, plate: item }));\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {open && importFinished === false && (\r\n setOpen(false)}\r\n initialValues={{\r\n IsRack: false,\r\n ServiceGroup: undefined,\r\n SamplePlateType: undefined,\r\n Active: true,\r\n }}\r\n />\r\n )}\r\n \r\n );\r\n}\r\n","import { IRow } from 'app/components/BasicTable/IRow';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { ISampleRun } from '../../SamplesListPage/slice/types';\r\nimport { openExportLink } from 'utils/url-utils';\r\n\r\nexport const ExportRunDetailsSamples = (\r\n id: number,\r\n exportConfigurableColumns: Array | undefined,\r\n): Promise => {\r\n if (exportConfigurableColumns !== undefined) {\r\n try {\r\n const params = {\r\n $format: 'application/xlsx',\r\n $select: exportConfigurableColumns.join(','),\r\n };\r\n const samples_url = `/api/odata/v4/sampleruns(${id})/Samples`;\r\n const exportUrl = toRootedURL(samples_url, params);\r\n return openExportLink(exportUrl);\r\n } catch (error) {\r\n console.error('doRunDetailsExport failed', error);\r\n return new Promise((resolve, reject) => {\r\n resolve();\r\n });\r\n }\r\n } else\r\n return new Promise((resolve, reject) => {\r\n resolve();\r\n });\r\n};\r\nexport const ExportForImportRunDetailsSamples = (\r\n id: number,\r\n rows: ISampleRun[],\r\n exportConfigurableColumns: Array | undefined,\r\n): Promise => {\r\n if (rows?.length === 0)\r\n return new Promise((resolve, reject) => {\r\n resolve();\r\n });\r\n if (exportConfigurableColumns !== undefined) {\r\n const params = {\r\n $format: 'application/xlsx',\r\n $filter: `Id in (${rows.map(f => f.Id).join(',')})`,\r\n $select: exportConfigurableColumns.join(','),\r\n };\r\n const samples_url = `/api/odata/v4/sampleruns(${id})/Samples`;\r\n const exportUrl = toRootedURL(samples_url, params);\r\n return openExportLink(exportUrl);\r\n } else\r\n return new Promise((resolve, reject) => {\r\n resolve();\r\n });\r\n};\r\nexport const DownloadTemplateRunDetailsSamples = (\r\n id: number,\r\n exportConfigurableColumns: Array | undefined,\r\n): Promise | undefined => {\r\n if (exportConfigurableColumns !== undefined) {\r\n try {\r\n const params = {\r\n $format: 'application/xlsx',\r\n $top: 0,\r\n $select: exportConfigurableColumns.join(','),\r\n };\r\n const samples_url = `/api/odata/v4/sampleruns(${id})/Samples`;\r\n const exportUrl = toRootedURL(samples_url, params);\r\n return openExportLink(exportUrl);\r\n } catch (error) {\r\n console.error('doRunDetailsExport failed', error);\r\n }\r\n }\r\n};\r\n","import { SelectedRowsActionIconButton } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { SelectedRowsActionRenderer } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { ISampleRun } from '../../SamplesListPage/slice/types';\r\nimport { ExportForImportRunDetailsSamples } from '../Actions';\r\n\r\nexport interface GetSelectedActionsProps {}\r\nexport function GetSelectedActions(\r\n t: TFunction,\r\n id: number,\r\n exportConfigurableColumns: Array | undefined,\r\n props: GetSelectedActionsProps,\r\n): SelectedRowsActionRenderer[] {\r\n const [validUpdate] = React.useState(false);\r\n const SelectedActions: SelectedRowsActionRenderer<\r\n ISampleRun\r\n >[] = React.useMemo(\r\n () => [\r\n (rows, onRefresh, toggleAllRowsSelected) => (\r\n {\r\n toggleAllRowsSelected(false);\r\n }}\r\n variantButton=\"button\"\r\n action={() =>\r\n new Promise(async (resolve, reject) => {\r\n await ExportForImportRunDetailsSamples(\r\n id,\r\n rows,\r\n exportConfigurableColumns,\r\n );\r\n let messages: IResponseType = {\r\n SuccessMessages: [],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n resolve(messages);\r\n })\r\n }\r\n />\r\n ),\r\n ],\r\n [exportConfigurableColumns, id, t, validUpdate],\r\n );\r\n return SelectedActions;\r\n}\r\n","import {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n Grid,\r\n} from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { translations } from 'locales/translations';\r\nimport { useCallback, useMemo } from 'react';\r\nimport { Form, Formik } from 'formik';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport * as Yup from 'yup';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\n\r\nexport interface PopupSuffixComponentProps {\r\n onSubmit: (value: string) => void;\r\n close: () => void;\r\n}\r\ninterface ISuffixOptions {\r\n Suffix: string;\r\n}\r\nconst schema: Yup.SchemaOf = Yup.object({\r\n Suffix: Yup.string().required(),\r\n});\r\nexport function PopupSuffixComponent(props: PopupSuffixComponentProps) {\r\n const { t } = useTranslation();\r\n const initialValues: ISuffixOptions = useMemo(() => {\r\n return {\r\n Suffix: '',\r\n };\r\n }, []);\r\n const handleSubmitk = useCallback(\r\n values => {\r\n props.onSubmit(values.Suffix);\r\n },\r\n [props],\r\n );\r\n const content = useMemo(() => {\r\n return (\r\n {\r\n handleSubmitk(values);\r\n }}\r\n >\r\n
    \r\n \r\n {t(translations.AnalyticalSampleIDSuffix)} {' '}\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 }, [handleSubmitk, initialValues, props.close, t]);\r\n return <>{content};\r\n}\r\nexport interface AnalyticalSampleIDSuffixPopupProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onSubmit: (value: string) => void;\r\n}\r\nexport function AnalyticalSampleIDSuffixPopup({\r\n show,\r\n onClose,\r\n onSubmit,\r\n}: AnalyticalSampleIDSuffixPopupProps) {\r\n return (\r\n <>\r\n }\r\n />\r\n \r\n );\r\n}\r\nexport interface SuffixDialogProps {\r\n open: boolean;\r\n content: React.ReactNode;\r\n fullWidth: boolean;\r\n}\r\nexport function SuffixDialog(props: SuffixDialogProps) {\r\n return (\r\n \r\n {props.content}\r\n \r\n );\r\n}\r\n","export const CellPositionToNumber = (value: string, columns: number) => {\r\n let res = 0;\r\n if (value !== null) {\r\n const s = value.match(/[a-zA-Z]+|[0-9]+/g);\r\n if (s !== null) {\r\n if (s.length === 1) {\r\n const c1 = s[0][0].charCodeAt(0) - 64;\r\n const r1 = s[0][1].charCodeAt(0) - 64;\r\n res = (r1 - 1) * columns + c1;\r\n } else {\r\n const c = parseInt(s[0]);\r\n const r = parseInt(s[1]);\r\n if (!isNaN(c) && !isNaN(r)) {\r\n res = (r - 1) * columns + c;\r\n } else {\r\n if (isNaN(c) && !isNaN(r)) {\r\n const c1 = s[0].charCodeAt(0) - 64;\r\n res = (r - 1) * columns + c1;\r\n } else {\r\n if (!isNaN(c) && isNaN(r)) {\r\n const r1 = s[1].charCodeAt(0) - 64;\r\n res = (r1 - 1) * columns + c;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return res;\r\n};\r\n","/**\r\n *\r\n * RunPage\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { EditableCell } from '../EditableTable/EditableCell';\r\nimport { NumberField } from 'app/pages/Samples/EditableTable/Fields/NumberField';\r\nimport { TextField } from 'app/pages/Samples/EditableTable/Fields/TextField';\r\nimport { EditableTable } from '../EditableTable';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectRunDetails,\r\n selectRunDetailsGradient,\r\n selectRunDetailsInstrument,\r\n selectRunDetailsSecondaryInstrument,\r\n selectRunDetailsCreatedDate,\r\n selectRunDetailsAcquision_type,\r\n} from '../SamplesListPage/slice/selectors';\r\nimport {\r\n ISample,\r\n ISampleRun,\r\n ISampleTarget,\r\n} from '../SamplesListPage/slice/types';\r\nimport { useSamplesListSlice } from '../SamplesListPage/slice';\r\nimport { Box, Card, CardContent, Grid } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Link } from 'react-router-dom';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { SamplePlatePicker } from 'app/components/pickers/AutocompletePickers/SamplePlatePicker';\r\nimport { getRunTypeValue } from '../components/RunTypePicker';\r\nimport { TargetSamplePlatePositionPicker } from 'app/components/pickers/AutocompletePickers/SamplePlatePositionPicker';\r\nimport { TargetSamplePlatePositionsPicker } from 'app/components/pickers/AutocompletePickers/SamplePlatePositionsPicker';\r\nimport { CreateReservationComponent } from '../components/CreateReservationComponent';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { ImportButton } from './ImportButton';\r\nimport { PageActionRenderer } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport { ReservationEditButton } from 'app/components/ReservationEditButton';\r\nimport { GetServiceRequestDetailsPath } from '../RequestSamplesPage/slice/path';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { Column } from 'react-table';\r\nimport { GetSelectedActions } from 'app/pages/Samples/RunDetailsPage/SelectedRowActions/GetSelectaedRowActions';\r\nimport {\r\n DownloadTemplateRunDetailsSamples,\r\n ExportRunDetailsSamples,\r\n} from './Actions';\r\nimport { useConfigurableColumnsAdvanced } from 'app/components/BasicTable/useConfigurableColumnsAdvanced';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { ImportButton as SamplesImportButton } from '../SamplesListPage/ImportButton';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { selectAppSettings } from 'app/slice/selectors';\r\nimport { useRequestSamplesSlice } from '../RequestSamplesPage/slice';\r\nimport { DateTimeLabel } from 'app/components/DateTimeLabel';\r\nimport { AnalyticalSampleIDSuffixPopup } from './AnalyticalSampleIDSuffix';\r\nimport { CellPositionToNumber } from './CellPositionToNumber';\r\n\r\nexport const RUN_DETAILS_PAGE_PATH = '/samples/runs/details/:id';\r\nexport interface RunPageProps extends RouteComponentProps<{ id: string }> {}\r\nexport function RunDetailsPage(props: RunPageProps) {\r\n const id = +props.match.params.id;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const appSettings = useSelector(selectAppSettings);\r\n const { actions } = useSamplesListSlice();\r\n const { actions: requestactions } = useRequestSamplesSlice();\r\n const runDetails = useSelector(selectRunDetails);\r\n const instrument = useSelector(selectRunDetailsInstrument);\r\n const secondaryInstrument = useSelector(selectRunDetailsSecondaryInstrument);\r\n const gradient = useSelector(selectRunDetailsGradient);\r\n const createdDate = useSelector(selectRunDetailsCreatedDate);\r\n const acquision_type = useSelector(selectRunDetailsAcquision_type);\r\n const [showSuffixDialog, setShowSuffixDialog] = React.useState(\r\n false,\r\n );\r\n const runType = runDetails?.RunType;\r\n\r\n const updateMyData = item => {\r\n // We also turn on the flag to not reset the page\r\n\r\n // setSkipPageReset(true);\r\n const foo: Omit = item as Omit;\r\n console.log('updateMyData', foo);\r\n dispatch(actions.updateRunSampleValue(item));\r\n };\r\n const samples = runDetails?.Samples;\r\n const handleCompleteButtonClick = React.useCallback(\r\n (suffix?: string) => {\r\n const data = samples;\r\n if (data === undefined) {\r\n return;\r\n }\r\n if (runType === undefined) {\r\n return;\r\n }\r\n\r\n dispatch(\r\n actions.completeRun({\r\n Id: id,\r\n RunType: runType,\r\n Samples: data,\r\n AnalyticalSampleIDSuffix: suffix,\r\n }),\r\n );\r\n },\r\n [actions, dispatch, id, samples, runType],\r\n );\r\n const submitSuffixDialog = React.useCallback(\r\n (value: string) => {\r\n setShowSuffixDialog(false);\r\n handleCompleteButtonClick(value);\r\n },\r\n [handleCompleteButtonClick],\r\n );\r\n const showCompleteDialog = React.useCallback(() => {\r\n if (runDetails?.RunType === 'Fractioning') {\r\n setShowSuffixDialog(true);\r\n } else {\r\n handleCompleteButtonClick();\r\n }\r\n }, [handleCompleteButtonClick, runDetails?.RunType]);\r\n const runId = runDetails?.Id;\r\n\r\n const handleExportButtonClick = React.useCallback(() => {\r\n dispatch(actions.exportRun(samples || []));\r\n }, [actions, dispatch, samples]);\r\n const handleDownloadTemplateButtonClick = React.useCallback(() => {\r\n dispatch(actions.exportRun([]));\r\n }, [actions, dispatch]);\r\n const columns: Array> = [\r\n /*{\r\n Header: ' ',\r\n columns: [*/\r\n {\r\n Header: t(translations.SampleId) as string,\r\n accessor: 'Id', // accessor is the \"key\" in the data\r\n },\r\n {\r\n Header: 'Request ID',\r\n accessor: 'ServiceRequestId',\r\n Cell: ({ value }) => (\r\n {value}\r\n ),\r\n },\r\n {\r\n Header: 'Status',\r\n accessor: 'StatusName',\r\n Cell: ({ row, value }) => {\r\n /*switch (value) {\r\n case 0:\r\n return 'New';\r\n case 1:\r\n return 'In Work';\r\n case 2:\r\n return 'Done';\r\n default:\r\n return 'N/A';\r\n }*/\r\n return row.original.StatusName;\r\n },\r\n },\r\n { Header: 'Project ID', accessor: 'BudgetId' },\r\n //],\r\n //},\r\n /*{\r\n Header: 'Source sample attributes',\r\n columns: [*/\r\n {\r\n Header: 'Analytical Sample ID',\r\n accessor: 'AnalyticalSampleId',\r\n },\r\n {\r\n Header: 'BiologicalSampleId',\r\n accessor: 'BiologicalSampleId',\r\n },\r\n { Header: t(translations.TMT_Type) as string, accessor: 'TMT_Type' },\r\n {\r\n Header: t(translations.TMT_Label) as string,\r\n accessor: 'TMT_Label',\r\n },\r\n {\r\n id: 'TMT_RunSet',\r\n Header: t(translations.TMT_Set) as string,\r\n accessor: 'TMT_Set',\r\n Cell: ({ row, value }) => {\r\n if (row.ServiceRequestId !== undefined && row.TMT_Set !== undefined) {\r\n return `${row.ServiceRequestId}-${row.TMT_Set}`;\r\n } else {\r\n return <>;\r\n }\r\n },\r\n },\r\n //],\r\n //},\r\n /*{\r\n Header: 'Standard attributes',\r\n columns: [*/\r\n {\r\n Header: 'Tube Label',\r\n accessor: 'TubeLabel',\r\n },\r\n {\r\n Header: t(translations.SamplePlateId) as string,\r\n accessor: 'SamplePlateId',\r\n },\r\n {\r\n Header: t(translations.UniquePlateNumber) as string,\r\n accessor: 'UniquePlateNumber',\r\n },\r\n {\r\n Header: t(translations.PlatePosition) as string,\r\n accessor: 'Position',\r\n },\r\n {\r\n Header: t(translations.NumericalPlatePosition) as string,\r\n accessor: 'NumericalPlatePosition',\r\n Cell: ({ row, value }) => {\r\n if (value !== null) {\r\n const res = CellPositionToNumber(\r\n value,\r\n row.original.SamplePlateTypeColumns,\r\n );\r\n return res;\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n {\r\n Header: 'Volume (ul)',\r\n accessor: 'Volume',\r\n },\r\n {\r\n Header: 'Concentration (mg/mL)',\r\n accessor: 'Concentration',\r\n },\r\n {\r\n Header: t(translations.SampleType) as string,\r\n accessor: 'SampleType',\r\n },\r\n //],\r\n //},\r\n\r\n /*{\r\n Header: 'Target attributes',\r\n columns: [*/\r\n {\r\n Header: 'Target Tube Label',\r\n accessor: 'TargetTubeLabel',\r\n Cell: React.memo(EditableCell(TextField)),\r\n },\r\n {\r\n Header: 'Target Plate ID',\r\n accessor: 'TargetPlateId',\r\n Cell:\r\n runType === undefined || ['MassSpec'].includes(runType)\r\n ? 'N/A'\r\n : React.memo(EditableCell(SamplePlatePicker)),\r\n },\r\n {\r\n Header: 'Target Plate Position',\r\n accessor: 'TargetPosition',\r\n Cell:\r\n runType === undefined || ['MassSpec'].includes(runType)\r\n ? 'N/A'\r\n : ['Fractioning'].includes(runType)\r\n ? React.memo(EditableCell(TargetSamplePlatePositionsPicker))\r\n : React.memo(EditableCell(TargetSamplePlatePositionPicker)),\r\n },\r\n {\r\n Header: 'Target Volume (ul)',\r\n accessor: 'TargetVolume',\r\n Cell:\r\n runType === undefined || ['MassSpec'].includes(runType)\r\n ? 'N/A'\r\n : React.memo(EditableCell(NumberField)),\r\n },\r\n {\r\n Header: 'Target Concentration (mg/mL)',\r\n accessor: 'TargetConcentration',\r\n Cell:\r\n runType === undefined || ['MassSpec'].includes(runType)\r\n ? 'N/A'\r\n : React.memo(EditableCell(NumberField)),\r\n },\r\n {\r\n Header: 'Target Sample Type',\r\n accessor: 'TargetSampleType',\r\n Cell: React.memo(EditableCell(TextField)),\r\n },\r\n //],\r\n //},\r\n ];\r\n\r\n const pageActions = React.useMemo(() => {\r\n const actions: PageActionRenderer[] = [\r\n () => ,\r\n ];\r\n actions.push(() => (\r\n \r\n ));\r\n //if (runType !== 'MassSpec') {\r\n actions.push(() => (\r\n \r\n ));\r\n //}\r\n actions.push(() => (\r\n \r\n ));\r\n\r\n return actions;\r\n }, [\r\n handleDownloadTemplateButtonClick,\r\n handleExportButtonClick,\r\n runDetails,\r\n runId,\r\n samples,\r\n showCompleteDialog,\r\n t,\r\n ]);\r\n const {\r\n configurableColumns,\r\n columnAccessors,\r\n exportConfigurableColumns,\r\n handleConfigurableColumns,\r\n } = useConfigurableColumnsAdvanced(ScreensId.SampleRunsDetails, columns, [\r\n 'TargetTubeLabel',\r\n 'TargetPlateId',\r\n 'TargetPosition',\r\n 'TargetVolume',\r\n 'TargetConcentration',\r\n 'TargetSampleType',\r\n ]);\r\n React.useEffect(() => {\r\n dispatch(actions.loadRunDetqails({ id: id, columns: columnAccessors }));\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n const handleExport = (): Promise => {\r\n return ExportRunDetailsSamples(id, exportConfigurableColumns);\r\n };\r\n const handleDownloadTemplateClick = (): Promise => {\r\n const res = DownloadTemplateRunDetailsSamples(\r\n id,\r\n exportConfigurableColumns,\r\n );\r\n if (res !== undefined) {\r\n return res;\r\n } else\r\n return new Promise((resolve, reject) => {\r\n resolve();\r\n });\r\n };\r\n const importHandler = () => {\r\n dispatch(requestactions.toggleImport(true));\r\n };\r\n return (\r\n <>\r\n \r\n \r\n {t(translations.RunDetails)} {' '}\r\n \r\n {' #'} {id}\r\n \r\n }\r\n columns={configurableColumns !== undefined ? configurableColumns : []}\r\n data={runDetails?.Samples || []}\r\n useRowSelect={true}\r\n useGlobalFilter={true}\r\n // fetchData={fetchData}\r\n // skipPageReset={skipPageReset}\r\n updateMyData={updateMyData}\r\n pageActions={pageActions}\r\n handleConfigurableColumns={handleConfigurableColumns}\r\n handleExport={handleExport}\r\n useImportLink={true}\r\n importHandler={importHandler}\r\n onDownloadTemplate={handleDownloadTemplateClick}\r\n selectedRowsActions={GetSelectedActions(\r\n t,\r\n id,\r\n exportConfigurableColumns,\r\n {},\r\n )}\r\n subHeader={\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    Run Id:
    \r\n
    {id}
    \r\n
    Run Type:
    \r\n
    {getRunTypeValue(t, runDetails?.RunType)}
    \r\n
    Reservations:
    \r\n
    \r\n {(runDetails?.ReservationIds ?? []).length > 0\r\n ? runDetails?.ReservationIds?.map(reservationId => (\r\n <>\r\n \r\n  \r\n \r\n ))\r\n : 'N/A'}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    Instrument:
    \r\n
    {instrument}
    \r\n
    SecondaryInstrument:
    \r\n
    {secondaryInstrument}
    \r\n
    Gradient:
    \r\n
    {gradient}
    \r\n
    Created date:
    \r\n
    \r\n \r\n
    \r\n
    Acquision type
    \r\n
    {acquision_type}
    \r\n
    \r\n
    \r\n
    \r\n {/*\r\n {t(translations.RunDetailsPageInstructions)}\r\n */}\r\n
    \r\n
    \r\n
    \r\n }\r\n />\r\n setShowSuffixDialog(false)}\r\n onSubmit={submitSuffixDialog}\r\n />\r\n \r\n );\r\n}\r\n","import { makeStyles, Theme, createStyles } from '@material-ui/core';\r\n\r\nexport const uploadStyle = makeStyles((theme: Theme) =>\r\n createStyles({\r\n buttonRoot: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: theme.spacing(1.25),\r\n padding: '6px 8px',\r\n boxShadow: 'unset',\r\n lineHeight: 'normal',\r\n height: '48px',\r\n backgroundColor: theme.palette.common.white,\r\n border: `1px solid ${theme.palette.common.grayBorders}`,\r\n '&:hover': {\r\n backgroundColor: theme.palette.common.grayDividers,\r\n border: `1px solid ${theme.palette.common.grayBorders}`,\r\n },\r\n '&$disabled': {\r\n backgroundColor: theme.palette.common.grayDividers,\r\n color: theme.palette.common.grayComponents,\r\n border: `1px solid ${theme.palette.common.grayBorders}`,\r\n },\r\n '&>[class*=\"MuiButton-label\"]': {\r\n gap: theme.spacing(1),\r\n pointerEvents: 'none',\r\n },\r\n },\r\n buttonLabel: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '0px',\r\n margin: 0,\r\n height: '24px',\r\n justifyContent: 'flex-start',\r\n },\r\n startIcon: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n flex: 'none',\r\n order: 0,\r\n flexGrow: 0,\r\n margin: 0,\r\n // margin: props =>\r\n // props.size === 'large'\r\n // ? '0px 12px 0px 0px'\r\n // : props.size === 'medium'\r\n // ? '0px 8px 0px 0px'\r\n // : props.size === 'small'\r\n // ? '0px 8px'\r\n // : props.size === 'xs'\r\n // ? '0px 8px 0px 0px'\r\n // : '0px 12px 0px 0px',\r\n '&$iconSizeSmall': {\r\n marginLeft: 'unset',\r\n },\r\n },\r\n endIcon: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '0px',\r\n flex: 'none',\r\n order: 2,\r\n flexGrow: 0,\r\n marginLeft: 'auto',\r\n marginRight: 0,\r\n },\r\n disabled: {\r\n backgroundColor: theme.palette.common.grayDividers,\r\n color: theme.palette.common.grayComponents,\r\n border: `1px solid ${theme.palette.common.grayBorders}`,\r\n },\r\n dividerRoot: {\r\n backgroundColor: theme.palette.common.grayComponents,\r\n },\r\n previewContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n flexDirection: 'row',\r\n gap: theme.spacing(1),\r\n height: '48px',\r\n padding: '0px 10px 0px 0px',\r\n },\r\n previewIconAndText: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: theme.spacing(1.5),\r\n width: '100%',\r\n },\r\n previewIcon: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: '12px',\r\n gap: theme.spacing(1.25),\r\n cursor: 'pointer',\r\n backgroundColor: theme.palette.common.white,\r\n borderRadius: '8px',\r\n color: theme.palette.common.grayComponents,\r\n '& svg': {\r\n width: '24px',\r\n height: '24px',\r\n },\r\n '& img': {\r\n height: '24px',\r\n },\r\n },\r\n previewText: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n width: '100%',\r\n },\r\n previewTextSize: {\r\n color: theme.palette.common.grayComponents,\r\n },\r\n previewCloseButton: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 2,\r\n gap: theme.spacing(1.25),\r\n },\r\n previewCloseButtonIcon: {\r\n color: theme.palette.common.grayComponents,\r\n width: '16px',\r\n height: '16px',\r\n fontSize: '16px',\r\n },\r\n }),\r\n);\r\n","import { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { uploadStyle } from './styles';\r\nimport * as React from 'react';\r\nimport { lookup } from 'mime-types';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\nimport { openExportLink, toRootedURL } from 'utils/url-utils';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport cliTruncate from 'cli-truncate';\r\nimport { Body } from 'app/components/Typography';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport prettyBytes from 'pretty-bytes';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface FileViewProps {\r\n file: IFormFileValue;\r\n onRemove: (value: any) => void;\r\n}\r\n\r\nexport function FileView(props: FileViewProps) {\r\n const { file, onRemove } = props;\r\n const { t } = useTranslation();\r\n\r\n const fileName =\r\n file.DisplayValue !== null && file.DisplayValue !== undefined\r\n ? file.DisplayValue\r\n : '';\r\n const fileSize =\r\n file.Size == null\r\n ? null\r\n : prettyBytes(file.Size, { maximumFractionDigits: 2 });\r\n const mimeType = lookup(fileName);\r\n const fileUrl =\r\n file.PostedFile === null || file.PostedFile === undefined\r\n ? toRootedURL('/file.ashx?id=' + file.Value)\r\n : file.PostedFile.webkitRelativePath;\r\n const previewImg =\r\n !isEmptyOrWhitespace(file.DisplayValue) &&\r\n mimeType !== false &&\r\n mimeType.startsWith('image/');\r\n const downloadClick = async () => {\r\n if (file.PostedFile === null || file.PostedFile === undefined) {\r\n await openExportLink(fileUrl);\r\n }\r\n };\r\n // const fileDownloadClick = async () => {\r\n // fileDownload(res.data, filename)\r\n // };\r\n\r\n const classes = uploadStyle();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n return (\r\n \r\n
    \r\n
    \r\n {file.Value !== null ? (\r\n \r\n downloadClick()}\r\n >\r\n {previewImg ? (\r\n {fileName}\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 {cliTruncate(fileName, sidePanelExpanded ? 40 : 25, {\r\n position: 'middle',\r\n })}\r\n \r\n\r\n {fileSize && (\r\n \r\n {fileSize}\r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n onRemove(fileName)}\r\n >\r\n \r\n \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n","import {\r\n Button,\r\n Divider,\r\n FormControl,\r\n FormHelperText,\r\n FormLabel,\r\n Input,\r\n InputProps,\r\n styled,\r\n} from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport * as React from 'react';\r\n\r\nimport cliTruncate from 'cli-truncate';\r\nimport { uploadStyle } from './styles';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { FileView } from './FileView';\r\nimport { buttonM } from 'styles/typography/bookitTypography';\r\n\r\nexport interface FileInputProps extends InputProps {\r\n className?: string;\r\n onFileChange?: (file: FileList | null) => void;\r\n label?: string;\r\n multiple?: boolean;\r\n uploadLabel?: string;\r\n showPreview?: boolean;\r\n removeable?: boolean;\r\n onRemove?: (value: string) => void;\r\n acceptedFiles?: string;\r\n isRequired?: string;\r\n helperText?: string;\r\n errorMesage?: string;\r\n info?: string;\r\n referenceId?: number;\r\n file?: IFormFileValue;\r\n}\r\n\r\nconst StyledFormHelperText = styled(FormHelperText)(props => ({\r\n // empty helperText results in zero element height. So when field is validated the appearance of the\r\n // error message in the helperText causes the form element to increase in height and forces a redraw\r\n // empty char \\00a0 causes the FormHelperText to always occupy one line height and prevents reflows\r\n '&::before': {\r\n content: '\"\\\\00a0\"',\r\n },\r\n}));\r\nconst StyledFormLabel = styled(FormLabel)(({ theme }) => ({\r\n color: theme.palette.common.blackRegular,\r\n ...buttonM,\r\n '&[class*=\"Mui-focused\"]': {\r\n color: theme.palette.common.blackRegular,\r\n },\r\n}));\r\nexport function FileInput(props: FileInputProps) {\r\n const {\r\n className,\r\n onFileChange,\r\n onRemove,\r\n id,\r\n multiple,\r\n uploadLabel,\r\n helperText,\r\n errorMesage,\r\n onChange,\r\n label,\r\n file,\r\n } = props;\r\n const classes = uploadStyle();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n //const [file, setFile] = React.useState(undefined);\r\n\r\n const handleChange = (event: React.ChangeEvent) => {\r\n if (onChange) {\r\n onChange(event);\r\n } else {\r\n const files = event.target.files;\r\n if (onFileChange) {\r\n onFileChange(files);\r\n }\r\n }\r\n // if (event.target.files?.length) {\r\n // setFileName(event.target.files[event.target.files?.length - 1].name);\r\n // }\r\n };\r\n const removeFile = (fileName: string) => {\r\n if (onRemove) {\r\n onRemove(fileName);\r\n }\r\n //setFileName(undefined);\r\n };\r\n return (\r\n \r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n removeFile(file.DisplayValue || '')}\r\n children={}\r\n size=\"small\"\r\n />\r\n ) : props.info ? (\r\n \r\n ) : undefined\r\n }\r\n >\r\n {uploadLabel ? uploadLabel : 'Upload File'}\r\n \r\n {multiple && file ? (\r\n \r\n {cliTruncate(file.DisplayValue || '', sidePanelExpanded ? 35 : 22, {\r\n position: 'middle',\r\n })}\r\n \r\n ) : (\r\n {'Please select a file...'}\r\n )}\r\n \r\n \r\n {!multiple && file !== undefined && (\r\n removeFile(file.DisplayValue || ' ')}\r\n />\r\n )}\r\n \r\n {errorMesage ? (\r\n {errorMesage}\r\n ) : helperText ? (\r\n {helperText}\r\n ) : undefined}\r\n \r\n \r\n );\r\n}\r\n","import { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { FileView } from './FileView';\r\nimport * as React from 'react';\r\n\r\nexport interface FilesPreviewProps {\r\n files: IFormFileValue[] | null;\r\n multiple?: boolean;\r\n onRemove?: (value: any) => void;\r\n}\r\nexport function FilesPreview(props: FilesPreviewProps) {\r\n const { files, onRemove } = props;\r\n const handleRemove = (value: any) => {\r\n if (onRemove) onRemove(value);\r\n };\r\n return (\r\n \r\n {files !== null &&\r\n files.length > 0 &&\r\n files.map(file => )}\r\n \r\n );\r\n}\r\n","import { Box } from '@material-ui/core';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport * as React from 'react';\r\nimport { FileInput, FileInputProps } from './FileInput';\r\nimport { FilesPreview } from './FilesPreview';\r\n\r\nexport interface FileUploadProps {\r\n values: IFormFileValue[];\r\n multiple?: boolean;\r\n uploadLabel?: string;\r\n showPreview?: boolean;\r\n fileSizeLimit?: number;\r\n saveFiles?: (files: IFormFileValue[]) => void;\r\n fileInputProps: FileInputProps;\r\n}\r\n\r\nexport function FileUpload(props: FileUploadProps) {\r\n const { values, multiple, showPreview, saveFiles, fileInputProps } = props;\r\n\r\n const [innerFiles, setInnerFiles] = React.useState>({});\r\n const [fileValues, setFileValues] = React.useState(\r\n values,\r\n );\r\n const referenceId = fileInputProps.referenceId;\r\n const convertFilesToArray = (files: Record) =>\r\n Object.keys(files).map(key => files[key]);\r\n\r\n const addNewFiles = (newFiles: FileList) => {\r\n let files = multiple ? innerFiles : {};\r\n for (let file of newFiles) {\r\n if (!multiple) {\r\n // return { file };\r\n files[file.name] = file;\r\n return { ...files };\r\n }\r\n files[file.name] = file;\r\n }\r\n return { ...files };\r\n };\r\n const updateState = (files: File[], deleteFileName?: string) => {\r\n let savedFiles = fileValues ?? [];\r\n if (deleteFileName) {\r\n savedFiles =\r\n fileValues?.filter(f => f.DisplayValue !== deleteFileName) ?? [];\r\n } else {\r\n files?.forEach(file => {\r\n if (\r\n savedFiles?.filter(f => f.DisplayValue === file.name)?.length === 0\r\n ) {\r\n savedFiles?.push({\r\n Id: referenceId || -1,\r\n Value: null,\r\n DisplayValue: file.name,\r\n Size: file.size,\r\n PostedFile: file,\r\n } as IFormFileValue);\r\n }\r\n });\r\n }\r\n return savedFiles;\r\n };\r\n const updateFiles = (\r\n files: Record,\r\n deleteFileName?: string,\r\n ) => {\r\n const filesAsArray = convertFilesToArray(files);\r\n const savedFiles = updateState(filesAsArray, deleteFileName);\r\n setFileValues(savedFiles);\r\n if (saveFiles !== undefined) {\r\n saveFiles(savedFiles ?? []);\r\n }\r\n };\r\n const handleChange = (files: FileList | null) => {\r\n let updatedFiles = {};\r\n if (files?.length) {\r\n updatedFiles = addNewFiles(files);\r\n setInnerFiles(updatedFiles);\r\n } else {\r\n setInnerFiles({});\r\n }\r\n updateFiles(updatedFiles);\r\n };\r\n const removeFile = (fileName: string) => {\r\n let files = innerFiles;\r\n delete files[fileName];\r\n setInnerFiles({ ...files });\r\n\r\n updateFiles({ ...files }, fileName);\r\n };\r\n return (\r\n \r\n 0 ? fileValues[0] : undefined}\r\n {...fileInputProps}\r\n />\r\n {multiple && showPreview && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField, useFormikContext } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { useIsRequired } from './ValidationSchemaProvider';\r\nimport { FileInputProps } from '../BasicInputs/FileUpload/FileInput';\r\nimport { IFormFileValue } from '../CustomForm/CustomFormUtils';\r\nimport { FileUpload } from '../BasicInputs/FileUpload/FileUpload';\r\n\r\nexport const FormInputFile = ({\r\n id,\r\n label,\r\n onChange,\r\n value,\r\n name,\r\n title,\r\n ...props\r\n}: FieldHookConfig & IFieldProps & FileInputProps) => {\r\n const [field, meta, helper] = useField({\r\n name,\r\n ...props,\r\n });\r\n const handleChange = (files: IFormFileValue[]) => {\r\n helper.setValue(files);\r\n //const files = event.target.files;\r\n //console.log('value', event.target);\r\n console.debug('files', files);\r\n onChange?.(files);\r\n // if (onChange !== undefined) {\r\n // onChange(files, event);\r\n // }\r\n // field.onChange(event);\r\n };\r\n const { submitCount } = useFormikContext();\r\n const isRequired = useIsRequired(name);\r\n const hasError = meta?.error !== undefined;\r\n const showError = hasError || submitCount > 0;\r\n return (\r\n \r\n );\r\n};\r\n","import { httpClient } from './HttpClient';\r\n\r\nexport const EmailNotificationsApi = {\r\n deleteSelectedRows: (payload: number[]) => {\r\n const url = `/api/odata/v4/emailnotifications/DeleteSelected`;\r\n const data = { keys: payload };\r\n return httpClient.post(url, data);\r\n },\r\n};\r\n","import {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { Column } from 'react-table';\r\nimport { IBasePageProps, IListPageProps } from '../IBasePageProps';\r\nimport { IEmailNotificationsRow } from './IEmailNotificationsRow';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { UserProfileLink } from 'app/components/BasicTable/components/UserProfileLink';\r\nimport { DateTimeLabel } from 'app/components/DateTimeLabel';\r\nimport { DescriptionCell } from 'app/components/BasicTable/components/DescriptionCell';\r\nimport { BasicTable, IBasicTableState } from 'app/components/BasicTable';\r\nimport { GetSelectedActions } from './SelectedRowActions/GetSelectedRowActions';\r\nimport { SelectedRowsActionRenderer } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { withSavedHistoryT } from '../../components/BasicTable/withSavedHistory';\r\nimport { withGlobalServiceGroupFilter } from 'app/components/BasicTable/withGlobalServiceGroupFilter';\r\nimport { GetFilters as getFilters } from './Filter';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { AlertContentType } from 'app/components/BasicAlert';\r\nimport AssetRenderer from 'app/components/BasicTable/CellRenderers/AssetRenderer';\r\n\r\nexport const NOTIFICATIONS_LOG_PAGE_PATH = '/emailnotifications';\r\ntype RowType = IEmailNotificationsRow;\r\nexport interface EmailNotificationsPageProps\r\n extends IBasePageProps,\r\n IListPageProps {}\r\n\r\nfunction EmailNotifications(props: EmailNotificationsPageProps) {\r\n const { t } = useTranslation();\r\n const user = useSelector(selectAuthenticatedUser);\r\n const settings = useSelector(selectglobalSettings);\r\n const scopeOfMonth = settings.GetString(\r\n AllowedSettings.DeleteEmailNotficationsMonth,\r\n );\r\n const topMessage = {\r\n type: 'info',\r\n message: t(translations.EmailNotficationsScreenWarning).replace(\r\n '{0}',\r\n scopeOfMonth,\r\n ),\r\n closable: true,\r\n } as AlertContentType;\r\n const isMainAdmin =\r\n user !== undefined && user.Roles.includes(Roles.Administrators);\r\n const columns: Column[] = React.useMemo(\r\n () => [\r\n {\r\n Header: t(translations.Timestamp) as string,\r\n accessor: 'Timestamp',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.Recipient) as string,\r\n accessor: 'RecipientName',\r\n Cell: ({ value, row }) =>\r\n row.original.Recipient !== null &&\r\n row.original.Recipient !== undefined ? (\r\n <>\r\n \r\n \r\n ) : (\r\n <>{t(translations.NA)}\r\n ),\r\n },\r\n {\r\n Header: t(translations.EmailTo) as string,\r\n accessor: 'EmailTo',\r\n },\r\n {\r\n Header: t(translations.EmailCc) as string,\r\n accessor: 'EmailCc',\r\n },\r\n {\r\n Header: t(translations.EmailBcc) as string,\r\n accessor: 'EmailBcc',\r\n },\r\n {\r\n Header: t(translations.CreatedBy) as string,\r\n accessor: 'CreatedByName',\r\n },\r\n {\r\n Header: t(translations.Subject) as string,\r\n accessor: 'Subject',\r\n },\r\n {\r\n Header: t(translations.EmailMessage) as string,\r\n accessor: 'Message',\r\n Cell: DescriptionCell({ width: 'medium' }),\r\n },\r\n {\r\n Header: t(translations.Asset) as string,\r\n accessor: 'AssetName',\r\n Cell: AssetRenderer,\r\n },\r\n {\r\n Header: t(translations.Attachment) as string,\r\n accessor: 'HasAttachment',\r\n },\r\n ],\r\n [t],\r\n );\r\n // const k = keys())\r\n const initialState: IBasicTableState = React.useMemo(\r\n () => ({\r\n sortBy: [{ id: 'Timestamp', desc: true }],\r\n }),\r\n [],\r\n );\r\n const selectedRowActions: SelectedRowsActionRenderer<\r\n IEmailNotificationsRow\r\n >[] = isMainAdmin ? GetSelectedActions({}) : [];\r\n\r\n const url = '/api/odata/v4/emailnotifications';\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\nconst TTable = withSavedHistoryT(\r\n BasicTable,\r\n '~/EmailNotifications',\r\n getFilters,\r\n);\r\n\r\nexport const EmailNotificationsPage = withGlobalServiceGroupFilter(\r\n EmailNotifications,\r\n false,\r\n);\r\n","import { SelectedRowsActionRenderer } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IEmailNotificationsRow } from '../IEmailNotificationsRow';\r\nimport * as React from 'react';\r\nimport { SelectedRowsActionIconButton } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { translations } from 'locales/translations';\r\nimport { Body } from 'app/components/Typography';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { EmailNotificationsApi } from 'api/EmailNotificationsApi';\r\n\r\nexport interface GetSelectedActionsProps {}\r\n\r\nexport function GetSelectedActions(\r\n props: GetSelectedActionsProps,\r\n): SelectedRowsActionRenderer[] {\r\n const { t } = useTranslation();\r\n const SelectedActions: SelectedRowsActionRenderer<\r\n IEmailNotificationsRow\r\n >[] = React.useMemo(\r\n () => [\r\n (rows, onRefresh) => (\r\n \r\n {t(translations.ConfirmDeleteEmailNotif_message)}\r\n \r\n }\r\n confirmButtonLabel={t(translations.OK)}\r\n cancelButtonLabel={t(translations.Cancel)}\r\n rows={rows}\r\n onRefresh={onRefresh}\r\n variantButton=\"button\"\r\n validConfirm={true}\r\n action={() =>\r\n new Promise((resolve, reject) => {\r\n const postData = rows.map(item => item.Id);\r\n // do some work on the selected rows\r\n\r\n return EmailNotificationsApi.deleteSelectedRows(postData)\r\n .then(response => {\r\n let success = t(\r\n translations.DeleteNotifications_success,\r\n ) as string;\r\n resolve({\r\n SuccessMessages: [success],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n } as IResponseType);\r\n })\r\n .catch(error => {\r\n let err = t(translations.DeleteNotifications_error) as string;\r\n reject(err);\r\n });\r\n })\r\n }\r\n />\r\n ),\r\n ],\r\n [t],\r\n );\r\n return SelectedActions;\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles';\r\n\r\nexport const styles = makeStyles(theme => ({\r\n /* Styles applied to the root element. */\r\n root: {\r\n position: 'relative',\r\n height: 32,\r\n backgroundColor: theme.palette.common.white,\r\n border: `1px solid ${theme.palette.common.grayBorders}`,\r\n gap: 4,\r\n borderRadius: 8,\r\n '&.inputSizeSmall': {\r\n gap: 0,\r\n paddingRight: 8,\r\n },\r\n 'label + &': {\r\n marginTop: '21px',\r\n },\r\n '&:hover': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.80)',\r\n // Reset on touch devices, it doesn't add specificity\r\n '@media (hover: none)': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.90)',\r\n },\r\n },\r\n '&$focused': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.90)',\r\n },\r\n '&$disabled': {\r\n backgroundColor: theme.palette.common.backgroundHover,\r\n },\r\n },\r\n /* Styles applied to the root element if the component is a descendant of `FormControl`. */\r\n formControl: {\r\n 'label + &': {\r\n marginTop: '21px',\r\n },\r\n },\r\n /* Styles applied to the root element if the component is focused. */\r\n focused: {\r\n border: `1px solid ${theme.palette.primary.textHover}`,\r\n },\r\n /* Styles applied to the root element if `disabled={true}`. */\r\n disabled: {\r\n backgroundColor: theme.palette.common.backgroundHover,\r\n },\r\n /* Styles applied to the root element if color secondary. */\r\n colorSecondary: {\r\n '&$underline:after': {\r\n borderBottomColor: theme.palette.secondary.main,\r\n },\r\n },\r\n /* Styles applied to the root element if `disableUnderline={false}`. */\r\n underline: {\r\n // '&:after': {\r\n // borderBottom: `2px solid ${theme.palette.primary.main}`,\r\n // left: 0,\r\n // bottom: 0,\r\n // // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\r\n // content: '\"\"',\r\n // position: 'absolute',\r\n // right: 0,\r\n // transform: 'scaleX(0)',\r\n // transition: theme.transitions.create('transform', {\r\n // duration: theme.transitions.duration.shorter,\r\n // easing: theme.transitions.easing.easeOut,\r\n // }),\r\n // pointerEvents: 'none', // Transparent to the hover style.\r\n // },\r\n // '&$focused:after': {\r\n // transform: 'scaleX(1)',\r\n // },\r\n // '&$error:after': {\r\n // borderBottomColor: theme.palette.error.main,\r\n // transform: 'scaleX(1)', // error is always underlined in red\r\n // },\r\n // '&:before': {\r\n // borderBottom: `1px solid ${theme.palette.primary.textHover}`,\r\n // left: 0,\r\n // bottom: 0,\r\n // // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\r\n // content: '\"\\\\00a0\"',\r\n // position: 'absolute',\r\n // right: 0,\r\n // transition: theme.transitions.create('border-bottom-color', {\r\n // duration: theme.transitions.duration.shorter,\r\n // }),\r\n // pointerEvents: 'none', // Transparent to the hover style.\r\n // },\r\n // '&:hover:not($disabled):before': {\r\n // borderBottom: `2px solid ${theme.palette.text.primary}`,\r\n // // Reset on touch devices, it doesn't add specificity\r\n // '@media (hover: none)': {\r\n // borderBottom: `1px solid ${theme.palette.primary.textHover}`,\r\n // },\r\n // },\r\n // '&$disabled:before': {\r\n // borderBottomStyle: 'dotted',\r\n // },\r\n },\r\n /* Pseudo-class applied to the root element if `error={true}`. */\r\n error: {\r\n border: `1px solid ${theme.palette.error.main}`,\r\n },\r\n /* Styles applied to the `input` element if `margin=\"dense\"`. */\r\n marginDense: {\r\n borderRadius: 8,\r\n height: 24,\r\n },\r\n /* Styles applied to the root element if `multiline={true}`. */\r\n multiline: {\r\n padding: '6px 12px',\r\n '&$marginDense': {\r\n paddingTop: 1,\r\n paddingBottom: 1,\r\n },\r\n },\r\n /* Styles applied to the root element if `fullWidth={true}`. */\r\n fullWidth: {},\r\n /* Styles applied to the `input` element. */\r\n input: {\r\n minWidth: theme.spacing(6),\r\n padding: '6px 12px',\r\n borderRadius: 8,\r\n '&:-webkit-autofill': {\r\n WebkitBoxShadow:\r\n theme.palette.type === 'light' ? null : '0 0 0 100px #266798 inset',\r\n WebkitTextFillColor: theme.palette.type === 'light' ? null : '#fff',\r\n caretColor: theme.palette.type === 'light' ? null : '#fff',\r\n },\r\n '&&.inputSizeSmall &': {\r\n padding: '6px 8px',\r\n },\r\n },\r\n /* Styles applied to the `input` element if `margin=\"dense\"`. */\r\n inputMarginDense: {\r\n paddingTop: 1,\r\n paddingBottom: 1,\r\n },\r\n /* Styles applied to the `input` element if `multiline={true}`. */\r\n inputMultiline: {\r\n padding: 0,\r\n },\r\n /* Styles applied to the `input` element if `type=\"search\"`. */\r\n inputTypeSearch: {},\r\n // inputAdornedEnd: {\r\n // padding: '6px 8px',\r\n // },\r\n}));\r\n","import {\r\n Input,\r\n InputBaseProps,\r\n InputClassKey,\r\n StandardProps,\r\n} from '@material-ui/core';\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { styles } from './styles';\r\n\r\nexport interface StandardInputProps\r\n extends StandardProps {\r\n disableUnderline?: boolean;\r\n className?: string;\r\n fullWidth?: boolean;\r\n multiline?: boolean;\r\n noBorder?: boolean;\r\n info?: string;\r\n}\r\n// export function StandardInput(\r\n// {\r\n// classes,\r\n// className,\r\n// fullWidth,\r\n// inputComponent,\r\n// multiline,\r\n// noBorder,\r\n// type,\r\n// ...rest\r\n// }: StandardInputProps,\r\n// ref: React.Ref,\r\n// ) {\r\n// const innerClasses = styles();\r\n// fullWidth = false;\r\n// inputComponent = 'input';\r\n// multiline = false;\r\n// noBorder = false;\r\n// type = 'text';\r\n\r\n// return (\r\n// \r\n// );\r\n// }\r\nexport const StandardInput = React.forwardRef<\r\n React.HTMLAttributes,\r\n StandardInputProps\r\n>(function StandardInput(props, ref) {\r\n const {\r\n disableUnderline = true,\r\n classes = styles(),\r\n className,\r\n fullWidth = false,\r\n inputComponent = 'input',\r\n multiline = false,\r\n type = 'text',\r\n ...rest\r\n } = props;\r\n return (\r\n \r\n );\r\n});\r\nexport default StandardInput;\r\n","import * as React from 'react';\r\nimport { IBasePageProps } from '../../pages/IBasePageProps';\r\nimport { useGlobalServiceGroupsFilter } from 'app/hooks/useGlobalServiceGroupsFilter';\r\n\r\n/**\r\n * Connects the saved selected global service groups filter with the element:\r\n * 1. Sets the state to show/hide the top service groups filter UI element\r\n * 2. Connects the saved selection to the prop of the wrapped element\r\n * example: export const FooPage = withGlobalServiceGroupFilter(FooPageComponent, true)\r\n * @param Component Page component that extends the IBasePageProps params interface\r\n * @param applyGlobalServiceGroupsFilter enable/disable the global service groups filter on a page\r\n * @returns component that can be passed to the router\r\n */\r\nexport function withGlobalServiceGroupFilter

    (\r\n Component: React.ComponentType

    ,\r\n applyGlobalServiceGroupsFilter: boolean,\r\n): React.FC

    {\r\n return ({ ...props }: IBasePageProps) => {\r\n const { serviceGroups } = useGlobalServiceGroupsFilter(\r\n applyGlobalServiceGroupsFilter,\r\n );\r\n\r\n if (serviceGroups === undefined && applyGlobalServiceGroupsFilter) {\r\n return <>;\r\n }\r\n return ;\r\n };\r\n}\r\n","import { IconProp } from 'app/AllIcons';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectSiteMapProvider,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { AssetsSubTabUnionArray, MainTabsUnion } from 'types/SiteMapSettings';\r\nimport * as React from 'react';\r\nimport {\r\n RowActionsMenu,\r\n RowActionsProps,\r\n} from 'app/components/BasicTable/RowActions';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface AdminActionsProps {\r\n menuTab: MainTabsUnion;\r\n icon?: IconProp;\r\n id?: string;\r\n title?: string;\r\n action?: RowActionsProps;\r\n subTab?: any;\r\n}\r\nexport function AdminActions(props: AdminActionsProps) {\r\n const { menuTab, icon, id, title, action, subTab } = props;\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const siteMapProvider = useSelector(selectSiteMapProvider);\r\n const admin =\r\n authenticatedUser !== undefined &&\r\n (authenticatedUser.Roles.includes(Roles.Administrators) ||\r\n authenticatedUser.Roles.includes(Roles.GroupAdministrators));\r\n // const handleSettingClick = React.useCallback(\r\n // (link: string) => {\r\n // dispatch(\r\n // actions.openAdminPanel({\r\n // url: link,\r\n // }),\r\n // );\r\n // },\r\n // [actions, dispatch],\r\n // );\r\n const adminSettings = React.useMemo(() => {\r\n let actions: RowActionsProps[] = [];\r\n if (admin) {\r\n if (menuTab === 'Assets' && !subTab) {\r\n AssetsSubTabUnionArray.forEach(ar => {\r\n actions = [\r\n ...actions,\r\n ...siteMapProvider.adminSettingsActions(\r\n menuTab,\r\n authenticatedUser,\r\n ar,\r\n undefined, // handleSettingClick,\r\n ),\r\n ];\r\n });\r\n } else {\r\n if (menuTab === 'Budgets' && !subTab) {\r\n return siteMapProvider.adminSettingsActions(\r\n menuTab,\r\n authenticatedUser,\r\n 'BudgetTabSetting',\r\n undefined, // handleSettingClick,\r\n );\r\n }\r\n return siteMapProvider.adminSettingsActions(\r\n menuTab,\r\n authenticatedUser,\r\n subTab,\r\n undefined, // handleSettingClick,\r\n );\r\n }\r\n }\r\n if (!!action) {\r\n actions.push(action);\r\n }\r\n return actions;\r\n }, [admin, action, menuTab, subTab, siteMapProvider, authenticatedUser]);\r\n\r\n return adminSettings.length > 0 ? (\r\n \r\n ) : null;\r\n}\r\n","/**\r\n *\r\n * UserGroupFilter\r\n *\r\n */\r\nimport { UserGroupPicker } from 'app/components/pickers/AutocompletePickers/UserGroupPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const UserGroupFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default UserGroupFilter;\r\n","/**\r\n *\r\n * ButtonLink\r\n *\r\n */\r\nimport React from 'react';\r\nimport { Link, styled } from '@material-ui/core';\r\n\r\nexport interface ButtonLinkProps {\r\n children: React.ReactNode;\r\n onClick?: React.MouseEventHandler &\r\n React.MouseEventHandler &\r\n React.MouseEventHandler;\r\n className?: string;\r\n id?: string;\r\n href?: string;\r\n color?:\r\n | 'inherit'\r\n | 'initial'\r\n | 'primary'\r\n | 'secondary'\r\n | 'textPrimary'\r\n | 'textSecondary'\r\n | 'error';\r\n}\r\n\r\n/**\r\n * Button styles as a Link\r\n * @param param0\r\n * @returns\r\n */\r\nexport default function ButtonLink(props: ButtonLinkProps) {\r\n return (\r\n \r\n );\r\n}\r\nconst StyledLink = styled(Link)(({ theme }) => ({\r\n cursor: 'pointer',\r\n}));\r\n","/**\r\n *\r\n * AssetCatGroupFilter\r\n *\r\n */\r\nimport { AssetCatGroupPicker } from 'app/components/pickers/AutocompletePickers/AssetCatGroupPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { IAssetCatGroupDto } from 'api/odata/generated/entities/IAssetCatGroupDto';\r\n\r\nexport const AssetCatGroupFilter = (props: IFilterComponentProps) => {\r\n const { t } = useTranslation();\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n if (props.readonly === true) {\r\n return <>{props.value?.Name};\r\n }\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default AssetCatGroupFilter;\r\n","/**\r\n *\r\n * CampusPickerFilter\r\n *\r\n */\r\nimport { InstitutePicker } from 'app/components/pickers/AutocompletePickers/InstitutePicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const InstituteFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n size=\"small\"\r\n ariaLabel={props.label}\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default InstituteFilter;\r\n","export interface IResponseType {\r\n SuccessMessages: string[];\r\n ErrorMessages: string[];\r\n WarningMessages: string[];\r\n}\r\nexport interface IResponseTypeWithId extends IResponseType {\r\n Id?: number;\r\n}\r\nexport interface IResponseTypeWithLink extends IResponseTypeWithId {\r\n link?: string;\r\n}\r\n\r\nexport const GetResponseMessages = (\r\n response,\r\n infoText: string,\r\n): IResponseType => {\r\n let messages: IResponseType = {\r\n SuccessMessages: [],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n if (typeof response.value === 'string') {\r\n if ((response.value = 'Ok')) {\r\n messages.SuccessMessages.push(infoText);\r\n } else {\r\n messages.ErrorMessages.push(infoText + ': ' + response.value);\r\n }\r\n } else {\r\n if (response.SuccessMessages && response.SuccessMessages.length > 0) {\r\n response.SuccessMessages.forEach(element => {\r\n messages.SuccessMessages.push(element);\r\n });\r\n }\r\n if (response.ErrorMessages && response.ErrorMessages.length > 0) {\r\n response.ErrorMessages.forEach(element => {\r\n messages.ErrorMessages.push(element);\r\n });\r\n }\r\n if (response.WarningMessages && response.WarningMessages.length > 0) {\r\n response.WarningMessages.forEach(element => {\r\n messages.WarningMessages.push(element);\r\n });\r\n }\r\n if (\r\n messages.SuccessMessages.length === 0 &&\r\n response.ErrorMessages.length === 0 &&\r\n response.WarningMessages.length === 0\r\n ) {\r\n messages.SuccessMessages = [infoText];\r\n }\r\n }\r\n return messages;\r\n};\r\n","/**\r\n *\r\n * AssetCatFilter\r\n *\r\n */\r\nimport { AssetCatPicker } from 'app/components/pickers/AutocompletePickers/AssetCatPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const AssetCatFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n <>\r\n \r\n \r\n );\r\n};\r\nexport default AssetCatFilter;\r\n","/**\r\n *\r\n * ServiceGroupFilter\r\n *\r\n */\r\n\r\nimport { ServiceGroupPicker } from 'app/components/pickers/ServiceGroupPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectIsAuthenticated } from 'app/slice/selectors';\r\n\r\nexport const ServiceGroupFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n return (\r\n \r\n );\r\n};\r\nexport default ServiceGroupFilter;\r\n","/**\r\n *\r\n * DepartmentFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DepartmentPicker } from 'app/components/pickers/AutocompletePickers/DepartmentPicker';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const DepartmentFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n size=\"small\"\r\n ariaLabel={props.label}\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default DepartmentFilter;\r\n","/**\r\n *\r\n * AssetCatPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface ProjectPickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/ProjectFilter';\r\nexport const initProjectData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function ProjectPicker(props: ProjectPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AssetPickerFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { BudgetPicker } from 'app/components/pickers/AutocompletePickers/BudgetPicker';\r\n\r\nexport const ProjectFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default ProjectFilter;\r\n","/**\r\n *\r\n * UserDisciplinePicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface UserDisciplinePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/DisciplineFilter';\r\nconst publicUrl = '/api/odata/v4/DisciplineFilter/PublicDisciplines';\r\nexport const initUserDisciplineData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function UserDisciplinePicker(props: UserDisciplinePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst loadPublicData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(publicUrl, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function UserDisciplinePublicPicker(props: UserDisciplinePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ServiceTypePicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\nimport { IApplyGlobalServiceGroupFilter } from 'types/IApplyGlobalServiceGroupFilter';\r\nimport { IServiceGroupRelated } from 'types/IServiceGroupRelated';\r\n\r\ninterface IServiceDto extends Entity, IServiceGroupRelated {}\r\n\r\nexport interface ServiceTypePickerProps\r\n extends Omit>, 'loadData'>,\r\n IApplyGlobalServiceGroupFilter {}\r\n\r\nconst url = '/api/odata/v4/ServiceTypeFilter';\r\n\r\nexport function withServiceGroupFilter(\r\n globalServiceGroupFilter: Entity[],\r\n) {\r\n return (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm === null ? undefined : searchTerm,\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n }).toString();\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n };\r\n}\r\nexport const initServiceTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,ServiceGroupId',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nexport function ServiceTypePicker(props: ServiceTypePickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const loadData = withServiceGroupFilter(globalServiceGroupFilter || []);\r\n\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * InstituteTypeFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { InstituteTypePicker } from 'app/components/pickers/AutocompletePickers/InstituteTypePicker';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const InstituteTypeFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n size=\"small\"\r\n ariaLabel={props.label}\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default InstituteTypeFilter;\r\n","/**\r\n *\r\n * InvoiceIdMultiPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompleteMultiPicker,\r\n AutocompleteMultiPickerProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface InvoiceIdProps\r\n extends Omit, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/InvoiceIdFilter';\r\nexport const initInvoiceIdData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const ids = initval.split('|').map(v => parseInt(v));\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Id asc',\r\n $filter: '(Id in (' + ids.join(',') + '))',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: ids.length,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null): Promise[]> => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Id asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function InvoiceIdMultiPicker(props: InvoiceIdProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { LabelTypes } from '../slice/types';\r\nimport Handlebars from 'handlebars';\r\n\r\n/**\r\n * Produces a URL used to print QR barcodes\r\n * @param item data record e.g. assetDetails, LocationListDto, etc.\r\n * @param type The type of the URL Template: Asset/LocationList/etc.\r\n * @param urlTemplate The URL template as configured in system settings\r\n * @returns\r\n */\r\nexport function getQrUrl(item: any, type: LabelTypes, urlTemplate: string) {\r\n if (\r\n type === 'Asset' &&\r\n (item as IGetQrURLAssetDetails).InternalCode !== undefined\r\n ) {\r\n return getAssetQrUrl(item, urlTemplate);\r\n } else {\r\n return getQrUrlH(item, urlTemplate);\r\n }\r\n}\r\n\r\ninterface IGetQrURLAssetDetails {\r\n InternalCode: string | null;\r\n}\r\n\r\nfunction getAssetQrUrl(\r\n assetDetails: IGetQrURLAssetDetails,\r\n AssetBarcodeUrlTemplate,\r\n) {\r\n if (assetDetails.InternalCode === null) {\r\n throw new Error('Asset QR: Internal code is empty');\r\n }\r\n return AssetBarcodeUrlTemplate.replace(\r\n /:internalCode/g,\r\n assetDetails.InternalCode,\r\n );\r\n}\r\n\r\n/**\r\n * Produces a URL through Handlebars engine\r\n * @param item data record\r\n * @param urlTemplate url template string\r\n * @returns URL for QR label print\r\n */\r\nfunction getQrUrlH(item: any, urlTemplate) {\r\n const template = Handlebars.compile(urlTemplate);\r\n const url = template(item);\r\n return url;\r\n}\r\n","import { ILabelTypeDto } from 'api/odata/generated/entities/ILabelTypeDto';\r\nimport { IFileResult, ILabelPrinter } from '.';\r\nimport { LabelPrinter } from '../slice/types';\r\nimport { getQrUrl } from './getQrUrl';\r\n\r\nconst generateLabel = (labelXml, assetData, AssetBarcodeUrlTemplate) => {\r\n var label = globalThis.dymo.label.framework.openLabelXml(labelXml);\r\n var objectMapping = getObjectMapping(label, AssetBarcodeUrlTemplate);\r\n Object.keys(objectMapping).forEach(function (objectName) {\r\n var writeData = objectMapping[objectName](assetData);\r\n if (objectName === 'Name') {\r\n var splittedData = writeData.split('-');\r\n writeData = splittedData[0];\r\n if (splittedData.length > 1) {\r\n writeData += '-' + splittedData[1];\r\n }\r\n }\r\n if (objectName === 'Room') {\r\n if (assetData.LocationName) writeData += ', ' + assetData.LocationName;\r\n if (assetData.SubLocationName)\r\n writeData += ', ' + assetData.SubLocationName;\r\n }\r\n console.log('writeData', writeData);\r\n label.setObjectText(objectName, writeData);\r\n });\r\n return label;\r\n};\r\nconst getObjectMapping = (label, AssetBarcodeUrlTemplate) => {\r\n var staticObjectNames = ['CompanyLogo', 'StaticText'];\r\n return label.getObjectNames().reduce(function (previousValue, currentValue) {\r\n var nameParts = currentValue.split('_');\r\n var assetPropertyName = nameParts[0];\r\n if (staticObjectNames.indexOf(assetPropertyName) >= 0) {\r\n return previousValue;\r\n }\r\n if (assetPropertyName.toLowerCase() === 'qr') {\r\n if (nameParts.length > 1 && nameParts[1].toLowerCase() === 'text') {\r\n previousValue[currentValue] = function (assetData) {\r\n return getQrUrl(assetData, 'Asset', AssetBarcodeUrlTemplate);\r\n };\r\n }\r\n } else {\r\n previousValue[currentValue] = function (assetData) {\r\n var value = getValue(assetData, currentValue);\r\n if (value === null || value === undefined) {\r\n return 'N/A';\r\n } else {\r\n return value.toString();\r\n }\r\n };\r\n }\r\n return previousValue;\r\n }, {});\r\n};\r\nfunction getValue(obj, path) {\r\n var properties = path.split(/[.[\\]]+/);\r\n while (properties.length) {\r\n var property = properties.shift();\r\n obj = obj[property];\r\n if (obj === null || obj === undefined) {\r\n return null;\r\n }\r\n }\r\n return obj;\r\n}\r\n\r\nexport const Dymo: ILabelPrinter = {\r\n getPrinters: () => {\r\n const dymoLabelPrinterOption = printer => ({\r\n Id: printer.name,\r\n Name: `Dymo - ${printer.name}`,\r\n Type: 'Dymo',\r\n Device: printer,\r\n });\r\n return initDymoFramework()\r\n .then(p => {\r\n return globalThis.dymo.label.framework.getLabelWriterPrintersAsync();\r\n })\r\n .then(dymoPrinters => {\r\n const result = dymoPrinters.map(dymoLabelPrinterOption);\r\n return result;\r\n });\r\n },\r\n\r\n preview: (\r\n printer: LabelPrinter,\r\n labelType: ILabelTypeDto,\r\n data: any[],\r\n options,\r\n ) => {\r\n return new Promise((resolve, reject) => {\r\n const result: IFileResult[] = [];\r\n try {\r\n for (const assetData of data) {\r\n var label = generateLabel(\r\n labelType.Xml,\r\n assetData,\r\n options.AssetBarcodeUrlTemplate,\r\n );\r\n var labelPreview = 'data:image/png;base64,' + label.render();\r\n var blob = dataURItoBlob(labelPreview);\r\n result.push({\r\n fileName: `${assetData.Name}.png`,\r\n content: blob,\r\n });\r\n }\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n },\r\n download: (\r\n printer: LabelPrinter,\r\n labelType: ILabelTypeDto,\r\n data: any[],\r\n options,\r\n ) => {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const result: any[] = [];\r\n for (const assetData of data) {\r\n var label = generateLabel(\r\n labelType.Xml,\r\n assetData,\r\n options.AssetBarcodeUrlTemplate,\r\n );\r\n var blob = new Blob([label.getLabelXml()], { type: 'text/xml' });\r\n\r\n result.push({\r\n fileName: `${assetData.Name}.label`,\r\n content: blob,\r\n });\r\n }\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n },\r\n print: (\r\n printer: LabelPrinter,\r\n labelType: ILabelTypeDto,\r\n data: any[],\r\n options,\r\n ) => {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n var printParams = globalThis.dymo.label.framework.createLabelWriterPrintParamsXml(\r\n {\r\n twinTurboRoll:\r\n globalThis.dymo.label.framework.TwinTurboRoll[\r\n labelType.twinTurboRoll ?? 'Left'\r\n ],\r\n },\r\n );\r\n\r\n for (var index = 0; index < data.length; index++) {\r\n var assetData = data[index];\r\n var label = generateLabel(\r\n labelType.Xml,\r\n assetData,\r\n options.AssetBarcodeUrlTemplate,\r\n );\r\n label.print(printer.Id, printParams);\r\n }\r\n resolve(null);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n },\r\n};\r\nconst initDymoFramework: () => Promise = () => {\r\n return new Promise((resolve, reject) => {\r\n const framework = globalThis.dymo.label.framework;\r\n\r\n framework.init(p => {\r\n if (!!p.errorDetails) {\r\n reject(p.errorDetails);\r\n } else {\r\n resolve(framework);\r\n }\r\n });\r\n });\r\n};\r\n\r\nfunction dataURItoBlob(dataURI) {\r\n // convert base64 to raw binary data held in a string\r\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\r\n var byteString = atob(dataURI.split(',')[1]);\r\n\r\n // separate out the mime component\r\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\r\n\r\n // write the bytes of the string to an ArrayBuffer\r\n var ab = new ArrayBuffer(byteString.length);\r\n\r\n // create a view into the buffer\r\n var ia = new Uint8Array(ab);\r\n\r\n // set the bytes of the buffer to the correct values\r\n for (var i = 0; i < byteString.length; i++) {\r\n ia[i] = byteString.charCodeAt(i);\r\n }\r\n\r\n // write the ArrayBuffer to a blob, and you're done\r\n var blob = new Blob([ab], { type: mimeString });\r\n return blob;\r\n}\r\n","import { ILabelTypeDto } from 'api/odata/generated/entities/ILabelTypeDto';\r\nimport Handlebars from 'handlebars';\r\nimport { ILabelPrinter } from '.';\r\nimport { LabelPrinter } from '../slice/types';\r\n\r\nHandlebars.registerHelper('padStart', (context, maxLength, fillString) => {\r\n return String(context).padStart(maxLength, fillString);\r\n});\r\nHandlebars.registerHelper('padEnd', (context, maxLength, fillString) => {\r\n return String(context).padEnd(maxLength, fillString);\r\n});\r\n\r\nexport const zebra: ILabelPrinter = {\r\n getPrinters: () => {\r\n return new Promise((resolve, reject) => {\r\n globalThis.BrowserPrint.getLocalDevices(\r\n device_list => {\r\n resolve(\r\n device_list.printer.map(p => {\r\n var r: LabelPrinter = {\r\n Id: p.uid,\r\n Type: 'Zebra',\r\n Name: `Zebra - ${p.name}`,\r\n Device: p,\r\n };\r\n return r;\r\n }),\r\n );\r\n },\r\n reason => {\r\n const res =\r\n reason.trim() !== ''\r\n ? reason\r\n : 'Zebra Label Framework Plugin is not installed';\r\n reject(res);\r\n },\r\n );\r\n });\r\n },\r\n print: (printer, labelType, data, options) => {\r\n const t = Handlebars.compile(labelType.Xml);\r\n const labels = data.map(item => t(item));\r\n const zebra = new globalThis.Zebra.Printer(printer.Device);\r\n globalThis.Zebra.stopWatching(printer.Device);\r\n return Promise.all(\r\n labels.map(\r\n item =>\r\n new Promise((resolve, reject) => {\r\n console.debug('Zebra Printer - printing', item, zebra);\r\n\r\n zebra.send(\r\n item,\r\n function (success) {\r\n resolve(success);\r\n },\r\n function (error) {\r\n console.error('Error:' + error);\r\n reject(error);\r\n },\r\n );\r\n }),\r\n ),\r\n );\r\n },\r\n preview: function (\r\n printer: LabelPrinter,\r\n labelType: ILabelTypeDto,\r\n data: any[],\r\n options: {\r\n AssetBarcodeUrlTemplate: string;\r\n RoomBarcodeUrlTemplate: string;\r\n LocationBarcodeUrlTemplate: string;\r\n SubLocationBarcodeUrlTemplate: string;\r\n ConsumableTypeBarcodeUrlTemplate: string;\r\n },\r\n ): Promise {\r\n throw new Error('Function not implemented.');\r\n },\r\n download: function (\r\n printer: LabelPrinter,\r\n labelType: ILabelTypeDto,\r\n data: any[],\r\n options: {\r\n RoomBarcodeUrlTemplate: string;\r\n AssetBarcodeUrlTemplate: string;\r\n LocationBarcodeUrlTemplate: string;\r\n SubLocationBarcodeUrlTemplate: string;\r\n ConsumableTypeBarcodeUrlTemplate: string;\r\n },\r\n ): Promise {\r\n throw new Error('Function not implemented.');\r\n },\r\n};\r\n","import { ILabelTypeDto } from 'api/odata/generated/entities/ILabelTypeDto';\r\nimport { LabelPrinter } from '../slice/types';\r\nimport { Dymo as DymoPrinter } from './Dymo';\r\nimport { zebra as ZebraPrinter } from './Zebra';\r\n\r\nexport type TGetPrinter = () => Promise>;\r\n\r\nexport type TPrint = (\r\n printer: LabelPrinter,\r\n labelType: ILabelTypeDto,\r\n data: Array,\r\n options: {\r\n AssetBarcodeUrlTemplate: string;\r\n RoomBarcodeUrlTemplate: string;\r\n LocationBarcodeUrlTemplate: string;\r\n SubLocationBarcodeUrlTemplate: string;\r\n SamplePlateBarcodeUrlTemplate: string;\r\n ConsumableTypeBarcodeUrlTemplate: string;\r\n },\r\n) => Promise;\r\nexport interface IFileResult {\r\n fileName: string;\r\n content: any;\r\n}\r\nexport type ILabelPrinter = {\r\n getPrinters: TGetPrinter;\r\n print: TPrint;\r\n preview: TPrint;\r\n download: TPrint;\r\n};\r\n\r\nexport const Dymo = DymoPrinter;\r\nexport const Zebra = ZebraPrinter;\r\nexport const getPrinterInterface = (printer: LabelPrinter) => {\r\n switch (printer.Type) {\r\n case 'Dymo':\r\n return Dymo;\r\n case 'Zebra':\r\n return Zebra;\r\n }\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, select, takeLeading, takeLatest } from 'redux-saga/effects';\r\nimport { labelPrintActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\n\r\nimport { selectLabelPrint } from './selectors';\r\nimport {\r\n IPrintAssetLabelArgs,\r\n LabelPrinter,\r\n LabelPrintState,\r\n OpenPrintDialogPayload,\r\n} from './types';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Dymo, getPrinterInterface, TPrint, Zebra } from '../Printers';\r\nimport { selectAppSettings, selectglobalSettings } from 'app/slice/selectors';\r\nimport { getQrUrl } from '../Printers/getQrUrl';\r\nimport fileDownload from 'js-file-download';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { ILabelTypeDto } from 'api/odata/generated/entities/ILabelTypeDto';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nfunction* doGetPrinters(action: PayloadAction) {\r\n let printers: Array = [];\r\n const systemSettings = yield select(selectglobalSettings);\r\n if (systemSettings.GetBooleanByKey(AllowedSettings.DymoPrinterSupported)) {\r\n try {\r\n const dymo_printers = yield call(Dymo.getPrinters);\r\n printers = [...printers, ...dymo_printers];\r\n } catch (error: unknown) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: String(error),\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.getPrinters_Error(Error));\r\n }\r\n }\r\n if (systemSettings.GetBooleanByKey(AllowedSettings.ZebraPrinterSupported)) {\r\n try {\r\n const zebra_printers = yield call(Zebra.getPrinters);\r\n printers = [...printers, ...zebra_printers];\r\n } catch (error: unknown) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: String(error),\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.getPrinters_Error(Error));\r\n }\r\n }\r\n\r\n const serializablePayload = JSON.parse(JSON.stringify(printers));\r\n yield put(actions.getPrinters_Success(serializablePayload));\r\n}\r\nfunction* doGetLabelTypes(action: PayloadAction) {\r\n try {\r\n var filter = new Condition(\r\n 'Type',\r\n ODataOperators.Equals,\r\n action.payload.type,\r\n );\r\n\r\n const labelTypes = yield call(httpClient.get, '/api/odata/v4/labeltypes', {\r\n $filter: filter.toString(),\r\n });\r\n yield put(actions.getLabelTypes_Success(labelTypes.value));\r\n } catch (error) {\r\n yield put(actions.getLabelTypes_Error(error));\r\n }\r\n}\r\nasync function loadObjects(action: PayloadAction) {\r\n switch (action.payload.type) {\r\n case 'Asset':\r\n const assetResponse = await httpClient.get(`/api/odata/v4/AssetDetails`, {\r\n $filter: `Id in (${action.payload.ids.join(',')})`,\r\n });\r\n return assetResponse.value;\r\n /* const assets = await Promise.allSettled(\r\n action.payload.ids.map(assetId =>\r\n httpClient.get(\r\n `/api/odata/v4/AssetDetails(${assetId})?serviceId=0`,\r\n ),\r\n ),\r\n );\r\n return assets; */\r\n case 'Room':\r\n const roomResponse = await httpClient.get(\r\n `/api/odata/v4/LocationsBuilding`,\r\n {\r\n $filter: `Id in (${action.payload.ids.join(',')})`,\r\n },\r\n );\r\n return roomResponse.value;\r\n case 'LocationList':\r\n const locationlistsResponse = await httpClient.get(\r\n `/api/odata/v4/LocationList`,\r\n {\r\n $filter: `Id in (${action.payload.ids.join(',')})`,\r\n },\r\n );\r\n return locationlistsResponse.value;\r\n case 'SubLocationList':\r\n const sublocationlistsResponse = await httpClient.get(\r\n `/api/odata/v4/SubLocationList`,\r\n {\r\n $filter: `Id in (${action.payload.ids.join(',')})`,\r\n },\r\n );\r\n return sublocationlistsResponse.value;\r\n case 'SamplePlate':\r\n const Ids = action.payload.ids.map(id => \"'\" + id + \"'\");\r\n const samplePlatesResponse = await httpClient.get(\r\n `/api/odata/v4/SamplePlates`,\r\n {\r\n $filter: `Id in (${Ids.join(',')})`,\r\n },\r\n );\r\n return samplePlatesResponse.value;\r\n case 'Consumable':\r\n const consumableTypesResponse = await httpClient.get(\r\n `/api/odata/v4/AssetDetails`,\r\n {\r\n $filter: `Id in (${action.payload.ids.join(',')})`,\r\n },\r\n );\r\n return consumableTypesResponse.value;\r\n default:\r\n throw new Error('loadObjects NotImplemented');\r\n }\r\n}\r\nfunction* doGetObjects(action: PayloadAction) {\r\n try {\r\n const responses = yield call(loadObjects, action);\r\n const assetDetails = responses.map(response => response);\r\n yield put(actions.getAssetDetails_Success(assetDetails));\r\n } catch (error) {\r\n yield put(actions.getAssetDetails_Failure(error));\r\n }\r\n}\r\nfunction* doOpen(action: PayloadAction) {\r\n const state: LabelPrintState = yield select(selectLabelPrint);\r\n if (state.printers.value === undefined) {\r\n yield put(actions.getPrinters());\r\n }\r\n if (state.data.value === undefined) {\r\n yield put(actions.getAssetDetails(action.payload));\r\n }\r\n if (state.labelTypes.value === undefined) {\r\n yield put(actions.getLabelTypes(action.payload));\r\n }\r\n}\r\n\r\nfunction* doPrint(action: PayloadAction) {\r\n if (!action.payload.printer) {\r\n yield put(actions.getAssetDetails_Failure(`Printer not selected.`));\r\n return;\r\n }\r\n\r\n const systemSettings = yield select(selectglobalSettings);\r\n\r\n switch (action.payload.printer.Type) {\r\n case 'Dymo':\r\n if (\r\n !systemSettings.GetBooleanByKey(AllowedSettings.DymoPrinterSupported)\r\n ) {\r\n const msg = i18next.t(translations.DymoPrinterIsNotSupported);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: msg,\r\n }),\r\n );\r\n yield put(actions.print_Error(msg));\r\n return;\r\n }\r\n break;\r\n case 'Zebra':\r\n if (\r\n !systemSettings.GetBooleanByKey(AllowedSettings.ZebraPrinterSupported)\r\n ) {\r\n const msg = i18next.t(translations.ZebraPrinterIsNotSupported);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: msg,\r\n }),\r\n );\r\n yield put(actions.print_Error(msg));\r\n return;\r\n }\r\n break;\r\n }\r\n\r\n const printerInterface = getPrinterInterface(action.payload.printer);\r\n if (printerInterface === undefined) {\r\n yield put(\r\n actions.getAssetDetails_Failure(\r\n `Printer ${action.payload.printer.Type} not supported.`,\r\n ),\r\n );\r\n return;\r\n }\r\n const settings: AppSettings = yield select(selectAppSettings);\r\n const state: LabelPrintState = yield select(selectLabelPrint);\r\n const type = state.type;\r\n const AssetBarcodeUrlTemplate =\r\n type === 'Asset'\r\n ? settings.AssetBarcodeUrlTemplate\r\n : type === 'Room'\r\n ? settings.RoomBarcodeUrlTemplate\r\n : type === 'LocationList'\r\n ? settings.LocationBarcodeUrlTemplate\r\n : type === 'SubLocationList'\r\n ? settings.SubLocationBarcodeUrlTemplate\r\n : type === 'SamplePlate'\r\n ? settings.SamplePlateBarcodeUrlTemplate\r\n : type === 'Consumable'\r\n ? settings.ConsumableTypeBarcodeUrlTemplate\r\n : null;\r\n try {\r\n if (type === undefined) {\r\n throw new Error('Label type is undefined');\r\n }\r\n if (AssetBarcodeUrlTemplate === null) {\r\n throw new Error(`Unsupported label type \"${type}\"`);\r\n }\r\n const data = action.payload.assetDetails.map(assetDetails => ({\r\n ...assetDetails,\r\n ...{ QR: getQrUrl(assetDetails, type, AssetBarcodeUrlTemplate) },\r\n }));\r\n const printAction: TPrint = printerInterface[action.payload.action];\r\n const result = yield call(\r\n printAction,\r\n action.payload.printer,\r\n action.payload.template,\r\n data,\r\n {\r\n AssetBarcodeUrlTemplate: settings.AssetBarcodeUrlTemplate,\r\n RoomBarcodeUrlTemplate: settings.RoomBarcodeUrlTemplate,\r\n LocationBarcodeUrlTemplate: settings.LocationBarcodeUrlTemplate,\r\n SubLocationBarcodeUrlTemplate: settings.SubLocationBarcodeUrlTemplate,\r\n SamplePlateBarcodeUrlTemplate: settings.SamplePlateBarcodeUrlTemplate,\r\n ConsumableTypeBarcodeUrlTemplate:\r\n settings.ConsumableTypeBarcodeUrlTemplate,\r\n },\r\n );\r\n switch (action.payload.action) {\r\n case 'print':\r\n break;\r\n case 'download':\r\n case 'preview':\r\n for (const item of result) {\r\n yield call(fileDownload, item, 'import-result.xlsx');\r\n }\r\n }\r\n yield put(actions.print_Success(null));\r\n } catch (error) {\r\n yield put(actions.print_Error(error));\r\n }\r\n}\r\n\r\nexport function* labelPrintSaga() {\r\n yield takeLeading(actions.getPrinters.type, doGetPrinters);\r\n yield takeLeading(actions.getLabelTypes.type, doGetLabelTypes);\r\n yield takeLatest(actions.getAssetDetails.type, doGetObjects);\r\n yield takeLeading(actions.open.type, doOpen);\r\n yield takeLeading(actions.print.type, doPrint);\r\n //yield takeLeading(actions.preview.type, doPrint);\r\n //yield takeLeading(actions.download.type, doPrint);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IAssetDetailsDto } from 'api/odata/generated/entities/IAssetDetailsDto';\r\nimport { ILabelTypeDto } from 'api/odata/generated/entities/ILabelTypeDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { labelPrintSaga } from './saga';\r\nimport {\r\n LabelPrintState,\r\n LabelPrinter,\r\n IPrintAssetLabelArgs,\r\n AsyncState,\r\n OpenPrintDialogPayload,\r\n} from './types';\r\n\r\nexport const initialState: LabelPrintState = {\r\n ids: [],\r\n labelTypes: {},\r\n printers: {},\r\n printState: {},\r\n data: {},\r\n open: false,\r\n};\r\n\r\nfunction init(state: AsyncState) {\r\n state.status = 'pending';\r\n state.error = undefined;\r\n state.value = undefined;\r\n}\r\nfunction resolve(state: AsyncState, value: T) {\r\n state.status = 'resolved';\r\n state.error = undefined;\r\n state.value = value;\r\n}\r\nfunction reject(state: AsyncState, error: unknown) {\r\n state.status = 'rejected';\r\n state.value = undefined;\r\n state.error = String(error);\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'labelPrint',\r\n initialState,\r\n reducers: {\r\n getPrinters(state, action: PayloadAction) {\r\n init(state.printers);\r\n },\r\n getPrinters_Success(state, action: PayloadAction>) {\r\n resolve(state.printers, action.payload);\r\n },\r\n getPrinters_Error(state, action: PayloadAction) {\r\n reject(state.printers, action.payload);\r\n },\r\n\r\n getLabelTypes(state, action: PayloadAction) {\r\n init(state.labelTypes);\r\n },\r\n getLabelTypes_Success(state, action: PayloadAction>) {\r\n resolve(state.labelTypes, action.payload);\r\n },\r\n getLabelTypes_Error(state, action: PayloadAction) {\r\n reject(state.labelTypes, action.payload);\r\n },\r\n\r\n getAssetDetails(state, action: PayloadAction) {\r\n init(state.data);\r\n },\r\n getAssetDetails_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n resolve(state.data, action.payload);\r\n },\r\n getAssetDetails_Failure(state, action: PayloadAction) {\r\n reject(state.data, action.payload);\r\n },\r\n\r\n open(state, action: PayloadAction) {\r\n state.open = true;\r\n state.ids = action.payload.ids;\r\n state.type = action.payload.type;\r\n state.data = {};\r\n },\r\n closeAssetLabelPrintDialog(state, action: PayloadAction) {\r\n state.open = false;\r\n state.ids = [];\r\n state.data = {};\r\n state.printState = {};\r\n },\r\n\r\n print(state, action: PayloadAction) {\r\n init(state.printState);\r\n state.selectedPrinter = action.payload.printer ?? null;\r\n state.selectedTemplate = action.payload.template ?? null;\r\n },\r\n print_Success(state, action: PayloadAction) {\r\n state.data = {};\r\n state.open = false;\r\n resolve(state.printState, null);\r\n },\r\n print_Error(state, action: PayloadAction) {\r\n reject(state.printState, action.payload);\r\n },\r\n\r\n download(state, action: PayloadAction) {\r\n init(state.printState);\r\n state.selectedPrinter = action.payload.printer ?? null;\r\n state.selectedTemplate = action.payload.template ?? null;\r\n },\r\n download_Success(state, action: PayloadAction) {\r\n state.data = {};\r\n state.open = false;\r\n resolve(state.printState, null);\r\n },\r\n download_Error(state, action: PayloadAction) {\r\n reject(state.printState, action.payload);\r\n },\r\n\r\n preview(state, action: PayloadAction) {\r\n init(state.printState);\r\n state.selectedPrinter = action.payload.printer ?? null;\r\n state.selectedTemplate = action.payload.template ?? null;\r\n },\r\n preview_Success(state, action: PayloadAction) {\r\n state.data = {};\r\n state.open = false;\r\n resolve(state.printState, null);\r\n },\r\n preview_Error(state, action: PayloadAction) {\r\n reject(state.printState, action.payload);\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: labelPrintActions } = slice;\r\n\r\nexport const useLabelPrintSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: labelPrintSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useLabelPrintSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { ITrainingLevelFilterDto } from 'api/odata/generated/entities/ITrainingLevelFilterDto';\r\nimport {\r\n Condition,\r\n ODataOperators,\r\n quoteODataValue,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface TrainingLevelPickerProps\r\n extends Omit, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/TrainingLevelFilter';\r\nexport const initTrainingLevelData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url: url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'ServiceGroupId',\r\n 'ExpiredDays',\r\n 'MustOrderEveryDays',\r\n 'MustUseEveryDays',\r\n 'LevelEquipments',\r\n 'UPGroups',\r\n 'UPEquipments',\r\n ],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n isOptionalServiceGroup: true,\r\n });\r\nexport const loadTrainingLevels = loadData;\r\nexport function TrainingLevelPicker(props: TrainingLevelPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n globalServiceGroupFilter || [],\r\n );\r\n return (\r\n \r\n );\r\n}\r\nexport function TrainingLevelFilter(\r\n equipments: IServiceFilterDto[],\r\n trainingLevelPermissionsEnabled,\r\n userPermissionsEnabled,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (!!equipments && equipments.length > 0) {\r\n if (trainingLevelPermissionsEnabled) {\r\n predicates.push(\r\n equipments\r\n .map(eq => {\r\n if (eq.UseServiceGroupTrainingLevels) {\r\n return `(ServiceGroupId eq null or ServiceGroupId eq ${quoteODataValue(\r\n eq.ServiceGroupId,\r\n )})`;\r\n } else {\r\n return `LevelEquipments/any(g: g eq ${quoteODataValue(eq.Id)})`;\r\n }\r\n })\r\n .join(' or '),\r\n );\r\n } else if (userPermissionsEnabled) {\r\n // noop - clients could not select training level that was not part of user or group permissions on selected equipment they needed on uchicago\r\n // should be properly resolved in https://prog4biz.atlassian.net/browse/BKT-8190\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n } else {\r\n return [];\r\n }\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { AutocompleteMultiPickerExProps } from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { AssetsPicker } from '../../MultiSelectPickers/AssetsPicker';\r\n\r\nexport interface AssetMultiPickerProps\r\n extends AutocompleteMultiPickerExProps {}\r\n\r\nconst url = '/api/odata/v4/AssetNames';\r\n\r\nexport const initAssetMultiData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return Promise.resolve([] as IAssetDto[]);\r\n }\r\n const ids = initval.split('|').map(v => parseInt(v));\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n } = {\r\n $orderby: 'Id asc',\r\n $filter: '(Id in (' + ids.join(',') + '))',\r\n $top: ids.length,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as IAssetDto[]);\r\n};\r\n\r\nexport const AssetMultiPicker = (props: AssetMultiPickerProps) => {\r\n return ;\r\n};\r\n","import { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { AssetsPicker } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const AssetMultiFilter = (props: IFilterComponentProps) => {\r\n const {\r\n onChange,\r\n value,\r\n additionalItem,\r\n customData,\r\n withoutServiceGroups,\r\n urlType,\r\n dateTimeClear,\r\n label,\r\n labelFunc,\r\n onOpen,\r\n onClose,\r\n open,\r\n fullWidth,\r\n ...other\r\n } = props;\r\n const handleChange = (value: Entity[]) => {\r\n onChange(value);\r\n };\r\n return (\r\n \r\n );\r\n};\r\nexport const AssetWorkOrderMultiFilter = (props: IFilterComponentProps) => {\r\n const {\r\n onChange,\r\n value,\r\n additionalItem,\r\n customData,\r\n withoutServiceGroups,\r\n urlType,\r\n dateTimeClear,\r\n label,\r\n labelFunc,\r\n onOpen,\r\n onClose,\r\n open,\r\n ...other\r\n } = props;\r\n const handleChange = (value: Entity[]) => {\r\n onChange(value);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * RoomPickerFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { LocationPicker } from 'app/components/pickers/AutocompletePickers/LocationPicker';\r\n\r\nexport const LocationPickerFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default LocationPickerFilter;\r\n","/**\r\n *\r\n * BookitlabLogo\r\n *\r\n */\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { messages } from './messages';\r\n\r\nexport interface BookitlabLogoProps {\r\n width?: number | string;\r\n height?: number | string;\r\n vectorSmallOverlapColor?: string;\r\n vaectorBigCircleColor?: string;\r\n vectorSmallCircleColor?: string;\r\n vectorBigOverlapColor?: string;\r\n vectorBackColor?: string;\r\n size?: '123x34' | '80x24';\r\n}\r\n\r\nexport const BookitlabLogo = React.memo(function BookitlabLogo(\r\n props: BookitlabLogoProps,\r\n) {\r\n const { width, height, size } = props;\r\n const { t } = useTranslation();\r\n\r\n return size === '80x24' ? (\r\n \r\n {t(messages.bookitlab())}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n {t(messages.bookitlab())}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nexport const BookitlabLoginLogo = React.memo(function BookitlabLoginLogo(\r\n props: BookitlabLogoProps,\r\n) {\r\n const { width, height } = props;\r\n const { t } = useTranslation();\r\n return (\r\n \r\n {t(messages.bookitlab())}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","/**\r\n *\r\n * CampusPickerFilter\r\n *\r\n */\r\nimport { CampusPicker } from 'app/components/pickers/AutocompletePickers/CampusPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const CampusPickerFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default CampusPickerFilter;\r\n","import { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { downloadFile } from 'utils/url-utils';\r\nimport { SelectedRowsActionIconButton } from '../BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { Identifiable } from 'types/common';\r\n\r\nexport interface ExportQRCodesButtonProps {\r\n url: string;\r\n rows: Array>;\r\n toggleAllRowsSelected?: (value?: boolean) => void;\r\n}\r\n\r\nexport function ExportQRCodesButton({\r\n url,\r\n rows,\r\n toggleAllRowsSelected,\r\n}: ExportQRCodesButtonProps) {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n new Promise(async resolve => {\r\n let ids = rows.map(row => row.Id).join(',');\r\n let path = url + `?id=${ids}`;\r\n try {\r\n await downloadFile({ path: path });\r\n resolve({\r\n ErrorMessages: [],\r\n SuccessMessages: [],\r\n WarningMessages: [],\r\n });\r\n } catch (err) {\r\n console.debug(err);\r\n resolve({\r\n ErrorMessages: [\r\n 'Some thing went wrong, please check the Name or Qr Code of the Asset!',\r\n ],\r\n SuccessMessages: [],\r\n WarningMessages: [],\r\n });\r\n }\r\n })\r\n }\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * AreasPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface AreasPickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/AreasFilter';\r\nexport const initAreasData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n searchTerm: string | null,\r\n predicates?: (string | Condition)[],\r\n) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null || predicates !== undefined) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: predicates !== undefined ? predicates : [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm !== null ? searchTerm : undefined,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\n\r\nexport function AreasPicker(props: AreasPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * auto generated interface for Default.EmailType\r\n *\r\n */\r\n\r\nexport enum EmailType {\r\n Invoice = 0,\r\n Request = 1,\r\n Reservation = 2,\r\n User = 3,\r\n PaymentLetter = 4,\r\n Budget = 5,\r\n BudgetComment = 6,\r\n OfflineService = 7,\r\n Eln = 8,\r\n Alert = 9,\r\n DataStore = 10,\r\n SAP = 11,\r\n Equipment = 12,\r\n Asset = 13,\r\n TrainingSession = 14,\r\n ServiceGroup = 15,\r\n BudgetExpirement = 16,\r\n InstrumentNotifications = 17,\r\n WorkFlowBooking = 18,\r\n Cage = 19,\r\n InquiryAlert = 20,\r\n UserGroup = 21,\r\n LoanDesk = 22,\r\n Training = 23,\r\n RequestComment = 24,\r\n DownTime = 25,\r\n ExternalBillingError = 26,\r\n GenerateInvoice = 27,\r\n InstituteQuarter = 28,\r\n RequestMilestones = 29,\r\n Custom = 30,\r\n Subscription = 31,\r\n Article = 31,\r\n}\r\nexport type EmailTypeUnion = keyof typeof EmailType;\r\nexport const EmailTypeUnionArray: Array = [\r\n 'Invoice',\r\n 'Request',\r\n 'Reservation',\r\n 'User',\r\n 'PaymentLetter',\r\n 'Budget',\r\n 'BudgetComment',\r\n 'OfflineService',\r\n 'Eln',\r\n 'Alert',\r\n 'DataStore',\r\n 'SAP',\r\n 'Equipment',\r\n 'Asset',\r\n 'TrainingSession',\r\n 'ServiceGroup',\r\n 'BudgetExpirement',\r\n 'InstrumentNotifications',\r\n 'WorkFlowBooking',\r\n 'Cage',\r\n 'InquiryAlert',\r\n 'UserGroup',\r\n 'LoanDesk',\r\n 'Training',\r\n 'RequestComment',\r\n 'DownTime',\r\n 'ExternalBillingError',\r\n 'GenerateInvoice',\r\n 'InstituteQuarter',\r\n 'RequestMilestones',\r\n 'Custom',\r\n 'Subscription',\r\n 'Article',\r\n];\r\n","import { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { ToggleButton, ToggleButtonProps } from '@material-ui/lab';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport * as React from 'react';\r\nimport clsx from 'clsx';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { ButtonsVariant } from '../Button';\r\nimport { capitalize } from 'lodash';\r\n\r\nexport interface BaseToggleButtonProps\r\n extends Omit {\r\n disabled?: boolean;\r\n children?: React.ReactNode;\r\n processing?: boolean;\r\n variant?: ButtonsVariant;\r\n fullWidth?: boolean;\r\n component?: any;\r\n to?: string;\r\n target?: string;\r\n mainIcon?: IconProp;\r\n startIcon?: IconProp;\r\n endIcon?: IconProp;\r\n separated?: boolean;\r\n}\r\n\r\nexport const BaseToggleButton = React.forwardRef<\r\n HTMLButtonElement,\r\n BaseToggleButtonProps\r\n>(function BaseToggleButton(\r\n {\r\n children,\r\n disabled,\r\n processing,\r\n size,\r\n variant,\r\n component,\r\n title,\r\n to,\r\n mainIcon,\r\n fullWidth,\r\n separated,\r\n startIcon,\r\n endIcon,\r\n ...props\r\n },\r\n ref,\r\n) {\r\n const handleClick = (e: any) => {\r\n if (props.onClick) {\r\n props.onClick(e);\r\n }\r\n };\r\n const WithTitle = React.forwardRef(\r\n (\r\n {\r\n children,\r\n title,\r\n }: { children: React.ReactNode; title: React.ReactChild },\r\n ref,\r\n ) => (\r\n \r\n {children}\r\n \r\n ),\r\n );\r\n const startIconComponent = startIcon && (\r\n \r\n \r\n \r\n );\r\n const endIconComponent = endIcon && (\r\n \r\n \r\n \r\n );\r\n return title ? (\r\n \r\n {\r\n handleClick(event);\r\n }}\r\n className={props.className}\r\n {...props}\r\n >\r\n {mainIcon !== undefined ? (\r\n \r\n \r\n \r\n ) : !!startIcon || !!endIcon ? (\r\n \r\n {!!startIconComponent && startIconComponent}\r\n {children}\r\n {!!endIconComponent && endIconComponent}\r\n \r\n ) : (\r\n {children}\r\n )}\r\n \r\n \r\n ) : (\r\n {\r\n handleClick(event);\r\n }}\r\n className={props.className}\r\n {...props}\r\n >\r\n {mainIcon !== undefined ? (\r\n \r\n \r\n \r\n ) : !!startIcon || !!endIcon ? (\r\n \r\n {!!startIconComponent && startIconComponent}\r\n {children}\r\n {!!endIconComponent && endIconComponent}\r\n \r\n ) : (\r\n {children}\r\n )}\r\n \r\n );\r\n});\r\n","import { ToggleButtonGroup, ToggleButtonGroupProps } from '@material-ui/lab';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { EntityType } from 'types/common';\r\nimport clsx from 'clsx';\r\nimport { FormHelperText } from '@material-ui/core';\r\nimport { BaseOptionsPicker } from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { IsEntityType } from 'app/components/BasicTable/BasicFilter/AppliedFilterComponent';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { ButtonsVariant } from '../Button';\r\nimport { BaseToggleButton } from '../BaseToggleButton';\r\nimport { capitalize } from 'lodash';\r\n\r\nexport interface ToggleEntityType extends EntityType {\r\n icon?: IconProp;\r\n title?: string;\r\n disabled?: boolean;\r\n startIcon?: IconProp;\r\n endIcon?: IconProp;\r\n}\r\nexport interface BaseToggleButtonGroupProps\r\n extends Omit {\r\n variant?: ButtonsVariant;\r\n options: Array;\r\n otherOptions?: Array;\r\n value: T | null;\r\n error?: boolean;\r\n helperText?: string;\r\n label?: string;\r\n onChange: (value: T | null) => void;\r\n fullWidth?: boolean;\r\n compact?: boolean;\r\n separated?: boolean;\r\n name?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nfunction BaseToggleButtonGroupInner(\r\n props: BaseToggleButtonGroupProps,\r\n ref: React.ForwardedRef,\r\n) {\r\n const {\r\n variant = 'ghost',\r\n size = 'medium',\r\n options,\r\n otherOptions,\r\n value,\r\n orientation = 'horizontal',\r\n error,\r\n helperText,\r\n onChange,\r\n fullWidth,\r\n compact,\r\n separated = true,\r\n exclusive,\r\n name,\r\n label,\r\n disabled,\r\n ...other\r\n } = props;\r\n const { t } = useTranslation();\r\n const [toggleValue, setToggleValue] = React.useState(value);\r\n React.useEffect(() => {\r\n setToggleValue(value);\r\n }, [value]);\r\n const handleOtherChange = React.useCallback(\r\n (newValue: T | null) => {\r\n if (newValue?.Id !== toggleValue?.Id) {\r\n setToggleValue(newValue);\r\n onChange(newValue);\r\n }\r\n },\r\n [onChange, toggleValue?.Id],\r\n );\r\n\r\n const handleToggleValue = React.useCallback(\r\n (event, newViewType: T) => {\r\n if (IsEntityType(event)) {\r\n handleOtherChange(event as T);\r\n } else {\r\n if (newViewType.Id !== toggleValue?.Id) {\r\n setToggleValue(newViewType);\r\n onChange(newViewType);\r\n }\r\n }\r\n },\r\n [handleOtherChange, onChange, toggleValue?.Id],\r\n );\r\n\r\n // const isMobile = DetectIsMobile();\r\n // const settings = React.useMemo(\r\n // () => ({\r\n // size: size,\r\n // variant: variant,\r\n // orientation: orientation,\r\n // separated: separated,\r\n // }),\r\n // [orientation, separated, size, variant],\r\n // );\r\n // const classes = toggleButtonGroupStyle(settings);\r\n return (\r\n \r\n {options.map((option, index) => (\r\n \r\n {(compact !== true || option.icon === undefined) && (\r\n {option.Name}\r\n )}\r\n \r\n ))}\r\n {otherOptions !== undefined && otherOptions.length > 0 && (\r\n otherOptions || []}\r\n onChange={handleOtherChange}\r\n placeholder={t(translations.Other)}\r\n value={value}\r\n size={size === 'large' ? 'medium' : size}\r\n />\r\n )}\r\n {helperText !== undefined && (\r\n {helperText}\r\n )}\r\n \r\n );\r\n}\r\nexport const BaseToggleButtonGroup = React.forwardRef(\r\n BaseToggleButtonGroupInner,\r\n);\r\n","/**\r\n *\r\n * FilterContainer\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n Box,\r\n createStyles,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n makeStyles,\r\n Paper,\r\n styled,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Popper } from 'app/components/Popper';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IFilterSettings } from '../BasicFilter/IFilterSettings';\r\nimport { translations } from 'locales/translations';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport useGlobalDOMEvents from 'app/hooks/useGlobalDomEvents';\r\nimport clsx from 'clsx';\r\nimport { IsEmptyArray } from '../BasicFilter/AppliedFilterComponent';\r\n\r\ninterface FilterContainerProps {\r\n open: boolean;\r\n onClose: () => void;\r\n children: React.ReactNode;\r\n anchorEl: any;\r\n appliedFilters: IFilterSettings[];\r\n onChange: (items: IFilterSettings[]) => void;\r\n compact?: boolean;\r\n}\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n filterRoot: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: 16,\r\n height: '100%',\r\n overflow: 'hidden',\r\n maxWidth: 700,\r\n },\r\n scrollPaperCompact: {\r\n alignItems: 'flex-start',\r\n justifyContent: 'flex-end',\r\n },\r\n scrollPaper: {\r\n paddingTop: 40,\r\n },\r\n }),\r\n);\r\n\r\nexport function FilterContainer({\r\n anchorEl,\r\n onClose,\r\n onChange,\r\n open,\r\n children,\r\n compact,\r\n ...props\r\n}: FilterContainerProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const handleClose = () => {\r\n onClose();\r\n };\r\n // save provided applied filters to be used in change callbacks\r\n const [, setVisibleFilters] = React.useState[]>(\r\n props.appliedFilters,\r\n );\r\n\r\n // refresh applied filters if they were changed from outside\r\n React.useEffect(() => {\r\n setVisibleFilters(props.appliedFilters);\r\n }, [props.appliedFilters]);\r\n\r\n const handleClearClick = () => {\r\n setVisibleFilters(currentState => {\r\n const newState = currentState.map(f => ({ ...f, ...{ value: null } }));\r\n onChange(newState);\r\n return newState;\r\n });\r\n if (isMobile || compact) {\r\n onClose();\r\n }\r\n };\r\n const elementRef = React.useRef(null);\r\n // manually trigger rerender using a useless usState hook\r\n // this ensures that the popper is rendered only after the div is rendered and have provided the elementRef value to ancor the popper\r\n const countState = React.useState(0);\r\n React.useEffect(() => {\r\n countState[1](c => c + 1);\r\n // setCount (rerender) needs to occur after element elementRef.current value is bound\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementRef.current]);\r\n const classes = useStyles();\r\n const appliedFitltersCount = props.appliedFilters.filter(\r\n f =>\r\n f.value !== null &&\r\n f.value !== undefined &&\r\n f.value !== '' &&\r\n !IsEmptyArray(f.value),\r\n ).length;\r\n\r\n useGlobalDOMEvents({\r\n keyup(ev) {\r\n if ((ev as KeyboardEvent).key === 'Escape') {\r\n onClose();\r\n }\r\n },\r\n });\r\n\r\n const title = `${t(translations.Filters)} (${appliedFitltersCount})`;\r\n if (isMobile || compact) {\r\n return (\r\n \r\n {/* \r\n \r\n \r\n \r\n */}\r\n \r\n {title}\r\n {\r\n onClose();\r\n }}\r\n style={{ position: 'absolute', right: 4, top: 4 }}\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n \r\n {children}\r\n \r\n }\r\n \r\n \r\n onClose()}\r\n aria-label={t(translations.apply)}\r\n >\r\n {t(translations.apply)}\r\n \r\n \r\n {t(translations.ClearAll)}\r\n \r\n \r\n \r\n );\r\n } else {\r\n return (\r\n <>\r\n onClose()}\r\n clickAway={true}\r\n clickAwayFunc={e => {\r\n onClose();\r\n }}\r\n maxWidth={'fit-content'}\r\n >\r\n \r\n <>{children}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n// const StyledDialog = styled(Dialog)(({ theme }) => ({\r\n// paddingTop: theme.spacing(5),\r\n// }));\r\nconst StyledDialogPaper = styled(Paper)(({ theme }) => ({\r\n borderTopLeftRadius: theme.shape.borderRadius,\r\n borderTopRightRadius: theme.shape.borderRadius,\r\n margin: 0,\r\n}));\r\n","import { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useLocation } from 'react-router-dom';\r\nimport {\r\n GetRawValue,\r\n splitFilterValue,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\n\r\nimport { AssetsSelectionProps } from 'app/pages/MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { PageTopActionsProps } from '../type';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { ReservationCreateButton } from 'app/components/ReservationCreateButton';\r\nimport { selectGlobalDbSetting_EnableLegacyScheduler } from 'app/slice/globalDbSettingsSelectors';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport function AddReservation({\r\n size,\r\n text,\r\n variant,\r\n icon,\r\n isIconButton,\r\n useSidePanel,\r\n isExpanded,\r\n compact = true,\r\n ...props\r\n}: PageTopActionsProps) {\r\n const location = useLocation();\r\n const { openPanel } = useSidePanelState();\r\n const isMobile = DetectIsMobile();\r\n const { t } = useTranslation();\r\n\r\n const EnableLegacyScheduler = useSelector(\r\n selectGlobalDbSetting_EnableLegacyScheduler,\r\n );\r\n\r\n const serviceIdsRawValue = GetRawValue(\r\n new URLSearchParams(location.search),\r\n 'selectedIds',\r\n );\r\n const serviceIds =\r\n serviceIdsRawValue === undefined || serviceIdsRawValue === null\r\n ? []\r\n : (splitFilterValue(serviceIdsRawValue)\r\n .map(tryParseInt)\r\n .filter(f => f !== undefined) as number[]);\r\n\r\n if (EnableLegacyScheduler && serviceIds.length > 0) {\r\n return ;\r\n }\r\n return (\r\n {\r\n let selParams = {\r\n useSidePanel: !isMobile && !useSidePanel,\r\n actionType: 'Reservation',\r\n serviceIds: GetRawValue(\r\n new URLSearchParams(location.search),\r\n 'selectedIds',\r\n ),\r\n } as AssetsSelectionProps;\r\n openPanel({\r\n renderPageType: RenderPageType.AssetsSelection,\r\n renderPageProps: selParams,\r\n expanded: isExpanded,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n }}\r\n {...props}\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * ServiceGroupsFilter\r\n *\r\n */\r\nimport { ServiceGroupsPicker } from 'app/components/pickers/MultiSelectPickers/ServiceGroupsPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '..';\r\n\r\nexport const ServiceGroupsFilter = (props: IFilterComponentProps) => {\r\n const handleChange = (value: Entity[] | undefined) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * TagsPicker\r\n *\r\n */\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ITagsFilterDto } from 'api/odata/generated/entities/ITagsFilterDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompleteMultiPickerEx,\r\n AutocompleteMultiPickerExProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectIsAuthenticated,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { isNumericPositive } from 'utils/string-utils';\r\n\r\nexport type TagsUrl = 'base' | 'assetBase' | 'public';\r\nexport interface TagsPickerProps\r\n extends Omit, 'loadData'> {\r\n inputProps?: InputBaseComponentProps;\r\n urlType?: TagsUrl;\r\n separator?: string;\r\n}\r\n\r\nconst url = '/api/odata/v4/TagsFilter';\r\nconst assetTagsUrl = '/api/odata/v4/TagsFilter/AssetTagsFilter';\r\nconst publicAssetTagsUrl = '/api/odata/v4/TagsFilter/PublicAssetTagsFilter';\r\nexport const initTagsData = (\r\n initval: string | undefined,\r\n sourceUrl?: TagsUrl,\r\n separator?: string,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n let ids =\r\n initval.indexOf(separator || '|') !== -1\r\n ? initval.split(separator || '|')\r\n : [initval];\r\n let intIds: Identifiable[] = [];\r\n\r\n if (\r\n ids.filter(f => {\r\n let test = isNumericPositive(f);\r\n return test === true;\r\n }).length === ids.length\r\n ) {\r\n intIds = ids.map(item => {\r\n return { Id: parseInt(item) };\r\n }) as Identifiable[];\r\n }\r\n let strIds =\r\n intIds.length > 0\r\n ? []\r\n : (ids.map(item => {\r\n return { Id: item };\r\n }) as Identifiable[]);\r\n let filters: string | undefined = undefined;\r\n if (intIds.length > 0) {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(new Condition('Id', ODataOperators.Includes, intIds));\r\n filters = predicates.map(f => f.toString()).join(' and ');\r\n } else if (strIds.length > 0) {\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(new Condition('Name', ODataOperators.ContainsM, strIds));\r\n filters = predicates.map(f => f.toString()).join(' and ');\r\n }\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: filters,\r\n $select: 'Id,Name,ServiceGroups',\r\n };\r\n\r\n let initUrl =\r\n sourceUrl === 'public'\r\n ? publicAssetTagsUrl\r\n : sourceUrl === 'assetBase'\r\n ? assetTagsUrl\r\n : url;\r\n\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n isAuthenticated?: boolean,\r\n urlType?: TagsUrl,\r\n) => {\r\n const sourceUrl =\r\n urlType === 'public' || !isAuthenticated\r\n ? publicAssetTagsUrl\r\n : urlType === 'assetBase'\r\n ? assetTagsUrl\r\n : url;\r\n\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name', 'ServiceGroups'],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\n\r\nexport function TagsPicker(props: TagsPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n isAuth ? globalServiceGroupFilter || [] : [],\r\n isAuth,\r\n props.urlType,\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * LoanablePicker\r\n *\r\n */\r\nimport { AutocompletePickerProps } from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { BaseOptionsPicker } from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport const LoanTypeOptions = [\r\n {\r\n Id: 1,\r\n Name: 'Yes',\r\n },\r\n {\r\n Id: 2,\r\n Name: 'No',\r\n },\r\n];\r\n\r\nexport interface LoanablePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nexport const getSingleLoanableType = (val: number): Entity => {\r\n return LoanTypeOptions.filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\n\r\nexport const initLoanableData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n LoanTypeOptions.filter(item => {\r\n return item.Id.toString() === initval;\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = LoanTypeOptions;\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\n\r\nexport function LoanablePicker(props: LoanablePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * StatusPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface StatusPickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/StatusFilter';\r\nexport const initStatusData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function StatusPicker(props: StatusPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * LockersPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface LockersPickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/LockersFilter';\r\nexport const initLockersData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function LockersPicker(props: LockersPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * SubLocationFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { SubLocationListPicker } from 'app/components/pickers/AutocompletePickers/SubLocationListPicker';\r\n\r\nexport const SubLocationFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default SubLocationFilter;\r\n","import { Avatar, makeStyles } from '@material-ui/core';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { selectAppSettings, selectLoading } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { toRootedURL } from 'utils/url-utils';\r\n\r\nexport interface CustomerLogoProps {\r\n height?: string | number;\r\n width?: string | number;\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n '&>img': {\r\n objectFit: 'contain',\r\n },\r\n },\r\n}));\r\nexport const CustomerLogo = React.memo(function CustomerLogo(\r\n props: CustomerLogoProps,\r\n) {\r\n const { t } = useTranslation();\r\n const appSettings: AppSettings | null = useSelector(selectAppSettings);\r\n const isLoading = useSelector(selectLoading);\r\n const { height, width } = props;\r\n const classes = useStyles();\r\n const [customerLink, setCustomerLink] = React.useState(\r\n undefined,\r\n );\r\n const [customerImg, setCustomerImg] = React.useState(\r\n undefined,\r\n );\r\n React.useEffect(() => {\r\n let active = !isLoading;\r\n if (active) {\r\n let link = appSettings?.TopCustomerLogoLink;\r\n let img = appSettings?.TopCustomerLogo;\r\n if (link !== undefined && link !== '') {\r\n setCustomerLink(link);\r\n }\r\n if (img !== undefined && img !== '') {\r\n setCustomerImg(img);\r\n console.log(toRootedURL(img));\r\n }\r\n } else {\r\n setCustomerLink(undefined);\r\n setCustomerImg(undefined);\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [appSettings, isLoading]);\r\n return (\r\n \r\n \r\n \r\n );\r\n});\r\n","export enum AssemblyTypes {\r\n Normal = 0,\r\n AssembliesAndNormal = 1,\r\n AssemblyParts = 2,\r\n AllEquipments = 3,\r\n}\r\n","/**\r\n *\r\n * FundingTypePicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { AssemblyTypes } from 'enums/InstrumentListAssemblyTypes';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface AssemblyTypePickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const getSingleAssemblyType = (val: number): Entity => {\r\n return enumToEntityArray(AssemblyTypes).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\n\r\nexport const initAssemblyTypeData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n enumToEntityArray(AssemblyTypes).filter(item => {\r\n return item.Id.toString() === initval;\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(AssemblyTypes);\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\n\r\nexport function AssemblyTypePicker(props: AssemblyTypePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { StyledFormProps } from '../StyledForm';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport clsx from 'clsx';\r\nimport { Section } from '../wrappers';\r\nimport { SIDE_PANEL_WIDTH } from 'styles/constantVariables';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\n\r\nexport const StyledFormFieldsContainer = (\r\n props: Omit,\r\n) => {\r\n const {\r\n avoidStyles,\r\n children,\r\n sectionStyle,\r\n isCover,\r\n noPadding,\r\n ...other\r\n } = props;\r\n const { checkIsMobile, isLandscape } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const showShortView =\r\n (isMobile && !isLandscape) ||\r\n (sidePanelOpen && !sidePanelExpanded) ||\r\n isCover;\r\n const theme = useTheme();\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { FilterValueType } from './BasicFilter/FilterValueType';\r\n\r\n/**\r\n * Returns current value of the filter based on filter's id\r\n * @param allFilters all filters\r\n * @param id filter id\r\n * @returns filter value\r\n */\r\nexport const getFilterValue = function (\r\n allFilters: Array> | undefined,\r\n id: string,\r\n): FilterValueType | undefined {\r\n if (allFilters === undefined) {\r\n return undefined;\r\n }\r\n var filter = allFilters.find(f => f.id === id);\r\n if (filter === undefined) {\r\n return undefined;\r\n }\r\n const value = filter.value;\r\n return value ?? undefined;\r\n};\r\n","import { Skeleton } from '@material-ui/lab';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nconst SceletonBox = styled('div')`\r\n display: flex;\r\n padding-inline: 16px;\r\n`;\r\nexport const SkeletonIfLoading = ({\r\n loading,\r\n children,\r\n}: React.PropsWithChildren<{ loading: boolean }>) => {\r\n if (loading) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n return <>{children};\r\n};\r\n","import * as React from 'react';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { FilterIconButton } from 'app/components/BasicButtons/FilterIconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport interface FiltersButtonProps {\r\n onClick: React.MouseEventHandler;\r\n appliedFiltersLength?: number;\r\n allFiltersLength?: number;\r\n innerRef?: React.RefObject;\r\n}\r\n\r\nexport function FiltersButton({\r\n onClick,\r\n appliedFiltersLength,\r\n allFiltersLength,\r\n ...props\r\n}: FiltersButtonProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n if (isMobile) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n }\r\n endIcon={\r\n !!appliedFiltersLength && (\r\n \r\n \r\n \r\n {appliedFiltersLength}\r\n \r\n \r\n )\r\n }\r\n >\r\n {t(translations.Filters)}\r\n \r\n );\r\n}\r\n","import { initProjectData } from 'app/components/pickers/AutocompletePickers/ProjectPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { IFilterSettings } from '../../BasicFilter/IFilterSettings';\r\nimport { ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n initPickerValue,\r\n} from '../../types/FilterParam';\r\nimport { TFunction } from 'i18next';\r\nimport { AppSettings, IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { ProjectFilter } from './index';\r\n\r\n/**\r\n * Produces standard budgets filter settings\r\n * Returns undefined if the budgets are disabled in system settings\r\n * @param params URL search params to fetch the value form\r\n * @param fieldName aka accessor\r\n * @param t TFunction for localization\r\n * @param appSettings AppSettings used to determine if the budgets are enabled\r\n * @returns configured budgets filter\r\n */\r\nexport function getBudgetsFilterSettings(\r\n params: URLSearchParams,\r\n fieldName: keyof T,\r\n t: TFunction,\r\n appSettings: AppSettings | null,\r\n): IFilterSettings | undefined {\r\n const id = 'BudgetId';\r\n if (!IsModuleEnabled(appSettings, KnownModules.Budgets)) {\r\n return undefined;\r\n }\r\n return {\r\n id: id,\r\n fieldName: fieldName,\r\n displayName: t(translations.BudgetNumber),\r\n operator: ODataOperators.Equals,\r\n // value: getDefaultFilterValue('bid', params),\r\n queryStringSerializer: 'bid',\r\n initData: initPickerValue(initProjectData),\r\n value: GetPartialEntity(GetNumberOrUndefined(GetRawValue(params, 'bid'))),\r\n component: ProjectFilter,\r\n urlKey: 'bid',\r\n };\r\n}\r\n","/**\r\n *\r\n * AvailabilityTypePicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface AvailabilityTypePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/AvailabilityTypesFilter';\r\nexport const initAvailabilityTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm !== null ? searchTerm : undefined,\r\n }).toString();\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nconst loadBookableData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n const predicates: (string | Condition>)[] = [];\r\n const bookable: number[] = [\r\n //AvailabilityTypes.ApprovalRequiredBillable as number,\r\n //AvailabilityTypes.BookableWApproval as number,\r\n AvailabilityTypes.FreelyBookable as number,\r\n //AvailabilityTypes.FreelyBookableBillable as number,\r\n AvailabilityTypes.LectureRoom as number,\r\n AvailabilityTypes.LoanableEquipment as number,\r\n AvailabilityTypes.TrainingProgram as number,\r\n ];\r\n let filter = `(${bookable\r\n .map(item =>\r\n new Condition>(\r\n 'Id',\r\n ODataOperators.Equals,\r\n item,\r\n ).toString(),\r\n )\r\n .join(' or ')})`;\r\n predicates.push(filter);\r\n\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm !== null ? searchTerm : undefined,\r\n }).toString();\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\n\r\nexport function AvailabilityTypePicker(props: AvailabilityTypePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function AvailabilityTypeBookablePicker(\r\n props: AvailabilityTypePickerProps,\r\n) {\r\n return (\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { useAsyncDebounce } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { TextControlField } from '../BasicInputs/TextControlField';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\n\r\nexport interface IGlobalFilterProps {\r\n globalFilter?: string;\r\n setGlobalFilter: (value: string) => void;\r\n info?: string;\r\n useRemoveSearch?: boolean;\r\n placeholder?: string;\r\n}\r\nexport function GlobalFilter({\r\n globalFilter,\r\n setGlobalFilter,\r\n info,\r\n placeholder,\r\n useRemoveSearch,\r\n}: IGlobalFilterProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const [value, setValue] = React.useState(globalFilter);\r\n const onChange = useAsyncDebounce(value => {\r\n setGlobalFilter(value || undefined);\r\n }, 200);\r\n\r\n return (\r\n {\r\n setValue('');\r\n onChange('');\r\n }}\r\n >\r\n {' '}\r\n \r\n \r\n ) : !!info ? (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n inputProps={{ 'aria-label': 'table search' }}\r\n info={info}\r\n onChange={e => {\r\n setValue(e.target.value);\r\n onChange(e.target.value);\r\n }}\r\n />\r\n );\r\n}\r\n","import { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport {\r\n bindPopover,\r\n bindTrigger,\r\n usePopupState,\r\n} from 'material-ui-popup-state/hooks';\r\nimport {\r\n Box,\r\n Divider,\r\n Grid,\r\n LinearProgress,\r\n ListItemText,\r\n MenuItem,\r\n MenuList,\r\n Popover,\r\n} from '@material-ui/core';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport {\r\n AssetsFilterForWorkOrder,\r\n AssetsPicker,\r\n initAssetsData,\r\n} from 'app/components/pickers/MultiSelectPickers/AssetsPicker/index';\r\nimport { initWOTypeDataParams } from 'app/components/pickers/AutocompletePickers/WorkOrderTypePicker';\r\nimport { WorkOrderQueryStringParameters } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/types';\r\nimport { GetRawValue } from 'app/components/BasicTable/types/FilterParam';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { WorkOrderDetailsProps } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { Body } from 'app/components/Typography';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { useLocationChange } from 'app/hooks/useLocationChange';\r\nimport { ButtonsVariant } from 'app/components/BasicButtons/Button';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface NewWorkOrderButtonProps {\r\n assetIds?: string;\r\n downtime?: boolean;\r\n text?: string;\r\n noChangeOnMobile?: boolean;\r\n fullWidth?: boolean;\r\n isIconButton?: boolean;\r\n variant?: ButtonsVariant;\r\n initAsset?: IAssetDto;\r\n useSidePanel?: boolean;\r\n openPanelWithCover?: (state: SidePanelOpenState) => void;\r\n id?: string;\r\n}\r\n\r\nexport const NewWorkOrderButton = (props: NewWorkOrderButtonProps) => {\r\n const { t } = useTranslation();\r\n const location = useLocation();\r\n const { openPanel } = useSidePanelState();\r\n const {\r\n assetIds,\r\n downtime,\r\n text,\r\n noChangeOnMobile,\r\n fullWidth,\r\n isIconButton,\r\n variant,\r\n useSidePanel,\r\n openPanelWithCover,\r\n id,\r\n } = props;\r\n const popupState = usePopupState({\r\n variant: 'popover',\r\n popupId: 'workOrderTypeSelection',\r\n });\r\n //const [open, setOpen] = useState(false);\r\n const [assets, setAssets] = React.useState(\r\n undefined,\r\n );\r\n const [workTypes, setWorkTypes] = React.useState<\r\n IWorkOrderTypeDto[] | undefined\r\n >(undefined);\r\n const [loadingAsset, setLoadingAssets] = React.useState(\r\n !!assetIds && !!assets && assets.length < 1,\r\n );\r\n const handleAssetChange = React.useCallback(\r\n (value: IAssetDto[] | []) => {\r\n setAssets(value);\r\n setLoadingAssets(true);\r\n initWOTypeDataParams(value, undefined, downtime).then(types => {\r\n setWorkTypes(types);\r\n setLoadingAssets(false);\r\n });\r\n },\r\n [downtime],\r\n );\r\n const getParamFromUrl = (name: string): string | undefined => {\r\n return GetRawValue(new URLSearchParams(location.search), name) ?? undefined;\r\n };\r\n const handleWorkTypeClick = (event: IWorkOrderTypeDto) => {\r\n let params = {\r\n queryParams: {\r\n id: undefined,\r\n aType: event.Id.toString(),\r\n down: (downtime || getParamFromUrl('down')) && event.AssetAlertType,\r\n source: getParamFromUrl('source'),\r\n Up: getParamFromUrl('Up'),\r\n title: getParamFromUrl('title'),\r\n eStart: getParamFromUrl('eStart'),\r\n sympt: getParamFromUrl('sympt'),\r\n aStatus: getParamFromUrl('aStatus'),\r\n aStart: getParamFromUrl('aStart'),\r\n desc: getParamFromUrl('desc'),\r\n assetId: !!assets ? assets.map(a => a.Id).join(',') : undefined,\r\n offH:\r\n (downtime || getParamFromUrl('down')) && event.AssetAlertType\r\n ? getParamFromUrl('offH')\r\n : undefined,\r\n offStart: getParamFromUrl('offStart'),\r\n offEnd: getParamFromUrl('offStart'),\r\n reason: getParamFromUrl('reason'),\r\n eqid: getParamFromUrl('eqid'),\r\n sid: getParamFromUrl('sid'),\r\n } as WorkOrderQueryStringParameters,\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps;\r\n const panelProps = {\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: params,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState;\r\n\r\n !!openPanelWithCover\r\n ? openPanelWithCover(panelProps)\r\n : openPanel(panelProps);\r\n };\r\n\r\n useLocationChange((current: Location, previus: Location) => {\r\n let ids = getParamFromUrl('aid');\r\n if ((!!ids && ids !== '') || !!assetIds) {\r\n setLoadingAssets(true);\r\n initAssetsData(ids || assetIds).then(response => {\r\n setAssets(response);\r\n initWOTypeDataParams(response, undefined, downtime).then(types => {\r\n setLoadingAssets(false);\r\n setWorkTypes(types);\r\n });\r\n });\r\n } else {\r\n setWorkTypes(undefined);\r\n setAssets(undefined);\r\n setLoadingAssets(false);\r\n }\r\n });\r\n return (\r\n

    \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n {t(translations.CreateAnAssetRelatedEvent)}\r\n \r\n {\r\n popupState.close();\r\n setAssets([]);\r\n setWorkTypes([]);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {\r\n handleAssetChange(value);\r\n }}\r\n placeholder={t(translations.QuickWorkOrderPleaseSelectAssets)}\r\n fullWidth={true}\r\n name=\"assets\"\r\n variant=\"filled\"\r\n id=\"asset-id\"\r\n label={t(translations.Asset)}\r\n value={\r\n props.initAsset !== undefined\r\n ? [props.initAsset]\r\n : assets || undefined\r\n }\r\n disabled={props.initAsset !== undefined}\r\n />\r\n \r\n {loadingAsset && (\r\n
    \r\n \r\n
    \r\n )}\r\n {assets && assets.length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.PleaseSelectAnEventType)}\r\n \r\n \r\n \r\n {workTypes && workTypes.length > 0 ? (\r\n workTypes.map(wt => (\r\n {\r\n handleWorkTypeClick(wt);\r\n popupState.close();\r\n setAssets([]);\r\n setWorkTypes([]);\r\n }}\r\n >\r\n \r\n {wt.Name}\r\n \r\n \r\n ))\r\n ) : (\r\n \r\n \r\n {t(translations.NoAlertTypesFoundForSelectedAssets)}\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","import { MenuItem } from '@material-ui/core';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { WorkOrderApi } from 'api/WorkOrderApi';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { useCalendarLink } from 'app/pages/CalendarPage/GetCalendarPagePath';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { toQueryString, toRootedURL } from 'utils/url-utils';\r\nimport { OpenWorkOrderButton } from './OpenWorkOrder';\r\n\r\nexport interface BringBackUpProps {\r\n rows: TRow[];\r\n getAssetIds: (rows: TRow[]) => number[];\r\n getEquipmentIds: (rows: TRow[]) => number[];\r\n useSidePanel?: boolean;\r\n}\r\n\r\nexport function BringBackUp({\r\n rows,\r\n getAssetIds,\r\n getEquipmentIds,\r\n useSidePanel,\r\n}: BringBackUpProps) {\r\n const { t } = useTranslation();\r\n const { newDate } = useSystemDate();\r\n const fetchDownOrders = async (\r\n ids: number[],\r\n ): Promise => {\r\n return WorkOrderApi.DowntimeOrders(ids).then(data => {\r\n return data;\r\n });\r\n };\r\n const [downOrders, setDownOrders] = useAsyncExtendedState<\r\n IWorkOrderDetailsDto[]\r\n >([]);\r\n const [fetchOrdersState, fetchOrdersPromise] = usePromise(fetchDownOrders);\r\n\r\n React.useEffect(() => {\r\n if (\r\n !fetchOrdersState.status ||\r\n (fetchOrdersState.status !== 'pending' &&\r\n fetchOrdersState.status !== 'resolved')\r\n ) {\r\n setDownOrders(fetchOrdersPromise(getAssetIds(rows)));\r\n }\r\n }, [\r\n fetchOrdersPromise,\r\n fetchOrdersState.status,\r\n getAssetIds,\r\n rows,\r\n setDownOrders,\r\n ]);\r\n\r\n const calendarLinkParams = React.useMemo(() => {\r\n if (fetchOrdersState.status === 'resolved' && downOrders.length > 0) {\r\n let date =\r\n downOrders.filter(f => f.OfflineEventStart !== null)[0]\r\n .OfflineEventStart ?? newDate();\r\n\r\n return {\r\n equipments: getEquipmentIds(rows),\r\n Start: dateUtils.formatQueryStringDate(dateUtils.parseISO(date)),\r\n };\r\n } else {\r\n return undefined;\r\n }\r\n }, [downOrders, fetchOrdersState.status, getEquipmentIds, newDate, rows]);\r\n const calendarLink = useCalendarLink({\r\n ...calendarLinkParams,\r\n ...{ viewType: 'calendar' },\r\n });\r\n const alertslink = React.useMemo(() => {\r\n if (fetchOrdersState.status === 'resolved' && downOrders.length > 0) {\r\n return `/workorders?${toQueryString({\r\n aid: getAssetIds(rows)\r\n .map(r => r)\r\n .join('|'),\r\n downTime: 'true',\r\n })}`;\r\n } else {\r\n return undefined;\r\n }\r\n }, [downOrders.length, fetchOrdersState.status, getAssetIds, rows]);\r\n\r\n return fetchOrdersState.status === 'resolved' && downOrders.length > 0 ? (\r\n \r\n {downOrders.length === 1 ? (\r\n \r\n ) : (\r\n [\r\n \r\n {t(translations.BringBackUpOnWorkOrders)}\r\n ,\r\n \r\n {t(translations.BringBackUpOnCalendar)}\r\n ,\r\n ]}\r\n menuProps={{\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n },\r\n transformOrigin: {\r\n vertical: 'top',\r\n horizontal: 'left',\r\n },\r\n getContentAnchorEl: null,\r\n }}\r\n addChevron\r\n >\r\n {t(translations.BringBackUp)}\r\n \r\n )}\r\n \r\n ) : (\r\n \r\n );\r\n}\r\n","import { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { AddWorkOrder } from './AddWorkOrder';\r\n\r\nexport interface DownWorkOrderProps {\r\n rows: TRow[];\r\n getAssets: (rows: TRow[]) => Promise;\r\n buttonName?: string;\r\n useSidePanel?: boolean;\r\n}\r\n\r\nexport function DownWorkOrder({\r\n rows,\r\n getAssets,\r\n buttonName,\r\n useSidePanel,\r\n}: DownWorkOrderProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import {\r\n CalendarButton,\r\n CalendarButtonProps,\r\n} from 'app/components/CalendarButton';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface OpenCalendarProps\r\n extends Omit<\r\n CalendarButtonProps,\r\n | 'variant'\r\n | 'size'\r\n | 'equipments'\r\n | 'openToBook'\r\n | 'viewType'\r\n | 'target'\r\n | 'children'\r\n > {\r\n rows: TRow[];\r\n getEquipmentIds: (rows: TRow[]) => number[];\r\n bookMultiple?: boolean;\r\n primary?: boolean;\r\n}\r\n\r\nexport function OpenCalendar({\r\n rows,\r\n getEquipmentIds,\r\n bookMultiple,\r\n primary,\r\n ...props\r\n}: OpenCalendarProps) {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n {t(translations.Reservation)}\r\n \r\n );\r\n}\r\n","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { toQueryString } from 'utils/url-utils';\r\n\r\nexport interface OpenWorkOrdersProps {\r\n rows: TRow[];\r\n getAssetIds: (rows: TRow[]) => number[];\r\n}\r\n\r\nexport function OpenWorkOrders({\r\n rows,\r\n getAssetIds,\r\n}: OpenWorkOrdersProps) {\r\n const { t } = useTranslation();\r\n const alertslink = React.useMemo(() => {\r\n return `/workorders?${toQueryString({\r\n aid: getAssetIds(rows).join('|'),\r\n })}`;\r\n }, [getAssetIds, rows]);\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import { IRow } from 'app/components/BasicTable/IRow';\r\nimport { useConfigurableColumns } from 'app/components/BasicTable/useConfigurableColumns';\r\nimport React from 'react';\r\nimport { Column } from 'react-table';\r\n\r\nconst GetTargetColumns = (\r\n configurableColumns: Column[] | undefined,\r\n target: Column[] | undefined,\r\n): Column[] | undefined => {\r\n if (configurableColumns !== undefined && target !== undefined) {\r\n const res = configurableColumns.map(c => {\r\n const r = target.find(t => t.accessor === c.accessor);\r\n return r !== undefined ? r : c;\r\n });\r\n return res;\r\n } else return undefined;\r\n};\r\nconst ExcludeColumns = (\r\n configurableColumns: Array | undefined,\r\n columnsToRemove: string[] | undefined,\r\n): Array | undefined => {\r\n if (configurableColumns !== undefined) {\r\n if (columnsToRemove !== undefined) {\r\n const res = configurableColumns.filter(\r\n c => columnsToRemove.find(r => r === c) === undefined,\r\n );\r\n return res;\r\n } else {\r\n return configurableColumns;\r\n }\r\n } else {\r\n return undefined;\r\n }\r\n};\r\nexport const useConfigurableColumnsAdvanced = (\r\n screenId: number,\r\n columns: Array>,\r\n excludeFroExport: string[],\r\n) => {\r\n const {\r\n configurableColumns,\r\n configurableColumnsExport: exportConfigurableColumns,\r\n handleConfigurableColumns,\r\n configCompleted,\r\n } = useConfigurableColumns({\r\n screenId: screenId,\r\n columns: columns,\r\n // setGlobalMessage: setGlobalMessage,\r\n });\r\n const getColumnAccessors = React.useCallback(\r\n (columns: Column[] | undefined) =>\r\n columns\r\n ?.filter(c => typeof c.accessor === 'string')\r\n ?.filter(c => c.accessor !== undefined)\r\n ?.map(c => c.accessor as keyof TRow),\r\n [],\r\n );\r\n\r\n const getDisplayColumns = React.useCallback(\r\n ({\r\n screenId,\r\n configurableColumns,\r\n configCompleted,\r\n columns,\r\n }): Column[] | undefined => {\r\n if (screenId === undefined) {\r\n return columns;\r\n } else if (configCompleted) {\r\n return configurableColumns;\r\n } else {\r\n return undefined;\r\n }\r\n },\r\n [],\r\n );\r\n const columnAccessors = React.useMemo(() => {\r\n const result = getColumnAccessors(\r\n getDisplayColumns({\r\n screenId,\r\n configurableColumns,\r\n configCompleted,\r\n columns,\r\n }),\r\n );\r\n return result;\r\n }, [\r\n getColumnAccessors,\r\n getDisplayColumns,\r\n screenId,\r\n configurableColumns,\r\n configCompleted,\r\n columns,\r\n ]);\r\n const targetColumns = React.useMemo(() => {\r\n return GetTargetColumns(configurableColumns, columns);\r\n }, [columns, configurableColumns]);\r\n const exportColumns = React.useMemo(() => {\r\n return ExcludeColumns(exportConfigurableColumns, excludeFroExport);\r\n }, [excludeFroExport, exportConfigurableColumns]);\r\n return {\r\n configurableColumns: targetColumns,\r\n columnAccessors,\r\n exportConfigurableColumns: exportColumns,\r\n handleConfigurableColumns,\r\n configCompleted,\r\n };\r\n};\r\n","/**\r\n *\r\n * Popover\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { createStyles, makeStyles, Paper, Theme } from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Popover as MuiPopover } from '@material-ui/core';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport clsx from 'clsx';\r\nimport { PopperTitle } from '../Popper/PopperTitle';\r\n\r\nexport interface PopperProps {\r\n id?: string;\r\n title: React.ReactNode;\r\n open: boolean;\r\n anchorEl?: EventTarget & HTMLDivElement;\r\n children: React.ReactNode;\r\n onClose: React.MouseEventHandler;\r\n className?: string;\r\n closeTitle?: string;\r\n}\r\n\r\nexport function Popover(props: PopperProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const classes = useStyles({ isMobile: isMobile });\r\n\r\n return (\r\n \r\n \r\n \r\n {props.children}\r\n \r\n \r\n );\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n // https://github.com/mui/material-ui/issues/18905\r\n zIndex: 1300,\r\n },\r\n rootMobile: {\r\n width: `100vw`,\r\n height: 'calc(100% - 90px)',\r\n // long content of the Popover overflows Popover box on mobile\r\n overflow: 'auto',\r\n },\r\n selectPaper: {\r\n height: '100%',\r\n },\r\n selectRoot: {\r\n padding: theme.spacing(2),\r\n },\r\n selectTitle: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '8px 8px',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n '&>label': {\r\n width: '100%',\r\n textAlign: 'center',\r\n },\r\n },\r\n selectContent: {\r\n marginTop: theme.spacing(2),\r\n boxShadow: 'inset 0px 1px 0px #E0E5EC',\r\n },\r\n }),\r\n);\r\n","import * as React from 'react';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\n\r\n/**\r\n * Hides the global service group filter on a page.\r\n * Example of usage on the page componet:\r\n * ```\r\n * export const SomePage = withoutGlobalServiceGroupFilter(SomePageContent);\r\n * ```\r\n * Usage on loadable:\r\n * ```\r\n * export const SomePage = lazyLoad(\r\n * () => import('./index'),\r\n * module => withoutGlobalServiceGroupFilter(module.SomePage));\r\n * ```\r\n * @param Component Page component\r\n * @returns page component\r\n */\r\nexport function withoutGlobalServiceGroupFilter

    (\r\n Component: React.ComponentType

    ,\r\n): React.FC

    {\r\n return ({ ...props }: P) => {\r\n const dispatch = useDispatch();\r\n\r\n const { actions } = useAppSettingsSlice();\r\n useEffectOnMount(() => {\r\n dispatch(actions.showGlobalServiceGroupFilter(false));\r\n });\r\n\r\n return ;\r\n };\r\n}\r\n","import { useTheme } from '@material-ui/core';\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { CardPosition } from 'app/components/BasicCards';\r\nimport styled from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport interface TableCardGridProps {\r\n id?: string;\r\n children: React.ReactNodeArray;\r\n isMobile?: boolean;\r\n style?: React.CSSProperties;\r\n cardPosition?: CardPosition;\r\n compact?: boolean;\r\n minCardHeight?: number;\r\n}\r\n\r\nexport const TableCardGrid = ({\r\n id,\r\n children,\r\n isMobile,\r\n style,\r\n cardPosition,\r\n compact,\r\n minCardHeight,\r\n}: TableCardGridProps) => {\r\n const theme = useTheme();\r\n return (\r\n \r\n {children\r\n .filter(f => !!f)\r\n .map((c, ind) => (\r\n \r\n {c}\r\n \r\n ))}\r\n {(isMobile || compact) && children.length > 3 && (\r\n

    \r\n )}\r\n \r\n );\r\n};\r\nconst CardGrid = styled('div')(({ theme }) => ({\r\n '&.gridContainer': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexWrap: 'wrap',\r\n width: '100%',\r\n height: 'auto',\r\n gap: 32,\r\n overflowY: 'auto',\r\n padding: '8px 2px',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n '&.isMobile': {\r\n gap: '16px',\r\n },\r\n '&.cardVertical': {\r\n // gap: 16,\r\n padding: 0,\r\n },\r\n '& .cardItem': {\r\n //flexBasis: isMobile ? '100%' : '20%',\r\n flex: '1 1 20%',\r\n borderRadius: 8,\r\n width: 0,\r\n //width: 256,\r\n minWidth: '256px',\r\n maxWidth: '360px',\r\n '&.cardHorizontal': {\r\n flex: '1 1 25%',\r\n minWidth: '400px',\r\n maxWidth: '460px',\r\n },\r\n '&.cardVertical': {\r\n flex: '1 1 16%',\r\n },\r\n '&.isMobile': {\r\n flex: '1 1 100%',\r\n maxWidth: '100%',\r\n minWidth: 'unset',\r\n },\r\n },\r\n },\r\n}));\r\n","import styled from 'styled-components';\r\nimport { Theme, Toolbar, ToolbarProps } from '@material-ui/core';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n// margin: ${props =>\r\n// props.variant === 'dense' ? props.theme.spacing(1, 1, 0) : '0px'};\r\nexport const StyledToolbar = styled(\r\n ({\r\n theme,\r\n children,\r\n ...other\r\n }: {\r\n theme: Theme;\r\n children: React.ReactNode;\r\n } & ToolbarProps) => {children},\r\n)`\r\n box-shadow: unset;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n align-self: stretch;\r\n width: 100%;\r\n padding: ${props =>\r\n props.variant === 'dense' ? '0px' : props.theme.spacing(3, 4, 2)};\r\n margin: 0;\r\n\r\n &.shortview {\r\n box-shadow: inset 0px -1px 0px #e0e5ec;\r\n gap: ${props => props.theme.spacing(1)}px;\r\n padding: ${props =>\r\n props.variant === 'dense' ? '0px' : props.theme.spacing(0, 2)};\r\n & .actionsContainer {\r\n gap: ${props => props.theme.spacing(1)}px;\r\n }\r\n & .titleSection {\r\n & .title {\r\n & .titleText {\r\n max-width: 16ch;\r\n white-space: pre;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n display: inline;\r\n }\r\n }\r\n }\r\n }\r\n &.toptoolbar {\r\n background: ${bookitColors.base.white};\r\n margin: 0px;\r\n padding: 12px 32px;\r\n &.isExpanded {\r\n padding: 12px 32px 12px 24px;\r\n }\r\n }\r\n & .titleSection {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n padding: 0px;\r\n gap: ${props => props.theme.spacing(1)}px;\r\n &.titleAndIconMobile {\r\n flex-grow: 1;\r\n }\r\n &.titleAsColumn {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n }\r\n & .title {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n padding: 0px;\r\n gap: ${props => props.theme.spacing(1)}px;\r\n & .titleText {\r\n white-space: pre;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n max-width: 30ch;\r\n display: inherit;\r\n }\r\n & .longTitleText {\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n max-width: 45ch;\r\n display: initial;\r\n }\r\n }\r\n }\r\n & .messageContainer {\r\n margin-inline: ${props => props.theme.spacing(6)}px;\r\n flex-grow: 1;\r\n }\r\n & .actionsContainer {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: start;\r\n gap: ${props => props.theme.spacing(2)}px;\r\n padding: 0px;\r\n & span > a {\r\n & > svg {\r\n font-size: 20px;\r\n }\r\n }\r\n }\r\n`;\r\n","import { IRow } from 'app/components/BasicTable';\r\nimport {\r\n IsEntity,\r\n IsEntityString,\r\n} from 'app/components/BasicTable/BasicFilter/AppliedFilterComponent';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { Entity } from 'types/common';\r\nimport { Condition } from './ODataFilter';\r\n\r\n/**\r\n * Gets the predicates that can be used in ODAta filter from the \"filters\"\r\n * @param filters Applied filters\r\n * @param customParams ???\r\n * @param cp ???\r\n * @returns Odata filter predicate conditions\r\n */\r\nexport function getPredicates(\r\n filters: IFilterSettings[],\r\n customParams:\r\n | ((fieldName: string, Id: number, fn: (p: {}) => void) => void)\r\n | undefined,\r\n cp: (p: {}) => void,\r\n): (string | Condition)[] {\r\n return filters\r\n .filter(f => f.value !== null)\r\n .map(f =>\r\n f.value === undefined || (Array.isArray(f.value) && f.value.length === 0)\r\n ? undefined\r\n : f.customFilter !== undefined\r\n ? f.customFilter(f.value, f, filters)\r\n : IsEntityString(f.value)\r\n ? (f.value as Entity).Id !== ''\r\n ? new Condition(\r\n f.fieldName,\r\n f.operator,\r\n (f.value as Entity).Id,\r\n f.fieldName1,\r\n f.isInversed,\r\n )\r\n : undefined\r\n : IsEntity(f.value)\r\n ? (f.value as Entity).Id >= 0\r\n ? new Condition(\r\n f.fieldName,\r\n f.operator,\r\n (f.value as Entity).Id,\r\n f.fieldName1,\r\n f.isInversed,\r\n )\r\n : customParams !== undefined\r\n ? customParams(\r\n f.fieldName as string,\r\n (f.value as Entity).Id,\r\n cp,\r\n )\r\n : undefined\r\n : new Condition(\r\n f.fieldName,\r\n f.operator,\r\n f.value,\r\n f.fieldName1,\r\n f.isInversed,\r\n ),\r\n )\r\n .filter(f => f !== undefined) as Condition[];\r\n}\r\n","/**\r\n *\r\n * Link\r\n *\r\n */\r\nimport styled from 'styled-components/macro';\r\nimport { Link } from 'react-router-dom';\r\n\r\nexport const RouterLink = styled(Link)`\r\n color: ${p => p.theme.primary};\r\n text-decoration: none;\r\n\r\n &:hover {\r\n text-decoration: underline;\r\n opacity: 0.8;\r\n }\r\n\r\n &:active {\r\n opacity: 0.4;\r\n }\r\n`;\r\n","/**\r\n *\r\n * ArticlLink\r\n *\r\n */\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport { ValueLabel } from 'app/components/ValueLabel';\r\nimport { ArticleSource } from '../ArticlesSourcePicker';\r\n\r\nexport interface ArticleLinkProps {\r\n doi: string | undefined | null;\r\n externalId?: string | null;\r\n externalIdSource?: string | null;\r\n}\r\n\r\nexport function ArticleDoiLink({\r\n doi,\r\n externalIdSource,\r\n externalId,\r\n}: ArticleLinkProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const doiId = tryGetDoiFromUrl(doi) ?? doi;\r\n const doiURL = `https://doi.org/${doiId}`;\r\n const externalIdSourceType = externalIdSource as ArticleSource;\r\n const linkURL =\r\n // use pubmed link for pubmed articles\r\n externalIdSourceType === 'PubMed'\r\n ? `https://pubmed.ncbi.nlm.nih.gov/${externalId}/`\r\n : // use dtu findit link for dtu orbit sourced articles\r\n externalIdSourceType === 'DTUOrbit'\r\n ? `https://findit.dtu.dk/en/catalog?q=doi:${doiId}`\r\n : // by default shows the doi url\r\n doiURL;\r\n if (doi === undefined) {\r\n return ;\r\n } else {\r\n return (\r\n <>\r\n \r\n {doi}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst tryGetDoiFromUrl = (s: string | null | undefined) => {\r\n try {\r\n if (s === null) {\r\n return undefined;\r\n }\r\n if (s === undefined) {\r\n return undefined;\r\n }\r\n const url = new URL(s);\r\n const result = url.pathname.substr(1);\r\n return result;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n};\r\n","/**\r\n *\r\n * PaymentMethodEnumPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { PaymentMethods } from 'app/pages/OnlineBudgetsStatusPage/slice/types';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface PaymentMethodEnumPickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const getSinglePaymentMethod = (val: number): Entity => {\r\n return enumToEntityArray(PaymentMethods).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\n\r\nexport const initPaymentMethodData = (\r\n initval: number | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([getSinglePaymentMethod(initval)]);\r\n });\r\n }\r\n};\r\n\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(PaymentMethods);\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\n\r\nexport function PaymentMethodEnumPicker(props: PaymentMethodEnumPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * SamplePlatePicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ISamplePlateDto } from 'api/odata/generated/entities/ISamplePlateDto';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { EditorProps } from 'app/pages/Samples/EditableTable/EditableCell';\r\nimport { ISample } from 'app/pages/Samples/SamplesListPage/slice/types';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface SamplePlatePickerProps\r\n extends Omit<\r\n AutocompletePickerProps>,\r\n 'loadData' | 'onChange' | 'onBlur' | 'value' | 'name' | 'error'\r\n >,\r\n EditorProps {\r\n serviceGroupId?: number;\r\n placeholder?: string;\r\n helperText?: string;\r\n values?: ISample;\r\n}\r\n\r\nconst url = '/api/odata/v4/SamplePlates';\r\nexport const initSamplePlateData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (serviceGroupId?: number) => (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string; $select: string } = {\r\n $orderby: 'Id asc',\r\n $select: 'Id',\r\n };\r\n const predicates: Condition[] = [\r\n new Condition('Active', ODataOperators.Equals, true),\r\n ];\r\n if (serviceGroupId !== undefined) {\r\n predicates.push(\r\n new Condition('ServiceGroupId', ODataOperators.Equals, serviceGroupId),\r\n );\r\n }\r\n params.$filter = new ODataFilterBuilder({\r\n predicates,\r\n stringColumns: ['Id'],\r\n stringSearch: searchTerm ?? undefined,\r\n }).toString();\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response =>\r\n response.value.map(item => ({ Id: item.Id, Name: item.Id })),\r\n );\r\n};\r\nexport function SamplePlatePicker({\r\n parentValue,\r\n serviceGroupId,\r\n value,\r\n values,\r\n onChange,\r\n ...props\r\n}: SamplePlatePickerProps) {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const loadDatax = React.useCallback(loadData(values?.ServiceGroupId), [\r\n values?.serviceGroupId,\r\n ]);\r\n const S2Value = value === null ? null : { Id: value, Name: value };\r\n return (\r\n onChange(value?.Id ?? null)}\r\n value={S2Value}\r\n {...props}\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * SamplePlatePositionPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ISamplePlateDto } from 'api/odata/generated/entities/ISamplePlateDto';\r\nimport { SamplePlatePositionNamingTypes } from 'api/odata/generated/enums/SamplePlatePositionNamingTypes';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { EditorProps } from 'app/pages/Samples/EditableTable/EditableCell';\r\nimport {\r\n ISample,\r\n ISampleRun,\r\n} from 'app/pages/Samples/SamplesListPage/slice/types';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface SamplePlatePositionPickerProps\r\n extends Omit<\r\n AutocompletePickerProps>,\r\n 'loadData' | 'onChange' | 'onBlur' | 'value' | 'name' | 'error'\r\n >,\r\n EditorProps {\r\n serviceGroupId?: number;\r\n placeholder?: string;\r\n helperText?: string;\r\n values?: ISample | ISampleRun;\r\n}\r\n\r\nfunction range(x) {\r\n return Array.apply(null, Array(x)).map(function (x, i) {\r\n return i;\r\n });\r\n}\r\nconst loadData = (plateId?: string | null) => async (\r\n searchTerm: string | null,\r\n): Promise[]> => {\r\n const plate = await httpClient.get(\r\n `/api/odata/v4/sampleplates('${plateId}')`,\r\n );\r\n\r\n const rowsCount = plate.SamplePlateTypeRows;\r\n const columnsCount = plate.SamplePlateTypeColumns;\r\n const rows = range(columnsCount)\r\n .map(i =>\r\n plate.SamplePlateTypeColumnsNaming ===\r\n SamplePlatePositionNamingTypes.Alpha\r\n ? String.fromCharCode(65 + i)\r\n : i + 1,\r\n )\r\n .flatMap(column =>\r\n range(rowsCount)\r\n .map(i =>\r\n plate.SamplePlateTypeRowsNaming ===\r\n SamplePlatePositionNamingTypes.Alpha\r\n ? String.fromCharCode(65 + i)\r\n : i + 1,\r\n )\r\n .map(row => `${column}${row}`),\r\n );\r\n const options = rows.map(a => ({ Id: a, Name: a }));\r\n return options;\r\n};\r\n\r\nexport interface ConnectedSamplePlatePositionPickerProps\r\n extends SamplePlatePositionPickerProps {\r\n samplePlateId: string | null;\r\n}\r\nexport function SamplePlatePositionPicker({\r\n serviceGroupId,\r\n samplePlateId,\r\n value,\r\n values,\r\n onChange,\r\n ...props\r\n}: ConnectedSamplePlatePositionPickerProps) {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const loadDatax = React.useCallback(loadData(samplePlateId), [\r\n samplePlateId,\r\n serviceGroupId,\r\n ]);\r\n const S2Value = value === null ? null : { Id: value, Name: value };\r\n return (\r\n onChange(value?.Id ?? null)}\r\n value={S2Value}\r\n {...props}\r\n />\r\n );\r\n}\r\nexport function TargetSamplePlatePositionPicker({\r\n values,\r\n ...props\r\n}: SamplePlatePositionPickerProps) {\r\n const samplePlateId = (values as ISampleRun)?.TargetPlateId ?? null;\r\n return ;\r\n}\r\n\r\nexport function SourceSamplePlatePositionPicker({\r\n values,\r\n ...props\r\n}: SamplePlatePositionPickerProps) {\r\n const samplePlateId = (values as ISample)?.SamplePlateId ?? null;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n return ;\r\n}\r\n","import { PopupImport } from 'app/components/PopupImport';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useRequestSamplesSlice } from '../RequestSamplesPage/slice';\r\nimport { selectImportState } from '../RequestSamplesPage/slice/selectors';\r\n\r\nexport interface ImportButtonProps {\r\n onDownloadTemplateButtonClick?: () => Promise;\r\n disabled?: boolean;\r\n hideImportButton?: boolean;\r\n serviceRequestId?: number;\r\n}\r\n\r\nexport function ImportButton({\r\n onDownloadTemplateButtonClick,\r\n disabled,\r\n hideImportButton,\r\n serviceRequestId,\r\n}: ImportButtonProps) {\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n const state = useSelector(selectImportState);\r\n\r\n const handleConfirm = (_: React.MouseEvent, file: any) => {\r\n if (file !== undefined) {\r\n dispatch(\r\n actions.import({\r\n file: file,\r\n serviceRequestId:\r\n serviceRequestId === undefined ? 0 : serviceRequestId,\r\n }),\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n dispatch(actions.toggleImport(true))}\r\n onConfirm={handleConfirm}\r\n onCancel={() => dispatch(actions.toggleImport(false))}\r\n open={state.open}\r\n processing={state.processing}\r\n accept=\".xlsx\"\r\n hideImportButton={hideImportButton}\r\n variant=\"white\"\r\n onDownloadTemplateButtonClick={onDownloadTemplateButtonClick}\r\n />\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * PriceSheetMethodPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { PriceSheetBy } from 'enums/enums';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface PriceSheetMethodPickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const getSinglePriceSheetMethod = (val: number): Entity => {\r\n return enumToEntityArray(PriceSheetBy).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\n\r\nexport const PriceSheetMethodData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n enumToEntityArray(PriceSheetBy).filter(item => {\r\n return item.Id.toString() === initval;\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(PriceSheetBy);\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\n\r\nexport function PriceSheetMethodPicker(props: PriceSheetMethodPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * SuperGroupPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ISuperGroupDto } from 'api/odata/generated/entities/ISuperGroupDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\n\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectIsAuthenticated,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\n\r\nexport type DivisionsUrl = 'base' | 'full' | 'public';\r\nexport interface SuperGroupPickerProps\r\n extends Omit, 'loadData'> {\r\n urlType?: DivisionsUrl;\r\n}\r\n\r\nconst url = '/api/odata/v4/SuperGroupFilter';\r\nconst publicUrl = '/api/odata/v4/SuperGroupFilter/GetPublicDivisions';\r\nconst baseUrl = '/api/odata/v4/SuperGroupFilter/GetDivisions';\r\nexport const initSuperGroupData = (\r\n initval: string | undefined,\r\n sourceUrl?: DivisionsUrl,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as ISuperGroupDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,ServiceGroups',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n let initUrl =\r\n sourceUrl === 'public' ? publicUrl : sourceUrl === 'base' ? baseUrl : url;\r\n return httpClient\r\n .get(initUrl, params)\r\n .then(response => response.value as ISuperGroupDto[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n isAuthenticated?: boolean,\r\n urlType?: DivisionsUrl,\r\n) => {\r\n const sourceUrl =\r\n urlType === 'public' || !isAuthenticated\r\n ? publicUrl\r\n : urlType === 'base'\r\n ? baseUrl\r\n : url;\r\n\r\n return getAutoCompleteLoadDataFn({\r\n url: sourceUrl,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name', 'ServiceGroups'],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroups',\r\n ODataOperators.AnyIn,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\n};\r\n\r\nexport function SuperGroupPicker(props: SuperGroupPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const isAuth = useSelector(selectIsAuthenticated);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n isAuth ? globalServiceGroupFilter || [] : [],\r\n isAuth,\r\n props.urlType,\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","import { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\n\r\nexport function DefaultFilter(user: IAuthenticatedUser) {\r\n const result = new URLSearchParams();\r\n\r\n result.set('active', true.toString());\r\n\r\n return result;\r\n}\r\nexport function getRequiredFilter(search: string) {\r\n const result = isEmptyOrWhitespace(search)\r\n ? new URLSearchParams()\r\n : new URLSearchParams(search);\r\n if (\r\n result.has('active') === false ||\r\n result.get('active') === null ||\r\n result.get('active') === ''\r\n ) {\r\n result.set('active', true.toString());\r\n }\r\n const res = result.toString();\r\n return isEmptyOrWhitespace(res) ? undefined : res;\r\n}\r\n","import { CellProps, Renderer } from 'react-table';\r\nimport { AlignRight } from '../AlignRight';\r\n\r\ntype RecordType = Record;\r\nconst DecimalRenderer: Renderer> = ({ value, row }) => (\r\n {value == null ? null : value.toFixed(2)}\r\n);\r\nexport default DecimalRenderer;\r\n","/**\r\n *\r\n * ServiceTypeEnumPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { selectAppSettings } from 'app/slice/selectors';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { useSelector } from 'react-redux';\r\nimport { AppSettings, IsModuleEnabled } from 'types/AppSettings';\r\nimport { Entity } from 'types/common';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface ServiceTypeEnumPickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const getSingleServiceTypeEnum = (val: number): Entity => {\r\n return enumToEntityArray(ServiceType, undefined, 'ServiceType_').filter(\r\n item => {\r\n return item.Id === val;\r\n },\r\n )[0];\r\n};\r\n\r\nexport const initServiceTypeEnumData = (\r\n initval: string | undefined,\r\n): Promise[]> => {\r\n const val = parseInt(initval ?? '');\r\n if (initval === undefined || isNaN(val)) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([getSingleServiceTypeEnum(val)]);\r\n });\r\n }\r\n};\r\nexport const GetAvailableServiceTypes = (\r\n items: Entity[],\r\n appSettings: AppSettings | null,\r\n) => {\r\n return items.filter(f => {\r\n if (f.Id === ServiceType.Offline) {\r\n return IsModuleEnabled(appSettings, KnownModules.OfflineServices);\r\n }\r\n if (f.Id === ServiceType.Sample) {\r\n return IsModuleEnabled(appSettings, KnownModules.ServiceRequests);\r\n }\r\n if (f.Id === ServiceType.Workflow) {\r\n return IsModuleEnabled(appSettings, KnownModules.Workflows);\r\n }\r\n if (f.Id === ServiceType.Online) {\r\n return IsModuleEnabled(appSettings, KnownModules.Instruments);\r\n }\r\n return false;\r\n });\r\n};\r\nexport function ServiceTypeEnumPicker(props: ServiceTypeEnumPickerProps) {\r\n const appSettings = useSelector(selectAppSettings);\r\n const getOptions = (searchTerm: string | null) => {\r\n let items = GetAvailableServiceTypes(\r\n enumToEntityArray(ServiceType, undefined, 'ServiceType_'),\r\n appSettings,\r\n );\r\n\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import { EditorProps } from '../../EditableCell';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { omit } from 'lodash';\r\nimport { TextField } from 'app/components/TextField';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { BookitDatePicker } from 'app/components/BookitDatePicker';\r\n\r\n/* Date */\r\n// 'Date':\r\nexport function DateField({\r\n value,\r\n onBlur,\r\n parentValue,\r\n onChange,\r\n info,\r\n autoFocus,\r\n ...props\r\n}: EditorProps) {\r\n const handleChange = value => {\r\n onChange?.(\r\n dateUtils.formatISO(value, { format: 'basic', representation: 'date' }),\r\n );\r\n };\r\n return (\r\n <>\r\n \r\n ) : undefined\r\n }\r\n error={props.error}\r\n fullWidth\r\n {...omit(props, 'helperText')}\r\n />\r\n \r\n );\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\n\r\nconst url = '/api/odata/v4/ServiceRequestStatusFilter';\r\n\r\nexport interface ServiceRequestStatusPickerProps\r\n extends Omit, 'loadData'> {}\r\n\r\nexport const initServiceRequestStatusData = (\r\n initialValue: string | undefined,\r\n) => {\r\n if (initialValue === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IServiceRequestStatusDto[]);\r\n });\r\n } else {\r\n const id = parseInt(initialValue);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as IServiceRequestStatusDto[]);\r\n }\r\n};\r\n\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as IServiceRequestStatusDto[]);\r\n};\r\n\r\nexport function ServiceRequestStatusPicker(\r\n props: ServiceRequestStatusPickerProps,\r\n) {\r\n return (\r\n \r\n );\r\n}\r\n","import { Link } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { TFunctionResult } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport React, { ReactNode } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ChargeProps } from './index';\r\n\r\nexport const AddChargeButton = ({\r\n children,\r\n tooltip,\r\n ...props\r\n}: ChargeProps & {\r\n children?: ReactNode;\r\n tooltip?: React.ReactNode | TFunctionResult;\r\n}) => {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const singleAdminServiceGroup =\r\n authenticatedUser?.Roles?.includes(Roles.ServiceGroupBudgetsAdmin) &&\r\n authenticatedUser.AdminServiceGroups.length === 1\r\n ? authenticatedUser.AdminServiceGroups[0]\r\n : null;\r\n props.serviceGroup = props.serviceGroup ?? singleAdminServiceGroup ?? null;\r\n\r\n return (\r\n \r\n {\r\n dispatch(actions.toggleSidePanel(true));\r\n dispatch(actions.setPageType(RenderPageType.AddCharge));\r\n dispatch(actions.setPageProps(props));\r\n }}\r\n >\r\n {children ?? t(translations.AddManualInvoiceLine)}\r\n \r\n \r\n );\r\n};\r\n","export enum MinTimeAheadPeriodTypes {\r\n Hours = 0,\r\n Days = 1,\r\n}\r\n","import { httpClient } from './HttpClient';\r\n\r\nconst url = '/api/odata/v4/Restrictions';\r\n\r\nexport const RestrictionsApi = {\r\n getRestrictionByService: (id: number | undefined) => {\r\n return httpClient.get(url + '/' + (id ?? -1));\r\n },\r\n};\r\n","export enum TrainingStatus {\r\n Passed = 1,\r\n Missing = 2,\r\n Expired = 3,\r\n}\r\nexport enum PrerequisiteFor {\r\n NotAllow = 0,\r\n WithinMyCore = 1,\r\n WithinCorAssetCatGroup = 2,\r\n WithinCoreAssetCat = 3,\r\n WithinSpecificCore = 4,\r\n AccrossSystem = 5,\r\n}\r\n","import { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { FormRow } from 'app/components/Forms/FormsLayout';\r\nimport { UserPicker } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { IRestrictedUserPermissionResult } from 'api/odata/generated/entities/IRestrictedUserPermissionResult';\r\nimport { Entity } from 'types/common';\r\n\r\nimport { translations } from 'locales/translations';\r\nimport { FormLabelText } from 'app/components/Forms/FormLabelText';\r\nimport { Box, makeStyles, Theme, createStyles } from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { BasicAlert } from 'app/components/BasicAlert';\r\nimport { SimpleList } from 'app/components/BasicList/StyledList';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\n\r\nexport interface UserOwnPermissionsProps {\r\n user: Entity | null;\r\n isAdmin?: boolean;\r\n onUserChange: (value: Entity | null) => void;\r\n permissions: IRestrictedUserPermissionResult[];\r\n permLoading: boolean;\r\n restrictedOption: boolean | null;\r\n EquipmentName: string;\r\n serviceGroupId: number;\r\n serviceId: number;\r\n}\r\n\r\nexport const UserOwnPermissions = React.memo(function UserOwnPermissions(\r\n props: UserOwnPermissionsProps,\r\n) {\r\n const {\r\n user,\r\n isAdmin,\r\n onUserChange,\r\n permissions,\r\n permLoading,\r\n restrictedOption,\r\n EquipmentName,\r\n serviceGroupId,\r\n serviceId,\r\n } = props;\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const handleUserChange = React.useCallback(\r\n (value: Entity | null) => {\r\n onUserChange(value);\r\n },\r\n [onUserChange],\r\n );\r\n const userIsAdmin = React.useMemo(() => {\r\n if (user === null) {\r\n return false;\r\n } else {\r\n return (\r\n (user as IUserFilterDto)?.ServiceGroupIds?.some(\r\n f => f === serviceGroupId,\r\n ) ||\r\n (user as IUserFilterDto)?.Services?.some(f => f.Id === serviceId) ||\r\n (user as IUserFilterDto)?.IsAdminPanel\r\n );\r\n }\r\n }, [serviceGroupId, serviceId, user]);\r\n return (\r\n \r\n {isAdmin && (\r\n \r\n handleUserChange(value)}\r\n selectArray={[\r\n 'Id',\r\n 'Name',\r\n 'UserGroups',\r\n 'Budgets',\r\n 'IsAdminPanel',\r\n 'IsEquipmentAdmin',\r\n 'IsGroupAdmin',\r\n 'IsLabTech',\r\n 'Services',\r\n 'ServiceGroupIds',\r\n ]}\r\n />\r\n \r\n )}\r\n\r\n {user !== null && (\r\n \r\n \r\n {permLoading ? (\r\n \r\n \r\n \r\n \r\n ) : restrictedOption === null && !userIsAdmin ? (\r\n \r\n ) : permissions.length > 0 ? (\r\n \r\n {permissions.filter(x => x.Valid === true).length > 0 && (\r\n \r\n \r\n {'Allowed on:'}\r\n \r\n \r\n {permissions\r\n .filter(x => x.Valid === true)\r\n .map(item => (\r\n \r\n \r\n \r\n \r\n {`${item.PermissionName} - ${item.TimeSlotTypeName}`}\r\n \r\n \r\n \r\n ))}\r\n \r\n
    \r\n )}\r\n {permissions.filter(x => x.Valid === false).length > 0 && (\r\n \r\n \r\n {'Not allowed on:'}\r\n \r\n \r\n {permissions\r\n .filter(x => x.Valid === false)\r\n .map((item, index) => (\r\n \r\n \r\n \r\n \r\n {`${item.TimeSlotTypeName}`}\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n ) : (\r\n \r\n {user !== null ? (\r\n \r\n {t(translations.NoAdditionalRestrictionsFound)}\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\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n permRoot: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '8px',\r\n },\r\n cardContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: '12px',\r\n width: '100%',\r\n gap: 8,\r\n },\r\n cardTitle: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n height: 20,\r\n },\r\n title: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n gap: 8,\r\n },\r\n titleOverRule: {\r\n display: 'inline-block',\r\n whiteSpace: 'pre',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: '30ch',\r\n [theme.breakpoints.down('sm')]: {\r\n maxWidth: '25ch',\r\n },\r\n },\r\n cardContentRows: {\r\n padding: 0,\r\n margin: 0,\r\n },\r\n contentRow: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n gap: 8,\r\n },\r\n rowOverRule: {\r\n display: 'inline-block',\r\n whiteSpace: 'pre',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: '29ch',\r\n },\r\n rowTitle: {\r\n color: theme.palette.common.graySubtitle,\r\n paddingRight: 8,\r\n display: 'inline',\r\n },\r\n rowText: {\r\n color: theme.palette.common.blackRegular,\r\n display: 'inline',\r\n '& > *': {\r\n display: 'inherit',\r\n },\r\n },\r\n cardActions: {\r\n justifyContent: 'space-between',\r\n padding: '0px',\r\n gap: 8,\r\n width: '100%',\r\n },\r\n cardActionsButtons: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n gap: 8,\r\n justifyContent: 'flex-start',\r\n width: '100%',\r\n },\r\n }),\r\n);\r\n","import { httpClient } from './HttpClient';\r\n\r\nvar restUrl = '/api/odata/v4/RestrictedUserPermissions';\r\n\r\nexport const UserPermissionsApi = {\r\n getUserRestrictions: (payload: { serviceId: number; username: string }) => {\r\n return httpClient.post(restUrl + '/UserPermissions', payload);\r\n },\r\n getUserSlotPermissions: (payload: {\r\n serviceId: number;\r\n username: string;\r\n }) => {\r\n return httpClient.post(restUrl + '/UserSlotPermissions', payload);\r\n },\r\n};\r\n","import { Box } from '@material-ui/core';\r\nimport { RestrictionsApi } from 'api/RestrictionsApi';\r\nimport { BooleanRender } from 'app/components/BasicTable/components/BooleanRender';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { FormLabelText } from 'app/components/Forms/FormLabelText';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledFormFieldsContainer,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { MinTimeAheadPeriodTypes } from 'enums/MinTimeAheadPeriodTypes';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { IRestrictions } from '../../AssetPopUp/IAsset';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n} from 'app/slice/selectors';\r\nimport { UserOwnPermissions } from './components/UserOwnPermissions';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Entity } from 'types/common';\r\nimport { IUserRestrictionsResult } from 'api/odata/generated/entities/IRestrictedUserPermissionResult';\r\nimport { Body } from 'app/components/Typography';\r\nimport { TrainingStatus } from 'enums/TrainingStatus';\r\nimport { UserPermissionsApi } from 'api/UserPermissionsApi';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport {\r\n convertAuthToIUserFilterDto,\r\n IUserFilterDto,\r\n} from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { initAssetsData } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { AssetPicker } from 'app/components/pickers/AutocompletePickers/AssetPicker';\r\nimport { BasicCard } from 'app/components/BasicCards';\r\nimport { getAssetImageThumbSrc } from 'app/components/AssetThumbImage/getAssetImageSrc';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { initUserData } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { IsAssetImageExist } from 'types/AppSettings';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { useOpenAssetPopUp } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface InstrumentRestrictionsProps\r\n extends CoverProps,\r\n SidePanelContentProps {\r\n serviceId?: number;\r\n serviceGroupId?: number;\r\n initUser?: string;\r\n onClose?: () => void;\r\n showTable?: boolean;\r\n assetPickerDisabled?: boolean;\r\n withNoPadding?: boolean;\r\n useShortView?: boolean;\r\n hideEquipmentFormTitle?: boolean;\r\n withNoWrapper?: boolean;\r\n}\r\nexport interface Prerequisites {\r\n Id: number;\r\n Name: string;\r\n ServiceId: number;\r\n StatusName?: string;\r\n StatusId?: number;\r\n ImageName?: string;\r\n}\r\nexport function InstrumentRestrictions(props: InstrumentRestrictionsProps) {\r\n const {\r\n serviceId,\r\n serviceGroupId,\r\n useSidePanel,\r\n initUser,\r\n assetPickerDisabled,\r\n hideEquipmentFormTitle,\r\n withNoPadding,\r\n useShortView,\r\n isCover,\r\n closeCover,\r\n withNoWrapper,\r\n } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const authuser = useSelector(selectAuthenticatedUser);\r\n const appSettings = useSelector(selectAppSettings);\r\n //const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const isMobile = DetectIsMobile();\r\n const [equipmentId, setEquipmentId] = React.useState(\r\n serviceId,\r\n );\r\n const [equipmentGroupId, setEquipmentGroupId] = React.useState<\r\n number | undefined\r\n >(serviceGroupId);\r\n const [\r\n selectedService,\r\n setSelectedService,\r\n ] = useAsyncExtendedState(null);\r\n const isAdmin = React.useMemo(() => {\r\n return (\r\n authuser !== undefined &&\r\n (authuser.HasAdminServicePermissions(ServiceType.Online, equipmentId) ||\r\n authuser.HasLabTechServicePermissions(\r\n ServiceType.Online,\r\n equipmentId,\r\n ) ||\r\n authuser?.HasAdminGroupPermissions(equipmentGroupId) ||\r\n authuser?.HasLabTechGroupPermissions(equipmentGroupId))\r\n );\r\n }, [equipmentGroupId, equipmentId, authuser]);\r\n const [selectedUser, setSelectedUser] = React.useState(\r\n !!authuser && !isAdmin\r\n ? convertAuthToIUserFilterDto(authuser)\r\n : !!initUser\r\n ? ({ Id: initUser, Name: initUser } as IUserFilterDto)\r\n : null,\r\n );\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState();\r\n const fetchRestrictions = async (\r\n serviceId?: number,\r\n ): Promise => {\r\n return RestrictionsApi.getRestrictionByService(serviceId);\r\n };\r\n const [restrictions, setRestriction] = useAsyncExtendedState<\r\n IRestrictions | undefined\r\n >(undefined);\r\n const [fetchRestrictionsState, fetchRestrictionsPromise] = usePromise(\r\n fetchRestrictions,\r\n );\r\n\r\n const [userRestrictions, setUserRestrictions] = useAsyncExtendedState<\r\n IUserRestrictionsResult | undefined\r\n >(undefined);\r\n\r\n const fetchUserRestrictions = async (\r\n user: Entity,\r\n serviceId: number,\r\n ): Promise => {\r\n return UserPermissionsApi.getUserSlotPermissions({\r\n serviceId: serviceId,\r\n username: user.Id,\r\n });\r\n };\r\n const [fetchUserRestrictionsState, fetchUserRestrictionsPromise] = usePromise(\r\n fetchUserRestrictions,\r\n );\r\n const fetchAsset = async (serviceId: number): Promise => {\r\n return initAssetsData(serviceId.toString(), true, undefined, true).then(\r\n result => result[0],\r\n );\r\n };\r\n const [fetchAssetState, fetchAssetPromise] = usePromise(fetchAsset);\r\n const openAsset = useOpenAssetPopUp();\r\n useEffectOnMount(() => {\r\n setRestriction(fetchRestrictionsPromise(equipmentId));\r\n if (isAdmin) {\r\n if (!!initUser) {\r\n (async () => {\r\n try {\r\n const data = await initUserData(initUser, 'full');\r\n if (!!data && data.length > 0) {\r\n let selected = (data[0] ?? {\r\n Id: initUser,\r\n Name: initUser,\r\n }) as IUserFilterDto;\r\n setSelectedUser(selected);\r\n setUserRestrictions(\r\n fetchUserRestrictionsPromise(selected, equipmentId || -1),\r\n );\r\n }\r\n } catch {}\r\n })();\r\n } else {\r\n setSelectedUser(null);\r\n }\r\n } else {\r\n if (selectedUser !== null) {\r\n setUserRestrictions(\r\n fetchUserRestrictionsPromise(selectedUser, equipmentId || -1),\r\n );\r\n }\r\n }\r\n if (isAdmin) {\r\n setSelectedService(fetchAssetPromise(equipmentId || -1));\r\n }\r\n\r\n return () => {};\r\n });\r\n React.useEffect(() => {\r\n const messageKey = 'QuizLoad';\r\n if (fetchRestrictionsState.error) {\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: 'Something went wrong.',\r\n key: messageKey,\r\n }),\r\n );\r\n }\r\n }, [fetchRestrictionsState.error, actions, dispatch]);\r\n const minTimeAhead = (rest: IRestrictions): string => {\r\n if (rest.MinTimeAheadPeriodValue !== null) {\r\n return `${t(translations.Before)}: ${rest.MinTimeAheadPeriodValue.toFixed(\r\n 2,\r\n )}\r\n ${(t(translations.AdvancedReservation) as string).replace(\r\n '{0}',\r\n enumToEntityArray(MinTimeAheadPeriodTypes).filter(\r\n f => f.Id === rest.MinTimeAheadPeriodType,\r\n )[0].Name,\r\n )}`;\r\n } else if (rest.MinTimeAheadMinutesSinceMidnight !== null) {\r\n return `${t(translations.OnTheSameDay)}: ${(t(\r\n translations.ToBeBookedBy,\r\n ) as string).replace(\r\n '{0}',\r\n dateUtils.dateFnsUtils.format(\r\n new Date(0, 0, 0, 0, rest.MinTimeAheadMinutesSinceMidnight),\r\n dateUtils.DateIOFormats.fullDateTime24h,\r\n ),\r\n )}`;\r\n } else {\r\n return '';\r\n }\r\n };\r\n const getStatus = React.useCallback(\r\n (asset: IAssetDto) => {\r\n let validRender =\r\n !!userRestrictions &&\r\n userRestrictions.PrerequisiteTrainingsIndicators.length > 0 &&\r\n userRestrictions.PrerequisiteTrainingsIndicators.some(\r\n f => f.Id === asset.ServiceId,\r\n );\r\n if (!!userRestrictions && validRender) {\r\n let found = userRestrictions.PrerequisiteTrainingsIndicators.find(\r\n f => f.Id === asset.ServiceId,\r\n );\r\n let status = enumToEntityArray(TrainingStatus).find(\r\n f => f.Id === found?.Status,\r\n )?.Name;\r\n let statusName = `${status} ${\r\n asset.PrerequisiteFor === 1\r\n ? ' - ( ' + t(translations.CoreWideRequirement) + ' )'\r\n : ''\r\n }`;\r\n return {\r\n StatusName: statusName,\r\n Status: found?.Status,\r\n };\r\n }\r\n return undefined;\r\n },\r\n [t, userRestrictions],\r\n );\r\n const prerequisites: Prerequisites[] = React.useMemo(() => {\r\n let results: Prerequisites[] = [];\r\n if (!!restrictions && restrictions.PrerequisiteEquipments.length > 0) {\r\n results = restrictions.PrerequisiteEquipments.map(preq => {\r\n let usrrest = getStatus(preq);\r\n return {\r\n Id: preq.Id,\r\n Name: preq.Name,\r\n ServiceId: preq.ServiceId,\r\n ImageName: preq.Image,\r\n StatusId: usrrest?.Status,\r\n StatusName: usrrest?.StatusName,\r\n } as Prerequisites;\r\n });\r\n }\r\n return results;\r\n }, [getStatus, restrictions]);\r\n\r\n // const PrerequisiteWithStatus = ({ asset }: { asset: IAssetDto }) => {\r\n // let validRender =\r\n // !!userRestrictions &&\r\n // userRestrictions.PrerequisiteTrainingsIndicators.length > 0 &&\r\n // userRestrictions.PrerequisiteTrainingsIndicators.some(\r\n // f => f.Id === asset.ServiceId,\r\n // );\r\n\r\n // if (!!userRestrictions && validRender) {\r\n // let found = userRestrictions.PrerequisiteTrainingsIndicators.find(\r\n // f => f.Id === asset.ServiceId,\r\n // );\r\n // let status = enumToEntityArray(TrainingStatus).find(\r\n // f => f.Id === found?.Status,\r\n // )?.Name;\r\n // let statusName = `${status} - ${\r\n // asset.PrerequisiteFor === 1\r\n // ? '( ' + t(translations.CoreWideRequirement) + ' )'\r\n // : ''\r\n // }`;\r\n // return (\r\n // \r\n // {cliTruncate(statusName, 25, { position: 'end' })}\r\n // \r\n // );\r\n // } else {\r\n // return <>;\r\n // }\r\n // };\r\n const handleCloselClick = React.useCallback(() => {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n } as SidePanelCloseState);\r\n }, [closePanel, isCover, useSidePanel]);\r\n const userOnChange = (value: Entity | null) => {\r\n setSelectedUser(value as IUserFilterDto);\r\n if (value === null) {\r\n setUserRestrictions(undefined);\r\n } else {\r\n setUserRestrictions(\r\n fetchUserRestrictionsPromise(value, equipmentId || -1),\r\n );\r\n }\r\n };\r\n const assetOnChange = (value: IAssetDto | null) => {\r\n setSelectedService(value);\r\n setRestriction(fetchRestrictionsPromise(value?.ServiceId ?? undefined));\r\n setSelectedUser(null);\r\n setUserRestrictions(undefined);\r\n };\r\n React.useEffect(() => {\r\n if (fetchAssetState.status !== 'pending') {\r\n setEquipmentId(selectedService?.ServiceId ?? undefined);\r\n setEquipmentGroupId(selectedService?.ServiceGroupId ?? undefined);\r\n }\r\n return () => {};\r\n }, [\r\n fetchAssetState.status,\r\n selectedService?.ServiceGroupId,\r\n selectedService?.ServiceId,\r\n ]);\r\n // const minReservationGap = (rest: IRestrictions): string => {\r\n // let gaps = [\r\n // rest.MinReservationOrderGap,\r\n // rest.UserReservationGap,\r\n // rest.UserGroupReservationGap,\r\n // rest.InstituteReservationGap,\r\n // ];\r\n // if (gaps.filter(g => g > 0).length > 0) {\r\n // return Math.min(...gaps.filter(g => g > 0)).toString();\r\n // }\r\n // return '';\r\n // };\r\n const RenderContent = () => {\r\n return !!restrictions ? (\r\n \r\n \r\n \r\n {isAdmin && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {prerequisites.length > 0 && (\r\n \r\n \r\n \r\n {t(translations.PrerequisiteTrainings)}\r\n \r\n\r\n \r\n {prerequisites.map(item => {\r\n return (\r\n \r\n {item.StatusName}\r\n \r\n //\r\n )\r\n }\r\n imageSrc={getAssetImageThumbSrc(\r\n item.ImageName || null,\r\n 'horizontal',\r\n IsAssetImageExist(\r\n appSettings,\r\n item.ImageName || null,\r\n 'horizontal',\r\n ),\r\n )}\r\n useImage={true}\r\n // status={\r\n // item.StatusId === undefined\r\n // ? 'info'\r\n // : item.StatusId === TrainingStatus.Passed\r\n // ? 'success'\r\n // : item.StatusId === TrainingStatus.Expired\r\n // ? 'warning'\r\n // : 'error'\r\n // }\r\n maxContentHeight={40}\r\n useButtons={false}\r\n primaryAction={() =>\r\n openAsset(\r\n {\r\n Id: item.Id,\r\n serviceId: item.ServiceId,\r\n useSidePanel: useSidePanel,\r\n },\r\n openPanel,\r\n )\r\n }\r\n backStyle=\"white\"\r\n />\r\n // \r\n // openAsset(item)}\r\n // variant=\"default\"\r\n // size=\"small\"\r\n // label={item.Name}\r\n // key={item.Id}\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 {restrictions.ForceTutoring === true && (\r\n \r\n {t(translations.ApprovalRequired)}\r\n ) : (\r\n \r\n \r\n \r\n {t(translations.PreApproved) as string}\r\n \r\n \r\n \r\n )\r\n }\r\n />\r\n \r\n )}\r\n\r\n {restrictions.MinReservationOrder !== null &&\r\n restrictions.MinReservationOrder > 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n {restrictions.MaxReservationOrder !== null &&\r\n restrictions.MaxReservationOrder > 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n {restrictions.ReservationMinimumGap !== null &&\r\n restrictions.ReservationMinimumGap > 0 && (\r\n \r\n \r\n \r\n )}\r\n {restrictions.CarryOverTimeSlotTypeId !== null &&\r\n restrictions.CarryOverTimeSlotGap != null && (\r\n \r\n \r\n \r\n )}\r\n {(restrictions.MinTimeAheadPeriodValue !== null ||\r\n restrictions.MinTimeAheadMinutesSinceMidnight != null) && (\r\n \r\n \r\n \r\n )}\r\n {restrictions.RestrictionsOverview !== null &&\r\n restrictions.RestrictionsOverview !== '' && (\r\n \r\n \r\n \r\n )}\r\n {restrictions.BypassQuotas === true && (\r\n \r\n }\r\n />\r\n \r\n )}\r\n {restrictions.BypassUserQuotasAndGaps &&\r\n restrictions.BypassUserQuotasAndGapsD !== null &&\r\n restrictions.BypassUserQuotasAndGapsD > 0 && (\r\n \r\n \r\n \r\n )}\r\n {restrictions.BypassMinResDurationD &&\r\n restrictions.BypassMinResDurationT !== null &&\r\n restrictions.BypassMinResDurationT > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n {!isAdmin && restrictions.LimitlessReservationAllowed !== true && (\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 functionallity hidden by the task https://prog4biz.atlassian.net/browse/BKT-6141 */}\r\n {/* {(!showTable || (useSidePanel && !sidePanelExpanded)) && (\r\n \r\n \r\n \r\n }\r\n >\r\n {' '}\r\n \r\n )}\r\n {showTable && (sidePanelExpanded || !useSidePanel) && (\r\n \r\n )} */}\r\n \r\n ) : (\r\n {}\r\n );\r\n };\r\n return withNoWrapper ? (\r\n \r\n ) : (\r\n \r\n {restrictions ? (\r\n \r\n ) : (\r\n <>{t(translations.err_Equipment_NotFound)}\r\n )}\r\n \r\n }\r\n closeSidePanel={handleCloselClick}\r\n //rightTopActions={data?.AmAdmin ? [EditButton] : undefined}\r\n isCover={isCover} //&& !showTable\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n />\r\n );\r\n}\r\n","/**\r\n * This file is only need if you want to extract messages into JSON files in locales folder\r\n * AND if you are also using the object syntax instead of string syntax. \\\r\n * Check the documentation section i18n for details\r\n */\r\nimport { translations } from 'locales/translations';\r\nimport { _t } from 'utils/messages';\r\n\r\nexport const messages = {\r\n prog4biz: () => _t(translations.Prog4biz),\r\n bookitlabCopyrightNotice: () =>\r\n _t(translations.BookitlabCopyrightNoticeTitle),\r\n softwareBy: () => _t(translations.SoftwareBy),\r\n systemTime: () => _t(translations.SystemTime),\r\n lastCodeUpdate: () => _t(translations.LastCodeUpdate),\r\n termOfUse: () => _t(translations.TermsOfUse),\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const CopyrightSection = styled('div')(({ theme }) => ({\r\n '&.copyrightSection': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n gap: 8,\r\n alignSelf: 'stretch',\r\n width: 'calc(100% - 16px)',\r\n padding: '0px 16px 0px 32px',\r\n [theme.breakpoints.down('sm')]: {\r\n flexDirection: 'column',\r\n justifyContent: 'flex-start',\r\n padding: '0px 0px',\r\n width: '100%',\r\n gap: 4,\r\n },\r\n },\r\n}));\r\n","/**\r\n *\r\n * Copyright\r\n *\r\n */\r\nimport { useTheme } from '@material-ui/core';\r\nimport {\r\n selectAppTimeZone,\r\n selectLastCodeUpdate,\r\n selectWebVersion,\r\n} from 'app/slice/selectors';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { Link } from '../ExternalLink';\r\nimport BasicTypography from '../Typography/BasicTypography';\r\nimport { messages } from './messages';\r\nimport { CopyrightSection } from './styled';\r\n\r\nexport interface CopyrightProps {\r\n disableVersionOnMobile?: boolean;\r\n}\r\n\r\nexport function Copyright(props: CopyrightProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const webVersion = useSelector(selectWebVersion);\r\n const lastUpdate = useSelector(selectLastCodeUpdate);\r\n const appTimeZone = useSelector(selectAppTimeZone);\r\n const appOffset = appTimeZone?.TimezoneOffsetMinutes ?? 0;\r\n const getOffset = () => {\r\n const currentDateOffset = new Date().getTimezoneOffset();\r\n const appNow = dateUtils.addMinutes(\r\n new Date(),\r\n appOffset + currentDateOffset,\r\n );\r\n return appNow;\r\n };\r\n const [appNow, setAppNow] = React.useState(getOffset());\r\n React.useEffect(() => {\r\n const interval = setInterval(() => {\r\n // const currentDateOffset = new Date().getTimezoneOffset();\r\n // const appNow = dateUtils.addMinutes(\r\n // new Date(),\r\n // appOffset + currentDateOffset,\r\n // );\r\n setAppNow(getOffset());\r\n }, 60000);\r\n\r\n return () => {\r\n clearInterval(interval);\r\n };\r\n });\r\n const theme = useTheme();\r\n return (\r\n \r\n \r\n \r\n {t(messages.bookitlabCopyrightNotice())}\r\n \r\n <>{` `}\r\n {t(messages.softwareBy())}\r\n <>{` `}\r\n \r\n {t(messages.prog4biz())}\r\n {' '}\r\n {new Date().getFullYear()}\r\n {'.'}\r\n \r\n {!props.disableVersionOnMobile && (\r\n \r\n \r\n {`v${webVersion}; ` || ''}{' '}\r\n {` ${t(messages.systemTime())}: ${dateUtils.longDateTimeFormat(\r\n appNow,\r\n )};`}{' '}\r\n {lastUpdate &&\r\n `${t(messages.lastCodeUpdate())}: ${dateUtils.longDateTimeFormat(\r\n lastUpdate,\r\n )};`}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {t(messages.termOfUse())}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.messagesState || initialState;\r\n\r\nexport const selectMessages = createSelector([selectSlice], state =>\r\n state.messages.filter(\r\n (val, ind, arr) => arr.findIndex(f => f.key === val.key) === ind,\r\n ),\r\n);\r\n\r\nexport const selectMessagesAlreadyExist = createSelector(\r\n [selectSlice],\r\n state => state.initialized,\r\n);\r\n","import { ReservationQueryStringParameters } from './slice/types';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { useCallback } from 'react';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\n\r\nexport const useOpenReservationSidePanel = () => {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n return useCallback(\r\n (params: ReservationQueryStringParameters, useSwitchButtons?: boolean) => {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.ReservationDetails,\r\n props: {\r\n useSidePanel: true,\r\n queryParams: params,\r\n useSwitchButtons: useSwitchButtons,\r\n },\r\n }),\r\n );\r\n },\r\n [actions, dispatch],\r\n );\r\n};\r\n","import parse from 'html-react-parser';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { OptionsObject, SnackbarProvider, useSnackbar } from 'notistack';\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useMessagesSlice } from './slice';\r\nimport { selectMessages, selectMessagesAlreadyExist } from './slice/selector';\r\nimport {\r\n CalendarMessageProps,\r\n LoanDesk,\r\n Message,\r\n messageType,\r\n StartedReservation,\r\n UsageReservation,\r\n} from './slice/type';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Button } from '../BasicButtons/Button';\r\nimport { AssetLink } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\r\nimport { createStyles, Link, makeStyles, Theme } from '@material-ui/core';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { Box } from '../basic/Wrappers/Box';\r\nimport ButtonLink from '../BasicLinks/ButtonLink';\r\nimport { useOpenReservationSidePanel } from 'app/pages/ReservationDetails/Details/useOpenReservationSidePanel';\r\nimport { H3 } from '../Typography';\r\nimport { Entity } from 'types/common';\r\nimport { dashboardKey } from '../Dashboard/slice/types';\r\nimport { DialogConfirm } from '../DialogConfirm';\r\n\r\nconst useMessageStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n zIndex: theme.zIndex.modal,\r\n },\r\n item: {\r\n backgroundColor: theme.palette.background.default + ' !important',\r\n color: theme.palette.text.primary + ' !important',\r\n border: '1px solid ' + theme.palette.info.main,\r\n minWidth: 'auto',\r\n },\r\n base: {\r\n '& > div': {\r\n zIndex: theme.zIndex.modal - 1,\r\n },\r\n //this accesses the div that can effect the justify content.\r\n //if notistack is updated, it will likely not be needed as the bug has been fixed in newer versions.\r\n '&>div>div>div': {\r\n justifyContent: 'flex-end',\r\n },\r\n },\r\n }),\r\n);\r\nconst MaxMessage = 3;\r\nconst closeAllKey = 'closeAllMessagesKey';\r\n\r\nexport type pageNames = dashboardKey | 'calendar' | 'assetDetails';\r\nexport const pageToType: Partial> = {\r\n calendar: [messageType.calendar],\r\n assetDetails: [messageType.reservationStarted, messageType.usageReservation],\r\n};\r\nexport interface MessageProps {\r\n pageName: pageNames;\r\n selectedEquipment?: Entity[];\r\n secondaryPage?: boolean;\r\n}\r\n\r\nexport const Messages = ({ secondaryPage, ...props }: MessageProps) => {\r\n const classes = useMessageStyles();\r\n const alreadyExists = useSelector(selectMessagesAlreadyExist);\r\n\r\n return (\r\n \r\n \r\n 1}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nconst MessagesChildren = (props: MessageProps) => {\r\n const dispatch = useDispatch();\r\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\r\n const { actions } = useMessagesSlice();\r\n const allMessages = useSelector(selectMessages);\r\n const classes = useStyles();\r\n const messages = useMemo(() => {\r\n const types = pageToType[props.pageName];\r\n if (types === undefined) return allMessages;\r\n return allMessages.filter(m => types.includes(m.type));\r\n }, [allMessages, props.pageName]);\r\n\r\n useEffectOnMount(() => {\r\n if (props.secondaryPage) return;\r\n dispatch(actions.init(props));\r\n return () => {\r\n dispatch(actions.clear());\r\n };\r\n });\r\n useEffect(() => {\r\n if (props.secondaryPage) {\r\n closeSnackbar();\r\n return;\r\n }\r\n if (messages.length > 1) {\r\n const closeAllOptions: OptionsObject = {\r\n persist: true,\r\n key: closeAllKey,\r\n };\r\n\r\n enqueueSnackbar(\r\n {\r\n closeSnackbar();\r\n dispatch(actions.clear());\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n ,\r\n closeAllOptions,\r\n );\r\n } else {\r\n closeSnackbar(closeAllKey);\r\n }\r\n messages.slice(0, MaxMessage).forEach(m => {\r\n const close = () => {\r\n dispatch(actions.remove(m.key));\r\n closeSnackbar(m.key);\r\n };\r\n const options: OptionsObject = {\r\n persist: true,\r\n key: m.key,\r\n action: key => (\r\n \r\n {/* {m.type === messageType.removableAnnouncment && (\r\n {\r\n dispatch(actions.remove(key));\r\n closeSnackbar(key);\r\n dispatch(\r\n actions.gotIt(\r\n AllowedSettings[AllowedSettings.DashboardAnnouncement],\r\n ),\r\n );\r\n }}\r\n />\r\n )} */}\r\n \r\n \r\n ),\r\n };\r\n\r\n enqueueSnackbar(\r\n <>\r\n \r\n \r\n \r\n <>\r\n {m.type === messageType.removableAnnouncment && (\r\n {\r\n dispatch(actions.remove(m.key));\r\n closeSnackbar(m.key);\r\n dispatch(\r\n actions.gotIt(\r\n AllowedSettings[AllowedSettings.DashboardAnnouncement],\r\n ),\r\n );\r\n }}\r\n />\r\n )}\r\n \r\n ,\r\n options,\r\n );\r\n });\r\n }, [\r\n actions,\r\n classes,\r\n closeSnackbar,\r\n dispatch,\r\n enqueueSnackbar,\r\n messages,\r\n props.secondaryPage,\r\n ]);\r\n return null;\r\n};\r\n\r\nconst CloseAll = () => {\r\n const { t } = useTranslation();\r\n return <>{t(translations.CloseAll)};\r\n};\r\n\r\nconst GotIt = ({ onClick }: { onClick: () => void }) => {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst RenderMessge = ({\r\n message,\r\n close,\r\n}: withClose<{\r\n message: Message;\r\n}>) => {\r\n switch (message.type) {\r\n case messageType.Announcment:\r\n case messageType.removableAnnouncment:\r\n return ;\r\n case messageType.reservationStarted:\r\n const props = message.props as StartedReservation;\r\n return ;\r\n case messageType.usageReservation:\r\n return (\r\n \r\n );\r\n case messageType.loadDesk:\r\n return ;\r\n case messageType.calendar:\r\n return ;\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\ntype withClose = T & { close: () => void };\r\n\r\nconst ReservationStartedMessage = ({\r\n close,\r\n ...props\r\n}: withClose) => {\r\n const { t } = useTranslation();\r\n const openSidePanel = useOpenReservationSidePanel();\r\n const assets = (\r\n \r\n {props.Asset.Name}\r\n \r\n );\r\n if (props.AllowUsersToShortenReservations && props.AllUsagesEnded) {\r\n return (\r\n <>\r\n {assets} {t(translations.InstrumentStillReservered)}\r\n {\r\n openSidePanel({ id: '' + props.Id });\r\n close();\r\n }}\r\n >\r\n {t(translations.ReleaseUnusedReservation)}\r\n \r\n \r\n );\r\n }\r\n let messages: React.ReactNode = '';\r\n if (props.AllowUsersToShortenReservations) {\r\n const message = t(translations.YouHaveOngoingReservations);\r\n messages = message\r\n .split('{0}')\r\n .map((f, i) => (\r\n \r\n {f} \r\n \r\n ))\r\n .reduce((prev, curr) => [prev, assets, curr]);\r\n } else if (props.AllowExtendReservation || props.AllowModification) {\r\n const message = t(translations.ReservationStarted);\r\n const link = (\r\n \r\n openSidePanel({ id: '' + props.Id })}\r\n >\r\n {props.Id}\r\n \r\n \r\n );\r\n messages = message\r\n .split('{0}')\r\n .map((m, idx) => (\r\n \r\n {' '}\r\n {m\r\n .split('{1}')\r\n .map((f, i) => (\r\n \r\n {f} \r\n \r\n ))\r\n .reduce((prev, curr) => [prev, assets, curr])}\r\n \r\n ))\r\n .reduce((prev, curr) => [prev, link, curr]);\r\n }\r\n const canEdit =\r\n props.AllowUsersToShortenReservations ||\r\n props.AllowModification ||\r\n props.AllowExtendReservation;\r\n return (\r\n <>\r\n {messages}\r\n {canEdit && (\r\n {\r\n openSidePanel({ id: '' + props.Id });\r\n close();\r\n }}\r\n >\r\n {t(translations.UpdateOngoingReservations)}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst UsageReservationMessage = ({\r\n close,\r\n ...props\r\n}: withClose) => {\r\n const { t } = useTranslation();\r\n const assets = (\r\n \r\n {props.Name}\r\n \r\n );\r\n const message = t(translations.IpRelay_reservationTimeForInstrument);\r\n const messages = message\r\n .split('{0}')\r\n .map((f, i) => (\r\n {f} \r\n ))\r\n .reduce((prev, curr) => [prev, assets, curr]);\r\n return (\r\n <>\r\n {messages}\r\n \r\n {t(translations.IpRelay_LinkToUsage)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst CalendarMessage = (props: CalendarMessageProps) => {\r\n return (\r\n \r\n {props.Body && parse(props.Body)}\r\n \r\n );\r\n};\r\n\r\nconst LoanDeskMessage = (props: LoanDesk) => {\r\n const { t } = useTranslation();\r\n const openSidePanel = useOpenReservationSidePanel();\r\n const message = t(translations.ReservationStartedMessage_LoanDesk);\r\n const link = (\r\n \r\n openSidePanel({ id: '' + props.Id })}>\r\n {props.Id}\r\n \r\n \r\n );\r\n const asset = (\r\n \r\n \r\n {props.AssetDetails.Name}\r\n \r\n \r\n );\r\n const messages = message\r\n .split('{0}')\r\n .map(m =>\r\n m\r\n .split('{1}')\r\n .map((f, i) => (\r\n {f} \r\n ))\r\n .reduce((prev, curr) => [prev, asset, curr]),\r\n )\r\n .reduce((prev, curr) => [prev, link, curr]);\r\n return <>{messages};\r\n};\r\n\r\nconst WithSpace = ({ children }: React.PropsWithChildren<{}>) => {\r\n return (\r\n <>\r\n  \r\n {children}\r\n  \r\n \r\n );\r\n};\r\n\r\nconst Truncicated = ({\r\n value,\r\n title,\r\n children,\r\n}: React.PropsWithChildren<{ value: string; title: string | null }>) => {\r\n const classes = useStyles();\r\n const height = useMemo(() => getSize(value, title, classes.root), [\r\n classes.root,\r\n title,\r\n value,\r\n ]);\r\n const parsed = parse(value);\r\n const moreTitle = useMemo(() => MoreTitle(title), [title]);\r\n if (height > 140) {\r\n return (\r\n {parsed}}>\r\n <>\r\n \r\n \r\n \r\n {children ?? parsed}\r\n \r\n {children ?? parsed}\r\n \r\n \r\n \r\n {children ?? parsed}\r\n \r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n \r\n {children ?? parsed}\r\n \r\n );\r\n};\r\n\r\nconst getSize = (value: string, title: string | null, style: string) => {\r\n const div = document.createElement('div');\r\n div.classList.add(style);\r\n if (title !== null) {\r\n const h3 = document.createElement('h3');\r\n h3.innerText = title;\r\n div.appendChild(h3);\r\n }\r\n const inner = document.createElement('div');\r\n inner.innerHTML = value;\r\n div.appendChild(inner);\r\n document.body.appendChild(div);\r\n const height = div.clientHeight;\r\n div.parentNode?.removeChild(div);\r\n return height;\r\n};\r\n\r\nconst MoreLink = ({ children }: React.PropsWithChildren<{}>) => {\r\n return {children};\r\n};\r\n\r\nconst TitleIfExists = ({ title }: { title: string | null }) => {\r\n return (title ?? '') === '' ? null :

    {title}

    ;\r\n};\r\n\r\nconst MoreTitle = (title: string | null): MorePopUpLink => {\r\n return ({ onClick }) => {\r\n return (title ?? '') === '' ? null : (\r\n

    \r\n {title}\r\n

    \r\n );\r\n };\r\n};\r\n\r\nconst MoreButton: MorePopUpLink = ({ onClick }) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\ntype MorePopUpLink = React.FC<{ onClick: () => void }>;\r\n\r\nconst MorePopUp = ({\r\n Link,\r\n children,\r\n}: React.PropsWithChildren<{\r\n Link: MorePopUpLink;\r\n}>) => {\r\n const [open, setOpen] = useState(false);\r\n const close = () => setOpen(false);\r\n const { t } = useTranslation();\r\n return (\r\n <>\r\n setOpen(true)} />\r\n \r\n \r\n );\r\n};\r\n\r\nconst useStyles = makeStyles(theme =>\r\n createStyles({\r\n root: {\r\n maxWidth: '380px',\r\n maxHeight: '180px',\r\n zIndex: theme.zIndex.drawer,\r\n },\r\n truncate: {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n height: '150px',\r\n display: '-webkit-box',\r\n WebkitLineClamp: 5,\r\n WebkitBoxOrient: 'vertical',\r\n },\r\n }),\r\n);\r\n","/**\r\n *\r\n * BasicDialogActions\r\n *\r\n */\r\nimport {\r\n Box,\r\n createStyles,\r\n DialogActions as MuiDialogActions,\r\n makeStyles,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { DialogActionsRenderer } from './DialogActionsRender';\r\n\r\nconst actionsStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n justifyContent: 'space-between',\r\n margin: 0,\r\n padding: theme.spacing(3, 4),\r\n boxShadow: 'inset 0px 1px 0px #E0E5EC',\r\n },\r\n leftActions: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: 0,\r\n flexWrap: 'wrap',\r\n gap: 8,\r\n },\r\n rightActions: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n padding: '4px 16px',\r\n flexWrap: 'wrap',\r\n gap: 8,\r\n },\r\n }),\r\n);\r\nexport interface BasicDialogActionsProps {\r\n leftActions: DialogActionsRenderer[];\r\n rightActions: DialogActionsRenderer[];\r\n}\r\n\r\nexport function BasicDialogActions(props: BasicDialogActionsProps) {\r\n const { leftActions, rightActions } = props;\r\n const classes = actionsStyles();\r\n return (\r\n \r\n {leftActions.length > 0 && (\r\n \r\n {leftActions.map((item, index) => (\r\n {item()}\r\n ))}\r\n \r\n )}\r\n \r\n {rightActions.length > 0 &&\r\n rightActions.map((item, index) => {item()})}\r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * BasicDialogContentWithTitle\r\n *\r\n */\r\nimport {\r\n Box,\r\n DialogContent as MuiDialogContent,\r\n DialogContentProps as MuiDialogContentProps,\r\n LinearProgress,\r\n Theme,\r\n withStyles,\r\n} from '@material-ui/core';\r\nimport { createStyles, makeStyles } from '@material-ui/styles';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Caption, H4 } from '../Typography';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(3, 6, 2, 3),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n borderRadius: '12px 12px 0px 0px',\r\n },\r\n titleContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n },\r\n titleSubtitle: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(2),\r\n top: theme.spacing(2),\r\n color: theme.palette.grey[500],\r\n },\r\n title: {\r\n margin: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n subtitle: {},\r\n }),\r\n);\r\nexport interface TitleProps {\r\n titles: React.ReactNode;\r\n subtitle?: React.ReactNode;\r\n onClose?: () => void;\r\n processing?: boolean;\r\n disabled?: boolean;\r\n}\r\nexport interface BasicDialogContentWithTitleProps\r\n extends MuiDialogContentProps {\r\n children: React.ReactNode;\r\n}\r\nexport function BasicDialogContentWithTitle({\r\n titles,\r\n subtitle,\r\n onClose,\r\n children,\r\n processing,\r\n disabled,\r\n}: BasicDialogContentWithTitleProps & TitleProps) {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n {!!onClose ? (\r\n \r\n ) : null}\r\n

    {titles}

    \r\n {subtitle && {subtitle}}\r\n {processing && (\r\n \r\n \r\n \r\n )}\r\n
    \r\n {children}\r\n
    \r\n );\r\n}\r\nconst DialogContent = withStyles((theme: Theme) => ({\r\n root: {\r\n padding: theme.spacing(4),\r\n borderTop: 'unset',\r\n '&:first-child': {\r\n paddingTop: theme.spacing(4),\r\n },\r\n },\r\n}))(MuiDialogContent);\r\n","/**\r\n *\r\n * BasicDialog\r\n *\r\n */\r\nimport {\r\n createStyles,\r\n Dialog,\r\n DialogProps,\r\n makeStyles,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { BasicDialogActions } from './BasicDialogActions';\r\nimport { BasicDialogContentWithTitle } from './BasicDialogContentWithTitle';\r\nimport { DialogActionsRenderer } from './DialogActionsRender';\r\n\r\nexport interface BasicDialogProps extends Omit {\r\n id: string;\r\n title: React.ReactNode;\r\n subtitle?: React.ReactNode;\r\n body: React.ReactNode;\r\n processing?: boolean;\r\n isopen: boolean;\r\n leftActions: DialogActionsRenderer[];\r\n rightActions: DialogActionsRenderer[];\r\n onClose?: () => void;\r\n onCancel?: () => void;\r\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function BasicDialog({\r\n id,\r\n title,\r\n body,\r\n isopen,\r\n leftActions,\r\n rightActions,\r\n maxWidth,\r\n subtitle,\r\n processing,\r\n disabled,\r\n ...props\r\n}: BasicDialogProps) {\r\n const [open, setOpen] = React.useState(isopen);\r\n React.useEffect(() => {\r\n setOpen(isopen);\r\n }, [isopen]);\r\n const classes = dialogStyles();\r\n // const handleClose = () => {\r\n // setOpen(false);\r\n // if (onClose) {\r\n // onClose();\r\n // }\r\n // };\r\n // const defaultActions: DialogActionsRenderer[] = [\r\n // () => (\r\n // \r\n // ),\r\n // ];\r\n // actions.forEach(element => {\r\n // defaultActions.push(element);\r\n // });\r\n\r\n return (\r\n \r\n {/* \r\n {title}\r\n \r\n {body} */}\r\n \r\n {body}\r\n \r\n element)}\r\n rightActions={rightActions.map(element => element)}\r\n />\r\n \r\n );\r\n}\r\nconst dialogStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n paperWidthXs: {\r\n width: '360px',\r\n },\r\n }),\r\n);\r\n","import { AssetBarcodeScanParameters } from 'app/pages/AssetsInventory/Details/slice/types';\r\nimport { httpClient } from './HttpClient';\r\n\r\nconst url = '/api/odata/v4/BarcodeScanLog';\r\nexport const BarcodeScanApi = {\r\n scanBarcode: (payload: AssetBarcodeScanParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n return httpClient.post(`${url}/BarcodeScan`, data);\r\n },\r\n logNoRoomAccess: (payload: number) => {\r\n const data = {\r\n roomId: payload,\r\n };\r\n return httpClient.post(`${url}/LogNoRoomAccess`, data);\r\n },\r\n logRoomScan: (payload: number) => {\r\n const data = {\r\n roomId: payload,\r\n };\r\n return httpClient.post(`${url}/LogRoomScann`, data);\r\n },\r\n logLocationScan: (roomId: number, locationId: number) => {\r\n const data = {\r\n roomId: roomId,\r\n locationId: locationId,\r\n };\r\n return httpClient.post(`${url}/LogLocationScann`, data);\r\n },\r\n logSubLocationScan: (\r\n roomId: number,\r\n locationId: number,\r\n sublocationId: number,\r\n ) => {\r\n const data = {\r\n roomId: roomId,\r\n locationId: locationId,\r\n sublocationId: sublocationId,\r\n };\r\n return httpClient.post(`${url}/LogSubLocationScann`, data);\r\n },\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { ILocationListDto } from 'api/odata/generated/entities/ILocationListDto';\r\nimport { IRoomDto } from 'api/odata/generated/entities/IRoomDto';\r\nimport { ISubLocationListDto } from 'api/odata/generated/entities/ISubLocationListDto';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport {\r\n selectAppSettings,\r\n selectBarcodeScanTarget,\r\n selectGlobalSetting,\r\n} from 'app/slice/selectors';\r\nimport { parseBarcode, ScanTarget, ScanTemplateResult } from 'app/slice/types';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { BARCODE_SCANNED } from 'react-usb-barcode-scanner';\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { assetInventoryActions as actions } from '.';\r\nimport {\r\n selectLocationSelected,\r\n selectRoomSelected,\r\n selectScanProcessing,\r\n selectSubLocationSelected,\r\n} from './selectors';\r\nimport { AssetBarcodeScanParameters, AssetBarcodeScanResult } from './types';\r\nimport { BarcodeScanApi as api } from 'api/BarcodeScanApi';\r\n\r\nfunction* doSetSelectedRoom(action: PayloadAction) {\r\n yield put(actions.setSelectedRoom_Success(action.payload));\r\n}\r\nfunction* doSetSelectedLocation(\r\n action: PayloadAction,\r\n) {\r\n yield put(actions.setSelectedLocation_Success(action.payload));\r\n}\r\nfunction* doSetSelectedSubLocation(\r\n action: PayloadAction,\r\n) {\r\n yield put(actions.setSelectedSubLocation_Success(action.payload));\r\n}\r\nfunction* doBarcodeScan(action: PayloadAction<{ data: string }>) {\r\n // const MIN_LENGTH_DEFAULT = 6;\r\n // const minBarcodeLengthString: string | undefined = yield select(state =>\r\n // selectGlobalSetting(state, AllowedSettings.MinBarcodeLength),\r\n // );\r\n const minBarcodeAssetLengthString: string | undefined = yield select(state =>\r\n selectGlobalSetting(state, AllowedSettings.QRCodeBaseLength),\r\n );\r\n // const MinBarcodeLength =\r\n // tryParseInt(minBarcodeLengthString) ?? MIN_LENGTH_DEFAULT;\r\n const MinAssetQRLength = tryParseInt(minBarcodeAssetLengthString) ?? 0;\r\n // prevent accidental barcode detection on fast user input\r\n if (action.payload.data.length < MinAssetQRLength) {\r\n return;\r\n }\r\n const scannTarget: ScanTarget | undefined = yield select(\r\n selectBarcodeScanTarget,\r\n );\r\n if (scannTarget === undefined || scannTarget !== ScanTarget.Inventory) {\r\n return;\r\n }\r\n const isScanning = yield select(selectScanProcessing);\r\n if (isScanning === true) {\r\n return;\r\n }\r\n yield put(actions.setScanProcessing(true));\r\n const appSettings: AppSettings = yield select(selectAppSettings);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'info',\r\n message:\r\n i18next.t(translations.BarcodeScanModalBody) +\r\n ' ' +\r\n action.payload.data,\r\n }),\r\n );\r\n try {\r\n const scanResult = parseBarcode(action.payload.data, appSettings);\r\n if (scanResult === undefined) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: (i18next.t(\r\n translations.BarcodeNotFoundEx,\r\n ) as string).replace('{{barcode}}', action.payload.data),\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n } else {\r\n const room: IRoomDto | null = yield select(selectRoomSelected);\r\n const location: ILocationListDto | null = yield select(\r\n selectLocationSelected,\r\n );\r\n const subLocation: ISubLocationListDto | null = yield select(\r\n selectSubLocationSelected,\r\n );\r\n // in case when barcode is entered manually\r\n if (\r\n scanResult.type === ScanTemplateResult.Internal ||\r\n scanResult.type === ScanTemplateResult.Asset\r\n ) {\r\n let params = {\r\n Barcode: scanResult.InternalCode ?? '',\r\n RoomId: room?.Id,\r\n LocationId: location?.Id,\r\n SubLocationId: subLocation?.Id,\r\n } as AssetBarcodeScanParameters;\r\n const result = yield call(api.scanBarcode, params);\r\n let response = result as AssetBarcodeScanResult;\r\n if (response.SuccessMessages.length > 0) {\r\n if (!!response.RoomDetails) {\r\n if (room !== null && room !== undefined) {\r\n if (room.Id !== response.RoomDetails.Id) {\r\n yield put(\r\n actions.setSelectedRoom_Success(response.RoomDetails),\r\n );\r\n yield put(actions.setSelectedLocation_Success(null));\r\n yield put(actions.setSelectedSubLocation_Success(null));\r\n }\r\n } else {\r\n yield put(actions.setSelectedRoom_Success(response.RoomDetails));\r\n yield put(actions.setSelectedLocation_Success(null));\r\n yield put(actions.setSelectedSubLocation_Success(null));\r\n }\r\n }\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: response.SuccessMessages[0],\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_Success());\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: response.ErrorMessages[0],\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n }\r\n } else if (scanResult.type === ScanTemplateResult.Room) {\r\n if (\r\n room !== null &&\r\n room !== undefined &&\r\n room.Id === tryParseInt(scanResult.RoomId)\r\n ) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'warning',\r\n message: `Room: ${room.Name} already selected`,\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n } else {\r\n // const roomData = yield call(\r\n // initRoomData,\r\n // scanResult.RoomId,\r\n // undefined,\r\n // undefined,\r\n // [\r\n // 'Id',\r\n // 'Name',\r\n // 'AreaId',\r\n // 'Areaname',\r\n // 'Barcode',\r\n // 'BuildingDescription',\r\n // 'BuildingId',\r\n // 'BuildingName',\r\n // 'Description',\r\n // 'Floor',\r\n // 'CampusId',\r\n // 'CampusName',\r\n // ],\r\n // );\r\n if (scanResult.RoomId !== undefined) {\r\n const roomResult = yield call(\r\n api.logRoomScan,\r\n parseInt(scanResult.RoomId),\r\n );\r\n let response = roomResult as AssetBarcodeScanResult;\r\n if (response.SuccessMessages.length > 0) {\r\n if (!!response.RoomDetails) {\r\n yield put(\r\n actions.setSelectedRoom_Success(response.RoomDetails),\r\n );\r\n yield put(actions.setSelectedLocation_Success(null));\r\n yield put(actions.setSelectedSubLocation_Success(null));\r\n }\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: response.SuccessMessages[0],\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_Success());\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: response.ErrorMessages[0],\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n }\r\n // yield put(actions.setSelectedRoom_Success(roomData[0]));\r\n // yield put(actions.setSelectedLocation_Success(null));\r\n // yield put(actions.setSelectedSubLocation_Success(null));\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'success',\r\n // message: i18next.t(translations.RoomScanned),\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_Success());\r\n }\r\n }\r\n } else if (scanResult.type === ScanTemplateResult.Location) {\r\n if (\r\n location !== null &&\r\n location !== undefined &&\r\n location.Id === tryParseInt(scanResult.LocationId) &&\r\n room?.Id === tryParseInt(scanResult.RoomId)\r\n ) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'warning',\r\n message: `Location: ${location.Name} already selected`,\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n } else {\r\n if (\r\n scanResult.LocationId !== undefined &&\r\n scanResult.RoomId !== undefined\r\n ) {\r\n const roomResult = yield call(\r\n api.logLocationScan,\r\n parseInt(scanResult.RoomId),\r\n parseInt(scanResult.LocationId),\r\n );\r\n let response = roomResult as AssetBarcodeScanResult;\r\n if (response.SuccessMessages.length > 0) {\r\n if (!!response.RoomDetails && !!response.LocationDetails) {\r\n yield put(\r\n actions.setSelectedRoom_Success(response.RoomDetails),\r\n );\r\n yield put(\r\n actions.setSelectedLocation_Success(response.LocationDetails),\r\n );\r\n yield put(actions.setSelectedSubLocation_Success(null));\r\n }\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: response.SuccessMessages[0],\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_Success());\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: response.ErrorMessages[0],\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n }\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: `Scanned Location not found`,\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n }\r\n // const locationData = yield call(\r\n // initLocationData,\r\n // scanResult.LocationId,\r\n // );\r\n // let locationResults = locationData as ILocationListDto[];\r\n // if (!locationResults || locationResults.length === 0) {\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'error',\r\n // message: `Scanned Location not found`,\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_error());\r\n // } else {\r\n // let loc = locationResults[0];\r\n // if (\r\n // room === null ||\r\n // room === undefined ||\r\n // (loc.RoomId ?? 0) !== room.Id\r\n // ) {\r\n // if (loc.RoomId !== null && loc.RoomId !== undefined) {\r\n // const roomLocationData = yield call(\r\n // initRoomData,\r\n // loc.RoomId.toString(),\r\n // undefined,\r\n // undefined,\r\n // [\r\n // 'Id',\r\n // 'Name',\r\n // 'AreaId',\r\n // 'Areaname',\r\n // 'Barcode',\r\n // 'BuildingDescription',\r\n // 'BuildingId',\r\n // 'BuildingName',\r\n // 'Description',\r\n // 'Floor',\r\n // 'CampusId',\r\n // 'CampusName',\r\n // ],\r\n // );\r\n // let roomLocData = roomLocationData[0];\r\n // if (!roomLocData) {\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'error',\r\n // message: `No related Room found, Please select a Room first`,\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_error());\r\n // } else {\r\n // yield put(actions.setSelectedRoom_Success(roomLocData));\r\n // yield put(actions.setSelectedLocation_Success(loc));\r\n // yield put(actions.setSelectedSubLocation_Success(null));\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'success',\r\n // message: 'Location Scanned',\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_Success());\r\n // }\r\n // } else {\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'error',\r\n // message: `No related Room found for scanned Location, Please select a Room first`,\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_error());\r\n // }\r\n // } else {\r\n // yield put(actions.setSelectedLocation_Success(loc));\r\n // yield put(actions.setSelectedSubLocation_Success(null));\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'success',\r\n // message: 'Location Scanned',\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_Success());\r\n // }\r\n // }\r\n }\r\n } else if (scanResult.type === ScanTemplateResult.SubLocation) {\r\n if (\r\n subLocation !== null &&\r\n subLocation !== undefined &&\r\n subLocation.Id === tryParseInt(scanResult.SubLocationId) &&\r\n subLocation.LocationListId === tryParseInt(scanResult.LocationId) &&\r\n subLocation.RoomId === tryParseInt(scanResult.RoomId)\r\n ) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'warning',\r\n message: `Sub Location: ${subLocation.Name} already selected`,\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n } else {\r\n if (\r\n scanResult.SubLocationId !== undefined &&\r\n scanResult.LocationId !== undefined &&\r\n scanResult.RoomId !== undefined\r\n ) {\r\n const roomResult = yield call(\r\n api.logSubLocationScan,\r\n parseInt(scanResult.RoomId),\r\n parseInt(scanResult.LocationId),\r\n parseInt(scanResult.SubLocationId),\r\n );\r\n let response = roomResult as AssetBarcodeScanResult;\r\n if (response.SuccessMessages.length > 0) {\r\n if (\r\n !!response.RoomDetails &&\r\n !!response.LocationDetails &&\r\n !!response.SubLocationDetails\r\n ) {\r\n yield put(\r\n actions.setSelectedRoom_Success(response.RoomDetails),\r\n );\r\n yield put(\r\n actions.setSelectedLocation_Success(response.LocationDetails),\r\n );\r\n yield put(\r\n actions.setSelectedSubLocation_Success(\r\n response.SubLocationDetails,\r\n ),\r\n );\r\n }\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: response.SuccessMessages[0],\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_Success());\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: response.ErrorMessages[0],\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n }\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: `Scanned Sub Location not found`,\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n }\r\n // const subLocationData = yield call(\r\n // initSubLocationListData,\r\n // scanResult.SubLocationId,\r\n // );\r\n // let subResults = subLocationData as ISubLocationListDto[];\r\n // if (!subResults || subResults.length === 0) {\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'error',\r\n // message: `Scanned Sub Location not found`,\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_error());\r\n // } else {\r\n // let sub = subResults[0];\r\n // if (\r\n // room === null ||\r\n // room === undefined ||\r\n // (sub.RoomId ?? 0) !== room.Id\r\n // ) {\r\n // if (sub.RoomId !== null && sub.RoomId !== undefined) {\r\n // const roomSubLocData = yield call(\r\n // initRoomData,\r\n // sub.RoomId.toString(),\r\n // undefined,\r\n // undefined,\r\n // [\r\n // 'Id',\r\n // 'Name',\r\n // 'AreaId',\r\n // 'Areaname',\r\n // 'Barcode',\r\n // 'BuildingDescription',\r\n // 'BuildingId',\r\n // 'BuildingName',\r\n // 'Description',\r\n // 'Floor',\r\n // 'CampusId',\r\n // 'CampusName',\r\n // ],\r\n // );\r\n // let roomSubData = roomSubLocData[0];\r\n // if (!roomSubData) {\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'error',\r\n // message: `No related Room found, Please select a Room first`,\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_error());\r\n // } else {\r\n // const locSubData = yield call(\r\n // initLocationData,\r\n // sub.LocationListId.toString(),\r\n // );\r\n // yield put(actions.setSelectedRoom_Success(roomSubData));\r\n // yield put(actions.setSelectedLocation_Success(locSubData[0]));\r\n // yield put(actions.setSelectedSubLocation_Success(sub));\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'success',\r\n // message: 'Sub Location Scanned',\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_Success());\r\n // }\r\n // } else {\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'error',\r\n // message: `No related Room found for scanned Sub Location, Please select a Room first`,\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_error());\r\n // }\r\n // } else if (location === null || location === undefined) {\r\n // const locSubData = yield call(\r\n // initLocationData,\r\n // sub.LocationListId.toString(),\r\n // );\r\n // yield put(actions.setSelectedLocation_Success(locSubData[0]));\r\n // yield put(actions.setSelectedSubLocation_Success(sub));\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'success',\r\n // message: 'Sub Location Scanned',\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_Success());\r\n // } else {\r\n // yield put(actions.setSelectedSubLocation_Success(sub));\r\n // yield put(\r\n // appSettingsActions.addNotification({\r\n // variant: 'success',\r\n // message: 'Sub Location Scanned',\r\n // }),\r\n // );\r\n // yield put(actions.scanManualBarcode_Success());\r\n // }\r\n // }\r\n }\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: (i18next.t(\r\n translations.BarcodeNotFoundEx,\r\n ) as string).replace('{{barcode}}', action.payload.data),\r\n }),\r\n );\r\n yield put(actions.scanManualBarcode_error());\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`${action.type}`, action.payload, error);\r\n yield put(actions.scanManualBarcode_error());\r\n }\r\n}\r\nfunction* doSetNoRoomAccess() {\r\n const roomSelected: IRoomDto | null = yield select(selectRoomSelected);\r\n if (roomSelected === null || roomSelected === undefined) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: 'Please select a Room first',\r\n }),\r\n );\r\n yield put(actions.setNoRoomAccess_error());\r\n } else {\r\n const result = yield call(api.logNoRoomAccess, roomSelected.Id);\r\n let response = result as AssetBarcodeScanResult;\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: response.SuccessMessages[0],\r\n }),\r\n );\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'warning',\r\n message: response.WarningMessages[0],\r\n }),\r\n );\r\n }\r\n yield put(actions.setNoRoomAccess_success());\r\n }\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: response.ErrorMessages[0],\r\n }),\r\n );\r\n yield put(actions.setNoRoomAccess_error());\r\n }\r\n }\r\n}\r\nexport function* assetInventoryStateSaga() {\r\n yield takeLatest(\r\n actions.setSelectedSubLocation.type,\r\n doSetSelectedSubLocation,\r\n );\r\n yield takeLatest(actions.setSelectedLocation.type, doSetSelectedLocation);\r\n yield takeLatest(actions.setSelectedRoom.type, doSetSelectedRoom);\r\n yield takeLatest(BARCODE_SCANNED, doBarcodeScan);\r\n yield takeLatest(actions.scanManualBarcode, doBarcodeScan);\r\n yield takeLatest(actions.setNoRoomAccess, doSetNoRoomAccess);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { ILocationListDto } from 'api/odata/generated/entities/ILocationListDto';\r\nimport { IRoomDto } from 'api/odata/generated/entities/IRoomDto';\r\nimport { ISubLocationListDto } from 'api/odata/generated/entities/ISubLocationListDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { assetInventoryStateSaga } from './saga';\r\nimport { AssetInventoryState } from './types';\r\n\r\nexport const initialState: AssetInventoryState = {\r\n selectedRoomState: null,\r\n selectedLocationState: null,\r\n selectedSubLocationState: null,\r\n scanProcessing: undefined,\r\n noRoomAccessProcessing: undefined,\r\n logFilters: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'assetInventory',\r\n initialState,\r\n reducers: {\r\n setSelectedRoom(state, action: PayloadAction) {},\r\n setSelectedRoom_Success(state, action: PayloadAction) {\r\n state.selectedRoomState = action.payload;\r\n },\r\n setSelectedLocation(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n setSelectedLocation_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.selectedLocationState = action.payload;\r\n },\r\n setSelectedSubLocation(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n setSelectedSubLocation_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.selectedSubLocationState = action.payload;\r\n },\r\n scanManualBarcode(state, action: PayloadAction<{ data: string }>) {},\r\n scanManualBarcode_Success(state, action: PayloadAction) {\r\n state.scanProcessing = false;\r\n },\r\n scanManualBarcode_error(state, action: PayloadAction) {\r\n state.scanProcessing = false;\r\n },\r\n setNoRoomAccess(state, action: PayloadAction) {\r\n state.noRoomAccessProcessing = true;\r\n },\r\n setNoRoomAccess_success(state, action: PayloadAction) {\r\n state.noRoomAccessProcessing = false;\r\n },\r\n setNoRoomAccess_error(state, action: PayloadAction) {\r\n state.noRoomAccessProcessing = false;\r\n },\r\n setNoRoomAccessProcessing(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.noRoomAccessProcessing = action.payload;\r\n },\r\n setScanProcessing(state, action: PayloadAction) {\r\n state.scanProcessing = action.payload;\r\n },\r\n setLogFilters(\r\n state,\r\n action: PayloadAction | undefined>,\r\n ) {\r\n state.logFilters = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: assetInventoryActions } = slice;\r\n\r\nexport const useAssetInventorySlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: assetInventoryStateSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useAssetInventorySlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectGlobalServiceGroupFilter,\r\n} from 'app/slice/selectors';\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { messagesActions as actions } from '.';\r\nimport {\r\n CalendarMessageProps,\r\n LoanDesk,\r\n Message,\r\n messageType,\r\n StartedReservation,\r\n UsageReservation,\r\n} from './type';\r\nimport { odataUrlPrefix } from 'utils/url-utils';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport { MessageProps, pageNames } from '..';\r\n\r\nconst reservePrefix = 'reservationStarted_';\r\nconst usagePrefix = 'usageReservation_';\r\nconst loanPrefix = 'LoanDeskReservation_';\r\n// const announcePrefix = 'Announcment_';\r\nconst calendarprefix = 'calendar_';\r\n\r\nconst reservationStartedurl = '/api/odata/v4/ReservationStarted';\r\nconst usageReservationUrl = '/api/odata/v4/UsageReservation';\r\nconst LoanDeskReservationUrl = '/api/odata/v4/LoanDeskReservation';\r\nconst calendarUrl = odataUrlPrefix + 'CalendarMessages/Show';\r\nfunction* doInit(action: PayloadAction) {\r\n const messages: Message[] = [];\r\n const page = action.payload.pageName;\r\n const funcs = getPageMessages(page);\r\n for (let index = 0; index < funcs.length; index++) {\r\n const func = funcs[index];\r\n yield* func(messages, action.payload);\r\n }\r\n // if (page !== 'calendar') {\r\n // yield* addReservations(messages);\r\n // yield* addUsages(messages);\r\n // yield* addLoanDesks(messages);\r\n // // yield* doAnnouncement(messages);\r\n // }\r\n // yield* addCalendarMessages(messages, action.payload);\r\n yield put(actions.init_success(messages));\r\n}\r\n\r\ntype MessageGetter = (\r\n messages: Message[],\r\n props: MessageProps,\r\n) => Generator;\r\n\r\nfunction getPageMessages(pageName: pageNames): MessageGetter[] {\r\n switch (pageName) {\r\n case 'calendar':\r\n return [addCalendarMessages];\r\n case 'assetDetails':\r\n return [addReservations, addUsages];\r\n default:\r\n return [addReservations, addUsages, addLoanDesks, addCalendarMessages];\r\n }\r\n}\r\n\r\nfunction* doeRefreshReservations(_action: PayloadAction) {\r\n const messages: Message[] = [];\r\n yield* addReservations(messages);\r\n yield put(actions.init_success(messages));\r\n}\r\n\r\nfunction* addReservations(messages: Message[]) {\r\n const reservationsInValue = yield call(httpClient.get, reservationStartedurl);\r\n const reservations = reservationsInValue.value as StartedReservation[];\r\n messages.push(\r\n ...reservations.map((r, _i) => ({\r\n type: messageType.reservationStarted,\r\n props: r,\r\n key: reservePrefix + r.Id,\r\n })),\r\n );\r\n}\r\n\r\nfunction* addUsages(messages: Message[]) {\r\n const usagesInValue = yield call(httpClient.get, usageReservationUrl);\r\n const usages = usagesInValue.value as UsageReservation[];\r\n messages.push(\r\n ...usages.map((r, _i) => ({\r\n type: messageType.usageReservation,\r\n props: r,\r\n key: usagePrefix + r.Id,\r\n })),\r\n );\r\n}\r\n\r\nfunction* addLoanDesks(messages: Message[]) {\r\n const LoanDeskInValue = yield call(httpClient.get, LoanDeskReservationUrl);\r\n const LoanDesks = LoanDeskInValue.value as LoanDesk[];\r\n messages.push(\r\n ...LoanDesks.map((r, _i) => ({\r\n type: messageType.loadDesk,\r\n props: r,\r\n key: loanPrefix + r.Id,\r\n })),\r\n );\r\n}\r\n\r\nfunction* addCalendarMessages(messages: Message[], props: MessageProps) {\r\n const params: {\r\n $select: string;\r\n $filter?: string;\r\n } = { $select: 'Id,Title,Body' };\r\n const now = new Date();\r\n const groups = yield select(selectGlobalServiceGroupFilter);\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: [\r\n new Condition(\r\n 'StartDate',\r\n ODataOperators.LessThanEqual,\r\n now,\r\n ).withNull() ?? '',\r\n new Condition(\r\n 'EndDate',\r\n ODataOperators.GreaterThanEqual,\r\n now,\r\n ).withNull() ?? '',\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n groups,\r\n ).withNull() ?? '',\r\n new Condition('ShowOn', ODataOperators.Contains, props.pageName),\r\n new Condition(\r\n 'EquipmentId',\r\n ODataOperators.Includes,\r\n props.selectedEquipment,\r\n ).withNull() ?? '',\r\n ],\r\n }).toString();\r\n const calendarInValue = yield call(httpClient.get, calendarUrl, params);\r\n const calendars = calendarInValue.value as CalendarMessageProps[];\r\n messages.push(\r\n ...calendars.map(c => ({\r\n type: messageType.calendar,\r\n key: calendarprefix + c.Id,\r\n props: c,\r\n })),\r\n );\r\n}\r\n\r\n// function* doAnnouncement(messages: Message[]) {\r\n// const settings: GlobalSettings = yield select(selectglobalSettings);\r\n// const userSettings: UserProfile = yield select(selectUserProfileSettings);\r\n// if (\r\n// settings.GetBooleanByKey(AllowedSettings.ShowDashboardAnnouncement) &&\r\n// !userSettings.GetSettingByKey(\r\n// AllowedSettings[AllowedSettings.DashboardAnnouncement],\r\n// )\r\n// ) {\r\n// const announcent = settings.GetString(\r\n// AllowedSettings.DashboardAnnouncement,\r\n// );\r\n// if (!!announcent) {\r\n// messages.push({\r\n// type: messageType.removableAnnouncment,\r\n// props: announcent,\r\n// key: announcePrefix + 0,\r\n// });\r\n// }\r\n// }\r\n// const userHelp = settings.GetString(AllowedSettings.Help_Dashboard);\r\n// if (userHelp.trim() !== '') {\r\n// messages.push({\r\n// type: messageType.Announcment,\r\n// props: userHelp,\r\n// key: announcePrefix + 1,\r\n// });\r\n// }\r\n// }\r\n\r\nfunction* doGotIt(action: PayloadAction) {\r\n const authenticatedUser: AuthenticatedUser | undefined = yield select(\r\n selectAuthenticatedUser,\r\n );\r\n yield put(\r\n appSettingsActions.saveUserProfileSetting({\r\n Key: action.payload,\r\n Value: true.toString(),\r\n UserName: authenticatedUser?.Id ?? '',\r\n Enabled: true,\r\n }),\r\n );\r\n}\r\n\r\nexport function* messagesSaga() {\r\n yield takeLatest(actions.init.type, doInit);\r\n yield takeLatest(actions.gotIt.type, doGotIt);\r\n yield takeLatest(actions.refreshUsages.type, doeRefreshReservations);\r\n}\r\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { SnackbarKey } from 'notistack';\r\nimport { useInjectReducer, useInjectSaga } from 'redux-injectors';\r\nimport { messagesSaga } from './saga';\r\nimport { Message, MessagesState } from './type';\r\nimport { MessageProps } from '..';\r\n\r\nexport const initialState: MessagesState = {\r\n messages: [],\r\n initialized: 0,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'messagesState',\r\n initialState,\r\n reducers: {\r\n init(state, action: PayloadAction) {\r\n state.initialized = state.initialized + 1;\r\n },\r\n init_success(state, action: PayloadAction) {\r\n state.messages.push(...action.payload);\r\n },\r\n remove(state, action: PayloadAction) {\r\n state.messages = [\r\n ...state.messages.filter(m => m.key !== action.payload),\r\n ];\r\n },\r\n gotIt(state, action: PayloadAction) {},\r\n clear(state, action: PayloadAction) {\r\n state.messages = [];\r\n state.initialized = state.initialized - 1;\r\n },\r\n refreshUsages(state, action: PayloadAction) {},\r\n },\r\n});\r\nexport const { actions: messagesActions } = slice;\r\n\r\nexport const useMessagesSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: messagesSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import { createStyles, makeStyles } from '@material-ui/core';\r\n\r\nexport const useStyles = makeStyles(theme =>\r\n createStyles({\r\n item: {\r\n border: 'solid 1px ' + theme.palette.divider,\r\n borderRadius: '5px',\r\n gap: '10%',\r\n padding: '10px 0',\r\n display: 'flex',\r\n justifyContent: 'space-around',\r\n },\r\n container: {\r\n gap: theme.spacing(2),\r\n },\r\n }),\r\n);\r\n","import * as React from 'react';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { translations } from 'locales/translations';\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport {\r\n FormControl,\r\n FormGroup,\r\n Grid,\r\n Box,\r\n FormHelperText,\r\n} from '@material-ui/core';\r\nimport { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport * as yup from 'yup';\r\nimport { EntityNumberSchema } from '../Forms/Schemas';\r\nimport { Form, Formik } from 'formik';\r\nimport { FormRow } from '../Forms/FormsLayout';\r\nimport { FormOfflineServiceTypePicker } from '../Forms/FormOfflineServiceTypePicker';\r\nimport { FormNumberField } from '../Forms/FormNumberField';\r\nimport { useStyles } from './styles';\r\nimport { UsageRelatedFilter } from '../pickers/AutocompletePickers/OfflineServiceTypePicker';\r\nimport { Check } from '../BasicInputs/Check';\r\nimport { SkeletonIfLoading } from 'app/Layout/FrontendLayout/components/PageWrapper/components/SkeletonIfLoading';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { odataUrlPrefix } from 'utils/url-utils';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { Body } from '../Typography';\r\nimport FormControlLabel from '../Forms/FormControls/FormControlLabel';\r\n\r\ninterface OffService {\r\n quantity: number | null;\r\n service: Entity | null;\r\n}\r\n\r\nexport interface EndUsageData {\r\n services: OffService[];\r\n remarks: string | undefined;\r\n confirm: boolean;\r\n}\r\n\r\nexport interface EndUsageConfirmProps {\r\n isopen: boolean;\r\n onClose: () => void;\r\n ids?: number[];\r\n onConfirm: (data: EndUsageData) => void;\r\n usageProcessing?: boolean;\r\n message?: string;\r\n equipmentId?: number;\r\n}\r\nconst defaultOffService: OffService = {\r\n quantity: null,\r\n service: null,\r\n};\r\n\r\nlet chosenService: Entity | null = null;\r\n\r\nconst serviceSchema: yup.SchemaOf = yup.object({\r\n quantity: yup.number().min(0).nullable().default(null).required(),\r\n service: EntityNumberSchema.required().nullable(),\r\n});\r\n\r\nconst ServiceInput = ({\r\n addService,\r\n ids,\r\n selected,\r\n offService,\r\n onCurrentChange,\r\n}: {\r\n ids: number[];\r\n selected: number[];\r\n addService: (service: OffService) => void;\r\n offService: OffService;\r\n onCurrentChange?: (service: OffService) => void;\r\n}) => {\r\n const { t } = useTranslation();\r\n\r\n const AddService = (service: OffService) => {\r\n addService(service);\r\n };\r\n return (\r\n \r\n {formik => {\r\n return (\r\n
    \r\n \r\n {\r\n chosenService = s;\r\n const service = {\r\n quantity:\r\n s === null\r\n ? null\r\n : (s as IOfflineServiceFilterDto).DefaultQuantity,\r\n service: s,\r\n } as OffService;\r\n onCurrentChange?.(service);\r\n }}\r\n />\r\n {\r\n const val = parseInt(e.target.value);\r\n const service = {\r\n ...offService,\r\n quantity: isNaN(val) ? null : val,\r\n } as OffService;\r\n onCurrentChange?.(service);\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 EndUsageConfirm = ({\r\n isopen,\r\n onClose,\r\n onConfirm,\r\n usageProcessing,\r\n message,\r\n equipmentId,\r\n ...props\r\n}: EndUsageConfirmProps) => {\r\n const [selectedServices, setSelectedServices] = useState([]);\r\n const [remarks, setRemarks] = useState();\r\n const [confirm, setConfirm] = useState(false);\r\n const [ids, setIds] = useState(props.ids);\r\n const [loading, setLoading] = useState(false);\r\n const [offService, setOffService] = useState(defaultOffService);\r\n const [error, setError] = useState();\r\n useEffect(() => {\r\n if (!!ids || !equipmentId || !isopen) return;\r\n let mounted = true;\r\n setLoading(true);\r\n (async () => {\r\n try {\r\n const res = await httpClient.get(\r\n `${odataUrlPrefix}AssetDetails/GetEquipmentServices`,\r\n { equipmentId },\r\n );\r\n if (mounted) {\r\n setIds(res.value);\r\n setLoading(false);\r\n }\r\n } catch (error) {\r\n } finally {\r\n if (mounted) {\r\n setLoading(false);\r\n }\r\n }\r\n })();\r\n return () => {\r\n mounted = false;\r\n };\r\n }, [ids, equipmentId, isopen]);\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n\r\n const RemoveService = (id: number) => {\r\n let option = selectedServices.find(v => v.service?.Id === id);\r\n if (option) {\r\n setSelectedServices([\r\n ...selectedServices.filter(v => v.service?.Id !== id),\r\n ]);\r\n }\r\n };\r\n\r\n const totalServices = useMemo(() => {\r\n return serviceSchema.isValidSync(offService)\r\n ? [...selectedServices, offService]\r\n : selectedServices;\r\n }, [offService, selectedServices]);\r\n return (\r\n \r\n <>\r\n {ids && ids.length > 0 ? (\r\n \r\n

    {t(translations.EndUsageConfirmTitle)}

    \r\n {/* \r\n {t(translations.UsageEndOfflineService) + ' '}\r\n \r\n */}\r\n s.service!.Id)}\r\n ids={ids}\r\n addService={s => {\r\n chosenService = null;\r\n setSelectedServices(prev => [...prev, s]);\r\n setOffService(defaultOffService);\r\n }}\r\n onCurrentChange={s => {\r\n console.log('current changed', s);\r\n setOffService(s);\r\n }}\r\n offService={offService}\r\n />\r\n \r\n {selectedServices.map((s, i) => (\r\n \r\n \r\n {s.service?.Name}\r\n \r\n \r\n {s.quantity}\r\n \r\n \r\n RemoveService(s.service!.Id)}\r\n >\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n {\r\n setConfirm(value.target.checked);\r\n }}\r\n checked={confirm}\r\n />\r\n }\r\n />\r\n \r\n \r\n \r\n setRemarks(v.target.value)}\r\n />\r\n {error && {error}}\r\n \r\n ) : (\r\n {message ?? t(translations.ConfirmEndUsage)}\r\n )}\r\n \r\n \r\n }\r\n disabled={usageProcessing}\r\n onConfirm={() => {\r\n if (ids && ids.length > 0) {\r\n if ((!remarks || remarks === '') && totalServices.length === 0) {\r\n setError(\r\n 'Please enter an offline service used during this usage or a reason/remarks if none was used',\r\n );\r\n return;\r\n }\r\n if (!confirm) {\r\n setError('Must confirm that services are correct');\r\n return;\r\n }\r\n }\r\n onConfirm({ services: totalServices, remarks: remarks, confirm });\r\n }}\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * BasicDialogContent\r\n *\r\n */\r\nimport {\r\n DialogContent,\r\n DialogContentProps as MuiDialogContentProps,\r\n styled,\r\n} from '@material-ui/core';\r\nexport interface BasicDialogContentProps extends MuiDialogContentProps {\r\n children: React.ReactNode;\r\n}\r\nexport function BasicDialogContent(props: BasicDialogContentProps) {\r\n const { children } = props;\r\n return {children};\r\n}\r\nconst StyledDialogContent = styled(DialogContent)(({ theme }) => ({\r\n padding: theme.spacing(2, 3),\r\n borderTop: 'unset',\r\n}));\r\n","/**\r\n *\r\n * DialogForm\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Form, Formik, FormikConfig, FormikProps, FormikValues } from 'formik';\r\nimport { BasicDialogContent } from 'app/components/BasicDialog/BasicDialogContent';\r\nimport { BasicDialogTitle } from 'app/components/BasicDialog/BasicDialogTitle';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Dialog, DialogActions, DialogProps } from '@material-ui/core';\r\nimport { FormRowProps } from '../Forms/FormsLayout/FormRow';\r\n\r\nexport interface DialogFormProps\r\n extends Pick<\r\n FormikConfig,\r\n 'onSubmit' | 'initialValues' | 'validationSchema'\r\n >,\r\n Pick {\r\n /**\r\n * overrides Dialog's onClose to simplify the function signature since the event target & close reason is not in use currently\r\n * @returns\r\n */\r\n onClose: () => void;\r\n title: string;\r\n subTitle?: string;\r\n /**\r\n * Children have to be of type due to layout constraints\r\n */\r\n children:\r\n | Array>\r\n | React.ReactElement;\r\n}\r\n\r\n/**\r\n * Dialog with a form inside the DialogContent. Useful in cases where a confirmation is needed alongside another input from the user.\r\n * For example, quote rejection that requires a confirmation dialog with a reason for rejection, or an entity is added/updated through a dialog UI.\r\n * Props largely composed from a minimum viable props set from Formik & Dialog.\r\n * Children are expected to \r\n * @example\r\n * \r\n \r\n \r\n \r\n \r\n * @param props\r\n * @returns\r\n */\r\nexport function DialogForm(props: DialogFormProps) {\r\n return (\r\n \r\n \r\n {formik => }\r\n \r\n \r\n );\r\n}\r\nfunction FormContent(\r\n props: DialogFormProps & FormikProps,\r\n) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
    \r\n \r\n {props.title}\r\n \r\n \r\n \r\n {props.children}\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.Submit)}\r\n \r\n \r\n
    \r\n );\r\n}\r\n","/**\r\n *\r\n * Popper\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n ClickAwayListener,\r\n createStyles,\r\n makeStyles,\r\n Paper,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Popper as MuiPopper } from '@material-ui/core';\r\nimport { Box } from '../basic/Wrappers/Box';\r\nimport { PopperTitle } from './PopperTitle';\r\nimport clsx from 'clsx';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\n\r\nexport interface PopperProps {\r\n id?: string;\r\n title: string;\r\n open: boolean;\r\n anchorEl?: EventTarget & HTMLDivElement;\r\n children: React.ReactNode;\r\n onClose: React.MouseEventHandler;\r\n className?: string;\r\n closeTitle?: string;\r\n clickAway?: boolean;\r\n clickAwayFunc?: (e: any) => void;\r\n minWidth?: string | number;\r\n maxWidth?: string | number;\r\n}\r\n/**\r\n * A Popper with consistent title + close interface\r\n */\r\nexport const Popper = React.forwardRef(function Popper(\r\n props,\r\n ref,\r\n) {\r\n const {\r\n id,\r\n title,\r\n open,\r\n anchorEl,\r\n children,\r\n onClose,\r\n className,\r\n closeTitle,\r\n clickAway,\r\n clickAwayFunc,\r\n minWidth,\r\n maxWidth,\r\n ...other\r\n } = props;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const { checkIsMobile, isLandscape } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const handleClickAway = e => {\r\n if (clickAway) {\r\n if (e.target.nodeName === 'BODY' && e.type === 'click') {\r\n return;\r\n }\r\n if (!!clickAwayFunc) {\r\n clickAwayFunc(e);\r\n } else {\r\n onClose(e);\r\n }\r\n }\r\n };\r\n const classes = useStyles({\r\n isMobile: isMobile,\r\n minWidth: minWidth,\r\n maxWidth: maxWidth,\r\n })(props);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {props.children}\r\n \r\n \r\n \r\n );\r\n});\r\n\r\nconst useStyles = props =>\r\n makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n // https://github.com/mui/material-ui/issues/18905\r\n zIndex: theme.zIndex.modal,\r\n },\r\n rootMobile: {\r\n width: `100vw`,\r\n height: 'calc(100% - 32px)',\r\n // long content of the popper overflows popper box on mobile\r\n overflow: 'auto',\r\n marginTop: theme.spacing(4),\r\n },\r\n rootMobileHorizontal: {\r\n width: '100%',\r\n height: '100%',\r\n // long content of the popper overflows popper box on mobile\r\n overflow: 'auto',\r\n //marginTop: theme.spacing(4),\r\n },\r\n poperPaper: {\r\n height: '100%',\r\n minWidth: props.minWidth\r\n ? props.minWidth\r\n : props.isMobile\r\n ? '100%'\r\n : '500px',\r\n maxWidth: props.maxWidth\r\n ? props.maxWidth\r\n : props.isMobile\r\n ? '100%'\r\n : '700px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 24,\r\n gap: 16,\r\n boxShadow: '0px 2px 18px rgba(8, 24, 41, 0.16)',\r\n maxHeight: '100vh',\r\n overflow: 'hidden',\r\n },\r\n poperTitle: {},\r\n poperRoot: {\r\n width: '100%',\r\n },\r\n selectTitle: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '8px 8px',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n '&>label': {\r\n width: '100%',\r\n textAlign: 'center',\r\n },\r\n },\r\n selectContent: {\r\n marginTop: theme.spacing(2),\r\n boxShadow: 'inset 0px 1px 0px #E0E5EC',\r\n },\r\n }),\r\n );\r\n","/**\r\n *\r\n * Popper\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { translations } from 'locales/translations';\r\nimport { Body } from '../Typography';\r\n\r\nexport interface PopperTitleProps {\r\n title: React.ReactNode;\r\n onClose: React.MouseEventHandler;\r\n className?: string;\r\n closeButtonTitle?: string;\r\n}\r\n\r\nexport function PopperTitle({ title, onClose, ...props }: PopperTitleProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const classes = useStyles({ isMobile: isMobile });\r\n const closeTitle = props.closeButtonTitle ?? t(translations.Close);\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 {title}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n poperTitle: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '8px 8px',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n '&>label': {\r\n width: '100%',\r\n textAlign: 'center',\r\n },\r\n },\r\n }),\r\n);\r\n","/**\r\n *\r\n * RichTextEditor\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { StartRichEditor } from './RichEditor';\r\n\r\nexport interface RichTextEditorProps {\r\n value?: string | undefined;\r\n onChange: (value: string | undefined) => void;\r\n placeholder?: string;\r\n autofocus?: boolean;\r\n hasMentions?: boolean;\r\n onChangeMentions?: (mentions: Entity[]) => void;\r\n additionalButtons?: ((classname, key) => React.ReactNode)[];\r\n disabled?: boolean;\r\n isInvoiceTemplateEditor?: boolean;\r\n extendedMode?: boolean;\r\n}\r\n\r\nexport function RichTextEditor(props: RichTextEditorProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import {\r\n FormGroupProps as MuiFormGroupProps,\r\n FormGroup as MuiFormGroup,\r\n} from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport clsx from 'clsx';\r\n\r\nexport interface FormGroupProps extends MuiFormGroupProps {\r\n withInfo?: boolean;\r\n boxed?: boolean;\r\n boxedChecked?: boolean;\r\n boxedError?: boolean;\r\n}\r\nconst FormGroup = (props: FormGroupProps) => {\r\n const {\r\n withInfo,\r\n boxed,\r\n boxedChecked,\r\n boxedError,\r\n className,\r\n ...other\r\n } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default FormGroup;\r\n","/**\r\n *\r\n * AdminUserPicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { UserMultiPicker } from '../pickers/AutocompletePickers/UserMultiPicker';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { UserPicker } from '../pickers/AutocompletePickers/UserPicker';\r\n\r\nexport const FormAdminUsersPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps & { multiple: boolean }) => {\r\n const [field, meta, helpers] = useField(props);\r\n if (props.multiple) {\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n urlType=\"admin\"\r\n />\r\n );\r\n } else {\r\n return (\r\n {\r\n if (value !== null) {\r\n helpers.setValue([value], true);\r\n } else {\r\n helpers.setValue([], true);\r\n }\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n // value={field.value ?? undefined}\r\n value={\r\n field.value !== null\r\n ? field.value.length > 0\r\n ? (field.value[0] as IUserFilterDto | null | undefined)\r\n : null\r\n : null\r\n }\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n urlType=\"admin\"\r\n />\r\n );\r\n }\r\n};\r\nexport const FormAdminSingleUsersPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field?.value}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n urlType=\"admin\"\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * DatesRangeFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IFilterComponentProps } from 'app/components/BasicTable/Filters/IFilterComponentProps';\r\n\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport {\r\n getPeriodTypesEntity,\r\n PeriodTypes,\r\n PeriodTypesEntity,\r\n} from 'app/components/DatePeriods';\r\nimport { DatesRange } from 'types/DatesRange';\r\n\r\nimport { DatePeriodsPicker } from 'app/components/pickers/DatePeriodsPicker';\r\nimport { selectTwoDaysTimelineButtonEnabled } from 'app/pages/CalendarPage/Scheduler/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\n\r\n/**\r\n * Date picker to be used as a BasicTable filter component\r\n */\r\nexport const DatesPeriodFilter = (props: IFilterComponentProps) => {\r\n const { t } = useTranslation();\r\n const twoDaysEnabled = useSelector(selectTwoDaysTimelineButtonEnabled);\r\n const [value, setValue] = React.useState(\r\n props.value !== undefined ? props.value : new PresetDatesRange(),\r\n );\r\n const handleTypeChange = (value: PeriodTypesEntity | null) => {\r\n let changedValue = Object.assign(\r\n new PresetDatesRange(),\r\n {\r\n type:\r\n (value as PeriodTypesEntity) ??\r\n (getPeriodTypesEntity('CustomDate') as PeriodTypesEntity),\r\n },\r\n DatesRange.fromPreset(\r\n (value as PeriodTypesEntity) ??\r\n (getPeriodTypesEntity('CustomDate') as PeriodTypesEntity),\r\n null,\r\n null,\r\n ),\r\n );\r\n setValue(state => changedValue);\r\n props.onChange(changedValue);\r\n };\r\n return (\r\n <>\r\n {value !== undefined && (\r\n <>\r\n twoDaysEnabled === true || f !== 'TodayTomorrow',\r\n )}\r\n value={\r\n props.value instanceof PresetDatesRange\r\n ? (props.value.type as PeriodTypesEntity | undefined)\r\n : (props.value as PeriodTypesEntity | undefined)\r\n }\r\n disableClearable={true}\r\n placeholder={t(translations.Forever)}\r\n size=\"small\"\r\n id=\"datesrangeid\"\r\n aria-label=\"Date Periods select\"\r\n />\r\n \r\n )}\r\n \r\n );\r\n};\r\nexport default DatesPeriodFilter;\r\n\r\nexport const SchedulerDatePositionArray: Array = [\r\n 'Today',\r\n 'Tomorrow',\r\n 'Yesterday',\r\n 'TodayTomorrow',\r\n 'ThisWeek',\r\n 'NextWeek',\r\n 'ThisMonth',\r\n 'NextMonth',\r\n 'LastWeek',\r\n 'LastMonth',\r\n 'ThisQuarter',\r\n 'LastQuarter',\r\n 'NextQuarter',\r\n 'ThisYear',\r\n 'LastYear',\r\n 'NextYear',\r\n 'CustomDate',\r\n];\r\ntype Extends = U;\r\nexport type SchedulerDatePositionUnion = Extends<\r\n PeriodTypes,\r\n | 'Today'\r\n | 'Tomorrow'\r\n | 'Yesterday'\r\n | 'TodayTomorrow'\r\n | 'ThisWeek'\r\n | 'NextWeek'\r\n | 'ThisMonth'\r\n | 'NextMonth'\r\n | 'LastWeek'\r\n | 'LastMonth'\r\n | 'ThisQuarter'\r\n | 'LastQuarter'\r\n | 'NextQuarter'\r\n | 'ThisYear'\r\n | 'LastYear'\r\n | 'NextYear'\r\n | 'CustomDate'\r\n>;\r\n","export enum WorkWeekDays {\r\n FirstDay = 1,\r\n SecondsDay = 2,\r\n ThirdDay = 3,\r\n FourthDay = 4,\r\n FifthDay = 5,\r\n SixthDay = 6,\r\n}\r\n","import {\r\n IViewState,\r\n ViewLengths,\r\n ViewLengthsArray,\r\n ViewTypes,\r\n} from '../slice/types';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport {\r\n SchedulerDatePositionArray,\r\n SchedulerDatePositionUnion,\r\n} from 'app/components/BasicTable/Filters/DatesPeriodFilter';\r\nimport { DatesRange } from 'types/DatesRange';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport type SchedulerPosition = SchedulerDatePositionUnion | ViewLengths;\r\n\r\nexport type SchedulerPositionState = Pick<\r\n IViewState,\r\n 'viewLength' | 'date' | 'preset' | 'viewType'\r\n>;\r\n\r\nexport const parsePosition = (\r\n s?: SchedulerPosition,\r\n d?: Timestamp,\r\n vt?: ViewTypes,\r\n): SchedulerPositionState => {\r\n const result: SchedulerPositionState = {\r\n preset: 'ThisWeek',\r\n viewLength: 'week',\r\n date: dateUtils.formatISO(dateUtils.startOfWeek(new Date())),\r\n viewType: vt ?? 'calendar',\r\n };\r\n if (d !== undefined) {\r\n const parsedDate = dateUtils.tryParse(d);\r\n if (parsedDate !== null) {\r\n result.date = dateUtils.formatISO(parsedDate);\r\n }\r\n }\r\n\r\n if (s !== undefined) {\r\n // try parse preset period/position like nextweek\r\n const presetPosition:\r\n | SchedulerDatePositionUnion\r\n | undefined = SchedulerDatePositionArray.find(\r\n f => f.toLowerCase() === s.toLowerCase(),\r\n );\r\n if (presetPosition !== undefined) {\r\n const preset = DatesRange.fromPreset(\r\n { Id: presetPosition, Name: 'dummy' },\r\n null,\r\n null,\r\n );\r\n if (preset.start !== null) {\r\n result.date = dateUtils.formatISO(preset.start);\r\n }\r\n result.viewLength = presetPeriodToViewLength(\r\n presetPosition,\r\n result.viewType,\r\n );\r\n }\r\n const viewLength: ViewLengths | undefined = ViewLengthsArray.find(\r\n f => f.toLowerCase() === s.toLowerCase(),\r\n );\r\n if (viewLength !== undefined) {\r\n result.viewLength = viewLength;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport function presetPeriodToViewLength(\r\n preset: SchedulerDatePositionUnion,\r\n viewType: ViewTypes,\r\n): ViewLengths {\r\n switch (preset) {\r\n case 'Today':\r\n case 'Yesterday':\r\n case 'Tomorrow':\r\n return 'day';\r\n case 'TodayTomorrow':\r\n return 'twodays';\r\n case 'LastWeek':\r\n case 'ThisWeek':\r\n case 'NextWeek':\r\n return 'week';\r\n case 'LastMonth':\r\n case 'ThisMonth':\r\n case 'NextMonth':\r\n return 'month';\r\n case 'LastQuarter':\r\n case 'ThisQuarter':\r\n case 'NextQuarter':\r\n return viewType === 'timeline' ? 'quarter' : 'week';\r\n case 'LastYear':\r\n case 'ThisYear':\r\n case 'NextYear':\r\n return viewType === 'timeline' ? 'year' : 'week';\r\n case 'CustomDate':\r\n return 'customdays';\r\n default:\r\n assertExhaustive(preset);\r\n }\r\n}\r\n","import { dateUtils } from 'utils/date-utils';\r\nimport { pick } from 'lodash';\r\nimport { Period } from 'types/Period';\r\n\r\n/**\r\n * Adjusts start/end times of a reservation to match the ForceFullDayReservations requirements:\r\n * * starts = now if reservation is placed for today, start of the day otherwise\r\n * * ends = midnight of the next day\r\n * @param period\r\n * @returns adjusted start/end times\r\n */\r\nexport function applyForceFullDayReservations(\r\n period: Period,\r\n forceFullDayReservations: boolean | undefined,\r\n): Period {\r\n if (forceFullDayReservations !== true) {\r\n return pick(period, 'start', 'end');\r\n }\r\n\r\n const now = new Date();\r\n const startsToday =\r\n dateUtils.truncateTime(now).getTime() ===\r\n dateUtils.truncateTime(period.start).getTime();\r\n\r\n const startTime = startsToday ? now : dateUtils.truncateTime(period.start);\r\n\r\n const truncatedEndTime = dateUtils.truncateTime(period.end);\r\n const adjustEndTime = period.end.getTime() !== truncatedEndTime.getTime();\r\n const endTime = adjustEndTime\r\n ? dateUtils.addDays(dateUtils.truncateTime(period.end), 1)\r\n : period.end;\r\n const result = {\r\n start: startTime,\r\n end: endTime,\r\n start_date: startTime,\r\n end_date: endTime,\r\n };\r\n return result;\r\n}\r\n","import { flow, partialRight } from 'lodash';\r\nimport { Period } from 'types/Period';\r\nimport { applyForceFullDayReservations } from './applyForceFullDayReservations';\r\nimport { SchedulerPeriod } from '../types/SchedulerPeriod';\r\n\r\n/**\r\n * Intended to adjust new event start/end according to ForceFullDayReservations equipment setting\r\n * @param period\r\n * @param forceFullDayReservations\r\n * @returns\r\n */\r\nexport function adjustSchedulerEventTimes(\r\n period: SchedulerPeriod,\r\n forceFullDayReservations: boolean | undefined,\r\n): SchedulerPeriod {\r\n const p = (period: SchedulerPeriod): Period => ({\r\n start: period.start_date,\r\n end: period.end_date,\r\n });\r\n const pp = (period: Period): SchedulerPeriod => ({\r\n start_date: period.start,\r\n end_date: period.end,\r\n });\r\n\r\n const result = flow(\r\n p,\r\n partialRight(applyForceFullDayReservations, forceFullDayReservations),\r\n pp,\r\n )(period);\r\n return result;\r\n}\r\n","import { useEffect } from 'react';\r\n\r\ntype ListenerProps = {\r\n [key in keyof WindowEventMap]?: EventListenerOrEventListenerObject;\r\n};\r\n\r\nexport default function useGlobalDOMEvents(props: ListenerProps) {\r\n useEffect(() => {\r\n for (let [key, func] of Object.entries(props)) {\r\n window.addEventListener(key, func, false);\r\n }\r\n return () => {\r\n for (let [key, func] of Object.entries(props)) {\r\n window.removeEventListener(key, func, false);\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n}\r\n","/**\r\n *\r\n * FiltersGroupDisplay\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { FilterDisplay } from '../FilterDisplay';\r\nimport { IFilterSettings } from '../IFilterSettings';\r\nimport { areSameFilter, filterKey } from '../utils';\r\n\r\nexport interface FiltersGroupDisplayProps {\r\n appliedFilters: IFilterSettings[];\r\n onChange: (items: IFilterSettings[]) => void;\r\n openFilter: () => void;\r\n}\r\n\r\nexport function FiltersGroupDisplay(\r\n props: FiltersGroupDisplayProps,\r\n) {\r\n const [items, setItems] = React.useState(\r\n props.appliedFilters.filter(f => f.value !== null && f.value !== undefined),\r\n );\r\n React.useEffect(() => {\r\n setItems(\r\n props.appliedFilters.filter(\r\n f => f.value !== null && f.value !== undefined,\r\n ),\r\n );\r\n }, [props.appliedFilters]);\r\n const handleDelete = item => {\r\n props.onChange(\r\n props.appliedFilters.map(f =>\r\n !areSameFilter({ f, item }) ? f : { ...f, ...{ value: null } },\r\n ),\r\n );\r\n };\r\n return (\r\n <>\r\n {items\r\n .filter(f => f.value !== undefined)\r\n .map((item, index) => (\r\n \r\n ))}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FilterDisplay\r\n *\r\n */\r\nimport { Chip, ChipProps, Theme, useTheme } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { IFilterSettings } from '../IFilterSettings';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { Entity } from 'types/common';\r\nimport { IsEntity, IsNotEmptyArray } from '../AppliedFilterComponent';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport styled from 'styled-components';\r\n\r\nexport interface FilterDisplayProps {\r\n filter: IFilterSettings;\r\n onDelete: (item: IFilterSettings) => void;\r\n openFilter: () => void;\r\n}\r\nexport const FilterChip = styled(\r\n ({\r\n theme,\r\n ...other\r\n }: {\r\n theme: Theme;\r\n } & ChipProps) => ,\r\n)`\r\n &.filter-display-root {\r\n gap: ${props => props.theme.spacing(1)}px;\r\n max-width: 58ch;\r\n border-radius: 8px;\r\n background-color: ${props => props.theme.palette.common.grayDividers};\r\n }\r\n`;\r\nexport function FilterDisplay(props: FilterDisplayProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const theme = useTheme();\r\n const isMobile = DetectIsMobile();\r\n const value = props.filter.value;\r\n const displayValue =\r\n typeof value === 'string'\r\n ? value\r\n : typeof value === 'number'\r\n ? value?.toString()\r\n : value instanceof Date\r\n ? dateUtils.shortDateFormat(value)\r\n : value instanceof PresetDatesRange\r\n ? value?.GetPresetDatesRangeDisplayString(t)\r\n : IsEntity(value)\r\n ? (value as Entity).Name\r\n : IsNotEmptyArray(value)\r\n ? (value as Array>).map(v => v.Name).join(', ')\r\n : props.filter.getDisplay !== undefined\r\n ? props.filter.getDisplay(value)\r\n : t(translations.NA);\r\n const isInversed = props.filter.isInversed ? 'Not ' : '';\r\n\r\n const handleDelete = event => {\r\n props.onDelete(props.filter);\r\n };\r\n return !!props.filter.renderFilterDisplay ? (\r\n <>{props.filter.renderFilterDisplay(props)}\r\n ) : (\r\n <>\r\n \r\n \r\n {props.filter.displayName}\r\n \r\n : \r\n {displayValue === undefined || displayValue === null ? (\r\n \r\n ) : props.filter.displayName.length + displayValue.length > 40 ? (\r\n \r\n \r\n \r\n {isInversed}\r\n {displayValue}\r\n \r\n \r\n \r\n ) : (\r\n \r\n {isInversed}\r\n {displayValue}\r\n \r\n )}\r\n \r\n }\r\n onDelete={handleDelete}\r\n />\r\n \r\n );\r\n}\r\n","export enum UserGroupsProviderTypes {\r\n /// \r\n /// user groups are sourced internally\r\n /// \r\n SQL,\r\n /// \r\n /// user groups are taken externally from AD\r\n /// \r\n AD,\r\n /// \r\n /// Same as AD, except:\r\n /// User will keep his (SQL) group after his (AD) group was removed\r\n /// \r\n Combo,\r\n}\r\n\r\nexport enum AutoMode {\r\n /// \r\n /// Usage enabled on equipment\r\n /// \r\n LocalAppEnabled = 1,\r\n /// \r\n /// Usage disabled on equipment\r\n /// \r\n LocalAppDisabled = 2,\r\n}\r\n","import { ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { useLabelPrintSlice } from '../slice';\r\nimport { Identifiable } from 'types/common';\r\nimport { SelectedRowsActionIconButton } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { ICanRaiseBasicTableRefreshEvent } from 'app/components/BasicTable/ControlledTable/ControlledTableProps';\r\n\r\nexport interface PrintAssetLabelsButtonProps\r\n extends ButtonProps,\r\n ICanRaiseBasicTableRefreshEvent {\r\n rows: Array>;\r\n}\r\n\r\nexport function PrintSelectedAssetLabelsButton({\r\n rows,\r\n onRefresh,\r\n onClick,\r\n ...props\r\n}: PrintAssetLabelsButtonProps) {\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const allowedRoles = [\r\n Roles.Administrators,\r\n Roles.LabTech,\r\n Roles.GroupAdministrators,\r\n Roles.EquipmentAdministrator,\r\n ];\r\n const systemSettings = useSelector(selectglobalSettings);\r\n // enable print only if any of the supported printers settings has been turned on\r\n const printEnabled =\r\n systemSettings.GetBooleanByKey(AllowedSettings.DymoPrinterSupported) ||\r\n systemSettings.GetBooleanByKey(AllowedSettings.ZebraPrinterSupported);\r\n\r\n const show =\r\n printEnabled &&\r\n authenticatedUser?.Roles?.some(role => allowedRoles.includes(role));\r\n\r\n const dispatch = useDispatch();\r\n const { actions } = useLabelPrintSlice();\r\n\r\n if (!show) {\r\n return <>;\r\n } else {\r\n const assetIds = rows.map(f => f.Id);\r\n props.children = props.children ?? t(translations.PrintLabels);\r\n props.title = props.title ?? t(translations.PrintLabels);\r\n props.disabled = props.disabled || assetIds.length === 0;\r\n return (\r\n {\r\n dispatch(actions.open({ ids: assetIds, type: 'Asset' }));\r\n return Promise.resolve({\r\n ErrorMessages: [],\r\n SuccessMessages: [],\r\n WarningMessages: [],\r\n });\r\n }}\r\n />\r\n );\r\n }\r\n}\r\n","import { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectIsAuthenticated,\r\n selectPublicUrl,\r\n} from 'app/slice/selectors';\r\nimport { ConfigurableTypes, ScreensId } from 'enums/ConfigurableTypes';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Column } from 'react-table';\r\nimport { Notification } from 'types/Notification';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { IRow } from '.';\r\nimport {\r\n getTableColumns,\r\n GetCachedConfigurableColumnsData,\r\n} from './ConfigurableColumns';\r\n\r\nexport interface IUseConfigurableColumnsProps {\r\n columns: Array>;\r\n /**\r\n * Id of the screen that table related to. Required!\r\n */\r\n screenId?: ScreensId;\r\n}\r\nexport const useConfigurableColumns = ({\r\n screenId,\r\n columns,\r\n}: IUseConfigurableColumnsProps) => {\r\n // Configurable columns\r\n // columns will be replaced with configurableColumns\r\n\r\n const { t } = useTranslation();\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n const AuthenticatedUser = useSelector(selectAuthenticatedUser);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const dispatch = useDispatch();\r\n const { actions: globalActions } = useAppSettingsSlice();\r\n const setGlobalMessage = React.useCallback(\r\n (message: Notification) => {\r\n dispatch(globalActions.addNotification(message));\r\n },\r\n [dispatch, globalActions],\r\n );\r\n const [configurableColumns, setConfigurableColumns] = useAsyncExtendedState<\r\n Column[] | undefined\r\n >(screenId === undefined ? columns : undefined);\r\n\r\n const loadConfigurableColumns = React.useCallback(\r\n async (props: {\r\n screenId: ScreensId;\r\n columns: Array>;\r\n isAuthenticated?: boolean;\r\n force?: boolean;\r\n }) => {\r\n try {\r\n const config = await GetCachedConfigurableColumnsData(\r\n props.screenId,\r\n ConfigurableTypes.ColumnScreenConfig,\r\n\r\n isAuthenticated,\r\n props.force,\r\n );\r\n\r\n return getTableColumns({\r\n response: config,\r\n ConfigurableColumnsSetUp: columns,\r\n });\r\n } catch (error) {\r\n setGlobalMessage({\r\n key: 'WrongColumnDefinition',\r\n message: t(translations.WrongColumnDefinition_info) as string,\r\n variant: 'warning',\r\n autoHideDuration: 30000,\r\n closable: true,\r\n });\r\n return getTableColumns({\r\n response: [],\r\n ConfigurableColumnsSetUp: columns,\r\n });\r\n }\r\n },\r\n [columns, isAuthenticated, setGlobalMessage, t],\r\n );\r\n const [fetchConfigState, getConfigurableColumns] = usePromise(\r\n loadConfigurableColumns,\r\n );\r\n\r\n const [\r\n configurableColumnsExport,\r\n setConfigurableColumnsExport,\r\n ] = useAsyncExtendedState | undefined>(undefined);\r\n const loadConfigurableColumnsExport = React.useCallback(\r\n async (listId: ScreensId, isAuthenticated: boolean | undefined) => {\r\n const d = await GetCachedConfigurableColumnsData(\r\n listId,\r\n ConfigurableTypes.ColumnExportConfig,\r\n isAuthenticated,\r\n false,\r\n );\r\n const p = d.map(f => f.Id);\r\n return p;\r\n },\r\n [],\r\n );\r\n const [, fetchExport] = usePromise(loadConfigurableColumnsExport);\r\n\r\n // useEffect will only be called once because columns and screenId do not change, it is a trick\r\n React.useEffect(() => {\r\n if (screenId !== undefined) {\r\n setConfigurableColumns(getConfigurableColumns({ screenId, columns }));\r\n }\r\n if (screenId !== undefined) {\r\n setConfigurableColumnsExport(fetchExport(screenId, isAuthenticated));\r\n }\r\n }, [\r\n columns,\r\n fetchExport,\r\n getConfigurableColumns,\r\n isAuthenticated,\r\n screenId,\r\n setConfigurableColumns,\r\n setConfigurableColumnsExport,\r\n ]);\r\n\r\n const refreshConfigurableColumns = React.useCallback(() => {\r\n if (screenId !== undefined) {\r\n setConfigurableColumns(\r\n loadConfigurableColumns({\r\n screenId,\r\n columns,\r\n force: true,\r\n isAuthenticated,\r\n }),\r\n );\r\n }\r\n }, [\r\n screenId,\r\n setConfigurableColumns,\r\n loadConfigurableColumns,\r\n columns,\r\n isAuthenticated,\r\n ]);\r\n\r\n const handleConfigurableColumns = React.useCallback(() => {\r\n if (screenId && AuthenticatedUser) {\r\n let targetUrl = '/ConfigurableColumn.aspx';\r\n // eslint-disable-next-line no-restricted-globals\r\n let path = location.pathname.split('/');\r\n // eslint-disable-next-line no-restricted-globals\r\n const search = location.search;\r\n\r\n let publicSub = publicUrl?.split('/');\r\n path.shift();\r\n if (path.length > 1) {\r\n if (\r\n !!publicSub &&\r\n (publicSub[publicSub.length - 1] === ''\r\n ? publicSub[publicSub.length - 2]\r\n : publicSub[publicSub.length - 1]) === path[0]\r\n ) {\r\n path.shift();\r\n }\r\n }\r\n let returnUrl = '~/' + path.join('/') + search;\r\n let redirUrl = toRootedURL(targetUrl, {\r\n id: screenId,\r\n UserName: AuthenticatedUser.Id,\r\n ReturnUrl: returnUrl,\r\n });\r\n // eslint-disable-next-line no-restricted-globals\r\n window.open(redirUrl, '_blank'); // + returnUrl;\r\n }\r\n }, [AuthenticatedUser, publicUrl, screenId]);\r\n\r\n // The configCompleted variable is used to show the loading indicator while the configurable columns data is being loaded\r\n // There's nothing to complete when there's no screenId and this variable does not need a separate state as it's a derivative of the fetch status.\r\n const configCompleted =\r\n screenId === undefined || fetchConfigState.status === 'resolved';\r\n return {\r\n configurableColumns,\r\n configurableColumnsExport,\r\n handleConfigurableColumns,\r\n configCompleted,\r\n refreshConfigurableColumns,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { TablePaginationActionsProps } from '@material-ui/core/TablePagination/TablePaginationActions';\r\nimport Box from '@material-ui/core/Box';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: theme.spacing(1.5),\r\n paddingRight: theme.spacing(1.5),\r\n },\r\n}));\r\n\r\nconst TablePaginationActions: React.FC = props => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const { count, page, rowsPerPage, onChangePage } = props;\r\n\r\n const handleFirstPageButtonClick = event => {\r\n onChangePage(event, 0);\r\n };\r\n\r\n const handleBackButtonClick = event => {\r\n onChangePage(event, page - 1);\r\n };\r\n\r\n const handleNextButtonClick = event => {\r\n onChangePage(event, page + 1);\r\n };\r\n\r\n const handleLastPageButtonClick = event => {\r\n onChangePage(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));\r\n };\r\n\r\n return (\r\n \r\n \r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n = Math.ceil(count / rowsPerPage) - 1}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n size=\"xs\"\r\n aria-label=\"next page\"\r\n >\r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n = Math.ceil(count / rowsPerPage) - 1}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n size=\"xs\"\r\n aria-label=\"last page\"\r\n >\r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\n// TablePaginationActions.propTypes = {\r\n// count: PropTypes.number.isRequired,\r\n// onChangePage: PropTypes.func.isRequired,\r\n// page: PropTypes.number.isRequired,\r\n// rowsPerPage: PropTypes.number.isRequired,\r\n// };\r\n\r\nexport default TablePaginationActions;\r\n","/**\r\n *\r\n * ExportButton\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Menu, MenuItem } from '@material-ui/core';\r\nimport { IRow } from 'app/components/BasicTable';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useDialogAlertSlice } from 'app/components/DialogAlert/slice';\r\nimport { ExportImportActions } from 'app/components/PopupImportExport/Actions';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport fileDownload from 'js-file-download';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { selectglobalSettings } from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\n\r\nexport interface ExportButtonProps {\r\n //selectedRows: T[];\r\n onClick: () => Promise;\r\n onDownloadTemplateClick?: () => void;\r\n useExportForImport?: boolean;\r\n getAllFilteredRowsCallback?: (prop: keyof T) => Promise;\r\n selectedFilterRowProp?: keyof T;\r\n screenId?: ScreensId;\r\n}\r\n\r\nexport function ExportButton(props: ExportButtonProps) {\r\n const { t } = useTranslation();\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const [processing, setProcessing] = React.useState(false);\r\n const dispatch = useDispatch();\r\n const { actions } = useDialogAlertSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n const settings = useSelector(selectglobalSettings);\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n const handleExport = async () => {\r\n handleClose();\r\n setProcessing(true);\r\n await props.onClick();\r\n setProcessing(false);\r\n };\r\n\r\n const handleExportForImportClick = async () => {\r\n handleClose();\r\n if (\r\n !!props.getAllFilteredRowsCallback &&\r\n !!props.selectedFilterRowProp &&\r\n !!props.screenId\r\n ) {\r\n setProcessing(true);\r\n await handleExportForImport(\r\n props.getAllFilteredRowsCallback,\r\n props.selectedFilterRowProp,\r\n props.screenId,\r\n );\r\n setProcessing(false);\r\n } else {\r\n dispatch(actions.showAlert('Import for Export is not configured!'));\r\n }\r\n };\r\n const handleExportForImport = async (\r\n rowsCallback: (prop: keyof T) => Promise,\r\n p: keyof T,\r\n screenId: ScreensId,\r\n ) => {\r\n let toBigQS = '';\r\n try {\r\n const selectedRows = await rowsCallback(p);\r\n const exportRows = !!selectedRows\r\n ? selectedRows.map(item => item[p])\r\n : [];\r\n toBigQS = exportRows.join(',');\r\n const res = await ExportImportActions.ExportForImport(\r\n screenId,\r\n exportRows,\r\n );\r\n const cd = res.headers['content-disposition'];\r\n const filename =\r\n cd !== undefined ? cd.split('filename=')[1] : 'ExportForImport.xlsx';\r\n fileDownload(res.data, filename);\r\n if (ScreensId.MyAssets === screenId) {\r\n const MaxRecordsAllowedAssetImport = parseInt(\r\n settings.GetString(AllowedSettings.MaxRecordsAllowedAssetImport),\r\n );\r\n if (exportRows.length > MaxRecordsAllowedAssetImport) {\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'warning',\r\n message: `Only ${MaxRecordsAllowedAssetImport} rows were exported`,\r\n }),\r\n );\r\n }\r\n }\r\n } catch (error) {\r\n let messageLongQS =\r\n toBigQS.length > 5000\r\n ? (t(translations.err_ImportForExportFailed_longQS) as string)\r\n : undefined;\r\n let deffMessage = t(translations.err_ImportForExportFailed) as string;\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: !!messageLongQS ? messageLongQS : deffMessage,\r\n }),\r\n );\r\n }\r\n };\r\n const handleDownloadTemplateClick = () => {\r\n if (props.onDownloadTemplateClick !== undefined) {\r\n props.onDownloadTemplateClick();\r\n }\r\n };\r\n\r\n const showSingleExportButton = ![\r\n props.useExportForImport === true ? true : undefined,\r\n props.onDownloadTemplateClick,\r\n ].some(item => item !== undefined);\r\n\r\n // render a menu if both set of columns are provided\r\n // render single button if only export columns are present and the \"for import\" is not set\r\n return (\r\n \r\n }\r\n onClick={showSingleExportButton ? handleExport : handleClick}\r\n processing={processing}\r\n title={t(translations.ExportButtonTooltip) as string}\r\n >\r\n {t(translations.Export)}\r\n \r\n {!showSingleExportButton && (\r\n <>\r\n \r\n \r\n {t(translations.ExportToXLSX)}\r\n \r\n {props.useExportForImport === true && (\r\n \r\n {t(translations.ExportForImport)}\r\n \r\n )}\r\n {props.onDownloadTemplateClick !== undefined && (\r\n \r\n {t(translations.DownloadTemplate)}\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { Box } from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { ActionButton } from 'app/components/BasicButtons/ActionButton';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ICanRaiseBasicTableRefreshEvent } from '../ControlledTable/ControlledTableProps';\r\nimport { SelectedRowsActionRenderer } from '../SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\n\r\nexport interface SelectedActionsProps\r\n extends ICanRaiseBasicTableRefreshEvent {\r\n actions: SelectedRowsActionRenderer[];\r\n selectedArray: TRow[];\r\n toggleAllRowsSelected: (value?: boolean) => void;\r\n totalRows: number;\r\n shortView?: boolean;\r\n}\r\n\r\nexport function SelectedActions({\r\n actions,\r\n onRefresh,\r\n selectedArray,\r\n toggleAllRowsSelected,\r\n totalRows,\r\n shortView,\r\n ...props\r\n}: SelectedActionsProps) {\r\n const { t } = useTranslation();\r\n const clearSelection = () => {\r\n toggleAllRowsSelected(false);\r\n };\r\n const allActions = React.useMemo(() => {\r\n return actions.filter(f => f !== undefined);\r\n }, [actions]);\r\n return shortView ? (\r\n <>\r\n \r\n {`${selectedArray.length} of ${totalRows} Items`}\r\n \r\n <>{allActions[0](selectedArray, onRefresh, toggleAllRowsSelected)}\r\n {allActions.length > 1 && (\r\n {\r\n return indx > 0 && f !== undefined;\r\n })\r\n .map((item, index) =>\r\n item(selectedArray, onRefresh, toggleAllRowsSelected),\r\n )}\r\n >\r\n )}\r\n {/* */}\r\n \r\n ) : (\r\n <>\r\n \r\n {`${selectedArray.length} of ${totalRows} Items`}\r\n \r\n\r\n {allActions.map((item, index) => (\r\n \r\n {item(selectedArray, onRefresh, toggleAllRowsSelected)}\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nexport interface ConfigureColumnsButtonProps {\r\n onClick?: () => void;\r\n}\r\nexport function ConfigureColumnsButton(props: ConfigureColumnsButtonProps) {\r\n const { t } = useTranslation();\r\n const { onClick } = props;\r\n\r\n return (\r\n }\r\n onClick={onClick}\r\n >\r\n {t(translations.Columns)}\r\n \r\n );\r\n}\r\n","import { useLocation } from 'react-router-dom';\r\nimport { usePrevious } from './usePrevious';\r\nimport { useEffect } from 'react';\r\n//import { Location } from '@types/history';\r\n\r\nexport const useLocationChange = action => {\r\n const location = useLocation();\r\n const prevLocation = usePrevious(location);\r\n useEffect(() => {\r\n action(location, prevLocation);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [location]);\r\n};\r\n","import styled from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport const TabsWrapper = styled('div')(({ theme }) => ({\r\n '&.tabsWrapper': {\r\n display: 'flex',\r\n padding: '0px 32px',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n alignSelf: 'stretch',\r\n gap: '32px',\r\n width: '100%',\r\n '&.scrollContent': {\r\n overflow: 'hidden',\r\n },\r\n '&.tabsHorizontal': {\r\n '& .basicTabs': {\r\n flexGrow: 1,\r\n width: '100%',\r\n borderBottom: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n },\r\n },\r\n '&.tabsVertical': {\r\n flexDirection: 'row',\r\n padding: '0px',\r\n },\r\n '& .basicTabs': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n}));\r\nexport const TabPanelWrapper = styled('div')(({ theme }) => ({\r\n '&.tabPanel': {\r\n width: '100%',\r\n '&.scrollablePanel': {\r\n height: '100%',\r\n overflowY: 'auto',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: '4px',\r\n backgroundColor: bookitColors.grayscale.grayBorders,\r\n },\r\n },\r\n },\r\n}));\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IFileDto } from 'api/odata/generated/entities/IFileDto';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { FormInputFile } from 'app/components/Forms/FormInputFile';\r\nimport React from 'react';\r\nimport { Identifiable } from 'types/common';\r\nimport { CustomFormFieldProps } from '../CustomFormFields';\r\n\r\nexport function CustomFormFileUpload({\r\n formField,\r\n readonly,\r\n disabled,\r\n ...props\r\n}: CustomFormFieldProps) {\r\n return (\r\n \r\n );\r\n}\r\nconst url = '/api/odata/v4/Files';\r\nexport const InitFormFiles = (\r\n id: string,\r\n formField: IFormFieldDto | undefined,\r\n) => {\r\n const initids = id\r\n .split(',')\r\n .filter(f => f !== '')\r\n .map(item => {\r\n return { Id: item };\r\n }) as Identifiable[];\r\n if (initids.length > 0) {\r\n let filter: string | undefined = '';\r\n if (formField) {\r\n if (formField.IsMultiple) {\r\n filter = new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n initids,\r\n ).toString();\r\n } else {\r\n filter = `Id eq ${initids[0].Id}`;\r\n }\r\n }\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: filter,\r\n $select: 'Id,Name,Size,TypeId',\r\n $skip: 0,\r\n $top: initids.length,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as IFileDto[]);\r\n } else {\r\n return new Promise((resolve, reject) => {\r\n resolve([] as IFileDto[]);\r\n });\r\n }\r\n};\r\n","import { IRepetitiveDto, RepetitiveInit } from 'types/IRepetitiveDto';\r\nimport { RepetitiveForm } from '.';\r\nimport * as React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useRepetitiveSlice } from './slice';\r\nimport { Portal } from '@material-ui/core';\r\nimport { useRef } from 'react';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { MutableRefObject } from 'react';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { RepetitiveFor } from './slice/types';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nexport interface RepetitiveControlProps {\r\n startDate?: Date | null;\r\n saveRepetitive?: (values: IRepetitiveDto) => void;\r\n submitFormRef: MutableRefObject;\r\n title?: string;\r\n type: RepetitiveFor;\r\n disabled?: boolean;\r\n formIsValid?: (isValid: boolean) => void;\r\n withTopSeparator?: boolean;\r\n withBottomSeparator?: boolean;\r\n //submitForm: (e) => void;\r\n}\r\n\r\nexport function RepetitiveControl(props: RepetitiveControlProps) {\r\n const {\r\n saveRepetitive,\r\n submitFormRef,\r\n startDate,\r\n title,\r\n type,\r\n disabled,\r\n formIsValid,\r\n withTopSeparator,\r\n withBottomSeparator,\r\n } = props;\r\n //const submitFormRef = React.useRef(null);\r\n const dispatch = useDispatch();\r\n const { actions } = useRepetitiveSlice();\r\n const [initData, setInitData] = React.useState(\r\n undefined,\r\n );\r\n const { newDate, getOffsetDate } = useSystemDate();\r\n // React.useMemo(() => {\r\n // return RepetitiveInit(\r\n // startDate ? dateUtils.dateOrStringToDate(startDate) : new Date(),\r\n // dateUtils.addDays(\r\n // startDate ? dateUtils.dateOrStringToDate(startDate) : new Date(),\r\n // 7,\r\n // ),\r\n // );\r\n // }, [startDate]);\r\n useEffectOnMount(() => {\r\n setInitData(() =>\r\n RepetitiveInit(startDate ? getOffsetDate(startDate) : newDate()),\r\n );\r\n // if (startDate !== undefined && startDate !== null) {\r\n // dispatch(actions.setStartDate(dateUtils.dateOrStringToDate(startDate)));\r\n // } else {\r\n // dispatch(actions.setStartDate(new Date()));\r\n // }\r\n return () => {};\r\n });\r\n // React.useEffect(() => {\r\n // let active = doSubmit;\r\n // if (active) {\r\n // if (submitFormRef.current) {\r\n // submitFormRef.current.Submit();\r\n // dispatch(actions.setSubmit(false));\r\n // }\r\n // }\r\n // return () => {\r\n // active = false;\r\n // };\r\n // }, [actions, dispatch, doSubmit]);\r\n\r\n // const handleSubmitForm = e => {\r\n // if (submitFormRef.current) {\r\n // submitFormRef.current(e);\r\n // }\r\n // };\r\n const portalRef = useRef(null);\r\n const bindSubmitForm = React.useCallback(\r\n submitForm => {\r\n submitFormRef.current = submitForm;\r\n },\r\n [submitFormRef],\r\n );\r\n const handleSubmit = React.useCallback(\r\n (values: IRepetitiveDto) => {\r\n if (saveRepetitive) {\r\n saveRepetitive(values);\r\n } else {\r\n var d = {\r\n StartDate:\r\n values.StartDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.StartDate),\r\n ),\r\n RecurringEvents: values.RecurringEvents,\r\n RepeatsOnDays: values.RepeatsOnDays,\r\n RecurringEndDate:\r\n values.RecurringEndDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.RecurringEndDate),\r\n ),\r\n RepeatsEveryDay: values.RepeatsEveryDay,\r\n RepeatsEveryPeriod: values.RepeatsEveryPeriod,\r\n RepeatsMonthlyBy: values.RepeatsMonthlyBy,\r\n } as IRepetitiveDto;\r\n dispatch(actions.saveState(d));\r\n }\r\n },\r\n [actions, dispatch, saveRepetitive],\r\n );\r\n return initData ? (\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","import { Entity } from 'types/common';\r\n\r\nexport interface IComment {\r\n Id: number;\r\n Text: string;\r\n CreatedAt: Date | string;\r\n CreatedBy: Entity;\r\n Files: CommentFile[];\r\n IsInternal?: boolean | null;\r\n}\r\n\r\nexport interface NewComment {\r\n Text?: string;\r\n Files?: FileList;\r\n Users: Entity[];\r\n IsInternal?: boolean | null;\r\n}\r\n\r\nexport interface CommentFile {\r\n Id: string;\r\n Name: string;\r\n Size?: number;\r\n}\r\nexport const ConvertNewToComment = (\r\n newcomment: NewComment,\r\n Id: number,\r\n CreatedAt: Date | string,\r\n CreatedBy: Entity,\r\n) => {\r\n let newFiles: CommentFile[] = [];\r\n if (!!newcomment.Files && newcomment.Files.length > 0) {\r\n for (\r\n let i: number = 0;\r\n !!newcomment.Files && i < newcomment.Files.length;\r\n i++\r\n ) {\r\n let item = newcomment.Files.item(i);\r\n if (!!item) {\r\n newFiles.push({\r\n Id: i.toString(),\r\n Name: item.name,\r\n Size: item.size,\r\n } as CommentFile);\r\n }\r\n }\r\n }\r\n return {\r\n Id: Id,\r\n Text: newcomment.Text || '',\r\n CreatedAt: CreatedAt,\r\n CreatedBy: CreatedBy,\r\n Files: newFiles,\r\n IsInternal: newcomment.IsInternal,\r\n } as IComment;\r\n};\r\n","import { AxiosError } from 'axios';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Identifiable } from 'types/common';\r\nimport { httpClient } from './HttpClient';\r\n\r\nexport interface IDeleteSamplesResult {\r\n successCount: number;\r\n errors: Error[];\r\n}\r\nexport async function deleteSamples(\r\n samples: Identifiable[],\r\n): Promise {\r\n let successCount = 0;\r\n const errors: Error[] = [];\r\n // todo: convert to transaction/batch\r\n for (const sample of samples) {\r\n const url = `/api/odata/v4/samples(${sample.Id})`;\r\n try {\r\n await httpClient.delete(url);\r\n successCount++;\r\n } catch (error) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n i18next.t(translations.errormessage);\r\n errors.push(new Error(message));\r\n }\r\n }\r\n\r\n return {\r\n successCount: successCount,\r\n errors: errors,\r\n };\r\n}\r\n","import BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport parse from 'html-react-parser';\r\n\r\nimport { uniqueId } from 'lodash';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\n\r\nexport interface ImportProps {\r\n onDownloadTemplateButtonClick?: React.MouseEventHandler;\r\n processing: boolean;\r\n title?: string;\r\n accept: '.xlsx' | '.xls' | '.csv';\r\n disabled?: boolean;\r\n hideImportButton?: boolean;\r\n hideMessage?: boolean;\r\n}\r\nexport interface ImportComponentProps extends ImportProps {\r\n handleFileChange: (file: File) => void;\r\n}\r\nexport function ImportComponent(props: ImportComponentProps) {\r\n const { t } = useTranslation();\r\n const ref = React.useRef(null);\r\n const handleFileChange = event => {\r\n const file = ref.current?.files?.[0];\r\n if (file !== undefined) {\r\n props.handleFileChange(file);\r\n }\r\n };\r\n\r\n const [fileId] = React.useState(uniqueId('import-file-'));\r\n const [buttonId] = React.useState(uniqueId('import-file-'));\r\n return (\r\n \r\n {props.onDownloadTemplateButtonClick !== undefined && (\r\n \r\n {t(translations.ImportRecordsDescription)}\r\n \r\n \r\n )}\r\n {props.onDownloadTemplateButtonClick !== undefined && (\r\n \r\n \r\n  \r\n \r\n \r\n )}\r\n \r\n {props.hideMessage === undefined ||\r\n (props.hideMessage === false && (\r\n \r\n ))}\r\n  \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { Action } from '@reduxjs/toolkit';\r\nimport { Task } from 'redux-saga';\r\nimport { fork, take, cancel, ActionPattern } from 'redux-saga/effects';\r\n\r\n/**\r\n * Similar to takeEvery, but also filters by the action parameters\r\n * see https://redux-saga.js.org/docs/api/#takelatestpattern-saga-args\r\n * @param patternOrChannel\r\n * @param keyfn\r\n * @param saga\r\n * @param args\r\n * @returns\r\n */\r\nexport const takeLatestByKey = (\r\n patternOrChannel: ActionPattern>,\r\n keyfn: (payload: TPayload) => string | number | symbol,\r\n saga,\r\n ...args\r\n) =>\r\n fork(function* () {\r\n const tasks: Record = {};\r\n while (true) {\r\n const action = yield take(patternOrChannel);\r\n const key = keyfn(action.payload);\r\n const isKeyEmpty = key === null && key === undefined;\r\n if (isKeyEmpty) {\r\n console.warn(\r\n `Empty key (${JSON.stringify(key)}) in takeLatestByKey.`,\r\n patternOrChannel,\r\n );\r\n }\r\n\r\n if (!isKeyEmpty) {\r\n if (tasks[key]) {\r\n yield cancel(tasks[key]); // cancel is no-op if the task has already terminated\r\n }\r\n }\r\n const task: Task = yield fork(saga, ...args.concat(action));\r\n if (!isKeyEmpty) {\r\n tasks[key] = task;\r\n }\r\n }\r\n });\r\n","import { IInvoiceTemplateDto } from 'app/pages/InvoiceTemplates/InvoiceTemplatesPage/IInvoiceTemplateDto';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { httpClient } from './HttpClient';\r\n\r\nconst url = '/api/odata/v4/InvoiceTemplates';\r\nexport const InvoiceTemplatesApi = {\r\n insertInvoiceTemplate: invoiceTemplate => {\r\n const form = new FormData();\r\n Object.keys(invoiceTemplate).forEach(k => {\r\n form.append(k, invoiceTemplate[k]);\r\n });\r\n\r\n if (\r\n !!invoiceTemplate.HeaderFile &&\r\n invoiceTemplate.HeaderFile?.length > 0\r\n ) {\r\n form.append(\r\n 'TemplateHeaderFile',\r\n invoiceTemplate.HeaderFile[0].PostedFile,\r\n );\r\n }\r\n if (\r\n !!invoiceTemplate.FooterFile &&\r\n invoiceTemplate.FooterFile?.length > 0\r\n ) {\r\n form.append(\r\n 'TemplateFooterFile',\r\n invoiceTemplate.FooterFile[0].PostedFile,\r\n );\r\n }\r\n return httpClient.post(url, form);\r\n },\r\n updateInvoiceTemplate: (Id: number, invoiceTemplate) => {\r\n const form = new FormData();\r\n Object.keys(invoiceTemplate).forEach(k => {\r\n form.append(k, invoiceTemplate[k]);\r\n });\r\n\r\n if (\r\n !!invoiceTemplate.HeaderFile &&\r\n invoiceTemplate.HeaderFile?.length > 0\r\n ) {\r\n form.append(\r\n 'TemplateHeaderFile',\r\n invoiceTemplate.HeaderFile[0].PostedFile,\r\n );\r\n }\r\n if (\r\n !!invoiceTemplate.FooterFile &&\r\n invoiceTemplate.FooterFile?.length > 0\r\n ) {\r\n form.append(\r\n 'TemplateFooterFile',\r\n invoiceTemplate.FooterFile[0].PostedFile,\r\n );\r\n }\r\n return httpClient.put(url + '(' + Id + ')', form);\r\n },\r\n deleteInvoiceTemplates: (\r\n rows: IInvoiceTemplateDto[],\r\n ): Promise => {\r\n const invoiceTemplatesIds: number[] = rows.map(item => item.Id);\r\n const data = { invoiceTemplatesIds };\r\n const url = '/api/odata/v4/InvoiceTemplates/DeleteInvoiceTemplates';\r\n return httpClient.post(url, data);\r\n },\r\n getInvoiceTemplateById: (Id: number) => {\r\n const params: {\r\n $filter?: string;\r\n $select: string;\r\n } = {\r\n $filter: '(Id eq ' + Id + ')',\r\n $select: [\r\n 'Id',\r\n 'Name',\r\n 'CreatedAt',\r\n 'LastUpdated',\r\n 'FundingType',\r\n 'ServiceGroupId',\r\n 'ServiceGroup',\r\n 'Html',\r\n 'TableHeaderColor',\r\n 'TableBodyColor',\r\n 'HeaderFileName',\r\n 'FooterFileName',\r\n ].join(','),\r\n };\r\n return httpClient.get(url, params);\r\n },\r\n};\r\n","import { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n InventoryBatchPicker,\r\n InventoryBatchPickerProps,\r\n} from '../pickers/AutocompletePickers/InventoryBatchesPicker';\r\n\r\nexport const FormInventoryBatchPicker = (\r\n props: FieldHookConfig &\r\n Omit,\r\n) => {\r\n const [field, meta, helpers] = useField(props);\r\n const handleChange = val => {\r\n props.onChange?.(val);\r\n helpers.setValue(val, true);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n","import { IServiceRequestTicketDto } from 'api/odata/generated/entities/IServiceRequestTicketDto';\r\n\r\nexport function getServiceRequestTicketTitle(item: IServiceRequestTicketDto) {\r\n return `#${item.ServiceRequestId} - ${item.ServiceRequest.CreatedFor?.Name}`;\r\n}\r\n","import { Button } from 'app/components/BasicButtons/Button';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useServiceRequestsKanbanSlice } from '../../slice';\r\nimport { Dto } from '../../slice/types';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface ParentTicketDetailsButtonProps {\r\n item?: Dto;\r\n}\r\n\r\nexport function ParentTicketDetailsButton({\r\n item,\r\n}: ParentTicketDetailsButtonProps) {\r\n const { t } = useTranslation();\r\n\r\n const dispatch = useDispatch();\r\n const { actions } = useServiceRequestsKanbanSlice();\r\n const handleOpenParentTicketClick = () => {\r\n if (item !== undefined) {\r\n dispatch(actions.showEditParent(item));\r\n }\r\n };\r\n if (\r\n item === undefined ||\r\n item.ParentTicketId === null ||\r\n item.ParentTicketId === undefined\r\n ) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n}\r\n","import { Caption } from 'app/components/Typography';\r\nimport { FormikErrors } from 'formik';\r\nimport styled from 'styled-components';\r\n\r\nexport interface ErrorsSummuryProps {\r\n errors: FormikErrors;\r\n}\r\nconst SummuryBox = styled('div')`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n`;\r\nexport function ErrorsSummury(props: ErrorsSummuryProps) {\r\n const data = Object.entries(props.errors).map(f => {\r\n return { name: f[0], msg: f[1] };\r\n });\r\n return data.length > 0 ? (\r\n \r\n {data.map(item => (\r\n \r\n {item.msg as string}\r\n \r\n ))}\r\n \r\n ) : null;\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for ArticlesExternalSearchPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ArticlesExternalSearchPagePath = '/articles/search';\r\nexport const ArticlesExternalSearchPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ArticlesExternalSearchPage,\r\n);\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IBudgetExperimentsFilterDto } from 'api/odata/generated/entities/IBudgetExperimentsFilterDto';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport {\r\n Condition,\r\n ODataOperators,\r\n quoteODataValue,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePickerProps,\r\n AutocompletePicker,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { BudgetExperimentStatuses } from 'enums/BudgetExperimentStatuses';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\n\r\nexport function budgetExperimentsFilter(\r\n serviceTypes: IServiceTypeFilterDto[],\r\n serviceType: ServiceType | undefined,\r\n budgetId: number | undefined,\r\n resStart: Date | string | null | undefined,\r\n resEnd: Date | string | null | undefined,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n\r\n predicates.push(\r\n new Condition(\r\n 'Active',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n\r\n predicates.push(\r\n new Condition(\r\n 'StatusId',\r\n ODataOperators.Equals,\r\n BudgetExperimentStatuses.Approved,\r\n ),\r\n );\r\n\r\n predicates.push(\r\n new Condition(\r\n 'BudgetTaskActive',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n\r\n if (!isNullOrUndefined(budgetId)) {\r\n predicates.push(\r\n new Condition(\r\n 'BudgetTaskBudgetId',\r\n ODataOperators.Equals,\r\n budgetId,\r\n ),\r\n );\r\n }\r\n\r\n if (serviceTypes.length > 0) {\r\n let ids = serviceTypes\r\n .filter(f => f.ServiceGroupId !== null)\r\n .map(f => {\r\n return { Id: f.ServiceGroupId } as Identifiable;\r\n });\r\n if (ids.length > 0) {\r\n predicates.push(\r\n `(${new Condition(\r\n 'BudgetTaskAllCoresAllowed',\r\n ODataOperators.Equals,\r\n true,\r\n )} or ${new Condition(\r\n 'BudgetTaskServiceGroupIds',\r\n ODataOperators.AnyIn,\r\n ids,\r\n )})`,\r\n );\r\n predicates.push(\r\n `(BudgetExperimentServiceGroups/any(s: s/ServiceGroupId in ${quoteODataValue(\r\n ids,\r\n )} and s/StatusId eq ${quoteODataValue(\r\n BudgetExperimentStatuses.Approved,\r\n )}))`,\r\n );\r\n }\r\n }\r\n\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n\r\nexport interface BudgetExperimentsPickerProps\r\n extends Omit<\r\n AutocompletePickerProps,\r\n 'loadData'\r\n > {\r\n username?: string;\r\n name?: string;\r\n placeholder?: string;\r\n onBlur?: React.FocusEventHandler;\r\n error?: boolean;\r\n helperText?: string;\r\n}\r\nconst url = '/api/odata/v4/BudgetExperimentsFilter';\r\nexport const initBudgetExperimentData = (\r\n initval: string | undefined,\r\n username: string,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(`${url}?username=${username}`, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n username: string,\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url: `${url}?username=${username}`,\r\n predicates: predicates,\r\n select: ['Id', 'Name', 'Active', 'StatusId'],\r\n });\r\nexport function BudgetExperimentsPicker(props: BudgetExperimentsPickerProps) {\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const { username } = props;\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n username || authenticatedUser?.Id || '',\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\nexport const loadBudgetExperiments = loadData;\r\n","import { IBudgetExperimentsFilterDto } from 'api/odata/generated/entities/IBudgetExperimentsFilterDto';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { BudgetExperimentsPicker } from '../pickers/AutocompletePickers/BudgetExperimentsPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport const FormBudgetExperimentsPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps & {\r\n username: string | undefined;\r\n }) => {\r\n const [field, meta, helpers] = useField(\r\n props,\r\n );\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n username={props.username}\r\n />\r\n );\r\n};\r\n","import { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectConnectedSettings } from '../slice/selectors';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nexport interface UserGroupListenerProps {\r\n userName: Entity | null;\r\n services: Entity[];\r\n userGroup: Entity | null | undefined;\r\n isEdit: boolean;\r\n setUser: (value: Entity | null) => void;\r\n setBudget: (value: Entity | null) => void;\r\n values?: T;\r\n forceDisabled?: boolean;\r\n user: AuthenticatedUser | undefined;\r\n}\r\nexport function UserGroupListener(props: UserGroupListenerProps) {\r\n const {\r\n userName,\r\n services,\r\n userGroup,\r\n isEdit,\r\n setUser,\r\n setBudget,\r\n forceDisabled,\r\n user,\r\n } = props;\r\n const [initilized, setInitilized] = React.useState(!forceDisabled);\r\n const serviceSettings = useSelector(selectConnectedSettings);\r\n React.useEffect(() => {\r\n if (!initilized) {\r\n if (userGroup !== null) {\r\n if (\r\n serviceSettings.budgetVisible &&\r\n !isEdit &&\r\n services.length > 0 &&\r\n userName !== null\r\n ) {\r\n if (!serviceSettings.ReservationUserGroupGroupByBudgetUserGroup) {\r\n if (userGroup?.Id !== (userName as IUserFilterDto)?.UserGroupId) {\r\n setUser(null);\r\n if (serviceSettings.budgetVisible && !isEdit) {\r\n setBudget(null);\r\n }\r\n }\r\n }\r\n } else if (!serviceSettings.budgetVisible && !isEdit) {\r\n if (\r\n !(\r\n (!!userName?.Id &&\r\n !!(userName as IUserFilterDto).UserGroupId &&\r\n (userName as IUserFilterDto).UserGroupId === userGroup?.Id) ||\r\n (userName?.Id === user?.Id &&\r\n user?.ActiveUserGroup?.Id === userGroup?.Id)\r\n )\r\n ) {\r\n setUser(null);\r\n }\r\n }\r\n } else {\r\n if (!serviceSettings.ReservationUserGroupGroupByBudgetUserGroup) {\r\n setUser(null);\r\n if (serviceSettings.budgetVisible && !isEdit) {\r\n setBudget(null);\r\n }\r\n }\r\n }\r\n }\r\n setInitilized(false);\r\n return () => {};\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userGroup]);\r\n\r\n return null;\r\n}\r\n","import { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { selectConnectedSettings } from '../slice/selectors';\r\n\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\n\r\nexport interface UserNameListenerProps {\r\n userName: Entity | null;\r\n userGroup: Entity | null;\r\n services: Entity[];\r\n user: AuthenticatedUser | undefined;\r\n globalSettings: GlobalSettingsType;\r\n isEdit: boolean;\r\n startTime: Date | string;\r\n endTime?: Date | string;\r\n setUserGroup: (value: Entity | null) => void;\r\n setBudget: (value: Entity | null) => void;\r\n values?: T;\r\n forceDisabled?: boolean;\r\n}\r\nexport function UserNameListener(props: UserNameListenerProps) {\r\n const {\r\n userName,\r\n services,\r\n isEdit,\r\n userGroup,\r\n // startTime,\r\n // endTime,\r\n globalSettings,\r\n //user,\r\n setUserGroup,\r\n forceDisabled,\r\n } = props;\r\n const serviceSettings = useSelector(selectConnectedSettings);\r\n const ReservationUserGroupGroupByBudgetUserGroup = React.useMemo(() => {\r\n return serviceSettings.budgetVisible\r\n ? globalSettings.reservationUserGroupGroupByBudgetUserGroup\r\n : false;\r\n }, [\r\n globalSettings.reservationUserGroupGroupByBudgetUserGroup,\r\n serviceSettings.budgetVisible,\r\n ]);\r\n // const fetchBudget = async () => {\r\n // try {\r\n // const budgets = await loadBudgets(\r\n // restrictedBudgetFilter(\r\n // serviceSettings.budgetLimitedByUsers || false,\r\n // serviceSettings.isBudgetsWithoutUserGroup || false,\r\n // serviceSettings.isServiceAdmin\r\n // ? serviceSettings.ReservationUserGroupGroupByBudgetUserGroup\r\n // ? undefined\r\n // : userGroup?.Id\r\n // : user?.ActiveUserGroup?.Id,\r\n // undefined,\r\n // services as IServiceTypeFilterDto[],\r\n // dateUtils.toDate(startTime),\r\n // !!endTime ? dateUtils.toDate(endTime) : undefined,\r\n // serviceSettings.isServiceAdmin\r\n // ? userName === null\r\n // ? undefined\r\n // : userName.Id\r\n // : user?.Id,\r\n // globalSettings.defaultBudgetEnabled,\r\n // globalSettings.userDefaultBudgetEnabled,\r\n // globalSettings.hideNonDefaultBudgets,\r\n // ),\r\n // )(null);\r\n // return budgets.value;\r\n // } catch {\r\n // return [];\r\n // }\r\n // };\r\n const [initilized, setInitilized] = React.useState(!forceDisabled);\r\n React.useEffect(() => {\r\n if (!initilized) {\r\n if (services.length > 0 && !isEdit) {\r\n //Budget Change\r\n // if (serviceSettings.budgetVisible && !isEdit) {\r\n // if (userName !== null) {\r\n // (async () => {\r\n // const budgets = await fetchBudget();\r\n // if (budgets.length > 0) {\r\n // if (\r\n // globalSettings.defaultBudgetEnabled ||\r\n // budgets.length === 1\r\n // ) {\r\n // setBudget(budgets[0]);\r\n // if (\r\n // serviceSettings.ReservationUserGroupGroupByBudgetUserGroup\r\n // ) {\r\n // setUserGroup({\r\n // Id: budgets[0].UserGroupId,\r\n // Name: budgets[0].UserGroupName,\r\n // } as Entity);\r\n // }\r\n // } else {\r\n // setBudget(null);\r\n // }\r\n // } else {\r\n // setBudget(null);\r\n // }\r\n // })();\r\n // } else {\r\n // setBudget(null);\r\n // }\r\n // } else {\r\n // if (userName !== null && userGroup === null && !isEdit) {\r\n // setUserGroup({\r\n // Id: (userName as IUserFilterDto).UserGroupId,\r\n // Name: (userName as IUserFilterDto).UserGroupName,\r\n // } as Entity);\r\n // }\r\n // }\r\n if (userName !== null) {\r\n if (\r\n !ReservationUserGroupGroupByBudgetUserGroup &&\r\n userGroup === null\r\n ) {\r\n setUserGroup({\r\n Id: (userName as IUserFilterDto).UserGroupId,\r\n Name: (userName as IUserFilterDto).UserGroupName,\r\n } as Entity);\r\n } else {\r\n // setUserGroup({\r\n // Id: (userName as IUserFilterDto).UserGroupId,\r\n // Name: (userName as IUserFilterDto).UserGroupName,\r\n // } as Entity);\r\n if (!serviceSettings.ReservationUserGroupGroupByBudgetUserGroup) {\r\n setUserGroup({\r\n Id: (userName as IUserFilterDto).UserGroupId,\r\n Name: (userName as IUserFilterDto).UserGroupName,\r\n } as Entity);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n setInitilized(false);\r\n return () => {};\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userName]);\r\n\r\n return null;\r\n}\r\n","import { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { IUserGroupDto } from 'api/odata/generated/entities/IUserGroupDto';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectConnectedSettings } from '../slice/selectors';\r\nimport {\r\n budgetExperimentsFilter,\r\n loadBudgetExperiments,\r\n} from 'app/components/pickers/AutocompletePickers/BudgetExperimentsPicker';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { initBudgetData } from 'app/components/pickers/AutocompletePickers/BudgetPicker';\r\n\r\nexport interface BudgetListenerProps {\r\n budget: Entity | null;\r\n values?: T;\r\n setUserGroup: (value: Entity | null) => void;\r\n setBudgetExperiment: (value: Entity | null) => void;\r\n setBudget: (value: Entity | null) => void;\r\n userName: Entity | null;\r\n services: Entity[];\r\n isEdit: boolean;\r\n startTime: Date | string;\r\n endTime?: Date | string;\r\n user: AuthenticatedUser | undefined;\r\n serviceTypeEnum?: ServiceType;\r\n forceDisabled?: boolean;\r\n}\r\n\r\nexport function BudgetListener(props: BudgetListenerProps) {\r\n const {\r\n budget,\r\n setUserGroup,\r\n setBudgetExperiment,\r\n setBudget,\r\n services,\r\n userName,\r\n isEdit,\r\n startTime,\r\n endTime,\r\n serviceTypeEnum,\r\n user,\r\n forceDisabled,\r\n } = props;\r\n const [initilized, setInitilized] = React.useState(!forceDisabled);\r\n const serviceSettings = useSelector(selectConnectedSettings);\r\n const currentUser =\r\n !!userName && userName !== null ? userName.Id : user?.Id || '';\r\n const fetchBudgetExperiment = async () => {\r\n try {\r\n const budgetExperiments = await loadBudgetExperiments(\r\n budgetExperimentsFilter(\r\n services as IServiceTypeFilterDto[],\r\n serviceTypeEnum,\r\n budget?.Id,\r\n startTime,\r\n endTime,\r\n ),\r\n currentUser,\r\n )(null);\r\n return budgetExperiments.value;\r\n } catch {\r\n return [];\r\n }\r\n };\r\n React.useEffect(() => {\r\n let cancel = false;\r\n if (!initilized) {\r\n if (!!budget?.Id) {\r\n if (serviceSettings.ReservationUserGroupGroupByBudgetUserGroup) {\r\n //let budget = values.Budget as IBudgetFilterDto;\r\n if (!!(budget as IBudgetFilterDto).UserGroupId) {\r\n setUserGroup({\r\n Id: (budget as IBudgetFilterDto).UserGroupId,\r\n Name: (budget as IBudgetFilterDto).UserGroupName,\r\n } as IUserGroupDto);\r\n }\r\n }\r\n if (serviceSettings.budgetExpirementVisible && !isEdit) {\r\n if ((budget as IBudgetFilterDto).HideExperiments === false) {\r\n (async () => {\r\n await fetchBudgetExperiment()\r\n .then(experiments => {\r\n if (cancel) {\r\n return;\r\n }\r\n if (experiments.length > 0) {\r\n if (experiments.length === 1) {\r\n setBudgetExperiment(experiments[0]);\r\n } else {\r\n setBudgetExperiment(null);\r\n }\r\n } else {\r\n setBudgetExperiment(null);\r\n }\r\n })\r\n .catch(() => {\r\n setBudgetExperiment(null);\r\n });\r\n })();\r\n } else {\r\n setBudgetExperiment(null);\r\n }\r\n }\r\n } else {\r\n if (serviceSettings.ReservationUserGroupGroupByBudgetUserGroup) {\r\n setUserGroup(null);\r\n }\r\n if (serviceSettings.budgetExpirementVisible) {\r\n setBudgetExperiment(null);\r\n }\r\n }\r\n } else {\r\n if (isEdit && budget !== null) {\r\n (async () => {\r\n await initBudgetData(budget.Id.toString())\r\n .then(budg => {\r\n if (cancel) {\r\n return;\r\n }\r\n setBudget(budg[0]);\r\n })\r\n .catch(() => {});\r\n })();\r\n }\r\n }\r\n setInitilized(false);\r\n return () => {\r\n cancel = true;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [budget]);\r\n\r\n return null;\r\n}\r\n","import { translations } from 'locales/translations';\r\nimport { useCallback, useRef, useState, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IConnectedFiltersDto } from 'types/IConnectedFiltersDto';\r\nimport { FieldHandler, FormListener } from '../FormRender/FormRenderer';\r\nimport * as Yup from 'yup';\r\nimport {\r\n BudgetEntitySechema,\r\n BudgetExperimentEntitySechema,\r\n InstituteProjectEntitySechema,\r\n UserEntitySchema,\r\n UserGroupEntitySchema,\r\n} from '../Schemas';\r\nimport { TransformDate } from '../Schemas/SchemaMethods';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Formik, FormikProps, FormikValues } from 'formik';\r\nimport { FormUserPicker } from '../FormUserPicker';\r\nimport { FormFieldsSection, FormRow } from '../FormsLayout';\r\nimport { FormBudgetExperimentsPicker } from '../FormBudgetExperimentsPicker';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { budgetExperimentsFilter } from 'app/components/pickers/AutocompletePickers/BudgetExperimentsPicker';\r\nimport { FormRestrictedUserGroupPicker } from '../FormRestrictedUserGroupPicker';\r\nimport { RestrictedFilter } from 'app/components/pickers/AutocompletePickers/UserGroupPicker';\r\nimport { FormLabelText } from '../FormLabelText';\r\nimport { Box } from '@material-ui/core';\r\nimport { ServicesFilter } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { FormFundingTypePicker } from '../FormFundingTypePicker';\r\nimport { FormBudgetPicker } from '../FormBudgetPicker';\r\nimport { restrictedBudgetFilter } from 'app/components/pickers/AutocompletePickers/BudgetPicker';\r\nimport { getSingleInvoiceFundingType } from 'app/components/pickers/StaticOptionsPickers/FundingTypeIdPicker';\r\nimport {\r\n selectConnectedFieldHandler,\r\n selectConnectedFiltersData,\r\n selectConnectedSettings,\r\n} from './slice/selectors';\r\nimport { useConnectedFiltersSlice } from './slice';\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { UserGroupListener } from './FormFieldListeners/UserGroupListener';\r\nimport { UserNameListener } from './FormFieldListeners/UserNameListener';\r\nimport { BudgetListener } from './FormFieldListeners/BudgetListener';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport React from 'react';\r\nimport { Roles } from 'app/slice/types';\r\nimport { FormBookitDateTimePicker } from '../FormBookitDateTimePicker';\r\n\r\nexport interface ConnectedFiltersFormProps {\r\n isEdit: boolean;\r\n onSubmit: (item: IConnectedFiltersDto) => void;\r\n ConnectedFiltersData?: IConnectedFiltersDto;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n serviceTypeEnum?: ServiceType;\r\n serviceTypes: IServiceTypeFilterDto[];\r\n globalSettings: GlobalSettingsType;\r\n startTimeLabel?: string;\r\n endTimeLabel?: string;\r\n startLabelInline?: boolean;\r\n endLabelInline?: boolean;\r\n formIsValid?: (isValid: boolean) => void;\r\n orderForConsumables?: boolean;\r\n forceDisabled?: boolean;\r\n budgetPickerInfo?: string;\r\n}\r\n\r\nexport function ConnectedFiltersForm({\r\n isEdit,\r\n onSubmit,\r\n ConnectedFiltersData,\r\n processing,\r\n bindSubmitForm,\r\n serviceTypeEnum,\r\n serviceTypes,\r\n startTimeLabel,\r\n endTimeLabel,\r\n startLabelInline,\r\n endLabelInline,\r\n globalSettings,\r\n formIsValid,\r\n orderForConsumables,\r\n forceDisabled,\r\n budgetPickerInfo,\r\n}: ConnectedFiltersFormProps): JSX.Element {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useConnectedFiltersSlice();\r\n //USER AUTH\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const connectedSettings = useSelector(selectConnectedSettings);\r\n const connectedData = useSelector(selectConnectedFiltersData);\r\n //PICKER STATES\r\n const [userChanged, setUserChanged] = useState(false);\r\n const [userGroupChanged, setUserGroupChanged] = useState(false);\r\n const [budgetChanged, setBudgetChanged] = useState(false);\r\n const [budgetExpirementChanged, setBudgetExpirementChanged] = useState<\r\n boolean\r\n >(false);\r\n const [startTimeChanged, setStartTimeChanged] = useState(false);\r\n const [endTimeChanged, setEndTimeChanged] = useState(false);\r\n const { newDate } = useSystemDate();\r\n //REFS\r\n const formikRef = useRef>(null);\r\n //SCHEMA\r\n const computedSchema = useMemo(() => {\r\n const ConnectedFiltersSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n StartTime: Yup.date()\r\n .transform(TransformDate)\r\n .default(dateUtils.dateOrStringToDate(newDate())),\r\n EndTime: Yup.date().transform(TransformDate).optional(),\r\n User: UserEntitySchema.label(t(translations.User) as string)\r\n .nullable()\r\n .notRequired(),\r\n UserGroup: UserGroupEntitySchema.label(\r\n t(translations.UserGroup) as string,\r\n )\r\n .nullable()\r\n .default(null),\r\n Budget: BudgetEntitySechema.label(\r\n t(translations.BudgetNumber) as string,\r\n )\r\n .nullable()\r\n .default(null),\r\n //BudgetExperimentId if displayed then should be required\r\n BudgetExperiment: BudgetExperimentEntitySechema.nullable().default(\r\n null,\r\n ),\r\n InstituteProject: InstituteProjectEntitySechema.nullable()\r\n .notRequired()\r\n .optional()\r\n .default(null),\r\n ExternalCustomer: Yup.mixed()\r\n .label(t(translations.ExternalCustomer) as string)\r\n .nullable(true),\r\n FundingType: Yup.mixed()\r\n .default(getSingleInvoiceFundingType(0))\r\n .label(t(translations.FundingType) as string),\r\n PurchaseOrder: Yup.string()\r\n .label(t(translations.PurchaseOrder) as string)\r\n .nullable(true),\r\n Reference: Yup.string()\r\n .label(t(translations.Reference) as string)\r\n .nullable(true),\r\n },\r\n );\r\n if (connectedSettings.budgetVisible === true) {\r\n ConnectedFiltersSchema.fields.Budget.withMutation(schema =>\r\n schema\r\n .required(\r\n `${t(translations.BudgetIsRequired) as string} ${\r\n !!budgetPickerInfo && forceDisabled ? budgetPickerInfo : ''\r\n }`,\r\n )\r\n .label(t(translations.BudgetNumber) as string),\r\n );\r\n }\r\n if (!processing) {\r\n if (\r\n connectedSettings.budgetExpirementVisible &&\r\n !!connectedData &&\r\n !!connectedData.Budget &&\r\n connectedData.Budget !== null &&\r\n (connectedData.Budget as IBudgetFilterDto).HideExperiments !==\r\n undefined &&\r\n (connectedData.Budget as IBudgetFilterDto)?.HideExperiments === false\r\n ) {\r\n ConnectedFiltersSchema.fields.BudgetExperiment.withMutation(schema =>\r\n schema.required(\r\n t(translations.res_err_BudgetExperimentRequired) as string,\r\n ),\r\n );\r\n }\r\n if (\r\n !connectedSettings.budgetVisible ||\r\n (connectedSettings.budgetVisible &&\r\n !connectedSettings.ReservationUserGroupGroupByBudgetUserGroup) ||\r\n connectedSettings.userGroupVisible\r\n ) {\r\n ConnectedFiltersSchema.fields.UserGroup.withMutation(schema =>\r\n schema\r\n .label(t(translations.UserGroup) as string)\r\n .required(t(translations.err_UserGroupRequired) as string),\r\n );\r\n ConnectedFiltersSchema.fields.User.withMutation(schema =>\r\n schema\r\n .label(t(translations.User) as string)\r\n .required(t(translations.err_UserFieldRequired) as string),\r\n );\r\n }\r\n if (connectedSettings.endTimeVisible) {\r\n ConnectedFiltersSchema.fields.EndTime.withMutation(schema =>\r\n schema\r\n .label(t(translations.EndTime) as string)\r\n .required(t(translations._errEndTimeRequired) as string)\r\n .min(\r\n Yup.ref('StartTime'),\r\n t(translations.err_EndTimeLowerThanStartTime) as string,\r\n ),\r\n );\r\n }\r\n if (connectedSettings.userVisible) {\r\n ConnectedFiltersSchema.fields.User.withMutation(schema =>\r\n schema\r\n .label(t(translations.User) as string)\r\n .required(t(translations.err_UserFieldRequired) as string),\r\n );\r\n }\r\n }\r\n\r\n return ConnectedFiltersSchema;\r\n }, [\r\n budgetPickerInfo,\r\n connectedData,\r\n connectedSettings.ReservationUserGroupGroupByBudgetUserGroup,\r\n connectedSettings.budgetExpirementVisible,\r\n connectedSettings.budgetVisible,\r\n connectedSettings.endTimeVisible,\r\n connectedSettings.userGroupVisible,\r\n connectedSettings.userVisible,\r\n forceDisabled,\r\n newDate,\r\n processing,\r\n t,\r\n ]);\r\n const fieldHandler = useSelector(selectConnectedFieldHandler);\r\n const isRoleAdmin =\r\n authenticatedUser?.Roles.includes(Roles.Administrators) ||\r\n authenticatedUser?.Roles.includes(Roles.GroupAdministrators) ||\r\n authenticatedUser?.Roles.includes(Roles.LabTech);\r\n const reserFieldHandler = () => {\r\n dispatch(actions.resetConnectedHandler());\r\n };\r\n const updateDataState = useCallback(\r\n (value: IConnectedFiltersDto) => {\r\n dispatch(actions.saveState(value));\r\n dispatch(\r\n actions.extendSettingsState({\r\n services: serviceTypes,\r\n globalSettings: globalSettings,\r\n settings: connectedSettings,\r\n isEdit: isEdit,\r\n data: value,\r\n }),\r\n );\r\n },\r\n [\r\n actions,\r\n connectedSettings,\r\n dispatch,\r\n globalSettings,\r\n isEdit,\r\n serviceTypes,\r\n ],\r\n );\r\n const editAllowed = useMemo(() => {\r\n return (\r\n !isEdit ||\r\n (isEdit &&\r\n (connectedSettings.isServiceAdmin === true ||\r\n authenticatedUser?.Id === connectedData?.User?.Id))\r\n );\r\n }, [\r\n authenticatedUser?.Id,\r\n connectedData?.User?.Id,\r\n connectedSettings.isServiceAdmin,\r\n isEdit,\r\n ]);\r\n const createUpdateAllowed = useMemo(() => {\r\n return (\r\n (isEdit && editAllowed) ||\r\n (!isEdit && (connectedSettings.isServiceAdmin || isRoleAdmin))\r\n );\r\n }, [connectedSettings.isServiceAdmin, editAllowed, isEdit, isRoleAdmin]);\r\n //FUNCTIONS\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value);\r\n }\r\n };\r\n\r\n //TO DO:\r\n // const DefaultExperiment = useCallback(\r\n // (budgetId: number, serviceTypeId: number | undefined) => {},\r\n // [],\r\n // );\r\n\r\n // const DefaultBudget = useCallback(\r\n // (\r\n // userGroup: string | undefined,\r\n // user: string | undefined,\r\n // serviceTypeId: number | undefined,\r\n // ) => {\r\n // (async () => {\r\n // try {\r\n // let budgetIdByOtherServiceId = await ConnectedFiltersApi.getBudgetIdByServiceId(\r\n // userGroup,\r\n // user,\r\n // );\r\n // const budgetResult: IDefaultBudget[] = budgetIdByOtherServiceId.value;\r\n // //console.log(budgetResult);\r\n // if (!isNullOrUndefined(budgetResult)) {\r\n // if (budgetResult.length > 0) {\r\n // if (budgetResult.filter(b => b.IsDefault === true).length > 0) {\r\n // for (var i = 0; i < budgetResult.length; i++) {\r\n // if (budgetResult[i].IsDefault === true) {\r\n // //await initBudgetData(budgetResult[i].Id.toString());\r\n // formikRef.current?.setFieldValue(\r\n // 'Budget',\r\n // budgetResult[i],\r\n // true,\r\n // );\r\n // if (connectedSettings.budgetExpirementVisible) {\r\n // if (budgetResult[i].HideExperiments === false) {\r\n // DefaultExperiment(budgetResult[i].Id, serviceTypeId);\r\n // }\r\n // }\r\n // break;\r\n // }\r\n // }\r\n // } else {\r\n // let message: string | undefined = undefined;\r\n // //message = defineMessage(message);\r\n // if (!isNullOrUndefined(message)) {\r\n // //setValidationMessage(message);\r\n // }\r\n // }\r\n // }\r\n // } else {\r\n // let message: string | undefined = undefined;\r\n // //message = t(translations.NotAvailableBudget) as string;\r\n // //message = defineMessage(message);\r\n // if (!isNullOrUndefined(message)) {\r\n // //setValidationMessage(message);\r\n // }\r\n // }\r\n // } catch {}\r\n // })();\r\n // },\r\n // [DefaultExperiment, connectedSettings.budgetExpirementVisible],\r\n // );\r\n\r\n //USE EFFECT\r\n //To handle this formik values in coordination with outer formik values like ServiceType filter\r\n // useEffect(() => {\r\n // if (\r\n // serviceTypeFirstChange &&\r\n // !isNullOrUndefined(serviceTypeFilterValues) &&\r\n // !isNullOrUndefined(formikRef.current?.values.UserGroup) &&\r\n // !isNullOrUndefined(formikRef.current?.values.User)\r\n // ) {\r\n // //SET FIRST DEFAULT BUDGET OF OTHER SERVICE (IF EXIST)\r\n // //WHEN FILTER VALUE IS CHOSEN FOR THE FIRST TIME\r\n // DefaultBudget(\r\n // formikRef.current?.values.UserGroup?.Id,\r\n // formikRef.current?.values.User?.Id,\r\n // serviceTypeFilterValues.Id,\r\n // );\r\n // setServiceTypeFirstChange(false);\r\n // }\r\n // if (serviceTypeChanged) {\r\n // if (\r\n // !isNullOrUndefined(serviceTypeFilterValues) &&\r\n // serviceTypeFilterValues.HideProjects === true\r\n // ) {\r\n // formikRef.current?.setFieldValue('Budget', null, false);\r\n // setHideBudgets(true);\r\n // } else {\r\n // setHideBudgets(false);\r\n // }\r\n // setServiceTypeChanged(false);\r\n // }\r\n // }, [\r\n // DefaultBudget,\r\n // serviceTypeChanged,\r\n // serviceTypeFilterValues,\r\n // serviceTypeFirstChange,\r\n // setServiceTypeChanged,\r\n // setServiceTypeFirstChange,\r\n // ]);\r\n\r\n //ON FORM CHANGE\r\n const handleFormChange = useCallback(\r\n (values: IConnectedFiltersDto, isValid, dirty, setValue) => {\r\n if (userGroupChanged) {\r\n updateDataState(values);\r\n setUserGroupChanged(false);\r\n }\r\n if (userChanged) {\r\n updateDataState(values);\r\n setUserChanged(false);\r\n }\r\n if (startTimeChanged) {\r\n updateDataState(values);\r\n setStartTimeChanged(false);\r\n }\r\n if (endTimeChanged) {\r\n updateDataState(values);\r\n setEndTimeChanged(false);\r\n }\r\n if (budgetChanged) {\r\n updateDataState(values);\r\n\r\n setBudgetChanged(false);\r\n }\r\n if (budgetExpirementChanged) {\r\n updateDataState(values);\r\n setBudgetExpirementChanged(false);\r\n }\r\n },\r\n [\r\n budgetChanged,\r\n budgetExpirementChanged,\r\n endTimeChanged,\r\n startTimeChanged,\r\n updateDataState,\r\n userChanged,\r\n userGroupChanged,\r\n ],\r\n );\r\n\r\n //RENDER\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n // if (formik.errors) {\r\n // console.log('connected errors', formik.errors);\r\n // console.log('connected values', formik.values);\r\n // }\r\n if (formIsValid) {\r\n formIsValid(formik.isValid);\r\n }\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n updateDataState(\r\n Object.assign(\r\n {},\r\n formik.values,\r\n value,\r\n ) as IConnectedFiltersDto,\r\n )\r\n }\r\n resetFieldState={reserFieldHandler}\r\n />\r\n {!forceDisabled && (\r\n \r\n {\r\n formik.setFieldValue('User', value);\r\n updateDataState(formik.values as IConnectedFiltersDto);\r\n }}\r\n setBudget={value => {\r\n formik.setFieldValue('Budget', value);\r\n updateDataState(formik.values as IConnectedFiltersDto);\r\n }}\r\n forceDisabled={forceDisabled}\r\n />\r\n {\r\n formik.setFieldValue('UserGroup', value);\r\n updateDataState(formik.values as IConnectedFiltersDto);\r\n }}\r\n setBudget={value => {\r\n formik.setFieldValue('Budget', value);\r\n updateDataState(formik.values as IConnectedFiltersDto);\r\n }}\r\n user={authenticatedUser}\r\n globalSettings={globalSettings}\r\n startTime={formik.values.StartTime}\r\n endTime={formik.values.EndTime}\r\n userGroup={formik.values.UserGroup}\r\n forceDisabled={forceDisabled}\r\n />\r\n {\r\n formik.setFieldValue('UserGroup', value);\r\n updateDataState(formik.values as IConnectedFiltersDto);\r\n }}\r\n setBudgetExperiment={value => {\r\n formik.setFieldValue('BudgetExperiment', value);\r\n updateDataState(formik.values as IConnectedFiltersDto);\r\n }}\r\n setBudget={value => {\r\n formik.setFieldValue('Budget', value);\r\n updateDataState(formik.values as IConnectedFiltersDto);\r\n }}\r\n budget={formik.values.Budget}\r\n userName={formik.values.User}\r\n services={serviceTypes}\r\n isEdit={isEdit}\r\n startTime={formik.values.StartTime}\r\n endTime={formik.values.EndTime}\r\n user={authenticatedUser}\r\n forceDisabled={forceDisabled}\r\n />\r\n \r\n )}\r\n\r\n {orderForConsumables ? (\r\n \r\n {connectedSettings.fundingTypeVisible && (\r\n \r\n \r\n \r\n )}\r\n {connectedSettings.budgetVisible && (\r\n \r\n setBudgetChanged(true)}\r\n disabled={\r\n formik.isSubmitting ||\r\n connectedSettings.hideProject ||\r\n !editAllowed ||\r\n forceDisabled\r\n }\r\n info={budgetPickerInfo}\r\n fullWidth\r\n />\r\n \r\n )}\r\n {connectedSettings.budgetExpirementVisible &&\r\n formik.values.Budget !== null &&\r\n formik.values.Budget?.HideExperiments !== true && (\r\n \r\n setBudgetExpirementChanged(true)}\r\n disabled={\r\n formik.isSubmitting || isEdit || forceDisabled\r\n }\r\n username={\r\n formik.values.User?.Id ?? authenticatedUser?.Id\r\n }\r\n />\r\n \r\n )}\r\n \r\n setStartTimeChanged(true)}\r\n disabled={\r\n formik.isSubmitting || isEdit || forceDisabled\r\n }\r\n />\r\n \r\n {connectedSettings.endTimeVisible && (\r\n \r\n setEndTimeChanged(true)}\r\n fullWidth\r\n />\r\n \r\n )}\r\n {connectedSettings.userGroupVisible ? (\r\n \r\n setUserGroupChanged(true)}\r\n fullWidth\r\n />\r\n \r\n ) : (\r\n \r\n \r\n {formik.values.UserGroup !== undefined &&\r\n formik.values.UserGroup !== null\r\n ? formik.values.UserGroup.Name\r\n : (t(translations.NA) as string)}\r\n \r\n }\r\n />\r\n \r\n )}\r\n {connectedSettings.userVisible ? (\r\n \r\n setUserChanged(true)}\r\n fullWidth\r\n />\r\n \r\n ) : (\r\n \r\n \r\n {formik.values.User !== null &&\r\n formik.values.User !== undefined\r\n ? formik.values.User.Name\r\n : (t(translations.NA) as string)}\r\n \r\n }\r\n />\r\n \r\n )}\r\n \r\n ) : (\r\n \r\n {' '}\r\n \r\n setStartTimeChanged(true)}\r\n disabled={\r\n formik.isSubmitting || isEdit || forceDisabled\r\n }\r\n />\r\n \r\n {connectedSettings.endTimeVisible && (\r\n \r\n setEndTimeChanged(true)}\r\n fullWidth\r\n />\r\n \r\n )}\r\n {connectedSettings.userGroupVisible ? (\r\n \r\n setUserGroupChanged(true)}\r\n fullWidth\r\n />\r\n \r\n ) : (\r\n \r\n \r\n {formik.values.UserGroup !== undefined &&\r\n formik.values.UserGroup !== null\r\n ? formik.values.UserGroup.Name\r\n : (t(translations.NA) as string)}\r\n \r\n }\r\n />\r\n \r\n )}\r\n {connectedSettings.userVisible ? (\r\n \r\n setUserChanged(true)}\r\n fullWidth\r\n />\r\n \r\n ) : (\r\n \r\n \r\n {formik.values.User !== null &&\r\n formik.values.User !== undefined\r\n ? formik.values.User.Name\r\n : (t(translations.NA) as string)}\r\n \r\n }\r\n />\r\n \r\n )}\r\n {connectedSettings.fundingTypeVisible && (\r\n \r\n \r\n \r\n )}\r\n {connectedSettings.budgetVisible && (\r\n \r\n setBudgetChanged(true)}\r\n disabled={\r\n formik.isSubmitting ||\r\n !editAllowed ||\r\n connectedSettings.hideProject ||\r\n forceDisabled\r\n }\r\n useSearchOrPredicate={\r\n globalSettings.hideNonDefaultBudgets\r\n }\r\n info={budgetPickerInfo}\r\n fullWidth\r\n />\r\n \r\n )}\r\n {connectedSettings.budgetExpirementVisible &&\r\n formik.values.Budget !== null &&\r\n formik.values.Budget?.HideExperiments !== true && (\r\n \r\n setBudgetExpirementChanged(true)}\r\n disabled={\r\n formik.isSubmitting || isEdit || forceDisabled\r\n }\r\n username={\r\n formik.values.User?.Id ?? authenticatedUser?.Id\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","import { Portal } from '@material-ui/core';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { Fragment, MutableRefObject, useCallback, useRef } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { IConnectedFiltersDto } from 'types/IConnectedFiltersDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { ConnectedFiltersForm } from '.';\r\nimport { useConnectedFiltersSlice } from './slice';\r\n\r\nexport interface ConnectedFiltersControlProps {\r\n initialState?: IConnectedFiltersDto;\r\n saveConnectedFilters?: (values: IConnectedFiltersDto) => void;\r\n submitFormRef: MutableRefObject;\r\n isEdit: boolean;\r\n serviceTypeEnum?: ServiceType;\r\n serviceTypes: IServiceTypeFilterDto[];\r\n formIsValid?: (isValid: boolean) => void;\r\n globalSettings: GlobalSettingsType;\r\n startTimeLabel?: string;\r\n endTimeLabel?: string;\r\n startLabelInline?: boolean;\r\n endLabelInline?: boolean;\r\n orderForConsumables?: boolean;\r\n forceDisabled?: boolean;\r\n budgetPickerInfo?: string;\r\n}\r\n\r\nexport function ConnectedFiltersControl(\r\n props: ConnectedFiltersControlProps,\r\n): JSX.Element {\r\n //PROPS\r\n const {\r\n initialState,\r\n saveConnectedFilters,\r\n submitFormRef,\r\n isEdit,\r\n serviceTypeEnum,\r\n serviceTypes,\r\n formIsValid,\r\n globalSettings,\r\n startTimeLabel,\r\n endTimeLabel,\r\n startLabelInline,\r\n endLabelInline,\r\n orderForConsumables,\r\n forceDisabled,\r\n budgetPickerInfo,\r\n } = props;\r\n //REDUX\r\n const dispatch = useDispatch();\r\n const { actions } = useConnectedFiltersSlice();\r\n\r\n //REFS\r\n const portalRef = useRef(null);\r\n //BIND\r\n const bindSubmitForm = useCallback(\r\n submitForm => {\r\n submitFormRef.current = submitForm;\r\n },\r\n [submitFormRef],\r\n );\r\n //ON SUBMIT\r\n const handleSubmit = useCallback(\r\n (values: IConnectedFiltersDto) => {\r\n if (saveConnectedFilters) {\r\n saveConnectedFilters(values);\r\n } else {\r\n var d = {\r\n StartTime:\r\n values.StartTime === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.StartTime),\r\n ),\r\n User: values.User,\r\n UserGroup: values.UserGroup,\r\n Budget: values.Budget,\r\n BudgetExperiment: values.BudgetExperiment,\r\n InstituteProject: values.InstituteProject,\r\n EndTime: values.EndTime,\r\n ExternalCustomer: values.ExternalCustomer,\r\n FundingType: values.FundingType,\r\n PurchaseOrder: values.PurchaseOrder,\r\n Reference: values.Reference,\r\n } as IConnectedFiltersDto;\r\n dispatch(actions.saveState(d));\r\n }\r\n },\r\n [actions, dispatch, saveConnectedFilters],\r\n );\r\n\r\n //RENDER\r\n return initialState ? (\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","import { Dialog } from '@material-ui/core';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\n\r\nexport interface PopupPrintToPDFDialogProps {\r\n open: boolean;\r\n content: React.ReactNode;\r\n fullWidth: boolean;\r\n padding: string;\r\n}\r\nexport function PopupPrintToPDFDialog(props: PopupPrintToPDFDialogProps) {\r\n return (\r\n \r\n \r\n {props.content}\r\n \r\n \r\n );\r\n}\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n titleContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n container: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n boxcontainer: {\r\n display: 'flex',\r\n width: '100%',\r\n height: '100%',\r\n },\r\n selectFileBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginTop: '24px',\r\n },\r\n infoBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginTop: '24px',\r\n padding: '10PX',\r\n backgroundColor: '#f0f9ff',\r\n },\r\n }),\r\n);\r\n","import React from 'react';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Check, CheckProps } from 'app/components/BasicInputs/Check';\r\n\r\nexport interface CheckBoxProps\r\n extends Pick {\r\n checked: (name: string | undefined) => boolean;\r\n onChange: (event: React.ChangeEvent) => void;\r\n}\r\n\r\nexport function CheckBox({ checked, ...props }: CheckBoxProps) {\r\n return (\r\n \r\n \r\n {props.label}\r\n \r\n );\r\n}\r\n","export const ServiceRequestSectionTypesArray = [\r\n 'SubmissionsDetails',\r\n 'RequestForm_Table',\r\n 'Comments',\r\n 'Milestones_Services',\r\n 'ModificationHistory',\r\n 'RequestRows_Table',\r\n];\r\nexport type ServiceRequestSectionTypes = typeof ServiceRequestSectionTypesArray[number];\r\n","/* eslint-disable prettier/prettier */\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport { useStyles } from './styles';\r\nimport { CheckBox } from './CheckBox';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport clsx from 'clsx';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch } from 'react-redux';\r\nimport { usePrintPDFSlice } from '../slice';\r\nimport { ServiceRequestSectionTypesArray } from '../ServiceRequestSectionTypes';\r\nimport { PrintPDFItem } from '../slice/types';\r\nimport { H4 } from 'app/components/Typography';\r\nimport { LinearProgress } from '@material-ui/core';\r\n\r\nconst convertItemsToFlags = (items: PrintPDFItem[]) => {\r\n const res = {};\r\n for (const item of items) {\r\n res[item.id] = item.checked;\r\n }\r\n return res;\r\n};\r\n\r\nexport interface PopupPrintToPDFComponentProps {\r\n title: string;\r\n items: PrintPDFItem[];\r\n processing?: boolean;\r\n preparing?: boolean;\r\n disabled?: boolean;\r\n onSubmit: () => void;\r\n close: () => void;\r\n}\r\n\r\nexport function PopupPrintToPDFComponent(props: PopupPrintToPDFComponentProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = usePrintPDFSlice();\r\n const classes = useStyles();\r\n const [checkboxes, setCheckboxes] = React.useState(\r\n convertItemsToFlags(props.items),\r\n );\r\n const handleCheckboxChange = useCallback(\r\n (event: React.ChangeEvent) => {\r\n const id = ServiceRequestSectionTypesArray.find(\r\n f => f === event.target.value,\r\n );\r\n\r\n if (id !== undefined) {\r\n dispatch(\r\n actions.updateSection({ id: id, checked: event.target.checked }),\r\n );\r\n setCheckboxes({\r\n ...checkboxes,\r\n [id]: event.target.checked,\r\n });\r\n }\r\n },\r\n [actions, checkboxes, dispatch],\r\n );\r\n const handleCheckboxChecked = useCallback(\r\n name => {\r\n return name !== undefined && checkboxes[name];\r\n },\r\n [checkboxes],\r\n );\r\n const content = useMemo(() => {\r\n if (props.items.length > 0) {\r\n const res = props.items.map(item => {\r\n return (\r\n \r\n );\r\n });\r\n return res;\r\n } else {\r\n return <>;\r\n }\r\n }, [handleCheckboxChange, handleCheckboxChecked, props.items]);\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n

    {props.title}

    \r\n
    \r\n {props.preparing !== undefined && props.preparing && (\r\n \r\n \r\n \r\n )}\r\n {content}\r\n
    \r\n \r\n \r\n props.onSubmit()}\r\n >\r\n {'Print'}\r\n \r\n \r\n {t(translations.Cancel)}\r\n \r\n \r\n \r\n
    \r\n \r\n );\r\n}\r\n","import { PrintPDFItem } from '../slice/types';\r\nimport { PopupPrintToPDFDialog } from './Dialog';\r\nimport { PopupPrintToPDFComponent } from './PopupPrintToPDFComponent';\r\n\r\nexport interface PrintToPDFPopupProps {\r\n title: string;\r\n show: boolean;\r\n processing?: boolean;\r\n preparing?: boolean;\r\n disabled?: boolean;\r\n items: PrintPDFItem[];\r\n fullWidth?: boolean;\r\n onClose: () => void;\r\n onSubmit: () => void;\r\n}\r\nexport function PrintToPDFPopup({\r\n title,\r\n show,\r\n items,\r\n processing,\r\n preparing,\r\n disabled,\r\n fullWidth,\r\n onClose,\r\n onSubmit,\r\n}: PrintToPDFPopupProps) {\r\n return (\r\n <>\r\n \r\n }\r\n />\r\n \r\n );\r\n}\r\n","export enum ReferenceType {\r\n AllReferences = 0,\r\n Reservation = 1,\r\n Usage = 2,\r\n OfflineService = 3,\r\n ServiceRequest = 4,\r\n Subscription = 5,\r\n}\r\n","import { Formik, FormikProps } from 'formik';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { AuthenticatedUser, IIsAdminOfParams } from 'types/AuthenticatedUser';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { isEmpty } from 'lodash';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport {\r\n FieldHandler,\r\n FormListener,\r\n SubmittingHandler,\r\n} from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { ServiceTypeSchema } from 'app/components/Forms/Schemas';\r\nimport * as Yup from 'yup';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport {\r\n OtherServiceDetailsState,\r\n ServiceChangeStateParameters,\r\n} from '../slice/types';\r\nimport { useOfflineServiceStateSlice } from '../slice';\r\nimport {\r\n selectConnectedInitState,\r\n selectFieldHandler,\r\n selectInventoryBatchEditable,\r\n selectServiceChangeState,\r\n selectServiceHasError,\r\n} from '../slice/selectors';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { FormOfflineServiceTypePicker } from 'app/components/Forms/FormOfflineServiceTypePicker';\r\nimport { OfflineServiceRelatedFilter } from 'app/components/pickers/AutocompletePickers/OfflineServiceTypePicker';\r\nimport { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport {\r\n selectConnectedFiltersData,\r\n selectConnectedSettings,\r\n} from 'app/components/Forms/FormConnectedFilters/slice/selectors';\r\nimport { useConnectedFiltersSlice } from 'app/components/Forms/FormConnectedFilters/slice';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { ConnectedFiltersControl } from 'app/components/Forms/FormConnectedFilters/ConnectedFiltersControl';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { FormInventoryBatchPicker } from 'app/components/Forms/FormInventoryBatchPicker';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { BatchesByServiceTypeFilter } from 'app/components/pickers/AutocompletePickers/InventoryBatchesPicker';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nexport interface OfflineFormProps {\r\n onSubmit: (item: OtherServiceDetailsState) => void;\r\n initialValues: OtherServiceDetailsState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isEdit: boolean;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n innerFormRef: React.RefObject>;\r\n connectedFiltersFormRef: React.MutableRefObject;\r\n globalSettings: GlobalSettingsType;\r\n editCreatable?: boolean;\r\n onBatchClick: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n}\r\nexport const OfflineForm = React.memo(function OfflineForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isEdit,\r\n isAdmin,\r\n user,\r\n connectedFiltersFormRef,\r\n globalSettings,\r\n innerFormRef,\r\n editCreatable,\r\n onBatchClick,\r\n}: OfflineFormProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const { actions: connectedFiltersActions } = useConnectedFiltersSlice();\r\n //const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const fieldHandler = useSelector(selectFieldHandler);\r\n const hasError = useSelector(selectServiceHasError);\r\n const serviceSettings = useSelector(selectConnectedSettings);\r\n const connectedData = useSelector(selectConnectedFiltersData);\r\n const connectedInit = useSelector(selectConnectedInitState);\r\n const serviceChangeState = useSelector(selectServiceChangeState);\r\n const batchRequested = useSelector(selectInventoryBatchEditable);\r\n const readonly = !isAdmin && isEdit;\r\n const [submitting, setSubmitting] = React.useState(\r\n undefined,\r\n );\r\n const resetSubmitting = () => {\r\n setSubmitting(true);\r\n };\r\n const handleSubmit = (values: OtherServiceDetailsState) => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(values);\r\n }\r\n };\r\n const resetFieldHandler = () => {\r\n dispatch(actions.resetValueHandler());\r\n };\r\n\r\n /// Local State ///\r\n const [serviceChanged, setServiceChanged] = React.useState(false);\r\n const [quantityChanged, setQuantityChanged] = React.useState(false);\r\n const [batchChanged, setBatchChanged] = React.useState(false);\r\n const [allIsValid, setAllIsValid] = React.useState(true);\r\n const [serviceTypeSelected, setServiceTypeSelected] = useAsyncExtendedState<\r\n IOfflineServiceFilterDto | undefined\r\n >(initialValues.ServiceType ?? undefined);\r\n const minStep = React.useMemo(() => {\r\n return !!serviceTypeSelected\r\n ? serviceTypeSelected.IntQuantityOnly === true\r\n ? 1\r\n : 0.01\r\n : 1;\r\n }, [serviceTypeSelected]);\r\n const step = React.useMemo(() => {\r\n return !!serviceTypeSelected\r\n ? serviceTypeSelected.IntQuantityOnly === true\r\n ? 1\r\n : 0.01\r\n : 1;\r\n }, [serviceTypeSelected]);\r\n // const defaultQuantity = React.useMemo(() => {\r\n // return initialValues.Quantity ?? serviceTypeSelected?.DefaultQuantity;\r\n // }, [initialValues.Quantity, serviceTypeSelected]);\r\n const maxStep = 9999;\r\n const inputProps = {\r\n step: step,\r\n min: minStep,\r\n max: maxStep,\r\n 'aria-label': 'Counter',\r\n };\r\n const IsAdminOfService = React.useMemo(() => {\r\n return user?.IsAdminOf({\r\n ServiceGroupId: serviceTypeSelected?.ServiceGroupId,\r\n ServiceId: serviceTypeSelected?.Id,\r\n ServiceTypeId: ServiceType.Offline,\r\n } as IIsAdminOfParams);\r\n }, [serviceTypeSelected, user]);\r\n\r\n const handleFormChange = React.useCallback(\r\n (\r\n values: OtherServiceDetailsState,\r\n isValid,\r\n dirty,\r\n setValue,\r\n setTouched,\r\n validateField,\r\n setError,\r\n validate,\r\n ) => {\r\n if (serviceChanged) {\r\n dispatch(\r\n connectedFiltersActions.extendSettingsState({\r\n services:\r\n values.ServiceType === null\r\n ? []\r\n : [\r\n {\r\n Id: values.ServiceType.Id,\r\n Name: values.ServiceType.Name,\r\n ServiceGroupId: values.ServiceType.ServiceGroupId,\r\n ServiceTypeId: ServiceType.Offline,\r\n Active: true,\r\n BudgetsTurnedOn: values.ServiceType.BudgetsTurnedOn,\r\n HideProject: values.ServiceType.HideProjects,\r\n } as IServiceTypeFilterDto,\r\n ],\r\n globalSettings: globalSettings,\r\n settings: serviceSettings,\r\n isEdit: isEdit,\r\n data: connectedData,\r\n }),\r\n );\r\n if (\r\n values.ServiceType !== null &&\r\n !isEdit &&\r\n connectedData?.User !== null\r\n ) {\r\n const parameters = {\r\n ServiceTypes: [values.ServiceType.Id],\r\n ReservationId: values.ReservationId || null,\r\n UsageId: values.UsageId || null,\r\n BookedBy: connectedData?.User?.Id || null,\r\n ADGroup: connectedData?.UserGroup?.Id || null,\r\n Start: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(\r\n connectedData?.StartTime || new Date(),\r\n ),\r\n ),\r\n BudgetId: connectedData?.Budget?.Id || null,\r\n FundingTypeId: connectedData?.FundingType?.Id || 0,\r\n } as ServiceChangeStateParameters;\r\n dispatch(actions.initServiceChangeStateData(parameters));\r\n }\r\n setServiceTypeSelected(values.ServiceType ?? undefined);\r\n if (\r\n values.ServiceType?.DefaultQuantity !== null &&\r\n values.ServiceType?.DefaultQuantity !== undefined\r\n ) {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'Quantity',\r\n fieldValue: values.ServiceType.DefaultQuantity,\r\n }),\r\n );\r\n }\r\n setServiceChanged(false);\r\n }\r\n if (quantityChanged) {\r\n setQuantityChanged(false);\r\n }\r\n if (batchChanged) {\r\n setBatchChanged(false);\r\n }\r\n },\r\n [\r\n serviceChanged,\r\n quantityChanged,\r\n batchChanged,\r\n dispatch,\r\n connectedFiltersActions,\r\n globalSettings,\r\n serviceSettings,\r\n isEdit,\r\n connectedData,\r\n setServiceTypeSelected,\r\n actions,\r\n ],\r\n );\r\n const validateForms = React.useCallback((isValid: boolean) => {\r\n setAllIsValid(isValid);\r\n }, []);\r\n /// refs\r\n // const formRef = React.useRef | null>(\r\n // null,\r\n // );\r\n /// useEffects\r\n React.useEffect(() => {\r\n if (innerFormRef.current) {\r\n innerFormRef.current.validateForm();\r\n }\r\n }, [innerFormRef]);\r\n\r\n React.useEffect(() => {\r\n if (batchRequested !== undefined) {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'InventoryBatch',\r\n fieldValue: batchRequested,\r\n }),\r\n );\r\n dispatch(actions.setInventoryBatchEditable(undefined));\r\n }\r\n }, [actions, batchRequested, dispatch]);\r\n\r\n React.useEffect(() => {\r\n if (!!serviceChangeState && !editCreatable) {\r\n console.log('service settings: ', serviceSettings);\r\n if (!!serviceChangeState) {\r\n if (serviceSettings.budgetVisible && !isEdit) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'Budget',\r\n fieldValue: serviceChangeState.DefaultBudget,\r\n }),\r\n );\r\n if (serviceSettings.ReservationUserGroupGroupByBudgetUserGroup) {\r\n if (serviceChangeState.DefaultBudget !== null) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'UserGroup',\r\n fieldValue: {\r\n Id: serviceChangeState.DefaultBudget.UserGroupId,\r\n Name: serviceChangeState.DefaultBudget.UserGroupName,\r\n },\r\n }),\r\n );\r\n }\r\n } else {\r\n if (\r\n connectedData?.UserGroup === null ||\r\n connectedData?.UserGroup === undefined\r\n ) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'UserGroup',\r\n fieldValue: {\r\n Id:\r\n (connectedData?.User as IUserFilterDto).UserGroupId ??\r\n user?.ActiveUserGroup?.Id,\r\n Name:\r\n (connectedData?.User as IUserFilterDto).UserGroupName ??\r\n user?.ActiveUserGroup?.Name,\r\n },\r\n }),\r\n );\r\n }\r\n }\r\n if (\r\n serviceSettings.budgetExpirementVisible &&\r\n serviceChangeState.DefaultExperiment !== null\r\n ) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'BudgetExperiment',\r\n fieldValue: serviceChangeState.DefaultExperiment,\r\n }),\r\n );\r\n }\r\n } else {\r\n if (serviceSettings.isUserGroupCoordinator) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'UserGroup',\r\n fieldValue: {\r\n Id: user?.ActiveUserGroup?.Id,\r\n Name: user?.ActiveUserGroup?.Name,\r\n },\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n dispatch(actions.resetServiceChangeState());\r\n }\r\n }, [\r\n actions,\r\n connectedData?.User,\r\n connectedData?.UserGroup,\r\n connectedFiltersActions,\r\n dispatch,\r\n editCreatable,\r\n isEdit,\r\n serviceChangeState,\r\n serviceSettings,\r\n user?.ActiveUserGroup?.Id,\r\n user?.ActiveUserGroup?.Name,\r\n ]);\r\n\r\n const computedSchema = React.useMemo(() => {\r\n const otherServiceSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().notRequired().default(-1),\r\n ServiceType: ServiceTypeSchema.nullable().required(\r\n t(translations.err_OfflineServiceTypeRequired),\r\n ),\r\n DiscountFactor: Yup.number().nullable().notRequired().optional(),\r\n Remarks: Yup.string()\r\n .nullable()\r\n .label(t(translations.Remarks) as string),\r\n Quantity: Yup.number()\r\n .label(t(translations.Quantity) as string)\r\n .required(t(translations.err_Quantity_required))\r\n .nullable()\r\n .default(null)\r\n .max(maxStep)\r\n .min(minStep)\r\n .test(\r\n 'empty',\r\n t(translations.err_Quantity_required) as string,\r\n (value, context) => {\r\n let currVal = (context as any).from[0].value.Quantity;\r\n if (\r\n currVal === undefined ||\r\n currVal === null ||\r\n isNaN(currVal) ||\r\n currVal === 0\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n )\r\n .test(\r\n 'integerOnly',\r\n t(translations.err_IntQuantityOnly) as string,\r\n (value, context) => {\r\n let currVal = (context as any).from[0].value.Quantity;\r\n if (\r\n !!serviceTypeSelected &&\r\n serviceTypeSelected.IntQuantityOnly &&\r\n currVal % 1 !== 0\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n ),\r\n ReservationId: Yup.number().nullable().notRequired().optional(),\r\n UsageId: Yup.number().nullable().notRequired().optional(),\r\n SyncReservation: Yup.boolean().nullable().notRequired().optional(),\r\n SyncUsage: Yup.boolean().nullable().notRequired().optional(),\r\n InventoryBatch: (Yup.mixed() as Yup.SchemaOf)\r\n .nullable()\r\n .label(t(translations.Batch) as string),\r\n // ServiceDate: Yup.date()\r\n // .default(dateUtils.dateOrStringToDate(new Date()))\r\n // .label(t(translations.StartTime) as string)\r\n // .required(t(translations._errStartTimeRequired) as string),\r\n // Budget: Yup.mixed()\r\n // .label(t(translations.BudgetNumber) as string)\r\n // .nullable(true),\r\n // BudgetExperiment: Yup.mixed()\r\n // .label(t(translations.BudgetExperiment) as string)\r\n // .nullable(true),\r\n // BookedBy: Yup.mixed()\r\n // .label(t(translations.User) as string)\r\n // .required(() => t(translations.err_UserFieldRequired) as string),\r\n // UserGroup: Yup.mixed()\r\n // .label(t(translations.UserGroup) as string)\r\n // .nullable(true),\r\n // InstituteProject: Yup.mixed()\r\n // .label(t(translations.InstituteProject) as string)\r\n // .nullable(true),\r\n // ExternalCustomer: Yup.mixed()\r\n // .label(t(translations.ExternalCustomer) as string)\r\n // .nullable(true),\r\n // FundingType: Yup.mixed().label(t(translations.FundingType) as string),\r\n // PurchaseOrder: Yup.string()\r\n // .label(t(translations.PurchaseOrder) as string)\r\n // .nullable(true),\r\n // Reference: Yup.string()\r\n // .label(t(translations.Reference) as string)\r\n // .nullable(true),\r\n },\r\n );\r\n if (!!serviceTypeSelected && serviceTypeSelected.TrackInventory) {\r\n if (serviceTypeSelected?.NotLessThanZero) {\r\n // if (serviceTypeSelected.Inventory === 0) {\r\n // otherServiceSchema.fields.Quantity.withMutation(schema =>\r\n // schema\r\n // .label(t(translations.Quantity) as string)\r\n // .required(t(translations.err_Quantity_required))\r\n // .default(null)\r\n // .nullable()\r\n // .max(maxStep)\r\n // .min(minStep)\r\n // .test(\r\n // 'empty',\r\n // t(translations.err_Quantity_required) as string,\r\n // (value, context) => {\r\n // let currVal = context.from[0].value.Quantity;\r\n // if (\r\n // currVal === undefined ||\r\n // currVal === null ||\r\n // isNaN(currVal) ||\r\n // currVal === 0\r\n // ) {\r\n // return false;\r\n // }\r\n // return true;\r\n // },\r\n // )\r\n // .test(\r\n // 'minQuantWithZero',\r\n // t(\r\n // translations.NotAllowNegativeInventory_currentEqualsZero_err,\r\n // ) as string,\r\n // (value, context) => {\r\n // let currVal = context.from[0].value.Quantity;\r\n // let current = currVal as number;\r\n // if (current < 1) {\r\n // return false;\r\n // }\r\n // return true;\r\n // },\r\n // ),\r\n // );\r\n // } else {\r\n // otherServiceSchema.fields.Quantity.withMutation(schema =>\r\n // schema\r\n // .label(t(translations.Quantity) as string)\r\n // .required(t(translations.err_Quantity_required))\r\n // .max(maxStep)\r\n // .min(minStep)\r\n // .test(\r\n // 'empty',\r\n // t(translations.err_Quantity_required) as string,\r\n // (value, context) => {\r\n // let currVal = context.from[0].value.Quantity;\r\n // if (\r\n // currVal === undefined ||\r\n // currVal === null ||\r\n // isNaN(currVal) ||\r\n // currVal === 0\r\n // ) {\r\n // return false;\r\n // }\r\n // return true;\r\n // },\r\n // )\r\n // .test(\r\n // 'minQuant',\r\n // (t(\r\n // translations.NotAllowNegativeInventory_currentMoreThanZero_err,\r\n // ) as string).replace(\r\n // '{0}',\r\n // serviceTypeSelected.Inventory.toString(),\r\n // ),\r\n // (value, context) => {\r\n // let currVal = context.from[0].value.Quantity;\r\n // let current = currVal as number;\r\n // if (serviceTypeSelected.Inventory - current < 0) {\r\n // return false;\r\n // }\r\n // return true;\r\n // },\r\n // ),\r\n // );\r\n // }\r\n }\r\n if (serviceTypeSelected?.InventoryBatchesEnabled) {\r\n otherServiceSchema.fields.InventoryBatch.withMutation(schema =>\r\n schema\r\n .label(t(translations.Batch) as string)\r\n .nullable()\r\n .required(t(translations.err_InventoryBatch_required) as string),\r\n );\r\n }\r\n }\r\n\r\n // if (budgetVisible === true) {\r\n // otherServiceSchema.fields.Budget.withMutation(schema =>\r\n // schema.required(t(translations.BudgetIsRequired) as string),\r\n // );\r\n // }\r\n return otherServiceSchema;\r\n }, [minStep, serviceTypeSelected, t]);\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n if (allIsValid) {\r\n formikHelpers.validateForm(values).then(responseErrors => {\r\n if (!isEmpty(responseErrors)) {\r\n formikHelpers.setSubmitting(false);\r\n console.debug('errors', responseErrors);\r\n }\r\n // else if (errorMessages.length > 0) {\r\n // console.debug('errors', errorMessages);\r\n // formikHelpers.setSubmitting(false);\r\n // }\r\n else {\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }\r\n });\r\n } else {\r\n formikHelpers.setSubmitting(false);\r\n }\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n console.log('Reservation errors', formik.errors);\r\n }\r\n // if (newStatus && !statusUpdated) {\r\n // formik.setFieldValue('Status', newStatus, true);\r\n // statusUpdated = true;\r\n // }\r\n console.log('Reservation submitting', formik.isSubmitting);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n setServiceChanged(true);\r\n }}\r\n />\r\n \r\n \r\n {!!serviceTypeSelected &&\r\n serviceTypeSelected?.InventoryBatchesEnabled &&\r\n IsAdminOfService &&\r\n !isEdit && (\r\n \r\n \r\n {\r\n setBatchChanged(true);\r\n }}\r\n />\r\n \r\n {formik.values.ServiceType !== null &&\r\n formik.values.ServiceType !== undefined &&\r\n IsAdminOfService && (\r\n \r\n {formik.values.InventoryBatch !== null &&\r\n formik.values.InventoryBatch !==\r\n undefined && (\r\n \r\n onBatchClick(\r\n formik.values.InventoryBatch ?? null,\r\n formik.values.ServiceType?.Id ?? 0,\r\n )\r\n }\r\n >\r\n {t(translations.EditSelectedBatch)}\r\n \r\n )}\r\n \r\n onBatchClick(\r\n null,\r\n formik.values.ServiceType?.Id ?? 0,\r\n )\r\n }\r\n >\r\n {t(translations.AddNewBatch)}\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n {\r\n const precision =\r\n formik.values.ServiceType?.IntQuantityOnly === false\r\n ? 2\r\n : 0;\r\n const value = +(+event.target.value).toFixed(\r\n precision,\r\n );\r\n console.log('qyt', value);\r\n // if (value < step) {\r\n // event.preventDefault();\r\n // event.stopPropagation();\r\n // formik.setFieldError(\r\n // 'Quantity',\r\n // (t(\r\n // translations.err_LowQuantity,\r\n // ) as string).replace('{0}', minStep.toString()),\r\n // );\r\n // } else if (value > 0 && value > maxStep) {\r\n // event.preventDefault();\r\n // event.stopPropagation();\r\n // formik.setFieldError(\r\n // 'Quantity',\r\n // (t(\r\n // translations.err_HighQuantity,\r\n // ) as string).replace('{0}', maxStep.toString()),\r\n // );\r\n // }\r\n }}\r\n inputProps={inputProps}\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","import { Box, LinearProgress } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { selectHasNotSavedChanges } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport useGlobalSettingsHook from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { push } from 'connected-react-router';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { FormikProps } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { OfflineForm } from './OfflineForm';\r\nimport { useOfflineServiceStateSlice } from './slice';\r\nimport {\r\n selectCredit,\r\n selectCreditCompleted,\r\n selectCreditProcessing,\r\n selectHasCharges,\r\n selectIsEdit,\r\n selectProcessing,\r\n selectService,\r\n selectServiceCompleted,\r\n selectServiceHasError,\r\n} from './slice/selectors';\r\nimport {\r\n OfflineServiceQueryStringParameters,\r\n OtherServiceDetailsState,\r\n} from './slice/types';\r\nimport { useConnectedFiltersSlice } from 'app/components/Forms/FormConnectedFilters/slice';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { selectConnectedSettings } from 'app/components/Forms/FormConnectedFilters/slice/selectors';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { ReferenceType } from 'enums/ReferenceType';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { Body, ButtonLabel } from 'app/components/Typography';\r\nimport { Roles } from 'app/slice/types';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\n\r\nexport interface OtherServiceDetailsProps\r\n extends CoverProps,\r\n SidePanelContentProps {\r\n queryParams: OfflineServiceQueryStringParameters;\r\n initialService?: IOtherServices;\r\n onClose?: () => void;\r\n editCreatable?: boolean;\r\n saveCreatable?: boolean;\r\n}\r\n\r\nexport const OtherServiceDetails = React.memo(function OtherServiceDetails(\r\n props: OtherServiceDetailsProps,\r\n) {\r\n const {\r\n useSidePanel,\r\n queryParams,\r\n initialService,\r\n editCreatable,\r\n saveCreatable,\r\n isCover,\r\n closeCover,\r\n } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const { actions: connectedFiltersActions } = useConnectedFiltersSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n\r\n /// Settings ///\r\n const globalSettings = useGlobalSettingsHook();\r\n const history = useHistory();\r\n /// Selectors ///\r\n const processing = useSelector(selectProcessing);\r\n const offlineService = useSelector(selectService);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const actionCompleted = useSelector(selectServiceCompleted);\r\n //const serviceProcessing = useSelector(selectServiceProcessing);\r\n const hasError = useSelector(selectServiceHasError);\r\n const credit = useSelector(selectCredit);\r\n const creditProccessing = useSelector(selectCreditProcessing);\r\n const creditCompleted = useSelector(selectCreditCompleted);\r\n const serviceSettings = useSelector(selectConnectedSettings);\r\n const hasCharges = useSelector(selectHasCharges);\r\n const edit = useSelector(selectIsEdit);\r\n /// Refs ///\r\n const submitFormRef = React.useRef(null);\r\n const connectedFiltersFormRef = React.useRef(null);\r\n const innerFormRef = React.useRef>(\r\n null,\r\n );\r\n //cover\r\n // const [cover, setCover] = React.useState();\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState(\r\n () => {\r\n dispatch(actions.resetDetailsState());\r\n return true;\r\n },\r\n undefined,\r\n useSidePanel,\r\n isCover,\r\n );\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n const [busy, setBusy] = React.useState(false);\r\n const [showCalculateCredit, setShowCalculateCredit] = React.useState(false);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const IsAdmin = React.useMemo(() => {\r\n return (\r\n User?.HasAdminGroupPermissions(\r\n offlineService?.data?.ServiceType?.ServiceGroupId ?? undefined,\r\n ) ||\r\n User?.HasLabTechGroupPermissions(\r\n offlineService?.data?.ServiceType?.ServiceGroupId ?? undefined,\r\n ) ||\r\n User?.HasAdminServicePermissions(\r\n ServiceType.Offline,\r\n offlineService?.data?.ServiceType?.Id,\r\n ) ||\r\n User?.HasLabTechServicePermissions(\r\n ServiceType.Offline,\r\n offlineService?.data?.ServiceType?.Id,\r\n )\r\n );\r\n }, [User, offlineService]);\r\n\r\n const isReadOnlyUser = React.useMemo(() => {\r\n return (\r\n User !== undefined &&\r\n (User.Roles.includes(Roles.CalendarOnly) ||\r\n User.Roles.includes(Roles.Readonly) ||\r\n User.Roles.includes(Roles.RoomOnly))\r\n );\r\n }, [User]);\r\n\r\n /// mount effect - init ///\r\n // useEffectOnMount(() => {\r\n // setRequestCompleted(undefined);\r\n // dispatch(actions.initDetails(queryParams, ));\r\n // return () => {};\r\n // });\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n if (globalSettings.loadCompleted && active) {\r\n setFirstLoad(false);\r\n dispatch(\r\n actions.initDetails({\r\n query: queryParams,\r\n globalSettings: globalSettings,\r\n service: initialService,\r\n editCreatable: editCreatable,\r\n }),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n dispatch,\r\n editCreatable,\r\n firstLoad,\r\n globalSettings,\r\n initialService,\r\n queryParams,\r\n ]);\r\n /// functions, callbacks ///\r\n // const closeCover = () => {\r\n // setCover(undefined);\r\n // };\r\n // const handleClose = () => {\r\n // if (hasChanges && !editCreatable) {\r\n // dispatch(layoutActions.setConfirmOpen(true));\r\n // } else {\r\n // handleCloselClick();\r\n // }\r\n // };\r\n const handleCloselClick = React.useCallback(() => {\r\n // dispatch(actions.resetDetailsState(editCreatable));\r\n // if (!!onClose) {\r\n // onClose();\r\n // } else {\r\n // if (useSidePanel) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // } else {\r\n // dispatch(push('/otherServices'));\r\n // }\r\n // }\r\n // if (!editCreatable) {\r\n // dispatch(connectedFiltersActions.resetConnectedState());\r\n // }\r\n if (useSidePanel) {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: hasChanges && !editCreatable,\r\n onClose: () => {\r\n dispatch(actions.resetDetailsState(editCreatable));\r\n if (!editCreatable) {\r\n dispatch(connectedFiltersActions.resetConnectedState());\r\n }\r\n },\r\n } as SidePanelCloseState);\r\n } else {\r\n dispatch(push('/otherServices'));\r\n }\r\n }, [\r\n actions,\r\n closePanel,\r\n connectedFiltersActions,\r\n dispatch,\r\n editCreatable,\r\n hasChanges,\r\n isCover,\r\n useSidePanel,\r\n ]);\r\n const handleSaveClick = React.useCallback(\r\n (e: any) => {\r\n if (editCreatable && !!initialService) {\r\n if (\r\n !!innerFormRef.current?.errors &&\r\n !!innerFormRef.current?.errors['Quantity']\r\n ) {\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: innerFormRef.current?.errors['Quantity'],\r\n }),\r\n );\r\n return;\r\n }\r\n dispatch(\r\n actions.setEditCreatableService(\r\n Object.assign({}, initialService, {\r\n Remarks: innerFormRef.current?.values.Remarks,\r\n Quantity: innerFormRef.current?.values.Quantity || null,\r\n InventoryBatchId:\r\n innerFormRef.current?.values.InventoryBatch?.Id || null,\r\n InventoryBatchName:\r\n innerFormRef.current?.values.InventoryBatch?.Name || null,\r\n InventoryBatchAmount:\r\n innerFormRef.current?.values.InventoryBatch?.Inventory || null,\r\n }),\r\n ),\r\n );\r\n handleCloselClick();\r\n } else {\r\n handleSubmitForm(e);\r\n }\r\n },\r\n [\r\n actions,\r\n appSettingsActions,\r\n dispatch,\r\n editCreatable,\r\n handleCloselClick,\r\n initialService,\r\n ],\r\n );\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (connectedFiltersFormRef.current) {\r\n connectedFiltersFormRef.current(e);\r\n }\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: OtherServiceDetailsState) => {\r\n setBusy(true);\r\n if (edit) {\r\n dispatch(\r\n actions.updateService({\r\n current: values,\r\n original: offlineService.data || values,\r\n saveCreatable: saveCreatable,\r\n }),\r\n );\r\n } else {\r\n dispatch(\r\n actions.createService({\r\n model: values,\r\n saveCreatable: saveCreatable,\r\n }),\r\n );\r\n }\r\n },\r\n [actions, dispatch, edit, offlineService.data, saveCreatable],\r\n );\r\n const handleCalculateCredit = React.useCallback(() => {\r\n setShowCalculateCredit(true);\r\n dispatch(\r\n actions.getCredit(\r\n innerFormRef?.current?.values ||\r\n offlineService?.data ||\r\n ({} as OtherServiceDetailsState),\r\n ),\r\n );\r\n }, [actions, dispatch, offlineService?.data]);\r\n const handleCalculateClose = React.useCallback(() => {\r\n setShowCalculateCredit(false);\r\n dispatch(actions.resetCreditState());\r\n }, [actions, dispatch]);\r\n /// Use Effects ///\r\n React.useEffect(() => {\r\n let active = processing === false;\r\n if (active) {\r\n if (queryParams.id !== undefined && !isNaN(parseInt(queryParams.id))) {\r\n //setEdit(true);\r\n } else {\r\n //setEdit(false);\r\n }\r\n if (actionCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n handleCloselClick();\r\n }\r\n } else if (actionCompleted === false) {\r\n setRequestCompleted(undefined);\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actionCompleted,\r\n dispatch,\r\n handleCloselClick,\r\n hasError,\r\n layoutActions,\r\n processing,\r\n queryParams.id,\r\n ]);\r\n // React.useEffect(() => {\r\n // if (confirmApproved) {\r\n // dispatch(actions.resetDetailsState());\r\n // if (continueToOther.continueOnApprove) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // setTimeout(() => {\r\n // dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: continueToOther.pageType,\r\n // props: continueToOther.pageProps,\r\n // expanded: continueToOther.expanded,\r\n // }),\r\n // );\r\n // dispatch(layoutActions.resetContinueState());\r\n // }, 200);\r\n // } else if (continueLink !== undefined) {\r\n // dispatch(appSettingsActions.navigate(continueLink));\r\n // dispatch(layoutActions.resetSidePanel());\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }\r\n // //dispatch(actions.setChangedState(false));\r\n // }\r\n // if (confirmRejected) {\r\n // dispatch(layoutActions.resetConfirmState());\r\n // }\r\n\r\n // return () => undefined;\r\n // }, [\r\n // actions,\r\n // appSettingsActions,\r\n // confirmApproved,\r\n // confirmRejected,\r\n // continueLink,\r\n // continueToOther,\r\n // dispatch,\r\n // edit,\r\n // layoutActions,\r\n // ]);\r\n const onBatchClick = React.useCallback(\r\n (batch: IInventoryBatchDto | null, serviceType: number) => {\r\n let batchProps = {\r\n initialBatch: batch ?? undefined,\r\n queryParams: {\r\n id: '' + (batch?.Id ?? -1),\r\n stid: '' + serviceType,\r\n },\r\n saveCreatable: true,\r\n useSidePanel: true,\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.InventoryBatch,\r\n renderPageProps: batchProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [openPanel, useSidePanel],\r\n );\r\n const leftActions = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n actions.push(() => (\r\n }\r\n onClick={handleSaveClick}\r\n disabled={busy}\r\n processing={!requestCompleted && busy}\r\n >\r\n {t(translations.Save)}\r\n \r\n ));\r\n if (globalSettings.showCalcPriceOnOfflineService && !edit) {\r\n actions.push(() => (\r\n }\r\n title={t(translations.CalculatePricing_info) as string}\r\n onClick={handleCalculateCredit}\r\n disabled={creditProccessing}\r\n processing={creditProccessing}\r\n >\r\n {t(translations.CalculatePricing)}\r\n \r\n ));\r\n }\r\n return actions;\r\n }, [\r\n busy,\r\n creditProccessing,\r\n edit,\r\n globalSettings.showCalcPriceOnOfflineService,\r\n handleCalculateCredit,\r\n handleSaveClick,\r\n requestCompleted,\r\n t,\r\n ]);\r\n const rightActions = React.useMemo(() => {\r\n return [\r\n () => (\r\n \r\n }\r\n onClick={handleCloselClick}\r\n >\r\n {t(translations.Close)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [handleCloselClick, t]);\r\n const topButtons: ActionRenderer[] = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n if (serviceSettings.chargesViewAllowed && edit && hasCharges) {\r\n actions.push(() => (\r\n \r\n history.push(\r\n `/Charges?${toQueryString({\r\n refType: ReferenceType.OfflineService as number,\r\n refId: queryParams.id,\r\n }).toString()}`,\r\n )\r\n }\r\n variant=\"white\"\r\n shape=\"square\"\r\n />\r\n ));\r\n }\r\n return actions;\r\n }, [\r\n edit,\r\n hasCharges,\r\n history,\r\n queryParams.id,\r\n serviceSettings.chargesViewAllowed,\r\n t,\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 pageLink={buildURL(publicUrl + 'otherServices/details', queryParams)}\r\n toPageLink={`otherServices/details?${toQueryString(queryParams)}`}\r\n rightActions={isReadOnlyUser ? [] : rightActions}\r\n confirm={\r\n showCalculateCredit ? (\r\n handleCalculateClose()}\r\n onClose={() => handleCalculateClose()}\r\n body={\r\n creditProccessing && !creditCompleted ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {t(translations.Pricing_EstimatedCost)}\r\n \r\n \r\n {(t(\r\n edit\r\n ? translations.PricingConfirmationOfflineEditText1\r\n : translations.PricingConfirmationOfflineText1,\r\n ) as string).replace(\r\n '{0}',\r\n (credit?.credit || 0).toFixed(2),\r\n )}\r\n \r\n \r\n {!!credit?.balance && credit?.balance !== null && (\r\n \r\n \r\n {t(translations.Pricing_Balance)}\r\n \r\n \r\n {(t(\r\n translations.Pricing_BalanceResult,\r\n ) as string).replace(\r\n '{0}',\r\n (credit?.balance || 0).toFixed(2),\r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n }\r\n maxWidth={'sm'}\r\n />\r\n ) : (\r\n <>\r\n )\r\n }\r\n isCover={isCover}\r\n cover={cover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n coverClosed={coverClosed}\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n});\r\n","/**\r\n *\r\n * PriorityPicker\r\n *\r\n */\r\n\r\nimport {\r\n ServiceRequestMilestoneStatusesUnionArray,\r\n ServiceRequestMilestoneStatusesUnion,\r\n} from 'api/odata/generated/enums/ServiceRequestMilestoneStatuses';\r\nimport {\r\n EnumPicker,\r\n EnumPickerProps,\r\n withEnumOptions,\r\n} from 'app/components/BasicPickers/EnumPicker';\r\n\r\nexport type ServiceRequestMilestoneStatusPickerProps = Omit<\r\n EnumPickerProps,\r\n 'EnumNamesArray'\r\n>;\r\nexport const ServiceRequestMilestoneStatusPicker = withEnumOptions<\r\n ServiceRequestMilestoneStatusesUnion\r\n>(ServiceRequestMilestoneStatusesUnionArray)(EnumPicker);\r\n","/**\r\n *\r\n * FormServiceRequestMilestoneStatusPicker\r\n *\r\n */\r\n\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport {\r\n ServiceRequestMilestoneStatusPicker,\r\n ServiceRequestMilestoneStatusPickerProps,\r\n} from '../pickers/StaticOptionsPickers/ServiceRequestMilestoneStatusPicker';\r\nimport { ServiceRequestMilestoneStatusesUnion } from 'api/odata/generated/enums/ServiceRequestMilestoneStatuses';\r\n\r\nexport const FormServiceRequestMilestoneStatusPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n Omit &\r\n Pick) => {\r\n const [\r\n field,\r\n meta,\r\n helpers,\r\n ] = useField(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","import { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport {\r\n FormRightSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as Yup from 'yup';\r\nimport { IServiceRequestMilestoneForm } from '../../RequestSamplesPage/slice/types';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useRequestSamplesSlice } from '../../RequestSamplesPage/slice';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IServiceRequestMilestoneDto } from 'api/odata/generated/entities/IServiceRequestMilestoneDto';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { ServiceRequestMilestoneStatusesUnion } from 'api/odata/generated/enums/ServiceRequestMilestoneStatuses';\r\nimport { ServiceRequestMilestoneStatusesUnionArray } from 'api/odata/generated/enums/ServiceRequestMilestoneStatuses';\r\nimport { FormUsersPicker } from 'app/components/Forms/FormUsersPicker';\r\nimport { FormServiceRequestMilestoneStatusPicker } from 'app/components/Forms/FormServiceRequestMilestoneStatusPicker';\r\nimport { selectServiceRequestMilestoneProcessing } from '../../RequestSamplesPage/slice/selectors';\r\nimport { FormBookitDatePicker } from 'app/components/Forms/FormBookitDatePicker';\r\n\r\nexport interface ServiceRequestMilestoneDetailsProps {\r\n serviceRequestId: number;\r\n type: 'Insert' | 'Update';\r\n value?: IServiceRequestMilestoneDto;\r\n}\r\n\r\nexport function ServiceRequestMilestoneDetails(\r\n props: ServiceRequestMilestoneDetailsProps,\r\n) {\r\n const { t } = useTranslation();\r\n const submitRef = React.useRef<(() => Promise) | undefined>();\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n const processing = useSelector(selectServiceRequestMilestoneProcessing);\r\n\r\n const formType =\r\n props.value?.Id !== undefined && props.value.Id > 0 ? 'Update' : 'Insert';\r\n const insert = React.useCallback(\r\n (value: IServiceRequestMilestoneForm) => {\r\n dispatch(\r\n actions.insertMilestone({\r\n ...toDto(value),\r\n ...{ ServiceRequestId: props.serviceRequestId },\r\n }),\r\n );\r\n },\r\n\r\n [actions, dispatch, props.serviceRequestId],\r\n );\r\n const updateCharge = React.useCallback(\r\n (value: IServiceRequestMilestoneForm) => {\r\n dispatch(\r\n actions.updateMilestone({\r\n ...toDto(value),\r\n ...{ ServiceRequestId: props.serviceRequestId },\r\n }),\r\n );\r\n },\r\n\r\n [actions, dispatch, props.serviceRequestId],\r\n );\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: IServiceRequestMilestoneForm) => {\r\n switch (formType) {\r\n case 'Insert':\r\n insert(values);\r\n break;\r\n case 'Update':\r\n updateCharge(values);\r\n break;\r\n }\r\n },\r\n [formType, insert, updateCharge],\r\n );\r\n const handleSubmitButtonClick = () => {\r\n submitRef.current?.();\r\n };\r\n const initialValues = toInitialValues(props.value);\r\n const title =\r\n props.type === 'Insert'\r\n ? t(translations.AddMilestone)\r\n : t(translations.Milestone);\r\n const handleClose = () => dispatch(actions.closeSidePanel());\r\n return (\r\n (\r\n }\r\n processing={processing}\r\n >\r\n {t(translations.Submit)}\r\n \r\n ),\r\n ]}\r\n rightActions={[\r\n () => (\r\n dispatch(actions.closeSidePanel())}\r\n size=\"small\"\r\n startIcon={}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n ),\r\n ]}\r\n >\r\n \r\n {formik => {\r\n submitRef.current = formik.submitForm;\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 const currentStatus = formik.values.Status;\r\n const newStatus:\r\n | ServiceRequestMilestoneStatusesUnion\r\n | undefined =\r\n value !== null\r\n ? 'Completed'\r\n : currentStatus === 'Completed'\r\n ? 'NotStarted'\r\n : currentStatus;\r\n formik.setFieldValue('Status', newStatus);\r\n }}\r\n fullWidth\r\n />\r\n \r\n \r\n {\r\n switch (value) {\r\n case 'Completed':\r\n if (\r\n formik.values.CompletionDate === null ||\r\n formik.values.CompletionDate === undefined\r\n ) {\r\n formik.setFieldValue('CompletionDate', new Date());\r\n }\r\n break;\r\n case 'NotStarted':\r\n case 'Started':\r\n formik.setFieldValue('CompletionDate', null);\r\n break;\r\n }\r\n }}\r\n fullWidth\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\nconst serviceRequestMilestoneSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Assignees: Yup.mixed().optional(),\r\n CompletionDate: Yup.date().optional().nullable(),\r\n Id: Yup.number().optional(),\r\n Name: Yup.string().required(),\r\n Status: Yup.string()\r\n .oneOf(ServiceRequestMilestoneStatusesUnionArray)\r\n .optional() as Yup.SchemaOf,\r\n TargetDate: Yup.date().optional().nullable(),\r\n Description: Yup.string().optional(),\r\n },\r\n);\r\n\r\nconst toDto = (\r\n value: IServiceRequestMilestoneForm,\r\n): Partial &\r\n Pick => {\r\n return {\r\n Id: value.Id,\r\n Charged: false,\r\n CompletionDate:\r\n value.CompletionDate === null\r\n ? undefined\r\n : value.CompletionDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(value.CompletionDate),\r\n Description: value.Description,\r\n Name: value.Name ?? null,\r\n Status: value.Status,\r\n TargetDate:\r\n value.TargetDate === null\r\n ? null\r\n : value.TargetDate === undefined\r\n ? null\r\n : dateUtils.formatISO(value.TargetDate),\r\n Assignees: value.Assignees,\r\n };\r\n};\r\nconst toInitialValues = (\r\n value?: IServiceRequestMilestoneDto,\r\n): IServiceRequestMilestoneForm => {\r\n if (value === undefined) {\r\n return {\r\n TargetDate: null,\r\n CompletionDate: null,\r\n };\r\n }\r\n\r\n const result: IServiceRequestMilestoneForm = {\r\n Id: value.Id,\r\n Assignees: value.Assignees,\r\n CompletionDate:\r\n value.CompletionDate === null\r\n ? null\r\n : dateUtils.parseISO(value.CompletionDate),\r\n Description: value.Description ?? undefined,\r\n Name: value.Name ?? undefined,\r\n Status: value.Status ?? undefined,\r\n TargetDate:\r\n value.TargetDate === null\r\n ? null\r\n : dateUtils.parseISO(value.TargetDate) ?? undefined,\r\n };\r\n return result;\r\n};\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n UnitType,\r\n UnitTypePicker,\r\n UnitTypePickerProps,\r\n} from '../pickers/AutocompletePickers/UnitTypePicker';\r\n\r\nexport const FormUnitTypeTypePicker = (\r\n props: FieldHookConfig &\r\n Omit,\r\n) => {\r\n const [field, meta, helpers] = useField(props);\r\n const handleChange = val => {\r\n props.onChange?.(val);\r\n helpers.setValue(val, true);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n BaseURLPicker,\r\n BaseURLPickerProps,\r\n} from '../BasicPickers/BaseURLPicker';\r\nimport { Entity } from 'types/common';\r\n\r\nexport const FormServiceRequestMilestoneChargeServicePicker = ({\r\n serviceRequestId,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n Omit>, 'onChange' | 'url'> & {\r\n serviceRequestId: number;\r\n }) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n const handleChange = val => {\r\n props.onChange?.(val);\r\n helpers.setValue(val, true);\r\n };\r\n const url = `/api/odata/v4/ServiceRequests/${serviceRequestId}/ConsumableServices`;\r\n return (\r\n \r\n );\r\n};\r\n","import { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport {\r\n FormRightSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport * as Yup from 'yup';\r\nimport { IServiceRequestMilestoneChargeForm } from '../../RequestSamplesPage/slice/types';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useRequestSamplesSlice } from '../../RequestSamplesPage/slice';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IServiceRequestMilestoneChargeDto } from 'api/odata/generated/entities/IServiceRequestMilestoneChargeDto';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { FormUnitTypeTypePicker } from 'app/components/Forms/FormUnitTypePicker';\r\nimport { selectServiceRequestMilestoneProcessing } from '../../RequestSamplesPage/slice/selectors';\r\nimport { FormServiceRequestMilestoneChargeServicePicker } from 'app/components/Forms/FormServiceRequestMilestoneChargeServicePicker';\r\nimport { BaseToggleButtonGroup } from 'app/components/BasicButtons/BaseToggleButtonGroup';\r\nimport { FormBookitDatePicker } from 'app/components/Forms/FormBookitDatePicker';\r\n\r\nexport type ServiceRequestMilestoneChargeType = 'service' | 'charge';\r\nexport interface ServiceRequestMilestoneChargeDetailsProps {\r\n serviceRequestMilestoneId: number;\r\n serviceRequestId: number;\r\n type: ServiceRequestMilestoneChargeType;\r\n enableAddonCharge: boolean;\r\n enableManualCharge: boolean;\r\n value?: IServiceRequestMilestoneChargeDto;\r\n}\r\nexport function ServiceRequestMilestoneChargeDetails(\r\n props: ServiceRequestMilestoneChargeDetailsProps,\r\n) {\r\n const { t } = useTranslation();\r\n const submitRef = React.useRef<(() => Promise) | undefined>();\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n const processing = useSelector(selectServiceRequestMilestoneProcessing);\r\n const [selectedType, setSelectedType] = React.useState(props.type);\r\n const formType =\r\n props.value?.Id !== undefined && props.value.Id > 0 ? 'Update' : 'Insert';\r\n const title =\r\n formType === 'Insert'\r\n ? selectedType === 'charge'\r\n ? t(translations.AddCharge)\r\n : t(translations.AddService)\r\n : selectedType === 'charge'\r\n ? t(translations.Charge)\r\n : t(translations.Service);\r\n\r\n const insertCharge = React.useCallback(\r\n (value: IServiceRequestMilestoneChargeForm) => {\r\n if (value.Type === 'service' && value.Service === undefined) {\r\n return;\r\n }\r\n\r\n switch (value.Type) {\r\n case 'service':\r\n dispatch(\r\n actions.insertMilestoneCharge({\r\n OfflineServiceType: value.Service, // value.Service?.Id,\r\n Quantity: value.Quantity,\r\n Remarks: value.Remarks,\r\n ServiceRequestId: props.serviceRequestId,\r\n ServiceRequestMilestoneId: props.serviceRequestMilestoneId,\r\n Date:\r\n value.Date === null\r\n ? undefined\r\n : value.Date === undefined\r\n ? undefined\r\n : dateUtils.formatISO(value.Date),\r\n }),\r\n );\r\n break;\r\n case 'charge':\r\n dispatch(\r\n actions.insertMilestoneCharge({\r\n Quantity: value.Quantity,\r\n Rate: value.Rate,\r\n Remarks: value.Remarks,\r\n ServiceRequestId: props.serviceRequestId,\r\n ServiceRequestMilestoneId: props.serviceRequestMilestoneId,\r\n Date:\r\n value.Date === null\r\n ? undefined\r\n : value.Date === undefined\r\n ? undefined\r\n : dateUtils.formatISO(value.Date),\r\n // Id: props.value?.Id,\r\n Name: value.Name,\r\n Unit: value.Unit,\r\n }),\r\n );\r\n break;\r\n }\r\n },\r\n\r\n [\r\n actions,\r\n dispatch,\r\n props.serviceRequestId,\r\n props.serviceRequestMilestoneId,\r\n ],\r\n );\r\n const updateCharge = React.useCallback(\r\n (value: IServiceRequestMilestoneChargeForm) => {\r\n if (props.value?.Id === undefined) {\r\n return;\r\n }\r\n switch (value.Type) {\r\n case 'service':\r\n dispatch(\r\n actions.updateMilestoneCharge({\r\n Id: props.value?.Id,\r\n OfflineServiceType: value.Service, // value.Service?.Id,\r\n Quantity: value.Quantity,\r\n Remarks: value.Remarks,\r\n ServiceRequestId: props.serviceRequestId,\r\n ServiceRequestMilestoneId: props.serviceRequestMilestoneId,\r\n Date:\r\n value.Date === null\r\n ? undefined\r\n : value.Date === undefined\r\n ? undefined\r\n : dateUtils.formatISO(value.Date),\r\n }),\r\n );\r\n break;\r\n case 'charge':\r\n dispatch(\r\n actions.updateMilestoneCharge({\r\n Id: props.value?.Id,\r\n Quantity: value.Quantity,\r\n Rate: value.Rate,\r\n Remarks: value.Remarks,\r\n ServiceRequestId: props.serviceRequestId,\r\n ServiceRequestMilestoneId: props.serviceRequestMilestoneId,\r\n Date:\r\n value.Date === null\r\n ? undefined\r\n : value.Date === undefined\r\n ? undefined\r\n : dateUtils.formatISO(value.Date),\r\n // Id: props.value?.Id,\r\n Name: value.Name,\r\n Unit: value.Unit,\r\n }),\r\n );\r\n break;\r\n }\r\n },\r\n\r\n [\r\n actions,\r\n dispatch,\r\n props.serviceRequestId,\r\n props.serviceRequestMilestoneId,\r\n props.value?.Id,\r\n ],\r\n );\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: IServiceRequestMilestoneChargeForm) => {\r\n switch (formType) {\r\n case 'Insert':\r\n insertCharge(values);\r\n break;\r\n case 'Update':\r\n updateCharge(values);\r\n break;\r\n }\r\n },\r\n [formType, insertCharge, updateCharge],\r\n );\r\n\r\n const initialValues = toInitialValues(props.type, props.value);\r\n\r\n return (\r\n (\r\n {\r\n submitRef.current?.();\r\n }}\r\n size=\"small\"\r\n processing={processing}\r\n startIcon={}\r\n >\r\n {t(translations.Submit)}\r\n \r\n ),\r\n ]}\r\n closeSidePanel={() => dispatch(actions.closeSidePanel)}\r\n rightActions={[\r\n () => (\r\n dispatch(actions.closeSidePanel())}\r\n size=\"small\"\r\n startIcon={}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n ),\r\n ]}\r\n >\r\n \r\n {formik => {\r\n submitRef.current = formik.submitForm;\r\n if (!formik.isValid) {\r\n console.debug('form errors', formik.errors);\r\n }\r\n\r\n return (\r\n \r\n \r\n {formType === 'Insert' &&\r\n props.enableAddonCharge &&\r\n props.enableManualCharge && (\r\n \r\n {\r\n formik.setFieldValue('Type', value);\r\n setSelectedType(value);\r\n }}\r\n />\r\n \r\n )}\r\n {formik.values.Type === 'charge' && (\r\n \r\n \r\n \r\n )}\r\n {formik.values.Type === 'charge' && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {/* todo: filter out the consumable services */}\r\n {formik.values.Type === 'service' && (\r\n \r\n \r\n \r\n )}\r\n {formik.values.Type === 'charge' && (\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\nconst addServiceSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().optional(),\r\n Date: Yup.date().optional().nullable(),\r\n Unit: Yup.mixed().when('Type', {\r\n is: 'charge',\r\n then: Yup.mixed().required(),\r\n }),\r\n Service: Yup.mixed().when('Type', {\r\n is: 'service',\r\n then: Yup.mixed().required(),\r\n }),\r\n Name: Yup.string().when('Type', {\r\n is: 'charge',\r\n then: Yup.string().required(),\r\n }),\r\n Rate: Yup.number().when('Type', {\r\n is: 'charge',\r\n then: Yup.number().required(),\r\n }),\r\n Quantity: Yup.number().positive().required(),\r\n Type: Yup.string().oneOf(['charge', 'service']).required() as Yup.SchemaOf<\r\n ServiceRequestMilestoneChargeType\r\n >,\r\n Remarks: Yup.mixed().optional(),\r\n },\r\n);\r\n\r\ninterface ChargeTypeToggleProps {\r\n value: ServiceRequestMilestoneChargeType;\r\n onChange?: (value: ServiceRequestMilestoneChargeType) => void;\r\n}\r\nfunction ChargeTypeToggle(props: ChargeTypeToggleProps) {\r\n const { t } = useTranslation();\r\n const options = React.useMemo[]>(\r\n () => [\r\n {\r\n Id: 'service',\r\n Name: t(translations.Service),\r\n },\r\n {\r\n Id: 'charge',\r\n Name: t(translations.Charge),\r\n },\r\n ],\r\n [t],\r\n );\r\n const handleChange = (\r\n value: Entity | null,\r\n ) => {\r\n if (value !== null) {\r\n props.onChange?.(value.Id);\r\n }\r\n };\r\n const entityValue = options.find(f => f.Id === props.value);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst toInitialValues = (\r\n type: ServiceRequestMilestoneChargeType,\r\n value?: IServiceRequestMilestoneChargeDto,\r\n) => {\r\n const result: IServiceRequestMilestoneChargeForm =\r\n value === undefined\r\n ? {\r\n Date: null,\r\n }\r\n : {\r\n Id: value.Id,\r\n Service: value.Service ?? undefined,\r\n Quantity: value.Quantity ?? undefined,\r\n Remarks: value.Remarks ?? undefined,\r\n Date: value.Date === null ? null : dateUtils.parseISO(value.Date),\r\n Name: value.Name ?? undefined,\r\n Rate: value.Rate ?? undefined,\r\n Type: type,\r\n Unit: value.UnitType ?? undefined,\r\n };\r\n\r\n result.Type = type;\r\n return result;\r\n};\r\n","import { isEqual } from 'lodash';\r\nimport { Descendant } from 'slate';\r\nimport { jsx } from 'slate-hyperscript';\r\nimport { ParagraphElement } from 'types/Slate';\r\nimport { removeHtml } from 'utils/string-utils';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\n\r\nconst ELEMENT_TAGS = {\r\n A: el => ({ type: 'link', url: el.getAttribute('href') }),\r\n BLOCKQUOTE: () => ({ type: 'quote' }),\r\n H1: () => ({ type: 'heading-one' }),\r\n H2: () => ({ type: 'heading-two' }),\r\n H3: () => ({ type: 'heading-three' }),\r\n H4: () => ({ type: 'heading-four' }),\r\n H5: () => ({ type: 'heading-five' }),\r\n H6: () => ({ type: 'heading-six' }),\r\n IMG: el => ({ type: 'image', url: el.getAttribute('src') }),\r\n LI: () => ({ type: 'list-item' }),\r\n OL: () => ({ type: 'numbered-list' }),\r\n P: () => ({ type: 'paragraph' }),\r\n PRE: () => ({ type: 'code' }),\r\n UL: () => ({ type: 'bulleted-list' }),\r\n MENTION: el => ({\r\n type: 'mention',\r\n user: {\r\n Id: el.getAttribute('id'),\r\n Name: el.getAttribute('name').split('|').join(' '),\r\n },\r\n }),\r\n TABLE: () => ({ type: 'table' }),\r\n TBODY: () => ({ type: 'tbody' }),\r\n THEAD: () => ({ type: 'thead' }),\r\n TR: () => ({ type: 'table-row' }),\r\n TD: () => ({ type: 'table-cell' }),\r\n TH: () => ({ type: 'table-cell-header' }),\r\n};\r\n\r\n// COMPAT: `B` is omitted here because Google Docs uses `` in weird ways.\r\nconst TEXT_TAGS = {\r\n CODE: () => ({ code: true }),\r\n DEL: () => ({ strikethrough: true }),\r\n EM: () => ({ italic: true }),\r\n I: () => ({ italic: true }),\r\n S: () => ({ strikethrough: true }),\r\n STRONG: () => ({ bold: true }),\r\n U: () => ({ underline: true }),\r\n DATA: () => ({ plain: true }),\r\n};\r\n\r\nexport const deserialize = el => {\r\n if (el.nodeType === 3) {\r\n return el.textContent;\r\n } else if (el.nodeType !== 1) {\r\n return null;\r\n } else if (el.nodeName === 'BR') {\r\n return '\\n';\r\n }\r\n\r\n const { nodeName } = el;\r\n let parent = el;\r\n\r\n if (\r\n nodeName === 'PRE' &&\r\n el.childNodes[0] &&\r\n el.childNodes[0].nodeName === 'CODE'\r\n ) {\r\n parent = el.childNodes[0];\r\n }\r\n let children = Array.from(parent.childNodes).map(deserialize).flat();\r\n\r\n if (children.length === 0) {\r\n children = [{ text: '' }];\r\n }\r\n\r\n if (el.nodeName === 'BODY') {\r\n return jsx('fragment', {}, children);\r\n }\r\n\r\n if (ELEMENT_TAGS[nodeName]) {\r\n const attrs = ELEMENT_TAGS[nodeName](el);\r\n return jsx('element', attrs, children);\r\n }\r\n\r\n if (ELEMENT_TAGS[el.className]) {\r\n const attrs = ELEMENT_TAGS[el.className](el);\r\n return jsx('element', attrs, children);\r\n }\r\n\r\n if (TEXT_TAGS[nodeName]) {\r\n try {\r\n const attrs = TEXT_TAGS[nodeName](el);\r\n return children.map(child => jsx('text', attrs, child));\r\n } catch (error) {\r\n //console.log(error); //If have element, error: The hyperscript tag can only contain text content as children.\r\n return children;\r\n }\r\n }\r\n\r\n return children;\r\n};\r\n\r\nconst deserializeHtml = node => {\r\n if (node) {\r\n return deserialize(node);\r\n } else return [];\r\n};\r\n\r\nexport const deserializeHtmlString = (\r\n htmlString: string | undefined | null,\r\n) => {\r\n let currentSring = htmlString || '';\r\n if (isEmptyOrWhitespace(currentSring)) {\r\n currentSring = '

    ';\r\n } else {\r\n if (currentSring.indexOf('<') === -1) {\r\n currentSring = '

    ' + currentSring + '

    ';\r\n }\r\n }\r\n const parsed = new DOMParser().parseFromString(currentSring, 'text/html');\r\n return deserializeHtml(parsed.body);\r\n};\r\n\r\nconst elementHtmlString = props => {\r\n const { attributes, children, element } = props;\r\n\r\n switch (element.type) {\r\n default:\r\n return '

    ' + children + '

    ';\r\n case 'quote':\r\n return '' + children + '';\r\n case 'code':\r\n return (\r\n '
    ' +\r\n        '' +\r\n        children +\r\n        ' ' +\r\n        '
    '\r\n );\r\n case 'bulleted-list':\r\n return '
      ' + children + '
    ';\r\n case 'heading-one':\r\n return '

    ' + children + '

    ';\r\n case 'heading-two':\r\n return '

    ' + children + '

    ';\r\n case 'heading-three':\r\n return '

    ' + children + '

    ';\r\n case 'heading-four':\r\n return '

    ' + children + '

    ';\r\n case 'heading-five':\r\n return '
    ' + children + '
    ';\r\n case 'heading-six':\r\n return '
    ' + children + '
    ';\r\n case 'list-item':\r\n return '
  • ' + children + '
  • ';\r\n case 'numbered-list':\r\n return '
      ' + children + '
    ';\r\n case 'link':\r\n return (\r\n '' + children + ''\r\n );\r\n case 'mention':\r\n return (\r\n '' +\r\n children +\r\n ''\r\n );\r\n case 'thead':\r\n return '' + children + '';\r\n case 'tbody':\r\n return '' + children + '';\r\n case 'table':\r\n return (\r\n '' +\r\n children +\r\n '
    '\r\n );\r\n case 'table-row':\r\n return (\r\n '' +\r\n children +\r\n ''\r\n );\r\n case 'table-cell':\r\n return (\r\n '' +\r\n children +\r\n ''\r\n );\r\n case 'table-cell-header':\r\n return '' + children + '';\r\n case 'image':\r\n return '';\r\n //case 'image':\r\n //return ;\r\n }\r\n};\r\n\r\nconst leafHtmlString = ({ attributes, children, leaf }) => {\r\n if (children === '\\n') {\r\n return '
    ';\r\n }\r\n\r\n if (leaf.bold) {\r\n children = '' + children + '';\r\n }\r\n\r\n if (leaf.code) {\r\n children = '' + children + '';\r\n }\r\n\r\n if (leaf.italic) {\r\n children = '' + children + '';\r\n }\r\n\r\n if (leaf.underline) {\r\n children = '' + children + '';\r\n }\r\n\r\n if (leaf.strikethrough) {\r\n children = '' + children + '';\r\n }\r\n if (leaf.plain) {\r\n children = '' + children + '';\r\n }\r\n if (attributes !== '') {\r\n return '' + children + '';\r\n } else {\r\n if (children) return children;\r\n else return '';\r\n }\r\n};\r\n\r\nfunction serializeItemHtmlString(item) {\r\n let children = [];\r\n if (item.children !== undefined) {\r\n children = item.children.map(item => {\r\n if (item.type) {\r\n return serializeItemHtmlString(item);\r\n } else {\r\n return leafHtmlString({\r\n attributes: '',\r\n children: item.text,\r\n leaf: item,\r\n });\r\n }\r\n });\r\n }\r\n return elementHtmlString({\r\n attributes: '',\r\n children: children.join(''),\r\n element: item,\r\n });\r\n}\r\n\r\n/**\r\n * This one serves as an empty placeholder since Slate does not accept undefined. When an empty array is passed it throws one of the following errors:\r\n * * Cannot get the start point in the node at path [] because it has no start text node.\r\n * * Cannot resolve a Slate point from DOM point: [object HTMLDivElement],0\r\n */\r\nconst EMPTY_SLATE_NODE: ParagraphElement[] = [\r\n {\r\n type: 'paragraph',\r\n children: [{ text: '', type: 'text' }],\r\n },\r\n];\r\n\r\nexport function serializeHtmlString(\r\n data: Descendant[] | undefined,\r\n): string | undefined {\r\n const emptyValue = undefined;\r\n // data won't be undefined since Slate does not work with it, but nevertheless\r\n if (data === undefined || data === null) {\r\n return emptyValue;\r\n }\r\n // empty array -> empty value\r\n if (data.length === 0) {\r\n return emptyValue;\r\n }\r\n // default empty slate value -> empty value\r\n if (isEqual(data, EMPTY_SLATE_NODE)) {\r\n return emptyValue;\r\n }\r\n const elements = data.map(item => {\r\n return serializeItemHtmlString(item);\r\n });\r\n const result = elements.join('');\r\n // double check that serialized html does have something typed in and is not just a bunch of html entities\r\n if (isEmptyOrWhitespace(removeHtml(result))) {\r\n return emptyValue;\r\n } else {\r\n return result;\r\n }\r\n}\r\n","import Box from '@material-ui/core/Box';\r\nimport ToggleButton from '@material-ui/lab/ToggleButton';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport isHotkey from 'is-hotkey';\r\nimport React, {\r\n ReactNode,\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport {\r\n createEditor,\r\n Descendant,\r\n Editor,\r\n Range,\r\n Transforms,\r\n Point,\r\n Element as SlateElement,\r\n} from 'slate';\r\nimport { withHistory } from 'slate-history';\r\nimport {\r\n Editable,\r\n ReactEditor,\r\n Slate,\r\n useFocused,\r\n useSelected,\r\n useSlate,\r\n withReact,\r\n} from 'slate-react';\r\nimport { Entity } from 'types/common';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport {\r\n deserialize,\r\n deserializeHtmlString,\r\n serializeHtmlString,\r\n} from './RichEditorSerializer';\r\nimport { useStyles } from './styles';\r\nimport { CustomEditor, MentionElement } from 'types/Slate';\r\nimport ReactDOM from 'react-dom';\r\nimport { UserPicker } from '../pickers/AutocompletePickers/UserPicker';\r\nimport { DropDown } from '../DropDown';\r\nimport { createStyles, makeStyles, MenuItem, Theme } from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { debounce } from 'lodash';\r\n\r\nimport imageExtensions from 'image-extensions';\r\nimport isUrl from 'is-url';\r\n\r\nconst HOTKEYS = {\r\n 'mod+b': 'bold',\r\n 'mod+i': 'italic',\r\n 'mod+u': 'underline',\r\n 'mod+`': 'code',\r\n};\r\n\r\nexport interface RichEditorProps {\r\n value: Descendant[];\r\n setValue: (value: Descendant[]) => void;\r\n onChangeMentions?: (mentions: Entity[]) => void;\r\n placeholder?: string;\r\n autoFocus?: boolean;\r\n borders?: boolean;\r\n compact?: boolean;\r\n readonly?: boolean;\r\n hasMentions?: boolean;\r\n additionalButtons?: ((className, key) => ReactNode)[];\r\n disabled?: boolean;\r\n useCodeButton?: boolean;\r\n isInvoiceTemplateEditor?: boolean;\r\n extendedMode?: boolean;\r\n}\r\n\r\nconst RichTextWithMentions = (props: RichEditorProps) => {\r\n const {\r\n value,\r\n setValue,\r\n placeholder,\r\n autoFocus,\r\n hasMentions,\r\n onChangeMentions,\r\n additionalButtons,\r\n disabled,\r\n useCodeButton,\r\n isInvoiceTemplateEditor,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n extendedMode,\r\n } = props;\r\n const { t } = useTranslation();\r\n const renderElement = useCallback(props => , []);\r\n const renderLeaf = useCallback(props => , []);\r\n const editor = useMemo(() => {\r\n return withMentions(\r\n withImages(withTables(withHtml(withHistory(withReact(createEditor()))))),\r\n );\r\n }, []);\r\n const [initValue, setInitValue] = useState(value);\r\n const ref = useRef(null);\r\n const [target, setTarget] = useState();\r\n const [index, setIndex] = useState(0);\r\n const [search, setSearch] = useState('');\r\n const [users, setUsers] = useState[]>([]);\r\n const [mention, setMention] = useState();\r\n const [mentions, setMentions] = useState[]>([]);\r\n const showControlPanel = React.useMemo(() => {\r\n let stringVal = serializeHtmlString(initValue);\r\n return stringVal !== '' && stringVal !== undefined && stringVal !== null;\r\n }, [initValue]);\r\n useEffect(() => {\r\n if (!hasMentions) return;\r\n let unmounted = false;\r\n (search => {\r\n const url = '/api/odata/v4/UserFilter/GetRelevantUsers';\r\n const params: {\r\n $orderby: string;\r\n $top: number;\r\n $filter?: string;\r\n $select?: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name',\r\n $top: 10,\r\n };\r\n if (search !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: search,\r\n }).toString();\r\n }\r\n\r\n httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[])\r\n .then(v => {\r\n if (!unmounted) {\r\n setUsers(v);\r\n }\r\n })\r\n .catch(e => console.error(e));\r\n })(search);\r\n return () => {\r\n unmounted = true;\r\n };\r\n }, [search, hasMentions]);\r\n\r\n useEffect(() => {\r\n if (target && mention && hasMentions) {\r\n Transforms.insertNodes(\r\n editor,\r\n [\r\n { text: '', plain: true } as any,\r\n mention as MentionElement,\r\n { text: ' ', plain: true } as any,\r\n ],\r\n {\r\n at: target,\r\n },\r\n );\r\n Transforms.move(editor, { distance: 2 });\r\n setTarget(undefined);\r\n setMention(undefined);\r\n }\r\n }, [target, mention, editor, hasMentions]);\r\n\r\n const onKeyDown = useCallback(\r\n event => {\r\n if (hasMentions && target && users.length) {\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n const prevIndex = index >= users.length - 1 ? 0 : index + 1;\r\n setIndex(prevIndex);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n const nextIndex = index <= 0 ? users.length - 1 : index - 1;\r\n setIndex(nextIndex);\r\n break;\r\n case 'Tab':\r\n case 'Enter':\r\n event.preventDefault();\r\n setMention({\r\n type: 'mention',\r\n user: { ...users[index] },\r\n children: [{ text: '' }],\r\n });\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n setTarget(undefined);\r\n break;\r\n }\r\n }\r\n },\r\n [hasMentions, index, target, users],\r\n );\r\n useEffect(() => {\r\n if (target) {\r\n const el = ref.current;\r\n if (!el) return;\r\n const domRange = ReactEditor.toDOMRange(editor, target);\r\n const rect = domRange.getBoundingClientRect();\r\n el.style.top = `${rect.top + window.pageYOffset + 24}px`;\r\n el.style.left = `${rect.left + window.pageXOffset}px`;\r\n }\r\n }, [editor, target]);\r\n const onMentionsChange = () => {\r\n if (!hasMentions) return;\r\n const newMentions = getMentions(editor);\r\n if (newMentions.length !== mentions.length) {\r\n setMentions(newMentions);\r\n onChangeMentions?.(newMentions);\r\n return;\r\n }\r\n if (mentions.every(m => newMentions.map(v => v.Id).includes(m.Id))) return;\r\n setMentions(newMentions);\r\n onChangeMentions?.(newMentions);\r\n };\r\n\r\n const classes = useStyles(props)();\r\n\r\n //const fileUploadRef = useRef(null);\r\n\r\n /* const onChangeUpload = e => {\r\n fnRemoteImage(editor, e.target.files);\r\n }; */\r\n\r\n const styles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n editorBodyStyle: {\r\n width: '100%',\r\n maxHeight: '42vh',\r\n minHeight: '100px',\r\n paddingLeft: '8px',\r\n overflowY: 'auto',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n },\r\n }),\r\n );\r\n const editorClass = styles();\r\n\r\n const debounceValue = React.useCallback(\r\n value =>\r\n debounce(value => {\r\n setValue(value);\r\n }, 50)(value),\r\n [setValue],\r\n );\r\n return (\r\n \r\n {\r\n const { selection } = editor;\r\n if (selection && Range.isCollapsed(selection)) {\r\n const [start] = Range.edges(selection);\r\n const wordBefore = Editor.before(editor, start, { unit: 'word' });\r\n const before = wordBefore && Editor.before(editor, wordBefore);\r\n const beforeRange = before && Editor.range(editor, before, start);\r\n const beforeText =\r\n beforeRange && Editor.string(editor, beforeRange);\r\n const beforeMatch = beforeText && beforeText.match(/^@(\\w+)$/);\r\n const after = Editor.after(editor, start);\r\n const afterRange = Editor.range(editor, start, after);\r\n const afterText = Editor.string(editor, afterRange);\r\n const afterMatch = afterText.match(/^(\\s|$)/);\r\n if (beforeMatch && afterMatch) {\r\n setTarget(beforeRange);\r\n setSearch(beforeMatch[1]);\r\n setIndex(0);\r\n } else {\r\n setTarget(undefined);\r\n }\r\n }\r\n debounceValue(value);\r\n setInitValue(value);\r\n onMentionsChange();\r\n }}\r\n >\r\n {showControlPanel && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {useCodeButton && (\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 {/* {\r\n event.preventDefault();\r\n if (!!fileUploadRef.current) {\r\n (fileUploadRef.current as any).click();\r\n }\r\n }}\r\n >\r\n \r\n */}\r\n {/* */}\r\n {hasMentions && (\r\n <>\r\n {\r\n e.preventDefault();\r\n const end = Editor.end(editor, []);\r\n const { selection } = editor;\r\n setTarget(selection ?? { anchor: end, focus: end });\r\n }}\r\n menuChildren={close => [\r\n \r\n {\r\n if (!v) return;\r\n setMention({\r\n type: 'mention',\r\n user: v,\r\n children: [{ text: '' }],\r\n });\r\n close();\r\n }}\r\n />\r\n ,\r\n ]}\r\n >\r\n \r\n \r\n \r\n )}\r\n {additionalButtons &&\r\n additionalButtons.map((b, i) =>\r\n b(classes.button, 'richtextbutton' + i),\r\n )}\r\n \r\n \r\n )}\r\n \r\n {\r\n for (const hotkey in HOTKEYS) {\r\n if (isHotkey(hotkey, event.nativeEvent)) {\r\n event.preventDefault();\r\n const mark = HOTKEYS[hotkey];\r\n toggleMark(editor, mark);\r\n }\r\n }\r\n onKeyDown(event);\r\n }}\r\n />\r\n {hasMentions && target && users.length > 0 && search !== '' && (\r\n \r\n \r\n {users.map((char, i) => (\r\n {\r\n setIndex(i);\r\n }}\r\n onMouseDown={() =>\r\n setMention({\r\n type: 'mention',\r\n user: char,\r\n children: [{ text: '' }],\r\n })\r\n }\r\n >\r\n {char.Name}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst toggleMark = (editor, format) => {\r\n const isActive = isMarkActive(editor, format);\r\n\r\n if (isActive) {\r\n Editor.removeMark(editor, format);\r\n } else {\r\n Editor.addMark(editor, format, true);\r\n }\r\n};\r\n\r\nconst MarkButton = ({ format, children, className, ...props }) => {\r\n const editor = useSlate();\r\n return (\r\n {\r\n event.preventDefault();\r\n toggleMark(editor, format);\r\n }}\r\n style={{ lineHeight: 1 }}\r\n {...props}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n\r\nconst BlockButton = ({ format, children, className, ...props }) => {\r\n const editor = useSlate();\r\n return (\r\n {\r\n event.preventDefault();\r\n toggleBlock(editor, format);\r\n }}\r\n style={{ lineHeight: 1 }}\r\n {...props}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n\r\nconst isBlockActive = (editor, format) => {\r\n const [match] = Editor.nodes(editor, {\r\n match: n => n.type === format,\r\n });\r\n return !!match;\r\n};\r\n\r\nconst LIST_TYPES = ['numbered-list', 'bulleted-list'];\r\n\r\nconst toggleBlock = (editor, format) => {\r\n const isActive = isBlockActive(editor, format);\r\n const isList = LIST_TYPES.includes(format);\r\n\r\n Transforms.unwrapNodes(editor, {\r\n match: n => LIST_TYPES.includes(n.type),\r\n split: true,\r\n });\r\n\r\n Transforms.setNodes(editor, {\r\n type: isActive ? 'paragraph' : isList ? 'list-item' : format,\r\n });\r\n\r\n if (!isActive && isList) {\r\n const block = { type: format, children: [] };\r\n Transforms.wrapNodes(editor, block);\r\n }\r\n};\r\n\r\nconst isMarkActive = (editor, format) => {\r\n const marks = editor.marks ? Editor.marks(editor) : null;\r\n return marks ? marks[format] === true : false;\r\n};\r\n\r\nexport const StartRichEditor: React.FC<{\r\n initialValue: string | undefined;\r\n onChange: (value: string | undefined) => void;\r\n placeholder?: string;\r\n autoFocus?: boolean;\r\n hasMentions?: boolean;\r\n onChangeMentions?: (mentions: Entity[]) => void;\r\n additionalButtons?: ((className, key) => ReactNode)[];\r\n disabled?: boolean;\r\n isInvoiceTemplateEditor?: boolean;\r\n extendedMode?: boolean;\r\n}> = ({\r\n initialValue,\r\n onChange,\r\n placeholder,\r\n autoFocus,\r\n hasMentions,\r\n onChangeMentions,\r\n additionalButtons,\r\n disabled,\r\n isInvoiceTemplateEditor,\r\n extendedMode,\r\n}) => {\r\n const setValue = value => {\r\n onChange(serializeHtmlString(value));\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst withMentions = (editor: CustomEditor) => {\r\n const { isInline, isVoid } = editor;\r\n\r\n editor.isInline = element => {\r\n return element.type === 'mention' ? true : isInline(element);\r\n };\r\n\r\n editor.isVoid = element => {\r\n return element.type === 'mention' ? true : isVoid(element);\r\n };\r\n\r\n return editor;\r\n};\r\n\r\nconst getMentions = editor => {\r\n const mentions = Editor.nodes(editor, {\r\n match: node => node.type === 'mention',\r\n at: [],\r\n });\r\n const set = new Set();\r\n const res: Entity[] = [];\r\n for (const [node] of mentions) {\r\n if (node.type === 'mention') {\r\n const user = (node as MentionElement).user;\r\n if (!set.has(user.Id)) {\r\n res.push(user);\r\n set.add(user.Id);\r\n }\r\n }\r\n }\r\n return res;\r\n};\r\n\r\nconst Portal = ({ children }) => {\r\n return typeof document === 'object'\r\n ? ReactDOM.createPortal(children, document.body)\r\n : null;\r\n};\r\n\r\nconst fnRemoteImage = (editor, files) => {\r\n for (const file of files) {\r\n const [mime] = file.type.split('/');\r\n if (mime === 'image') {\r\n const formData = new FormData();\r\n formData.append('image', file);\r\n //Need fixing - currently this route is commented on server\r\n fetch('/api/odata/v4/Files/InsertFile', {\r\n method: 'POST',\r\n body: formData,\r\n })\r\n .then(response => response.json())\r\n .then(result => {\r\n console.log(result);\r\n insertImage(\r\n editor,\r\n result.data\r\n .uri /* 'file:///C:/bookitlab/web-ui/public/favicon.png' */,\r\n );\r\n })\r\n .catch(error => {\r\n alert('Error:' + error);\r\n });\r\n }\r\n }\r\n};\r\n\r\nconst withImages = editor => {\r\n const { insertData, isVoid } = editor;\r\n\r\n editor.isVoid = element => {\r\n return element.type === 'image' ? true : isVoid(element);\r\n };\r\n\r\n editor.insertData = data => {\r\n const text = data.getData('text/plain');\r\n const { files } = data;\r\n console.log('insertData:', files);\r\n if (files && files.length > 0) {\r\n fnRemoteImage(editor, files);\r\n } else if (isImageUrl(text)) {\r\n insertImage(editor, text);\r\n } else {\r\n insertData(data);\r\n }\r\n };\r\n\r\n return editor;\r\n};\r\n\r\nconst isImageUrl = url => {\r\n if (!url) return false;\r\n if (!isUrl(url)) return false;\r\n const ext = new URL(url).pathname.split('.').pop();\r\n return imageExtensions.includes(ext as string);\r\n};\r\n\r\nconst insertImage = (editor, url) => {\r\n const text = { text: '' };\r\n const image = { type: 'image', url, children: [text] };\r\n Transforms.insertNodes(editor, image as any);\r\n};\r\n\r\nconst withTables = editor => {\r\n const { deleteBackward, deleteForward, insertBreak } = editor;\r\n\r\n editor.deleteBackward = unit => {\r\n const { selection } = editor;\r\n\r\n if (selection && Range.isCollapsed(selection)) {\r\n const [cell] = Editor.nodes(editor, {\r\n match: n =>\r\n !Editor.isEditor(n) &&\r\n SlateElement.isElement(n) &&\r\n n.type === 'table-cell',\r\n });\r\n\r\n if (cell) {\r\n const [, cellPath] = cell;\r\n const start = Editor.start(editor, cellPath);\r\n\r\n if (Point.equals(selection.anchor, start)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n deleteBackward(unit);\r\n };\r\n\r\n editor.deleteForward = unit => {\r\n const { selection } = editor;\r\n\r\n if (selection && Range.isCollapsed(selection)) {\r\n const [cell] = Editor.nodes(editor, {\r\n match: n =>\r\n !Editor.isEditor(n) &&\r\n SlateElement.isElement(n) &&\r\n n.type === 'table-cell',\r\n });\r\n\r\n if (cell) {\r\n const [, cellPath] = cell;\r\n const end = Editor.end(editor, cellPath);\r\n\r\n if (Point.equals(selection.anchor, end)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n deleteForward(unit);\r\n };\r\n\r\n editor.insertBreak = () => {\r\n const { selection } = editor;\r\n\r\n if (selection) {\r\n const [table] = Editor.nodes(editor, {\r\n match: n =>\r\n !Editor.isEditor(n) &&\r\n SlateElement.isElement(n) &&\r\n n.type === 'table',\r\n });\r\n\r\n if (table) {\r\n return;\r\n }\r\n }\r\n\r\n insertBreak();\r\n };\r\n\r\n return editor;\r\n};\r\n\r\nconst withHtml = editor => {\r\n const { insertData, isInline, isVoid } = editor;\r\n\r\n editor.isInline = element => {\r\n return element.type === 'link' ? true : isInline(element);\r\n };\r\n\r\n editor.isVoid = element => {\r\n return element.type === 'image' ? true : isVoid(element);\r\n };\r\n\r\n editor.insertData = data => {\r\n const html = data.getData('text/html');\r\n\r\n if (html) {\r\n const parsed = new DOMParser().parseFromString(html, 'text/html');\r\n const fragment = deserialize(parsed.body);\r\n Transforms.insertFragment(editor, fragment);\r\n return;\r\n }\r\n\r\n insertData(data);\r\n };\r\n\r\n return editor;\r\n};\r\n\r\nconst Element = ({ attributes, children, element }) => {\r\n switch (element.type) {\r\n case 'thead':\r\n return {children};\r\n case 'tbody':\r\n return {children};\r\n case 'table':\r\n return {children}
    ;\r\n case 'table-row':\r\n //return {children};\r\n return (\r\n \r\n );\r\n case 'table-cell':\r\n //return {children};\r\n return (\r\n \r\n );\r\n case 'table-cell-header':\r\n return {children};\r\n case 'block-quote':\r\n return
    {children}
    ;\r\n case 'bulleted-list':\r\n return
      {children}
    ;\r\n case 'heading-one':\r\n return

    {children}

    ;\r\n case 'heading-two':\r\n return

    {children}

    ;\r\n case 'heading-three':\r\n return

    {children}

    ;\r\n case 'heading-four':\r\n return

    {children}

    ;\r\n case 'heading-five':\r\n return
    {children}
    ;\r\n case 'heading-six':\r\n return
    {children}
    ;\r\n case 'list-item':\r\n return
  • {children}
  • ;\r\n case 'numbered-list':\r\n return
      {children}
    ;\r\n case 'link':\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n case 'mention':\r\n return (\r\n \r\n );\r\n case 'image':\r\n return (\r\n \r\n );\r\n default:\r\n return

    {children}

    ;\r\n }\r\n};\r\n\r\nconst Leaf = ({ attributes, children, leaf }) => {\r\n if (leaf.bold) {\r\n children = {children};\r\n }\r\n\r\n if (leaf.code) {\r\n children = {children};\r\n }\r\n\r\n if (leaf.italic) {\r\n children = {children};\r\n }\r\n\r\n if (leaf.underline) {\r\n children = {children};\r\n }\r\n if (leaf.plain) {\r\n children = {children};\r\n }\r\n\r\n return {children};\r\n};\r\n\r\nexport const ImageElement = ({ attributes, children, element }) => {\r\n const selected = useSelected();\r\n const focused = useFocused();\r\n return (\r\n
    \r\n {children}\r\n \r\n
    \r\n );\r\n};\r\n\r\nexport const TrStyled = ({ attributes, children, element }) => {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const TdStyled = ({ attributes, children, element }) => {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const Mention = ({ attributes, children, element }) => {\r\n const selected = useSelected();\r\n const focused = useFocused();\r\n return (\r\n \r\n @{element.user.Name}\r\n {children}\r\n \r\n );\r\n};\r\n","import { makeStyles, Theme, createStyles } from '@material-ui/core';\r\n\r\nexport const useStyles = props =>\r\n makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n //padding: '0px 0px 0px 1px',\r\n background: theme.palette.common.white,\r\n border: `1px solid ${theme.palette.common.grayComponentsLight}`,\r\n boxSizing: 'border-box',\r\n borderRadius: 8,\r\n },\r\n header: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n //padding: '1px 0px',\r\n width: '100%',\r\n background: theme.palette.common.white,\r\n borderBottom: `1px solid ${theme.palette.common.grayComponentsLight}`,\r\n boxSizing: 'border-box',\r\n borderRadius: '8px 8px 0px 0px',\r\n },\r\n headerControls: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n width: '100%',\r\n flexWrap: 'wrap',\r\n },\r\n button: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: 10,\r\n border: 'none',\r\n borderRadius: 0,\r\n boxShadow: 'inset -1px 0px 0px #E0E5EC',\r\n color: theme.palette.common.blackRegular,\r\n },\r\n text: {\r\n paddingLeft: theme.spacing(1),\r\n width: '100%',\r\n minHeight: 32,\r\n maxHeight: 300,\r\n overflowY: 'auto',\r\n },\r\n }),\r\n );\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n avatar: {\r\n width: '48px',\r\n height: '48px',\r\n backgroundColor: '#DBF9ED',\r\n color: '#10BD79',\r\n },\r\n withPointer: {\r\n cursor: 'pointer',\r\n },\r\n }),\r\n);\r\n","import { useMemo } from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { Body } from '../Typography';\r\nimport { useStyles } from './styles';\r\nimport { Avatar as MuiAvatar } from '@material-ui/core';\r\nimport clsx from 'clsx';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface AvatarProps {\r\n user?: Entity | null;\r\n}\r\nexport const Avatar = ({ user }: AvatarProps) => {\r\n const { t } = useTranslation();\r\n const initials = useMemo(() => {\r\n const defaultText = t(translations.NA);\r\n if (user === null) {\r\n return defaultText;\r\n }\r\n if (user === undefined) {\r\n return defaultText;\r\n }\r\n const split = user.Name.split(' ');\r\n return (split[0][0] + (split[1] ? split[1][0] : '')).toUpperCase();\r\n }, [t, user]);\r\n const classes = useStyles();\r\n const Id = user?.Id ?? undefined;\r\n return (\r\n \r\n {\r\n if (Id !== undefined) {\r\n window.open(toRootedURL('/UserProfile.aspx?id=' + Id), '_blank');\r\n }\r\n }}\r\n >\r\n \r\n {initials}\r\n \r\n \r\n \r\n );\r\n};\r\n","import {\r\n BaseURLPicker,\r\n BaseURLPickerProps,\r\n} from 'app/components/BasicPickers/BaseURLPicker';\r\nimport { Entity } from 'types/common';\r\nconst url = '/api/odata/v4/PaymentMethodFilter/WithSystemSettings';\r\nexport interface PaymentMethodPickerProps\r\n extends Omit>, 'url'> {}\r\nexport const PaymentMethodPicker = (props: PaymentMethodPickerProps) => {\r\n return (\r\n \r\n );\r\n};\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n PaymentMethodPicker,\r\n PaymentMethodPickerProps,\r\n} from '../pickers/AutocompletePickers/PaymentMethodPicker';\r\n\r\nexport const FormPaymentMethodPicker = ({\r\n onChange,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n Omit) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n helpers.setValue(value, true)}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined && meta?.touched}\r\n helperText={meta.error}\r\n {...props}\r\n />\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useRowSelect, PluginHook, Row } from 'react-table';\r\nimport { IRow } from 'app/components/BasicTable/IRow';\r\nimport { Icon } from 'app/components//BasicIcons/FontAwesome';\r\nimport { Check } from 'app/components/BasicInputs/Check';\r\nimport {\r\n getConditionalSelectColumnCheckboxProps,\r\n getConditionalSelectHeaderCheckboxProps,\r\n} from './ConditionalSelectHeaderCheckbox';\r\nimport { defaultCheckIfRowIsSelectable } from './index';\r\n\r\n/**\r\n * Adds useRowSelect with the checkboxes in the first column\r\n * @param tablePlugins table plugins array passed into useTable\r\n * @param isRowSelectable controls row select-ability\r\n * @param onSelectedChange\r\n */\r\nexport function addRowSelect(\r\n tablePlugins: PluginHook[],\r\n isRowSelectable?: (row: Row) => boolean,\r\n onSelectedChange?: (row: TRow, checked: boolean) => void,\r\n) {\r\n tablePlugins.push(useRowSelect);\r\n tablePlugins.push(hooks => {\r\n hooks.visibleColumns.push(columns => [\r\n // Let's make a column for selection\r\n {\r\n id: 'selection',\r\n disableSortBy: true,\r\n // The header can use the table's getToggleAllRowsSelectedProps method\r\n // to render a checkbox\r\n Header: props => {\r\n const checkboxProps = React.useMemo(() => {\r\n return getConditionalSelectHeaderCheckboxProps({\r\n headerProps: props,\r\n checkIfRowIsSelectable:\r\n isRowSelectable || defaultCheckIfRowIsSelectable,\r\n onSelectedChange: onSelectedChange,\r\n shouldSelectPage: false,\r\n });\r\n }, [props]);\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n },\r\n // The cell can use the individual row's getToggleRowSelectedProps method\r\n // to the render a checkbox\r\n Cell: ({ row }) => {\r\n if (!row.original.Rows || row.original.Rows.length <= 1) {\r\n const checkProps = getConditionalSelectColumnCheckboxProps({\r\n row: row,\r\n checkIfRowIsSelectable:\r\n isRowSelectable || defaultCheckIfRowIsSelectable,\r\n onSelectedChange: onSelectedChange,\r\n });\r\n\r\n if (!!isRowSelectable && !isRowSelectable(row)) {\r\n return <>;\r\n } else {\r\n return (\r\n e.stopPropagation()}\r\n style={{ padding: '3px', gap: '10px' }}\r\n >\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 ...columns,\r\n ]);\r\n });\r\n}\r\n","import { HeaderProps, Row } from 'react-table';\r\nimport { IRow } from '.';\r\n\r\ninterface GetConditionalSelectHeaderCheckboxProps {\r\n /** react-table's header props */\r\n headerProps: React.PropsWithChildren>;\r\n /** A predicate - based on your business logic - to determine whether a given row should be selectable */\r\n checkIfRowIsSelectable: (row: Row) => boolean;\r\n /** Whether to allow page selection. Default: true */\r\n shouldSelectPage?: boolean;\r\n onSelectedChange?: (row: TRow, checked: boolean) => void;\r\n}\r\n\r\n/**\r\n * A convenience method for react-table headers for allowing conditional select\r\n * @param headerProps react-table's header props\r\n * @param checkIfRowIsSelectable A predicate - based on your business logic - to determine whether a given row should be selectable\r\n * @param shouldSelectPage Whether to allow page selection. Default: true\r\n * @returns Modified `checkboxProps` to enforce the conditional select\r\n */\r\nexport const getConditionalSelectHeaderCheckboxProps = ({\r\n headerProps,\r\n checkIfRowIsSelectable,\r\n onSelectedChange,\r\n shouldSelectPage = true,\r\n}: GetConditionalSelectHeaderCheckboxProps) => {\r\n // Note that in my comments I differentiate between the standard logic and the logic for the conditional select\r\n const checkIfAllSelectableRowsSelected = (rows: Row[]) =>\r\n rows.filter(checkIfRowIsSelectable).every(row => row.isSelected);\r\n // Standard: Here we define the selection type for the next click: Select Page / Select All\r\n const isSelectPage =\r\n shouldSelectPage &&\r\n headerProps.page\r\n // For conditional select: Filter the rows based on your business logic\r\n .filter(checkIfRowIsSelectable)\r\n // Standard: `isSelectPage === true` if some of the rows are not yet selected\r\n // This (standard) logic might be confusing to understand at first, but - as a side note - the idea is as follows:\r\n // This is the variable that defines whether the header props that will be received FOR THE NEXT CLICK will be for Select Page or for Select All\r\n // Try to play this out in your head:\r\n // - Initially, none of the rows are selected, so when we clicking the button initially, we will select only the (selectable) rows on the page (i.e. Select Page), hence the next click will be for Select All, hence `isSelectPage` will be `false`\r\n // - When clicking again, we will select the rest of the (selectable) rows (i.e. Select All). The next click will again be Select All (for de-selecting all), hence `isSelectPage` will be `false`\r\n // - Finally, when clicking again, we will de-select all rows. The next click will be for Select Page, hence `isSelectPage` will `true`\r\n .some(row => !row.isSelected);\r\n\r\n // Standard: Get the props based on Select Page / Select All\r\n const checkboxProps = isSelectPage\r\n ? headerProps.getToggleAllPageRowsSelectedProps()\r\n : headerProps.getToggleAllRowsSelectedProps();\r\n\r\n // For conditional select: The header checkbox should be:\r\n // - checked if all selectable rows are selected\r\n // - indeterminate if only some selectable rows are selected (but not all)\r\n const disabled = headerProps.rows.filter(checkIfRowIsSelectable).length === 0;\r\n const checked =\r\n !disabled && checkIfAllSelectableRowsSelected(headerProps.rows);\r\n const indeterminate =\r\n !checked && headerProps.rows.some(row => row.isSelected);\r\n\r\n // For conditional select: This is where the magic happens\r\n const onChange = () => {\r\n // If we're in Select All and all selectable rows are already selected: deselect all rows\r\n if (!isSelectPage && checkIfAllSelectableRowsSelected(headerProps.rows)) {\r\n headerProps.rows.forEach(row => {\r\n headerProps.toggleRowSelected(row.id, false);\r\n if (!!onSelectedChange) {\r\n onSelectedChange(row.original, checked);\r\n }\r\n });\r\n } else {\r\n // Otherwise:\r\n // First, define the rows to work with: if we're in Select Page, use `headerProps.page`, otherwise (Select All) use headerProps.rows\r\n const rows = isSelectPage ? headerProps.page : headerProps.rows;\r\n // Then select every selectable row\r\n rows.forEach(row => {\r\n const checked = checkIfRowIsSelectable(row);\r\n headerProps.toggleRowSelected(row.id, checked);\r\n if (!!onSelectedChange) {\r\n onSelectedChange(row.original, checked);\r\n }\r\n });\r\n }\r\n };\r\n\r\n // For conditional select: override checked, indeterminate and onChange - to enforce conditional select based on our business logic\r\n return {\r\n ...checkboxProps,\r\n checked,\r\n indeterminate,\r\n onChange,\r\n disabled,\r\n };\r\n};\r\ninterface GetConditionalSelectColumnCheckboxProps {\r\n /** react-table's header props */\r\n row: Row;\r\n /** A predicate - based on your business logic - to determine whether a given row should be selectable */\r\n checkIfRowIsSelectable: (row: Row) => boolean;\r\n onSelectedChange?: (row: TRow, checked: boolean) => void;\r\n}\r\n\r\nexport const getConditionalSelectColumnCheckboxProps = ({\r\n row,\r\n checkIfRowIsSelectable,\r\n onSelectedChange,\r\n}: GetConditionalSelectColumnCheckboxProps) => {\r\n const checkboxProps = row.getToggleRowSelectedProps();\r\n const disabled = !checkIfRowIsSelectable(row);\r\n const checked = row.isSelected;\r\n const onChange = (ev: React.ChangeEvent) => {\r\n const checked = ev.target.checked && checkIfRowIsSelectable(row);\r\n row.toggleRowSelected(checked);\r\n if (!!onSelectedChange) {\r\n onSelectedChange(row.original, checked);\r\n }\r\n };\r\n return {\r\n ...checkboxProps,\r\n checked,\r\n onChange,\r\n disabled,\r\n };\r\n};\r\n","export enum InvoiceFundingType {\r\n //All,\r\n FundingType_Internal = 0,\r\n FundingType_External = 1,\r\n}\r\n","export enum ScreenToShowOn {\r\n ShowOn_InvoicesList = 1,\r\n ShowOn_InvoiceBatches = 2,\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { BaseURLPicker } from 'app/components/BasicPickers/BaseURLPicker';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nconst url = '/api/odata/v4/InstrumentCatFilter';\r\nexport const initInstrumentCatData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return Promise.resolve([]);\r\n }\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: new Condition>(\r\n 'Id',\r\n ODataOperators.Equals,\r\n initval,\r\n ).toString(),\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\n\r\nexport const InstrumentCatFilter = (props: IFilterComponentProps) => {\r\n const handleChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n","import { UserMultiPicker } from 'app/components/pickers/AutocompletePickers/UserMultiPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\n\r\nexport const UserAssetContactMultiFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default UserAssetContactMultiFilter;\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { VariantType } from 'notistack';\r\nimport { IResponseType } from 'types/ResponseType';\r\n\r\nexport const GetResponseMessages = (\r\n response,\r\n infoText: string,\r\n): IResponseType => {\r\n let messages: IResponseType = {\r\n SuccessMessages: [],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n if (response.SuccessMessages && response.SuccessMessages.length > 0) {\r\n response.SuccessMessages.forEach(element => {\r\n messages.SuccessMessages.push(element);\r\n });\r\n }\r\n if (response.ErrorMessages && response.ErrorMessages.length > 0) {\r\n response.ErrorMessages.forEach(element => {\r\n messages.ErrorMessages.push(element);\r\n });\r\n }\r\n if (response.WarningMessages && response.WarningMessages.length > 0) {\r\n response.WarningMessages.forEach(element => {\r\n messages.WarningMessages.push(element);\r\n });\r\n }\r\n if (\r\n messages.SuccessMessages.length === 0 &&\r\n response.ErrorMessages.length === 0 &&\r\n response.WarningMessages.length === 0\r\n ) {\r\n messages.SuccessMessages = [infoText];\r\n }\r\n return messages;\r\n};\r\n\r\nconst GetMessagesArray = (response: IResponseType) => {\r\n const res: INotification[] = [];\r\n if (response.ErrorMessages.length > 0) {\r\n response.ErrorMessages.forEach(errmsg =>\r\n res.push({\r\n variant: 'error',\r\n message: errmsg,\r\n }),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n response.SuccessMessages.forEach(sccmsg =>\r\n res.push({\r\n variant: 'success',\r\n message: sccmsg,\r\n }),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n response.WarningMessages.forEach(wrnmsg =>\r\n res.push({\r\n variant: 'warning',\r\n message: wrnmsg,\r\n }),\r\n );\r\n }\r\n return res;\r\n};\r\n\r\nexport const DoAction1 = (\r\n f: (item: Model) => Promise,\r\n item: Model,\r\n t: TFunction,\r\n): Promise => {\r\n return new Promise((resolve, reject) => {\r\n return f(item)\r\n .then(response => {\r\n const messages: IResponseType = GetResponseMessages(\r\n response,\r\n t(translations.Success) as string,\r\n );\r\n resolve(messages);\r\n })\r\n .catch(error => {\r\n console.log('status error', error);\r\n let err = t(translations.Failed) as string;\r\n reject(err);\r\n });\r\n });\r\n};\r\n\r\nexport interface INotification {\r\n variant?: VariantType;\r\n message: string;\r\n}\r\n\r\nexport const DoAction = async (\r\n f: (item: Model) => Promise,\r\n item: Model,\r\n t: TFunction,\r\n handleSubmitCallResult: (values: INotification[]) => void,\r\n) => {\r\n try {\r\n const response = await DoAction1(f, item, t);\r\n handleSubmitCallResult(GetMessagesArray(response));\r\n } catch (error) {\r\n handleSubmitCallResult([\r\n {\r\n variant: 'error',\r\n message: error as string,\r\n },\r\n ]);\r\n }\r\n};\r\n\r\nexport const insertUserAD = (item: { Name: string }) => {\r\n const params = { Id: -1, Name: item.Name };\r\n return httpClient.post(`/api/odata/v4/UsersADImport`, params);\r\n};\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { PeriodTypes } from 'app/components/DatePeriods';\r\n\r\nexport interface UpdateModel {\r\n Async: boolean;\r\n Recalculate: boolean;\r\n Item: {\r\n ServiceGroupsCsv: string;\r\n UserGroupsCsv?: string;\r\n PeriodType?: PeriodTypes;\r\n Start: string;\r\n End: string;\r\n Remarks: string;\r\n BudgetIds: number[];\r\n BudgetIncluded?: boolean;\r\n invoiceBy?: number;\r\n CoreInvoiceBy: string;\r\n InvoiceCreatedBy: string;\r\n InvoiceVat: string;\r\n FundingTypeId?: number;\r\n CoreBy: number;\r\n ShowZeroAmountInvoices?: boolean;\r\n ShowInvoicePartialEvents: boolean;\r\n };\r\n}\r\nexport class BillingPreviewApi {\r\n FormView1_UpdateItem = (item: UpdateModel) => {\r\n return httpClient.post(`/api/odata/v4/BillingPreview`, item);\r\n };\r\n}\r\n","import { CellProps, Renderer } from 'react-table';\r\nimport { AlignRight } from '../AlignRight';\r\n\r\nconst PercentageRenderer: Renderer>> = ({\r\n value,\r\n}: {\r\n value: number | null;\r\n}) => (value === null ? null : {value?.toFixed(2)} %);\r\n\r\nexport default PercentageRenderer;\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.labelPrint || initialState;\r\n\r\nexport const selectLabelPrint = createSelector([selectSlice], state => state);\r\n","import { CellProps, Renderer } from 'react-table';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nconst DateTimeRenderer: Renderer>> = ({\r\n value,\r\n}) => <>{dateUtils.shortDateTimeFormat(value)};\r\nexport default DateTimeRenderer;\r\n","import { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { Link as MuiLink, styled } from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useArticlesSlice } from 'app/pages/ArticlesPage/slice';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nconst TruncatedLabel = styled('span')({\r\n width: '30ch',\r\n display: 'inline-block',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n});\r\n\r\nexport const ArticleLink = (props: {\r\n value?: IArticleDto;\r\n Id?: number;\r\n externalId?: string;\r\n externalIdSource?: string;\r\n children: React.ReactNode;\r\n title?: string;\r\n useSidePanel?: boolean;\r\n openPanelWithCover?: (state: SidePanelOpenState) => void;\r\n}) => {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useArticlesSlice();\r\n const openArticle = useOpenArticlePopUp();\r\n const open = () => {\r\n if (props.Id === 0) {\r\n dispatch(actions.clearArticleDetails());\r\n }\r\n openArticle(\r\n {\r\n value: props.value,\r\n Id: props.Id,\r\n externalId: props.externalId,\r\n externalIdSource: props.externalIdSource,\r\n useSidePanel: props.useSidePanel,\r\n },\r\n props.openPanelWithCover,\r\n );\r\n };\r\n return (\r\n \r\n \r\n open()}\r\n color=\"textPrimary\"\r\n >\r\n {props.children}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const useOpenArticlePopUp = () => {\r\n const { openPanel } = useSidePanelState();\r\n return React.useCallback(\r\n (\r\n props: {\r\n value?: IArticleDto;\r\n Id?: number;\r\n externalId?: string;\r\n externalIdSource?: string;\r\n useSidePanel?: boolean;\r\n },\r\n openPanelWithCover?: (state: SidePanelOpenState) => void,\r\n ) => {\r\n const panelState = {\r\n renderPageType: RenderPageType.Article,\r\n renderPageProps: props,\r\n expanded: false,\r\n useSidePanel: props.useSidePanel,\r\n isCover: props.useSidePanel,\r\n } as SidePanelOpenState;\r\n if (!!openPanelWithCover) {\r\n openPanelWithCover(panelState);\r\n } else {\r\n openPanel({\r\n renderPageType: RenderPageType.Article,\r\n renderPageProps: props,\r\n expanded: false,\r\n useSidePanel: false,\r\n isCover: false,\r\n } as SidePanelOpenState);\r\n }\r\n },\r\n [openPanel],\r\n );\r\n};\r\n","export enum DeatilsOperations {\r\n add,\r\n edit,\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.internalIdLogin || initialState;\r\n\r\nexport const selectInternalIdLogin = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\nexport const selectInternalIdLoginUserId = createSelector(\r\n [selectInternalIdLogin],\r\n state => state.identity?.Id,\r\n);\r\nexport const selectInternalIdLoginUserName = createSelector(\r\n [selectInternalIdLogin],\r\n state => state.identity?.Name,\r\n);\r\nexport const selectLoginType = createSelector(\r\n [selectSlice],\r\n state => state.identity?.LoginType,\r\n);\r\n","/**\r\n *\r\n * CustomPickerFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { CustomPicker } from 'app/components/pickers/CustomPicker';\r\n\r\nexport interface CustomPickerFilterProps extends IFilterComponentProps {\r\n disabled?: boolean;\r\n placeholder?: string;\r\n}\r\nexport function CustomPickerFilter(props: CustomPickerFilterProps) {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n []}\r\n isOpen={props.open}\r\n onChange={handleOnChange}\r\n size=\"small\"\r\n placeholder={\r\n props.placeholder !== undefined\r\n ? props.placeholder\r\n : t(translations.AllValues)\r\n }\r\n ariaLabel={props.label}\r\n id={props.id}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n );\r\n}\r\nexport default CustomPickerFilter;\r\n","/**\r\n *\r\n * CustomPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\n\r\nexport interface CustomPickerProps\r\n extends Omit>, 'loadData'> {\r\n disabled?: boolean;\r\n}\r\nexport const initCustomPicker = (initval: string | undefined) => {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n};\r\nexport function CustomPicker(props: CustomPickerProps) {\r\n const loadData = () => {\r\n const options =\r\n props.customData !== undefined\r\n ? ((props.customData as unknown) as Entity[])\r\n : ([] as Entity[]);\r\n return Promise.resolve[]>(options);\r\n };\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.publicAsset || initialState;\r\n\r\nexport const selectPublicAsset = createSelector([selectSlice], state => state);\r\n\r\nexport const selectPublicAssetProcessing = createSelector(\r\n [selectPublicAsset],\r\n state => state.processing,\r\n);\r\n\r\nexport const selectSelectedUnitItem = createSelector(\r\n [selectPublicAsset],\r\n state => state.data,\r\n);\r\nexport const selectSelectedUnits = createSelector(\r\n [selectPublicAsset],\r\n state => state.selectedData,\r\n);\r\nexport const selectSelectedUnitSearch = createSelector(\r\n [selectPublicAsset],\r\n state => state.dataSearch,\r\n);\r\nexport const selectAssetPublicFilter = createSelector(\r\n [selectPublicAsset],\r\n state => state.filters,\r\n);\r\nexport const selectMenuOpen = createSelector(\r\n [selectPublicAsset],\r\n state => state.menuOpen,\r\n);\r\nexport const selectGlobalSearchOpen = createSelector(\r\n [selectPublicAsset],\r\n state => state.globalSearchOpen,\r\n);\r\n","/**\r\n *\r\n * ServiceTypeFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ServiceTypePicker } from 'app/components/pickers/AutocompletePickers/ServiceTypePicker';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const ServiceTypeFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n additionalItem={props.additionalItem as Entity | undefined}\r\n size=\"small\"\r\n ariaLabel={props.label}\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default ServiceTypeFilter;\r\n","import { Entity } from 'types/common';\r\nimport { httpClient } from './HttpClient';\r\nimport { EmailTypeUnion } from './odata/generated/enums/EmailType';\r\nconst url = '/api/odata/v4/email';\r\nexport const EmailApi = {\r\n SendEmail: ({ Files, Bcc, Cc, To, ...data }: IEmail) => {\r\n const form = new FormData();\r\n Object.keys(data).forEach(k => {\r\n form.append(k, data[k]);\r\n });\r\n form.append('Bcc', Bcc.map(v => v.Id) as any);\r\n form.append('Cc', Cc.map(v => v.Id) as any);\r\n form.append('To', To.map(v => v.Id) as any);\r\n\r\n for (let i = 0; !!Files && i < Files?.length; i++) {\r\n let item = Files?.item(i);\r\n if (!!item) {\r\n form.append('file' + i, item);\r\n }\r\n }\r\n return httpClient.post(url, form).then(v => v.value);\r\n },\r\n};\r\n\r\nexport interface IEmail {\r\n Id?: number;\r\n Type: EmailTypeUnion;\r\n To: Entity[];\r\n ExtraTo?: string;\r\n Cc: Entity[];\r\n ExtraCc?: string;\r\n Bcc: Entity[];\r\n ExtraBcc?: string;\r\n Subject: string;\r\n Body?: string;\r\n Files?: FileList;\r\n SaveToLog: boolean;\r\n SaveAsTemlate?: boolean;\r\n ServiceGroup?: number;\r\n}\r\n","import { EmailApi, IEmail } from 'api/EmailApi';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { translations } from 'locales/translations';\r\nimport { useCallback } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nexport const useSendMail = () => {\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const { t } = useTranslation();\r\n return useCallback(\r\n (email: IEmail) => {\r\n try {\r\n EmailApi.SendEmail(email)\r\n .then(v => {\r\n //console.log(v);\r\n dispatch(\r\n actions.addNotification({\r\n variant: v ? 'success' : 'error',\r\n message: t(\r\n v\r\n ? translations.msg_EmailSent\r\n : translations.msg_EmailSendingFailed,\r\n ),\r\n }),\r\n );\r\n })\r\n .catch(e => {\r\n //console.log(e);\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: e,\r\n }),\r\n );\r\n });\r\n } catch (e) {\r\n //console.log(e);\r\n console.error(e);\r\n }\r\n },\r\n [actions, dispatch, t],\r\n );\r\n};\r\n","/**\r\n *\r\n * UserDisciplineFilter\r\n *\r\n */\r\nimport { UserDisciplinePicker } from 'app/components/pickers/AutocompletePickers/UserDisciplinePicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const UserDisciplineFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n onChange={handleOnChange}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n size=\"small\"\r\n ariaLabel={props.label}\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default UserDisciplineFilter;\r\n","import { ISavedViewDto } from 'api/odata/generated/entities/ISavedViewDto';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport * as React from 'react';\r\nimport { savedViewsApi as api } from 'api/savedViewsApi';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useSavedViewSlice } from '../SavedViewPage/slice';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Entity } from 'types/common';\r\nimport { Roles } from 'app/slice/types';\r\nimport { ListItem, MenuItem } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { SavedViewDetailsProps } from '../SavedViewPage/Details';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { translations } from 'locales/translations';\r\nimport { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n selectUpdateSavedViewCompleted,\r\n selectUpdateSavedViewHasError,\r\n} from '../SavedViewPage/slice/selectors';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface AddToListsProps {\r\n rows: TRow[];\r\n getEquipments: (rows: TRow[]) => Entity[];\r\n getAssets: (rows: TRow[]) => Promise[]>;\r\n useSidePanel?: boolean;\r\n}\r\n\r\nexport function AddToLists({\r\n rows,\r\n getEquipments,\r\n getAssets,\r\n useSidePanel,\r\n}: AddToListsProps) {\r\n const { t } = useTranslation();\r\n const user = useSelector(selectAuthenticatedUser);\r\n const { openPanel } = useSidePanelState();\r\n const isAdmin = React.useMemo(() => {\r\n return (\r\n user !== undefined &&\r\n (user.Roles.indexOf(Roles.Administrators) >= 0 ||\r\n user.Roles.indexOf(Roles.GroupAdministrators) >= 0 ||\r\n user.Roles.indexOf(Roles.LabTech) >= 0)\r\n );\r\n }, [user]);\r\n const dispatch = useDispatch();\r\n const [myViews, setMyViews] = React.useState([]);\r\n const savedActions = useSavedViewSlice();\r\n const [, setLoadingCompleted] = React.useState(false);\r\n const requestUpdateCompleted = useSelector(selectUpdateSavedViewCompleted);\r\n const hasUpdateError = useSelector(selectUpdateSavedViewHasError);\r\n const [input, setInnput] = React.useState();\r\n const options = myViews.filter((item, index) =>\r\n item.Name.toLowerCase().includes((input || '').toLowerCase()),\r\n );\r\n\r\n useEffectOnMount(() => {\r\n api\r\n .getMySavedViews({\r\n user: user,\r\n serviceGroups: undefined,\r\n isAdmin: isAdmin,\r\n onlyMyView: true,\r\n })\r\n .then(response => {\r\n setMyViews(() => {\r\n return response || [];\r\n });\r\n setLoadingCompleted(true);\r\n });\r\n return () => {};\r\n });\r\n const openDetailsList = React.useCallback(\r\n (id?: number) => {\r\n let params = {\r\n id: id,\r\n useSidePanel: true,\r\n eid: getEquipments(rows)\r\n .map(f => f.Id)\r\n .join(','),\r\n } as SavedViewDetailsProps;\r\n openPanel({\r\n renderPageType: RenderPageType.SavedViewDetails,\r\n renderPageProps: params,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [getEquipments, openPanel, rows, useSidePanel],\r\n );\r\n const updateAssets = React.useCallback(\r\n (id: number) => {\r\n let view = myViews.filter(f => f.Id === id)[0];\r\n getAssets(rows).then(assets => {\r\n dispatch(\r\n savedActions.actions.updateViewAssets({\r\n assets: assets,\r\n view: view,\r\n }),\r\n );\r\n });\r\n },\r\n [dispatch, getAssets, myViews, rows, savedActions.actions],\r\n );\r\n React.useEffect(() => {\r\n let active = requestUpdateCompleted && !hasUpdateError;\r\n if (active) {\r\n dispatch(savedActions.actions.resetUpdateSavedViewState());\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [dispatch, hasUpdateError, requestUpdateCompleted, savedActions.actions]);\r\n return (\r\n [\r\n \r\n \r\n }\r\n value={input || ''}\r\n aria-label={t(translations.SearchFilter)}\r\n inputProps={{ 'aria-label': t(translations.SearchFilter) }}\r\n onChange={e => setInnput(e.target.value)}\r\n autoFocus\r\n fullWidth\r\n />\r\n ,\r\n \r\n }\r\n onClick={() => {\r\n openDetailsList();\r\n onClose();\r\n }}\r\n >\r\n {t(translations.CreateList)}\r\n \r\n ,\r\n ...options.map(s => (\r\n {\r\n updateAssets(s.Id);\r\n onClose();\r\n }}\r\n >\r\n {s.Name}\r\n \r\n )),\r\n ]}\r\n menuProps={{\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n },\r\n transformOrigin: {\r\n vertical: 'top',\r\n horizontal: 'left',\r\n },\r\n getContentAnchorEl: null,\r\n }}\r\n addChevron\r\n >\r\n {t(translations.AddToList)}\r\n \r\n );\r\n}\r\n","import { List, ListItem } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface ListRendererProps {\r\n value: string[];\r\n localized?: boolean;\r\n notLocalizedValue?: string[];\r\n row?: any;\r\n}\r\n\r\nexport const ListRenderer = (props: ListRendererProps) => {\r\n const { value, localized, notLocalizedValue } = props;\r\n const { t } = useTranslation();\r\n const onlyone =\r\n (value.length === 1 &&\r\n (notLocalizedValue === undefined || notLocalizedValue.length === 0)) ||\r\n (value.length === 0 &&\r\n notLocalizedValue !== undefined &&\r\n notLocalizedValue.length === 1);\r\n\r\n const title = (\r\n \r\n {value.length > 0 ? (\r\n <>{localized ? (t(value[0].trim()) as string) : value[0].trim()}\r\n ) : notLocalizedValue !== undefined && notLocalizedValue.length > 0 ? (\r\n <>{notLocalizedValue[0].trim()}\r\n ) : (\r\n <>\r\n )}\r\n \r\n );\r\n\r\n const tooltipTitle = (\r\n \r\n \r\n {value.map((item, index) => {\r\n return (\r\n \r\n {localized ? (t(item.trim()) as string) : item.trim()}\r\n \r\n );\r\n })}\r\n {notLocalizedValue !== undefined\r\n ? notLocalizedValue.map((item, index) => {\r\n return {item.trim()};\r\n })\r\n : ''}\r\n \r\n \r\n );\r\n\r\n const listOfItems =\r\n value.length > 0 ||\r\n (notLocalizedValue !== undefined && notLocalizedValue.length > 0) ? (\r\n onlyone ? (\r\n <>{title}\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 return listOfItems;\r\n};\r\n","/**\r\n *\r\n * AssetCatPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { ReservationStatus } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { selectReservationStatuses } from 'app/slice/selectors';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface ReservationStatusProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const initReservationStatusData = (t: TFunction) => (\r\n initialValue: string | undefined,\r\n) => {\r\n const id = initialValue === undefined ? NaN : parseInt(initialValue);\r\n if (isNaN(id)) {\r\n return Promise.resolve([] as Entity[]);\r\n } else {\r\n return Promise.resolve([\r\n {\r\n Id: id,\r\n Name: t(translations[ReservationStatus[id]]),\r\n },\r\n ]);\r\n }\r\n};\r\n\r\nexport function ReservationStatusPicker(props: ReservationStatusProps) {\r\n const { t } = useTranslation();\r\n const options = useSelector(state => selectReservationStatuses(state, t));\r\n const getOptions = React.useCallback(() => options, [options]);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n RoomPicker,\r\n RoomsUrl,\r\n} from '../pickers/AutocompletePickers/RoomPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { IRoomDto } from 'api/odata/generated/entities/IRoomDto';\r\n\r\nexport const FormRoomPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps & { variant?: 'standard' | 'filled' | 'outlined' } & {\r\n urlType?: RoomsUrl;\r\n withoutServiceGroups?: boolean;\r\n }) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n helpers.setValue(value, true)}\r\n onBlur={field?.onBlur}\r\n value={field.value as IRoomDto}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n disabled={props.disabled}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n variant={props.variant}\r\n urlType={props.urlType}\r\n withoutServiceGroups={props.withoutServiceGroups}\r\n />\r\n \r\n );\r\n};\r\n","import { Dialog } from '@material-ui/core';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\n\r\nexport interface PopupImportExportDialogProps {\r\n open: boolean;\r\n content: React.ReactNode;\r\n}\r\nexport function PopupImportExportDialog(props: PopupImportExportDialogProps) {\r\n return (\r\n \r\n \r\n {props.content}\r\n \r\n \r\n );\r\n}\r\n","export enum AutomaticAssetImportNaming {\r\n NA = 0,\r\n ByAssetCatModelNumber = 1,\r\n}\r\n","import { ScreensId } from 'enums/ConfigurableTypes';\r\nimport * as Excel from 'exceljs';\r\nimport { ValueType } from 'exceljs';\r\nimport Papa from 'papaparse';\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { ExportImportActions } from '../Actions';\r\nimport { ImportAdditionalData, ImportColumn } from '../Actions/Types';\r\nimport { AutomaticAssetImportNaming } from '../Components/Types';\r\n\r\nexport class CImportData {\r\n private _ScreenId!: ScreensId;\r\n private needReloadTemplateColumns!: boolean;\r\n private _ImportAssetImageFiles: boolean = false;\r\n private _AutoGenerateAssetNamesBasedOn: Entity | null = {\r\n Id: AutomaticAssetImportNaming.NA as number,\r\n Name: 'N/A',\r\n };\r\n private _UpdateQRCode: boolean = false;\r\n private _ImportAdditionalData: ImportAdditionalData =\r\n ImportAdditionalData.none;\r\n public TemplateColumns: Entity[] | undefined;\r\n public File: File | undefined;\r\n public Images: File[] | undefined;\r\n public RowCount: number | undefined;\r\n public Header: ImportColumn[] | undefined;\r\n public Table: string[][] | undefined;\r\n public AddOnly: boolean | undefined = false;\r\n book: Excel.Workbook;\r\n constructor() {\r\n this.book = new Excel.Workbook();\r\n }\r\n public get ScreenId() {\r\n return this._ScreenId;\r\n }\r\n public set ScreenId(screenId: ScreensId) {\r\n if (this._ScreenId !== screenId) {\r\n this.needReloadTemplateColumns = true;\r\n }\r\n this._ScreenId = screenId;\r\n }\r\n public get ImportAssetImageFiles() {\r\n return this._ImportAssetImageFiles;\r\n }\r\n public set ImportAssetImageFiles(value: boolean) {\r\n this._ImportAssetImageFiles = value;\r\n }\r\n public get AutoGenerateAssetNamesBasedOn() {\r\n return this._AutoGenerateAssetNamesBasedOn;\r\n }\r\n public set AutoGenerateAssetNamesBasedOn(value: Entity | null) {\r\n this._AutoGenerateAssetNamesBasedOn = value;\r\n }\r\n public get UpdateQRCode() {\r\n return this._UpdateQRCode;\r\n }\r\n public set UpdateQRCode(value: boolean) {\r\n this._UpdateQRCode = value;\r\n }\r\n public get ImportAdditionalData() {\r\n return this._ImportAdditionalData;\r\n }\r\n public set ImportAdditionalData(value: ImportAdditionalData) {\r\n this._ImportAdditionalData = value;\r\n }\r\n public ColumnCount() {\r\n var count: number = 0;\r\n if (this.Header !== undefined) {\r\n this.Header.forEach(c => {\r\n if (c.Include) {\r\n count++;\r\n }\r\n });\r\n }\r\n return count;\r\n }\r\n private Clear() {\r\n this.AddOnly = false;\r\n this.RowCount = undefined;\r\n this.Header = undefined;\r\n this.Table = undefined;\r\n }\r\n Init(File: File) {\r\n this.File = File;\r\n this.Clear();\r\n }\r\n ClearImages() {\r\n this.Images = undefined;\r\n }\r\n AddImages(Files: File[]) {\r\n if (this.Images === undefined) {\r\n this.Images = Files;\r\n } else {\r\n for (const f of Files) {\r\n const ff = this.Images.find(v => v.name === f.name);\r\n if (ff === undefined) {\r\n this.Images.push(f);\r\n }\r\n }\r\n }\r\n }\r\n RemoveImage(name: string) {\r\n if (this.Images !== undefined) {\r\n const fi = this.Images.findIndex(v => v.name === name);\r\n if (fi >= 0) {\r\n this.Images.splice(fi, 1);\r\n }\r\n }\r\n }\r\n LoadTemplateColumns(): Promise {\r\n if (\r\n this.needReloadTemplateColumns ||\r\n this.TemplateColumns === undefined ||\r\n this.TemplateColumns.length === 0\r\n ) {\r\n if (this.ScreenId !== undefined) {\r\n this.needReloadTemplateColumns = false;\r\n return ExportImportActions.TemplateColumns(\r\n this.ScreenId,\r\n this.ImportAdditionalData,\r\n );\r\n } else {\r\n return Promise.resolve();\r\n }\r\n } else {\r\n return Promise.resolve();\r\n }\r\n }\r\n public InitHeaderByTemplate() {\r\n if (this.TemplateColumns !== undefined && this.TemplateColumns.length > 0) {\r\n this.Header?.forEach((hvalue, cn) => {\r\n const v = this.TemplateColumns?.find(tvalue => {\r\n return tvalue.Name === hvalue.ExcelName;\r\n });\r\n if (this.Header !== undefined && v !== undefined) {\r\n this.Header[cn].Name = v.Id;\r\n }\r\n });\r\n }\r\n }\r\n SetTemplateColumns(values: Entity[] | undefined) {\r\n if (values !== undefined) {\r\n this.TemplateColumns = values.map(value => {\r\n return {\r\n Id: value.Id,\r\n //Name: value.hasCustomName ? value.CustomName : value.DisplayName,\r\n Name: value.Name,\r\n };\r\n });\r\n this.InitHeaderByTemplate();\r\n }\r\n }\r\n private GetCellData(cell: Excel.Cell): string {\r\n let value: any;\r\n if (cell.value === undefined) {\r\n return '';\r\n } else {\r\n value = cell.value;\r\n }\r\n switch (cell.type) {\r\n case ValueType.Null:\r\n return '';\r\n case ValueType.Number:\r\n case ValueType.String:\r\n case ValueType.Boolean:\r\n case ValueType.SharedString:\r\n case ValueType.Formula:\r\n case ValueType.RichText:\r\n return value.toString();\r\n case ValueType.Date:\r\n const d = dateUtils.shortDateTimeFormat(value);\r\n return d !== null ? d : '';\r\n case ValueType.Hyperlink:\r\n return value.text;\r\n case ValueType.Error:\r\n return '';\r\n default:\r\n return '';\r\n }\r\n }\r\n LoadXlsx(): Promise {\r\n if (this.File !== undefined) {\r\n var reader: any;\r\n reader = this.book.xlsx;\r\n return reader\r\n .load(this.File)\r\n .then(() => {\r\n const ws = this.book.getWorksheet(1);\r\n this.RowCount = ws.rowCount - 1;\r\n const row1 = ws.getRow(1);\r\n this.Header = [];\r\n row1.eachCell((cell, cn) => {\r\n this.Header?.push({\r\n Include: true,\r\n ExcelName: cell.value?.toString(),\r\n Name: undefined,\r\n });\r\n });\r\n if (this.Header !== undefined && this.Header.length) {\r\n this.InitHeaderByTemplate();\r\n const rc = ws.rowCount < 7 ? ws.rowCount + 1 : 7;\r\n this.Table = [];\r\n for (let i = 2; i < rc; i++) {\r\n const row = ws.getRow(i);\r\n // init tr\r\n let tr: string[] = this.Header.map(() => '');\r\n row.eachCell((cell, cn) => {\r\n const s = this.GetCellData(cell);\r\n tr[cn - 1] = s !== undefined ? s : '';\r\n });\r\n this.Table?.push(tr);\r\n }\r\n return true;\r\n }\r\n })\r\n .catch(err => {\r\n console.log(err.message);\r\n });\r\n } else {\r\n this.Clear();\r\n return Promise.resolve();\r\n }\r\n }\r\n\r\n LoadCsv(): Promise {\r\n if (this.File !== undefined) {\r\n const file = this.File;\r\n return new Promise((resolve, reject) => {\r\n Papa.parse(file, {\r\n header: true,\r\n dynamicTyping: true,\r\n complete: results => {\r\n this.RowCount = results.data.length - 1;\r\n const row1 = results.meta.fields;\r\n this.Header = [];\r\n row1?.forEach((cell, cn) => {\r\n this.Header?.push({\r\n Include: true,\r\n ExcelName: cell,\r\n Name: undefined,\r\n });\r\n });\r\n this.InitHeaderByTemplate();\r\n const rc = this.RowCount < 6 ? this.RowCount : 5;\r\n this.Table = [];\r\n for (let i = 0; i < rc; i++) {\r\n const obj = results.data[i] as {};\r\n if (obj !== undefined) {\r\n const d = Object.keys(obj).map(key => {\r\n const v = obj[key];\r\n if (typeof v === 'boolean') return v.toString();\r\n else return v;\r\n });\r\n this.Table?.push(d);\r\n }\r\n }\r\n resolve(true);\r\n },\r\n error: error => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n } else {\r\n this.Clear();\r\n return Promise.resolve();\r\n }\r\n }\r\n\r\n LoadExcelfile(): Promise {\r\n if (this.File !== undefined) {\r\n const ext = this.File.name.split('.').pop();\r\n switch (ext) {\r\n case 'xlsx':\r\n return this.LoadXlsx();\r\n case 'csv':\r\n return this.LoadCsv();\r\n default:\r\n this.Clear();\r\n return Promise.resolve();\r\n }\r\n } else {\r\n this.Clear();\r\n return Promise.resolve();\r\n }\r\n }\r\n}\r\nexport const ImprotData = new CImportData();\r\n","import * as React from 'react';\r\nimport { FieldHookConfig } from 'formik';\r\nimport { useDropzone } from 'react-dropzone';\r\nimport { styled } from '@material-ui/core';\r\n//import fileDownload from 'js-file-download';\r\nimport { TextFieldProps } from 'app/components/TextField';\r\n//import { Button } from 'app/components/BasicButtons/Button';\r\nimport { ImprotData } from '../Data';\r\n\r\nexport interface SelectFileProps {\r\n accept: any;\r\n downloadFileName?: string;\r\n filesPlaceholder: React.ReactNode;\r\n selectFileHandler: (value: boolean) => void;\r\n}\r\n\r\n/**\r\n * Multiline text field with and option to update value by dropping a file\r\n * @param param0\r\n * @returns\r\n */\r\nexport const SelectFile = ({\r\n label,\r\n onBlur,\r\n value,\r\n name,\r\n error,\r\n helperText,\r\n accept,\r\n downloadFileName,\r\n filesPlaceholder,\r\n selectFileHandler,\r\n ...props\r\n}: FieldHookConfig & TextFieldProps & SelectFileProps) => {\r\n const onDrop = React.useCallback(\r\n (acceptedFiles: File[]) => {\r\n // Do something with the files\r\n const file = acceptedFiles[0];\r\n ImprotData.Init(file);\r\n selectFileHandler(file !== undefined);\r\n },\r\n [selectFileHandler],\r\n );\r\n\r\n const { acceptedFiles, getRootProps, getInputProps } = useDropzone({\r\n onDrop,\r\n maxFiles: 1,\r\n maxSize: 1000000,\r\n accept: {\r\n 'application/imp': [accept],\r\n },\r\n });\r\n\r\n const files = acceptedFiles.map(file => (\r\n
  • \r\n {file.name} - {file.size} bytes\r\n
  • \r\n ));\r\n\r\n /*const handleDownloadClick = () => {\r\n if (downloadFileName !== undefined && fileContent !== null) {\r\n fileDownload(fileContent, downloadFileName);\r\n }\r\n };*/\r\n\r\n return (\r\n <>\r\n \r\n \r\n

    {filesPlaceholder}

    \r\n
    \r\n \r\n \r\n );\r\n};\r\nconst StyledDropboxContainer = styled('div')(({ theme }) => ({\r\n flex: 1,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n padding: '20px',\r\n borderWidth: '2px',\r\n borderRadius: '2px',\r\n borderColor: theme.palette.common.grayBorders,\r\n borderStyle: 'dashed',\r\n backgroundColor: theme.palette.background.paper,\r\n color: '#bdbdbd',\r\n outline: 'none',\r\n transition: 'border .24s ease-in-out',\r\n}));\r\n","import * as React from 'react';\r\nimport { AutocompletePicker } from 'app/components/BasicPickers/AutocompletePicker';\r\n\r\nexport function TypePicker(props) {\r\n return (\r\n \r\n Promise.resolve(['.xlsx', '.csv'].map(s => ({ Id: s, Name: s })))\r\n }\r\n variant=\"filled\"\r\n fullWidth\r\n {...props}\r\n />\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { AutocompletePicker } from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { AutomaticAssetImportNaming } from './Types';\r\n\r\nexport function AutomaticAssetImportNamingPicker(props) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n return (\r\n \r\n Promise.resolve([\r\n { Id: AutomaticAssetImportNaming.NA as number, Name: 'N/A' },\r\n {\r\n Id: AutomaticAssetImportNaming.ByAssetCatModelNumber as number,\r\n Name: t(translations.ByAssetCatModelNumber),\r\n },\r\n ])\r\n }\r\n variant=\"filled\"\r\n fullWidth\r\n {...props}\r\n />\r\n );\r\n}\r\n","import { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport './styles.css';\r\nexport interface FileSize {\r\n size: number;\r\n name: string;\r\n}\r\nexport interface Image {\r\n name: string;\r\n path: string;\r\n size: FileSize;\r\n}\r\nexport interface ImageListProps {\r\n data: Image[] | undefined;\r\n removeImage: (name: string) => void;\r\n}\r\nexport const ImageList = (props: ImageListProps) => {\r\n const { t } = useTranslation();\r\n const data: Image[] = props.data !== undefined ? props.data : [];\r\n return (\r\n <>\r\n {data.length > 0 ? (\r\n \r\n {data.map(value => (\r\n <>\r\n \r\n {\r\n props.removeImage(value.name);\r\n }}\r\n size=\"small\"\r\n >\r\n \r\n \r\n {value.name +\r\n ' - ' +\r\n value.size.size.toString() +\r\n ' ' +\r\n value.size.name}\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","import * as React from 'react';\r\nimport { FieldHookConfig } from 'formik';\r\nimport { useDropzone } from 'react-dropzone';\r\nimport { styled } from '@material-ui/core';\r\nimport { TextFieldProps } from 'app/components/TextField';\r\nimport { ImprotData } from '../Data';\r\nimport { ImageList, Image, FileSize } from './ImageList';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ExportImportActions } from '../Actions';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport fileDownload from 'js-file-download';\r\nimport { AxiosError } from 'axios';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { selectglobalSettings } from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\n\r\nexport interface SelectImageFilesProps {\r\n accept: any;\r\n filesPlaceholder: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Multiline text field with and option to update value by dropping a file\r\n * @param param0\r\n * @returns\r\n */\r\nconst getFileSize = (size): FileSize => {\r\n var string;\r\n if (size >= 1024 * 1024 * 1024 * 1024) {\r\n size = size / (1024 * 1024 * 1024 * 1024);\r\n string = 'TiB';\r\n } else if (size >= 1024 * 1024 * 1024) {\r\n size = size / (1024 * 1024 * 1024);\r\n string = 'GiB';\r\n } else if (size >= 1024 * 1024) {\r\n size = size / (1024 * 1024);\r\n string = 'MiB';\r\n } else if (size >= 1024) {\r\n size = size / 1024;\r\n string = 'KiB';\r\n } else {\r\n string = 'b';\r\n }\r\n return { size: Math.round(size), name: string };\r\n};\r\n\r\nexport const SelectImageFiles = ({\r\n label,\r\n onBlur,\r\n value,\r\n name,\r\n error,\r\n helperText,\r\n accept,\r\n filesPlaceholder,\r\n ...props\r\n}: FieldHookConfig & TextFieldProps & SelectImageFilesProps) => {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const settings = useSelector(selectglobalSettings);\r\n const [importing, setImporting] = React.useState(false);\r\n const [paths, setPaths] = React.useState();\r\n const MaximumImagesPerOneUpload =\r\n tryParseInt(\r\n settings?.GetString(AllowedSettings.MaximumImagesPerOneUpload),\r\n ) ?? 10;\r\n const MaxImageSize =\r\n (tryParseInt(\r\n settings?.GetString(AllowedSettings.MaxLoadedAssetImageMbSize),\r\n ) ?? 1) *\r\n 1024 *\r\n 1024;\r\n const setImages = React.useCallback(() => {\r\n if (ImprotData.Images !== undefined) {\r\n setPaths(\r\n ImprotData.Images.map(file => {\r\n return {\r\n name: file.name,\r\n path: URL.createObjectURL(file),\r\n size: getFileSize(file.size),\r\n };\r\n }),\r\n );\r\n } else {\r\n setPaths(undefined);\r\n }\r\n }, []);\r\n React.useEffect(() => {\r\n setImages();\r\n }, [setImages]);\r\n const onDrop = React.useCallback(\r\n (acceptedFiles: File[]) => {\r\n ImprotData.AddImages(acceptedFiles);\r\n setImages();\r\n },\r\n [setImages],\r\n );\r\n const removeImage = React.useCallback(\r\n (name: string) => {\r\n ImprotData.RemoveImage(name);\r\n setImages();\r\n },\r\n [setImages],\r\n );\r\n\r\n const { getRootProps, getInputProps } = useDropzone({\r\n onDrop,\r\n maxFiles: MaximumImagesPerOneUpload,\r\n maxSize: MaxImageSize,\r\n accept: accept,\r\n });\r\n\r\n const importImages = React.useCallback(async () => {\r\n if (ImprotData.Images !== undefined) {\r\n setImporting(true);\r\n try {\r\n const res = await ExportImportActions.ImportImages(\r\n ImprotData.Images,\r\n ScreensId.MyAssets,\r\n );\r\n const cd = res.headers['content-disposition'];\r\n const filename =\r\n cd !== undefined\r\n ? cd.split('filename=')[1]\r\n : 'ExportForImport_Articles.xlsx';\r\n fileDownload(res.data, filename);\r\n ImprotData.ClearImages();\r\n setPaths(undefined);\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'success',\r\n message: 'Images loaded successfully !',\r\n }),\r\n );\r\n } catch (error) {\r\n if ((error as AxiosError).isAxiosError) {\r\n //var errorCode = (error as AxiosError).response?.status;\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: error as string,\r\n }),\r\n );\r\n }\r\n }\r\n setImporting(false);\r\n }\r\n }, [actions, dispatch]);\r\n\r\n return (\r\n <>\r\n
    \r\n {t(translations.RecommendationsOfLoadImages)}\r\n \r\n \r\n \r\n
    \r\n
    \r\n {t(translations.InformationToLoadImages)}\r\n \r\n \r\n \r\n
    \r\n \r\n \r\n

    {filesPlaceholder}

    \r\n
    \r\n \r\n \r\n \r\n {t(translations.LoadImages)}\r\n \r\n {\r\n ImprotData.ClearImages();\r\n setPaths(undefined);\r\n }}\r\n >\r\n {t(translations.ClearAll)}\r\n \r\n \r\n \r\n );\r\n};\r\nconst StyledDropboxContainer = styled('div')(({ theme }) => ({\r\n flex: 1,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n padding: '20px',\r\n borderWidth: '2px',\r\n borderRadius: '2px',\r\n borderColor: theme.palette.common.grayBorders,\r\n borderStyle: 'dashed',\r\n backgroundColor: theme.palette.background.paper,\r\n color: '#bdbdbd',\r\n outline: 'none',\r\n transition: 'border .24s ease-in-out',\r\n}));\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { H3 } from 'app/components/Typography';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport clsx from 'clsx';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { SelectFile } from './SelectFile';\r\nimport { TypePicker } from './TypePicker';\r\nimport { Check } from 'app/components/BasicInputs/Check';\r\nimport { ImprotData } from '../Data';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { AutomaticAssetImportNamingPicker } from './AutomaticAssetImportNamingPicker';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectAssetFieldSettings,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { AutomaticAssetNamings } from 'enums/enums';\r\nimport { SelectImageFiles } from './SelectImageFiles';\r\nimport { ImportAdditionalData } from '../Actions/Types';\r\nimport { AssetAttributes } from 'enums/AssetAttributes';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n titleContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(3),\r\n top: theme.spacing(3),\r\n color: theme.palette.grey[500],\r\n },\r\n container: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n boxcontainer: {\r\n display: 'flex',\r\n width: '100%',\r\n height: '100%',\r\n },\r\n selectFileBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginTop: '24px',\r\n },\r\n selectImageBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n infoBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginTop: '24px',\r\n padding: '10PX',\r\n backgroundColor: '#f0f9ff',\r\n },\r\n }),\r\n);\r\n\r\nexport interface PopupImportExportStep1Props {\r\n title: string;\r\n filetype: Entity | null;\r\n nextName: string;\r\n cancelName: string;\r\n ImportTenplateHandler: () => void;\r\n handleFileTypeChange: (value: Entity | null) => void;\r\n next: () => void;\r\n cancel: () => void;\r\n}\r\nexport function PopupImportExportStep1(props: PopupImportExportStep1Props) {\r\n const [filetype, setFiletype] = React.useState | null>(\r\n props.filetype,\r\n );\r\n const { t } = useTranslation();\r\n const [fileIsSelected, setFileIsSelected] = React.useState(false);\r\n const [importAssetImageFiles, setImportAssetImageFiles] = React.useState<\r\n boolean\r\n >(ImprotData.ImportAssetImageFiles);\r\n const classes = useStyles();\r\n const handleImportAssetImageFiles = React.useCallback((f: boolean) => {\r\n setImportAssetImageFiles(f);\r\n }, []);\r\n const handleFileTypeChange = React.useCallback(\r\n (value: Entity | null) => {\r\n setFiletype(value);\r\n props.handleFileTypeChange(value);\r\n },\r\n [props],\r\n );\r\n const selectFileHandler = React.useCallback((value: boolean) => {\r\n setFileIsSelected(value);\r\n }, []);\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n

    {props.title}

    \r\n
    \r\n \r\n \r\n {ImprotData.ScreenId === ScreensId.MyAssets &&\r\n ImprotData.ImportAdditionalData ===\r\n ImportAdditionalData.none && (\r\n \r\n )}\r\n {importAssetImageFiles === false && (\r\n <>\r\n \r\n \r\n {t(translations.BulkImportTitle)}\r\n \r\n \r\n }\r\n variant=\"white\"\r\n onClick={() => {\r\n props.ImportTenplateHandler();\r\n }}\r\n >\r\n {t(translations.GetTheTemplate)}\r\n \r\n \r\n \r\n )}\r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n {importAssetImageFiles === false && (\r\n \r\n \r\n \r\n {props.cancelName}\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\ninterface AssetPropertiesProps {\r\n ImportAssetImageFiles: (f: boolean) => void;\r\n}\r\nfunction AssetProperties(props: AssetPropertiesProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const [importAssetImageFiles, setImportAssetImageFiles] = React.useState<\r\n boolean\r\n >(ImprotData.ImportAssetImageFiles);\r\n const [\r\n autoGenerateAssetNamesBasedOn,\r\n setAutoGenerateAssetNamesBasedOn,\r\n ] = React.useState | null>(\r\n ImprotData.AutoGenerateAssetNamesBasedOn,\r\n );\r\n const [updateQRCode, setUpdateQRCode] = React.useState(\r\n ImprotData.UpdateQRCode,\r\n );\r\n const classes = useStyles();\r\n //const appSettings = useSelector(selectAppSettings);\r\n const app = useSelector(selectAssetFieldSettings);\r\n\r\n const showInternalCode = React.useMemo(\r\n () => app[AssetAttributes.InternalCode]?.Enabled === true,\r\n [app],\r\n );\r\n\r\n const settings = useSelector(selectglobalSettings);\r\n\r\n const ImportAssetAutoNaming = settings.GetString(\r\n AllowedSettings.AutomaticAssetNamings,\r\n );\r\n\r\n const handleImageChange = React.useCallback(\r\n event => {\r\n const value = event.target.checked;\r\n ImprotData.ImportAssetImageFiles = value;\r\n setImportAssetImageFiles(value);\r\n props.ImportAssetImageFiles(value);\r\n },\r\n [props],\r\n );\r\n const handleAutoNameingChange = React.useCallback(\r\n (value: Entity | null) => {\r\n ImprotData.AutoGenerateAssetNamesBasedOn = value;\r\n setAutoGenerateAssetNamesBasedOn(value);\r\n },\r\n [],\r\n );\r\n const handleUpdateQRCodeChange = React.useCallback(event => {\r\n const value = event.target.checked;\r\n ImprotData.UpdateQRCode = value;\r\n setUpdateQRCode(value);\r\n }, []);\r\n return (\r\n <>\r\n \r\n \r\n \r\n {t(translations.ImportAssetImageFiles)}\r\n \r\n {(ImportAssetAutoNaming === '' ||\r\n parseInt(ImportAssetAutoNaming) ===\r\n (AutomaticAssetNamings.No as number)) && (\r\n \r\n \r\n \r\n )}\r\n {showInternalCode && (\r\n \r\n \r\n {t(translations.ImportAssetsUpdateQRcodes)}\r\n \r\n \r\n \r\n \r\n )}\r\n {importAssetImageFiles && (\r\n {}} />\r\n )}\r\n \r\n \r\n );\r\n}\r\ninterface SelectFileBoxProps {\r\n handleFileTypeChange: (value: Entity | null) => void;\r\n selectFileHandler: (value: boolean) => void;\r\n fileType: Entity | null;\r\n}\r\nfunction SelectFileBox(props: SelectFileBoxProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const [filetype, setFiletype] = React.useState | null>(\r\n props.fileType,\r\n );\r\n const classes = useStyles();\r\n const downloadMime = undefined;\r\n const downloadFileExtension =\r\n downloadMime === undefined ? undefined : filetype;\r\n const downloadFileName =\r\n downloadFileExtension === undefined ? undefined : undefined;\r\n const handleChange = React.useCallback(\r\n (value: Entity | null) => {\r\n setFiletype(value);\r\n props.handleFileTypeChange(value);\r\n },\r\n [props],\r\n );\r\n const fh = React.useMemo((): React.ReactNode => {\r\n let s = t(translations.MaxFileSize);\r\n s = s.replace('{0}', '100');\r\n return (\r\n <>\r\n {t(translations.DragTheFilesOrBrowse)}\r\n
    {s}
    \r\n \r\n );\r\n }, [t]);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\ninterface SelectImageFilesBoxProps {\r\n selectFileHandler: (value: boolean) => void;\r\n}\r\nfunction SelectImageFilesBox(props: SelectImageFilesBoxProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const classes = useStyles();\r\n const fh = React.useMemo((): React.ReactNode => {\r\n let s = t(translations.MaxFileSize);\r\n s = s.replace('{0}', '100');\r\n return (\r\n <>\r\n {t(translations.DragTheImagesOrBrowse)}\r\n
    \r\n
    \r\n {t(translations.AssetImgSupportedTypes)}\r\n
    \r\n
    {s}
    \r\n \r\n );\r\n }, [t]);\r\n const accept = {\r\n 'application/png': ['.png'],\r\n 'application/jpg': ['.jpg'],\r\n 'application/gif': ['.gif'],\r\n 'application/bmp': ['.bmp'],\r\n 'application/jpe': ['.jpe'],\r\n 'application/jpeg': ['.jpeg'],\r\n 'application/ico': ['.ico'],\r\n };\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\ninterface InfoBoxProps {\r\n ImportTenplateHandler: () => void;\r\n}\r\nfunction InfoBox(props: InfoBoxProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const classes = useStyles();\r\n const BulkCreateNewRecords: string[] = React.useMemo(() => {\r\n return t(translations.Bulk_CNR1).split('{0}');\r\n }, [t]);\r\n return (\r\n \r\n \r\n \r\n {t(translations.ExcelImportSpecificRequirements)}\r\n \r\n
      \r\n
    • {t(translations.Excel_ISR1)}
    • \r\n
    • {t(translations.Excel_ISR2)}
    • \r\n
    \r\n
    \r\n \r\n {t(translations.CSVImportSpecificRequirements)}\r\n
      \r\n
    • {t(translations.CSV_ISR1)}
    • \r\n
    \r\n
    \r\n \r\n {t(translations.BulkCreateNewRecords)}\r\n
      \r\n
    • \r\n
      \r\n {BulkCreateNewRecords[0]}\r\n {\r\n props.ImportTenplateHandler();\r\n }}\r\n >\r\n {t(translations.Buli_CNR2)}\r\n \r\n {BulkCreateNewRecords[1]}\r\n
      \r\n
    • \r\n
    \r\n
    \r\n \r\n {t(translations.UpdateExistingRecords)}\r\n
      \r\n
    • {t(translations.Update_ER1)}
    • \r\n
    • {t(translations.Update_ER2)}
    • \r\n
    • {t(translations.Update_ER3)}
    • \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n","import {\r\n Box,\r\n createStyles,\r\n LinearProgress,\r\n makeStyles,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { H2 } from 'app/components/Typography';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport clsx from 'clsx';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n container: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n }),\r\n);\r\n\r\nexport interface PopupImportExportProgressProps {\r\n title: string;\r\n info: string;\r\n buttonName: string;\r\n onClick: () => void;\r\n}\r\nexport function PopupImportExportProgress(\r\n props: PopupImportExportProgressProps,\r\n) {\r\n const classes = useStyles();\r\n return (\r\n <>\r\n \r\n \r\n \r\n

    {props.title}

    \r\n \r\n {props.info}\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface NamePickerPrpps\r\n extends Omit>, 'loadData'> {\r\n names: Entity[] | undefined;\r\n}\r\nexport function NamePicker(props: NamePickerPrpps) {\r\n return (\r\n \r\n Promise.resolve(props.names !== undefined ? props.names : [])\r\n }\r\n variant=\"filled\"\r\n fullWidth\r\n {...props}\r\n />\r\n );\r\n}\r\n","import {\r\n createStyles,\r\n makeStyles,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Theme,\r\n withStyles,\r\n} from '@material-ui/core';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Check } from 'app/components/BasicInputs/Check';\r\nimport React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { NamePicker } from '../NamePicker';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n height: '100%',\r\n overflowX: 'auto',\r\n overflowY: 'auto',\r\n },\r\n headerRow: {\r\n height: 56,\r\n },\r\n tableRow: {\r\n height: 40,\r\n },\r\n }),\r\n);\r\n\r\nconst StyledTableRow = withStyles(theme => ({\r\n root: {\r\n height: 40,\r\n },\r\n}))(TableRow);\r\n\r\nexport interface HeaderColumnProps {\r\n checked: boolean;\r\n name: string;\r\n cn: number;\r\n onChange: (value: boolean, cn: number) => void;\r\n}\r\nexport function HeaderColumn(props: HeaderColumnProps) {\r\n const [checked, setChecked] = React.useState(props.checked);\r\n const handleCheckChandge = React.useCallback(\r\n (value: boolean, cn: number) => {\r\n setChecked(value);\r\n props.onChange(value, cn);\r\n },\r\n [props],\r\n );\r\n return (\r\n \r\n {\r\n handleCheckChandge(value, props.cn);\r\n }}\r\n checked={checked}\r\n />\r\n \r\n {props.name}\r\n \r\n \r\n );\r\n}\r\nexport interface HeaderColumnPickerProps {\r\n names: Entity[] | undefined;\r\n value?: Entity | null | undefined;\r\n cn: number;\r\n onChange: (value: Entity | null | undefined, cn: number) => void;\r\n}\r\nexport function HeaderColumnPicker(props: HeaderColumnPickerProps) {\r\n const [value, setValue] = React.useState | null | undefined>(\r\n props.value,\r\n );\r\n const [showPicker, setShowPicker] = React.useState(true);\r\n const handleValueChandge = React.useCallback(\r\n (value: Entity | null | undefined, cn: number) => {\r\n setValue(value);\r\n props.onChange(value, cn);\r\n if (value !== null) {\r\n setShowPicker(false);\r\n }\r\n },\r\n [props],\r\n );\r\n return (\r\n <>\r\n {showPicker ? (\r\n handleValueChandge(value, props.cn)}\r\n names={props.names}\r\n />\r\n ) : (\r\n {\r\n setShowPicker(true);\r\n }}\r\n >\r\n {value?.Name}\r\n \r\n )}\r\n \r\n );\r\n}\r\nexport interface BasicTableProps {\r\n header1: JSX.Element[];\r\n header2: JSX.Element[];\r\n rows: string[][];\r\n}\r\n\r\nexport function BasicTable({ header1, header2, rows }: BasicTableProps) {\r\n const classes = useStyles();\r\n return (\r\n \r\n \r\n \r\n \r\n {header1.map(column => (\r\n {column}\r\n ))}\r\n \r\n {header2.length > 0 && (\r\n \r\n {header2.map(column => (\r\n {column}\r\n ))}\r\n \r\n )}\r\n \r\n \r\n {rows.map((row, index) => (\r\n \r\n {row.map(cell => (\r\n {cell}\r\n ))}\r\n \r\n ))}\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport clsx from 'clsx';\r\nimport { H3 } from 'app/components/Typography';\r\nimport { BasicTable, HeaderColumn, HeaderColumnPicker } from './Table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Body } from 'app/components/Typography';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ImprotData } from '../Data';\r\nimport { Entity } from 'types/common';\r\nimport { BasicToggle } from 'app/components/BasicToggle';\r\n//import { ImportColumn } from '../Actions/Types';\r\n//import { ValuePicker } from './ValuePicker';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n titleContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(3),\r\n top: theme.spacing(3),\r\n color: theme.palette.grey[500],\r\n },\r\n container: {\r\n display: 'flex',\r\n },\r\n containerCenter: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n boxcontainer: {\r\n display: 'flex',\r\n width: '100%',\r\n height: '100%',\r\n },\r\n toggleBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginTop: '24px',\r\n },\r\n infoBox: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginTop: '24px',\r\n padding: '10PX',\r\n backgroundColor: '#f0f9ff',\r\n },\r\n border: {\r\n borderStyle: 'solid',\r\n borderColor: 'red',\r\n },\r\n }),\r\n);\r\nexport interface PopupImportExportStep3Props {\r\n title: string;\r\n backName: string;\r\n nextName: string;\r\n cancelName: string;\r\n rows: number;\r\n back: () => void;\r\n next: () => void;\r\n cancel: () => void;\r\n}\r\nexport function PopupImportExportStep3(props: PopupImportExportStep3Props) {\r\n const classes = useStyles();\r\n const [toggle1, setToggle1] = React.useState(true);\r\n const handleColumnCheckboxChange = React.useCallback(\r\n (value: boolean, cn: number) => {\r\n if (ImprotData.Header !== undefined) {\r\n ImprotData.Header[cn].Include = value;\r\n }\r\n },\r\n [],\r\n );\r\n const handleColumnPickerChange = React.useCallback(\r\n (value: Entity | null | undefined, cn: number) => {\r\n if (ImprotData.Header !== undefined) {\r\n ImprotData.Header[cn].Name = value?.Id;\r\n }\r\n },\r\n [],\r\n );\r\n /*const getColumnValue = React.useCallback((column: ImportColumn) => {\r\n if (column.ExcelName !== undefined) {\r\n const v = ImprotData.TemplateColumns?.find(value => {\r\n return value.Name === column.ExcelName;\r\n });\r\n return v;\r\n } else {\r\n return undefined;\r\n }\r\n }, []);*/\r\n const handleToggleChange1 = React.useCallback((value: boolean) => {\r\n setToggle1(value);\r\n }, []);\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n

    {props.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 {\r\n return (\r\n \r\n );\r\n })\r\n : []\r\n }\r\n header2={\r\n ImprotData.Header !== undefined && !toggle1\r\n ? ImprotData.Header.map((value, cn) => {\r\n return (\r\n \r\n );\r\n })\r\n : []\r\n }\r\n rows={ImprotData.Table !== undefined ? ImprotData.Table : []}\r\n />\r\n \r\n \r\n \r\n {/* {}}\r\n names={undefined}\r\n />*/}\r\n {/**/}\r\n \r\n \r\n \r\n {props.backName}\r\n \r\n \r\n \r\n {props.cancelName}\r\n \r\n
    \r\n \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ToggleBoxProps {\r\n rows: number;\r\n toggle1: boolean;\r\n handleToggleChange1: (value: boolean) => void;\r\n}\r\nfunction ToggleBox(props: ToggleBoxProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const [toggle1, setToggle1] = React.useState(props.toggle1);\r\n const [toggle2, setToggle2] = React.useState(true);\r\n const classes = useStyles();\r\n const rows = React.useMemo((): React.ReactNode => {\r\n let s = t(translations.RecordsInTheFile);\r\n s = s.replace('{0}', props.rows.toString());\r\n return (\r\n <>\r\n
    \r\n {s} \r\n
    \r\n \r\n );\r\n }, [props.rows, t]);\r\n const handleChange1 = React.useCallback(\r\n (checked: boolean, event: React.ChangeEvent) => {\r\n setToggle1(checked);\r\n props.handleToggleChange1(checked);\r\n },\r\n [props],\r\n );\r\n const handleChange2 = React.useCallback(\r\n (checked: boolean, event: React.ChangeEvent) => {\r\n setToggle2(checked);\r\n ImprotData.AddOnly = !checked;\r\n },\r\n [],\r\n );\r\n return (\r\n \r\n \r\n {rows}\r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n}\r\ninterface InfoBoxProps {}\r\nfunction InfoBox(props: InfoBoxProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const classes = useStyles();\r\n return (\r\n \r\n \r\n
  • {t(translations.UncheckColumnIfYouDontWantItToBeImported)}
  • \r\n
  • {t(translations.OnlyFirst5RowsOfTheFileAreDisplayedForPreview)}
  • \r\n
    \r\n
    \r\n );\r\n}\r\n","import { Box, createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { H4 } from 'app/components/Typography';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport clsx from 'clsx';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ImportResult } from '../Actions/Types';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n container: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n containerRows: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '300px',\r\n },\r\n row: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n rowData: {\r\n display: 'flex',\r\n width: '100%',\r\n margin: '3px',\r\n },\r\n divider: {\r\n backgroundColor: theme.palette.divider,\r\n },\r\n color: {\r\n color: theme.palette.primary.main,\r\n },\r\n }),\r\n);\r\n\r\ninterface RowDataProps {\r\n Name: string;\r\n Value: string;\r\n}\r\n\r\nfunction RowData(props: RowDataProps) {\r\n const classes = useStyles();\r\n return (\r\n \r\n {props.Name} \r\n \r\n {props.Value}\r\n \r\n \r\n );\r\n}\r\nexport interface PopupImportExportStep5Props {\r\n state: ImportResult;\r\n newRows: number;\r\n existingRows: number;\r\n errors: number;\r\n errorMessage?: string;\r\n handleDownloadImportErrorReport: () => void;\r\n onClick: () => void;\r\n}\r\nexport function PopupImportExportStep5(props: PopupImportExportStep5Props) {\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const content: React.ReactNode = React.useMemo((): React.ReactNode => {\r\n switch (props.state) {\r\n case ImportResult.success:\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n

    {t(translations.ImportSuccessfullyCompleted)}

    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n props.handleDownloadImportErrorReport()}\r\n title={t(translations.DownloadImportErrorReport)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n aria-label=\"close\"\r\n size=\"small\"\r\n style={{ width: '100%' }}\r\n >\r\n \r\n \r\n {t(translations.DownloadDetailedImportResults)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case ImportResult.error:\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n

    {t(translations.ImportCompletedWithErrors)}

    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n props.handleDownloadImportErrorReport()}\r\n title={t(translations.DownloadImportErrorReport)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n aria-label=\"close\"\r\n size=\"small\"\r\n style={{ width: '100%' }}\r\n >\r\n \r\n \r\n {t(translations.DownloadImportErrorReport)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case ImportResult.failed:\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n

    {t(translations.ImportHasFailed)}

    \r\n
    \r\n
    \r\n {t(translations.ImportErrorFailedMessage)}\r\n {props.errorMessage !== undefined && (\r\n \r\n {t(translations.ImportAdditionalDetails)}:{' '}\r\n {props.errorMessage}\r\n \r\n )}\r\n \r\n \r\n );\r\n case ImportResult.default:\r\n return (\r\n <>\r\n \r\n \r\n );\r\n default:\r\n return (\r\n <>\r\n \r\n \r\n );\r\n }\r\n }, [\r\n classes.color,\r\n classes.containerRows,\r\n classes.divider,\r\n classes.row,\r\n props,\r\n t,\r\n ]);\r\n return (\r\n <>\r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { extractErrorMessages } from 'api/utils';\r\nimport { AxiosError } from 'axios';\r\n//import fileDownload from 'js-file-download';\r\nimport { ExportImportActions } from '.';\r\nimport { ImportData, ImportResult } from './Types';\r\n\r\nexport interface ImportFileResult {\r\n resultData?: any | undefined;\r\n resultFileName?: string | undefined;\r\n importResult: ImportResult;\r\n errorMessage?: string | undefined;\r\n NewRecordsImported: number;\r\n ExistingRecordsUpdated: number;\r\n ImportErrors: number;\r\n SystemErrorMessage?: string | null;\r\n}\r\n\r\nasync function ParseResultBlob(\r\n data: Blob,\r\n): Promise<{ file: Blob | undefined; obj: any | undefined }> {\r\n const size = data.size;\r\n const jsonBlobSize = data.slice(size - 4, size);\r\n const jsonBlobSizeText = await jsonBlobSize.text();\r\n const l = parseInt(jsonBlobSizeText);\r\n const jsonBlob = data.slice(size - l - 4, size - 4);\r\n const s = await jsonBlob.text();\r\n const obj = JSON.parse(s);\r\n return {\r\n file: size - l - 4 > 0 ? data.slice(0, size - l - 4) : undefined,\r\n obj: obj,\r\n };\r\n}\r\nexport async function GenericImport(\r\n file: File | undefined,\r\n data: ImportData,\r\n): Promise {\r\n var res: ImportFileResult | undefined = undefined;\r\n try {\r\n if (file !== undefined) {\r\n const response = await ExportImportActions.Import(\r\n '/api/GenericImport/Import',\r\n file,\r\n data,\r\n );\r\n if (response.data !== undefined && response.data.size > 0) {\r\n const cd = response.headers['content-disposition'];\r\n const filename =\r\n cd !== undefined ? cd.split('filename=')[1] : 'ImportResult.xlsx';\r\n const data = await ParseResultBlob(response.data);\r\n res = {\r\n resultData: data.file,\r\n resultFileName: filename,\r\n importResult: data.obj.Result as ImportResult,\r\n NewRecordsImported: data.obj.InsertedRows,\r\n ExistingRecordsUpdated: data.obj.UpdatedRows,\r\n ImportErrors: data.obj.Errors,\r\n SystemErrorMessage: data.obj.SystemErrorMessage,\r\n };\r\n } else {\r\n res = {\r\n importResult: ImportResult.failed,\r\n NewRecordsImported: 0,\r\n ExistingRecordsUpdated: 0,\r\n ImportErrors: 0,\r\n };\r\n }\r\n } else {\r\n return Promise.resolve(res);\r\n }\r\n } catch (error: unknown) {\r\n let testmsg = extractErrorMessages(error);\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n testmsg;\r\n res = {\r\n importResult: ImportResult.failed,\r\n errorMessage: message ?? (error as AxiosError)?.message,\r\n NewRecordsImported: 0,\r\n ExistingRecordsUpdated: 0,\r\n ImportErrors: 0,\r\n };\r\n }\r\n return Promise.resolve(res);\r\n}\r\n","import React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { PopupImportExportDialog } from './Components/Dialog';\r\nimport { PopupImportExportStep1 } from './Components/step1';\r\nimport { PopupImportExportProgress } from './Components/step2_4';\r\nimport { PopupImportExportStep3 } from './Components/step3';\r\nimport { PopupImportExportStep5 } from './Components/step5';\r\nimport { ImprotData } from './Data';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { GenericImport } from './Actions/Import';\r\nimport { ImportAdditionalData, ImportResult } from './Actions/Types';\r\nimport fileDownload from 'js-file-download';\r\nimport { ExportImportActions } from './Actions';\r\nimport { Entity } from 'types/common';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { useDispatch } from 'react-redux';\r\n\r\n/**\r\n *\r\n * PopupExportImport\r\n *\r\n */\r\nexport interface PopupImportExportProps {\r\n title: string;\r\n show: boolean;\r\n screenId: ScreensId;\r\n budgetType?: number;\r\n iad?: ImportAdditionalData;\r\n close: () => void;\r\n}\r\nexport function PopupImportExport({\r\n title,\r\n show,\r\n screenId,\r\n budgetType,\r\n iad,\r\n close,\r\n}: PopupImportExportProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const [step, setStep] = React.useState(0);\r\n const [rows, setRows] = React.useState(0);\r\n const [columns, setColumns] = React.useState(0);\r\n const [filetype, setFiletype] = React.useState | null>({\r\n Id: '.xlsx',\r\n Name: '.xlsx',\r\n });\r\n const [importResult, setImportResult] = React.useState(\r\n ImportResult.default,\r\n );\r\n const [resultData, setResultData] = React.useState();\r\n const [resultFileName, setResultFileName] = React.useState<\r\n string | undefined\r\n >();\r\n const [newRows, setNewRows] = React.useState(0);\r\n const [existingRows, setExistingRows] = React.useState(0);\r\n const [errors, setErrors] = React.useState(0);\r\n const [errorMessage, setErrorMessage] = React.useState();\r\n React.useEffect(() => {\r\n ImprotData.ClearImages();\r\n ImprotData.ScreenId = screenId;\r\n ImprotData.ImportAdditionalData =\r\n iad !== undefined ? iad : ImportAdditionalData.none;\r\n }, [iad, screenId]);\r\n const cancel = React.useCallback(() => {\r\n setRows(0);\r\n setColumns(0);\r\n setResultData(undefined);\r\n setStep(0);\r\n ImprotData.ClearImages();\r\n close();\r\n }, [close]);\r\n const cancelFileUpload = React.useCallback(() => {\r\n cancel();\r\n }, [cancel]);\r\n const cancelImport = React.useCallback(() => {\r\n cancel();\r\n }, [cancel]);\r\n const back = React.useCallback(() => {\r\n if (step > 1) {\r\n setStep(step - 2);\r\n }\r\n }, [step]);\r\n /*const delay = delayInms => {\r\n return new Promise(resolve => setTimeout(resolve, delayInms));\r\n };*/\r\n const handleFileTypeChange = React.useCallback(\r\n (value: Entity | null) => {\r\n setFiletype(value);\r\n },\r\n [],\r\n );\r\n const ImportTenplateHandler = React.useCallback(async () => {\r\n const res = await ExportImportActions.ImportTemplate(\r\n screenId,\r\n filetype !== null ? filetype.Name : '.xlsx',\r\n iad,\r\n );\r\n const cd = res.headers['content-disposition'];\r\n const filename =\r\n cd !== undefined\r\n ? cd.split('filename=')[1]\r\n : 'template' + (filetype !== null ? filetype.Name : '');\r\n fileDownload(res.data, filename);\r\n }, [filetype, iad, screenId]);\r\n const next = React.useCallback(async () => {\r\n switch (step) {\r\n case 0:\r\n setStep(1);\r\n const res = await ImprotData.LoadExcelfile();\r\n if (res !== undefined) {\r\n setRows(ImprotData.RowCount !== undefined ? ImprotData.RowCount : 0);\r\n const cc = await ImprotData.LoadTemplateColumns();\r\n if (cc !== undefined) {\r\n ImprotData.SetTemplateColumns(cc);\r\n }\r\n //await delay(5000);\r\n setStep(2);\r\n } else {\r\n setStep(0);\r\n }\r\n break;\r\n case 1:\r\n break;\r\n case 2:\r\n setColumns(ImprotData.ColumnCount());\r\n setStep(3);\r\n const importFileResult = await GenericImport(ImprotData.File, {\r\n ScreenId: screenId,\r\n Columns: ImprotData.Header !== undefined ? ImprotData.Header : [],\r\n BudgetType: budgetType ?? 1,\r\n AddOnly: ImprotData.AddOnly ?? false,\r\n Iad: iad ?? ImportAdditionalData.none,\r\n ImportAssetImageFiles: ImprotData.ImportAssetImageFiles,\r\n AutoGenerateAssetNamesBasedOn:\r\n ImprotData.AutoGenerateAssetNamesBasedOn?.Id,\r\n UpdateQRCode: ImprotData.UpdateQRCode,\r\n });\r\n //await delay(5000);\r\n setResultData(\r\n importFileResult !== undefined\r\n ? importFileResult.resultData\r\n : undefined,\r\n );\r\n setResultFileName(\r\n importFileResult !== undefined\r\n ? importFileResult.resultFileName\r\n : undefined,\r\n );\r\n setImportResult(\r\n importFileResult !== undefined\r\n ? importFileResult.importResult\r\n : ImportResult.default,\r\n );\r\n setErrorMessage(\r\n importFileResult !== undefined\r\n ? importFileResult.errorMessage\r\n : undefined,\r\n );\r\n setNewRows(\r\n importFileResult !== undefined\r\n ? importFileResult.NewRecordsImported\r\n : 0,\r\n );\r\n setExistingRows(\r\n importFileResult !== undefined\r\n ? importFileResult.ExistingRecordsUpdated\r\n : 0,\r\n );\r\n setErrors(\r\n importFileResult !== undefined ? importFileResult.ImportErrors : 0,\r\n );\r\n dispatch(actions.setRefreshTable(true));\r\n setStep(4);\r\n break;\r\n case 3:\r\n break;\r\n case 4:\r\n break;\r\n default:\r\n }\r\n }, [actions, budgetType, dispatch, iad, screenId, step]);\r\n const handleDownloadImportErrorReport = React.useCallback(() => {\r\n if (\r\n resultData !== undefined &&\r\n resultFileName !== undefined &&\r\n resultFileName !== ''\r\n ) {\r\n fileDownload(resultData, resultFileName);\r\n setResultData(undefined);\r\n }\r\n }, [resultData, resultFileName]);\r\n const steps = React.useMemo((): React.ReactNode[] => {\r\n return [\r\n ,\r\n ,\r\n ,\r\n ,\r\n ,\r\n ];\r\n }, [\r\n ImportTenplateHandler,\r\n back,\r\n cancel,\r\n cancelFileUpload,\r\n cancelImport,\r\n columns,\r\n errorMessage,\r\n errors,\r\n existingRows,\r\n filetype,\r\n handleDownloadImportErrorReport,\r\n handleFileTypeChange,\r\n importResult,\r\n newRows,\r\n next,\r\n rows,\r\n t,\r\n title,\r\n ]);\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * LoanableFilter\r\n *\r\n */\r\nimport { CampusPicker } from 'app/components/pickers/AutocompletePickers/CampusPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const CampusFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default CampusFilter;\r\n","import { httpClient } from 'api/HttpClient';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface ServiceUserGroupPickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/ServiceUserGroupFilter';\r\nexport const initServiceUserGroupData = (initval: string) => {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: new Condition>(\r\n 'Id',\r\n ODataOperators.Equals,\r\n initval,\r\n ).toString(),\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nconst loadData = (\r\n searchTerm: string | null,\r\n predicates?: (string | Condition>)[],\r\n) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null || (predicates && predicates.length > 0)) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: predicates ?? [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm ?? '',\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function ServiceUserGroupPicker(props: ServiceUserGroupPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport {\r\n BaseURLMultiPicker,\r\n BaseURLMultiPickerProps,\r\n} from 'app/components/BasicPickers/BaseURLMultiPicker';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface UserGroupMultiPickerProps\r\n extends Omit, 'url'> {}\r\n\r\nconst url = '/api/odata/v4/UserGroupFilter';\r\n\r\nexport const initUserGroupMultiData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return Promise.resolve([] as Entity[]);\r\n }\r\n const ids = initval.split('|');\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n } = {\r\n $orderby: 'Id asc',\r\n $filter: '(Id in (' + ids.map(v => \"'\" + v + \"'\").join(',') + '))',\r\n $select: 'Id,Name',\r\n $top: ids.length,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\n\r\nexport const UserGroupMultiPicker = (props: UserGroupMultiPickerProps) => {\r\n return ;\r\n};\r\n","/**\r\n *\r\n * BasicDialogTitle\r\n *\r\n */\r\nimport {\r\n Box,\r\n createStyles,\r\n DialogTitle as MuiDialogTitle,\r\n makeStyles,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { Body } from '../Typography';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { H3 } from '../Typography';\r\nconst titleStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(3, 3, 1, 4),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n width: '100%',\r\n background: theme.palette.background.default,\r\n //borderRadius: '12px 12px 0px 0px',\r\n },\r\n titleContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: '0px',\r\n },\r\n titleBody: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '0px',\r\n },\r\n titleSubtitle: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '0px',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n title: {\r\n margin: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n subtitle: {},\r\n }),\r\n);\r\nexport interface BasicDialogTitleProps {\r\n id?: string;\r\n children: React.ReactNode;\r\n subtitle?: React.ReactNode;\r\n onClose?: () => void;\r\n}\r\nexport function BasicDialogTitle(props: BasicDialogTitleProps) {\r\n const { id, children, subtitle, onClose, ...other } = props;\r\n const classes = titleStyles();\r\n return (\r\n \r\n \r\n \r\n

    {children}

    \r\n
    \r\n {subtitle && (\r\n \r\n {subtitle}\r\n \r\n )}\r\n\r\n {onClose ? (\r\n \r\n \r\n \r\n ) : null}\r\n
    \r\n
    \r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { put, select, takeLatest } from 'redux-saga/effects';\r\nimport { publicAssetActions as actions } from '.';\r\nimport { BrowseByUnitItemDto } from './types';\r\nimport { routerActions } from 'connected-react-router';\r\nimport { toQueryString } from 'utils/url-utils';\r\nimport { selectRouterSearchParams } from 'app/slice/router-selectors';\r\n\r\nfunction* dosetSelectedItem(\r\n action: PayloadAction<{\r\n item: BrowseByUnitItemDto | undefined;\r\n search: string;\r\n init?: boolean;\r\n }>,\r\n) {\r\n const path = '/Assets/Public';\r\n const currentSearch = new URLSearchParams(action.payload.search);\r\n\r\n if (!action.payload.init) {\r\n yield put(\r\n routerActions.push({ pathname: path, search: currentSearch.toString() }),\r\n );\r\n }\r\n yield put(actions.setSelectedItem_Success(action.payload));\r\n}\r\nfunction* dosetSelectedItems(\r\n action: PayloadAction<{\r\n items: BrowseByUnitItemDto[];\r\n search: string;\r\n init?: boolean;\r\n }>,\r\n) {\r\n const path = '/Assets/Public';\r\n const currentSearch = new URLSearchParams(action.payload.search);\r\n //const newSearch = getSearchFromItems(action.payload.items, currentSearch);\r\n if (!action.payload.init) {\r\n yield put(\r\n routerActions.push({ pathname: path, search: currentSearch.toString() }),\r\n );\r\n }\r\n\r\n yield put(actions.setSelectedItems_Success(action.payload));\r\n}\r\nfunction* dosetAssetPublicFilters(\r\n action: PayloadAction | undefined>,\r\n) {\r\n const currentSearch = yield select(selectRouterSearchParams);\r\n\r\n const path = '/Assets/Public';\r\n const newSearch = !!action.payload\r\n ? toQueryString(action.payload)\r\n : currentSearch;\r\n for (const key of newSearch.keys()) {\r\n if ((currentSearch as URLSearchParams).has(key)) {\r\n const filterValue = newSearch.get(key);\r\n if (filterValue !== null) {\r\n let currValue = currentSearch.get(key);\r\n if (filterValue !== currValue) {\r\n currentSearch.set(key, filterValue);\r\n }\r\n } else {\r\n currentSearch.delete(key);\r\n }\r\n } else {\r\n const filterValue = newSearch.get(key);\r\n if (filterValue !== null) {\r\n currentSearch.set(key, filterValue);\r\n }\r\n }\r\n }\r\n yield put(\r\n routerActions.push({\r\n pathname: path,\r\n search: currentSearch.toString(),\r\n }),\r\n );\r\n yield put(actions.setAssetPublicFilters_success(action.payload));\r\n}\r\nexport function* publicAssetSaga() {\r\n yield takeLatest(actions.setSelectedItem.type, dosetSelectedItem);\r\n yield takeLatest(actions.setSelectedItems.type, dosetSelectedItems);\r\n yield takeLatest(actions.setAssetPublicFilters.type, dosetAssetPublicFilters);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { publicAssetSaga } from './saga';\r\nimport { BrowseByUnitItemDto, PublicAssetState } from './types';\r\n\r\nexport const initialState: PublicAssetState = {\r\n processing: false,\r\n error: undefined,\r\n data: undefined,\r\n selectedData: [],\r\n dataSearch: undefined,\r\n filters: undefined,\r\n menuOpen: undefined,\r\n globalSearchOpen: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'publicAsset',\r\n initialState,\r\n reducers: {\r\n setSelectedItem(\r\n state,\r\n action: PayloadAction<{\r\n item: BrowseByUnitItemDto | undefined;\r\n search: string;\r\n init?: boolean;\r\n }>,\r\n ) {\r\n state.processing = true;\r\n state.error = undefined;\r\n },\r\n setSelectedItem_Success(\r\n state,\r\n action: PayloadAction<{\r\n item: BrowseByUnitItemDto | undefined;\r\n search: string;\r\n init?: boolean;\r\n }>,\r\n ) {\r\n state.processing = false;\r\n state.error = undefined;\r\n state.data = action.payload.item;\r\n if (!action.payload.init) {\r\n state.dataSearch = action.payload.search;\r\n }\r\n },\r\n setSelectedItems(\r\n state,\r\n action: PayloadAction<{\r\n items: BrowseByUnitItemDto[];\r\n search: string;\r\n init?: boolean;\r\n }>,\r\n ) {\r\n state.processing = true;\r\n state.error = undefined;\r\n },\r\n setSelectedItems_Success(\r\n state,\r\n action: PayloadAction<{\r\n items: BrowseByUnitItemDto[];\r\n search: string;\r\n init?: boolean;\r\n }>,\r\n ) {\r\n state.processing = false;\r\n state.error = undefined;\r\n state.selectedData = action.payload.items;\r\n if (!action.payload.init) {\r\n state.dataSearch = action.payload.search;\r\n }\r\n },\r\n setAssetPublicFilters(\r\n state,\r\n action: PayloadAction | undefined>,\r\n ) {},\r\n setAssetPublicFilters_success(\r\n state,\r\n action: PayloadAction | undefined>,\r\n ) {\r\n state.filters = action.payload;\r\n },\r\n setMenuOpen(state, action: PayloadAction) {\r\n state.menuOpen = action.payload;\r\n },\r\n toggleMenuOpen(state, action: PayloadAction) {\r\n state.menuOpen = !state.menuOpen;\r\n },\r\n setGlobalSearchOpen(state, action: PayloadAction) {\r\n state.globalSearchOpen = action.payload;\r\n },\r\n toggleGlobalSearchOpen(state, action: PayloadAction) {\r\n state.globalSearchOpen = !state.globalSearchOpen;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: publicAssetActions } = slice;\r\n\r\nexport const usePublicAssetSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: publicAssetSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = usePublicAssetSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","/**\r\n *\r\n * InvoiceRowReferenceLinks\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { ReservationEditButton } from '../ReservationEditButton';\r\nimport { OtherServiceEditLink } from 'app/pages/OtherServiceDetails/OtherServiceDetailsPage';\r\nimport { GetServiceRequestDetailsPath } from 'app/pages/Samples/RequestSamplesPage/slice/path';\r\n\r\nexport interface InvoiceRowReferenceLinksProps {\r\n ReservationId: number | null;\r\n UsageId: number | null;\r\n OfflineServiceId: number | null;\r\n ServiceRequestId: number | null;\r\n SubscriptionId: number | null;\r\n useSidePanel: boolean;\r\n}\r\n\r\nexport function InvoiceRowReferenceLinks(props: InvoiceRowReferenceLinksProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n let references: Array<{\r\n id: number | null;\r\n link: string;\r\n title: string;\r\n target?: string;\r\n }> = [];\r\n\r\n if (props.UsageId)\r\n references.push({\r\n id: props.UsageId,\r\n link: '/UsageDetails.aspx?id=' + props.UsageId,\r\n title: t(translations.menu_UsageDetails) as string,\r\n target: '_blank',\r\n });\r\n\r\n if (props.ServiceRequestId)\r\n references.push({\r\n id: props.ServiceRequestId,\r\n link: GetServiceRequestDetailsPath(props.ServiceRequestId),\r\n title: t(translations.ServiceRequestDetails) as string,\r\n target: undefined,\r\n });\r\n\r\n if (props.SubscriptionId)\r\n references.push({\r\n id: props.SubscriptionId,\r\n link: '/Invoices/Subscriptions/Edit.aspx?id=' + props.SubscriptionId,\r\n title: t(translations.SubscriptionDetails) as string,\r\n target: '_blank',\r\n });\r\n\r\n let result = references.map((item, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n {item.id}\r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n });\r\n return (\r\n <>\r\n {props.ReservationId !== null && (\r\n \r\n )}\r\n {props.OfflineServiceId !== null && (\r\n \r\n )}\r\n {result}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { LocationPicker } from '../pickers/AutocompletePickers/LocationPicker';\r\nimport { ILocationListDto } from 'api/odata/generated/entities/ILocationListDto';\r\n\r\nexport const FormLocationPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & {\r\n label?: string;\r\n fullWidth: boolean;\r\n autoFocus?: boolean;\r\n name: string;\r\n placeholder: string;\r\n disabled?: boolean;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n}) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n helpers.setValue(value, true)}\r\n onBlur={field?.onBlur}\r\n value={field.value as ILocationListDto}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n variant={props.variant}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * PopupImport\r\n *\r\n */\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, ButtonProps } from '../BasicButtons/Button';\r\nimport { DialogConfirm } from '../DialogConfirm';\r\nimport { InfoIcon } from '../InfoIcon';\r\nimport parse from 'html-react-parser';\r\n\r\nimport { uniqueId } from 'lodash';\r\nimport BasicTypography from '../Typography/BasicTypography';\r\n\r\nexport interface PopupImportProps\r\n extends Pick {\r\n onImportButtonClick: () => void;\r\n onDownloadTemplateButtonClick?: () => Promise;\r\n onConfirm: (event, file: any) => void;\r\n onCancel: () => void;\r\n processing: boolean;\r\n open: boolean;\r\n title?: string;\r\n accept: '.xlsx' | '.xls' | '.csv';\r\n disabled?: boolean;\r\n hideImportButton?: boolean;\r\n hideMessage?: boolean;\r\n}\r\n\r\nexport function PopupImport(props: PopupImportProps) {\r\n const { t } = useTranslation();\r\n const ref = React.useRef(null);\r\n const handleConfirm = event => {\r\n const file = ref.current?.files?.[0];\r\n if (file !== undefined) {\r\n props.onConfirm(event, file);\r\n }\r\n };\r\n const [\r\n downloadTemplateprocessing,\r\n setDownloadTemplateProcessing,\r\n ] = React.useState(false);\r\n const [fileId] = React.useState(uniqueId('import-file-'));\r\n const [buttonId] = React.useState(uniqueId('import-file-'));\r\n return (\r\n <>\r\n {props.hideImportButton === undefined ||\r\n (props.hideImportButton === false && (\r\n \r\n {t(translations.Import)}\r\n \r\n ))}\r\n \r\n {props.onDownloadTemplateButtonClick !== undefined && (\r\n \r\n {t(translations.ImportRecordsDescription)}\r\n \r\n \r\n )}\r\n {props.onDownloadTemplateButtonClick !== undefined && (\r\n \r\n \r\n  \r\n {\r\n if (props.onDownloadTemplateButtonClick !== undefined) {\r\n setDownloadTemplateProcessing(true);\r\n await props.onDownloadTemplateButtonClick();\r\n setDownloadTemplateProcessing(false);\r\n }\r\n }}\r\n processing={downloadTemplateprocessing}\r\n >\r\n {t(translations.DownloadTemplate)}\r\n \r\n \r\n )}\r\n \r\n {props.hideMessage === undefined ||\r\n (props.hideMessage === false && (\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 * TagsFilter\r\n *\r\n */\r\nimport { TagsPicker } from 'app/components/pickers/AutocompletePickers/TagsPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const TagsFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default TagsFilter;\r\n","/**\r\n *\r\n * LoanableFilter\r\n *\r\n */\r\nimport { LoanablePicker } from 'app/components/pickers/AutocompletePickers/LoanablePicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const LoanableFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n size=\"small\"\r\n ariaLabel={props.label}\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default LoanableFilter;\r\n","/**\r\n *\r\n * StatusFilter\r\n *\r\n */\r\nimport { StatusPicker } from 'app/components/pickers/AutocompletePickers/StatusPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const StatusFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n onChange={handleOnChange}\r\n isOpen={props.open}\r\n size=\"small\"\r\n placeholder={t(translations.AllValues)}\r\n ariaLabel={props.label}\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default StatusFilter;\r\n","/**\r\n *\r\n * LockersFilter\r\n *\r\n */\r\nimport { LockersPicker } from 'app/components/pickers/AutocompletePickers/LockersPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const LockersFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n ariaLabel={props.label}\r\n size=\"small\"\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default LockersFilter;\r\n","/**\r\n *\r\n * AssemblyTypePicker\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { AssemblyTypePicker } from 'app/components/pickers/StaticOptionsPickers/AssemblyTypePicker';\r\n\r\nexport const AssetTypesFilter = (props: IFilterComponentProps): JSX.Element => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n //RENDER\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n onChange={handleOnChange}\r\n ariaLabel={props.label}\r\n id={props.id}\r\n size=\"small\"\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n />\r\n );\r\n};\r\n\r\nexport default AssetTypesFilter;\r\n","/**\r\n *\r\n * AreasFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { AreasPicker } from 'app/components/pickers/AutocompletePickers/AreassPicker';\r\n\r\nexport const AreasFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n <>\r\n | undefined}\r\n size=\"small\"\r\n onChange={handleOnChange}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n />\r\n \r\n );\r\n};\r\nexport default AreasFilter;\r\n","/**\r\n *\r\n * OnlineServiceTypeFilter\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { OnlineServiceTypePicker } from 'app/components/pickers/StaticOptionsPickers/OnlineServiceTypePicker';\r\n\r\nexport const OnlineServiceTypeFilter = (\r\n props: IFilterComponentProps,\r\n): JSX.Element => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n //RENDER\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n onChange={handleOnChange}\r\n size=\"small\"\r\n ariaLabel={props.label}\r\n id={props.id}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n />\r\n );\r\n};\r\n\r\nexport default OnlineServiceTypeFilter;\r\n","/**\r\n *\r\n * MyAssetAvailabilityTypeMultiFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { MyAssetAvailabilityTypeMultiPicker } from 'app/components/pickers/AutocompletePickers/MyAssetAvailabilityTypeMultiPicker';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\n\r\nexport const MyAssetAvailabilityTypeMultiFilter = (\r\n props: IFilterComponentProps,\r\n) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport const AvailabilityTypeAvailableMultiFilter = (\r\n props: IFilterComponentProps,\r\n) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport const AvailabilityTypeAvailableOnlineMultiFilter = (\r\n props: IFilterComponentProps,\r\n) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default MyAssetAvailabilityTypeMultiFilter;\r\n","/**\r\n *\r\n * DateLabel\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport interface DateLabelProps {\r\n value: Date | string | null;\r\n}\r\n\r\nexport function DateLabel(props: DateLabelProps) {\r\n return <>{dateUtils.shortDateFormat(props.value)};\r\n}\r\n","/**\r\n *\r\n * TrainingStatePicker\r\n *\r\n */\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { TrainingState } from 'enums/TrainingState';\r\n\r\nexport interface TrainingStatePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nexport function TrainingStatePicker(props: TrainingStatePickerProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const loadData = () => {\r\n const options = enumToEntityArray(TrainingState, t);\r\n return Promise.resolve[]>(options);\r\n };\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * TrainingStatePickerFilter\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { TrainingStatePicker } from 'app/components/pickers/AutocompletePickers/TrainingStatePicker';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetEnum, GetRawValue } from '../../types/FilterParam';\r\nimport { TFunction } from 'i18next';\r\nimport { TrainingState } from 'enums/TrainingState';\r\nimport { IFilterSettings } from '../../BasicFilter/IFilterSettings';\r\n\r\nexport function TrainingStatePickerFilter(props: IFilterComponentProps) {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n}\r\nexport function getTrainingStatePickerFilter(\r\n accessor: keyof TRow,\r\n params: URLSearchParams,\r\n t: TFunction,\r\n): IFilterSettings {\r\n return {\r\n id: 'TrainingStateId',\r\n fieldName: accessor,\r\n displayName: t(translations.TrainingState),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'TrainingStateId',\r\n value: GetEnum(GetRawValue(params, 'TrainingStateId'), TrainingState, t),\r\n component: TrainingStatePickerFilter,\r\n customFilter: (value, settings) => {\r\n const id = (value as Entity)?.Id;\r\n switch (id) {\r\n case TrainingState.Available:\r\n const x = new Condition(settings.fieldName, ODataOperators.Includes, [\r\n TrainingState.Available,\r\n TrainingState.UnderMinimum,\r\n ]).toString();\r\n return x;\r\n case TrainingState.Maximum:\r\n case TrainingState.SignedUp:\r\n case TrainingState.UnderMinimum:\r\n return new Condition(\r\n settings.fieldName,\r\n ODataOperators.Equals,\r\n id,\r\n ).toString();\r\n }\r\n },\r\n };\r\n}\r\nexport default TrainingStatePickerFilter;\r\n","/**\r\n *\r\n * ReservationOrDowntimePicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { ReservationOrDowntimeEnum } from 'enums/ReservationOrDowntimeEnum';\r\n\r\nexport interface ReservationOrDowntimePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nexport function ReservationOrDowntimePicker(\r\n props: ReservationOrDowntimePickerProps,\r\n) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const loadData = () => {\r\n const options = enumToEntityArray(ReservationOrDowntimeEnum, t);\r\n return Promise.resolve[]>(options);\r\n };\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ReservationOrDowntimePickerFilter\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { ReservationOrDowntimePicker } from 'app/components/pickers/AutocompletePickers/ReservationOrDowntimePicker';\r\nimport { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetEnum, GetRawValue } from '../../types/FilterParam';\r\nimport { TFunction } from 'i18next';\r\nimport { ReservationOrDowntimeEnum } from 'enums/ReservationOrDowntimeEnum';\r\nimport { IFilterSettings } from '../../BasicFilter/IFilterSettings';\r\n\r\nexport function ReservationOrDowntimePickerFilter(\r\n props: IFilterComponentProps,\r\n) {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n}\r\nexport function getReservationOrDowntimePickerFilter(\r\n accessor: keyof TRow,\r\n params: URLSearchParams,\r\n t: TFunction,\r\n): IFilterSettings {\r\n return {\r\n id: 'ReservationOrDowntime',\r\n fieldName: accessor,\r\n displayName: t(translations.ReservationOrDowntime),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'ReservationOrDowntime',\r\n value: GetEnum(\r\n GetRawValue(params, 'ReservationOrDowntime'),\r\n ReservationOrDowntimeEnum,\r\n t,\r\n ),\r\n component: ReservationOrDowntimePickerFilter,\r\n };\r\n}\r\nexport default ReservationOrDowntimePickerFilter;\r\n","/**\r\n *\r\n * WithReservationsOnlyFilter\r\n *\r\n */\r\nimport { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { BooleanPicker } from 'app/components/BooleanPicker';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { URLSearchParams } from 'url';\r\nimport { IFilterSettings } from '../../BasicFilter/IFilterSettings';\r\nimport {\r\n GetBooleanEntity,\r\n GetBooleanOrUndefined,\r\n GetRawValue,\r\n URLSearchParamsCI,\r\n} from '../../types/FilterParam';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport interface WithReservationsOnlyFilterProps {}\r\n\r\nexport function WithReservationsOnlyFilter(props: IFilterComponentProps) {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n}\r\nexport function pushReservationsOnlyFilter<\r\n T extends { WithReservationsOnly: boolean | null }\r\n>(\r\n result: IFilterSettings[],\r\n t: TFunction,\r\n params: URLSearchParamsCI,\r\n notDefault?: boolean,\r\n) {\r\n const id = 'WithReservationsOnly';\r\n result.push({\r\n id: id,\r\n fieldName: 'WithReservationsOnly',\r\n displayName: t(translations.WithEventsOnly),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: id,\r\n value: GetBooleanEntity(GetBooleanOrUndefined(GetRawValue(params, id)), t),\r\n component: WithReservationsOnlyFilter,\r\n defaultValue: false,\r\n urlKey: id,\r\n notDefault,\r\n });\r\n}\r\nexport function getWithReservationsOnlyFilter(\r\n fieldName: keyof TRow,\r\n params: URLSearchParams,\r\n t: TFunction,\r\n): IFilterSettings {\r\n const id = 'WithReservationsOnly';\r\n return {\r\n id: id,\r\n fieldName: fieldName,\r\n queryStringSerializer: id,\r\n displayName: t(translations.WithEventsOnly),\r\n operator: ODataOperators.Equals,\r\n value: GetBooleanEntity(GetBooleanOrUndefined(GetRawValue(params, id)), t),\r\n component: WithReservationsOnlyFilter,\r\n urlKey: id,\r\n };\r\n}\r\n","import { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport {\r\n pushAssetAvailabilityFilter,\r\n pushAssetCatFilter,\r\n pushAssetCatGroupFilter,\r\n pushBookedByFilter,\r\n pushBudgetManagerFilter,\r\n pushBuildingFilter,\r\n pushCampusFilter,\r\n pushRoomFilter,\r\n pushServicesCalendarFilter,\r\n} from 'app/pages/ReservationHistoryPage/Filter';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { URLSearchParamsCI } from 'app/components/BasicTable/types/FilterParam';\r\nimport { ITrainingSessionDto } from 'api/odata/generated/entities/ITrainingSessionDto';\r\nimport { getTrainingStatePickerFilter } from 'app/components/BasicTable/Filters/TrainingStatePickerFilter';\r\nimport { getReservationOrDowntimePickerFilter } from 'app/components/BasicTable/Filters/ReservationOrDowntimePickerFilter';\r\nimport { pushReservationsOnlyFilter } from 'app/components/BasicTable/Filters/WithReservationsOnlyFilter';\r\nimport { getBudgetsFilterSettings } from 'app/components/BasicTable/Filters/ProjectFilter/getBudgetsFilterSettings';\r\n\r\nexport type CombinedSchedulerTRow = ICalendarReservationDto &\r\n ITrainingSessionDto & {\r\n ReservationOrDowntime: number | null;\r\n WithReservationsOnly: boolean | null;\r\n };\r\n\r\nexport const getFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParamsCI(search);\r\n const result: Array> = [];\r\n pushServicesCalendarFilter(result, t, params, false, 'Id', 'reserved');\r\n pushAssetCatFilter(result, t, params);\r\n pushAssetCatGroupFilter(result, t, params);\r\n pushRoomFilter(result, t, params);\r\n pushReservationsOnlyFilter(result, t, params);\r\n // result.push(\r\n // getWithReservationsOnlyFilter(\r\n // 'WithReservationsOnly',\r\n // params,\r\n // t,\r\n // ),\r\n // );\r\n pushCampusFilter(appSettings, result, t, params, true);\r\n pushBuildingFilter(result, t, params, true);\r\n const budgetsFilter = getBudgetsFilterSettings(\r\n params,\r\n 'BudgetId',\r\n t,\r\n appSettings,\r\n );\r\n if (budgetsFilter !== undefined) {\r\n result.push({ ...budgetsFilter, notDefault: true });\r\n }\r\n pushBudgetManagerFilter(appSettings, result, t, params, true);\r\n pushAssetAvailabilityFilter(result, t, params, true);\r\n pushBookedByFilter(result, t, params, true);\r\n\r\n result.push({\r\n ...getTrainingStatePickerFilter(\r\n 'TrainingState',\r\n params,\r\n t,\r\n ),\r\n notDefault: true,\r\n });\r\n result.push({\r\n ...getReservationOrDowntimePickerFilter(\r\n 'ReservationOrDowntime',\r\n params,\r\n t,\r\n ),\r\n notDefault: true,\r\n });\r\n\r\n return result;\r\n};\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n printtopdf: {\r\n '@media print': {\r\n '& button': { display: 'none' },\r\n },\r\n },\r\n }),\r\n);\r\n","import { useCallback, useEffect, useRef } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useReactToPrint } from 'react-to-print';\r\nimport { PrintToPDFPopup } from './Components/PrintToPDFPopup';\r\nimport { usePrintPDFSlice } from './slice';\r\nimport styled from 'styled-components';\r\nimport { useStyles } from './Components/PrintStyles';\r\nimport React from 'react';\r\nimport {\r\n selectPrintPDFisLoading,\r\n selectPrintPDFSections,\r\n} from './slice/selectors';\r\n\r\nexport interface Printing {\r\n id: string;\r\n onLoading?: (id: string, loading: boolean) => void;\r\n printing: boolean;\r\n}\r\nexport interface PrintToPDFProps {\r\n title: string;\r\n children: React.ReactNode;\r\n print: boolean;\r\n printTitle: string;\r\n useSections?: boolean;\r\n saveMarkedSections?: boolean;\r\n close: () => void;\r\n}\r\nexport function PrintToPDF(props: PrintToPDFProps) {\r\n const dispatch = useDispatch();\r\n const { actions } = usePrintPDFSlice();\r\n const printPDFSections = useSelector(selectPrintPDFSections);\r\n const printPDFFisLoading = useSelector(selectPrintPDFisLoading);\r\n const [startPrinting, setStartPrinting] = React.useState(false);\r\n const [printing, setPrinting] = React.useState(false);\r\n const componentRef = useRef(null);\r\n const promiseResolveRef = useRef<() => void>();\r\n const handlePrint = useReactToPrint({\r\n content: () =>\r\n componentRef.current !== undefined ? componentRef.current : null,\r\n documentTitle: props.printTitle,\r\n onAfterPrint: () => {\r\n setPrinting(false);\r\n setStartPrinting(false);\r\n dispatch(actions.setPrinting(false));\r\n props.close();\r\n },\r\n onBeforeGetContent: () => {\r\n dispatch(actions.setPrinting(true));\r\n return new Promise(resolve => {\r\n dispatch(actions.clearLoading());\r\n setStartPrinting(true);\r\n promiseResolveRef.current = resolve;\r\n });\r\n },\r\n });\r\n useEffect(() => {\r\n if (startPrinting && !printPDFFisLoading) {\r\n setStartPrinting(false);\r\n setPrinting(true);\r\n }\r\n }, [startPrinting, printPDFFisLoading]);\r\n useEffect(() => {\r\n if (printing && promiseResolveRef.current) {\r\n //setPrinting(false);\r\n promiseResolveRef.current();\r\n }\r\n }, [printing]);\r\n\r\n const handleSubmit = useCallback(() => {\r\n if (\r\n props.saveMarkedSections !== undefined &&\r\n props.saveMarkedSections === true\r\n ) {\r\n dispatch(actions.saveSections());\r\n }\r\n handlePrint?.();\r\n }, [actions, dispatch, handlePrint, props.saveMarkedSections]);\r\n const classes = useStyles();\r\n return (\r\n <>\r\n \r\n {props.children}\r\n \r\n {props.print && (\r\n {\r\n props.close();\r\n }}\r\n onSubmit={handleSubmit}\r\n fullWidth={\r\n !!props.useSections &&\r\n printPDFSections !== undefined &&\r\n printPDFSections.length > 0\r\n }\r\n />\r\n )}\r\n \r\n );\r\n}\r\n/**\r\n * without width: 100% the layout of the PageWrapper breaks by overflowing the PageWrapper (service request details)\r\n */\r\nconst StyledDiv = styled('div')`\r\n width: 100%;\r\n height: 100%;\r\n`;\r\n","/**\r\n *\r\n * SamplePlateTypePicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface SamplePlateTypePickerProps\r\n extends Omit>, 'loadData'> {\r\n name?: string;\r\n placeholder?: string;\r\n onBlur?: React.FocusEventHandler;\r\n error?: boolean;\r\n helperText?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/SamplePlateTypes';\r\nexport const initSamplePlateTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string; $select: string } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function SamplePlateTypePicker(props: SamplePlateTypePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { SamplePlateTypePicker } from '../pickers/AutocompletePickers/SamplePlateTypePicker';\r\n\r\nexport const FormSamplePlateTypePicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & {\r\n label?: string;\r\n fullWidth: boolean;\r\n autoFocus?: boolean;\r\n name: string;\r\n placeholder: string;\r\n disabled?: boolean;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n}) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n helpers.setValue(value, true)}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n variant={props.variant}\r\n />\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Body } from 'app/components/Typography';\r\nimport { FormFieldsBox } from '../wrappers';\r\nimport { Divider, useTheme } from '@material-ui/core';\r\n\r\nexport interface FormFieldsSectionProps {\r\n children: React.ReactNode;\r\n titleSection?: string | React.ReactNode;\r\n titleLink?: React.ReactNode;\r\n styleSection?: React.CSSProperties;\r\n withTopSeparator?: boolean;\r\n withBottomSeparator?: boolean;\r\n}\r\nexport const FormFieldsSection = (props: FormFieldsSectionProps) => {\r\n const {\r\n children,\r\n titleSection,\r\n titleLink,\r\n styleSection,\r\n withTopSeparator,\r\n withBottomSeparator,\r\n } = props;\r\n const theme = useTheme();\r\n return (\r\n \r\n {withTopSeparator && (\r\n \r\n )}\r\n {titleSection && (\r\n
    \r\n {titleSection}\r\n {titleLink || <>}\r\n
    \r\n )}\r\n\r\n
    {children}
    \r\n {withBottomSeparator && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectSidePanelOpen,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useTheme } from '@material-ui/core';\r\nimport { BasicAlert } from 'app/components/BasicAlert';\r\nimport { IndexNode } from '../StyledForm/index';\r\nimport clsx from 'clsx';\r\nimport { LeftSection } from '../wrappers';\r\n\r\nexport interface FormLeftSectionProps {\r\n pageDescription?: string;\r\n warning?: string;\r\n info?: string;\r\n children: React.ReactNode;\r\n showShortView?: boolean;\r\n errors?: IndexNode[];\r\n warningNodes?: IndexNode[];\r\n infoNodes?: IndexNode[];\r\n successNodes?: IndexNode[];\r\n isCover?: boolean;\r\n}\r\nexport const FormLeftSection = (props: FormLeftSectionProps) => {\r\n const {\r\n pageDescription,\r\n children,\r\n warning,\r\n info,\r\n errors,\r\n warningNodes,\r\n infoNodes,\r\n successNodes,\r\n isCover,\r\n } = props;\r\n const isMobile = DetectIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const theme = useTheme();\r\n const showShortView = React.useMemo(() => {\r\n return (\r\n props.showShortView ||\r\n isMobile ||\r\n (sidePanelOpen && !sidePanelExpanded) ||\r\n isCover\r\n );\r\n }, [\r\n isCover,\r\n isMobile,\r\n props.showShortView,\r\n sidePanelExpanded,\r\n sidePanelOpen,\r\n ]);\r\n\r\n const [dataErrors, setDataErrors] = React.useState(errors || []);\r\n const [dataWarnings, setDataWarnings] = React.useState(\r\n warningNodes || [],\r\n );\r\n const [dataSuccess, setDataSuccess] = React.useState(\r\n successNodes || [],\r\n );\r\n const [dataInfos, setDataInfos] = React.useState(\r\n infoNodes || [],\r\n );\r\n const colapsedMinHeight = React.useMemo(() => {\r\n return showShortView ? 60 : 50;\r\n }, [showShortView]);\r\n const handleCloseError = React.useCallback(\r\n (index: number) => {\r\n if (dataErrors.length > 0) {\r\n setDataErrors(() => dataErrors.splice(index, 1));\r\n }\r\n },\r\n [dataErrors],\r\n );\r\n const handleCloseWarning = React.useCallback(\r\n (index: number) => {\r\n if (dataWarnings.length > 0) {\r\n setDataWarnings(() => dataWarnings.splice(index, 1));\r\n }\r\n },\r\n [dataWarnings],\r\n );\r\n const handleCloseInfo = React.useCallback(\r\n (index: number) => {\r\n if (dataInfos.length > 0) {\r\n setDataInfos(() => dataInfos.splice(index, 1));\r\n }\r\n },\r\n [dataInfos],\r\n );\r\n const handleCloseSuccess = React.useCallback(\r\n (index: number) => {\r\n if (dataSuccess.length > 0) {\r\n setDataSuccess(() => dataSuccess.splice(index, 1));\r\n }\r\n },\r\n [dataSuccess],\r\n );\r\n React.useEffect(() => {\r\n if (!!errors && errors.length > 0) {\r\n setDataErrors(errors);\r\n } else {\r\n setDataErrors([]);\r\n }\r\n if (!!warningNodes && warningNodes.length > 0) {\r\n setDataWarnings(warningNodes);\r\n } else {\r\n setDataWarnings([]);\r\n }\r\n if (!!infoNodes && infoNodes.length > 0) {\r\n setDataInfos(infoNodes);\r\n } else {\r\n setDataInfos([]);\r\n }\r\n if (!!successNodes && successNodes.length > 0) {\r\n setDataSuccess(successNodes);\r\n } else {\r\n setDataSuccess([]);\r\n }\r\n }, [errors, infoNodes, successNodes, warningNodes]);\r\n return (\r\n \r\n {pageDescription && (\r\n \r\n )}\r\n {warning && (\r\n \r\n )}\r\n {info && (\r\n \r\n )}\r\n {dataSuccess.length > 0 && (\r\n \r\n {dataSuccess.map((succ, index) => (\r\n handleCloseSuccess(index)}\r\n />\r\n ))}\r\n \r\n )}\r\n {dataInfos.length > 0 && (\r\n \r\n {dataInfos.map((info, index) => (\r\n handleCloseInfo(index)}\r\n />\r\n ))}\r\n \r\n )}\r\n {dataWarnings.length > 0 && (\r\n \r\n {dataWarnings.map((warn, index) => (\r\n handleCloseWarning(index)}\r\n />\r\n ))}\r\n \r\n )}\r\n {dataErrors.length > 0 && (\r\n \r\n {dataErrors.map((err, index) => (\r\n handleCloseError(index)}\r\n />\r\n ))}\r\n \r\n )}\r\n {children}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { ICanRaiseBasicTableRefreshEvent } from '../../ControlledTable/ControlledTableProps';\r\n\r\nexport interface RefreshIconProps extends ICanRaiseBasicTableRefreshEvent {\r\n loading?: boolean;\r\n title: string;\r\n}\r\nexport function RefreshIcon(props: RefreshIconProps) {\r\n const handleClick = React.useCallback(() => {\r\n if (props.loading === true) {\r\n return;\r\n }\r\n\r\n props.onRefresh?.();\r\n }, [props]);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * NumbersRangeFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IFilterComponentProps } from 'app/components/BasicTable/Filters/IFilterComponentProps';\r\nimport { INumbersRange } from 'types/INumbersRange';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport { debounce } from 'lodash';\r\n\r\n/**\r\n * Number picker to be used as a BasicTable filter component\r\n */\r\nexport const NumbersRangeFilter = ({\r\n value: propsValue,\r\n onChange,\r\n additionalItem,\r\n labelFunc,\r\n ...props\r\n}: IFilterComponentProps) => {\r\n const { t } = useTranslation();\r\n\r\n const [value, setValue] = React.useState(propsValue);\r\n const handleStartChange: React.ChangeEventHandler<\r\n HTMLTextAreaElement | HTMLInputElement\r\n > = event => {\r\n setValue(value => {\r\n const newState = {\r\n end: value?.end ?? null,\r\n start: +event.target.value ?? null,\r\n };\r\n d(newState);\r\n return newState;\r\n });\r\n };\r\n const handleEndChange: React.ChangeEventHandler<\r\n HTMLTextAreaElement | HTMLInputElement\r\n > = event => {\r\n setValue(value => {\r\n const newState = {\r\n start: value?.start ?? null,\r\n end: +event.target.value ?? null,\r\n };\r\n d(newState);\r\n return newState;\r\n });\r\n };\r\n const d = debounce(onChange, 250);\r\n return (\r\n <>\r\n {value !== undefined && (\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 default NumbersRangeFilter;\r\n","/**\r\n *\r\n * AvailabilityTypeFilter\r\n *\r\n */\r\nimport { AvailabilityTypeBookablePicker } from 'app/components/pickers/AutocompletePickers/AvailabilityTypePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const AvailabilityTypeBookableFilter = (\r\n props: IFilterComponentProps,\r\n) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n return (\r\n | undefined}\r\n />\r\n );\r\n};\r\nexport default AvailabilityTypeBookableFilter;\r\n","import { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { PrimaryActionDynamic } from 'app/components/BasicTable/components/TableCard/PrimaryAction';\r\nimport { ReservationDetailsProps } from '../ReservationDetails/Details';\r\nimport { ReservationQueryStringParameters } from '../ReservationDetails/Details/slice/types';\r\nimport { ITrainingSessionsRow } from './ITrainingSessionsRow';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport const trainingSessionPrimaryAction: PrimaryActionDynamic = (\r\n openPanel,\r\n row,\r\n toggle,\r\n user,\r\n useSidePanel,\r\n) => {\r\n const params = (row.original.hasReservation\r\n ? {\r\n id: String(row.original.myReservationId),\r\n }\r\n : {\r\n selectedIds: String(row.original.ServiceId),\r\n tsid: String(row.original.Id),\r\n Start: dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(row.original.StartDate ?? new Date()),\r\n ),\r\n End: dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(row.original.EndDate ?? new Date()),\r\n ),\r\n un: user?.Id,\r\n }) as ReservationQueryStringParameters;\r\n openPanel({\r\n renderPageType: RenderPageType.ReservationDetails,\r\n renderPageProps: {\r\n useSidePanel: true,\r\n queryParams: params,\r\n } as ReservationDetailsProps,\r\n useSidePanel: useSidePanel,\r\n expanded: false,\r\n isCover: useSidePanel,\r\n });\r\n};\r\n\r\nexport default trainingSessionPrimaryAction;\r\n","import { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { PrimaryActionDynamic } from 'app/components/BasicTable/components/TableCard/PrimaryAction';\r\nimport { WorkOrderDetailsProps } from '../WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { allowedToViewAlert } from 'app/permissions/WorkOrders/workOrdersPermissionUtils';\r\n\r\nexport const workOrderPrimaryAction: PrimaryActionDynamic = (\r\n openPanel,\r\n row,\r\n toggle,\r\n user,\r\n useSidePanel,\r\n) => {\r\n if (allowedToViewAlert(user, row.original)) {\r\n openPanel({\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: {\r\n queryParams: { id: '' + row.original.Id },\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n useSidePanel: useSidePanel,\r\n expanded: false,\r\n isCover: useSidePanel,\r\n });\r\n }\r\n};\r\n\r\nexport default workOrderPrimaryAction;\r\n","import { FormControl, FormLabel, styled } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { FieldHookConfig } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { buttonM } from 'styles/typography/bookitTypography';\r\n\r\nconst StyledFormLabel = styled(FormLabel)(({ theme }) => ({\r\n color: theme.palette.common.blackRegular,\r\n ...buttonM,\r\n '&[class*=\"Mui-focused\"]': {\r\n color: theme.palette.common.blackRegular,\r\n },\r\n}));\r\nexport const FormParagraph = ({\r\n label,\r\n html,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n return (\r\n \r\n {label}\r\n {html}\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * CatRateTypePicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ICatRateTypeFilterDto } from 'api/odata/generated/entities/ICatRateTypeFilterDto';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface CatRateTypeProps\r\n extends Omit>, 'loadData'> {\r\n /**\r\n * Set this to \"true\" if only \"Manual\" types need to be displayed\r\n *\r\n */\r\n manual?: boolean;\r\n bySystemSetting?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/CatRateTypeFilter';\r\nconst systemUrl = url + '/WithSystemSetting';\r\nexport const initCatRateTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst getLoadData = (manual: boolean, bysSystemSetting?: boolean) => (\r\n searchTerm: string | null,\r\n): Promise[]> => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n\r\n const predicates: Condition[] = [\r\n new Condition('Active', ODataOperators.Equals, true),\r\n ];\r\n if (manual) {\r\n predicates.push(\r\n new Condition(\r\n 'Manual',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n }\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm ?? undefined,\r\n }).toString();\r\n\r\n return httpClient\r\n .get(bysSystemSetting ? systemUrl : url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function CatRateTypePicker({\r\n manual,\r\n bySystemSetting,\r\n ...props\r\n}: CatRateTypeProps) {\r\n const loadData = React.useCallback(\r\n (search: string | null) =>\r\n getLoadData(manual === true, bySystemSetting)(search),\r\n [bySystemSetting, manual],\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport {\r\n Box,\r\n ListItem,\r\n ListItemSecondaryAction,\r\n ListItemText,\r\n Menu,\r\n MenuList,\r\n} from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { Body } from 'app/components/Typography';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport {\r\n BatchesByServiceTypeFilter,\r\n convertInventoryBatchName,\r\n loadInventoryBatchesData,\r\n} from 'app/components/pickers/AutocompletePickers/InventoryBatchesPicker';\r\nimport { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { GetResponseMessages, IResponseType } from 'types/ResponseType';\r\nimport { OtherServicesApi } from 'api/OtherServicesApi';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\n\r\nexport interface InventoryBatchListProps {\r\n serviceTypeId: number;\r\n isAdmin: boolean;\r\n addNewBatchClick: () => void;\r\n anchorEl: any;\r\n onClose: () => void;\r\n onBatchClick?: (batch: IInventoryBatchDto) => void;\r\n selectedBatch?: IInventoryBatchDto;\r\n batches: IInventoryBatchDto[];\r\n onRenewStockClick?: (batchId?: number) => void;\r\n batchDeletable?: boolean;\r\n showRenewStockButtons?: boolean;\r\n createdRenewal?: IOtherServices;\r\n}\r\n\r\nexport const InventoryBatchList = React.memo(function InventoryBatchList(\r\n props: InventoryBatchListProps,\r\n) {\r\n const {\r\n isAdmin,\r\n serviceTypeId,\r\n addNewBatchClick,\r\n anchorEl,\r\n onClose,\r\n onBatchClick,\r\n selectedBatch,\r\n batches,\r\n onRenewStockClick,\r\n batchDeletable,\r\n showRenewStockButtons,\r\n createdRenewal,\r\n } = props;\r\n const [input, setInnput] = React.useState('');\r\n const { t } = useTranslation();\r\n const [removedBatch, setRemovedBatch] = React.useState<\r\n IInventoryBatchDto | undefined\r\n >(undefined);\r\n const [removeBatchOpen, setRemoveBatchOpen] = React.useState(false);\r\n const dispatch = useDispatch();\r\n\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n const onRemoveBatchClick = (batch: IInventoryBatchDto) => {\r\n setRemoveBatchOpen(true);\r\n setRemovedBatch(batch);\r\n };\r\n const handleRemoveBatch = (batch: IInventoryBatchDto) => {\r\n new Promise((resolve, reject) => {\r\n return OtherServicesApi.deleteInventoryBatch(batch)\r\n .then(response => {\r\n const messages: IResponseType = GetResponseMessages(\r\n response,\r\n t(translations.Success) as string,\r\n );\r\n setRemoveBatchOpen(false);\r\n if (messages.ErrorMessages.length > 0) {\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: messages.ErrorMessages[0],\r\n }),\r\n );\r\n }\r\n if (messages.SuccessMessages.length > 0) {\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: messages.SuccessMessages[0],\r\n }),\r\n );\r\n }\r\n resolve(messages);\r\n })\r\n .catch(error => {\r\n console.log('status error', error);\r\n let err = t(translations.Failed) as string;\r\n reject(err);\r\n })\r\n .finally(() => {\r\n setRemoveBatchOpen(false);\r\n setRemovedBatch(undefined);\r\n });\r\n });\r\n };\r\n const availableBatches = useAsyncGetWthEffect(\r\n async () =>\r\n loadInventoryBatchesData(\r\n BatchesByServiceTypeFilter(\r\n serviceTypeId,\r\n showRenewStockButtons ? undefined : true,\r\n ),\r\n )(input, undefined).then(res => res.value),\r\n batches,\r\n [input, serviceTypeId, selectedBatch, removedBatch, createdRenewal],\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {t(translations.InventoryBatches)}\r\n \r\n \r\n \r\n \r\n }\r\n value={input || ''}\r\n aria-label={t(translations.SearchFilter)}\r\n inputProps={{ 'aria-label': t(translations.SearchFilter) }}\r\n onChange={e => setInnput(e.target.value)}\r\n autoFocus\r\n fullWidth\r\n />\r\n \r\n \r\n {!!availableBatches && availableBatches.length > 0 ? (\r\n availableBatches.map(a => (\r\n !!onBatchClick && onBatchClick(a)}\r\n >\r\n \r\n \r\n {convertInventoryBatchName(a.Id, a.Name, a.Inventory)}\r\n \r\n \r\n {a.Id !== selectedBatch?.Id && batchDeletable && (\r\n \r\n onRemoveBatchClick(a)}\r\n >\r\n \r\n \r\n \r\n )}\r\n {showRenewStockButtons && (\r\n \r\n \r\n onRenewStockClick && onRenewStockClick(a.Id)\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 {t(translations.InventoryBatch_notFound)}\r\n \r\n \r\n )}\r\n \r\n {isAdmin && (\r\n \r\n \r\n }\r\n onClick={() => addNewBatchClick()}\r\n >\r\n {t(translations.AddNewBatch)}\r\n \r\n {showRenewStockButtons && !!onRenewStockClick && (\r\n }\r\n onClick={() => onRenewStockClick()}\r\n >\r\n {t(translations.RenewStock)}\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n !!removedBatch && handleRemoveBatch(removedBatch)}\r\n onCancel={() => {\r\n setRemoveBatchOpen(false);\r\n setRemovedBatch(undefined);\r\n }}\r\n maxWidth=\"md\"\r\n />\r\n \r\n );\r\n});\r\n","import { getAssetImageThumbSrc } from 'app/components/AssetThumbImage/getAssetImageSrc';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { selectImageExist } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { CellProps, Renderer } from 'react-table';\r\n\r\ntype RecordType = Record;\r\nconst ImageRenderer: Renderer> = ({ value, row }) => {\r\n const imageExist = useSelector(state => selectImageExist(state, value));\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\nexport default ImageRenderer;\r\n","/**\r\n *\r\n * MultiSelectBasicPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n AutocompleteMultiPicker,\r\n AutocompleteMultiPickerProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPicker';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\n\r\nexport interface BaseURLMultiPickerProps\r\n extends Omit, 'loadData'> {\r\n url: string;\r\n queryfilter?: string | undefined;\r\n}\r\n\r\nexport function BaseURLMultiPicker(props: BaseURLMultiPickerProps) {\r\n const { url, queryfilter, ...other } = props;\r\n const loadData = async (searchTerm: string | null) => {\r\n const params: { $orderby: string; $top: number; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n $top: 100,\r\n };\r\n const predicates: string[] = [];\r\n if (queryfilter !== undefined && queryfilter !== '') {\r\n predicates.push(queryfilter);\r\n }\r\n\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm !== null ? searchTerm : undefined,\r\n }).toString();\r\n\r\n const response = await httpClient.get(url, params);\r\n return response.value;\r\n };\r\n return ;\r\n}\r\n","import { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { IAsset } from 'app/pages/AssetPopUp/IAsset';\r\nimport { useAdminPermissions } from 'app/permissions/Asset/assetPermissions';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { CellProps, Renderer } from 'react-table';\r\nimport { toRootedURL } from 'utils/url-utils';\r\n\r\nconst ServiceIdRenderer: Renderer> = ({ value, row }) => {\r\n const { allowedToEdit } = useAdminPermissions();\r\n const { t } = useTranslation();\r\n const hrefPath = React.useMemo(() => {\r\n if (row.original.ServiceType === 'Offline') {\r\n return {\r\n path: '/offlineServicetype.aspx',\r\n search: { ID: row.original.ServiceId, back: 'myassets' },\r\n };\r\n } else if (row.original.ServiceType === 'Sample') {\r\n return {\r\n path: '/SampleType.aspx',\r\n search: { id: row.original.ServiceId, back: 'myassets' },\r\n };\r\n } else {\r\n return {\r\n path: '/NewResource.aspx',\r\n search: { Edit: row.original.ServiceId, back: 'myassets' },\r\n };\r\n }\r\n }, [row.original.ServiceId, row.original.ServiceType]);\r\n return allowedToEdit(row.original) ? (\r\n \r\n \r\n \r\n {value}\r\n \r\n \r\n \r\n ) : (\r\n // \r\n // {value}\r\n // \r\n <>{value}\r\n );\r\n};\r\nexport const useServiceIdAction = () => {\r\n const { allowedToEdit } = useAdminPermissions();\r\n return React.useCallback(\r\n row => {\r\n if (!allowedToEdit(row.original)) return;\r\n const hrefPath = (() => {\r\n if (row.original.ServiceType === 'Offline') {\r\n return {\r\n path: '/offlineServicetype.aspx',\r\n search: { ID: row.original.ServiceId, back: 'myassets' },\r\n };\r\n } else if (row.original.ServiceType === 'Sample') {\r\n return {\r\n path: '/SampleType.aspx',\r\n search: { id: row.original.ServiceId, back: 'myassets' },\r\n };\r\n } else {\r\n return {\r\n path: '/NewResource.aspx',\r\n search: { Edit: row.original.ServiceId, back: 'myassets' },\r\n };\r\n }\r\n })();\r\n window.open(toRootedURL(hrefPath.path, hrefPath.search), '_blank');\r\n },\r\n [allowedToEdit],\r\n );\r\n};\r\nexport default ServiceIdRenderer;\r\n","import { getSingleOnlineServiceType } from 'app/components/pickers/StaticOptionsPickers/OnlineServiceTypePicker';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { CellProps, Renderer } from 'react-table';\r\n\r\nconst OperationTypeIdRenderer: Renderer>> = ({\r\n value,\r\n}: {\r\n value: number | null;\r\n}) => {\r\n const { t } = useTranslation();\r\n if (value === null || value === undefined) {\r\n return <>{t(translations.NA)};\r\n } else {\r\n return <>{getSingleOnlineServiceType(value).Name};\r\n }\r\n};\r\n\r\nexport default OperationTypeIdRenderer;\r\n","import { getAssetImageThumbSrc } from 'app/components/AssetThumbImage/getAssetImageSrc';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { useOpenAssetPopUp } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport { selectImageExist } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { CellProps, Renderer } from 'react-table';\r\n\r\ntype RecordType = Record;\r\nconst AssetImageRenderer: Renderer> = ({\r\n value,\r\n row,\r\n}) => {\r\n const imageExist = useSelector(state => selectImageExist(state, value));\r\n const openAsset = useOpenAssetPopUp();\r\n const open = () => {\r\n openAsset({ Id: row.original.Id });\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 AssetImageRenderer;\r\n","/**\r\n *\r\n * OtherServiceDetailsPage\r\n *\r\n */\r\nimport { OfflineServiceQueryStringParameters } from '../Details/slice/types';\r\nimport { RouteComponentProps, useLocation } from 'react-router-dom';\r\nimport { OtherServiceDetails } from '../Details';\r\nimport { getParams } from './getQueryStringParameter';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport * as React from 'react';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\n\r\nexport interface OtherServiceDetailsPageProps<\r\n Params extends {\r\n [K in keyof OfflineServiceQueryStringParameters]?: string | undefined;\r\n } = {}\r\n> extends RouteComponentProps {}\r\nexport function OtherServiceDetailsPage(props: OtherServiceDetailsPageProps) {\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const queryProps = getParams(params, props);\r\n return ;\r\n}\r\nexport function OtherServiceEditLink(props: {\r\n id: number;\r\n useSidePanel: boolean;\r\n service?: IOtherServices;\r\n openPanelWithCover?: (state: SidePanelOpenState) => void;\r\n}) {\r\n const { openPanel } = useSidePanelState();\r\n const handleOfflineServiceClick = React.useCallback(() => {\r\n let otherProps = {\r\n initialService: props.service,\r\n queryParams: {\r\n id: '' + props.id ?? -1,\r\n },\r\n useSidePanel: true,\r\n };\r\n const panelProps = {\r\n renderPageType: RenderPageType.OtherServiceDetails,\r\n renderPageProps: otherProps,\r\n expanded: false,\r\n useSidePanel: props.useSidePanel,\r\n isCover: props.useSidePanel,\r\n } as SidePanelOpenState;\r\n !!props.openPanelWithCover\r\n ? props.openPanelWithCover(panelProps)\r\n : openPanel(panelProps);\r\n }, [openPanel, props]);\r\n return (\r\n handleOfflineServiceClick()}\r\n >\r\n {props.id}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ServiceFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { OnlineServiceSinglePicker } from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\n\r\nexport const ServiceFilter = (props: IFilterComponentProps) => {\r\n const handleChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n // OnlineServiceSinglePicker operates on arrays, while ServiceFilter is a single selection picker\r\n const arrayValue =\r\n (props.value as Entity | undefined) === undefined\r\n ? undefined\r\n : Array.isArray(props.value) // check if the value already is an array before wrapping it yet in another array to avoid nested arrays [[{...}]]\r\n ? props.value\r\n : [props.value];\r\n\r\n return (\r\n \r\n );\r\n};\r\nexport default ServiceFilter;\r\n","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M128 41.522C91.867.049 43.399-.377 11.818.076 5.26.17 0 5.516 0 12.075v23.609c0 6.641 5.393 12.037 12.034 12C39.464 47.528 104 52.257 104 104v128H68c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h36v128c0 51.494-62.335 55.801-92.092 55.985C5.314 464.026 0 469.39 0 475.984v23.943c0 6.558 5.258 11.903 11.815 11.999 31.535.46 80.027.054 116.185-41.448 36.132 41.473 84.601 41.899 116.182 41.446 6.558-.094 11.818-5.44 11.818-11.999v-23.608c0-6.641-5.393-12.037-12.034-12C216.538 464.47 152 459.731 152 408V280h36c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12h-36V104c0-51.514 62.301-55.805 92.092-55.985C250.686 47.975 256 42.61 256 36.016V12.073C256 5.515 250.742.17 244.185.074 212.65-.386 164.157.02 128 41.522z\"\n});\n\nfunction SvgICursor(_ref, svgRef) {\n var 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 viewBox: \"0 0 256 512\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgICursor);\nexport default __webpack_public_path__ + \"static/media/I-cursor.1deb019e.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"\n});\n\nfunction SvgCheck(_ref, svgRef) {\n var 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 viewBox: \"0 0 512 512\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgCheck);\nexport default __webpack_public_path__ + \"static/media/check.53b599c1.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z\"\n});\n\nfunction SvgTimes(_ref, svgRef) {\n var 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 viewBox: \"0 0 352 512\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgTimes);\nexport default __webpack_public_path__ + \"static/media/times.c578e4ea.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"\n});\n\nfunction SvgChevronDown(_ref, svgRef) {\n var 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 viewBox: \"0 0 448 512\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgChevronDown);\nexport default __webpack_public_path__ + \"static/media/chevron-down.bc213772.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M240.971 130.524l194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z\"\n});\n\nfunction SvgChevronUp(_ref, svgRef) {\n var 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 viewBox: \"0 0 448 512\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgChevronUp);\nexport default __webpack_public_path__ + \"static/media/chevron-up.6f3cb9a5.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M254.812 101.975C254.631 79.9568 249.072 58.0916 235.287 41.7913C221.503 25.491 199.402 14.6276 176.498 13.7931C176.015 13.7753 175.529 13.7647 175.043 13.754C175.078 13.8393 175.117 13.928 175.153 14.0168C176.008 16.1937 171.833 20.4446 168.227 20.4446C166.118 20.4446 162.902 19.2372 161.961 18.669V18.6299C161.56 20.1017 160.969 21.515 160.204 22.8346C156.775 28.7794 150.658 31.7128 146.271 29.6708C145.611 30.6083 144.851 31.8442 144.166 32.938C147.52 35.47 150.201 39.2344 150.201 43.0094C150.201 43.4604 150.183 43.9363 150.154 44.4299C153.076 46.8092 155.305 54.7286 154.769 58.1449C154.491 58.4684 154.173 58.7548 153.821 58.9972C154.333 62.5485 155.458 70.3612 156.04 71.3911C156.693 72.5453 175.035 101.36 176.512 103.562C178.887 103.31 181.127 105.252 181.532 107.994C181.958 110.803 180.325 113.381 177.882 113.754C175.44 114.127 173.111 112.149 172.685 109.34C172.55 108.477 172.616 107.595 172.877 106.762C172.816 106.765 172.754 106.765 172.693 106.762C171.226 105.718 160.499 92.1838 155.405 85.7027C159.182 94.0837 163.598 103.793 164.609 106.19C166.938 106.293 169.015 108.346 169.441 111.162C169.917 114.28 168.163 117.131 165.536 117.533C162.909 117.934 160.374 115.732 159.902 112.614C159.715 111.437 159.861 110.232 160.325 109.134C160.176 109.098 160.027 109.066 159.87 109.02C157.293 106.914 141.699 86.5621 138.269 80.8623C134.134 89.428 130.023 96.0049 127.893 96.5021C121.202 98.0753 101.23 80.0988 97.9713 74.0901L93.5588 79.9639L67.8115 60.6095C50.9958 73.9729 36.9276 89.95 32.7636 108.481C25.8733 138.752 45.4509 175.766 73.9741 205.32C102.433 234.874 139.899 256.963 169.87 249.558C199.842 242.154 222.362 205.32 236.139 175.766C249.917 146.213 255.053 123.939 254.812 101.975Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M137.421 29.9265C139.085 27.4892 140.604 24.9564 141.972 22.341C141.92 21.3134 141.982 20.2832 142.156 19.2692C138.564 20.4529 134.908 21.8225 131.187 23.378L134.283 25.7076L128.958 32.8101C131.755 30.9635 134.283 29.8626 136.342 29.8626C136.702 29.8615 137.063 29.8828 137.421 29.9265Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M115.387 192.514L113.694 194.045L109.938 189.805C108.529 189.494 107.076 189.438 105.646 189.638L111.081 191.903L119.644 201.137C119.547 199.488 119.121 197.875 118.39 196.394C117.659 194.912 116.638 193.593 115.387 192.514Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M105.203 167.975L108.128 170.979L96.6547 110.8L92.3594 111.62L103.399 169.591C104.248 168.82 104.919 168.209 105.203 167.975Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref6 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M99.92 199.084C99.92 199.084 103.75 190.426 104.389 189.109L110.573 191.687C110.996 190.501 111.358 189.464 111.638 188.654C111.638 188.654 64.9609 185.671 57.8398 185.671L59.2846 192.024C59.2846 192.024 99.7035 210.8 103.072 211.762C103.072 211.762 104.755 207.373 106.672 202.273L99.92 199.084Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref7 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M120.936 202.504L192.565 147.662L188.629 142.512L116.506 197.735L120.936 202.504Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref8 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M99.9202 199.084C99.9202 199.084 102.799 192.571 103.981 189.986C102.02 190.541 100.228 191.573 98.7624 192.99C97.2973 194.407 96.2055 196.164 95.5844 198.106C94.9634 200.047 94.8324 202.113 95.2031 204.117C95.5739 206.122 96.4348 208.003 97.7092 209.594C98.9835 211.185 100.632 212.435 102.507 213.234C104.381 214.033 106.425 214.355 108.454 214.171C110.484 213.988 112.436 213.305 114.138 212.183C115.839 211.061 117.237 209.535 118.206 207.742L99.9202 199.084Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref9 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M162.431 16.1689C162.431 16.2438 162.431 16.3187 162.409 16.3935C162.413 16.3115 162.42 16.2367 162.431 16.1689Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref10 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M98.287 73.6427L64.084 47.9351\",\n stroke: \"#EDF0F3\",\n strokeWidth: 7,\n strokeMiterlimit: 10\n});\n\nvar _ref11 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M129.576 31.9791L95.373 6.27502\",\n stroke: \"#EDF0F3\",\n strokeWidth: 7,\n strokeMiterlimit: 10\n});\n\nvar _ref12 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M99.6113 48.9968C103.13 48.9968 105.983 46.1429 105.983 42.6223C105.983 39.1018 103.13 36.2478 99.6113 36.2478C96.0921 36.2478 93.2393 39.1018 93.2393 42.6223C93.2393 46.1429 96.0921 48.9968 99.6113 48.9968Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref13 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M110.694 50.5636L110.823 50.4067L110.694 50.5636Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref14 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M108.319 53.5575L108.483 53.3472L108.319 53.5575Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref15 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M105.529 57.2997L105.753 56.9872L105.529 57.2997Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref16 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M106.537 55.9189C106.58 55.8654 106.619 55.8084 106.662 55.7513C106.619 55.8084 106.594 55.8654 106.537 55.9189Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref17 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M107.681 54.3912L107.887 54.1213L107.681 54.3912Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref18 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M114.574 46.0115L114.625 45.9534L114.574 46.0115Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref19 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M107.066 55.2116C107.134 55.1192 107.201 55.0234 107.272 54.931C107.201 55.0234 107.134 55.1192 107.066 55.2116Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref20 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M97.5244 73.0176C97.5288 73.041 97.5348 73.0641 97.5426 73.0866C97.5348 73.0641 97.5288 73.041 97.5244 73.0176Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref21 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M104.95 58.1272C105.035 58.0065 105.121 57.8822 105.209 57.7721C105.121 57.8857 105.035 58.0065 104.95 58.1272Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref22 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M97.8154 70.9294C97.8651 70.7661 97.9148 70.5992 97.9716 70.4287C97.9148 70.5992 97.8651 70.7661 97.8154 70.9294Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref23 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M97.5168 72.4067C97.5168 72.5346 97.499 72.6589 97.499 72.7619C97.499 72.6589 97.5061 72.5346 97.5168 72.4067Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref24 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M97.7802 71.0574C97.7482 71.1746 97.7198 71.2882 97.6914 71.4125C97.7198 71.2882 97.7482 71.1746 97.7802 71.0574Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref25 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M97.656 71.558C97.6312 71.6574 97.6134 71.7533 97.5957 71.8492C97.6134 71.7533 97.6312 71.6574 97.656 71.558Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref26 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M97.5667 72.002C97.5667 72.0978 97.5419 72.1902 97.5312 72.2825C97.5419 72.1902 97.5525 72.0907 97.5667 72.002Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref27 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M111.351 49.7644L111.465 49.6254L111.351 49.7644Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref28 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M99.7852 66.3804L100.016 65.9507L99.7852 66.3804Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref29 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M98.4688 69.1289C98.522 68.9975 98.5788 68.8697 98.6356 68.7383C98.5788 68.8697 98.522 68.9975 98.4688 69.1289Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref30 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M98.7236 68.5395L98.9544 68.0424L98.7236 68.5395Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref31 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M99.416 67.0905C99.4941 66.9378 99.5722 66.7887 99.6503 66.6324C99.5722 66.7887 99.4941 66.9378 99.416 67.0905Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref32 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M99.0078 67.9215C99.1037 67.7156 99.2066 67.506 99.3131 67.293C99.2066 67.506 99.1037 67.7156 99.0078 67.9215Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref33 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M98.0107 70.315C98.0569 70.1765 98.1066 70.0345 98.1634 69.8925C98.1066 70.0416 98.0746 70.1836 98.0107 70.315Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref34 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M98.2344 69.7078C98.2805 69.587 98.3302 69.4628 98.3799 69.3527C98.3302 69.4628 98.2805 69.6048 98.2344 69.7078Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref35 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M101.582 63.2445L101.855 62.7935L101.582 63.2445Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref36 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M103.065 60.8971C103.225 60.6521 103.388 60.407 103.555 60.1584C103.399 60.407 103.225 60.6521 103.065 60.8971Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref37 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M102.064 62.4596L102.334 62.0299L102.064 62.4596Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref38 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M102.558 61.682L102.845 61.2345L102.558 61.682Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref39 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M103.808 59.782L104.092 59.3665L103.808 59.782Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref40 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M100.162 65.6985C100.244 65.5493 100.329 65.3966 100.418 65.2439C100.329 65.3788 100.244 65.5315 100.162 65.6985Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref41 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M100.56 64.9882C100.687 64.768 100.815 64.5443 100.95 64.317C100.812 64.5301 100.684 64.7538 100.56 64.9882Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref42 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M101.397 63.5428C101.28 63.7346 101.17 63.9264 101.042 64.1146C101.17 63.9228 101.269 63.7346 101.397 63.5428Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref43 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M104.383 58.951L104.642 58.5746L104.383 58.951Z\",\n fill: \"#EDF0F3\"\n});\n\nvar _ref44 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M93.5981 105.828C91.5357 105.828 77.8118 104.002 77.1622 104.002C76.5126 104.002 74.9258 104.414 74.9258 105.476C74.9258 109.07 86.47 112.252 98.1952 112.252C109.92 112.252 93.5981 105.828 93.5981 105.828Z\",\n fill: \"#0B1B2D\"\n});\n\nvar _ref45 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M55.1565 234.849C79.8789 234.849 99.9204 214.8 99.9204 190.067C99.9204 165.335 79.8789 145.286 55.1565 145.286C30.4341 145.286 10.3926 165.335 10.3926 190.067C10.3926 214.8 30.4341 234.849 55.1565 234.849Z\",\n stroke: \"#0B1B2D\",\n strokeWidth: 16,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref46 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M214.844 234.849C239.566 234.849 259.608 214.8 259.608 190.067C259.608 165.335 239.566 145.286 214.844 145.286C190.122 145.286 170.08 165.335 170.08 190.067C170.08 214.8 190.122 234.849 214.844 234.849Z\",\n stroke: \"#0B1B2D\",\n strokeWidth: 16,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref47 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M215.543 184.731L174.878 110.426L171.431 112.314L212.096 186.619L215.543 184.731Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref48 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M192.568 144.377H97.499V147.083H192.568V144.377Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref49 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M99.5344 142.226L52.2168 187.194L55.537 190.69L102.855 145.723L99.5344 142.226Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref50 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M105.203 167.975C104.099 168.934 97.1729 175.39 97.1729 175.39L113.694 194.045L116.747 191.271L110.258 173.16L105.203 167.975Z\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref51 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M155.412 85.6814C160.506 92.1624 171.234 105.696 172.7 106.74C172.762 106.744 172.823 106.744 172.885 106.74C172.624 107.574 172.558 108.456 172.693 109.319C173.119 112.128 175.448 114.102 177.89 113.733C180.332 113.364 181.965 110.782 181.539 107.973C181.121 105.231 178.895 103.289 176.52 103.541C175.043 101.339 156.701 72.5239 156.048 71.3698C155.466 70.3434 154.34 62.5129 153.829 58.9758\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref52 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M150.155 44.4229C153.076 46.8022 155.306 54.7215 154.769 58.1378C153.066 60.1692 149.058 60.9362 146.782 60.8297\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref53 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M144.181 32.9486C147.532 35.4807 150.198 39.245 150.198 43.02C150.198 47.2815 148.778 53.4359 146.63 60.0661\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref54 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M138.267 80.8234C134.135 89.4316 130.024 96.005 127.894 96.5022C120.602 98.2175 97.5176 76.6968 97.5176 72.7762C97.5176 64.6545 124.852 29.8556 136.36 29.8556C136.716 29.8574 137.072 29.8811 137.425 29.9266\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref55 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M139.931 34.22C140.932 34.8557 141.968 35.3138 142.753 35.2854C143.296 34.4544 145 31.4997 146.281 29.6886\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref56 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M141.972 22.3409C140.604 24.957 139.084 27.491 137.421 29.93\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref57 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M141.162 40.7898C139.215 35.8543 136.552 31.2329 133.257 27.0748\",\n stroke: \"#0B1B2D\",\n strokeWidth: 4,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref58 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M98.8057 72.3392C104.358 74.4132 121.482 72.4848 133.967 69.7539\",\n stroke: \"#0B1B2D\",\n strokeWidth: 4,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref59 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M142.21 24.1841C141.888 22.6167 141.861 21.003 142.129 19.4254\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref60 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M162.43 16.1689C162.171 18.5259 161.416 20.8013 160.215 22.8453C156.665 29.0245 150.179 31.9685 145.767 29.4187C144.928 28.9315 144.202 28.2718 143.637 27.4833\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref61 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M143.158 13.7647C143.513 11.634 145.778 5.84897 149.211 4.05203C153.016 2.05267 155.405 3.40925 158.068 3.40925C160.46 3.40925 162.359 2.24444 164.997 2.4078C168.423 2.62087 168.852 6.01588 169.388 7.62461C170.098 9.75536 173.577 9.96844 175.171 14.0169C176.026 16.1938 171.852 20.4447 168.245 20.4447C166.137 20.4447 162.92 19.2372 161.98 18.669C162.178 17.8406 162.335 17.0026 162.448 16.1583C161.174 16.1583 153.286 14.578 152.643 14.6135C152.001 14.649 149.644 17.0426 149.427 17.5433C148.458 17.3803 147.5 17.1621 146.555 16.8899\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref62 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M143.989 19.7344C143.836 19.757 143.681 19.7688 143.527 19.7699C143.019 19.77 142.519 19.6417 142.074 19.3969C141.629 19.152 141.253 18.7987 140.981 18.3696C140.709 17.9405 140.55 17.4496 140.519 16.9425C140.487 16.4354 140.584 15.9285 140.801 15.4689C141.017 15.0094 141.346 14.612 141.758 14.3138C142.169 14.0156 142.649 13.8262 143.153 13.7632C143.657 13.7001 144.168 13.7655 144.64 13.9533C145.112 14.1411 145.529 14.4451 145.852 14.8372\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref63 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M146.374 50.4849C147.286 52.8287 147.847 54.9488 147.914 56.4652C146.661 58.4965 133.449 63.3795 130.768 62.9889C126.864 58.4965 122.174 37.2848 130.293 34.0034C130.737 33.8235 131.209 33.7191 131.688 33.6945\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref64 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M131.798 62.964C133.157 66.7994 136.544 76.8353 137.648 79.687C138.869 82.8476 157.052 106.677 159.852 108.981C160.009 109.028 160.158 109.059 160.307 109.095C159.844 110.193 159.697 111.398 159.884 112.575C160.357 115.693 162.881 117.902 165.518 117.494C168.156 117.085 169.909 114.241 169.423 111.123C168.997 108.324 166.92 106.272 164.592 106.151C162.817 101.953 150.623 75.3544 149.657 72.691C148.791 70.3187 146.796 61.3979 146.175 57.7756\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref65 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M104.39 189.109C103.751 190.426 99.9209 199.084 99.9209 199.084L122.463 209.738L124.177 205.988L111.092 191.9L104.39 189.109Z\",\n stroke: \"#0B1B2D\",\n strokeWidth: 2.5,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref66 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M55.1563 196.208C58.5461 196.208 61.294 193.459 61.294 190.067C61.294 186.676 58.5461 183.927 55.1563 183.927C51.7665 183.927 49.0186 186.676 49.0186 190.067C49.0186 193.459 51.7665 196.208 55.1563 196.208Z\",\n fill: \"#0B1B2D\"\n});\n\nvar _ref67 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M214.844 196.208C218.234 196.208 220.982 193.459 220.982 190.067C220.982 186.676 218.234 183.927 214.844 183.927C211.454 183.927 208.706 186.676 208.706 190.067C208.706 193.459 211.454 196.208 214.844 196.208Z\",\n fill: \"#0B1B2D\"\n});\n\nvar _ref68 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M127.893 96.5021C120.871 98.1534 99.2171 78.2699 97.6125 73.2875C94.091 76.4517 86.9629 85.5607 86.9629 95.419C86.9629 109.837 115.919 132.384 126.398 139.455C124.375 144.693 104.336 187.727 103.679 189.751C105.241 191.04 109.931 192.788 111.677 192.788C121.326 185.064 148.166 144.135 148.628 140.19C149.008 136.898 133.289 106.549 127.999 96.4524C127.965 96.4716 127.93 96.4882 127.893 96.5021Z\",\n fill: \"#0B1B2D\"\n});\n\nvar _ref69 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M131.06 93.5227C129.782 95.2451 128.685 96.314 127.865 96.5022C126.58 96.8041 124.805 96.385 122.753 95.4652C117.485 105.071 126.626 133.229 126.626 133.229C126.626 133.229 106.009 165.628 104.674 167.744C104.674 169.52 107.237 172.652 109.686 174.101C114.255 172.325 159.615 130.175 161.823 120.076C159.324 116.372 138.362 98.395 131.06 93.5227Z\",\n fill: \"#0B1B2D\"\n});\n\nvar _ref70 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M160.012 113.158L157.013 114.223L158.032 117.089L161.429 115.881C160.74 115.104 160.253 114.168 160.012 113.158Z\",\n fill: \"#0B1B2D\"\n});\n\nvar _ref71 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M181.539 107.987C181.573 108.229 181.593 108.474 181.6 108.718L186.701 106.907L185.682 104.052L180.733 105.81C181.147 106.473 181.421 107.214 181.539 107.987Z\",\n fill: \"#0B1B2D\"\n});\n\nvar _ref72 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M173.537 111.581C173.1 110.9 172.812 110.133 172.692 109.333C172.661 109.113 172.639 108.893 172.629 108.676L169.143 109.915C169.499 110.912 169.607 111.981 169.459 113.03L173.537 111.581Z\",\n fill: \"#0B1B2D\"\n});\n\nfunction SvgNotavailable(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 270,\n height: 251,\n viewBox: \"0 0 270 251\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10, _ref11, _ref12, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _ref19, _ref20, _ref21, _ref22, _ref23, _ref24, _ref25, _ref26, _ref27, _ref28, _ref29, _ref30, _ref31, _ref32, _ref33, _ref34, _ref35, _ref36, _ref37, _ref38, _ref39, _ref40, _ref41, _ref42, _ref43, _ref44, _ref45, _ref46, _ref47, _ref48, _ref49, _ref50, _ref51, _ref52, _ref53, _ref54, _ref55, _ref56, _ref57, _ref58, _ref59, _ref60, _ref61, _ref62, _ref63, _ref64, _ref65, _ref66, _ref67, _ref68, _ref69, _ref70, _ref71, _ref72);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgNotavailable);\nexport default __webpack_public_path__ + \"static/media/notavailable.274e4f98.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M269.97 117.824C269.034 86.0372 248.314 53.7649 220.257 41.9969C192.152 30.2847 156.785 39.0662 121.652 39.3596C117.209 39.398 112.769 39.2967 108.358 39.1221L105.381 41.3052L100.697 44.449L99.9987 39.1675L100.159 38.7169L99.6075 38.6854C101.668 44.8332 99.1045 53.9431 99.1045 57.4291C99.0922 58.0934 98.8572 58.7342 98.4373 59.249L98.9717 58.8997L99.2337 57.1322L99.8974 52.3083L100.317 49.8073L103.572 52.0813L109.412 60.4052L110.408 62.4661C118.791 67.9397 126.127 81.4963 126.127 83.7108C126.127 84.2104 125.624 84.9893 124.778 85.9324C125.854 87.3296 129.948 93.3482 130.563 94.7174C131.894 93.5822 174.631 57.754 175.333 57.2685C176.035 56.7829 177.251 56.8214 177.726 57.1427C178.111 57.3954 178.391 57.7806 178.511 58.2255C178.632 58.6703 178.585 59.1439 178.379 59.5564C178.002 60.255 172.689 64.9287 172.689 64.9287C173.122 65.4667 175.34 71.0905 172.5 73.7312C170.569 75.5301 168.379 76.1274 166.272 75.0166C164.875 76.5256 131.475 113.44 125.648 113.44C124.569 113.44 122.431 111.914 119.996 109.626L121.516 111.477C122.057 118.313 121.935 123.21 121.167 124.248C116.769 130.109 85.3034 134.828 72.2639 125.484C71.2544 124.765 70.4195 121.247 69.9724 116.098C63.4404 112.717 59.619 109.612 59.144 104.047C58.8436 100.394 62.8222 91.1231 63.4544 90.1974C62.5846 89.6141 61.9664 89.0936 61.7288 88.6849C60.2722 86.2224 67.7648 72.7776 76.5987 65.9522L76.3507 67.042C77.3167 64.64 78.4598 62.3131 79.7704 60.0804C76.7664 58.1941 74.8802 55.6477 74.8802 51.8892C74.8802 48.8851 76.5254 43.4325 77.5803 37.3825C58.9379 36.4848 42.1014 36.9354 29.3762 44.2289C7.06262 56.9855 -2.65854 90.7109 0.621436 119.637C3.84203 148.629 20.0009 172.923 34.8149 197.458C49.6324 222.05 62.9828 246.934 85.1742 260.683C107.425 274.501 138.457 277.254 164.571 267.358C190.629 257.462 211.825 234.918 231.851 207.976C251.936 181.003 270.851 149.677 269.97 117.824Z\",\n fill: \"#EDF0F4\"\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M70.0039 93.6626L70.2484 93.7954C70.2484 93.6591 70.2728 93.5194 70.2868 93.3832L70.21 93.7534L70.0039 93.6626Z\",\n fill: \"#EDF0F4\"\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M83.4032 61.7675L89.3414 62.3439L94.05 61.5859L95.0979 60.8663C93.108 61.6577 90.9902 62.0791 88.8489 62.1099C85.1218 62.1099 81.992 61.303 79.6517 59.8324L80.0429 60.3075L83.4032 61.7675Z\",\n fill: \"#EDF0F4\"\n});\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M72.2778 124.786C72.5049 129.365 72.2778 302.83 72.2778 302.83H84.3812L102.894 188.834\",\n fill: \"#081829\"\n});\n\nvar _ref6 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M63.4858 89.9844C62.8536 90.903 58.875 100.184 59.1754 103.838C59.6365 109.427 63.4719 112.518 70.0318 115.91\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref7 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M76.6407 65.7461C67.8067 72.5715 60.3142 86.0058 61.7673 88.4789C62.4659 89.6351 66.1091 91.6959 70.2624 93.5682\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref8 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M110.251 12.3689C113.192 16.7527 114.278 22.9948 112.72 29.3696C110.918 36.7399 106.056 42.3288 100.453 44.3163\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref9 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M121.558 110.779C122.099 117.614 121.977 122.512 121.208 123.549C116.814 129.41 85.3488 134.13 72.3058 124.786C68.5263 122.082 67.164 80.2388 79.6901 59.8149\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref10 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M100.048 49.4929C104.051 51.1836 107.495 55.8677 110.394 62.1098\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref11 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M72.2778 302.83V311.154H100.708V306.452L84.3813 302.83\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref12 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M100.708 301.345V311.154H130.483V307.339L112.371 301.345\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref13 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M124.604 85.4784C125.152 86.0652 129.931 93.0339 130.598 94.5219C131.929 93.3867 174.666 57.555 175.368 57.0694C176.07 56.5839 177.286 56.6258 177.761 56.9472C178.146 57.1992 178.425 57.5838 178.546 58.0281C178.666 58.4723 178.619 58.9453 178.414 59.3574C178.037 60.056 172.724 64.7297 172.724 64.7297C173.157 65.2711 175.372 70.8949 172.535 73.5357C170.6 75.3346 168.414 75.9319 166.304 74.8176C164.907 76.3301 131.509 113.241 125.683 113.241C122.986 113.241 113.733 103.751 109.566 96.6003\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref14 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M95.0735 69.7526C95.0735 81.2797 104.155 97.3477 107.299 97.3477C110.443 97.3477 126.162 85.8207 126.162 83.0262C126.162 80.2318 113.936 59.6228 103.457 59.6228C99.2651 59.6228 95.0735 64.1638 95.0735 69.7526Z\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref15 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M94.0291 23.6478C100.051 23.6932 110.984 11.8798 110.984 11.4222C110.984 10.3743 109.126 4.83777 98.343 4.83777C90.6408 4.83777 78.5199 10.231 78.5199 27.9443C78.5199 37.0646 74.9535 46.8068 74.9535 51.208C74.9535 57.8972 80.3468 62.1133 88.8593 62.1133C92.9707 62.1133 99.1534 60.0873 99.1534 56.7619C99.1534 51.8996 104.141 36.1006 94.6124 32.6599\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref16 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M95.7092 32.1779C95.1397 32.5493 94.475 32.7483 93.795 32.7508C91.6188 32.7508 89.8549 30.7108 89.8549 28.1923C89.8549 25.6738 91.6188 23.6514 93.795 23.6514C94.2013 23.651 94.6044 23.7219 94.9861 23.861\",\n stroke: \"#081829\",\n strokeWidth: 2.5,\n strokeMiterlimit: 10,\n strokeLinecap: \"round\"\n});\n\nvar _ref17 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M255.17 0H186.005V51.1313H255.17V0Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref18 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M220.586 124.639C236.849 124.639 250.032 111.455 250.032 95.1925C250.032 78.9297 236.849 65.7461 220.586 65.7461C204.323 65.7461 191.139 78.9297 191.139 95.1925C191.139 111.455 204.323 124.639 220.586 124.639Z\",\n fill: \"#E0E5EC\"\n});\n\nvar _ref19 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M72.2778 124.786C73.3406 125.325 74.3706 125.927 75.3622 126.588L79.6412 128.642L80.235 130.885L104.48 186.745L102.908 188.841\",\n fill: \"#081829\"\n});\n\nvar _ref20 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M121.208 123.549C117.247 128.831 91.301 133.183 76.6581 127.154L110.635 206.977L100.708 301.345H112.371C112.371 301.345 135.076 219.489 135.076 215.884C135.076 212.28 121.208 123.549 121.208 123.549Z\",\n fill: \"#081829\"\n});\n\nfunction SvgNotAllowed(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 270,\n height: 313,\n viewBox: \"0 0 270 313\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10, _ref11, _ref12, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _ref19, _ref20);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgNotAllowed);\nexport default __webpack_public_path__ + \"static/media/notAllowed.57f975c6.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M16 0H4C1.79086 0 0 1.79086 0 4V16C0 18.2091 1.79086 20 4 20H16C18.2091 20 20 18.2091 20 16V4C20 1.79086 18.2091 0 16 0Z\",\n fill: \"#0086C9\"\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M8.12927 14.179L4.3376 10.3873C4.1098 10.1595 4.1098 9.7902 4.3376 9.56238L5.16253 8.73742C5.39033 8.5096 5.7597 8.5096 5.9875 8.73742L8.54175 11.2916L14.0127 5.82075C14.2405 5.59295 14.6098 5.59295 14.8376 5.82075L15.6626 6.64571C15.8904 6.87351 15.8904 7.24285 15.6626 7.47067L8.95423 14.179C8.72641 14.4068 8.35706 14.4068 8.12927 14.179Z\",\n fill: \"white\"\n});\n\nfunction SvgChecked(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 20,\n height: 20,\n viewBox: \"0 0 20 20\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgChecked);\nexport default __webpack_public_path__ + \"static/media/checked.b5d24de9.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M4 0.5H16C17.933 0.5 19.5 2.067 19.5 4V16C19.5 17.933 17.933 19.5 16 19.5H4C2.067 19.5 0.5 17.933 0.5 16V4C0.5 2.067 2.067 0.5 4 0.5Z\",\n fill: \"white\",\n stroke: \"#CDD5DF\"\n});\n\nfunction SvgUnchecked(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 20,\n height: 20,\n viewBox: \"0 0 20 20\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgUnchecked);\nexport default __webpack_public_path__ + \"static/media/unchecked.bc2fa9d4.svg\";\nexport { ForwardRef as ReactComponent };","function _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\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M16 0H4C1.79086 0 0 1.79086 0 4V16C0 18.2091 1.79086 20 4 20H16C18.2091 20 20 18.2091 20 16V4C20 1.79086 18.2091 0 16 0Z\",\n fill: \"#0086C9\"\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M15.3571 8.75H4.64286C4.14983 8.75 3.75 9.12318 3.75 9.58333V10.4167C3.75 10.8768 4.14983 11.25 4.64286 11.25H15.3571C15.8502 11.25 16.25 10.8768 16.25 10.4167V9.58333C16.25 9.12318 15.8502 8.75 15.3571 8.75Z\",\n fill: \"white\"\n});\n\nfunction SvgUndeterminate(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 20,\n height: 20,\n viewBox: \"0 0 20 20\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgUndeterminate);\nexport default __webpack_public_path__ + \"static/media/undeterminate.f42039b4.svg\";\nexport { ForwardRef as ReactComponent };","import { SvgIcon } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { ReactComponent as IcursorIcon } from './I-cursor.svg';\r\nimport { ReactComponent as CheckIcon } from './check.svg';\r\nimport { ReactComponent as TimesIcon } from './times.svg';\r\nimport { ReactComponent as ChevronDownIcon } from './chevron-down.svg';\r\nimport { ReactComponent as ChevronUpIcon } from './chevron-up.svg';\r\nimport { ReactComponent as NotAvailableIcon } from './notavailable.svg';\r\nimport { ReactComponent as NotAllowedIcon } from './notAllowed.svg';\r\n\r\nimport { ReactComponent as CheckedIcon } from './checked.svg';\r\nimport { ReactComponent as UncheckedIcon } from './unchecked.svg';\r\nimport { ReactComponent as UndeterminateIcon } from './undeterminate.svg';\r\n\r\nexport function Search(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\nexport function ICursor(props) {\r\n return ;\r\n}\r\nexport function Check(props) {\r\n return ;\r\n}\r\nexport function Times(props) {\r\n return ;\r\n}\r\nexport function ChevronDown(props) {\r\n return (\r\n \r\n );\r\n}\r\nexport function ChevronUp(props) {\r\n return ;\r\n}\r\nexport function TableHeaderIcon(props) {\r\n return ;\r\n}\r\nexport function NotAvailableSVG(props) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport function NotAllowedSVG(props) {\r\n return (\r\n \r\n );\r\n}\r\nexport function Checked(props) {\r\n return ;\r\n}\r\nexport function Unchecked(props) {\r\n return ;\r\n}\r\nexport function Indeterminate(props) {\r\n return ;\r\n}\r\n","/**\r\n *\r\n * RoomTSPicker\r\n *\r\n */\r\n\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePickerProps,\r\n AutocompletePicker,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface RoomTSPickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/RoomFilter';\r\nexport const initRoomTSData = (id: string) => {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: new Condition('Id', ODataOperators.Equals, id).toString(),\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\n\r\n/* const loadData = (searchTerm: string | null) => {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name',\r\n $top: 1000,\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n}; */\r\n\r\nconst loadData = getAutoCompleteLoadDataFn>({ url });\r\n\r\nexport function RoomTSPicker(props: RoomTSPickerProps) {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * RoomTSFilter\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { RoomTSPicker } from 'app/components/pickers/AutocompletePickers/RoomTSPicker';\r\n\r\nexport const RoomTSFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined | null}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n ariaLabel={props.label}\r\n size=\"small\"\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default RoomTSFilter;\r\n","/**\r\n *\r\n * TrainingProgramPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompleteMultiPicker,\r\n AutocompleteMultiPickerProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPicker';\r\nimport { TrainingProgramAssetsDto } from 'app/pages/TrainingWaitingListPage/Actions/AddToWaitingList';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { IApplyGlobalServiceGroupFilter } from 'types/IApplyGlobalServiceGroupFilter';\r\n\r\nexport interface TrainingProgramsMultiPickerProps\r\n extends Omit, 'loadData'>,\r\n IApplyGlobalServiceGroupFilter {\r\n ServiceGroupId?: number;\r\n}\r\nconst url = '/api/odata/v4/TrainingProgramsFilter';\r\nexport const initTrainingProgramMultiData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const ids = initval.split('|').map(v => parseInt(v));\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id in (' + ids.map(v => \"'\" + v + \"'\").join(',') + '))',\r\n $select: 'Id,Name,ServiceGroupId',\r\n $skip: 0,\r\n $top: ids.length,\r\n };\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nexport function withServiceGroupFilter(\r\n globalServiceGroupFilter?: Identifiable[],\r\n) {\r\n return (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string; $select: string } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name,ServiceGroupId',\r\n };\r\n\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm === null ? undefined : searchTerm,\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n }).toString();\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n };\r\n}\r\nexport function TrainingProgramsMultiPicker(\r\n props: TrainingProgramsMultiPickerProps,\r\n) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const loadData = withServiceGroupFilter(\r\n props.applyGlobalServiceGroupFilter\r\n ? globalServiceGroupFilter || []\r\n : props.ServiceGroupId !== undefined\r\n ? [{ Id: props.ServiceGroupId }]\r\n : undefined,\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import { TrainingProgramsMultiPicker } from 'app/components/pickers/MultiSelectPickers/TrainingProgramsMultiPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const TrainingProgramsMultiFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity[]) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n []}\r\n isOpen={false}\r\n placeholder={t(translations.AllValues)}\r\n size=\"small\"\r\n ariaLabel={props.label}\r\n id={props.id}\r\n />\r\n );\r\n};\r\n","import { translations } from 'locales/translations';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { ITrainingSessionsRow } from './ITrainingSessionsRow';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { CampusPickerFilter } from 'app/components/BasicTable/Filters';\r\nimport { DatesRangeFilter } from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport { BuildingPickerFilter } from 'app/components/BasicTable/Filters/BuildingPickerFilter';\r\nimport {\r\n arrayToQueryString,\r\n GetBooleanEntity,\r\n GetBooleanOrUndefined,\r\n getDefaultFilterDatePeriod,\r\n getNumberEntityArray,\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n GetStringOrUndefined,\r\n initMultiPickerValue,\r\n initPickerValue,\r\n presetDatesRangeToQueryString,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { initCampusData } from 'app/components/pickers/AutocompletePickers/CampusPicker';\r\nimport { initBuildingData } from 'app/components/pickers/AutocompletePickers/BuildingPicker';\r\nimport { IsAssetFieldEnabled } from 'types/AppSettings';\r\nimport { AssetAttributes } from 'enums/AssetAttributes';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { initRoomTSData } from 'app/components/pickers/AutocompletePickers/RoomTSPicker';\r\nimport RoomTSFilter from 'app/components/BasicTable/Filters/RoomTSFilter';\r\nimport { TrainingProgramsMultiFilter } from 'app/components/BasicTable/Filters/TrainingProgramsMultiFilter';\r\nimport { initTrainingProgramMultiData } from 'app/components/pickers/MultiSelectPickers/TrainingProgramsMultiPicker';\r\nimport BooleanPickerFilter from 'app/components/BasicTable/Filters/BooleanPickerFilter';\r\nimport { IsEntityType } from 'app/components/BasicTable/BasicFilter/AppliedFilterComponent';\r\nimport { TrainingState } from 'enums/TrainingState';\r\nimport UserFilter from 'app/components/BasicTable/Filters/UserFilter';\r\nimport { initUserData } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\n\r\n//SG=&eqid=1&campus=&building=&room=&defaultSGids=AllCores&nextonly=false&period=5&Start=2021-11-01T00%3A00%3A00&End=2021-12-01T00%3A00%3A00&sSortCol_0=AssetId\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParams(search);\r\n const result: IFilterSettings[] = [\r\n {\r\n fieldName: 'ServiceId',\r\n displayName: t(translations.TrainingProgram),\r\n operator: ODataOperators.Includes,\r\n queryStringSerializer: arrayToQueryString('eqid'),\r\n value: getNumberEntityArray(params, 'eqid'),\r\n component: TrainingProgramsMultiFilter,\r\n initData: initMultiPickerValue(initTrainingProgramMultiData),\r\n urlKey: 'eqid',\r\n },\r\n {\r\n fieldName: 'StartDate',\r\n displayName: t(translations.CustomDatePeriods),\r\n operator: ODataOperators.Between,\r\n component: DatesRangeFilter,\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'period',\r\n 'start',\r\n 'end',\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'start', 'end', params),\r\n urlKey: 'period',\r\n },\r\n // hidden filter on the task https://prog4biz.atlassian.net/browse/BKT-8217, due to no relevant to the data source,\r\n // because a source is return only next sessions\r\n // {\r\n // fieldName: 'HasNextSession',\r\n // displayName: t(translations.HasNextSession),\r\n // operator: ODataOperators.Equals,\r\n // component: BooleanPickerFilter,\r\n // queryStringSerializer: 'HNS',\r\n // value: GetBooleanEntity(\r\n // GetBooleanOrUndefined(GetRawValue(params, 'HNS')),\r\n // t,\r\n // ),\r\n // customFilter(value, settings) {\r\n // if (IsEntityType(value) && value.Id === true) {\r\n // return new Condition(\r\n // settings.fieldName,\r\n // settings.operator,\r\n // value,\r\n // ).toString();\r\n // }\r\n // },\r\n // notNullable: true,\r\n // },\r\n {\r\n fieldName: 'TrainingState',\r\n displayName: t(translations.ShowOnlyWithAvailability),\r\n operator: ODataOperators.Includes,\r\n component: BooleanPickerFilter,\r\n queryStringSerializer: 'OWF',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'OWF')),\r\n t,\r\n ),\r\n customFilter(value, settings) {\r\n if (IsEntityType(value) && value.Id === true) {\r\n return new Condition(settings.fieldName, settings.operator, [\r\n TrainingState.Available,\r\n TrainingState.UnderMinimum,\r\n ]).toString();\r\n }\r\n },\r\n urlKey: 'OWF',\r\n },\r\n {\r\n fieldName: 'IsUpcoming',\r\n displayName: t(translations.UpcomingSessionsOnly),\r\n operator: ODataOperators.Equals,\r\n component: BooleanPickerFilter,\r\n queryStringSerializer: 'upcoming',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'upcoming')),\r\n t,\r\n ),\r\n customFilter(value, settings) {\r\n if (IsEntityType(value) && value.Id === true) {\r\n return new Condition(\r\n settings.fieldName,\r\n settings.operator,\r\n value,\r\n settings.fieldName1,\r\n ).toString();\r\n }\r\n },\r\n urlKey: 'upcoming',\r\n },\r\n {\r\n fieldName: 'Trainer',\r\n displayName: t(translations.TrainerName),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'trainer',\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'trainer')),\r\n ),\r\n component: UserFilter,\r\n initData: initPickerValue(initUserData),\r\n },\r\n ];\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Building)) {\r\n result.push({\r\n fieldName: 'BuildingId',\r\n displayName: t(translations.Building),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'building',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'building')),\r\n ),\r\n initData: initPickerValue(initBuildingData),\r\n component: BuildingPickerFilter,\r\n });\r\n }\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Room)) {\r\n result.push({\r\n fieldName: 'Room',\r\n displayName: t(translations.Room),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'room',\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'room')),\r\n ),\r\n initData: initPickerValue(initRoomTSData),\r\n component: RoomTSFilter,\r\n });\r\n }\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Campus)) {\r\n result.push({\r\n fieldName: 'CampusId',\r\n displayName: t(translations.Campus),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'campus',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'campus')),\r\n ),\r\n initData: initPickerValue(initCampusData),\r\n component: CampusPickerFilter,\r\n });\r\n }\r\n return result;\r\n};\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { IRequestTypeFilterDto } from 'api/odata/generated/entities/IRequestTypeFilterDto';\r\n\r\nexport interface ActiveSampleTypesPickerProps\r\n extends Omit, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/ActiveSampleTypesFilter';\r\n\r\nexport const initActiveSampleTypesData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url: url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'ServiceGroupId',\r\n 'HideProjects',\r\n 'ProjectIsRequired',\r\n ],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n isOptionalServiceGroup: true,\r\n });\r\n\r\nexport const loadActiveSampleTypes = loadData;\r\n\r\nexport function ActiveSampleTypesPicker(props: ActiveSampleTypesPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(\r\n props.predicates,\r\n globalServiceGroupFilter || [],\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface RelevantBudgetPickerProps\r\n extends Omit>, 'loadData'> {\r\n userGroupId: string;\r\n userName: string;\r\n serviceId?: number;\r\n}\r\n\r\nconst url = '/api/odata/v4/BudgetFilter';\r\n\r\nexport const RelevantBudgetPicker = (props: RelevantBudgetPickerProps) => {\r\n const loadData = (searchTerm: string | null) => {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select?: string;\r\n userGroupId?: string;\r\n userName?: string;\r\n serviceId?: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name,IsDefault',\r\n };\r\n params.userGroupId = props.userGroupId;\r\n params.userName = props.userName;\r\n params.serviceId = props.serviceId;\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n };\r\n return (\r\n \r\n );\r\n};\r\nexport const DefaultBudget = (\r\n userGroupId: string | null,\r\n userName: string,\r\n selectedBudget: Entity | null,\r\n serviceId?: number,\r\n): Promise | null> => {\r\n return new Promise((resolve, reject) => {\r\n (async () => {\r\n try {\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select?: string;\r\n userGroupId?: string;\r\n userName?: string;\r\n serviceId?: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name,IsDefault',\r\n };\r\n params.userGroupId = userGroupId ?? undefined;\r\n params.userName = userName;\r\n params.serviceId = serviceId;\r\n\r\n let budgets = await httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n if (!!budgets && budgets.length > 0) {\r\n if (selectedBudget !== null) {\r\n if (budgets.some(f => f.Id === selectedBudget.Id)) {\r\n resolve(selectedBudget);\r\n } else {\r\n if (budgets.length === 1) {\r\n resolve(budgets[0]);\r\n } else {\r\n let defaults = budgets.filter(\r\n f => (f as IBudgetFilterDto).IsDefault === true,\r\n );\r\n if (!!defaults && defaults.length > 0) {\r\n resolve(defaults[0]);\r\n } else {\r\n resolve(null);\r\n }\r\n }\r\n }\r\n } else {\r\n if (budgets.length === 1) {\r\n resolve(budgets[0]);\r\n } else {\r\n let defaults = budgets.filter(\r\n f => (f as IBudgetFilterDto).IsDefault === true,\r\n );\r\n if (!!defaults && defaults.length > 0) {\r\n resolve(defaults[0]);\r\n } else {\r\n resolve(null);\r\n }\r\n }\r\n }\r\n } else {\r\n resolve(null);\r\n }\r\n } catch {\r\n resolve(null);\r\n }\r\n })();\r\n });\r\n};\r\n","import * as React from 'react';\r\nimport { Box, Grid } from '@material-ui/core';\r\nimport { ServiceRequestsApi } from 'api/ServiceRequestsApi';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport {\r\n ActiveSampleTypesPicker,\r\n initActiveSampleTypesData,\r\n} from 'app/components/pickers/AutocompletePickers/ActiveSampleTypesPicker';\r\nimport {\r\n DefaultBudget,\r\n RelevantBudgetPicker,\r\n} from 'app/components/pickers/AutocompletePickers/RelevantBudgetPicker';\r\nimport { UserPicker } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n} from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\nimport { Alert, Skeleton } from '@material-ui/lab';\r\nimport {\r\n convertAuthToIUserFilterDto,\r\n IUserFilterDto,\r\n} from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { IRequestTypeFilterDto } from 'api/odata/generated/entities/IRequestTypeFilterDto';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IIsAdminOfParams } from 'types/AuthenticatedUser';\r\nimport { ServiceRequestDetailsProps } from 'app/pages/Samples/RequestSamplesPage';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { Roles } from 'app/slice/types';\r\n\r\nexport interface CreateNewRequestParams {\r\n isOpen: boolean;\r\n setOpen: (val: boolean) => void;\r\n serviceId?: number;\r\n error?: string;\r\n}\r\nexport const CreateNewRequest = ({\r\n isOpen,\r\n setOpen,\r\n serviceId,\r\n ...props\r\n}: CreateNewRequestParams) => {\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const appSettings = useSelector(selectAppSettings);\r\n const [error, setError] = React.useState(props.error);\r\n const [chosenUser, setChosenUser] = useState(\r\n authenticatedUser !== undefined\r\n ? convertAuthToIUserFilterDto(authenticatedUser)\r\n : null,\r\n );\r\n const [chosenBudget, setChosenBudget] = useAsyncExtendedState | null>(null);\r\n const [busy, setBusy] = useState(false);\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const [service, setService] = useAsyncExtendedState | null>(\r\n null,\r\n );\r\n\r\n const [getServiceRequest, getService] = usePromise(\r\n React.useCallback((serviceId?: number) => {\r\n return initActiveSampleTypesData(serviceId?.toString()).then(d => d[0]);\r\n }, []),\r\n );\r\n const isAdmin = React.useMemo(() => {\r\n return (\r\n authenticatedUser !== undefined &&\r\n authenticatedUser.IsAdminOf({\r\n ServiceTypeId: ServiceType.Sample,\r\n ServiceId: service?.Id,\r\n ServiceGroupId: (service as IRequestTypeFilterDto)?.ServiceGroupId,\r\n } as IIsAdminOfParams)\r\n );\r\n }, [authenticatedUser, service]);\r\n\r\n const isReadOnlyUser = React.useMemo(() => {\r\n return (\r\n authenticatedUser !== undefined &&\r\n (authenticatedUser.Roles.includes(Roles.CalendarOnly) ||\r\n authenticatedUser.Roles.includes(Roles.Readonly) ||\r\n authenticatedUser.Roles.includes(Roles.RoomOnly))\r\n );\r\n }, [authenticatedUser]);\r\n\r\n const showProject = React.useMemo(() => {\r\n return (\r\n service !== null &&\r\n service !== undefined &&\r\n IsModuleEnabled(appSettings, KnownModules.Budgets) &&\r\n ((IsModuleEnabled(appSettings, KnownModules.DisableBillingEvents) &&\r\n (service as IRequestTypeFilterDto).HideProjects === false &&\r\n (service as IRequestTypeFilterDto).ProjectIsRequired !== false) ||\r\n !IsModuleEnabled(appSettings, KnownModules.DisableBillingEvents))\r\n );\r\n }, [appSettings, service]);\r\n const projectIsRequired = React.useMemo(() => {\r\n return (\r\n service !== null &&\r\n service !== undefined &&\r\n IsModuleEnabled(appSettings, KnownModules.Budgets) &&\r\n (chosenBudget === null || chosenBudget === undefined) &&\r\n ((IsModuleEnabled(appSettings, KnownModules.DisableBillingEvents) &&\r\n (service as IRequestTypeFilterDto).HideProjects === false &&\r\n (service as IRequestTypeFilterDto).ProjectIsRequired === null) ||\r\n !IsModuleEnabled(appSettings, KnownModules.DisableBillingEvents))\r\n );\r\n }, [appSettings, chosenBudget, service]);\r\n const onUserChange = React.useCallback(\r\n (value: IUserFilterDto | null) => {\r\n if (showProject) {\r\n if (value === null || value === undefined) {\r\n setChosenBudget(null);\r\n } else {\r\n setChosenBudget(\r\n DefaultBudget(\r\n value.UserGroupId,\r\n value.Id,\r\n chosenBudget,\r\n service?.Id,\r\n ),\r\n );\r\n }\r\n }\r\n setChosenUser(value);\r\n },\r\n [chosenBudget, service?.Id, setChosenBudget, showProject],\r\n );\r\n React.useEffect(() => {\r\n if (projectIsRequired && chosenUser !== null) {\r\n setChosenBudget(\r\n DefaultBudget(chosenUser.UserGroupId, chosenUser.Id, null, service?.Id),\r\n );\r\n }\r\n }, [chosenUser, projectIsRequired, service?.Id, setChosenBudget]);\r\n\r\n React.useEffect(() => {\r\n if (\r\n getServiceRequest.status !== 'pending' &&\r\n getServiceRequest.status !== 'resolved'\r\n ) {\r\n setService(getService(serviceId));\r\n }\r\n }, [serviceId, getService, setService, getServiceRequest.status]);\r\n\r\n return (\r\n // TODO: switch to DialogForm with proper form schema & validation\r\n setOpen(false)}\r\n onConfirm={e => {\r\n e.preventDefault();\r\n setBusy(true);\r\n setError(undefined);\r\n //let user = chosenUser; //(isAdmin && chosenUser) || authenticatedUser;\r\n if (service && chosenUser) {\r\n ServiceRequestsApi.AddRequest(\r\n service?.Id,\r\n chosenBudget === null ? 0 : chosenBudget.Id,\r\n chosenUser?.Id,\r\n chosenUser?.UserGroupId ?? undefined,\r\n )\r\n .then(response => {\r\n setBusy(false);\r\n if (response.ErrorMessages.length > 0) {\r\n response.ErrorMessages.forEach(errmsg =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: errmsg,\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n const id = tryParseInt(response.SuccessMessages[0]);\r\n if (id === undefined) {\r\n console.error(\r\n 'Invalid service request id returned from the server',\r\n response,\r\n );\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: `${t(\r\n translations.Requests_Created_Failure,\r\n )}. (invalid service request id returned from the server).`,\r\n }),\r\n );\r\n } else {\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'success',\r\n message: t(translations.Requests_Created_Success),\r\n }),\r\n );\r\n setOpen(false);\r\n const propsSide: ServiceRequestDetailsProps = {\r\n id: id,\r\n useSidePanel: true,\r\n };\r\n dispatch(layoutActions.setRefreshTable(true));\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.ServiceRequestDetails,\r\n props: propsSide,\r\n expanded: true,\r\n }),\r\n );\r\n setService(null);\r\n setChosenBudget(null);\r\n //dispatch(push(GetServiceRequestDetailsPath(id)));\r\n }\r\n }\r\n })\r\n .catch(err => {\r\n setBusy(false);\r\n console.error(err);\r\n });\r\n }\r\n }}\r\n disabled={\r\n isReadOnlyUser ||\r\n !service ||\r\n (showProject && projectIsRequired && chosenBudget === null) ||\r\n busy\r\n }\r\n body={\r\n \r\n \r\n \r\n {error !== undefined && (\r\n \r\n {error}{' '}\r\n \r\n )}\r\n \r\n {getServiceRequest.status === 'pending' ? (\r\n \r\n ) : (\r\n {\r\n setService(val);\r\n setChosenBudget(null);\r\n }}\r\n label={t(translations.RequiredLabServiceLabel)}\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n {showProject && (\r\n \r\n setChosenBudget(val)}\r\n label={t(translations.PleaseSelectABudgetNumber)}\r\n placeholder={t(translations.PleaseSelectABudgetNumber)}\r\n disabled={!!!service}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n }\r\n title={t(translations.ServiceRequests_Ordering)}\r\n />\r\n );\r\n};\r\n","import { Theme } from '@material-ui/core';\r\nimport Popper, { PopperProps } from '@material-ui/core/Popper';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport interface SidePanelRootProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\nexport const SidePanelRoot = React.forwardRef(\r\n ({ className, children }: SidePanelRootProps, ref: any) => (\r\n
    \r\n {children}\r\n
    \r\n ),\r\n);\r\nexport const SidePanelPopper = styled(\r\n ({\r\n sidePanelWidth,\r\n theme,\r\n children,\r\n ...other\r\n }: {\r\n sidePanelWidth: number;\r\n theme: Theme;\r\n children: React.ReactNode;\r\n } & PopperProps) => {children},\r\n)`\r\n &.sidePanelPopper {\r\n z-index: ${props => props.theme.zIndex.modal};\r\n height: 100vh;\r\n border-left: 1px solid ${bookitColors.grayscale.grayBorders};\r\n &.rootopen {\r\n width: 100%;\r\n transform: unset;\r\n &.mobileroot {\r\n padding-top: 0px;\r\n }\r\n }\r\n &.rootclose {\r\n width: 100vw;\r\n &.mobileroot {\r\n inset-block: 50px auto;\r\n height: calc(100% - 50px);\r\n padding-top: 0px;\r\n }\r\n }\r\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\r\n &.rootclose {\r\n width: 100%;\r\n min-width: 600px;\r\n }\r\n }\r\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n &.rootclose {\r\n width: 100%;\r\n min-width: 370px;\r\n }\r\n }\r\n @media (min-width: ${props => props.theme.breakpoints.values.md}px) {\r\n &.rootclose {\r\n width: ${props => props.sidePanelWidth}px;\r\n }\r\n }\r\n & .paper {\r\n background: ${bookitColors.base.white};\r\n border-radius: 0;\r\n max-height: 100vh;\r\n height: auto;\r\n margin: 0;\r\n box-shadow: unset;\r\n }\r\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n & .paper {\r\n max-width: 100%;\r\n }\r\n }\r\n }\r\n`;\r\n","import { useTheme } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport clsx from 'clsx';\r\n\r\nimport { SidePanelRenderer } from './SidePanelRenderer';\r\nimport { PageTypeProps, RenderPageType } from '../../slice/type';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useLayoutSlice } from '../../slice';\r\nimport { SidePanelPopper, SidePanelRoot } from './wrappers';\r\n\r\nexport interface SidePanelPopupProps {\r\n renderPageType?: RenderPageType;\r\n renderPageProps?: PageTypeProps;\r\n sidePanelOpen: boolean;\r\n sidePanelExpanded: boolean;\r\n sidePanelWidth: number;\r\n}\r\n\r\nexport const SidePanelPopup = (props: SidePanelPopupProps) => {\r\n const { checkIsMobile } = useIsMobile();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const isMobile = checkIsMobile();\r\n const {\r\n renderPageType,\r\n renderPageProps,\r\n sidePanelOpen,\r\n sidePanelExpanded,\r\n sidePanelWidth,\r\n } = props;\r\n const elementRef = React.useRef(null);\r\n const closeSidePanel = React.useCallback(() => {\r\n dispatch(actions.resetSidePanel());\r\n }, [actions, dispatch]);\r\n // manually trigger rerender using a useless usState hook\r\n // this ensures that the popper is rendered only after the div is rendered and have provided the elementRef value to ancor the popper\r\n const countState = React.useState(0);\r\n React.useEffect(() => {\r\n countState[1](c => c + 1);\r\n // setCount (rerender) needs to occur after element elementRef.current value is bound\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementRef.current]);\r\n const theme = useTheme();\r\n return (\r\n \r\n \r\n {isMobile ? (\r\n // \r\n // {\r\n // if (ev.currentTarget.id === (ev.target as any).id && isMobile) {\r\n // closeSidePanel();\r\n // } else {\r\n // //ev.preventDefault();\r\n // }\r\n // }}\r\n // >\r\n \r\n {\r\n if (ev.currentTarget.id === (ev.target as any).id && isMobile) {\r\n closeSidePanel();\r\n } else {\r\n //ev.preventDefault();\r\n }\r\n }}\r\n >\r\n \r\n
    \r\n \r\n {renderPageType !== undefined &&\r\n renderPageProps !== undefined && (\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 {renderPageType !== undefined && renderPageProps ? (\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","import * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { SIDE_PANEL_WIDTH } from 'styles/constantVariables';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectPageType,\r\n selectPageTypeProps,\r\n selectSidePanelOpen,\r\n} from '../../slice/selectors';\r\nimport { PageTypeProps, RenderPageType } from '../../slice/type';\r\nimport { SidePanelPopup } from './SidePanelPopup';\r\n\r\nexport interface SidePanelProps {\r\n renderPageType?: RenderPageType;\r\n renderPageProps?: PageTypeProps;\r\n}\r\n\r\nexport function SidePanel(props: SidePanelProps) {\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const renderPageType = useSelector(selectPageType);\r\n const renderPageProps = useSelector(selectPageTypeProps);\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import {\r\n FilledInput as MuiFiledInput,\r\n FilledInputClassKey,\r\n //InputBase,\r\n //InputBaseClassKey,\r\n InputBaseProps,\r\n //InputClassKey,\r\n StandardProps,\r\n} from '@material-ui/core';\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\n\r\nexport interface FilledInputProps\r\n extends StandardProps {\r\n className?: string;\r\n fullWidth?: boolean;\r\n multiline?: boolean;\r\n noBorder?: boolean;\r\n disableUnderline?: boolean;\r\n}\r\nexport const FilledInput = React.forwardRef<\r\n React.HTMLAttributes,\r\n FilledInputProps\r\n>(function FilledInput(props, ref) {\r\n const {\r\n className,\r\n fullWidth = false,\r\n inputComponent = 'input',\r\n multiline = false,\r\n type = 'text',\r\n ...rest\r\n } = props;\r\n return (\r\n \r\n );\r\n});\r\nexport default FilledInput;\r\n","import * as Excel from 'exceljs';\r\nimport fileDownload from 'js-file-download';\r\n\r\nexport interface ColumnTemplate {\r\n key: string;\r\n name: string;\r\n customData?: (v: any) => string;\r\n}\r\n\r\nexport class ExportToExcel {\r\n book: Excel.Workbook;\r\n sheet: Excel.Worksheet;\r\n constructor(sheetName: string) {\r\n this.book = new Excel.Workbook();\r\n this.sheet = this.book.addWorksheet(sheetName);\r\n }\r\n public AddWorkBook(): Excel.Workbook {\r\n return new Excel.Workbook();\r\n }\r\n public AddWorkSheet(\r\n workBook: Excel.Workbook,\r\n sheetName: string,\r\n ): Excel.Worksheet {\r\n return workBook.addWorksheet(sheetName);\r\n }\r\n public SetWorkSheetHeader(columns: string[], workSheet?: Excel.Worksheet) {\r\n const sheet: Excel.Worksheet =\r\n workSheet !== undefined ? workSheet : this.sheet;\r\n sheet.columns = columns.map(e => ({\r\n header: e,\r\n key: e,\r\n width: 30,\r\n }));\r\n }\r\n public InitWorksheetHeader(n: number, workSheet?: Excel.Worksheet) {\r\n const sheet: Excel.Worksheet =\r\n workSheet !== undefined ? workSheet : this.sheet;\r\n var columns: { key: string; width: number }[] = [];\r\n for (let i = 0; i < n; i++) {\r\n columns.push({\r\n key: i.toString(),\r\n width: 30,\r\n });\r\n }\r\n sheet.columns = columns;\r\n }\r\n public AddWorkSheetHeader(columns: string[], workSheet?: Excel.Worksheet) {\r\n const sheet: Excel.Worksheet =\r\n workSheet !== undefined ? workSheet : this.sheet;\r\n sheet.addRow(columns);\r\n }\r\n public AddWorkSheetRow(workSheet?: Excel.Worksheet) {\r\n const sheet: Excel.Worksheet =\r\n workSheet !== undefined ? workSheet : this.sheet;\r\n sheet.addRow('');\r\n }\r\n public AddWorkSheetData(\r\n data: T[],\r\n columns?: ColumnTemplate[],\r\n workSheet?: Excel.Worksheet,\r\n ) {\r\n const sheet: Excel.Worksheet =\r\n workSheet !== undefined ? workSheet : this.sheet;\r\n if (data.length > 0) {\r\n // Add header\r\n if (columns !== undefined) {\r\n const columnNames = this.GetObjectNames(data[0], columns);\r\n this.AddWorkSheetHeader(columnNames, workSheet);\r\n }\r\n // Add rows\r\n data.forEach(e => {\r\n sheet.addRow(this.GetObjectValues(e, columns));\r\n });\r\n }\r\n }\r\n public SetWorkSheetData(\r\n data: T[],\r\n columns?: ColumnTemplate[],\r\n workSheet?: Excel.Worksheet,\r\n ) {\r\n if (data.length > 0) {\r\n // Add header\r\n const columnNames = this.GetObjectNames(data[0], columns);\r\n this.SetWorkSheetHeader(columnNames, workSheet);\r\n // Add rows\r\n this.AddWorkSheetData(data, columns, workSheet);\r\n }\r\n }\r\n public async ExportToExcel(\r\n fileName: string,\r\n workBook?: Excel.Workbook,\r\n ): Promise {\r\n const book: Excel.Workbook = workBook !== undefined ? workBook : this.book;\r\n try {\r\n return await book.xlsx\r\n .writeBuffer()\r\n .then(buffer => {\r\n fileDownload(buffer, fileName + '.xlsx');\r\n })\r\n .catch(err => {\r\n throw err;\r\n });\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n public GetObjectNames(obj: {}, columns?: ColumnTemplate[]): string[] {\r\n var result: string[];\r\n if (columns !== undefined) {\r\n result = columns.map(e => e.name);\r\n } else {\r\n result = Object.keys(obj).map(function (key) {\r\n return key;\r\n });\r\n }\r\n return result;\r\n }\r\n public GetObjectValues(obj: {}, columns?: ColumnTemplate[]) {\r\n var result: {}[];\r\n if (columns !== undefined) {\r\n result = columns.map(function (column) {\r\n if (column.customData !== undefined) {\r\n return column.customData(obj[column.key]);\r\n } else {\r\n return obj[column.key];\r\n }\r\n });\r\n } else {\r\n result = Object.keys(obj).map(function (key) {\r\n return obj[key];\r\n });\r\n }\r\n return result;\r\n }\r\n}\r\n","import { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { getIgnoredSearch, toURLSearchParams } from './withSavedHistory';\r\nimport { SAVEDVIEW_SEARCH_KEY } from 'app/components/BasicTable/BasicFilter/SavedListsDropDown';\r\n\r\n/**\r\n * Converts applied filters to search string\r\n * @param items applied filters\r\n * @param search current search\r\n * @param reservedQueryStringParameterNames reserved search params\r\n * @returns search\r\n */\r\nexport function getNextFilter(\r\n items: IFilterSettings[],\r\n search: string,\r\n reservedQueryStringParameterNames?: string[],\r\n) {\r\n // preserve the saved view value in addition to the reservedQueryStringParameterNames in order to preserve the selected saved view\r\n const ignore = [\r\n ...(reservedQueryStringParameterNames ?? []),\r\n SAVEDVIEW_SEARCH_KEY,\r\n ];\r\n\r\n const currentSearch = getIgnoredSearch(search, ignore);\r\n const filterSearch = toURLSearchParams(items);\r\n\r\n for (const key of filterSearch.keys()) {\r\n const filterValue = filterSearch.get(key);\r\n if (filterValue !== null) {\r\n currentSearch.set(key, filterValue);\r\n }\r\n }\r\n return currentSearch;\r\n}\r\n","import {\r\n BaseURLPicker,\r\n BaseURLPickerProps,\r\n} from 'app/components/BasicPickers/BaseURLPicker';\r\nimport { Entity } from 'types/common';\r\n\r\nconst url = '/api/odata/v4/InvoiceStatus';\r\nexport interface InvoiceStatusPickerProps\r\n extends Omit>, 'url'> {}\r\n\r\nexport const InvoiceStatusPicker = (props: InvoiceStatusPickerProps) => {\r\n return (\r\n \r\n );\r\n};\r\n","import MenuIcon from '@material-ui/icons/Menu';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport useExpandedSideBarState from 'app/hooks/useExpandedSideBarState';\r\n\r\nexport const OpenMenuButton = ({\r\n iconSize,\r\n}: {\r\n iconSize?: 'medium' | 'small';\r\n}) => {\r\n const { toggle } = useExpandedSideBarState();\r\n return (\r\n {\r\n toggle();\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n","import { CellProps, Renderer } from 'react-table';\r\nimport { UserProfileLink } from '../../components/UserProfileLink';\r\n\r\nconst UserRenderer: Renderer>> = ({\r\n value,\r\n row,\r\n}) => {\r\n if (value === null || value === undefined) {\r\n return <>;\r\n }\r\n return ;\r\n};\r\nexport default UserRenderer;\r\n","import { Check, CheckProps } from '../BasicInputs/Check';\r\nimport * as React from 'react';\r\nimport { InfoIcon } from '../BasicIcons/InfoIcon';\r\nimport FormControl from '../Forms/FormControls/FormControl';\r\nimport FormControlLabel from '../Forms/FormControls/FormControlLabel';\r\nimport FormHelperText from '../Forms/FormControls/FormHelperText';\r\nimport clsx from 'clsx';\r\nimport FormGroup from '../Forms/FormControls/FormGroup';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\n\r\nexport interface BasicCheckBoxProps\r\n extends Omit {\r\n label?: string;\r\n error?: string;\r\n helperText?: string;\r\n info?: React.ReactNode;\r\n fullWidth?: boolean;\r\n name?: string;\r\n boxed?: boolean;\r\n maxLabelWidth?: string | number;\r\n onChange?: (\r\n value: boolean,\r\n event: React.ChangeEvent,\r\n ) => void;\r\n}\r\n\r\nexport function BasicCheckBox(props: BasicCheckBoxProps) {\r\n // const StyledInfo = styled(InfoIcon)(({ theme }) => ({\r\n // marginLeft: theme.spacing(1),\r\n // }));\r\n const {\r\n label,\r\n error,\r\n helperText,\r\n info,\r\n name,\r\n onChange,\r\n boxed,\r\n fullWidth,\r\n maxLabelWidth = 25,\r\n ...other\r\n } = props;\r\n // const LabelWithInfo = () => {\r\n // return (\r\n // \r\n // {label}\r\n // {info && }\r\n // \r\n // );\r\n // };\r\n const [isChecked, setIsChecked] = React.useState(\r\n props.checked ?? false,\r\n );\r\n const handleChange = (event: React.ChangeEvent) => {\r\n const value = event.target.checked as boolean;\r\n if (onChange !== undefined) {\r\n onChange(value, event);\r\n }\r\n setIsChecked(value);\r\n };\r\n const withInfoLabel = React.useMemo(() => {\r\n return !!label && label.length > maxLabelWidth;\r\n }, [label, maxLabelWidth]);\r\n const Label = withInfoLabel ? (\r\n {label}}>\r\n {label}\r\n \r\n ) : (\r\n {label}\r\n );\r\n const baseLabelStyle: React.CSSProperties = React.useMemo(() => {\r\n return withInfoLabel\r\n ? { maxWidth: `${maxLabelWidth}ch`, gap: 12 }\r\n : { gap: 12 };\r\n }, [maxLabelWidth, withInfoLabel]);\r\n return (\r\n \r\n \r\n \r\n }\r\n />\r\n {info && }\r\n \r\n {((!!error && error !== '') || (!!helperText && helperText !== '')) && (\r\n \r\n {error || helperText}\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import {\r\n List,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n ListSubheader,\r\n} from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { TFunctionKeys } from 'i18next';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n getViewLength,\r\n getViewType,\r\n viewLengthOptions,\r\n ViewLengths,\r\n viewTypeOptions,\r\n ViewTypes,\r\n} from '../../slice/types';\r\n\r\nexport interface ViewTypeLengthDropDownProps {\r\n viewType: ViewTypes;\r\n viewLength: ViewLengths;\r\n onTypeLengthChange: (\r\n type: ViewTypes,\r\n length: ViewLengths,\r\n value?: Date,\r\n ) => void;\r\n size?: 'small' | 'large' | 'medium';\r\n /**\r\n * Limit display to a subset of possible options. E.g. options={['day', 'week']} to show only day/week options without the month\r\n */\r\n lengthOptions?: Array;\r\n /**\r\n * Optional show only icons on mobile\r\n */\r\n compact?: boolean;\r\n disabled?: boolean;\r\n haideCalendarViewType?: boolean;\r\n twoDaysEnabled?: boolean;\r\n customDaysEnabled?: boolean;\r\n customDays?: number;\r\n customTimelineDays?: number;\r\n customCalendarDays?: number;\r\n}\r\n\r\nexport function ViewTypeLengthDropDown(props: ViewTypeLengthDropDownProps) {\r\n const {\r\n viewType,\r\n viewLength,\r\n onTypeLengthChange,\r\n lengthOptions = ['day', 'week', 'month'],\r\n compact,\r\n size = 'medium',\r\n disabled,\r\n haideCalendarViewType,\r\n customDays,\r\n customTimelineDays,\r\n customCalendarDays,\r\n } = props;\r\n const { t } = useTranslation();\r\n const { newDate } = useSystemDate();\r\n const titletext = React.useMemo(() => {\r\n if (compact) {\r\n return t(getViewLength(viewLength)?.shortName as TFunctionKeys).replace(\r\n '{0}',\r\n !!customDays ? customDays.toString() : '',\r\n );\r\n } else {\r\n return `${t(getViewType(viewType)?.Name as TFunctionKeys)} by ${t(\r\n getViewLength(viewLength)?.Name as TFunctionKeys,\r\n ).replace('{0}', !!customDays ? customDays.toString() : '')}`;\r\n }\r\n }, [compact, customDays, t, viewLength, viewType]);\r\n const itemText = React.useCallback(\r\n (type: Entity, length: Entity) => {\r\n if (type.Id === 'calendar') {\r\n if (length.Id === 'customPeriod') {\r\n if (!!customCalendarDays && customCalendarDays > 0) {\r\n return t(length.Name as TFunctionKeys).replace(\r\n '{0}',\r\n customCalendarDays.toString(),\r\n );\r\n } else {\r\n return 'Custom';\r\n }\r\n } else {\r\n return t(length.Name as TFunctionKeys);\r\n }\r\n } else {\r\n if (length.Id === 'customdays') {\r\n return t(length.Name as TFunctionKeys).replace(\r\n '{0}',\r\n !!customDays ? customDays.toString() : '',\r\n );\r\n } else if (length.Id === 'customPeriod') {\r\n if (!!customTimelineDays && customTimelineDays > 0) {\r\n return t(length.Name as TFunctionKeys).replace(\r\n '{0}',\r\n customTimelineDays.toString(),\r\n );\r\n } else {\r\n return 'Custom';\r\n }\r\n } else {\r\n return t(length.Name as TFunctionKeys);\r\n }\r\n }\r\n },\r\n [customCalendarDays, customDays, customTimelineDays, t],\r\n );\r\n const handleChange = (\r\n type: Entity | null,\r\n length: Entity | null,\r\n ) => {\r\n if (type === null || length === null) {\r\n return;\r\n }\r\n onTypeLengthChange(\r\n type.Id,\r\n length.Id,\r\n length.Id === 'customdays' ? newDate() : undefined,\r\n );\r\n };\r\n\r\n return (\r\n \r\n }\r\n addChevron\r\n menuChildren={onClose => [\r\n ...viewTypeOptions\r\n .filter(\r\n f =>\r\n !haideCalendarViewType ||\r\n (haideCalendarViewType === true && f.Id === 'timeline'),\r\n )\r\n .map((vt, index) => {\r\n return (\r\n \r\n \r\n {t(vt.Name as TFunctionKeys)}\r\n \r\n \r\n }\r\n >\r\n {viewLengthOptions\r\n .filter(f => {\r\n if (compact) {\r\n return vt.Id === 'timeline'\r\n ? f.Id !== 'month' &&\r\n f.Id !== 'customdays' &&\r\n lengthOptions.includes(f.Id)\r\n : f.Id !== 'twodays' &&\r\n f.Id !== 'customdays' &&\r\n f.Id !== 'quarter' &&\r\n f.Id !== 'year' &&\r\n lengthOptions.includes(f.Id);\r\n } else {\r\n return vt.Id === 'timeline'\r\n ? lengthOptions.includes(f.Id)\r\n : f.Id !== 'customdays' &&\r\n f.Id !== 'twodays' &&\r\n f.Id !== 'quarter' &&\r\n f.Id !== 'year' &&\r\n lengthOptions.includes(f.Id);\r\n }\r\n })\r\n .map(vl => {\r\n return (\r\n {\r\n handleChange(vt, vl);\r\n onClose();\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 {titletext}\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { MenuItem } from '@material-ui/core';\r\n\r\nexport interface ExportToPDFProps {\r\n onClick: () => void;\r\n}\r\n\r\nexport function ExportToPDF(props: ExportToPDFProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n return (\r\n \r\n \r\n {t(translations.ExportToPDF)}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * DatePickerFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { IFilterComponentProps } from 'app/components/BasicTable/Filters/IFilterComponentProps';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport { BookitDatePicker } from 'app/components/BookitDatePicker';\r\n\r\n/**\r\n * Date picker to be used as a BasicTable filter component\r\n */\r\nexport const DatePickerFilter = (props: IFilterComponentProps) => {\r\n const [value, setValue] = React.useState(\r\n props.value,\r\n );\r\n const handleOnChange = (value: MaterialUiPickersDate | null) => {\r\n props.onChange(value == null ? null : new CustomDate(value, 'date'));\r\n setValue(value);\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default DatePickerFilter;\r\n","/**\r\n *\r\n * TextFieldFilter\r\n *\r\n */\r\nimport { TextControlField } from 'app/components/BasicInputs/TextControlField';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { debounce } from 'lodash';\r\n\r\nexport const TextFieldFilter = (props: IFilterComponentProps) => {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [value, setValue] = React.useState(props.value);\r\n const onChange = React.useCallback(value => props.onChange(value), [props]);\r\n const debouncedOnChange = React.useMemo(() => debounce(onChange, 250), [\r\n onChange,\r\n ]);\r\n const handleChange: React.ChangeEventHandler<\r\n HTMLInputElement | HTMLTextAreaElement\r\n > = event => {\r\n setValue(event.target.value);\r\n debouncedOnChange(event.target.value);\r\n };\r\n\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default TextFieldFilter;\r\n","import { isEmptyOrWhitespace } from 'utils/typeUtils';\r\nimport { SavedViewSelected } from '../SavedViewsPage/SavedViewPage/slice/types';\r\n\r\nexport function MyListFilter(search: string, selectedView: SavedViewSelected) {\r\n const result = isEmptyOrWhitespace(search)\r\n ? new URLSearchParams()\r\n : new URLSearchParams(search);\r\n result.set('eid', selectedView.ids || '');\r\n const res = result.toString();\r\n return isEmptyOrWhitespace(res) ? undefined : res;\r\n}\r\n","import { BasicTable, BasicTableProps } from 'app/components/BasicTable';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { IDocumentsDirectoryRow } from './IDocumentsDirectoryRow';\r\nimport React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport function DocumentsTable<\r\n TProps extends Omit<\r\n BasicTableProps,\r\n 'api' | 'additionalColumns' | 'searchColumns' | 'screenName'\r\n >\r\n>({ initialState, rowActions, screenId, serviceGroups, ...props }: TProps) {\r\n const { t } = useTranslation();\r\n const newProps = React.useMemo(() => {\r\n const p = { ...props };\r\n Reflect.deleteProperty(p, 'api');\r\n return p;\r\n }, [props]);\r\n const url = '/api/odata/v4/Documents';\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","import { H3 } from 'app/components/Typography';\r\nimport { H4 } from 'app/components/Typography';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { FlexRowDiv } from 'app/components/basic/Wrappers/FlexWrappers/flexRow';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport React from 'react';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\n\r\nexport interface NoTableDataProps {\r\n id?: string;\r\n shortView?: boolean;\r\n}\r\nexport function NoTableData(props: NoTableDataProps) {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n \r\n {props.shortView ? (\r\n \r\n \r\n {t(translations.dash_EmptyWidgetTitle) as string}\r\n \r\n \r\n {t(translations.dash_EmptyWidgetBody) as string}\r\n \r\n \r\n ) : (\r\n \r\n

    {t(translations.dash_EmptyWidgetTitle) as string}

    \r\n

    {t(translations.dash_EmptyWidgetBody) as string}

    \r\n
    \r\n )}\r\n
    \r\n
    \r\n );\r\n}\r\n","import { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Alert, AlertProps } from '@material-ui/lab';\r\n\r\nexport interface TableErrorProps extends Pick {}\r\nexport function TableError(props: TableErrorProps) {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n {t(translations.LoadingFailed)}\r\n \r\n );\r\n}\r\n","import { CellProps, Renderer } from 'react-table';\r\nimport { Description } from 'app/components/Description';\r\nimport { BooleanRender } from '../../components/BooleanRender';\r\n\r\n/**\r\n * Type of the record to reference. Record will work for all cases, but can be substituted for specific type if needed.\r\n */\r\ntype recordType = Record;\r\nconst DefaultRenderer: Renderer> = props => {\r\n const value = props.value;\r\n if (value === null || value === undefined) {\r\n return null;\r\n } else if (typeof value === 'string') {\r\n return ;\r\n } else if (typeof value === 'boolean') {\r\n return BooleanRender(props);\r\n }\r\n //TODO: add default renderers for other common types here\r\n else {\r\n return <>{String(value)};\r\n }\r\n};\r\nexport default DefaultRenderer;\r\n","import { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { IDocumentsDirectoryRow } from './IDocumentsDirectoryRow';\r\nimport { GlobalSettings } from 'utils/globalSettings';\r\nimport AssetRenderer from 'app/components/BasicTable/CellRenderers/AssetRenderer';\r\nimport { Link } from 'app/components/ExternalLink';\r\n\r\nconst Available = val => {\r\n if (val === true) {\r\n return translations.StaffUsersFiles;\r\n }\r\n if (val === false) {\r\n return translations.StaffOnlyFiles;\r\n }\r\n return translations.PublicFiles;\r\n};\r\n\r\nexport const getColumns = (\r\n t: TFunction,\r\n appSettings?: AppSettings,\r\n globalSettings?: GlobalSettings,\r\n): Column[] => {\r\n return [\r\n {\r\n Header: t(translations.FileName) as string,\r\n accessor: 'FileName',\r\n //check if the link should be avalibale or not\r\n //logick not finale\r\n Cell: ({ value, row }) => {\r\n if (\r\n Available(row.original.AvailableToUsers) ===\r\n translations.StaffOnlyFiles &&\r\n !row.original.IsAdmin\r\n ) {\r\n return <>{value};\r\n }\r\n return (\r\n <>\r\n \r\n {value}\r\n \r\n \r\n );\r\n },\r\n },\r\n {\r\n Header: t(translations.Title) as string,\r\n accessor: 'Title',\r\n },\r\n {\r\n Header: t(translations.Description) as string,\r\n accessor: 'Description',\r\n },\r\n {\r\n Header: t(translations.DocumentType) as string,\r\n accessor: 'DocumentType',\r\n },\r\n {\r\n Header: t(translations.FileType) as string,\r\n accessor: 'FileType',\r\n },\r\n {\r\n Header: t(translations.ServiceGroup) as string,\r\n accessor: 'ServiceGroup',\r\n },\r\n {\r\n Header: t(translations.AssetName) as string,\r\n accessor: 'AssetName',\r\n Cell: AssetRenderer,\r\n },\r\n {\r\n Header: t(translations.AvailableToUsers) as string,\r\n accessor: 'AvailableToUsers',\r\n\r\n Cell: ({ row }) => <>{t(Available(row.original.AvailableToUsers))},\r\n },\r\n ];\r\n};\r\n","import { TFunction } from 'i18next';\r\nimport { Column } from 'react-table';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { GlobalSettings } from 'utils/globalSettings';\r\nimport { ITrainingSessionsRow } from './ITrainingSessionsRow';\r\nimport DateTimeRenderer from 'app/components/BasicTable/CellRenderers/DateTimeRenderer';\r\nimport { translations } from 'locales/translations';\r\nimport UsedSlotsRenderer from 'app/components/BasicTable/CellRenderers/UsedSlotsRenderer';\r\nimport AssetRenderer from 'app/components/BasicTable/CellRenderers/AssetRenderer';\r\nimport TrainingStateRenderer from 'app/components/BasicTable/CellRenderers/TrainingStateRenderer';\r\n\r\ntype RowType = ITrainingSessionsRow;\r\nexport const getColumns = (\r\n t: TFunction,\r\n appSettings?: AppSettings,\r\n globalSettings?: GlobalSettings,\r\n): Column[] => {\r\n return [\r\n {\r\n Header: t(translations.Signups) as string,\r\n accessor: 'TrainingState',\r\n Cell: TrainingStateRenderer,\r\n },\r\n {\r\n Header: t(translations.TrainingResource) as string,\r\n accessor: 'AssetName',\r\n Cell: AssetRenderer,\r\n },\r\n // {\r\n // Header: t(translations.NextAvailableSession) as string,\r\n // accessor: 'NextSession',\r\n // Cell: NextSessionRenderer,\r\n // },\r\n // {\r\n // Header: t(translations.AllUpcomingSessions) as string,\r\n // accessor: 'AllUpcomingSessions',\r\n // Cell: AllUpcomingSessionsAssetRenderer,\r\n // },\r\n {\r\n Header: t(translations.DurationH) as string,\r\n accessor: 'Duration',\r\n },\r\n {\r\n Header: t(translations.Campus) as string,\r\n accessor: 'Campus',\r\n },\r\n {\r\n Header: t(translations.Building) as string,\r\n accessor: 'Building',\r\n },\r\n {\r\n Header: t(translations.Room) as string,\r\n accessor: 'Room',\r\n },\r\n {\r\n Header: t(translations.MinimumAttendance) as string,\r\n accessor: 'MinAttendance',\r\n },\r\n {\r\n Header: t(translations.MaximumAttendance) as string,\r\n accessor: 'MaxAttendance',\r\n },\r\n {\r\n Header: t(translations.TotalUsedSlots) as string,\r\n accessor: 'TotalUsedSlots',\r\n Cell: UsedSlotsRenderer,\r\n },\r\n {\r\n Header: t(translations.RemainedSlots) as string,\r\n accessor: 'RemainedSlots',\r\n },\r\n {\r\n Header: t(translations.ServiceGroup) as string,\r\n accessor: 'ServiceGroup',\r\n },\r\n {\r\n Header: t(translations.HashSymbol) as string,\r\n accessor: 'Id',\r\n },\r\n {\r\n Header: t(translations.Remarks) as string,\r\n accessor: 'Remarks',\r\n },\r\n {\r\n Header: t(translations.StartTime) as string,\r\n accessor: 'StartDate',\r\n Cell: DateTimeRenderer,\r\n },\r\n {\r\n Header: t(translations.EndTime) as string,\r\n accessor: 'EndDate',\r\n Cell: DateTimeRenderer,\r\n },\r\n {\r\n Header: t(translations.TrainerName) as string,\r\n accessor: 'TrainerName',\r\n },\r\n ];\r\n};\r\n","import { ExternalLink } from 'app/components/ExternalLink';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { ITrainingSessionsRow } from 'app/pages/TrainingSessionsPage/ITrainingSessionsRow';\r\nimport { CellProps, Renderer } from 'react-table';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\ntype RecordType = ITrainingSessionsRow;\r\nconst UsedSlotsRenderer: Renderer> = ({\r\n value,\r\n row: { original },\r\n}) => {\r\n const { newDate } = useSystemDate();\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n};\r\nexport default UsedSlotsRenderer;\r\n","import { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { ITrainingSessionsRow } from 'app/pages/TrainingSessionsPage/ITrainingSessionsRow';\r\nimport { ReservationLinkAction } from 'app/pages/TrainingSessionsPage/RowActions/ReservationLink';\r\nimport React from 'react';\r\nimport { CellProps, Renderer } from 'react-table';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\ntype RecordType = ITrainingSessionsRow;\r\nconst TrainingStateRenderer: Renderer> = ({\r\n value,\r\n row,\r\n}) => {\r\n const { newDate, getOffsetDate } = useSystemDate();\r\n const hasNextSession =\r\n getOffsetDate(row.original.StartDate) > dateUtils.truncateTime(newDate());\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\nexport default TrainingStateRenderer;\r\n","import { SizeProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { Box } from '@material-ui/core';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport useSidePanelState, {\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { ReservationDetailsProps } from 'app/pages/ReservationDetails/Details';\r\nimport { ReservationQueryStringParameters } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { TrainingState } from 'enums/TrainingState';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { buildURL } from 'utils/url-utils';\r\n\r\nexport interface ReservationLinkProps {\r\n Id: number | null;\r\n HasNextSession: boolean;\r\n TrainingState: number;\r\n hasReservation: boolean;\r\n myReservationId: number | null;\r\n ServiceId: number | null;\r\n NextSession: Date | null;\r\n EndDate: Date | null;\r\n StartDate: Date | null;\r\n iconsize?: SizeProp;\r\n asLinkRendered?: boolean;\r\n}\r\nexport const ReservationLinkAction = React.forwardRef<\r\n any,\r\n ReservationLinkProps\r\n>(function ReservationLinkAction(props, ref) {\r\n const { t } = useTranslation();\r\n const { openPanel } = useSidePanelState();\r\n const user = useSelector(selectAuthenticatedUser);\r\n const isMobile = DetectIsMobile();\r\n //const item = props.row;\r\n //const hasSession = props.HasNextSession;\r\n\r\n const state = props.TrainingState as TrainingState;\r\n const params = (props.hasReservation\r\n ? {\r\n id: String(props.myReservationId),\r\n }\r\n : {\r\n selectedIds: String(props.ServiceId),\r\n tsid: String(props.Id),\r\n Start: dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(props.StartDate ?? new Date()),\r\n ),\r\n End: dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(props.EndDate ?? new Date()),\r\n ),\r\n un: user?.Id,\r\n }) as ReservationQueryStringParameters;\r\n\r\n const url = buildURL('/reservations/details', params);\r\n return props.HasNextSession ? (\r\n \r\n openPanel({\r\n renderPageType: RenderPageType.ReservationDetails,\r\n renderPageProps: {\r\n queryParams: params,\r\n useSidePanel: true,\r\n } as ReservationDetailsProps,\r\n expanded: false,\r\n useSidePanel: false,\r\n isCover: false,\r\n } as SidePanelOpenState)\r\n }\r\n aria-label=\"Session Indicator\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n {'N/A'}\r\n );\r\n});\r\n","import React from 'react';\r\nimport { BasicTable, BasicTableProps } from 'app/components/BasicTable';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ITrainingSessionsRow } from './ITrainingSessionsRow';\r\nimport { translations } from 'locales/translations';\r\n\r\ntype RowType = ITrainingSessionsRow;\r\n\r\nexport function TrainingSessionsTable<\r\n TProps extends Omit<\r\n BasicTableProps,\r\n 'api' | 'additionalColumns' | 'searchColumns' | 'screenName'\r\n >\r\n>({\r\n initialState,\r\n rowActions,\r\n serviceGroups,\r\n savedListSettings,\r\n ...props\r\n}: TProps) {\r\n const { t } = useTranslation();\r\n const newProps = React.useMemo(() => {\r\n const p = { ...props };\r\n Reflect.deleteProperty(p, 'api');\r\n return p;\r\n }, [props]);\r\n const url = '/api/odata/v4/TrainingSessions';\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","import { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport { BasicTable, BasicTableProps } from 'app/components/BasicTable';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { getColumns } from './Columns';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { SidePanelOpenState } from 'app/hooks/useSidePanelOpen';\r\n\r\nexport function ArticlesTable<\r\n TProps extends Omit<\r\n BasicTableProps,\r\n 'api' | 'additionalColumns' | 'searchColumns' | 'columns' | 'screenName'\r\n > & {\r\n useSidePanel?: boolean;\r\n openPanel?: (state: SidePanelOpenState) => void;\r\n }\r\n>({\r\n initialState,\r\n rowActions,\r\n screenId,\r\n serviceGroups,\r\n predicates,\r\n useSidePanel,\r\n openPanel,\r\n ...props\r\n}: TProps) {\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const globalSettings = useSelector(selectglobalSettings);\r\n const columns = React.useMemo(\r\n () =>\r\n getColumns(t, authenticatedUser, globalSettings, useSidePanel, openPanel),\r\n [authenticatedUser, globalSettings, openPanel, t, useSidePanel],\r\n );\r\n // add custom global service grups filter since the Article is connected to the service groups through Assets property and does not have ServiceGroupId property used in the basic table filtering\r\n const globalServiceGroupsFilter = React.useMemo(\r\n () =>\r\n serviceGroups !== undefined && serviceGroups.length > 0\r\n ? [\r\n `Assets/any(a: a/Availability/Id eq ${\r\n AvailabilityTypes.ServiceGroup\r\n } and a/ServiceGroupId in (${serviceGroups\r\n .map(f => f.Id)\r\n .join(',')}))`,\r\n ]\r\n : undefined,\r\n [serviceGroups],\r\n );\r\n const newPredicates = React.useMemo(() => {\r\n if (predicates !== undefined && predicates.length > 0) {\r\n const externalPredicates = predicates\r\n .map(p => p.toString())\r\n .filter(r => r !== undefined) as string[];\r\n if (globalServiceGroupsFilter !== undefined) {\r\n globalServiceGroupsFilter.push(...externalPredicates);\r\n return globalServiceGroupsFilter;\r\n } else {\r\n return externalPredicates;\r\n }\r\n } else return globalServiceGroupsFilter;\r\n }, [globalServiceGroupsFilter, predicates]);\r\n const newProps = React.useMemo(() => {\r\n const p = { ...props };\r\n Reflect.deleteProperty(p, 'api');\r\n Reflect.deleteProperty(p, 'columns');\r\n return p;\r\n }, [props]);\r\n const url = '/api/odata/v4/articles';\r\n return (\r\n <>\r\n `Authors/any(a:contains(a, ${s}))`,\r\n // 'Doi',\r\n // 'ISSN',\r\n 'Journal',\r\n //'ORCIDs',\r\n //'ArticleContributionLevelId',\r\n //'Assets',\r\n s => `Assets/any(a:contains(a/Name, ${s}))`,\r\n 'ExternalIdSource',\r\n ]}\r\n screenName={t(translations.Publications)}\r\n serviceGroups={serviceGroups}\r\n predicates={newPredicates}\r\n {...(newProps as TProps)}\r\n />\r\n \r\n );\r\n}\r\n","import { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { PrimaryActionDynamic } from 'app/components/BasicTable/components/TableCard/PrimaryAction';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport { ArticleDetailsProps } from './ArticleDetails';\r\n\r\nexport const articlePrimaryAction: PrimaryActionDynamic = (\r\n openPanel,\r\n row,\r\n toggle,\r\n user,\r\n useSidePanel,\r\n) => {\r\n openPanel({\r\n renderPageType: RenderPageType.Article,\r\n renderPageProps: {\r\n value: row.original,\r\n Id: row.original.Id,\r\n externalId: row.original.ExternalId,\r\n externalIdSource: row.original.ExternalIdSource,\r\n useSidePanel: true,\r\n } as ArticleDetailsProps,\r\n useSidePanel: useSidePanel,\r\n expanded: false,\r\n isCover: useSidePanel,\r\n });\r\n};\r\n\r\nexport default articlePrimaryAction;\r\n","import { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { BasicTable, BasicTableProps } from 'app/components/BasicTable';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport function WorkOrdersTable<\r\n TProps extends Omit<\r\n BasicTableProps,\r\n | 'api'\r\n | 'additionalColumns'\r\n | 'searchColumns'\r\n | 'screenName'\r\n | 'expandedColumns'\r\n | 'savedListSettings'\r\n >\r\n>({ initialState, rowActions, serviceGroups, ...props }: TProps) {\r\n const { t } = useTranslation();\r\n const newProps = React.useMemo(() => {\r\n const p = { ...props };\r\n Reflect.deleteProperty(p, 'api');\r\n Reflect.deleteProperty(p, 'expandedColumns');\r\n Reflect.deleteProperty(p, 'savedListSettings');\r\n return p;\r\n }, [props]);\r\n const url = '/api/odata/v4/WorkOrders';\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","import { EndUsageData } from 'app/components/EndUsageConfirm';\r\nimport { AssetBarcodeScanParameters } from 'app/pages/AssetsInventory/Details/slice/types';\r\nimport { CancelToken } from 'axios';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { httpClient } from './HttpClient';\r\n\r\nconst url = '/api/odata/v4/AssetDetails';\r\nconst publicUrl = '/api/odata/v4/PublicAsset';\r\nexport const AssetDetailsApi = {\r\n getAssetById: (\r\n id: number | undefined,\r\n serviceId: number | undefined,\r\n columns: string[],\r\n expandable: string[],\r\n cancel?: CancelToken,\r\n isAuthenticated?: boolean,\r\n ) => {\r\n const params: {\r\n $select: string;\r\n serviceId: number;\r\n $expand?: string;\r\n } = {\r\n $select: columns.join(','),\r\n serviceId: serviceId ?? -1,\r\n };\r\n let expand = columns.filter(c => expandable.includes(c));\r\n if (expand && expand.length) {\r\n params.$expand = expand\r\n // articles need 2 level expand which don't fit into the column propName\r\n .map(f => (f === 'Articles' ? 'Articles($expand=Assets)' : f))\r\n .join(',');\r\n }\r\n const sourceUrl = isAuthenticated\r\n ? url + '(' + (id ?? -1) + ')'\r\n : publicUrl + '/' + (id ?? -1);\r\n return httpClient.get(sourceUrl, params, cancel);\r\n },\r\n endUsage: (id: number, data: EndUsageData): Promise => {\r\n const params = {\r\n id: id,\r\n remarks: data.remarks ?? '',\r\n sids:\r\n data.services.map(s => s.service?.Id + ':' + s.quantity).join(',') ??\r\n '',\r\n };\r\n return httpClient.post(url + '/EndUsage', params);\r\n },\r\n downloadImages: (assetIds: string): Promise => {\r\n const downUrl = `api/AssetImages/Selected?selectedIds=${assetIds}`;\r\n return httpClient.get(downUrl);\r\n },\r\n scanBarcode: (payload: AssetBarcodeScanParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n return httpClient.post(`${url}/BarcodeScan`, data);\r\n },\r\n logNoRoomAccess: (payload: number) => {\r\n const data = {\r\n roomId: payload,\r\n };\r\n return httpClient.post(`${url}/LogNoRoomAccess`, data);\r\n },\r\n};\r\n","/**\r\n *\r\n * QuizDetails\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { IQuizSubmissionDto } from 'api/odata/generated/entities/IQuizSubmissionDto';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\n\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { Box, Grid } from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport parse from 'html-react-parser';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { push } from 'connected-react-router';\r\nimport { ParseFormFieldEnums } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n StyledFormFieldsContainer,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\n\r\nexport interface QuizDetailsProps extends SidePanelContentProps {\r\n id: string;\r\n}\r\n\r\nexport function QuizDetails(props: QuizDetailsProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const { id, useSidePanel } = props;\r\n const quizSubmissionId = +id;\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const isMobile = DetectIsMobile();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const fetchData = async (id: number) =>\r\n httpClient\r\n .get(\r\n `/api/odata/v4/quizsubmissions(${id})?$expand=UserTraining($select=Id,EquipmentName,TrainingLevelName,EquipmentId)`,\r\n )\r\n .then(value => {\r\n ParseFormFieldEnums(value.CustomForm.FormFields);\r\n return value;\r\n });\r\n const [fetchDataPromiseState, fetchDataPromise] = usePromise(fetchData);\r\n const [state, setState] = useAsyncExtendedState<\r\n IQuizSubmissionDto | undefined\r\n >(undefined);\r\n useEffectOnMount(() => {\r\n setState(fetchDataPromise(quizSubmissionId));\r\n return () => {};\r\n });\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n useEffect(() => {\r\n if (fetchDataPromiseState.error !== undefined) {\r\n dispatch(\r\n actions.addNotification({\r\n message: 'Error',\r\n key: 'QuizDetailsDataLoad',\r\n variant: 'error',\r\n }),\r\n );\r\n }\r\n }, [actions, dispatch, fetchDataPromiseState.error]);\r\n const success = React.useMemo(() => state?.UserTraining !== null, [\r\n state?.UserTraining,\r\n ]);\r\n\r\n const backToQuizess = () => {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n dispatch(push(`/quizzes`));\r\n } else {\r\n dispatch(push(`/quizzes`));\r\n }\r\n };\r\n const pageActions = [\r\n () => (\r\n \r\n }\r\n onClick={backToQuizess}\r\n >\r\n {t(translations.BackToQuizzes)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {(t(translations.QuizzYourScoreIsXoutofY) as string)\r\n .replace('{0}', (state?.Score ?? 0).toString())\r\n .replace('{1}', (state?.MaxScore ?? 0).toString())}\r\n \r\n \r\n {success ? (\r\n \r\n \r\n \r\n {t(\r\n translations.CongratulationsYouHavePassedTheQuiz,\r\n )}\r\n \r\n {state?.UserTraining?.EquipmentName && (\r\n \r\n {`${t(\r\n translations.YouAreNowCertified,\r\n )} on ${t(translations.Equipment)}: `}\r\n \r\n {state?.UserTraining?.EquipmentName}\r\n \r\n \r\n {state?.UserTraining?.TrainingLevelName\r\n ? ` with ${t(translations.Level)}: ${\r\n state?.UserTraining?.TrainingLevelName\r\n }`\r\n : ''}\r\n \r\n \r\n )}\r\n {state?.CustomForm?.QuizSuccessTestMessage && (\r\n \r\n {parse(\r\n state.CustomForm.QuizSuccessTestMessage || '',\r\n )}\r\n \r\n )}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {t(translations.SorryThisDidNotWorkSoWell)}\r\n \r\n {state?.CustomForm?.QuizFailureTestMessage && (\r\n \r\n {parse(\r\n state.CustomForm.QuizFailureTestMessage || '',\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 leftActions={pageActions}\r\n closable={true}\r\n />\r\n );\r\n}\r\n","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { toQueryString } from 'utils/url-utils';\r\n\r\nexport interface OpenTimelineProps {\r\n rows: TRow[];\r\n getEquipmentIds: (rows: TRow[]) => number[];\r\n}\r\n\r\nexport function OpenTimeline({\r\n rows,\r\n getEquipmentIds,\r\n}: OpenTimelineProps) {\r\n const { t } = useTranslation();\r\n\r\n const link = React.useMemo(() => {\r\n return `/Timeline.aspx?${toQueryString({\r\n services: getEquipmentIds(rows).join(','),\r\n //openToBook: true,\r\n })}`;\r\n }, [getEquipmentIds, rows]);\r\n return (\r\n \r\n );\r\n}\r\n","import { useTheme } from '@material-ui/core';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { Body } from '../Typography';\r\n\r\nexport interface ScannerViewProps {\r\n description?: React.ReactNode;\r\n Input?: React.ReactNode;\r\n}\r\n\r\nconst StyledScanView = styled('div')(({ theme }) => ({\r\n '&.scanner-root': {\r\n width: '100%',\r\n minHeight: '144px',\r\n height: 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n padding: '24px',\r\n gap: 8,\r\n background: theme.palette.common.white,\r\n border: '1px solid #026AA2',\r\n boxShadow: '0px 0px 0px 4px #E2F6FF',\r\n borderRadius: 8,\r\n '& .scanner-icon': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: 8.75,\r\n },\r\n '& .scanner-input': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n width: '100%',\r\n paddingInline: '16px',\r\n gap: 8,\r\n [theme.breakpoints.down('sm')]: {\r\n paddingInline: '0',\r\n },\r\n },\r\n '&.selectRoot': {\r\n padding: theme.spacing(2),\r\n },\r\n '&.selectTitle': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '8px 8px',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n '&>label': {\r\n width: '100%',\r\n textAlign: 'center',\r\n },\r\n },\r\n },\r\n}));\r\nexport function ScannerView(props: ScannerViewProps) {\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n return (\r\n \r\n
    \r\n \r\n
    \r\n \r\n {props.description || t(translations.BarcodeScannViewDescription)}\r\n \r\n {props.Input && (\r\n
    \r\n {'or'}\r\n {props.Input}\r\n
    \r\n )}\r\n
    \r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport {\r\n all,\r\n call,\r\n put,\r\n select,\r\n takeLatest,\r\n takeLeading,\r\n} from 'redux-saga/effects';\r\nimport { samplePlatesActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { translations } from 'locales/translations';\r\nimport i18next from 'i18next';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ISamplePlateDto } from 'api/odata/generated/entities/ISamplePlateDto';\r\nimport { TableFilterBuilder } from 'app/components/BasicTable/TableFilterBuilder';\r\nimport { selectSamplePlatesTableState } from './selectors';\r\nimport { getExportParameters, buildURL } from 'utils/url-utils';\r\nimport { AxiosError } from 'axios';\r\nimport {\r\n IBulkSamplePlateCreate,\r\n ISamplePlateCreate,\r\n SamplePlatesTableState,\r\n} from './types';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { openExportLink } from 'utils/url-utils';\r\n\r\nconst baseUrl = `/api/odata/v4/SamplePlates`;\r\nexport function getLoadDataParams(currentTableState: SamplePlatesTableState) {\r\n return {\r\n $count: true,\r\n $top: currentTableState.pageSize,\r\n $skip:\r\n (currentTableState.pageIndex ?? 0) * (currentTableState.pageSize ?? 5),\r\n $orderby:\r\n currentTableState.sortBy\r\n ?.map(f => `${f.id} ${f.desc ?? false ? 'desc' : 'asc'}`)\r\n .join(',') || undefined,\r\n $select: currentTableState.visibleColumns?.join(','),\r\n $filter: TableFilterBuilder(\r\n currentTableState.customFilters as Array<\r\n IFilterSettings\r\n >,\r\n currentTableState.globalFilter,\r\n currentTableState.serviceGroups?.length !== 0\r\n ? currentTableState.serviceGroups\r\n : undefined,\r\n [\r\n 'Id',\r\n 'ServiceGroupName',\r\n 'RoomName',\r\n 'LocationTypeName',\r\n 'LocationName',\r\n 'SamplePlateTypeName',\r\n ],\r\n ),\r\n };\r\n}\r\nfunction* doGet(action: PayloadAction) {\r\n try {\r\n const currentTableState = action.payload;\r\n const someResult = yield call(\r\n httpClient.get,\r\n baseUrl,\r\n getLoadDataParams(currentTableState),\r\n );\r\n yield put(actions.get_Success(someResult));\r\n } catch (error) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.errormessage),\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.get_Error(Error));\r\n }\r\n\r\n try {\r\n const plateTypes = yield call(\r\n httpClient.get,\r\n '/api/odata/v4/SamplePlateTypes',\r\n );\r\n yield put(actions.getPlateTypes_Success(plateTypes.value));\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n}\r\nfunction* doExport(action: PayloadAction) {\r\n try {\r\n const tableState = yield select(selectSamplePlatesTableState);\r\n\r\n const tableParams = getLoadDataParams({\r\n ...tableState,\r\n });\r\n const entitySetURl = '/api/odata/v4/sampleplates';\r\n var params = getExportParameters(tableParams);\r\n const url = buildURL(entitySetURl, params);\r\n yield call(openExportLink, url);\r\n } catch (error) {\r\n console.error('doExport failed', error);\r\n }\r\n}\r\n\r\nfunction* doRefresh(action: PayloadAction) {\r\n const tableState = yield select(selectSamplePlatesTableState);\r\n yield put(actions.get(tableState));\r\n}\r\n\r\nfunction* doCreate(action: PayloadAction) {\r\n const samplePlateId = action.payload.SamplePlateType?.Id ?? null;\r\n if (samplePlateId === null) {\r\n yield put(actions.create_Error('SamplePlateId is required'));\r\n return;\r\n }\r\n const httpPayload: Partial = {\r\n Id: action.payload.Id ?? '',\r\n RoomId: action.payload.Room?.Id ?? null,\r\n LocationId: action.payload.Location?.Id ?? null,\r\n SamplePlateTypeId: samplePlateId,\r\n ServiceGroupId: action.payload.ServiceGroup?.Id ?? null,\r\n Active: action.payload.Active ?? true,\r\n IsRack: action.payload.IsRack ?? false,\r\n };\r\n try {\r\n const someResult = yield call(httpClient.post, baseUrl, httpPayload);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.Success),\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(actions.create_Success(someResult));\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'SamplePlatesCreate',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.create_Error(Error));\r\n }\r\n}\r\n\r\nfunction genratePlatesFromBulk(\r\n item: IBulkSamplePlateCreate,\r\n): ISamplePlateCreate[] {\r\n if (item.LastId === undefined) {\r\n throw new Error('LastId is required');\r\n }\r\n const firstId = item.FirstId;\r\n if (firstId === undefined) {\r\n throw new Error('FirstId is required');\r\n }\r\n const n = item.LastId - firstId + 1;\r\n const d = Math.floor(Math.log10(item.LastId)) + 1;\r\n var result = [...Array(n).keys()]\r\n .map(i => firstId + i)\r\n .map(i => i.toString().padStart(d, '0'))\r\n .map(id => ({\r\n Id: `${item.Prefix}${id}`,\r\n Room: item.Room,\r\n Location: item.Location,\r\n SamplePlateType: item.SamplePlateType,\r\n ServiceGroup: item.ServiceGroup,\r\n Active: item.Active,\r\n IsRack: item.IsRack,\r\n }));\r\n return result;\r\n}\r\n\r\nfunction* doBulkCreate(action: PayloadAction) {\r\n const plates = genratePlatesFromBulk(action.payload);\r\n const errors: string[] = [];\r\n let successCount = 0;\r\n\r\n for (let index = 0; index < plates.length; index++) {\r\n const plate = plates[index];\r\n\r\n const samplePlateId = plate.SamplePlateType?.Id ?? null;\r\n if (samplePlateId === null) {\r\n yield put(actions.create_Error('SamplePlateId is required'));\r\n return;\r\n }\r\n\r\n const httpPayload: Partial = {\r\n Id: plate.Id ?? '',\r\n RoomId: plate.Room?.Id ?? null,\r\n LocationId: plate.Location?.Id ?? null,\r\n SamplePlateTypeId: samplePlateId,\r\n ServiceGroupId: plate.ServiceGroup?.Id ?? null,\r\n Active: plate.Active ?? true,\r\n IsRack: plate.IsRack ?? false,\r\n };\r\n try {\r\n yield call(httpClient.post, baseUrl, httpPayload);\r\n successCount++;\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined);\r\n if (message !== undefined) {\r\n errors.push(message);\r\n }\r\n } finally {\r\n yield put(actions.bulkCreate_SetProgress((100 * index) / plates.length));\r\n }\r\n }\r\n if (errors.length > 0) {\r\n for (const error of errors) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'SamplePlatesCreate',\r\n message: error,\r\n variant: 'error',\r\n }),\r\n );\r\n }\r\n yield put(actions.create_Error(Error));\r\n }\r\n if (successCount > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.Success),\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(actions.bulkCreate_Success());\r\n }\r\n}\r\n\r\nfunction* doUpdate(\r\n action: PayloadAction<{\r\n original: ISamplePlateDto;\r\n current: Partial;\r\n }>,\r\n) {\r\n const current = action.payload.current;\r\n const samplePlateId = current.SamplePlateType?.Id ?? null;\r\n if (samplePlateId === null) {\r\n yield put(actions.create_Error('SamplePlateId is required'));\r\n return;\r\n }\r\n const httpPayload: Partial = {\r\n Id: current.Id ?? '',\r\n RoomId: current.Room?.Id ?? null,\r\n LocationId: current.Location?.Id ?? null,\r\n SamplePlateTypeId: samplePlateId,\r\n ServiceGroupId: current.ServiceGroup?.Id ?? null,\r\n LocationName: null,\r\n RoomName: null,\r\n SamplePlateTypeName: null,\r\n ServiceGroupName: null,\r\n Active: current.Active ?? true,\r\n IsRack: current.IsRack ?? false,\r\n };\r\n try {\r\n const someResult = yield call(\r\n httpClient.patch,\r\n `${baseUrl}('${action.payload.original.Id}')`,\r\n httpPayload,\r\n );\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.Success),\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(actions.update_Success(someResult));\r\n } catch (error) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.errormessage),\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.update_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doDelete(action: PayloadAction) {\r\n const messageKey = 'SamplePlatesDelete';\r\n try {\r\n const someResult = yield call(\r\n httpClient.delete,\r\n `${baseUrl}('${action.payload}')`,\r\n );\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: messageKey,\r\n message: i18next.t(translations.Success),\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(actions.delete_Success(someResult));\r\n } catch (error) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: messageKey,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.delete_Error(Error));\r\n }\r\n}\r\nfunction* doDeactivatePlates(action: PayloadAction) {\r\n const messageKey = 'SamplePlatesDelete';\r\n try {\r\n const payload: Pick = { Active: false };\r\n yield all(\r\n action.payload\r\n .map(samplePlate => `${baseUrl}('${samplePlate.Id}')`)\r\n .map(url => call(httpClient.patch, url, payload)),\r\n );\r\n yield put(actions.deactivatePlates_Success());\r\n } catch (error) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: messageKey,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.deactivatePlates_Error());\r\n }\r\n}\r\n\r\nfunction* doDeletePlates(action: PayloadAction) {\r\n const messageKey = 'SamplePlatesDelete';\r\n try {\r\n yield all(\r\n action.payload\r\n .map(samplePlate => `${baseUrl}('${samplePlate.Id}')`)\r\n .map(url => call(httpClient.delete, url)),\r\n );\r\n yield put(actions.deletePlates_Success());\r\n } catch (error) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: messageKey,\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.deletePlates_Error());\r\n }\r\n}\r\n\r\nexport function* samplePlatesSaga() {\r\n yield takeLatest(actions.get.type, doGet);\r\n yield takeLatest(actions.create.type, doCreate);\r\n yield takeLatest(actions.create_Success.type, doRefresh);\r\n yield takeLatest(actions.bulkCreate.type, doBulkCreate);\r\n yield takeLatest(actions.bulkCreate_Success.type, doRefresh);\r\n yield takeLatest(actions.update.type, doUpdate);\r\n yield takeLatest(actions.update_Success.type, doRefresh);\r\n yield takeLatest(actions.delete.type, doDelete);\r\n yield takeLatest(actions.delete_Success.type, doRefresh);\r\n yield takeLeading(actions.deactivatePlates.type, doDeactivatePlates);\r\n yield takeLatest(actions.deactivatePlates_Success.type, doRefresh);\r\n yield takeLeading(actions.deletePlates.type, doDeletePlates);\r\n yield takeLatest(actions.deletePlates_Success.type, doRefresh);\r\n yield takeLeading(actions.export, doExport);\r\n}\r\n","/**\r\n *\r\n * InfoIcon\r\n *\r\n */\r\nimport React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { Tooltip, TooltipsProps } from '../BasicTooltips/Tooltip';\r\n\r\nexport interface InfoIconProps extends Pick {}\r\n\r\nexport const InfoIcon = React.memo(function BookitlabLoginLogo(\r\n props: InfoIconProps,\r\n) {\r\n const classes = useStyles();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n marginLeft: '1ch',\r\n // root css\r\n },\r\n }),\r\n);\r\n","import { SuperGroupPicker } from 'app/components/pickers/AutocompletePickers/SuperGroupPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport const SuperGroupFilter = (props: IFilterComponentProps) => {\r\n const handleChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\n","import { Entity } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { httpClient } from './HttpClient';\r\n\r\nconst SourceUrl = '/api/odata/v4/ServiceRequestList';\r\nexport const ServiceRequestsApi = {\r\n UpdateStatuses: (status: Entity | null, ids: number[]) => {\r\n const data = {\r\n status: status?.Name,\r\n ids,\r\n };\r\n //console.log(data);\r\n const url = SourceUrl + '/UpdateStatuses';\r\n return httpClient.post(url, data);\r\n },\r\n DeleteRequests: (ids: number[]) => {\r\n const data = { ids };\r\n const url = SourceUrl + '/DeleteRequests';\r\n return httpClient.post(url, data);\r\n },\r\n AddRequest: (\r\n osid: number,\r\n budgetId: number,\r\n userName: string,\r\n userGroupId: string | undefined,\r\n ): Promise => {\r\n const data = { osid, budgetId, userName, userGroupId };\r\n const url = SourceUrl + '/AddRequest';\r\n return httpClient.post(url, data);\r\n },\r\n};\r\n","import DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport DecimalRenderer from 'app/components/BasicTable/CellRenderers/DecimalRenderer';\r\nimport ServiceIdRenderer from 'app/components/BasicTable/CellRenderers/EquipmentIdRenderer';\r\nimport OperationTypeIdRenderer from 'app/components/BasicTable/CellRenderers/OperationTypeIdRenderer';\r\nimport { BooleanRender } from 'app/components/BasicTable/components/BooleanRender';\r\nimport { DescriptionCell } from 'app/components/BasicTable/components/DescriptionCell';\r\nimport { ColumnWithDep } from 'app/components/BasicTable/types/ColumnWithDeps';\r\nimport { DateTimeLabel } from 'app/components/DateTimeLabel';\r\nimport { ExternalLink, Link } from 'app/components/ExternalLink';\r\nimport { Roles } from 'app/slice/types';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { AppSettings, IsModuleEnabled } from 'types/AppSettings';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { tryParseBool } from 'utils/string-utils';\r\nimport { AssetLink } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport { IMyAssetsRow } from './IMyAssetsRow';\r\nimport AssetImageRenderer from 'app/components/BasicTable/CellRenderers/AssetImageRenderer';\r\n\r\nexport function getColumns(\r\n t: TFunction,\r\n user: AuthenticatedUser | undefined,\r\n appSettings: AppSettings | null,\r\n settings: GlobalSettings | null,\r\n) {\r\n const suppliersLabel = tryParseBool(\r\n settings?.GetString(AllowedSettings.RequireSupplierExternalId),\r\n )\r\n ? t(translations.ExternalCompany)\r\n : t(translations.SupplierExternalId);\r\n const res: ColumnWithDep[] = [\r\n {\r\n Header: t(translations.HashSymbol) as string,\r\n accessor: 'Id',\r\n Cell: ServiceIdRenderer,\r\n },\r\n {\r\n Header: t(translations.Active) as string,\r\n accessor: 'Active',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.Image) as string,\r\n accessor: 'ImageName',\r\n Cell: AssetImageRenderer,\r\n notShowTitle: true,\r\n },\r\n {\r\n Header: t(translations.Asset) as string,\r\n accessor: 'Name',\r\n Cell: ({ value, row }) => {\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n },\r\n },\r\n {\r\n Header: t(translations.Created) as string,\r\n accessor: 'AssetRecordDate',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.LifeDate) as string,\r\n accessor: 'LifeDate',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.Status) as string,\r\n accessor: 'Status',\r\n Cell: ({ value, row }) => {\r\n let color = 'black';\r\n let backgroundColor = 'white';\r\n switch (row.original.StatusId) {\r\n case 1:\r\n color = bookitColors.success.dark;\r\n backgroundColor = bookitColors.success.background;\r\n break;\r\n case 2:\r\n color = bookitColors.warning.dark;\r\n backgroundColor = bookitColors.warning.background;\r\n break;\r\n case 3:\r\n color = bookitColors.danger.dark;\r\n backgroundColor = bookitColors.danger.background;\r\n break;\r\n default:\r\n color = 'black';\r\n backgroundColor = 'white';\r\n }\r\n return (\r\n <>\r\n \r\n {value}\r\n \r\n \r\n );\r\n },\r\n deps: ['StatusId'],\r\n },\r\n {\r\n Header: t(translations.InstrumentCat) as string,\r\n accessor: 'InstrumentCatName',\r\n },\r\n {\r\n Header: t(translations.OperationType) as string,\r\n accessor: 'OperationTypeID',\r\n Cell: OperationTypeIdRenderer,\r\n },\r\n {\r\n Header: t(translations.Availability) as string,\r\n accessor: 'AvailabilityTypeName',\r\n },\r\n {\r\n Header: t(translations.AssetCatName) as string,\r\n accessor: 'AssetCatName',\r\n },\r\n {\r\n Header: t(translations.AssetCatGroupName) as string,\r\n accessor: 'AssetCatGroupName',\r\n },\r\n {\r\n Header: t(translations.AssetType2Counter) as string,\r\n accessor: 'Type2Counter',\r\n },\r\n {\r\n Header: t(translations.AccountingId) as string,\r\n accessor: 'AccountingId',\r\n },\r\n {\r\n Header: t(translations.Overdue) as string,\r\n accessor: 'Overdue',\r\n },\r\n {\r\n Header: t(translations.DueToday) as string,\r\n accessor: 'DueToday',\r\n },\r\n {\r\n Header: t(translations.ShortDescriptionOfInstrument) as string,\r\n accessor: 'ShortDescription',\r\n },\r\n {\r\n Header: t(translations.Description) as string,\r\n accessor: 'Description',\r\n Cell: DescriptionCell({ width: 'medium' }),\r\n },\r\n {\r\n Header: t(translations.Campus) as string,\r\n accessor: 'Campus',\r\n },\r\n {\r\n Header: t(translations.Building) as string,\r\n accessor: 'Building',\r\n Cell: ({ value, row }) => {\r\n if (row.original.AreaMapId === null) {\r\n return <>{value};\r\n } else {\r\n return (\r\n <>\r\n \r\n {value}\r\n \r\n \r\n );\r\n }\r\n },\r\n deps: ['AreaMapId'],\r\n },\r\n {\r\n Header: t(translations.Room) as string,\r\n accessor: 'Room',\r\n Cell: ({ value, row }) => {\r\n if (row.original.RoomMapId === null) {\r\n return <>{value};\r\n } else {\r\n return (\r\n <>\r\n \r\n {value}\r\n \r\n \r\n );\r\n }\r\n },\r\n deps: ['RoomId', 'RoomMapId'],\r\n },\r\n {\r\n Header: t(translations.CoreName) as string,\r\n accessor: 'ServiceGroupName',\r\n Cell: ({ value, row }) => {\r\n if (row.original.ServiceGroupAssetId === null) {\r\n return <>{value};\r\n } else {\r\n return (\r\n <>\r\n \r\n {value}\r\n \r\n \r\n );\r\n }\r\n },\r\n deps: ['ServiceGroupAssetId'],\r\n },\r\n {\r\n Header: t(translations.Division) as string,\r\n accessor: 'DivisionName',\r\n Cell: ({ value, row }) => {\r\n if (row.original.DivisionAssetId === null) {\r\n return <>{value};\r\n } else {\r\n return (\r\n <>\r\n {value}\r\n \r\n );\r\n }\r\n },\r\n deps: ['DivisionAssetId'],\r\n },\r\n {\r\n Header: t(translations.OtherNames) as string,\r\n accessor: 'OtherNames',\r\n },\r\n {\r\n Header: t(translations.Brand) as string,\r\n accessor: 'Brand',\r\n },\r\n {\r\n Header: t(translations.Raac) as string,\r\n accessor: 'Raac',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.ApprovalRequired) as string,\r\n accessor: 'ApprovalRequired',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.MainSpecRange) as string,\r\n accessor: 'MainSpecRange',\r\n },\r\n {\r\n Header: t(translations.WebLink) as string,\r\n accessor: 'WebLink',\r\n },\r\n {\r\n Header: t(translations.BrandCode) as string,\r\n accessor: 'BrandCode',\r\n },\r\n {\r\n Header: t(translations.InternalCode) as string,\r\n accessor: 'InternalCode',\r\n },\r\n {\r\n Header: t(translations.Rank) as string,\r\n accessor: 'Rank',\r\n },\r\n {\r\n Header: t(translations.ElectricalSpecs) as string,\r\n accessor: 'ElectricalSpecs',\r\n },\r\n {\r\n Header: t(translations.FunctionalCharacteristics) as string,\r\n accessor: 'FunctionalCharacteristics',\r\n },\r\n {\r\n Header: t(translations.Inventory) as string,\r\n accessor: 'inventory',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL0) as string,\r\n accessor: 'ExtraDDL0Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL1) as string,\r\n accessor: 'ExtraDDL1Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL2) as string,\r\n accessor: 'ExtraDDL2Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL3) as string,\r\n accessor: 'ExtraDDL3Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL4) as string,\r\n accessor: 'ExtraDDL4Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL5) as string,\r\n accessor: 'ExtraDDL5Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL6) as string,\r\n accessor: 'ExtraDDL6Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL7) as string,\r\n accessor: 'ExtraDDL7Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL8) as string,\r\n accessor: 'ExtraDDL8Value',\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL8Value},\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL9) as string,\r\n accessor: 'ExtraDDL9Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL10) as string,\r\n accessor: 'ExtraDDL10Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL11) as string,\r\n accessor: 'ExtraDDL11Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL12) as string,\r\n accessor: 'ExtraDDL12Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL13) as string,\r\n accessor: 'ExtraDDL13Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL14) as string,\r\n accessor: 'ExtraDDL14Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDDL15) as string,\r\n accessor: 'ExtraDDL15Value',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText0) as string,\r\n accessor: 'ExtraText0',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText1) as string,\r\n accessor: 'ExtraText1',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText2) as string,\r\n accessor: 'ExtraText2',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText3) as string,\r\n accessor: 'ExtraText3',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText4) as string,\r\n accessor: 'ExtraText4',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText5) as string,\r\n accessor: 'ExtraText5',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText6) as string,\r\n accessor: 'ExtraText6',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText7) as string,\r\n accessor: 'ExtraText7',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText8) as string,\r\n accessor: 'ExtraText8',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText9) as string,\r\n accessor: 'ExtraText9',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText10) as string,\r\n accessor: 'ExtraText10',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText11) as string,\r\n accessor: 'ExtraText11',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText12) as string,\r\n accessor: 'ExtraText12',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText13) as string,\r\n accessor: 'ExtraText13',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText14) as string,\r\n accessor: 'ExtraText14',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraText15) as string,\r\n accessor: 'ExtraText15',\r\n },\r\n {\r\n accessor: 'ExtraDate0',\r\n Header: t(translations.Asset_ExtraDate0) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate1',\r\n Header: t(translations.Asset_ExtraDate1) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate2',\r\n Header: t(translations.Asset_ExtraDate2) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate3',\r\n Header: t(translations.Asset_ExtraDate3) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate4',\r\n Header: t(translations.Asset_ExtraDate4) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate5',\r\n Header: t(translations.Asset_ExtraDate5) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate6',\r\n Header: t(translations.Asset_ExtraDate6) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate7',\r\n Header: t(translations.Asset_ExtraDate7) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate8',\r\n Header: t(translations.Asset_ExtraDate8) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'ExtraDate9',\r\n Header: t(translations.Asset_ExtraDate9) as string,\r\n Cell: DateRenderer,\r\n },\r\n /*{\r\n Header: t(translations.Asset_ExtraInt0) as string,\r\n accessor: 'ExtraInt0',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraInt1) as string,\r\n accessor: 'ExtraInt1',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraInt2) as string,\r\n accessor: 'ExtraInt2',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraInt3) as string,\r\n accessor: 'ExtraInt3',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraInt4) as string,\r\n accessor: 'ExtraInt4',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDec0) as string,\r\n accessor: 'ExtraDec0',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDec1) as string,\r\n accessor: 'ExtraDec1',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDec2) as string,\r\n accessor: 'ExtraDec2',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDec3) as string,\r\n accessor: 'ExtraDec3',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraDec4) as string,\r\n accessor: 'ExtraDec4',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraBool0) as string,\r\n accessor: 'ExtraBool0',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraBool1) as string,\r\n accessor: 'ExtraBool1',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraBool2) as string,\r\n accessor: 'ExtraBool2',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraBool3) as string,\r\n accessor: 'ExtraBool3',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraBool4) as string,\r\n accessor: 'ExtraBool4',\r\n },*/\r\n {\r\n Header: t(translations.Asset_ExtraUrl0) as string,\r\n accessor: 'ExtraUrl0',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraUrl1) as string,\r\n accessor: 'ExtraUrl1',\r\n },\r\n /*{\r\n Header: t(translations.Asset_ExtraUrl2) as string,\r\n accessor: 'ExtraUrl2',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraUrl3) as string,\r\n accessor: 'ExtraUrl3',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraUrl4) as string,\r\n accessor: 'ExtraUrl4',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraRichText0) as string,\r\n accessor: 'ExtraRichText0',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraRichText1) as string,\r\n accessor: 'ExtraRichText1',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraRichText2) as string,\r\n accessor: 'ExtraRichText2',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraRichText3) as string,\r\n accessor: 'ExtraRichText3',\r\n },\r\n {\r\n Header: t(translations.Asset_ExtraRichText4) as string,\r\n accessor: 'ExtraRichText4',\r\n },*/\r\n {\r\n Header: t(translations.NickName) as string,\r\n accessor: 'NickName',\r\n },\r\n {\r\n Header: t(translations.PurchaseOrder) as string,\r\n accessor: 'POnumber',\r\n },\r\n {\r\n Header: t(translations.ServiceContract) as string,\r\n accessor: 'ServiceContract',\r\n },\r\n {\r\n Header: t(translations.GasSource) as string,\r\n accessor: 'GasSource',\r\n },\r\n {\r\n Header: t(translations.ModelNumber) as string,\r\n accessor: 'ModelNumber',\r\n },\r\n {\r\n Header: t(translations.Accessories) as string,\r\n accessor: 'AccessoriesText',\r\n },\r\n {\r\n Header: t(translations.SGA_Public) as string,\r\n accessor: 'Public',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.LocationName) as string,\r\n accessor: 'LocationName',\r\n },\r\n {\r\n Header: t(translations.SubLocationName) as string,\r\n accessor: 'SubLocationName',\r\n },\r\n {\r\n Header: t(translations.UnderOriginalWarranty) as string,\r\n accessor: 'CanViewWarrantyEndDate',\r\n Cell: ({ value, row }) => {\r\n if (\r\n settings?.GetBooleanByKey(\r\n AllowedSettings.WarrantyEndDateVisibleAllUsers,\r\n )\r\n ) {\r\n return ;\r\n } else {\r\n let canview =\r\n user !== undefined &&\r\n (user.Roles.includes(Roles.Administrators) ||\r\n user.Roles.includes(Roles.InstrumentEventsAdmin) ||\r\n (user.Roles.includes(Roles.GroupAdministrators) &&\r\n user.HasAdminGroupPermissions(\r\n row.original.ServiceGroupId ?? undefined,\r\n )));\r\n return ;\r\n }\r\n },\r\n },\r\n {\r\n Header: t(translations.ExportLicense) as string,\r\n accessor: 'ExportLicense',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.Tags) as string,\r\n accessor: 'TagsText',\r\n },\r\n {\r\n Header: t(translations.EquipmentExperts) as string,\r\n accessor: 'ExpertsText',\r\n },\r\n {\r\n Header: t(translations.ContactsPersonForEquipment) as string,\r\n accessor: 'ContactsText',\r\n },\r\n {\r\n Header: suppliersLabel,\r\n accessor: 'SuppliersText',\r\n },\r\n {\r\n Header: t(translations.AssemblyParent) as string,\r\n accessor: 'AssemblyParent',\r\n },\r\n {\r\n Header: t(translations.AssemblyChilds) as string,\r\n accessor: 'AssemblyChilds',\r\n },\r\n {\r\n Header: t(translations.BookAppVersion) as string,\r\n accessor: 'BookAppVersion',\r\n },\r\n {\r\n Header: t(translations.BookAppVersionUpdateDate) as string,\r\n accessor: 'BookAppVersionUpdateDate',\r\n Cell: ({ value }) => ,\r\n },\r\n {\r\n Header: t(translations.LateTime) as string,\r\n accessor: 'LateTime',\r\n Cell: DecimalRenderer,\r\n },\r\n {\r\n Header: t(translations.EarlyLeaveTime) as string,\r\n accessor: 'EarlyLeaveTime',\r\n Cell: DecimalRenderer,\r\n },\r\n {\r\n Header: t(translations.EarlyStartAllowedMinutes) as string,\r\n accessor: 'EarlyStartAllowed',\r\n Cell: DecimalRenderer,\r\n },\r\n {\r\n Header: t(translations.Model) as string,\r\n accessor: 'Model',\r\n },\r\n ];\r\n\r\n if (IsModuleEnabled(appSettings, KnownModules.EquipmentAssemblies)) {\r\n res.push({\r\n Header: t(translations.InstrumentType) as string,\r\n accessor: 'InstrumentType',\r\n });\r\n }\r\n if (IsModuleEnabled(appSettings, KnownModules.LocationTracking)) {\r\n res.push({\r\n Header: t(translations.LocationUpdatedAt) as string,\r\n accessor: 'LocationUpdatedAt',\r\n Cell: ({ value }) => ,\r\n });\r\n }\r\n\r\n return res;\r\n}\r\n","/**\r\n *\r\n * ServiceTypeEnumFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { ServiceTypeEnumPicker } from 'app/components/pickers/StaticOptionsPickers/ServiceTypeEnumPicker';\r\n\r\nexport const ServiceTypeEnumFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n | undefined}\r\n isOpen={props.open}\r\n placeholder={t(translations.AllValues)}\r\n additionalItem={props.additionalItem as Entity | undefined}\r\n ariaLabel={props.label}\r\n size=\"small\"\r\n id={props.id}\r\n />\r\n );\r\n};\r\nexport default ServiceTypeEnumFilter;\r\n","import { SelectedRowsActionIconButton } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { SelectedRowsActionRenderer } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { initAssetsData } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { ExportImportActions } from 'app/components/PopupImportExport/Actions';\r\nimport { AddWorkOrder } from 'app/pages/Actions/GlobalSelectedActions/AddWorkOrder';\r\n//import { AssetRangesExportForImport } from 'app/pages/Actions/GlobalSelectedActions/AssetRangesExportForImport';\r\nimport { BringBackUp } from 'app/pages/Actions/GlobalSelectedActions/BringBackUp';\r\nimport { CloneEquipmentSettings } from 'app/pages/Actions/GlobalSelectedActions/CloneEquipments';\r\nimport { DownWorkOrder } from 'app/pages/Actions/GlobalSelectedActions/DownWorkOrder';\r\nimport { OpenCalendar } from 'app/pages/Actions/GlobalSelectedActions/OpenCalendar';\r\nimport { OpenWorkOrders } from 'app/pages/Actions/GlobalSelectedActions/OpenWrokOrders';\r\nimport { RenderTypes } from 'app/pages/Actions/GlobalSelectedActions/ValidToRender/renderTypes';\r\nimport { useAssetsPermissions } from 'app/pages/Actions/GlobalSelectedActions/ValidToRender/useAssetsPermissionsUtils';\r\nimport { AddToLists } from 'app/pages/SavedViewsPage/AddToLists';\r\nimport { useAdminPermissions } from 'app/permissions/Asset/assetPermissions';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { TFunction } from 'i18next';\r\nimport fileDownload from 'js-file-download';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useMemo } from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { IMyAssetsRow } from '../IMyAssetsRow';\r\nimport { openExportLink } from 'utils/url-utils';\r\nimport { ImportAdditionalData } from 'app/components/PopupImportExport/Actions/Types';\r\nimport { PrintSelectedAssetLabelsButton } from 'app/components/LabelPrint/PrintSelectedAssetLabelsButton';\r\nimport { mapToAssetDto } from 'app/pages/AssetPopUp/IAsset';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { ExportQRCodesButton } from 'app/components/QrCodeExport';\r\n\r\nexport interface GetSelectedActionsProps {\r\n enableSavedLists?: boolean;\r\n canExportAssetRanges?: boolean;\r\n isShowAllCores?: boolean;\r\n authenticatedUser?: AuthenticatedUser;\r\n useSidePanel?: boolean;\r\n}\r\n\r\nexport function GetSelectedActions(\r\n t: TFunction,\r\n props: GetSelectedActionsProps,\r\n): SelectedRowsActionRenderer[] {\r\n const { allowedToView } = useAssetsPermissions();\r\n const ap = useAdminPermissions();\r\n const allowedToImport = React.useCallback(\r\n (rows: any[]): any[] => {\r\n return rows.filter(r => ap.allowedToAdd(r) && ap.allowedToEdit(r));\r\n },\r\n [ap],\r\n );\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const enabledByCores = React.useCallback(\r\n (rows: IMyAssetsRow[]) => {\r\n return !props.isShowAllCores\r\n ? true\r\n : rows.every(f =>\r\n selectedServiceGroups?.some(g => g.Id === f.ServiceGroupId),\r\n );\r\n },\r\n [props.isShowAllCores, selectedServiceGroups],\r\n );\r\n const SelectedActions: SelectedRowsActionRenderer[] = useMemo(\r\n () => [\r\n rows =>\r\n props.enableSavedLists &&\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.AddToList) &&\r\n enabledByCores(rows) && (\r\n \r\n rows.map(item => {\r\n return {\r\n Id: item.ServiceId,\r\n Name: item.Name,\r\n } as Entity;\r\n })\r\n }\r\n getAssets={rows => {\r\n let ids = rows.map(item => item.Id).join(',');\r\n return initAssetsData(ids);\r\n }}\r\n />\r\n ),\r\n rows =>\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.OpenCalendar) &&\r\n enabledByCores(rows) && (\r\n \r\n rows.map(r => r.ServiceId ?? 0).filter(f => f > 0)\r\n }\r\n bookMultiple\r\n />\r\n ),\r\n /* Commented according to BKT-7297 */\r\n /* (rows, refresh) =>\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.OpenTimeline) && (\r\n \r\n rows.map(r => r.ServiceId ?? 0).filter(f => f > 0)\r\n }\r\n />\r\n ), */\r\n rows =>\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.OpenWorkOrders) &&\r\n enabledByCores(rows) && (\r\n r.map(a => a.Id) || []}\r\n />\r\n ),\r\n rows =>\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.AddWorkOrder) &&\r\n enabledByCores(rows) && (\r\n {\r\n let ids = rows.map(item => item.Id).join(',');\r\n return initAssetsData(ids);\r\n }}\r\n buttonName={t(translations.AddEvent)}\r\n useSidePanel={props.useSidePanel}\r\n />\r\n ),\r\n rows =>\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.DownWorkOrder) &&\r\n enabledByCores(rows) && (\r\n {\r\n let ids = rows.map(item => item.Id).join(',');\r\n return initAssetsData(ids);\r\n }}\r\n buttonName={t(translations.TakeDown)}\r\n useSidePanel={props.useSidePanel}\r\n />\r\n ),\r\n rows =>\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.CloneEquipments) && (\r\n \r\n rows.map(r => r.ServiceId ?? 0).filter(f => f > 0)\r\n }\r\n />\r\n ),\r\n (rows, onRefresh) => {\r\n if (\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.ExportForImport)\r\n ) {\r\n const exportRows = allowedToImport(rows);\r\n if (exportRows.length > 0) {\r\n return (\r\n \r\n new Promise(async (resolve, reject) => {\r\n const selectedRows = exportRows.map(item => item.Id);\r\n const res = await ExportImportActions.ExportForImport(\r\n ScreensId.MyAssets,\r\n selectedRows,\r\n );\r\n const cd = res.headers['content-disposition'];\r\n const filename =\r\n cd !== undefined\r\n ? cd.split('filename=')[1]\r\n : 'ExportForImport_assets.xlsx';\r\n fileDownload(res.data, filename);\r\n let messages: IResponseType = {\r\n SuccessMessages: [],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n resolve(messages);\r\n })\r\n }\r\n />\r\n );\r\n } else {\r\n return <>;\r\n }\r\n } else {\r\n return <>;\r\n }\r\n },\r\n (rows, onRefresh) => {\r\n if (\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.ExportForImport) &&\r\n props.canExportAssetRanges\r\n ) {\r\n const exportRows = allowedToImport(rows);\r\n if (exportRows.length > 0) {\r\n return (\r\n // rows.map(r => r.Id)}\r\n ///>\r\n \r\n new Promise(async (resolve, reject) => {\r\n const selectedRows = exportRows.map(item => item.Id);\r\n const res = await ExportImportActions.ExportForImport(\r\n ScreensId.MyAssets,\r\n selectedRows,\r\n ImportAdditionalData.AssetRanges,\r\n );\r\n const cd = res.headers['content-disposition'];\r\n const filename =\r\n cd !== undefined\r\n ? cd.split('filename=')[1]\r\n : 'ExportForImport_assetRanges.xlsx';\r\n fileDownload(res.data, filename);\r\n let messages: IResponseType = {\r\n SuccessMessages: [],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n resolve(messages);\r\n })\r\n }\r\n />\r\n );\r\n } else {\r\n return <>;\r\n }\r\n } else {\r\n return <>;\r\n }\r\n },\r\n (rows, onRefresh) => {\r\n if (\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.DownloadImages)\r\n ) {\r\n return (\r\n \r\n new Promise(async (resolve, reject) => {\r\n const rowHasNoImages =\r\n rows.filter(f => f.ImageName === null).length > 0;\r\n if (rowHasNoImages) {\r\n const messages: IResponseType = {\r\n SuccessMessages: [],\r\n ErrorMessages: ['One or more row has no image file'],\r\n WarningMessages: [],\r\n };\r\n resolve(messages);\r\n } else {\r\n const downUrl = `api/AssetImages/Selected?selectedIds=${rows\r\n .map(r => r.Id)\r\n .join(',')}`;\r\n await openExportLink(downUrl);\r\n const messages: IResponseType = {\r\n SuccessMessages: [t(translations.Success)],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n resolve(messages);\r\n }\r\n })\r\n }\r\n />\r\n );\r\n } else return <>;\r\n },\r\n rows =>\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.BringBackUp) &&\r\n enabledByCores(rows) &&\r\n rows.some(f => f.StatusId === 2 || f.StatusId === 3) && (\r\n \r\n rows.map(r => r.ServiceId ?? 0).filter(f => f > 0)\r\n }\r\n getAssetIds={rows => rows.map(r => r.Id ?? 0).filter(f => f > 0)}\r\n useSidePanel={props.useSidePanel}\r\n />\r\n ),\r\n (rows, onRefresh) => {\r\n if (\r\n allowedToView(rows.map(mapToAssetDto), RenderTypes.PrintAssetLabels)\r\n ) {\r\n return (\r\n \r\n );\r\n }\r\n },\r\n (rows, onRefresh, toggleAllRowsSelected) => {\r\n if (allowedToView(rows.map(mapToAssetDto), RenderTypes.ExportQRCodes)) {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n } else {\r\n }\r\n },\r\n ],\r\n [\r\n allowedToImport,\r\n allowedToView,\r\n enabledByCores,\r\n props.canExportAssetRanges,\r\n props.enableSavedLists,\r\n props.useSidePanel,\r\n t,\r\n ],\r\n );\r\n\r\n return SelectedActions;\r\n}\r\n","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { toQueryString } from 'utils/url-utils';\r\n\r\nexport interface CloneEquipmentSettingsProps {\r\n rows: TRow[];\r\n getEquipmentIds: (rows: TRow[]) => number[];\r\n}\r\n\r\nexport function CloneEquipmentSettings({\r\n rows,\r\n getEquipmentIds,\r\n}: CloneEquipmentSettingsProps) {\r\n const { t } = useTranslation();\r\n\r\n const link = React.useMemo(() => {\r\n return `/CloneEquipmentSettings.aspx?${toQueryString({\r\n target: getEquipmentIds(rows).join(','),\r\n })}`;\r\n }, [getEquipmentIds, rows]);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AssetPickerFilter\r\n *\r\n */\r\nimport { AssetPicker } from 'app/components/pickers/AutocompletePickers/AssetPicker';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\n\r\nexport const AssetPickerFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default AssetPickerFilter;\r\n","import { Link } from '@material-ui/core';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { Comments } from 'app/components/Comments';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Renderer } from 'react-table';\r\nimport { IInvoiceBatchesDto } from './IInvoiceBatchesDto';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { intersection } from 'lodash';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useUploadToNewComment } from 'app/components/LargeFilesUpload/Components/useUploadToNewComment';\r\nexport interface InvoiceBatchesCommentsProps {\r\n batchId: number;\r\n}\r\n\r\nexport const InvoiceBatchesComments = (props: InvoiceBatchesCommentsProps) => {\r\n const { t } = useTranslation();\r\n const User: AuthenticatedUser | undefined = useSelector(\r\n selectAuthenticatedUser,\r\n );\r\n\r\n //PERMISSIONS\r\n const roles: number[] | undefined = User?.Roles;\r\n\r\n const allowedRoles: Roles[] = [\r\n Roles.Administrators,\r\n Roles.GroupAdministrators,\r\n Roles.FinAdmin,\r\n Roles.CustomRole,\r\n ];\r\n\r\n const adminRoles: Roles[] = [Roles.Administrators];\r\n\r\n const isAdmin: boolean = intersection(roles, adminRoles).length > 0;\r\n const hasPermissions: boolean = intersection(roles, allowedRoles).length > 0;\r\n const { onCommentAdded } = useUploadToNewComment();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const InvoiceBatchesCommentsRenderer: Renderer = ({\r\n value,\r\n row: { original },\r\n}) => {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const User: AuthenticatedUser | undefined = useSelector(\r\n selectAuthenticatedUser,\r\n );\r\n\r\n //PERMISSIONS\r\n const roles: number[] | undefined = User?.Roles;\r\n\r\n const allowedRoles: Roles[] = [\r\n Roles.Administrators,\r\n Roles.GroupAdministrators,\r\n Roles.FinAdmin,\r\n Roles.CustomRole,\r\n ];\r\n const hasPermissions: boolean = intersection(roles, allowedRoles).length > 0;\r\n const onClick = () => {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.InvoiceBatchesComments,\r\n props: { batchId: original.Id },\r\n }),\r\n );\r\n };\r\n if (!hasPermissions) return <>{value};\r\n return {value};\r\n};\r\n","import { GetRawValue } from 'app/components/BasicTable/types/FilterParam';\r\nimport { OtherServiceDetailsPageProps } from '.';\r\nimport { OfflineServiceQueryStringParameters } from '../Details/slice/types';\r\n\r\nexport const getParams = (\r\n params: URLSearchParams,\r\n props: OtherServiceDetailsPageProps,\r\n): OfflineServiceQueryStringParameters => {\r\n return {\r\n id:\r\n props.match.params['ID'] ||\r\n (GetRawValue(params, 'ID') ?? undefined) ||\r\n props.match.params['Id'] ||\r\n (GetRawValue(params, 'Id') ?? undefined) ||\r\n props.match.params['id'] ||\r\n (GetRawValue(params, 'id') ?? undefined),\r\n ipid:\r\n props.match.params['ipid'] || (GetRawValue(params, 'ipid') ?? undefined),\r\n servicedate:\r\n props.match.params['servicedate'] ||\r\n (GetRawValue(params, 'servicedate') ?? undefined),\r\n\r\n user:\r\n props.match.params['user'] || (GetRawValue(params, 'user') ?? undefined),\r\n bid: props.match.params['bid'] || (GetRawValue(params, 'bid') ?? undefined),\r\n remarks:\r\n props.match.params['remarks'] ||\r\n (GetRawValue(params, 'remarks') ?? undefined),\r\n be: props.match.params['be'] || (GetRawValue(params, 'be') ?? undefined),\r\n ecid:\r\n props.match.params['ecid'] || (GetRawValue(params, 'ecid') ?? undefined),\r\n po: props.match.params['po'] || (GetRawValue(params, 'po') ?? undefined),\r\n reference:\r\n props.match.params['ref'] || (GetRawValue(params, 'ref') ?? undefined),\r\n factor:\r\n props.match.params['factor'] ||\r\n (GetRawValue(params, 'factor') ?? undefined),\r\n amount:\r\n props.match.params['amount'] ||\r\n (GetRawValue(params, 'amount') ?? undefined),\r\n adg: props.match.params['adg'] || (GetRawValue(params, 'adg') ?? undefined),\r\n stid:\r\n props.match.params['stid'] || (GetRawValue(params, 'stid') ?? undefined),\r\n ReservationId:\r\n props.match.params['ReservationId'] ||\r\n (GetRawValue(params, 'ReservationId') ?? undefined),\r\n UsageId:\r\n props.match.params['UsageId'] ||\r\n (GetRawValue(params, 'UsageId') ?? undefined),\r\n batchId:\r\n props.match.params['batchId'] ||\r\n (GetRawValue(params, 'batchId') ?? undefined),\r\n };\r\n};\r\n","import { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { translations } from 'locales/translations';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport {\r\n GetBooleanEntity,\r\n GetBooleanOrUndefined,\r\n getNumberEntityArray,\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n GetStringOrUndefined,\r\n initPickerValue,\r\n URLSearchParamsCI,\r\n arrayToQueryString,\r\n initMultiExPickerValue,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { initProjectData } from 'app/components/pickers/AutocompletePickers/ProjectPicker';\r\nimport BooleanPickerFilter from 'app/components/BasicTable/Filters/BooleanPickerFilter';\r\nimport { initInstituteData } from 'app/components/pickers/AutocompletePickers/InstitutePicker';\r\nimport InstituteFilter from 'app/components/BasicTable/Filters/InstituteFilter';\r\nimport InstituteTypeFilter from 'app/components/BasicTable/Filters/InstituteTypeFilter';\r\nimport { initInstituteTypeData } from 'app/components/pickers/AutocompletePickers/InstituteTypePicker';\r\nimport DepartmentFilter from 'app/components/BasicTable/Filters/DepartmentFilter';\r\nimport { initDepartmentData } from 'app/components/pickers/AutocompletePickers/DepartmentPicker';\r\nimport { initUserGroupData } from 'app/components/pickers/AutocompletePickers/UserGroupPicker';\r\nimport UserGroupFilter from 'app/components/BasicTable/Filters/UserGroupFIlter';\r\nimport { initServiceGroupsMultiData } from 'app/components/pickers/MultiSelectPickers/ServiceGroupsPicker';\r\nimport { ServiceGroupsFilter } from 'app/components/BasicTable/Filters/ServiceGroupsFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { BudgetByUserGroupFilter } from 'app/components/pickers/AutocompletePickers/BudgetPicker';\r\nimport { ProjectFilter } from 'app/components/BasicTable/Filters/ProjectFilter';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParamsCI(search);\r\n const result: IFilterSettings[] = [];\r\n // Project\r\n if (IsModuleEnabled(appSettings, KnownModules.Budgets)) {\r\n result.push({\r\n fieldName: 'BudgetId',\r\n displayName: t(translations.BudgetNumber),\r\n operator: ODataOperators.Equals,\r\n // value: getDefaultFilterValue('bid', params),\r\n queryStringSerializer: 'bid',\r\n initData: initPickerValue(initProjectData),\r\n value: GetPartialEntity(GetNumberOrUndefined(GetRawValue(params, 'bid'))),\r\n component: ProjectFilter,\r\n dependencyProp: ['UserGroupId'],\r\n filterPredicates: BudgetByUserGroupFilter,\r\n });\r\n }\r\n // Online/ offline projects: (online only/ offline only/ All= default)\r\n result.push({\r\n fieldName: 'BudgetOnline',\r\n displayName: t(translations.BudgetIsOnline),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'BudgetIsOnline',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'BudgetIsOnline')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n });\r\n // Has Balance/ Estimated charges (yes/no/ all, default= all) - is this generating a performance issue (same question as above)\r\n result.push({\r\n fieldName: 'HasBalanceOrEstimatedCharges',\r\n displayName: t(translations.HasBalanceOrEstimatedCharges),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'HasBalanceOrEstimatedCharges',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(\r\n GetRawValue(params, 'HasBalanceOrEstimatedCharges'),\r\n ),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n });\r\n // User group- as per the project user group.\r\n result.push({\r\n fieldName: 'UserGroupId',\r\n displayName: t(translations.UserGroup),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(GetStringOrUndefined(GetRawValue(params, 'adg'))),\r\n component: UserGroupFilter,\r\n queryStringSerializer: 'adg',\r\n initData: initPickerValue(initUserGroupData),\r\n });\r\n // Department- as per the project user group.\r\n result.push({\r\n id: 'DepartmentId',\r\n fieldName: 'DepartmentId',\r\n queryStringSerializer: 'DepartmentId',\r\n displayName: t(translations.Department),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'DepartmentId')),\r\n ),\r\n initData: initPickerValue(initDepartmentData),\r\n component: DepartmentFilter,\r\n });\r\n // Institute- as per the project user group.\r\n result.push({\r\n fieldName: 'InstituteId', // connected to Company\r\n displayName: t(translations.Company),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'InstituteId',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'InstituteId')),\r\n ),\r\n initData: initPickerValue(initInstituteData),\r\n component: InstituteFilter,\r\n });\r\n // Institute Type -as per the project user group.\r\n\r\n result.push({\r\n fieldName: 'InstituteTypeId', // Company Type\r\n displayName: t(translations.InstituteType),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'InstituteTypeId',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'InstituteTypeId')),\r\n ),\r\n initData: initPickerValue(initInstituteTypeData),\r\n component: InstituteTypeFilter,\r\n });\r\n // Only Active (yes/ no, default= yes)\r\n result.push({\r\n fieldName: 'BudgetActive',\r\n displayName: t(translations.Active),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'Active',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'Active')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n });\r\n result.push({\r\n fieldName: 'ServiceGroupId',\r\n displayName: t(translations.ServiceGroups),\r\n operator: ODataOperators.Includes,\r\n queryStringSerializer: arrayToQueryString('ServiceGroupId'),\r\n value: getNumberEntityArray(params, 'ServiceGroupId'),\r\n initData: initMultiExPickerValue(initServiceGroupsMultiData),\r\n component: ServiceGroupsFilter,\r\n urlKey: 'ServiceGroupId',\r\n });\r\n return result;\r\n};\r\n","import { CircularProgress } from '@material-ui/core';\r\nimport { FrontendLayout_MainContent_ID } from 'app/Layout/FrontendLayout';\r\nimport Infinite, {\r\n Props as InfiniteProps,\r\n} from 'react-infinite-scroll-component';\r\n\r\nexport interface InfiniteScrollProps\r\n extends Pick<\r\n InfiniteProps,\r\n | 'children'\r\n | 'next'\r\n | 'hasMore'\r\n | 'dataLength'\r\n | 'className'\r\n | 'style'\r\n | 'hasChildren'\r\n | 'scrollableTarget'\r\n | 'scrollThreshold'\r\n > {}\r\n\r\nexport const InfiniteScroll = ({\r\n children,\r\n style,\r\n className,\r\n scrollableTarget = FrontendLayout_MainContent_ID,\r\n ...props\r\n}: InfiniteScrollProps) => {\r\n return (\r\n \r\n \r\n \r\n }\r\n className={className}\r\n scrollableTarget={scrollableTarget}\r\n style={\r\n style ??\r\n (className !== undefined\r\n ? undefined\r\n : {\r\n overflow: 'hidden',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 16,\r\n })\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport clsx from 'clsx';\r\n\r\n/**\r\n * EventContent props\r\n */\r\nexport interface EventContentProps {\r\n /**\r\n * Background color of the event (instrument color)\r\n */\r\n backgroundColor?: string;\r\n /**\r\n * Width of the container\r\n */\r\n containerWidth: string;\r\n /**\r\n * Width in pixels of the event container element (e.g. event length * time scale)\r\n */\r\n height: number;\r\n /**\r\n * Header content\r\n */\r\n header?: React.ReactNode;\r\n /**\r\n * Body content\r\n */\r\n body?: React.ReactNode;\r\n /**\r\n * Readonly\r\n */\r\n readonly?: boolean;\r\n /**\r\n * calculated top position of the event content on calendar week/unit view\r\n */\r\n offsetTopHeight?: number;\r\n notClickable?: boolean;\r\n}\r\n\r\n/**\r\n * Provides a layout of event element\r\n * @param props props\r\n * @returns Event Content\r\n */\r\nexport function EventContent(props: EventContentProps) {\r\n // overrides .dhx_cal_event .dhx_title height property from dhtmlxscheduler_material.css\r\n const EVENT_TITLE_HEIGHT = 34;\r\n return (\r\n <>\r\n {/* this one is in the dhtmlx's demo/docs, but this element does not appear much */}\r\n {!props.readonly && (\r\n
     
    \r\n )}\r\n {/* drag handle on the event title */}\r\n {props.header !== undefined && (\r\n \r\n {props.header}\r\n \r\n )}\r\n \r\n {props.body}\r\n \r\n {/* resize handle on the bottom of the event */}\r\n {!props.readonly && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { dateUtils } from 'utils/date-utils';\r\n\r\n/**\r\n * Shared funciton used in scheduler to format time labels\r\n * @param d date\r\n * @returns string representation of the time part\r\n */\r\nexport const formatSchedulerTime = (d: Date) => dateUtils.format(d, 'p');\r\n\r\n/**\r\n * Shared funciton used in scheduler to format time labels\r\n * @param d date\r\n * @returns string representation of the time part\r\n */\r\nexport const formatSchedulerDateTime = (d: Date) => dateUtils.format(d, 'Pp');\r\n","import * as React from 'react';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\nimport { formatSchedulerTime } from '../../utils/formatSchedulerTime';\r\n\r\n/**\r\n * Event header props\r\n */\r\nexport interface EventHeaderProps {\r\n event: ISchedulerEvent;\r\n}\r\n\r\n/**\r\n * Event header element\r\n * @param props props\r\n * @returns Event header\r\n */\r\nexport function EventHeader(props: EventHeaderProps) {\r\n return (\r\n <>\r\n
    \r\n {formatSchedulerTime(props.event.start_date)}\r\n {' - '}\r\n {formatSchedulerTime(props.event.end_date)}\r\n
    \r\n
    {props.event.service_name}
    \r\n \r\n );\r\n}\r\n","import { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { Icon, IconProps } from 'app/components/BasicIcons/FontAwesome';\r\nimport { TrainingState, TrainingStateUnion } from 'enums/TrainingState';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\n\r\nexport interface TrainingSessionStatusProps extends Omit {\r\n event: ISchedulerEvent;\r\n}\r\nexport function TrainingSessionStatus({\r\n event,\r\n size,\r\n className,\r\n}: TrainingSessionStatusProps) {\r\n const training = event.original as ITrainingSessionSlotDto;\r\n const stateid = training.TrainingState;\r\n if (stateid === undefined) {\r\n return null;\r\n }\r\n const state = TrainingState[stateid] as TrainingStateUnion;\r\n switch (state) {\r\n case 'SignedUp':\r\n return ;\r\n // icon = icon.replace(\":title\", '<%= Bookit.CustomResourceProviderFactory.GetJsString(\"TrainingSessions_Calendar_SignedUp\") %>');\r\n case 'UnderMinimum':\r\n return (\r\n \r\n );\r\n // icon = icon.replace(\":title\", '<%= Bookit.CustomResourceProviderFactory.GetJsString(\"TrainingSessions_Calendar_UnderMinimum\") %>');\r\n case 'Available':\r\n return ;\r\n // icon = icon.replace(\":title\", '<%= Bookit.CustomResourceProviderFactory.GetJsString(\"TrainingSessions_Calendar_Available\") %>');\r\n case 'Maximum':\r\n return ;\r\n // icon = icon.replace(\":title\", '<%= Bookit.CustomResourceProviderFactory.GetJsString(\"TrainingSessions_Calendar_Maximum\") %>');\r\n default:\r\n assertExhaustive(state);\r\n }\r\n}\r\n","import { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\nimport { EventContent, EventContentProps } from './EventContent';\r\nimport { EventHeader } from './EventHeader';\r\nimport { TrainingSessionStatus } from './TrainingSessionStatus';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\n\r\nexport interface TrainingSessionEventContentProps extends EventContentProps {\r\n event: ISchedulerEvent;\r\n}\r\nexport function TrainingSessionEventConent(\r\n props: TrainingSessionEventContentProps,\r\n) {\r\n return (\r\n }\r\n body={}\r\n readonly\r\n offsetTopHeight={props.offsetTopHeight}\r\n notClickable={props.notClickable}\r\n />\r\n );\r\n}\r\nexport interface TrainingSessionEventHeaderProps {\r\n event: ISchedulerEvent;\r\n}\r\nexport function TrainingSessionEventHeader(\r\n props: TrainingSessionEventHeaderProps,\r\n) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport interface TrainingSessionEventBodyProps {\r\n event: ISchedulerEvent;\r\n}\r\nexport function TrainingSessionEventBody(props: TrainingSessionEventBodyProps) {\r\n const dto = props.event.original as ITrainingSessionSlotDto;\r\n return (\r\n <>\r\n \r\n {dto.TrainerName != null && (\r\n <>\r\n  \r\n {dto.TrainerName}\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { Icon, IconProps } from 'app/components/BasicIcons/FontAwesome';\r\nimport {\r\n ReservationStatus,\r\n ReservationStatusUnion,\r\n} from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\n// import { getReservationIconName } from './getReservationIconName';\r\n\r\nexport interface ReservationStatusContentProps extends Omit {\r\n event: ISchedulerEvent;\r\n}\r\nexport function ReservationStatusIcon({\r\n event,\r\n ...props\r\n}: ReservationStatusContentProps) {\r\n const reservation = event.original as ICalendarReservationDto;\r\n const statusId = reservation.StatusId;\r\n if (statusId === undefined) {\r\n return null;\r\n }\r\n if (statusId === null) {\r\n return null;\r\n }\r\n const reservationStatus = ReservationStatus[\r\n statusId\r\n ] as ReservationStatusUnion;\r\n switch (reservationStatus) {\r\n case 'Pending':\r\n case 'PendingCoord':\r\n return ;\r\n case 'Draft':\r\n return ;\r\n case 'Approved':\r\n if (reservation.Tutoring) {\r\n return ;\r\n }\r\n return null;\r\n case 'Cancelled':\r\n case 'AllStatus':\r\n case 'CancelledByAdmin':\r\n case 'Done':\r\n case 'NotDone':\r\n case 'DoneWOBooking':\r\n case 'ApprovedOnce':\r\n case 'Tentative':\r\n return null;\r\n default:\r\n assertExhaustive(reservationStatus);\r\n }\r\n // const iconName = getReservationIconName(\r\n // ReservationStatus[statusid] as ReservationStatusUnion,\r\n // reservation.Tutoring,\r\n // );\r\n\r\n // if (iconName === undefined) {\r\n // return null;\r\n // }\r\n\r\n // return ;\r\n}\r\n","import * as React from 'react';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\nimport { EventContent, EventContentProps } from './EventContent';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { ReservationStatusIcon } from './ReservationStatusIcon';\r\nexport interface ReservationEventContentProps extends EventContentProps {\r\n event: ISchedulerEvent;\r\n}\r\nexport function ReservationEventConent(props: ReservationEventContentProps) {\r\n const x = props.event.original as ICalendarReservationDto;\r\n\r\n return (\r\n }\r\n height={props.height}\r\n //todo: add ediability conditaionally based on premissions/etc.\r\n readonly={props.readonly}\r\n offsetTopHeight={props.offsetTopHeight}\r\n notClickable={props.notClickable}\r\n />\r\n );\r\n}\r\nexport interface ReservationEventBodyProps {\r\n event: ISchedulerEvent;\r\n body: React.ReactNode;\r\n}\r\nexport function ReservationEventBody(props: ReservationEventBodyProps) {\r\n const dto = props.event.original as ICalendarReservationDto;\r\n return !!dto && !!dto.Restricted && dto.Restricted === true ? (\r\n {''}\r\n ) : (\r\n \r\n {!!dto && !!dto.StatusId && }\r\n {props.body}\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\nimport { EventContent, EventContentProps } from './EventContent';\r\nimport { EventHeader } from './EventHeader';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nexport interface OfflineEventContentProps extends EventContentProps {\r\n event: ISchedulerEvent;\r\n}\r\nexport function OfflineEventConent(props: OfflineEventContentProps) {\r\n return (\r\n }\r\n body={props.body}\r\n height={props.height}\r\n readonly={props.readonly}\r\n offsetTopHeight={props.offsetTopHeight}\r\n notClickable={props.notClickable}\r\n />\r\n );\r\n}\r\n","import * as ReactDOMServer from 'react-dom/server';\r\nimport * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { BookitThemeSettings } from 'styles/theme';\r\nimport { SimplePaletteColorOptions } from '@material-ui/core/styles/createPalette';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\nimport { TrainingSessionEventConent } from './TrainingSessionEventConent';\r\nimport { ReservationEventConent } from './ReservationEventContent';\r\nimport { EventType } from '../../slice/types';\r\nimport { EventContentProps } from './EventContent';\r\nimport { OfflineEventConent } from './OfflineEventContent';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { ISchedulerState } from '../../types/ISchedulerState';\r\nimport HTMLReactParser from 'html-react-parser';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\n/**\r\n * Render fundtion that is used by the scheduler to build event's contents\r\n * see https://docs.dhtmlx.com/scheduler/api__scheduler_renderevent.html for more details\r\n * @param container Container DOM element of the rendered event\r\n * @param ev Event object\r\n * @param width Event width provided by the scheduler\r\n * @param height Event height provided by the scheduler\r\n * @param header_content Event header content\r\n * @param body_content Event body content\r\n * @returns true\r\n */\r\nexport const renderEvent = (scheduler: DHTMLX.SchedulerStatic) => (\r\n container: HTMLDivElement,\r\n ev: ISchedulerEvent,\r\n width: number,\r\n height: number,\r\n header_content: string,\r\n body_content: string,\r\n) => {\r\n try {\r\n var container_width = container.style.width; // e.g. \"105px\"\r\n // set background color on the event container instead of setting it on each child separately\r\n const backgroundColor = getBackgroundColor({\r\n type: ev.type,\r\n color:\r\n (ev.original as ICalendarReservationDto)?.EquipmentColor ?? ev.color,\r\n });\r\n if (backgroundColor !== undefined) {\r\n container.style.backgroundColor = backgroundColor;\r\n }\r\n const topEventHeight = getSlotsFromEvent(\r\n ev.start_date,\r\n ev.end_date,\r\n scheduler.config.scroll_hour,\r\n );\r\n // get original full event obj instead of the cloned one\r\n // start/end on ev might be set to start/end of the day for multi day events get cloned\r\n const originalEvent: ISchedulerEvent = scheduler.getEvent(ev.id);\r\n\r\n // get a render function for each event type type\r\n const RenderFC = RenderEvent(originalEvent.type);\r\n\r\n const state: ISchedulerState = scheduler.getState();\r\n\r\n const readonly =\r\n originalEvent.readonly ||\r\n // set event to be readonly (disables drag/resize) when the start/end is outside of the time period shown on the timeline\r\n // this prevents cpu crunch done by the scheduler in onBeforeDrag event handler for long (multi day/year) reservations\r\n // this prevents dragging multi day event in day calendar when no feedback is provided regarding start/end of the event\r\n originalEvent.start_date < state.min_date ||\r\n originalEvent.end_date > state.max_date;\r\n const notClickable = originalEvent.notClickable;\r\n // render an html and shove it into event container\r\n container.innerHTML = ReactDOMServer.renderToStaticMarkup(\r\n ,\r\n );\r\n } catch (error) {\r\n console.error(error);\r\n return false;\r\n }\r\n // true - the scheduler displays a custom form\r\n return true;\r\n};\r\nconst getSlotsFromEvent = (\r\n start: Date,\r\n end: Date,\r\n scroll_hour: number,\r\n): number => {\r\n let duration = dateUtils.intervalToDuration({\r\n start: start,\r\n end: end,\r\n });\r\n if (\r\n start.getHours() < 8 &&\r\n end > new Date(new Date(start).setHours(10)) &&\r\n ((duration?.hours ?? 0) > 3 || (duration?.days ?? 0) > 0)\r\n ) {\r\n //let totalSlotsHeight = 44 * 24;\r\n let eithSlotsHeight = 44 * scroll_hour;\r\n let startHeight = ((start.getHours() * 60 + start.getMinutes()) / 60) * 44;\r\n // let endHeight = ((end.getHours() * 60 + end.getMinutes()) / 60) * 44;\r\n // if (endHeight <= eithSlotsHeight + 88) {\r\n // startHeight = startHeight - (eithSlotsHeight + 88 - endHeight);\r\n // }\r\n // let calHeight = document?.querySelector('.dhx_cal_data')?.clientHeight;\r\n // let shiftHeight =\r\n // totalSlotsHeight - (calHeight ?? 0) - (totalSlotsHeight - eventHeight);\r\n //return Math.floor(shiftHeight);\r\n return Math.floor(eithSlotsHeight - startHeight);\r\n }\r\n return 0;\r\n};\r\n\r\nconst getBackgroundColor = ({\r\n type,\r\n color,\r\n}: Pick): string | undefined => {\r\n const trainingSessionBackgroundColor = '#99dcfa';\r\n const defaultColor =\r\n (BookitThemeSettings.palette?.primary as SimplePaletteColorOptions)?.main ??\r\n bookitColors.primary.regular;\r\n // new events won't have any type\r\n if (type === undefined) {\r\n return defaultColor;\r\n }\r\n switch (type) {\r\n case 'offline':\r\n return undefined;\r\n case 'reservation':\r\n // todo: set different color for approved/pending/etc.\r\n return color ?? defaultColor;\r\n case 'trainingsession':\r\n return trainingSessionBackgroundColor;\r\n default:\r\n assertExhaustive(type);\r\n }\r\n};\r\n\r\ninterface RenderEventProps extends EventContentProps {\r\n event: ISchedulerEvent;\r\n}\r\n\r\nfunction RenderEvent(eventType?: EventType): React.FC {\r\n if (eventType === undefined) {\r\n return ReservationEventConent;\r\n }\r\n switch (eventType) {\r\n case 'trainingsession':\r\n return TrainingSessionEventConent;\r\n case 'reservation':\r\n return ReservationEventConent;\r\n case 'offline':\r\n return OfflineEventConent;\r\n default:\r\n assertExhaustive(eventType);\r\n }\r\n}\r\n","import { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { TimelineGroupByUnion } from 'api/odata/generated/enums/TimelineGroupBy';\r\nimport { getAssetImageThumbSrc } from 'app/components/AssetThumbImage/getAssetImageSrc';\r\nimport produce from 'immer';\r\nimport { chain } from 'lodash';\r\nimport { AppSettings, IsAssetImageExist } from 'types/AppSettings';\r\nimport { Entity } from 'types/common';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport {\r\n ISchedulerAssetCatSection,\r\n ISchedulerSection,\r\n ISchedulerServiceSection,\r\n} from './types/ISchedulerSection';\r\n\r\nexport interface fooProps {\r\n services: IServiceFilterDto[] | undefined;\r\n appSettings: AppSettings | null;\r\n groupBy?: TimelineGroupByUnion;\r\n}\r\n\r\nexport function prepareSchedulerSections(props: fooProps): ISchedulerSection[] {\r\n if (props.services === undefined || props.services.length === 0) {\r\n return [{ label: '', type: 'empty' }];\r\n }\r\n const r1 = props.services.map(setImageName(props.appSettings));\r\n const groupByOption = props.groupBy ?? 'NoTimelineGrouped';\r\n switch (groupByOption) {\r\n case 'GroupByAssemblyPart':\r\n return groupAssemblyParts(r1);\r\n case 'GroupByAssetCat':\r\n return groupAssetCats(r1);\r\n case 'NoTimelineGrouped':\r\n return r1.map(mapServiceToSection);\r\n default:\r\n assertExhaustive(groupByOption);\r\n }\r\n}\r\nfunction mapServiceToSection(\r\n service: IServiceFilterDto,\r\n): ISchedulerServiceSection {\r\n return {\r\n type: 'service',\r\n key: service.Id,\r\n label: service.Name,\r\n data: service,\r\n };\r\n}\r\n\r\nexport function groupAssetCats(\r\n services: Array,\r\n): ISchedulerSection[] {\r\n const result = chain(services)\r\n .groupBy(service =>\r\n JSON.stringify({ Id: service.AssetCatId, Name: service.AssetCatName }),\r\n )\r\n .map((value, key) => {\r\n const assetCat: Entity = JSON.parse(key);\r\n const section: ISchedulerAssetCatSection = {\r\n key: `assetCat_${assetCat.Id}`,\r\n label: assetCat.Name,\r\n open: true,\r\n type: 'assetCat',\r\n children: value.map(mapServiceToSection),\r\n };\r\n return section;\r\n })\r\n .value();\r\n return result;\r\n}\r\n/**\r\n * Groups services by their respective assembly configuration\r\n * @param services\r\n * @returns\r\n */\r\nexport function groupAssemblyParts(\r\n services: Array,\r\n): ISchedulerSection[] {\r\n const sections: ISchedulerServiceSection[] = services.map(item => ({\r\n type: 'service',\r\n key: item.Id,\r\n label: item.Name,\r\n open: false,\r\n data: { ...item },\r\n }));\r\n\r\n const result = sections.reduce(\r\n (accumulator, currentValue, currentIndex, array) => {\r\n const parent =\r\n array.find(f => f.key === currentValue.data.AssemblyId) ??\r\n array.find(f => f.key === currentValue.data.TopAssemblyId);\r\n\r\n if (parent !== undefined) {\r\n accumulator.splice(accumulator.indexOf(currentValue), 1);\r\n if (parent.children === undefined) {\r\n parent.children = [];\r\n }\r\n parent.children?.push(currentValue);\r\n }\r\n return accumulator;\r\n },\r\n [...sections],\r\n );\r\n\r\n return result;\r\n}\r\n\r\nfunction setImageName(appSettings: AppSettings | null | undefined) {\r\n return produce((service: IServiceFilterDto) => {\r\n service.ImageName =\r\n getAssetImageThumbSrc(\r\n service.ImageName || null,\r\n 'thumbSmall',\r\n IsAssetImageExist(\r\n appSettings ?? null,\r\n service.ImageName || null,\r\n 'thumbSmall',\r\n ),\r\n ) ?? null;\r\n });\r\n}\r\n","import * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { ISchedulerService } from './slice/types';\r\nimport { orderBy } from 'lodash';\r\nimport {\r\n ISchedulerSection,\r\n ISchedulerServiceSection,\r\n} from './types/ISchedulerSection';\r\nimport { TimelineGroupByUnion } from 'api/odata/generated/enums/TimelineGroupBy';\r\nimport { prepareSchedulerSections } from './servicesToSections';\r\nimport { AppSettings } from 'types/AppSettings';\r\n\r\n/**\r\n * The \"services\" server list name\r\n */\r\nexport const scheduler_services_collection_name = 'services';\r\n/**\r\n * Sets the Services server list\r\n * @param scheduler scheduler instance\r\n * @param services services\r\n */\r\nexport function setServerList(\r\n scheduler: DHTMLX.SchedulerStatic,\r\n services: ISchedulerService[] = [],\r\n appSettings: AppSettings | null,\r\n groupBy?: TimelineGroupByUnion,\r\n) {\r\n const sections = prepareSchedulerSections({\r\n appSettings: appSettings,\r\n groupBy: groupBy ?? 'NoTimelineGrouped',\r\n services: services,\r\n });\r\n // order the services so that they will show up sorted in the timeline/unit\r\n const orderedServerListData = orderBy(sections ?? [], f => f.label);\r\n // set the scheduler's server list\r\n scheduler.serverList(\r\n scheduler_services_collection_name,\r\n orderedServerListData,\r\n );\r\n}\r\n\r\n/**\r\n * Retrieves the Services stored in scheduler's server list.\r\n * @param scheduler\r\n * @returns\r\n */\r\nexport function getServerList(\r\n scheduler: DHTMLX.SchedulerStatic,\r\n): Array {\r\n const serverList = scheduler?.serverList(\r\n scheduler_services_collection_name,\r\n ) as Array;\r\n const result = serverList.filter(\r\n f => (f as ISchedulerSection).type === 'service',\r\n ) as Array;\r\n return result;\r\n}\r\n\r\n/**\r\n * Updates the Services stored in scheduler's server list.\r\n * @param scheduler\r\n * @param services\r\n */\r\nexport function updateServerList(\r\n scheduler: DHTMLX.SchedulerStatic,\r\n services: Array = [],\r\n appSettings: AppSettings | null,\r\n groupBy?: TimelineGroupByUnion,\r\n) {\r\n const sections = prepareSchedulerSections({\r\n appSettings: appSettings,\r\n services: services,\r\n groupBy: groupBy,\r\n });\r\n\r\n scheduler.updateCollection(scheduler_services_collection_name, sections);\r\n}\r\n\r\n/**\r\n * Retrieves a single Service details (if there's any) stored in the scheduler's server list\r\n * @param scheduler\r\n * @param serviceId\r\n * @returns\r\n */\r\nexport function getServerListService(scheduler, serviceId: number | undefined) {\r\n const services = getServerList(scheduler);\r\n const service =\r\n serviceId === undefined\r\n ? undefined\r\n : (services?.find(\r\n f => f.type === 'service' && f.key === serviceId,\r\n ) as ISchedulerServiceSection);\r\n return service?.data;\r\n}\r\n","import * as ReactDOMServer from 'react-dom/server';\r\nimport { SimplePaletteColorOptions } from '@material-ui/core/styles/createPalette';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { BookitThemeSettings } from 'styles/theme';\r\nimport { isMobile } from 'react-device-detect';\r\nimport {\r\n ISchedulerSection,\r\n ISchedulerServiceSection,\r\n} from './types/ISchedulerSection';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\n\r\n/**\r\n * Renders static html for service column/header\r\n * @param params\r\n * @returns\r\n */\r\nexport function scheduleServiceTemplate(params: ISchedulerSection) {\r\n const type = params.type;\r\n\r\n switch (type) {\r\n case 'service':\r\n const component = TimelineServiceContent(params);\r\n const html = ReactDOMServer.renderToStaticMarkup(component);\r\n const foo = html.replace(\r\n ';\r\n }\r\n if (props.key === undefined) {\r\n return <>;\r\n }\r\n const backgroundColor =\r\n props.data.Color ??\r\n (BookitThemeSettings.palette?.primary as SimplePaletteColorOptions)?.main;\r\n\r\n const style: React.CSSProperties = {\r\n backgroundColor: backgroundColor,\r\n };\r\n const containerProps = {\r\n className: `${scheduleServiceContainerClassName} ${\r\n mobileView ? scheduleServicePaddingMobile : scheduleServicePadding\r\n }`,\r\n };\r\n containerProps[scheduleServiceIdAttributeName] = props.data?.Id;\r\n const imageProps = {\r\n className: scheduleImageClassName,\r\n };\r\n imageProps[scheduleServiceIdAttributeName] = props.data?.Id;\r\n const labelTextProps = {\r\n className: mobileView\r\n ? scheduleServiceLabelTextMobile\r\n : scheduleServiceLabelText,\r\n };\r\n\r\n /**\r\n * imageName is populated with the ImagePath in the following file\r\n * @see src\\app\\pages\\CalendarPage\\Scheduler\\index.tsx\r\n * @todo use the raw ImageName on IServiceFilterDto object and calculated required image path here\r\n */\r\n // Asset image is set in\r\n const src = props.data.ImageName ?? '';\r\n return (\r\n <>\r\n \r\n {!isMobile && (\r\n \r\n {src === undefined || src.indexOf('Default') > 0 ? (\r\n \r\n ) : (\r\n \"\"\r\n )}\r\n \r\n )}\r\n\r\n
    \r\n {props.label}\r\n
    \r\n
    \r\n \r\n );\r\n } catch (error) {\r\n console.error(error);\r\n return <>;\r\n }\r\n}\r\n","import { ISchedulerEvent } from '../types/ISchedulerEvent';\r\n\r\n/**\r\n * Custom compare function that controls events order on the timeline:\r\n * 1. Earlier events must appear first - this controls the cascading/overlapping display.\r\n * 2. Training sessions must appear on top with signups below\r\n * This function is ultimately plugged as an argument into events.sort after which the events are arranged on the timeline to accomodate for overlapping, row height, etc.\r\n * @param a event\r\n * @param b event\r\n * @returns 1 | -1 | 0\r\n */\r\nexport function timelineEventsSortIteratee(\r\n a: ISchedulerEvent,\r\n b: ISchedulerEvent,\r\n): 1 | -1 | 0 {\r\n return (\r\n // dates sort must appear first for proper arrangement of overlaps\r\n compareFn(a, b, event => event.start_date.valueOf()) ??\r\n // only later same date/time events are arranged so that training session will be on top\r\n compareFn(a, b, event => (event.type === 'trainingsession' ? -1 : 1)) ??\r\n // fallback to event id to ensure stable sorting\r\n compareFn(a, b, event => event.id) ??\r\n 0\r\n );\r\n}\r\n\r\nfunction compareFn(\r\n a: ISchedulerEvent,\r\n b: ISchedulerEvent,\r\n accessor: (c: ISchedulerEvent) => T,\r\n) {\r\n const valueA = accessor(a);\r\n const valueB = accessor(b);\r\n if (valueA === valueB) {\r\n return undefined;\r\n } else if (valueA < valueB) {\r\n return -1;\r\n } else {\r\n return 1;\r\n }\r\n}\r\n","import { H3 } from 'app/components/Typography';\r\nimport { H4 } from 'app/components/Typography';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { FlexRowDiv } from 'app/components/basic/Wrappers/FlexWrappers/flexRow';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport function NoServices() {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n \r\n

    {t(translations.NothingToShowForThisScheduler_Title)}

    \r\n

    {t(translations.NothingToShowForThisScheduler_Message)}

    \r\n
    \r\n
    \r\n );\r\n}\r\n","// https://github.com/OliverJAsh/fp-ts-react-hooks/blob/master/src/index.ts\r\n\r\nimport * as A from 'fp-ts/lib/Array';\r\nimport { Eq, fromEquals, strictEqual } from 'fp-ts/lib/Eq';\r\n//import * as O from 'fp-ts/lib/Option';\r\nimport * as ReadonlyArray from 'fp-ts/lib/ReadonlyArray';\r\nimport * as Record from 'fp-ts/lib/Record';\r\nimport * as React from 'react';\r\nimport {\r\n useCustomCompareCallback,\r\n useCustomCompareEffect,\r\n useCustomCompareMemo,\r\n} from 'use-custom-compare';\r\n\r\nconst eqStrict = fromEquals(strictEqual);\r\n\r\nexport const eq: Eq = fromEquals((a, b) =>\r\n Array.isArray(a) && Array.isArray(b)\r\n ? eqArray.equals(a, b)\r\n : eqStrict.equals(a, b),\r\n);\r\n\r\n//const eqOption = O.getEq(eq);\r\nconst eqArray = A.getEq(eq);\r\n\r\nconst eqDependencies = ReadonlyArray.getEq(eq);\r\n\r\nconst eqProps = Record.getEq(eq);\r\n\r\nexport const useCallback: typeof React.useCallback = (fn, dependencies) =>\r\n useCustomCompareCallback(\r\n fn,\r\n dependencies !== undefined ? dependencies : [],\r\n eqDependencies.equals,\r\n );\r\n\r\nexport const useEffect: typeof React.useEffect = (fn, dependencies) =>\r\n useCustomCompareEffect(\r\n fn,\r\n dependencies !== undefined ? dependencies : [],\r\n eqDependencies.equals,\r\n );\r\n\r\nexport const useMemo: typeof React.useMemo = (fn, dependencies) =>\r\n useCustomCompareMemo(\r\n fn,\r\n dependencies !== undefined ? dependencies : [],\r\n eqDependencies.equals,\r\n );\r\n\r\nexport const memo =

    (Component: React.FC

    ) =>\r\n React.memo(Component, eqProps.equals);\r\n","import { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport HTMLReactParser from 'html-react-parser';\r\nimport * as React from 'react';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\nimport { EventType } from '../../slice/types';\r\nimport {\r\n formatSchedulerDateTime,\r\n formatSchedulerTime,\r\n} from '../../utils/formatSchedulerTime';\r\nimport { ReservationStatusIcon } from './ReservationStatusIcon';\r\nimport { TrainingSessionStatus } from './TrainingSessionStatus';\r\n\r\n/**\r\n * Event Timeline Content props\r\n */\r\nexport interface EventTimelineContentProps {\r\n event: ISchedulerEvent;\r\n viewType: 'calendar' | 'timeline' | 'unit';\r\n body?: string;\r\n isMobile: boolean;\r\n}\r\n\r\n/**\r\n * Event timeline content element\r\n * @param props props\r\n * @returns Event timeline content\r\n */\r\nexport function EventTimelineContent(props: EventTimelineContentProps) {\r\n // get a render function for each event type type\r\n const RenderFC = RenderEvent(\r\n props.viewType,\r\n props.isMobile,\r\n props.event.type,\r\n props.body,\r\n );\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n\r\nfunction RenderEvent(\r\n viewType: 'calendar' | 'timeline' | 'unit',\r\n isMobile: boolean,\r\n eventType?: EventType,\r\n body?: string,\r\n): React.FC {\r\n if (eventType === undefined) {\r\n return ReservationEventConent;\r\n }\r\n switch (eventType) {\r\n case 'trainingsession':\r\n return TrainingSessionEventConent;\r\n case 'reservation':\r\n return ReservationEventConent;\r\n case 'offline':\r\n return OfflineEventConent;\r\n default:\r\n assertExhaustive(eventType);\r\n }\r\n}\r\nfunction OfflineEventConent(props: EventTimelineContentProps) {\r\n const offline = props.event.original as ICalendarReservationDto;\r\n\r\n return (\r\n \r\n \r\n {formatSchedulerDateTime(props.event.start_date)}\r\n {' - '}\r\n {props.event.end_date === null ||\r\n props.event.end_date === undefined ||\r\n props.event.end_date.getTime() >\r\n dateUtils.addYears(props.event.start_date, 5).getTime() ? (\r\n \r\n ) : (\r\n formatSchedulerDateTime(props.event.end_date)\r\n )}\r\n \r\n  \r\n {offline.Remarks != null && offline.Remarks !== undefined && (\r\n \r\n {HTMLReactParser(offline.Remarks)}\r\n \r\n )}\r\n \r\n );\r\n}\r\nfunction TrainingSessionEventConent(props: EventTimelineContentProps) {\r\n const training = props.event.original as ITrainingSessionSlotDto;\r\n\r\n return (\r\n \r\n \r\n

    \r\n {formatSchedulerTime(props.event.start_date)}\r\n {' - '}\r\n {formatSchedulerTime(props.event.end_date)}\r\n

    \r\n \r\n {training.TrainerName != null &&

    {training.TrainerName}

    }\r\n \r\n );\r\n}\r\nfunction ReservationEventConent(props: EventTimelineContentProps) {\r\n const reservation = props.event.original as ICalendarReservationDto;\r\n // const timelineTempl =\r\n // \"{{formatDate StartTime 'h:mm a'}} - {{formatDate EndTime 'h:mm a'}}\";\r\n // let compileTempl = compileHandlebarsTemplate(\r\n // timelineTempl,\r\n // );\r\n // let resTempl = compileTempl?.(reservation);\r\n const bodyContent = !!props.body ? (\r\n HTMLReactParser(props.body)\r\n ) : (\r\n \r\n {formatSchedulerTime(props.event.start_date)}\r\n {' - '}\r\n {formatSchedulerTime(props.event.end_date)}\r\n \r\n );\r\n return !!reservation && reservation.Restricted ? (\r\n {''}\r\n ) : (\r\n \r\n {!!reservation && !!reservation.StatusId && (\r\n \r\n )}\r\n {bodyContent}\r\n {/*  \r\n \r\n {formatSchedulerTime(props.event.start_date)}\r\n {' - '}\r\n {formatSchedulerTime(props.event.end_date)}\r\n */}\r\n \r\n );\r\n}\r\n","import { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { getLogger } from 'loglevel';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\nimport { EventTimelineContent } from '../EventRender/EventTimelineContent';\r\n\r\nconst log = getLogger('Scheduler - event_text');\r\nexport function event_text(\r\n viewType: 'calendar' | 'timeline' | 'unit',\r\n isMobile: boolean,\r\n SchedulerReservationBodyTemplate?: Handlebars.TemplateDelegate<\r\n ICalendarReservationDto\r\n >,\r\n): (start: Date, end: Date, event: ISchedulerEvent) => string {\r\n return function (start: Date, end: Date, event: ISchedulerEvent) {\r\n try {\r\n switch (viewType) {\r\n case 'timeline':\r\n const body =\r\n event.type === 'reservation'\r\n ? SchedulerReservationBodyTemplate?.(\r\n event.original as ICalendarReservationDto,\r\n ) ?? ''\r\n : undefined;\r\n const result = timeline_event_text({\r\n viewType,\r\n isMobile,\r\n body,\r\n event,\r\n });\r\n return result;\r\n case 'calendar':\r\n case 'unit':\r\n try {\r\n switch (event.type) {\r\n case 'reservation':\r\n const reservation = event.original as ICalendarReservationDto;\r\n const r = SchedulerReservationBodyTemplate?.(reservation) ?? '';\r\n return r;\r\n default:\r\n return '';\r\n }\r\n } catch (error) {\r\n log.error('error in event_text', event, error);\r\n return '';\r\n }\r\n default:\r\n return '';\r\n }\r\n } catch (error) {\r\n log.error('error in event_text', event, error);\r\n return '';\r\n }\r\n };\r\n}\r\n\r\nexport function timeline_event_text(props: {\r\n viewType: 'calendar' | 'timeline' | 'unit';\r\n isMobile;\r\n body?: string;\r\n event: ISchedulerEvent;\r\n}): string {\r\n try {\r\n return ReactDOMServer.renderToStaticMarkup(\r\n ,\r\n );\r\n } catch (error) {\r\n log.error('error in event_text', props.event, error);\r\n return '';\r\n }\r\n}\r\n","import { isEmptyOrWhitespace } from 'utils/typeUtils';\r\n\r\nexport interface TooltipLineProps {\r\n label: string;\r\n value: string | number | JSX.Element | JSX.Element[] | null | undefined;\r\n}\r\nexport function TooltipLine({ label: lablel, value }: TooltipLineProps) {\r\n if (value === undefined) {\r\n return null;\r\n }\r\n if (value === null) {\r\n return null;\r\n }\r\n if (typeof value === 'string' && isEmptyOrWhitespace(value)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n {lablel}: \r\n {value}\r\n
    \r\n );\r\n}\r\n","import BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { TrainingState, TrainingStateUnion } from 'enums/TrainingState';\r\nimport HTMLReactParser from 'html-react-parser';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { formatSchedulerDateTime } from '../../../utils/formatSchedulerTime';\r\nimport { SchedulerEventTooltipProps } from '../SchedulerEventTooltipProps';\r\nimport { TooltipLine } from '../TooltipLine';\r\n\r\nexport function TrainingSessionTooltip(props: SchedulerEventTooltipProps) {\r\n const dto = props.event.original as ITrainingSessionSlotDto;\r\n const statusTextLocalizationKey = statusTextKey(dto.TrainingState);\r\n const footerTextLocalizationKey = statusClickTextKey(dto.TrainingState);\r\n const available = (dto.Attendees ?? 0) < (dto.MaxAttendees ?? 0);\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {i18next.t(translations.TrainingSession)}\r\n \r\n {statusTextLocalizationKey !== undefined && available && (\r\n \r\n {i18next.t(statusTextLocalizationKey)}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {footerTextLocalizationKey !== undefined && (\r\n \r\n {i18next.t(footerTextLocalizationKey)}\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nconst statusTextKey = (stateid: number) => {\r\n const state = TrainingState[stateid] as TrainingStateUnion;\r\n try {\r\n switch (state) {\r\n case 'SignedUp':\r\n return translations.TrainingSessions_Calendar_SignedUp;\r\n case 'UnderMinimum':\r\n return translations.TrainingSessions_Calendar_UnderMinimum;\r\n case 'Available':\r\n return translations.TrainingSessions_Calendar_Available;\r\n case 'Maximum':\r\n return translations.TrainingSessions_Calendar_Maximum;\r\n default:\r\n assertExhaustive(state);\r\n }\r\n } catch (error) {\r\n return undefined;\r\n }\r\n};\r\n\r\nconst statusClickTextKey = (stateid: number) => {\r\n const state = TrainingState[stateid] as TrainingStateUnion;\r\n try {\r\n switch (state) {\r\n case 'SignedUp':\r\n return translations.TrainingSessions_Calendar_ClickToView;\r\n case 'UnderMinimum':\r\n return translations.TrainingSessions_Calendar_ClickToSignUp;\r\n case 'Available':\r\n return translations.TrainingSessions_Calendar_ClickToSignUp;\r\n case 'Maximum':\r\n return translations.TrainingSessions_Calendar_ClickToSignUp;\r\n default:\r\n assertExhaustive(state);\r\n }\r\n } catch (error) {\r\n return undefined;\r\n }\r\n};\r\n","import { IWorkingHoursDto } from 'api/odata/generated/entities/IWorkingHoursDto';\r\nimport HTMLReactParser from 'html-react-parser';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nimport { formatSchedulerDateTime } from '../../../utils/formatSchedulerTime';\r\nimport { SchedulerEventTooltipProps } from '../SchedulerEventTooltipProps';\r\nimport { TooltipLine } from '../TooltipLine';\r\n\r\nexport function OfflineTooltip(props: SchedulerEventTooltipProps) {\r\n let remarks =\r\n (props.event.original as IWorkingHoursDto).Remarks === null\r\n ? null\r\n : (props.event.original as IWorkingHoursDto).Remarks;\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","import { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { Body } from 'app/components/Typography';\r\nimport { ReservationStatus } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport HTMLReactParser from 'html-react-parser';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { ReservationStatusIcon } from '../../EventRender/ReservationStatusIcon';\r\nimport { SchedulerEventTooltipProps } from '../SchedulerEventTooltipProps';\r\n\r\nexport function ReservationTooltip(props: SchedulerEventTooltipProps) {\r\n const dto = props.event.original as ICalendarReservationDto;\r\n const statusTextLocalizationKey = statusTextKey(dto);\r\n const reservationHtml = !!props.reservationTooltipTemplate\r\n ? props.reservationTooltipTemplate(props.event.original)\r\n : undefined;\r\n return !!dto && !!dto.Restricted && dto.Restricted === true ? (\r\n <>{''}\r\n ) : (\r\n <>\r\n {!!!!dto && !!dto.StatusId && (\r\n \r\n \r\n {statusTextLocalizationKey !== undefined && (\r\n \r\n {i18next.t(statusTextLocalizationKey)}\r\n \r\n )}\r\n \r\n )}\r\n {reservationHtml !== undefined && (\r\n
    {HTMLReactParser(reservationHtml)}
    \r\n )}\r\n \r\n );\r\n}\r\nconst statusTextKey = (dto?: ICalendarReservationDto) => {\r\n const statusId = dto?.StatusId;\r\n if (statusId === undefined) {\r\n return undefined;\r\n }\r\n if (statusId === null) {\r\n return undefined;\r\n }\r\n const state = statusId as ReservationStatus;\r\n if (\r\n state === ReservationStatus.Pending ||\r\n state === ReservationStatus.PendingCoord\r\n ) {\r\n return translations.ReservationPendingApproval;\r\n } else if (state === ReservationStatus.Draft) {\r\n return translations.DraftReservationStatus;\r\n } else if (state === ReservationStatus.Approved && dto?.Tutoring === true) {\r\n return translations.ApprovedByStaff;\r\n } else {\r\n return undefined;\r\n }\r\n};\r\n","import * as ReactDOMServer from 'react-dom/server';\r\nimport * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { getLogger } from 'utils/logLevel';\r\nimport { ISchedulerEvent } from '../../types/ISchedulerEvent';\r\nimport { SchedulerEventTooltipProps } from './SchedulerEventTooltipProps';\r\nimport { TrainingSessionTooltip } from './TrainingSessionTooltip';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { OfflineTooltip } from './OfflineTooltip';\r\nimport { EventType } from '../../slice/types';\r\nimport { ReservationTooltip } from './ReservationTooltip';\r\nimport React from 'react';\r\n\r\n// tooltip template funciton signature\r\ntype ToolTipTextFn = (start: Date, end: Date, e: any) => string | boolean;\r\n\r\n/**\r\n * Customizing event tooltip template - https://docs.dhtmlx.com/scheduler/api__scheduler_tooltip_text_template.html\r\n * @param scheduler scheduler instance\r\n * @returns HTML generating function\r\n */\r\nexport function tooltip_text(\r\n scheduler: DHTMLX.SchedulerStatic,\r\n reservationTooltipTemplate,\r\n): ToolTipTextFn {\r\n const log = getLogger('tooltip_text');\r\n try {\r\n return tooltip_text_fn(scheduler, reservationTooltipTemplate);\r\n } catch (error) {\r\n log.error('Error compiling tooltip template', error);\r\n return () => '';\r\n }\r\n}\r\n\r\n/**\r\n * This function is called by the scheduler to get the tooltip\r\n * @returns tooltip text thmls\r\n */\r\nfunction tooltip_text_fn(\r\n scheduler: DHTMLX.SchedulerStatic,\r\n reservationTooltipTemplate: HandlebarsTemplateDelegate,\r\n): ToolTipTextFn {\r\n return (start: Date, end: Date, event: ISchedulerEvent) => {\r\n const HIDE_TOOLTIP = false;\r\n const schedulerEvent: ISchedulerEvent = scheduler.getEvent(event.id);\r\n try {\r\n const type = schedulerEvent.type;\r\n if (type === undefined) {\r\n return HIDE_TOOLTIP;\r\n }\r\n const TooltipElement = SchedulerEventTooltip(\r\n type,\r\n reservationTooltipTemplate,\r\n );\r\n if (TooltipElement === undefined) {\r\n return HIDE_TOOLTIP;\r\n }\r\n const tooltipElementProps = GetSchedulerEventTooltipProps(\r\n start,\r\n end,\r\n event,\r\n reservationTooltipTemplate,\r\n );\r\n if (tooltipElementProps === undefined) {\r\n return HIDE_TOOLTIP;\r\n }\r\n const html = ReactDOMServer.renderToStaticMarkup(\r\n React.createElement(TooltipElement, tooltipElementProps),\r\n );\r\n return html;\r\n } catch (error) {\r\n return HIDE_TOOLTIP;\r\n }\r\n };\r\n}\r\n\r\nfunction GetSchedulerEventTooltipProps(\r\n start: Date,\r\n end: Date,\r\n event: ISchedulerEvent,\r\n reservationTooltipTemplate: HandlebarsTemplateDelegate,\r\n): SchedulerEventTooltipProps | undefined {\r\n if (event.type === undefined) {\r\n return undefined;\r\n }\r\n switch (event.type) {\r\n case 'offline':\r\n case 'trainingsession':\r\n return { start, end, event: event };\r\n\r\n case 'reservation':\r\n return {\r\n start,\r\n end,\r\n event: event,\r\n reservationTooltipTemplate: reservationTooltipTemplate,\r\n };\r\n default:\r\n assertExhaustive(event.type);\r\n }\r\n}\r\n\r\nfunction SchedulerEventTooltip(\r\n type: EventType,\r\n reservationTooltipTemplate?: HandlebarsTemplateDelegate,\r\n): React.FC | undefined {\r\n switch (type) {\r\n case 'offline':\r\n return OfflineTooltip;\r\n case 'trainingsession':\r\n return TrainingSessionTooltip;\r\n case 'reservation':\r\n if (reservationTooltipTemplate === undefined) {\r\n return undefined;\r\n }\r\n return ReservationTooltip;\r\n default:\r\n assertExhaustive(type);\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { useDebugEffect } from './useDebugEffect';\r\n\r\n/**\r\n * Similar to React.useEffect but skips first callback and fires only for subsequent dependencies changes\r\n * @param callback useEffectCallback\r\n * @param deps dependencies\r\n */\r\nexport const useDidUpdate = (\r\n callback: React.EffectCallback,\r\n deps?: React.DependencyList,\r\n) => {\r\n const hasMount = React.useRef(false);\r\n\r\n React.useEffect(() => {\r\n if (hasMount.current) {\r\n callback();\r\n } else {\r\n hasMount.current = true;\r\n }\r\n // no need to include the callback in dependencies since it's mutation does not really matter as long as the correct dependencies are used\r\n // deps are passed as is (unchanged) for the React.useEffect to track their changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps);\r\n};\r\nexport const useDidUpdateDebug = (\r\n callback: React.EffectCallback,\r\n deps?: React.DependencyList,\r\n) => {\r\n const hasMount = React.useRef(false);\r\n\r\n useDebugEffect(\r\n () => {\r\n if (hasMount.current) {\r\n callback();\r\n } else {\r\n hasMount.current = true;\r\n }\r\n },\r\n [callback, deps],\r\n Object.entries(deps ?? {}).map(f => f[0]),\r\n );\r\n};\r\n","import * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { ScrollPosition } from './slice/types';\r\n\r\n/**\r\n * Updates the view and preserves scroll position on the timeline.\r\n * Rerenders entire scheduler including scales, headers, etc.\r\n * @param scheduler scheduler instance\r\n */\r\nexport function updateView(\r\n scheduler?: DHTMLX.SchedulerStatic,\r\n currentPosition?: ScrollPosition,\r\n forceUpdate?: boolean,\r\n) {\r\n const currentView = scheduler?.getView();\r\n if (forceUpdate === true) {\r\n scheduler?.updateView();\r\n // updateView causes the mark_now to disappear (inside of the reset_scales fn) for some reason.\r\n // _mark_now is used here to reset the current time (mark_now) marking\r\n try {\r\n (scheduler as any)?._mark_now();\r\n } catch (error) {}\r\n }\r\n if (currentPosition !== undefined) {\r\n currentView.scrollTo(currentPosition);\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport * as DHTMLX from 'dhtmlx-scheduler';\r\n\r\nexport function deleteTempReservations(\r\n schedulerRef: React.MutableRefObject,\r\n id?: string | number | undefined,\r\n) {\r\n try {\r\n schedulerRef?.current\r\n ?.getEvents()\r\n ?.filter(f => f.type === undefined)\r\n // new events generally have int id and id parameter here can be either int or string\r\n ?.filter(f => String(f.id) !== String(id))\r\n ?.forEach(f => schedulerRef?.current?.deleteEvent(f.id));\r\n } catch (error) {\r\n //noop\r\n }\r\n}\r\n","import * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { ISchedulerState } from './types/ISchedulerState';\r\nimport { ISchedulerEvent } from './types/ISchedulerEvent';\r\n\r\n/**\r\n * Resets currently shown events to their original positions.\r\n * @param scheduler scheduler instance\r\n * @param event created/updated event\r\n */\r\nexport function resetEventEdits(\r\n scheduler: DHTMLX.SchedulerStatic,\r\n event: ISchedulerEvent,\r\n) {\r\n const state: ISchedulerState = scheduler.getState();\r\n const x = scheduler\r\n .getEvents(state.min_date, state.max_date)\r\n .filter((f: ISchedulerEvent) => f.id !== event.id)\r\n .filter((f: ISchedulerEvent) => f.original?.StartTime !== undefined)\r\n .filter((f: ISchedulerEvent) => f.original?.EndTime !== undefined)\r\n .filter((f: ISchedulerEvent) => {\r\n const dd =\r\n dateUtils.formatISO(f.end_date) !== f.original.EndTime ||\r\n dateUtils.formatISO(f.start_date) !== f.original.StartTime;\r\n return dd;\r\n });\r\n\r\n x.forEach((f: ISchedulerEvent) => {\r\n f.start_date = dateUtils.parseISO(f.original.StartTime);\r\n f.end_date = dateUtils.parseISO(f.original.EndTime);\r\n scheduler.updateEvent(String(f.id));\r\n });\r\n}\r\n","export function findParentTarget(\r\n event: MouseEvent,\r\n selectors: string[],\r\n): Element | null {\r\n // check if the click target is a DOM element so that the closest method is available\r\n if (!(event.target instanceof Element)) {\r\n return null;\r\n }\r\n if (!event.target.closest) {\r\n return null;\r\n }\r\n for (const selector of selectors) {\r\n try {\r\n const container = event.target.closest(selector);\r\n if (container !== null) {\r\n return container;\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n return null;\r\n}\r\n","import { IEditEvent } from './slice/types';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { omit } from 'lodash';\r\nimport { ISchedulerEvent } from './types/ISchedulerEvent';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\n\r\n/**\r\n * Transforms the scheduler event to common form:\r\n * * dates are converted to timestamps (string)\r\n * * assembly part reservations are redirected to top assembly reservations\r\n * @param event internal scheduler's event\r\n * @returns event consumable by the reservation details components\r\n */\r\nexport const transformToSerializableEvent = (\r\n event: ISchedulerEvent,\r\n): IEditEvent => {\r\n const TopAssemblyReservationId = (event.original as ICalendarReservationDto)\r\n .TopAssemblyReservationId;\r\n /**\r\n * Clicking on the assembly part reservation should open the top assembly reservation\r\n */\r\n const reservation_id = TopAssemblyReservationId ?? event.reservation_id;\r\n const result = {\r\n ...omit(event, 'start_date', 'end_date'),\r\n ...{\r\n start_date: dateUtils.formatISO(event.start_date),\r\n end_date: dateUtils.formatISO(event.end_date),\r\n reservation_id: reservation_id,\r\n },\r\n };\r\n return result;\r\n};\r\n","// https://docs.dhtmlx.com/scheduler/pdf.html\r\n// Include the https://export.dhtmlx.com/scheduler/api.js file on the page to enable the online export service\r\n\r\nfunction defaults(obj, std) {\r\n for (var key in std) if (!obj[key]) obj[key] = std[key];\r\n return obj;\r\n}\r\nfunction getElementSizes(element, scheduler) {\r\n var sizes = { x: 0, y: 0 };\r\n element = scheduler._els[element];\r\n if (element && element[0]) {\r\n sizes.x = element[0].scrollWidth;\r\n sizes.y = element[0].scrollHeight;\r\n } else {\r\n sizes.x = 0;\r\n sizes.y = 0;\r\n }\r\n return sizes;\r\n}\r\nexport function add_export_methods(scheduler) {\r\n scheduler.exportToPDF = function (config) {\r\n config = defaults(config || {}, {\r\n name: 'calendar.pdf',\r\n format: 'A4',\r\n orientation: 'landscape',\r\n dpi: 96,\r\n zoom: 1,\r\n rtl: scheduler.config.rtl,\r\n });\r\n config.html = this._export_html(config);\r\n config.mode = this.getState().mode;\r\n this._send_to_export(config, 'pdf');\r\n };\r\n\r\n scheduler.exportToPNG = function (config) {\r\n config = defaults(config || {}, {\r\n name: 'calendar.png',\r\n format: 'A4',\r\n orientation: 'landscape',\r\n dpi: 96,\r\n zoom: 1,\r\n rtl: scheduler.config.rtl,\r\n });\r\n config.html = this._export_html(config);\r\n config.mode = this.getState().mode;\r\n this._send_to_export(config, 'png');\r\n };\r\n\r\n scheduler.exportToICal = function (config) {\r\n config = defaults(config || {}, {\r\n name: 'calendar.ical',\r\n data: this._serialize_plain(null, config),\r\n });\r\n this._send_to_export(config, 'ical');\r\n };\r\n\r\n scheduler.exportToExcel = function (config) {\r\n config = defaults(config || {}, {\r\n name: 'calendar.xlsx',\r\n title: 'Events',\r\n data: this._serialize_plain(this.templates.xml_format, config),\r\n columns: this._serialize_columns(),\r\n });\r\n this._send_to_export(config, 'excel');\r\n };\r\n\r\n /*scheduler._ajax_to_export = function (data, type, callback) {\r\n delete data.callback;\r\n var url = data.server || 'https://export.dhtmlx.com/scheduler';\r\n\r\n dhtmlxAjax.post(\r\n url,\r\n 'type=' +\r\n type +\r\n '&store=1&data=' +\r\n encodeURIComponent(JSON.stringify(data)),\r\n function (loader) {\r\n var fail = loader.xmlDoc.status > 400;\r\n var info = null;\r\n\r\n if (!fail) {\r\n try {\r\n info = JSON.parse(loader.xmlDoc.responseText);\r\n } catch (e) {}\r\n }\r\n callback(info);\r\n },\r\n );\r\n };*/\r\n\r\n scheduler._plain_export_copy = function (source, format) {\r\n var target = { start_date: null, end_date: null, $text: null };\r\n for (var key in source) target[key] = source[key];\r\n\r\n target.start_date = format(target.start_date);\r\n target.end_date = format(target.end_date);\r\n target.$text = this.templates.event_text(\r\n source.start_date,\r\n source.end_date,\r\n source,\r\n );\r\n\r\n return target;\r\n };\r\n\r\n scheduler._serialize_plain = function (format, config) {\r\n format = format || scheduler.date.date_to_str('%Y%m%dT%H%i%s', true);\r\n\r\n var events;\r\n if (config && config.start && config.end)\r\n events = scheduler.getEvents(config.start, config.end);\r\n else events = scheduler.getEvents();\r\n\r\n var data = [{}];\r\n for (var i = 0; i < events.length; i++)\r\n data[i] = this._plain_export_copy(events[i], format);\r\n\r\n return data;\r\n };\r\n\r\n scheduler._serialize_columns = function () {\r\n return [\r\n { id: 'start_date', header: 'Start Date', width: 30 },\r\n { id: 'end_date', header: 'End Date', width: 30 },\r\n { id: '$text', header: 'Text', width: 100 },\r\n ];\r\n };\r\n\r\n scheduler._send_to_export = function (data, type) {\r\n if (!data.version) {\r\n data.version = scheduler.version;\r\n }\r\n\r\n if (!data.skin) {\r\n data.skin = scheduler.skin;\r\n }\r\n\r\n if (data.callback)\r\n return scheduler._ajax_to_export(data, type, data.callback);\r\n\r\n var form = this._create_hidden_form();\r\n\r\n form.firstChild.action =\r\n data.server || 'https://export.dhtmlx.com/scheduler';\r\n form.firstChild.childNodes[0].value = JSON.stringify(data);\r\n form.firstChild.childNodes[1].value = type;\r\n form.firstChild.submit();\r\n };\r\n\r\n scheduler._create_hidden_form = function () {\r\n if (!this._hidden_export_form) {\r\n var t = (this._hidden_export_form = document.createElement('div'));\r\n t.style.display = 'none';\r\n t.innerHTML =\r\n \"
    \";\r\n document.body.appendChild(t);\r\n }\r\n return this._hidden_export_form;\r\n };\r\n\r\n scheduler._get_export_size = function (\r\n format,\r\n orientation,\r\n zoom,\r\n dpi,\r\n header,\r\n footer,\r\n scales,\r\n ) {\r\n dpi = parseInt(dpi) / 25.4 || 4;\r\n\r\n var sizes = {\r\n A5: { x: 148, y: 210 },\r\n A4: { x: 210, y: 297 },\r\n A3: { x: 297, y: 420 },\r\n A2: { x: 420, y: 594 },\r\n A1: { x: 594, y: 841 },\r\n A0: { x: 841, y: 1189 },\r\n };\r\n\r\n var dataX = getElementSizes('dhx_cal_data', this).x;\r\n var dataY = getElementSizes('dhx_cal_data', this).y;\r\n var headY = getElementSizes('dhx_cal_header', this).y;\r\n var multY = getElementSizes('dhx_multi_day', this).y;\r\n\r\n var cSize = {\r\n x: 0,\r\n y: dataY + headY + multY,\r\n };\r\n\r\n if (format === 'full') {\r\n cSize.x = dataX;\r\n } else {\r\n cSize.x = Math.floor(\r\n (orientation === 'landscape' ? sizes[format].y : sizes[format].x) * dpi,\r\n );\r\n }\r\n\r\n if (scales) {\r\n cSize.x *= parseFloat(scales.x) || 1;\r\n cSize.y *= parseFloat(scales.y) || 1;\r\n }\r\n\r\n return cSize;\r\n };\r\n\r\n function getTimeline() {\r\n var mode = scheduler.getState().mode;\r\n if (scheduler.matrix && scheduler.matrix[mode]) {\r\n return scheduler.matrix[mode];\r\n }\r\n return null;\r\n }\r\n\r\n function getInitialSizes() {\r\n var smartRendering = undefined,\r\n scrollable = undefined;\r\n\r\n var timeline = getTimeline();\r\n if (timeline) {\r\n scrollable = timeline.scrollable;\r\n smartRendering = timeline.smart_rendering;\r\n }\r\n\r\n return {\r\n nav_height: scheduler.xy.nav_height,\r\n scroll_width: scheduler.xy.scroll_width,\r\n style_width: scheduler._obj.style.width,\r\n style_height: scheduler._obj.style.height,\r\n timeline_scrollable: scrollable,\r\n timeline_smart_rendering: smartRendering,\r\n };\r\n }\r\n\r\n function setExportSizes(size, initialSizes) {\r\n scheduler._obj.style.width = size.x + 'px';\r\n scheduler._obj.style.height = size.y + 'px';\r\n\r\n scheduler.xy.nav_height = 0;\r\n scheduler.xy.scroll_width = 0;\r\n\r\n var timeline = getTimeline();\r\n if (\r\n initialSizes.timeline_scrollable ||\r\n initialSizes.timeline_smart_rendering\r\n ) {\r\n timeline.scrollable = false;\r\n timeline.smart_rendering = false;\r\n }\r\n }\r\n\r\n function setInitialSizes(initialSizes) {\r\n scheduler.xy.scroll_width = initialSizes.scroll_width;\r\n scheduler.xy.nav_height = initialSizes.nav_height;\r\n scheduler._obj.style.width = initialSizes.style_width;\r\n scheduler._obj.style.height = initialSizes.style_height;\r\n\r\n var timeline = getTimeline();\r\n if (\r\n initialSizes.timeline_scrollable ||\r\n initialSizes.timeline_smart_rendering\r\n ) {\r\n timeline.scrollable = initialSizes.timeline_scrollable;\r\n timeline.smart_rendering = initialSizes.timeline_smart_rendering;\r\n }\r\n }\r\n\r\n scheduler._export_html = function (obj) {\r\n var initialSizes = getInitialSizes();\r\n var size = scheduler._get_export_size(\r\n obj.format,\r\n obj.orientation,\r\n obj.zoom,\r\n obj.dpi,\r\n obj.header,\r\n obj.footer,\r\n obj.scales,\r\n );\r\n\r\n var html = '';\r\n try {\r\n setExportSizes(size, initialSizes);\r\n scheduler.setCurrentView();\r\n html = scheduler._obj.innerHTML;\r\n } catch (e) {\r\n console.error(e);\r\n } finally {\r\n setInitialSizes(initialSizes);\r\n scheduler.setCurrentView();\r\n }\r\n\r\n return html;\r\n };\r\n}\r\n","import { SchedulerStatic } from 'dhtmlx-scheduler';\r\nimport { useDispatch } from 'react-redux';\r\nimport { usePrintPDFSlice } from '../slice';\r\nimport React, { useCallback } from 'react';\r\nimport { PrintToPDFPopup } from '../Components/PrintToPDFPopup';\r\nimport { add_export_methods } from './ExportMethods';\r\n\r\nexport interface PrintSchedulerToPDFProps {\r\n title: string;\r\n print: boolean;\r\n printTitle: string;\r\n saveMarkedSections?: boolean;\r\n scheduler?: SchedulerStatic;\r\n close: () => void;\r\n}\r\nexport function PrintSchedulerToPDF(props: PrintSchedulerToPDFProps) {\r\n const dispatch = useDispatch();\r\n const { actions } = usePrintPDFSlice();\r\n const handleSubmit = useCallback(() => {\r\n add_export_methods(props.scheduler);\r\n props.scheduler?.exportToPDF({\r\n name: props.printTitle + '.pdf',\r\n format: 'A4',\r\n orientation: 'landscape',\r\n zoom: 1,\r\n header: `

    ${props.printTitle}

    `,\r\n //footer: '

    Bottom line

    ',\r\n });\r\n dispatch(actions.setPrinting(false));\r\n props.close();\r\n }, [actions, dispatch, props]);\r\n return (\r\n <>\r\n {props.print && (\r\n {\r\n props.close();\r\n }}\r\n onSubmit={handleSubmit}\r\n />\r\n )}\r\n \r\n );\r\n}\r\nconst styles = `.dhx_timeline_label_column {\r\n justify-content: left;\r\n}\r\n.dhx_cal_navline div {\r\n position: relative;\r\n}\r\n\r\n.medium_lines_section {\r\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAQCAYAAABk1z2tAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE5OUE3RTM4OTQ0OTExRTFCNzFDRTY3NEMwNjJGNjQzIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjE5OUE3RTM5OTQ0OTExRTFCNzFDRTY3NEMwNjJGNjQzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5QTdFMzY5NDQ5MTFFMUI3MUNFNjc0QzA2MkY2NDMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTk5QTdFMzc5NDQ5MTFFMUI3MUNFNjc0QzA2MkY2NDMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4Z9pN0AAAAhUlEQVR42uyUSwrAMAhE1cP0/ufpZWy6KI2hxOIYGkrcJQPDw88w3bWRrb15G11Vjc7MIb38d/25B+FB1noxDEFWgI/+LWAY8gSMdNLzF6RrGaP3/AUd7WhIydg/5Eg8f/66e95OCgqEdvLNkdDMkDLraC//lYMrB3+Xg+jODs/BbP0QYAB+HaheBAg0CAAAAABJRU5ErkJggg==);\r\n}\r\n.fat_lines_section {\r\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRERUI1OEJFOTQ0OTExRTE4RTFCQjY5QkY2ODNGRjA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRERUI1OEJGOTQ0OTExRTE4RTFCQjY5QkY2ODNGRjA3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NERFQjU4QkM5NDQ5MTFFMThFMUJCNjlCRjY4M0ZGMDciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NERFQjU4QkQ5NDQ5MTFFMThFMUJCNjlCRjY4M0ZGMDciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz71ubGsAAAAlUlEQVR42syVSw7AIAhEcdI7eP/jeQo/u6ZRxBbHkpi4IONTYLxEJEo/Us5ZtAghRJnHkg6UvFgTVaF6UDIALenAU8xDB943tOq0/XO18mLHs3/Rwa5eeKtzLxkVygL0C6heUx+FGk3ZMSht7I9AzXyIDjU1RrYlwPJBMqFg/bVZULCYFRMKVgf1hhoNDFZsnQFVBBgA5xp1SmVfHOUAAAAASUVORK5CYII=);\r\n}\r\n.small_lines_section {\r\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMwMzFDOUQ3OTQ0QTExRTFBOUU1QzkwQ0U3QzU5MTFGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMwMzFDOUQ4OTQ0QTExRTFBOUU1QzkwQ0U3QzU5MTFGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzAzMUM5RDU5NDRBMTFFMUE5RTVDOTBDRTdDNTkxMUYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzAzMUM5RDY5NDRBMTFFMUE5RTVDOTBDRTdDNTkxMUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz77M37BAAAAHUlEQVR42mJgQABfBlSAzsetiHyd1FNEmfEAAQYAdS4E0c+LoDcAAAAASUVORK5CYII=);\r\n}\r\n.dhx_time_block {\r\n border: 1px solid #ccc;\r\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRERUI1OEJFOTQ0OTExRTE4RTFCQjY5QkY2ODNGRjA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRERUI1OEJGOTQ0OTExRTE4RTFCQjY5QkY2ODNGRjA3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NERFQjU4QkM5NDQ5MTFFMThFMUJCNjlCRjY4M0ZGMDciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NERFQjU4QkQ5NDQ5MTFFMThFMUJCNjlCRjY4M0ZGMDciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz71ubGsAAAAlUlEQVR42syVSw7AIAhEcdI7eP/jeQo/u6ZRxBbHkpi4IONTYLxEJEo/Us5ZtAghRJnHkg6UvFgTVaF6UDIALenAU8xDB943tOq0/XO18mLHs3/Rwa5eeKtzLxkVygL0C6heUx+FGk3ZMSht7I9AzXyIDjU1RrYlwPJBMqFg/bVZULCYFRMKVgf1hhoNDFZsnQFVBBgA5xp1SmVfHOUAAAAASUVORK5CYII=);\r\n}\r\n.event_offline {\r\n border: 1px solid #ccc;\r\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAQCAYAAABk1z2tAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE5OUE3RTM4OTQ0OTExRTFCNzFDRTY3NEMwNjJGNjQzIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjE5OUE3RTM5OTQ0OTExRTFCNzFDRTY3NEMwNjJGNjQzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5QTdFMzY5NDQ5MTFFMUI3MUNFNjc0QzA2MkY2NDMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTk5QTdFMzc5NDQ5MTFFMUI3MUNFNjc0QzA2MkY2NDMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4Z9pN0AAAAhUlEQVR42uyUSwrAMAhE1cP0/ufpZWy6KI2hxOIYGkrcJQPDw88w3bWRrb15G11Vjc7MIb38d/25B+FB1noxDEFWgI/+LWAY8gSMdNLzF6RrGaP3/AUd7WhIydg/5Eg8f/66e95OCgqEdvLNkdDMkDLraC//lYMrB3+Xg+jODs/BbP0QYAB+HaheBAg0CAAAAABJRU5ErkJggg==);\r\n}\r\n\r\n.dhx_cal_event .dhx_body,\r\n.dhx_cal_event .dhx_footer,\r\n.dhx_cal_event .dhx_header,\r\n.dhx_cal_event .dhx_title {\r\n background-color: initial;\r\n padding: 3px 5px 0px 5px;\r\n}\r\n\r\n.dhx_title .dhx_training_status {\r\n float: right;\r\n margin: 0px 4px;\r\n}\r\n\r\n.dhx_title > * {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.dhx_cal_event .dhx_event_move {\r\n cursor: pointer;\r\n}\r\n.dhx_cal_event_line,\r\n.dhx_cal_event .dhx_body,\r\n.dhx_cal_event.dhx_cal_select_menu .dhx_body {\r\n font-weight: normal;\r\n}\r\n.dhx_scale_holder .dhx_cal_event .dhx_body {\r\n overflow: hidden;\r\n}\r\n.scheduler_tooltip {\r\n max-width: 350px;\r\n}\r\n.dhx_cal_event_line p,\r\n.scheduler_tooltip p {\r\n margin: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n.scheduler_tooltip div span p {\r\n margin: 0;\r\n white-space: pre-wrap;\r\n}\r\n.dhx_cal_event .dhx_body p {\r\n white-space: break-spaces;\r\n margin: 0;\r\n margin-right: 1%;\r\n}\r\n.dhx_cal_event_line {\r\n padding: 0 0 1px 6px;\r\n}\r\n.dhx_cal_event {\r\n z-index: 2;\r\n}\r\n\r\n.dhx_cal_event .dhx_title:not(.dhx_event_move) {\r\n cursor: initial;\r\n}\r\n\r\n.dhx_timeline_label_column .schedule_service_label {\r\n justify-content: start;\r\n align-self: center;\r\n}\r\n.dhx_scale_bar .schedule_service_container {\r\n flex-wrap: wrap-reverse;\r\n}\r\n.dhx_cal_header div.schedule_service_label {\r\n box-sizing: border-box;\r\n}\r\n.dhx_matrix_scell.item .dhx_scell_name {\r\n padding-left: 0px;\r\n}\r\n.schedule_service_container {\r\n box-sizing: border-box;\r\n\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n flex-direction: row;\r\n padding: 0px;\r\n gap: 10px;\r\n height: 38px;\r\n flex: none;\r\n order: 0;\r\n align-self: stretch;\r\n flex-grow: 0;\r\n}\r\n.schedule_service_image {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 0px;\r\n gap: 10px;\r\n\r\n width: 64px;\r\n height: 38px;\r\n\r\n background: #eef2f6;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n flex: none;\r\n order: 1;\r\n flex-grow: 0;\r\n}\r\n.schedule_service_image svg {\r\n align-self: center;\r\n}\r\n.schedule_service_image img {\r\n max-height: 38px;\r\n height: auto;\r\n width: auto;\r\n}\r\n.dhx_scheduler_day_unit .schedule_service_image {\r\n width: 24px;\r\n height: 24px;\r\n}\r\n.dhx_scheduler_day_unit .schedule_service_image img {\r\n max-height: 24px;\r\n max-width: 24px;\r\n height: inherit;\r\n}\r\n.dhx_scheduler_day_unit .schedule_service_image svg {\r\n align-self: center;\r\n justify-self: center;\r\n}\r\n.dhx_scheduler_day_unit .dhx_scale_bar .schedule_service_container {\r\n gap: 6px;\r\n flex-wrap: nowrap;\r\n}\r\n.schedule_service_label {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n gap: 4px;\r\n\r\n height: 24px;\r\n\r\n border-radius: 4px;\r\n\r\n flex: none;\r\n order: 2;\r\n flex-grow: 0;\r\n line-height: initial;\r\n color: white;\r\n cursor: pointer;\r\n\r\n max-width: min(100%, 26ch);\r\n}\r\n.schedule_service_label_padding {\r\n padding: 3px 8px;\r\n}\r\n.schedule_service_label_mobile_padding {\r\n padding: 2px 2px;\r\n}\r\n.schedule_service_label_text_mobile {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n width: 12ch;\r\n display: -webkit-box;\r\n -webkit-line-clamp: 2;\r\n -webkit-box-orient: vertical;\r\n text-transform: none;\r\n font-style: normal;\r\n font-weight: normal;\r\n font-size: 12px;\r\n line-height: 141%;\r\n -webkit-letter-spacing: 0.1px;\r\n -moz-letter-spacing: 0.1px;\r\n -ms-letter-spacing: 0.1px;\r\n letter-spacing: 0.1px;\r\n font-family: 'Lato', sans-serif;\r\n}\r\n.schedule_service_label_text {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n\r\n text-transform: none;\r\n font-style: normal;\r\n font-weight: normal;\r\n font-size: 14px;\r\n line-height: 141%;\r\n -webkit-letter-spacing: 0.1px;\r\n -moz-letter-spacing: 0.1px;\r\n -ms-letter-spacing: 0.1px;\r\n letter-spacing: 0.1px;\r\n font-family: 'Lato', sans-serif;\r\n}\r\n\r\n.dhx_timeline_scale_header.dhx_timeline_second_scale {\r\n width: 300px !important;\r\n height: 30px !important;\r\n}\r\n.dhx_cal_header div .dhx_scale_bar.dhx_second_scale_bar {\r\n border-left: 1px solid #e0e0e0;\r\n text-align: left;\r\n padding-left: 3px;\r\n}\r\n.dhx_timeline_second_scale.dhx_timeline_scale_header {\r\n height: 60px !important;\r\n}\r\n.dhx_cal_mobile .dhx_timeline_second_scale.dhx_timeline_scale_header {\r\n height: 70px !important;\r\n width: 100px !important;\r\n}\r\n\r\n.GroupByAssemblyPart .dhx_matrix_cell,\r\n.GroupByAssemblyPart .dhx_matrix_scell {\r\n overflow: hidden;\r\n text-align: center;\r\n vertical-align: middle;\r\n border-bottom: 1px solid #e0e0e0;\r\n border-right: 1px solid #e0e0e0;\r\n}\r\n.GroupByAssemblyPart .dhx_matrix_scell.folder,\r\n.GroupByAssemblyPart .dhx_data_table.folder .dhx_matrix_cell {\r\n border-right: 1px solid #e0e0e0;\r\n border-bottom: 1px solid #e0e0e0;\r\n}\r\n\r\n.GroupByAssemblyPart .dhx_matrix_scell.folder,\r\n.GroupByAssemblyPart .dhx_data_table.folder .dhx_matrix_cell,\r\n.GroupByAssemblyPart .dhx_matrix_scell.folder.opened .dhx_scell_expand::after,\r\n.GroupByAssemblyPart .dhx_matrix_scell.folder.closed .dhx_scell_expand::after {\r\n background-color: #fff; \r\n}\r\n\r\n.GroupByAssemblyPart .dhx_matrix_scell.folder,\r\n.GroupByAssemblyPart .dhx_data_table.folder .dhx_matrix_cell {\r\n cursor: auto;\r\n}\r\n\r\n.GroupByAssemblyPart .dhx_scell_expand::after,\r\n.GroupByAssemblyPart .dhx_scell_level {\r\n cursor: pointer;\r\n}\r\n`;\r\n","import * as React from 'react';\r\nimport * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { getLogger } from 'utils/logLevel';\r\nimport 'dhtmlx-scheduler/dhtmlxscheduler_material.css';\r\nimport clsx from 'clsx';\r\nimport './scheduler.css';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport {\r\n IChangeViewModePayload,\r\n IEditEvent,\r\n INewEvent,\r\n ISchedulerService,\r\n IViewState,\r\n RestrictDuration,\r\n ViewLengths,\r\n ViewModes,\r\n ViewTypes,\r\n} from './slice/types';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { assign, isEqual } from 'lodash';\r\nimport {\r\n adjustToTimeSlot,\r\n getSchedulerViewMode,\r\n getSchedulerViewType,\r\n getViewEndDate,\r\n getViewStartDate,\r\n MatchUnitSlotToEnd,\r\n parseViewMode,\r\n} from './utils';\r\nimport {\r\n serializeSchedulerDate,\r\n serializeSchedulerDateOrUndefined,\r\n} from './utils/formatSchedulerDateOrUndefined';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { IEquipmentTimeSlot } from 'api/odata/generated/complexTypes/IEquipmentTimeSlot';\r\nimport { SchedulerDatePositionUnion } from 'app/components/BasicTable/Filters/DatesPeriodFilter';\r\nimport { MouseEventHandler } from 'hoist-non-react-statics/node_modules/@types/react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectExportToPDF,\r\n selectSchedulerLoadingEvents,\r\n selectSchedulerReservationBodyTemplate,\r\n selectSchedulerReservationTooltipTemplate,\r\n selectSchedulerTempEvents,\r\n selectSchedulerViewCustomStart,\r\n selectTimelineGroupBy,\r\n selectWithReservationsOnly,\r\n} from './slice/selectors';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n\r\nimport {\r\n allowedToViewAlert,\r\n IsReadOnlyUser,\r\n} from 'app/permissions/WorkOrders/workOrdersPermissionUtils';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectUseAmPm,\r\n} from 'app/slice/selectors';\r\nimport { ISchedulerState } from './types/ISchedulerState';\r\nimport { IMarkedTimespan as IMarkedTimeSpan } from './types/IMarkedTimespan';\r\nimport { renderEvent } from './components/EventRender';\r\nimport { ISchedulerEvent } from './types/ISchedulerEvent';\r\nimport { adjustMonthTimelineLength } from './utils/adjustMonthTimelineLength';\r\nimport { createTimelineView } from './createTimelineView';\r\nimport { createUnitsView } from './createUnitsView';\r\nimport { RestrictDurationUnitTypes } from 'enums/RestrictDurationUnitTypes';\r\nimport { syncSchedulerEvents } from './utils/syncSchedulerEvents';\r\nimport { useSchedulerSlice } from './slice';\r\nimport { ValueChangeHandler } from 'types/ValueChangeHandler';\r\nimport { ISchedulerParseEvent } from './types/ISchedulerParseEvent';\r\nimport { scheduleServiceContainerClassName } from './renderServiceLabel';\r\nimport { NoServices } from './components/NoServices';\r\nimport { useLocation } from 'react-router-dom';\r\nimport {\r\n GetNumberOrUndefined,\r\n GetRawValue,\r\n getSplitNumberArray,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { routerActions } from 'connected-react-router';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { EmptySlotAdminClick } from 'enums/EmptySlotAdminClick';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { initOnlineServicesData } from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { useCallback } from 'app/hooks/useComparedHooks';\r\nimport { event_text } from './components/event_text';\r\nimport { tooltip_text } from './components/Tooltips';\r\nimport { CombinedSchedulerTRow } from '../Filter';\r\nimport { ICalendarReservationDto } from 'api/odata/generated/entities/ICalendarReservationDto';\r\nimport { translations } from 'locales/translations';\r\nimport { useDidUpdate } from 'app/hooks/useDidUpdate';\r\nimport { TableRowsSkeleton } from 'app/components/BasicTable/components/TableSkeleton';\r\nimport { updateView } from './updateView';\r\nimport { deleteTempReservations } from './deleteTempReservations';\r\nimport { resetEventEdits } from './resetEventEdits';\r\nimport {\r\n getServerListService,\r\n setServerList,\r\n updateServerList,\r\n} from './serverListUtils';\r\nimport { applyForceFullDayReservations } from './utils/applyForceFullDayReservations';\r\nimport { ISchedulerNewEvent } from './types/ISchedulerNewEvent';\r\nimport { adjustSchedulerEventTimes } from './utils/adjustSchedulerEventTimes';\r\nimport { getEvent } from './utils/getEvent';\r\nimport { getServiceIdFromServiceClickEvent } from './getServiceIdFromServiceClickEvent';\r\nimport { findParentTarget } from './findParentTarget';\r\nimport { transformToSerializableEvent } from './transformToSerializableEvent';\r\nimport { PrintSchedulerToPDF } from 'app/components/PrintToPDF/Scheduler';\r\nimport { SchedulerPeriod } from './types/SchedulerPeriod';\r\nimport { useOpenAssetPopUp } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\n\r\nexport interface ViewModeChangeArgs {\r\n previous?: IViewState;\r\n current: IViewState;\r\n}\r\nexport type ViewModeChangeHandler = (args: IChangeViewModePayload) => void;\r\nexport type SchedulerEventCreateHandler = (args: INewEvent) => void;\r\nexport type SchedulerEventEditHandler = ValueChangeHandler<\r\n ISchedulerParseEvent\r\n>;\r\nexport interface SchedulerProps {\r\n onDataUpdated: (s: string, ev: any, id: any) => void;\r\n events?: ISchedulerParseEvent[];\r\n nonWorkingHours?: IEquipmentTimeSlot[];\r\n services?: ISchedulerService[];\r\n viewType: ViewTypes;\r\n viewLength: ViewLengths;\r\n presetPosition: SchedulerDatePositionUnion | null;\r\n search: string;\r\n date: Timestamp;\r\n onViewModeChange?: ViewModeChangeHandler;\r\n onEdit?: SchedulerEventEditHandler;\r\n setFilterValue?: (id: string, value: FilterValueType) => void;\r\n onFilterChange?: (items: IFilterSettings[]) => void;\r\n appliedFilters?: IFilterSettings[];\r\n /**\r\n * Handles create new reservation.\r\n * Must be Memoized.\r\n */\r\n onCreate?: SchedulerEventCreateHandler;\r\n hight?: string;\r\n reservationEditEvents: Array;\r\n defaultDuration?: number;\r\n customDays?: number;\r\n customDaysEnabled?: boolean;\r\n twoDaysEnabled?: boolean;\r\n handleViewTypeLengthChange?: (\r\n type: ViewTypes,\r\n length: ViewLengths,\r\n value?: Date,\r\n noChangeLocation?: boolean,\r\n ) => void;\r\n noChangeLocation?: boolean;\r\n zoomEnabled?: boolean;\r\n}\r\n\r\nconst NEW_EVENT_TEXT = 'New event';\r\nexport const scheduler_services_collection_name = 'services';\r\nconst log = getLogger('Scheduler');\r\n\r\nexport default function Scheduler({\r\n viewLength,\r\n date,\r\n events,\r\n nonWorkingHours,\r\n services,\r\n onCreate,\r\n onEdit,\r\n setFilterValue,\r\n onFilterChange,\r\n appliedFilters,\r\n reservationEditEvents,\r\n customDays,\r\n customDaysEnabled,\r\n twoDaysEnabled,\r\n handleViewTypeLengthChange,\r\n noChangeLocation,\r\n zoomEnabled = false,\r\n ...props\r\n}: SchedulerProps) {\r\n const { t } = useTranslation();\r\n /** Reference to DHTMLX Scheduler instance */\r\n const schedulerRef = React.useRef();\r\n const dispatch = useDispatch();\r\n const { actions } = useSchedulerSlice();\r\n const location = useLocation();\r\n const { actions: globalActions } = useAppSettingsSlice();\r\n /** Reference to Scheduler container DOM element */\r\n const schedulerContainer = React.useRef(null);\r\n const isMobile = DetectIsMobile();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n\r\n const viewType = getSchedulerViewType(props.viewType, viewLength, isMobile);\r\n const viewMode = getSchedulerViewMode(props.viewType, viewLength, isMobile);\r\n const appSettings = useSelector(selectAppSettings);\r\n const hasCustomStart = useSelector(selectSchedulerViewCustomStart);\r\n const compiledSchedulerReservationBodyTemplate = useSelector(\r\n selectSchedulerReservationBodyTemplate,\r\n );\r\n const useAmPm = useSelector(selectUseAmPm);\r\n const compiledSchedulerReservationTooltipTemplate = useSelector(\r\n selectSchedulerReservationTooltipTemplate,\r\n );\r\n const openAsset = useOpenAssetPopUp();\r\n const permissionsError: string = t(\r\n translations.role_err_Permissions,\r\n ) as string;\r\n const { newDate } = useSystemDate();\r\n\r\n const defaultDuration = React.useMemo(() => {\r\n if (services !== undefined && services.length > 0) {\r\n const result =\r\n (services.map(f => f.DefaultDuration).sort((a, b) => a - b)[0] || 1) *\r\n 60;\r\n return result;\r\n }\r\n return 60;\r\n }, [services]);\r\n const restrictTimeSlots = React.useMemo(() => {\r\n if (\r\n services !== undefined &&\r\n services.length === 1 &&\r\n services[0].RestrictReservationToTimeSlots\r\n ) {\r\n return services[0].WorkingHours;\r\n }\r\n return [];\r\n }, [services]);\r\n const minDuration = React.useMemo(() => {\r\n if (services !== undefined && services.length > 0) {\r\n const result =\r\n (services.map(f => f.MinOrderHours).sort((a, b) => a - b)[0] || 0) * 60;\r\n return result;\r\n }\r\n return 0;\r\n }, [services]);\r\n const forceFullDayReservations = React.useMemo(\r\n () => services?.some(service => service.ForceFullDayReservations),\r\n [services],\r\n );\r\n\r\n const restrictDuration = React.useMemo(() => {\r\n if (services !== undefined && services.length > 0) {\r\n if (\r\n services.some(\r\n f =>\r\n (f.RestrictDurationUnitType ?? 0) > 0 &&\r\n (f.RestrictDurationUnitsAmount ?? 0) > 0,\r\n )\r\n ) {\r\n return services\r\n .filter(\r\n f =>\r\n (f.RestrictDurationUnitType ?? 0) > 0 &&\r\n (f.RestrictDurationUnitsAmount ?? 0) > 0,\r\n )\r\n .map(f => {\r\n return {\r\n durationType: (f.RestrictDurationUnitType ??\r\n 0) as RestrictDurationUnitTypes,\r\n durationAmount: f.RestrictDurationUnitsAmount ?? 0,\r\n };\r\n })[0] as RestrictDuration;\r\n }\r\n }\r\n return undefined;\r\n }, [services]);\r\n\r\n const tempReservations = useSelector(selectSchedulerTempEvents);\r\n\r\n React.useEffect(() => {\r\n deleteTempReservations(schedulerRef, tempReservations?.id);\r\n }, [tempReservations]);\r\n\r\n const handleClick = useCallback(\r\n (id: string, e: any) => {\r\n log.debug('handleClick', id, e);\r\n const event: ISchedulerEvent = schedulerRef?.current?.getEvent(id);\r\n if (event === undefined) {\r\n return;\r\n }\r\n if (event.type === undefined) {\r\n return;\r\n }\r\n if (IsReadOnlyUser(authenticatedUser)) {\r\n dispatch(\r\n globalActions.addNotification({\r\n key: 'permissionError',\r\n message: permissionsError,\r\n variant: 'error',\r\n closable: true,\r\n autoHideDuration: 3000,\r\n }),\r\n );\r\n return;\r\n }\r\n if (\r\n event.type === 'reservation' &&\r\n (event.original as ICalendarReservationDto).Restricted === true\r\n ) {\r\n return;\r\n }\r\n // check permissions to disable alert edit\r\n if (event.alert_id !== undefined) {\r\n if (\r\n !allowedToViewAlert(authenticatedUser, {\r\n ReportedBy: '',\r\n ServiceGroupId: event.original.ServiceGroupId,\r\n ServiceId: event.original.EquipmentId,\r\n ServiceTypeId: 1,\r\n })\r\n ) {\r\n return false;\r\n }\r\n }\r\n\r\n if (!!event) {\r\n let transformedEvent = transformToSerializableEvent(event);\r\n deleteTempReservations(schedulerRef);\r\n onEdit?.(transformedEvent);\r\n }\r\n return false;\r\n },\r\n [authenticatedUser, dispatch, globalActions, onEdit, permissionsError],\r\n );\r\n const scheduler = schedulerRef.current;\r\n React.useEffect(() => {\r\n scheduler?.attachEvent('onClick', handleClick, {});\r\n\r\n // cleanup\r\n return () => {\r\n scheduler?.detachEvent('onClick');\r\n };\r\n }, [handleClick, scheduler]);\r\n\r\n const handleBeforeDrag = React.useCallback(\r\n (id: string, mode: 'move' | 'resize' | 'create', e: MouseEventHandler) => {\r\n log.debug('handleBeforeDrag', id, mode, e);\r\n switch (mode) {\r\n case 'create':\r\n console.log('create call: ' + id);\r\n return true;\r\n case 'move':\r\n case 'resize':\r\n const event: ISchedulerEvent = getEvent(scheduler, id);\r\n if (event.readonly === true) {\r\n return false;\r\n }\r\n return true;\r\n default:\r\n assertExhaustive(mode);\r\n }\r\n },\r\n [scheduler],\r\n );\r\n React.useEffect(() => {\r\n const eventName = 'onBeforeDrag';\r\n if (scheduler !== undefined) {\r\n scheduler.detachEvent(eventName);\r\n scheduler.attachEvent(eventName, handleBeforeDrag, {});\r\n }\r\n }, [handleBeforeDrag, scheduler]);\r\n\r\n /**\r\n * @see https://docs.dhtmlx.com/scheduler/api__scheduler_onbeforeeventchanged_event.html\r\n */\r\n const handleBeforeEventChange = React.useCallback(\r\n (\r\n ev: ISchedulerEvent,\r\n e: MouseEventHandler,\r\n is_new: boolean,\r\n original: any,\r\n ) => {\r\n log.debug('handleBeforeEventChange', ev, e, is_new, original);\r\n if (IsReadOnlyUser(authenticatedUser)) {\r\n dispatch(\r\n globalActions.addNotification({\r\n key: 'permissionError',\r\n message: permissionsError,\r\n variant: 'error',\r\n closable: true,\r\n autoHideDuration: 3000,\r\n }),\r\n );\r\n return false;\r\n }\r\n // allow all changes to new events\r\n if (is_new || (original as any).text === NEW_EVENT_TEXT) {\r\n if (forceFullDayReservations === true) {\r\n assign(\r\n ev,\r\n applyForceFullDayReservations(\r\n {\r\n start: ev.start_date,\r\n end: ev.end_date,\r\n },\r\n forceFullDayReservations,\r\n ),\r\n );\r\n return true;\r\n // force the selected duration to fixed time slot defined in service as RestrictDurationUnitType - m/h/d,\r\n // so total duration will be equal RestrictDurationUnitsAmount;\r\n } else if (restrictDuration !== undefined) {\r\n const new_end = MatchUnitSlotToEnd(\r\n dateUtils.formatISO(ev.start_date),\r\n dateUtils.formatISO(ev.end_date),\r\n restrictDuration.durationType,\r\n restrictDuration.durationAmount,\r\n );\r\n ev.end_date = new_end;\r\n return true;\r\n } else if (restrictTimeSlots.length > 0) {\r\n let newSlot = adjustToTimeSlot(\r\n ev.start_date,\r\n ev.end_date,\r\n restrictTimeSlots,\r\n minDuration,\r\n );\r\n ev.start_date = newSlot.start;\r\n ev.end_date = newSlot.end;\r\n }\r\n return true;\r\n }\r\n // prevent service change - will be implemented later on\r\n const serviceChanged = !is_new && ev.service_id !== original.service_id;\r\n if (serviceChanged) {\r\n return false;\r\n }\r\n\r\n if (is_new || (ev as any).text === NEW_EVENT_TEXT) {\r\n // set defaultDuration - not sure if need to do some thing in this case\r\n // - we have a server side correction related to default / min / max durations.\r\n // To do: check if need to include this code on event selection\r\n // comented by Ariel Malov on 05/11/2023\r\n // // if (props.defaultDuration !== undefined && props.defaultDuration > 0) {\r\n // // ev.end_date = dateUtils.addMinutes(\r\n // // ev.start_date,\r\n // // props.defaultDuration,\r\n // // );\r\n // // schedulerRef?.current?.updateEvent(ev.id?.toString());\r\n // // return true;\r\n // // // force the provided duration when user gets to place fixed length duration reservation from the service run\r\n // // } else\r\n // moved to the section if (is_new || (original as any).text === NEW_EVENT_TEXT)\r\n // the above rows didn't run because a 'if' belove - always true.\r\n // if (forceFullDayReservations === true) {\r\n // assign(\r\n // ev,\r\n // applyForceFullDayReservations(\r\n // {\r\n // start: ev.start_date,\r\n // end: ev.end_date,\r\n // },\r\n // forceFullDayReservations,\r\n // ),\r\n // );\r\n // return true;\r\n // // force the selected duration to fixed time slot defined in service as RestrictDurationUnitType - m/h/d,\r\n // // so total duration will be equal RestrictDurationUnitsAmount;\r\n // } else if (restrictDuration !== undefined) {\r\n // const new_end = MatchUnitSlotToEnd(\r\n // dateUtils.formatISO(ev.start_date),\r\n // dateUtils.formatISO(ev.end_date),\r\n // restrictDuration.durationType,\r\n // restrictDuration.durationAmount,\r\n // );\r\n // ev.end_date = new_end;\r\n // return true;\r\n // }\r\n // return true;\r\n }\r\n return true;\r\n },\r\n [\r\n authenticatedUser,\r\n dispatch,\r\n forceFullDayReservations,\r\n globalActions,\r\n minDuration,\r\n permissionsError,\r\n restrictDuration,\r\n restrictTimeSlots,\r\n ],\r\n );\r\n React.useEffect(() => {\r\n const eventName = 'onBeforeEventChanged';\r\n if (\r\n scheduler !== undefined &&\r\n services !== undefined &&\r\n services.length > 0\r\n ) {\r\n scheduler.detachEvent(eventName);\r\n scheduler.attachEvent(eventName, handleBeforeEventChange, {});\r\n }\r\n // cleanup\r\n return () => {\r\n scheduler?.detachEvent(eventName);\r\n };\r\n }, [handleBeforeEventChange, scheduler, services]);\r\n\r\n const onEmptyClick = 'onEmptyClick';\r\n const handleEmptyClick = React.useCallback(\r\n (date: Date, event: MouseEvent) => {\r\n try {\r\n log.debug(onEmptyClick, date, event);\r\n if (scheduler === undefined) {\r\n log.debug(`${onEmptyClick} - scheduler is undefined. Exiting.`);\r\n return;\r\n }\r\n // check if the click target is a DOM element so that the closest method is available\r\n const target = event.target;\r\n if (target instanceof Element) {\r\n if (target.closest('.dhx_scell_level') !== null) {\r\n return true;\r\n }\r\n // check if the click target is a service label rendered in the timeline section\r\n const containerClassName = `.${scheduleServiceContainerClassName}`;\r\n let serviceContainer = target.closest(containerClassName);\r\n if (serviceContainer !== null) {\r\n return false;\r\n }\r\n }\r\n if (IsReadOnlyUser(authenticatedUser)) {\r\n dispatch(\r\n globalActions.addNotification({\r\n key: 'permissionError',\r\n message: permissionsError,\r\n variant: 'error',\r\n closable: true,\r\n autoHideDuration: 3000,\r\n }),\r\n );\r\n return false;\r\n }\r\n var newExisted = scheduler\r\n .getEvents()\r\n .filter(f => !!f.text && f.text === NEW_EVENT_TEXT);\r\n if (newExisted.length > 0) {\r\n return false;\r\n }\r\n let action_data = scheduler?.getActionData(event);\r\n\r\n // verify that the empty click was done inside the calendar/timeline area\r\n // this event is also raised when instrument column is clicked on the timeline in which case the date the date is equal to timeline start date\r\n const state: ISchedulerState = scheduler?.getState();\r\n const clickedInsideVisiblePeriod =\r\n date.getTime() > state.min_date.getTime() &&\r\n date.getTime() < state.max_date.getTime();\r\n if (!clickedInsideVisiblePeriod) {\r\n return false;\r\n }\r\n\r\n // get the instrument data - relevant for timeline/unit mode\r\n // in this case the event is created on specific instrument\r\n const serviceId: number | undefined = action_data.section;\r\n const service = getServerListService(scheduler, serviceId);\r\n\r\n // get the default duration for the instrument if the event placed directly on timeline/unit view\r\n const duration =\r\n props.defaultDuration !== undefined\r\n ? props.defaultDuration\r\n : service !== undefined\r\n ? service.DefaultDuration * 60\r\n : defaultDuration;\r\n let period: SchedulerPeriod = {\r\n start_date: action_data.date,\r\n end_date: scheduler.date.add(action_data.date, duration, 'minute'),\r\n };\r\n if (restrictDuration !== undefined) {\r\n const new_end = MatchUnitSlotToEnd(\r\n dateUtils.formatISO(period.start_date),\r\n dateUtils.formatISO(period.end_date),\r\n restrictDuration.durationType,\r\n restrictDuration.durationAmount,\r\n );\r\n period.end_date = new_end;\r\n }\r\n if (restrictTimeSlots.length > 0) {\r\n let newSlot = adjustToTimeSlot(\r\n period.start_date,\r\n period.end_date,\r\n restrictTimeSlots,\r\n minDuration,\r\n );\r\n period.start_date = newSlot.start;\r\n period.end_date = newSlot.end;\r\n }\r\n const new_event: ISchedulerNewEvent = {\r\n ...adjustSchedulerEventTimes(\r\n period,\r\n service?.ForceFullDayReservations ?? forceFullDayReservations,\r\n ),\r\n service_id: serviceId,\r\n text: NEW_EVENT_TEXT,\r\n };\r\n\r\n scheduler?.addEvent(new_event);\r\n log.debug(onEmptyClick, new_event);\r\n } catch (error) {\r\n log.error(onEmptyClick, error);\r\n }\r\n },\r\n [\r\n authenticatedUser,\r\n defaultDuration,\r\n dispatch,\r\n forceFullDayReservations,\r\n globalActions,\r\n minDuration,\r\n permissionsError,\r\n props.defaultDuration,\r\n restrictDuration,\r\n restrictTimeSlots,\r\n scheduler,\r\n ],\r\n );\r\n\r\n React.useEffect(() => {\r\n scheduler?.detachEvent(onEmptyClick);\r\n scheduler?.attachEvent(onEmptyClick, handleEmptyClick, {});\r\n return () => {\r\n scheduler?.detachEvent(onEmptyClick);\r\n };\r\n }, [handleEmptyClick, scheduler]);\r\n\r\n /**\r\n * Attach non memoized events\r\n * @returns scheduler instance\r\n */\r\n const initSchedulerEvents = () => {\r\n const scheduler: DHTMLX.SchedulerStatic | undefined = schedulerRef.current;\r\n if (scheduler === undefined) {\r\n return;\r\n }\r\n const onDataUpdated = props.onDataUpdated;\r\n const attachEventSettings = {};\r\n\r\n scheduler.attachEvent(\r\n 'onEventCreated',\r\n (id: number, e: MouseEventHandler) => {\r\n log.debug('onEventCreated', id, e);\r\n return true;\r\n },\r\n attachEventSettings,\r\n );\r\n\r\n scheduler.attachEvent(\r\n 'onEventAdded',\r\n (id: number, event: ISchedulerEvent) => {\r\n log.debug('onEventAdded', id, event);\r\n if (IsReadOnlyUser(authenticatedUser)) {\r\n dispatch(\r\n globalActions.addNotification({\r\n key: 'permissionError',\r\n message: permissionsError,\r\n variant: 'error',\r\n closable: true,\r\n autoHideDuration: 3000,\r\n }),\r\n );\r\n return false;\r\n }\r\n // clear previously created events other than the latest one\r\n deleteTempReservations(schedulerRef, id);\r\n resetEventEdits(scheduler, event);\r\n dispatch(actions.getEmptySlotAdminClick());\r\n const service = getServerListService(scheduler, event.service_id);\r\n const serviceId =\r\n service?.AssemblyId ?? service?.Id ?? event.service_id;\r\n\r\n onCreate?.({\r\n id: id,\r\n start_date: dateUtils.formatISO(event.start_date),\r\n end_date: dateUtils.formatISO(event.end_date),\r\n service_id: serviceId,\r\n alert_type: event.alert_type,\r\n defaultMulti: event.defaultMulti,\r\n });\r\n },\r\n attachEventSettings,\r\n );\r\n\r\n // onBeforeViewChange is triggered on init, on section change, etc.\r\n scheduler.attachEvent(\r\n 'onBeforeViewChange',\r\n function (\r\n old_mode: ViewModes | undefined,\r\n old_date: Date | undefined,\r\n mode: ViewModes,\r\n date: Date,\r\n ) {\r\n log.debug('onBeforeViewChange', { old_mode, old_date, mode, date });\r\n // silence lame events fired after section change\r\n if (\r\n isEqual(\r\n {\r\n viewMode: old_mode,\r\n date: serializeSchedulerDateOrUndefined(old_date),\r\n },\r\n {\r\n viewMode: mode,\r\n date: serializeSchedulerDate(date),\r\n },\r\n )\r\n ) {\r\n return true;\r\n }\r\n\r\n const prev =\r\n old_mode === undefined ? undefined : parseViewMode(old_mode);\r\n const prevViewState: IViewState | undefined =\r\n prev === undefined\r\n ? undefined\r\n : {\r\n preset: props.presetPosition,\r\n viewType: prev.viewType,\r\n viewLength: prev.viewLength,\r\n date: serializeSchedulerDate(date),\r\n search: props.search,\r\n };\r\n const currentViewState: IViewState = {\r\n preset: null,\r\n search: props.search,\r\n ...parseViewMode(mode),\r\n date: serializeSchedulerDate(date),\r\n };\r\n\r\n const x = (f?: IViewState) => ({\r\n viewLength: f?.viewLength,\r\n date: f?.date,\r\n });\r\n if (\r\n prevViewState === undefined ||\r\n isEqual(x(currentViewState), x(prevViewState))\r\n ) {\r\n currentViewState.preset = props.presetPosition;\r\n }\r\n\r\n // adjust timeline length\r\n adjustMonthTimelineLength(mode, date, scheduler);\r\n\r\n return true;\r\n },\r\n attachEventSettings,\r\n );\r\n\r\n // sync view mode state in scheduler -> react state\r\n // is called on date/period change + on after init\r\n scheduler.attachEvent(\r\n 'onViewChange',\r\n function (new_viewMode, new_date, b) {\r\n log.debug('onViewChange', {\r\n new_viewMode,\r\n new_date,\r\n viewType,\r\n viewLength,\r\n });\r\n },\r\n attachEventSettings,\r\n );\r\n\r\n scheduler.attachEvent(\r\n 'onDblClick',\r\n (id, event) => {\r\n log.debug('onDblClick', { id, event });\r\n // just disable double click - edit is triggered on the single click\r\n return false;\r\n },\r\n attachEventSettings,\r\n );\r\n scheduler.attachEvent(\r\n 'onBeforeEventCreated',\r\n event => {\r\n log.debug('onBeforeEventCreated', event);\r\n return true;\r\n },\r\n attachEventSettings,\r\n );\r\n\r\n // onEventChanged is fired immediately after an event is changed on the scheduler, for example - by dragging it over\r\n scheduler.attachEvent(\r\n 'onEventChanged',\r\n (id, event: ISchedulerEvent) => {\r\n log.debug('onEventChanged', id, event);\r\n if (IsReadOnlyUser(authenticatedUser)) {\r\n dispatch(\r\n globalActions.addNotification({\r\n key: 'permissionError',\r\n message: permissionsError,\r\n variant: 'error',\r\n closable: true,\r\n autoHideDuration: 3000,\r\n }),\r\n );\r\n return false;\r\n }\r\n resetEventEdits(scheduler, event);\r\n // either an existing reservation can be edited or a \"new event\" can be moved on the timeline while the sidePanel is still open\r\n const changeNewReservation = event.type === undefined;\r\n if (!changeNewReservation) {\r\n // if existing reservation is edited - drop any \"new events\"\r\n deleteTempReservations(schedulerRef);\r\n // and open the edit sidePanel for through onEdit callback\r\n onEdit?.({\r\n ...event,\r\n ...{\r\n start_date: dateUtils.formatISO(event.start_date),\r\n end_date: dateUtils.formatISO(event.end_date),\r\n },\r\n });\r\n return true;\r\n } else {\r\n // open create reservation sidePanel or adjust time if already opened\r\n onCreate?.({\r\n id: id,\r\n start_date: dateUtils.formatISO(event.start_date),\r\n end_date: dateUtils.formatISO(event.end_date),\r\n service_id: event.service_id,\r\n });\r\n }\r\n\r\n return false;\r\n },\r\n attachEventSettings,\r\n );\r\n scheduler.attachEvent(\r\n 'onEventDeleted',\r\n (id, ev) => {\r\n log.debug('onEventDeleted', { id, ev });\r\n if (onDataUpdated) {\r\n onDataUpdated('delete', ev, id);\r\n }\r\n },\r\n attachEventSettings,\r\n );\r\n scheduler.attachEvent(\r\n 'onTemplatesReady',\r\n () => {\r\n scheduler.templates.event_bar_date = (\r\n start: Date,\r\n end: Date,\r\n event: ISchedulerEvent,\r\n ) => {\r\n return `• ${dateUtils.format(\r\n start,\r\n dateUtils.DateIOFormats.fullTime,\r\n )} - ${dateUtils.format(end, dateUtils.DateIOFormats.fullTime)}`;\r\n };\r\n },\r\n attachEventSettings,\r\n );\r\n };\r\n React.useEffect(() => {\r\n // wait for both scheduler and the services to be initialized\r\n // the services will be needed in the openToBookMode for the default reservation duration\r\n if (!!scheduler && services !== undefined) {\r\n const params = new URLSearchParams(location.search);\r\n let openToBook = GetRawValue(params, 'openToBook') === 'true';\r\n let openToReport = GetRawValue(params, 'openToReport') === 'true';\r\n let serviceIds = GetRawValue(params, 'eid') ?? undefined;\r\n let alertType = GetNumberOrUndefined(\r\n GetRawValue(params, 'aType') ?? undefined,\r\n );\r\n let defaultMulti = GetRawValue(params, 'defaultMulti') === 'true';\r\n if (\r\n (openToBook === true || openToReport === true) &&\r\n serviceIds !== undefined &&\r\n services !== undefined &&\r\n services.length > 0\r\n ) {\r\n initOnlineServicesData(serviceIds, 'reserved').then(result => {\r\n !!setFilterValue && setFilterValue('service', result);\r\n dispatch(actions.getServices_Success(result as IServiceFilterDto[]));\r\n dispatch(\r\n actions.updateEmptySlotSettings(\r\n openToReport\r\n ? EmptySlotAdminClick.DownTimeOnly\r\n : EmptySlotAdminClick.ReservationsOnly,\r\n ),\r\n );\r\n });\r\n if (isMobile) {\r\n dispatch(\r\n globalActions.addNotification({\r\n key: 'ClickToReserve',\r\n message: 'Click to reserve (or click, hold and drag)',\r\n variant: 'info',\r\n closable: true,\r\n autoHideDuration: 5000,\r\n }),\r\n );\r\n } else {\r\n var event = {\r\n start_date: newDate(),\r\n end_date: scheduler.date.add(\r\n newDate(),\r\n defaultDuration || 60,\r\n 'minute',\r\n ),\r\n service_id: getSplitNumberArray(serviceIds || ''),\r\n alert_type: alertType,\r\n defaultMulti,\r\n };\r\n scheduler.addEventNow(event);\r\n }\r\n\r\n const currentSearch = new URLSearchParams();\r\n [...params.keys()].forEach(key => {\r\n if (\r\n key !== 'openToBook' &&\r\n key !== 'openToReport' &&\r\n key !== 'aType' &&\r\n key !== 'defaultMulti'\r\n ) {\r\n const val = params.get(key);\r\n if (val !== null) {\r\n currentSearch.set(key, val);\r\n }\r\n }\r\n });\r\n dispatch(\r\n routerActions.replace({\r\n pathname: location.pathname,\r\n search: currentSearch.toString(),\r\n }),\r\n );\r\n }\r\n }\r\n }, [\r\n actions,\r\n appliedFilters,\r\n defaultDuration,\r\n dispatch,\r\n globalActions,\r\n isMobile,\r\n location.pathname,\r\n location.search,\r\n newDate,\r\n onFilterChange,\r\n scheduler,\r\n services,\r\n setFilterValue,\r\n ]);\r\n /**\r\n * Main initialization\r\n */\r\n useEffectOnMount(() => {\r\n schedulerRef.current = DHTMLX.Scheduler.getSchedulerInstance();\r\n const scheduler = schedulerRef.current;\r\n if (scheduler !== undefined && schedulerContainer.current !== undefined) {\r\n scheduler.skin = 'material';\r\n scheduler.locale.labels.timeline_tab = 'Timeline';\r\n scheduler.locale.labels.calendar_tab = 'Calendar';\r\n scheduler.locale.labels.section_custom = 'Section';\r\n // native header can't be removed by removing div.dhx_cal_navline since scheduler creates it anyway\r\n // display:none hides native navline\r\n // scheduler.xy.nav_height = 0 - adjusts the heights\r\n scheduler.xy.nav_height = 0;\r\n\r\n scheduler.plugins({\r\n limit: true,\r\n all_timed: true,\r\n timeline: true,\r\n treetimeline: true,\r\n daytimeline: true,\r\n tooltip: true,\r\n units: true,\r\n multiselect: true,\r\n });\r\n\r\n const configOptions: Partial = {\r\n // show multi day events inside the scheduler body instead of showing as full day events on top\r\n all_timed: true,\r\n multi_day: true,\r\n details_on_create: false,\r\n details_on_dblclick: false,\r\n start_on_monday: tryGetStartOnMonday(),\r\n // disable internal edit on event create\r\n edit_on_create: false,\r\n hour_date: '%g:%i %A',\r\n mark_now: true,\r\n now_date: newDate(),\r\n time_step: 15,\r\n //auto_end_date: true,\r\n //event_duration: 120,\r\n touch: true,\r\n touch_drag: 500,\r\n // sets a timeout (in milliseconds) that wraps the updateView and setCurrentView calls (that cause re-drawing of the scheduler)\r\n // https://docs.dhtmlx.com/scheduler/api__scheduler_delay_render_config.html\r\n // setting delay_render to be > 0 results in timeline (both tree and matrix) not render e.g. blank view\r\n delay_render: 0,\r\n // disable dragging event by it's body element since it's handled in the readonly/move\r\n drag_event_body: false,\r\n // scroll by default to 08:00 on calendar\r\n scroll_hour: 8, // newDate().getHours(), //8,\r\n // prevents check limit cpu crunch on open end offline hours/alerts\r\n check_limits: false,\r\n };\r\n\r\n Object.assign(scheduler.config, configOptions);\r\n log.info('scheduler.config', scheduler.config);\r\n // reduce from default 70 to 40 in order to reduce precious horizontal space on mobile\r\n scheduler.xy.scale_width = isMobile ? 40 : 70;\r\n // this should be large enough to contain 2 text lines on mobile otherwise one is sufficient\r\n scheduler.xy.scale_height = isMobile ? 35 : 30;\r\n\r\n scheduler.config.hour_size_px = 44;\r\n // reduces default min height from 40px to 22px (half an hour height)\r\n scheduler.xy.min_event_height = scheduler.config.hour_size_px / 2;\r\n\r\n // cast is needed since the scheduler renderEvent is typed incompletely. According to definition it has 2 arguments, but in reality it's got 6 - see renderEvent\r\n scheduler.renderEvent = renderEvent(scheduler) as (\r\n container: HTMLElement,\r\n event: any,\r\n ) => boolean;\r\n\r\n Object.assign(scheduler.templates, {\r\n // parse function to match system settings\r\n parse_date: date => dateUtils.parseISO(date),\r\n tooltip_text: tooltip_text(\r\n scheduler,\r\n compiledSchedulerReservationTooltipTemplate,\r\n ),\r\n event_class: function (start: Date, end: Date, event: ISchedulerEvent) {\r\n const eventType = event.type;\r\n if (eventType === 'offline') {\r\n return 'event_offline';\r\n } else {\r\n if (event.id === scheduler.getState().select_id) {\r\n return 'selected';\r\n }\r\n }\r\n },\r\n // sets the calendar event text content\r\n event_text: event_text(\r\n viewType,\r\n isMobile,\r\n compiledSchedulerReservationBodyTemplate,\r\n ),\r\n // todo: set the timeline event text content - this will require rework of timeline display/or separate template since currently the timeline events won't fit the multiline text\r\n event_bar_text: event_text(\r\n viewType,\r\n isMobile,\r\n compiledSchedulerReservationBodyTemplate,\r\n ),\r\n week_scale_date: function (date) {\r\n const text = isMobile\r\n ? // Mon 12 with line break\r\n dateUtils.format(date, 'EEE') +\r\n '
    ' +\r\n dateUtils.format(date, 'dd')\r\n : // Mon, 12 Jan\r\n dateUtils.format(date, 'EEE, d LLL');\r\n\r\n return text;\r\n },\r\n unit_scale_text: function (key, label, unit, date) {\r\n return 'AAAAAAAAAAAA';\r\n },\r\n hour_scale: function (date) {\r\n // no am/pm indicator was found on the date-fns locale\r\n // removes minutes :00 manually in order to preserve precious horizontal space on mobile\r\n return useAmPm\r\n ? isMobile\r\n ? dateUtils.format(date, 'HH')?.replace(':00', '')\r\n : dateUtils.format(date, 'hh aaa')\r\n : isMobile\r\n ? dateUtils.format(date, 'p')?.replace(':00', '')\r\n : dateUtils.format(date, 'p');\r\n },\r\n // work date class\r\n week_date_class: function (date, today) {\r\n return `week_date_${dateUtils.formatISO(date, {\r\n format: 'basic',\r\n representation: 'date',\r\n })}`;\r\n },\r\n });\r\n\r\n // attaches constant events\r\n initSchedulerEvents();\r\n\r\n // serverList is needed to be able to change the \"sections\" in the lifecycle of the scheduler component\r\n // changes in the scheduler.sections is ignored by the scheduler\r\n setServerList(\r\n scheduler,\r\n services,\r\n appSettings,\r\n schedulerSectionsGroupByField,\r\n );\r\n\r\n // create all of the views like weekly calendar, daily calendar (unit) etc.\r\n createTimelineView(\r\n scheduler,\r\n isMobile,\r\n customDays || 2,\r\n useAmPm,\r\n hasCustomStart,\r\n );\r\n createUnitsView(scheduler);\r\n\r\n // initializes the scheduler\r\n scheduler.init(\r\n schedulerContainer.current as HTMLElement,\r\n getViewStartDate(viewLength, date, hasCustomStart),\r\n viewMode,\r\n );\r\n }\r\n return () => {\r\n schedulerRef.current && schedulerRef.current.destructor();\r\n };\r\n\r\n /**\r\n * try to get the monday/sunday week start\r\n * dateUtils.CurrentLocale() might return undefined if it was not initialized properly before this call, e.g. in test\r\n * @returns\r\n */\r\n function tryGetStartOnMonday(): boolean | undefined {\r\n try {\r\n return dateUtils.CurrentLocale()?.options?.weekStartsOn === 1;\r\n } catch (error) {\r\n return true;\r\n }\r\n }\r\n });\r\n\r\n const handleServiceLabelClick = React.useCallback(\r\n (event: MouseEvent, serviceId: number) => {\r\n // open the asset details\r\n openAsset({\r\n Id: undefined,\r\n serviceId: serviceId,\r\n });\r\n },\r\n [openAsset],\r\n );\r\n\r\n /**\r\n * Handles click inside the scheduler.\r\n * Clicking on an asset label/image should open asset side panel\r\n */\r\n const handleSchedulerClick = React.useCallback(\r\n (event: MouseEvent) => {\r\n log.debug('handleSchedulerClick', event);\r\n\r\n const isTimelineColumnCellClick =\r\n findParentTarget(event, ['.dhx_matrix_scell']) !== null;\r\n if (isTimelineColumnCellClick) {\r\n const serviceId = getServiceIdFromServiceClickEvent(event);\r\n if (serviceId !== undefined) {\r\n handleServiceLabelClick(event, serviceId);\r\n // prevent further event propagation if it's already handled\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return false;\r\n }\r\n }\r\n },\r\n [handleServiceLabelClick],\r\n );\r\n React.useEffect(() => {\r\n const dom = schedulerContainer.current;\r\n dom?.addEventListener('click', handleSchedulerClick, { capture: true });\r\n return () => {\r\n dom?.removeEventListener('click', handleSchedulerClick);\r\n };\r\n }, [handleSchedulerClick]);\r\n\r\n /**\r\n * Handles zoom in / out for timeline view only.\r\n * currently commented to develop later\r\n */\r\n // const handleZoomWhell = React.useCallback(\r\n // (event: WheelEvent) => {\r\n // if (!zoomEnabled) {\r\n // return;\r\n // }\r\n // let delta = 0;\r\n // if (!!(event as any).wheelDelta) {\r\n // /* IE/Opera. */\r\n // delta = (event as any).wheelDelta / 120;\r\n // } else if (event.detail) {\r\n // /* Mozilla case. */\r\n // // In Mozilla, sign of delta is different than in IE.\r\n // // Also, delta is multiple of 3.\r\n // delta = -event.detail / 3;\r\n // } else if (event.deltaY) {\r\n // delta = -event.deltaY / 3;\r\n // }\r\n // if (!(viewType === 'timeline' && !!schedulerRef.current && !!scheduler))\r\n // return;\r\n // const target = event.target;\r\n\r\n // if (!(target instanceof Element)) {\r\n // return;\r\n // }\r\n // let dataContainer = target.closest('.dhx_timeline_data_wrapper');\r\n // if (dataContainer === null) {\r\n // return;\r\n // }\r\n // let state = scheduler?.getActionData(event);\r\n // if (!state || !state.date) {\r\n // return;\r\n // }\r\n\r\n // if (delta) {\r\n // const zoomFriction = 5;\r\n // let scale = 0;\r\n // if (delta < 0) {\r\n // scale = 1 - delta / zoomFriction;\r\n // } else {\r\n // scale = 1 / (1 + delta / zoomFriction);\r\n // }\r\n // let pointer = getPointer(\r\n // {\r\n // x: event.clientX,\r\n // y: event.clientY,\r\n // },\r\n // dataContainer,\r\n // scheduler,\r\n // );\r\n // let timeline = scheduler?.matrix[viewMode];\r\n // let currentMode = parseViewMode(scheduler?.getState().mode);\r\n // let newLength = currentMode.viewLength;\r\n // if (false) {\r\n // //currentMode.viewLength === 'week'\r\n // //let pointerDate = timeline.dateFromPos(pointer.x);\r\n\r\n // const hour = 24;\r\n // const divider = 4;\r\n // const minStep = 4;\r\n // const maxStep = 8;\r\n // const column_width = 36;\r\n // //const left = timeline.posFromDate(state.date);\r\n // const top = timeline.getSectionTop(state.section);\r\n // const position = {\r\n // left: pointer.x + (pointer.x - pointer.x * scale) / 2, //Math.ceil(left / 2),\r\n // top: top / 2, //pointer.y - (pointer.y / 2) * scale, //Math.ceil(top / 2),\r\n // } as LeftTop;\r\n // // const position = {\r\n // // date: pointerDate,\r\n // // section: state.section,\r\n // // } as DateSection;\r\n // // const position = timeline.resolvePosition({\r\n // // top: e.y,\r\n // // left: e.x,\r\n // // });\r\n // // zoom in\r\n // if (delta > 0) {\r\n // if (currentStep === 0) {\r\n // timeline.x_step = hour / (divider + scale);\r\n // timeline.x_size = (divider + scale) * 7;\r\n // timeline.x_length = (divider + scale) * 7;\r\n // timeline.column_width =\r\n // timeline.column_width +\r\n // (timeline.column_width - timeline.column_width * scale); //column_width * scale;\r\n // setCurrentPosition(position);\r\n // setCurrentStep(divider + 1);\r\n // setZoomed(true);\r\n\r\n // // timeline.scrollTo(position.date, position.section);\r\n // // scheduler.setCurrentView(position.date);\r\n // } else {\r\n // timeline.x_step =\r\n // currentStep < maxStep\r\n // ? hour / (currentStep + scale)\r\n // : timeline.x_step;\r\n // timeline.x_size =\r\n // currentStep < maxStep\r\n // ? (currentStep + scale) * 7\r\n // : timeline.x_size;\r\n // timeline.x_length =\r\n // currentStep < maxStep\r\n // ? (currentStep + scale) * 7\r\n // : timeline.x_length;\r\n // timeline.column_width =\r\n // currentStep < maxStep\r\n // ? timeline.column_width +\r\n // (timeline.column_width - timeline.column_width * scale)\r\n // : timeline.column_width;\r\n // if (currentStep < maxStep) {\r\n // setCurrentStep(prev => prev + 1);\r\n // setCurrentPosition(position);\r\n // setZoomed(true);\r\n\r\n // // scheduler.setCurrentView(position.date);\r\n // // timeline.scrollTo(position.date, position.section);\r\n // }\r\n // }\r\n // }\r\n // // zoom out\r\n // else {\r\n // if (currentStep >= minStep) {\r\n // timeline.x_step =\r\n // currentStep > minStep\r\n // ? hour / (currentStep - 1)\r\n // : timeline.x_step;\r\n // timeline.x_size =\r\n // currentStep > minStep ? (currentStep - 1) * 7 : timeline.x_size;\r\n // timeline.x_length =\r\n // currentStep > minStep\r\n // ? (currentStep - 1) * 7\r\n // : timeline.x_length;\r\n // timeline.column_width =\r\n // currentStep > minStep\r\n // ? timeline.column_width / 1.5\r\n // : column_width;\r\n // if (currentStep > minStep) {\r\n // setCurrentStep(prev => prev - 1);\r\n // setCurrentPosition(position);\r\n // setZoomed(true);\r\n // }\r\n // }\r\n // }\r\n // console.log('week_timeline', timeline);\r\n // } else {\r\n // if (event.deltaY < 0) {\r\n // newLength = getPrevViewLength(\r\n // currentMode.viewLength,\r\n // customDaysEnabled,\r\n // twoDaysEnabled,\r\n // );\r\n // } else {\r\n // newLength = getNextViewLength(\r\n // currentMode.viewLength,\r\n // customDaysEnabled,\r\n // twoDaysEnabled,\r\n // );\r\n // }\r\n // if (newLength !== currentMode.viewLength) {\r\n // !!handleViewTypeLengthChange &&\r\n // handleViewTypeLengthChange(\r\n // viewType,\r\n // newLength,\r\n // getViewStartDate(newLength, state.date, hasCustomStart),\r\n // noChangeLocation,\r\n // );\r\n // }\r\n // }\r\n // event.preventDefault();\r\n // }\r\n // },\r\n // [\r\n // currentStep,\r\n // customDaysEnabled,\r\n // handleViewTypeLengthChange,\r\n // hasCustomStart,\r\n // noChangeLocation,\r\n // scheduler,\r\n // twoDaysEnabled,\r\n // viewMode,\r\n // viewType,\r\n // ],\r\n // zoomEnabled,\r\n // );\r\n /**\r\n * Bind to scheduler dom in order to handle click on instrument label/image in the timeline\r\n */\r\n\r\n // todo: find the source of services array reference change\r\n // prevent unnecessary useEffect invocations when services array reference changes for whatever reason\r\n const stringifiedServices = React.useMemo(\r\n () => (services === undefined ? undefined : JSON.stringify(services)),\r\n [services],\r\n );\r\n const parsedServices = React.useMemo(\r\n () =>\r\n stringifiedServices === undefined\r\n ? undefined\r\n : JSON.parse(stringifiedServices),\r\n [stringifiedServices],\r\n );\r\n const schedulerSectionsGroupByField = useSelector(selectTimelineGroupBy);\r\n /**\r\n * Sync props.services -> scheduler\r\n */\r\n React.useEffect(() => {\r\n if (parsedServices !== undefined) {\r\n const scheduler = schedulerRef.current;\r\n if (scheduler !== undefined) {\r\n // if (sections?.length === 0) {\r\n // sections.push({ label: '' });\r\n // }\r\n // todo: update grouping on unit->timeline transition\r\n updateServerList(\r\n scheduler,\r\n services,\r\n appSettings,\r\n schedulerSectionsGroupByField,\r\n );\r\n\r\n /**\r\n * units view does not update the service column on it's own after the updateCollection call\r\n * unlike the timeline which manages to reflect the changes immediately on it's own without any help\r\n * calendar view does not need any changes at all since it does not show separate services\r\n */\r\n if (viewType === 'unit') {\r\n updateView(schedulerRef.current);\r\n }\r\n }\r\n }\r\n }, [\r\n appSettings,\r\n parsedServices,\r\n schedulerSectionsGroupByField,\r\n services,\r\n viewType,\r\n ]);\r\n\r\n /**\r\n * Sync props.events -> scheduler\r\n */\r\n React.useEffect(() => {\r\n // return early on initial render\r\n if (events !== undefined) {\r\n syncSchedulerEvents(schedulerRef?.current, events);\r\n }\r\n }, [scheduler, events]);\r\n\r\n /**\r\n * non working hours (gaps between the working hours) need to be tracked separately due to the lack of getMarkedTimespans similar to getEvents on the scheduler API\r\n * todo: find a better way to clear/sync non working hours into the scheduler. Currently shown marked timespans might be queryable through the DOM API.\r\n */\r\n const nonWorkingHoursRef = React.useRef>([]);\r\n React.useEffect(() => {\r\n // return early on initial render\r\n if (nonWorkingHours !== undefined) {\r\n const state: ISchedulerState = schedulerRef?.current?.getState();\r\n // https://docs.dhtmlx.com/scheduler/api__scheduler_addmarkedtimespan.html\r\n const getUnits = item => {\r\n switch (viewType) {\r\n case 'unit':\r\n case 'timeline':\r\n return {\r\n [viewMode]: item.EquipmentId,\r\n };\r\n case 'calendar':\r\n return undefined;\r\n\r\n default:\r\n assertExhaustive(viewType);\r\n }\r\n };\r\n const timeSpans = nonWorkingHoursRef.current.reduce<{\r\n removed: IMarkedTimeSpan[];\r\n current: IMarkedTimeSpan[];\r\n }>(\r\n (prev, item) => {\r\n const match =\r\n item.start_date < state.max_date && item.end_date > state.min_date;\r\n (match ? prev.removed : prev.current).push(item);\r\n return prev;\r\n },\r\n {\r\n removed: [],\r\n current: [],\r\n },\r\n );\r\n timeSpans.removed.forEach(item => {\r\n schedulerRef?.current?.deleteMarkedTimespan(String(item.id));\r\n return item;\r\n });\r\n\r\n const highlights = nonWorkingHours\r\n ?.map(item => {\r\n const timeSpan = {\r\n type: 'dhx_time_block',\r\n css: 'fat_lines_section',\r\n start_date: dateUtils.parseISO(item.Start),\r\n end_date: dateUtils.parseISO(item.End),\r\n sections: getUnits(item),\r\n };\r\n var spanId = schedulerRef.current?.addMarkedTimespan(timeSpan);\r\n if (spanId === undefined) {\r\n return undefined;\r\n }\r\n const r: IMarkedTimeSpan = {\r\n id: spanId,\r\n start_date: timeSpan.start_date,\r\n end_date: timeSpan.end_date,\r\n };\r\n return r;\r\n })\r\n .filter(item => item !== undefined);\r\n nonWorkingHoursRef.current = [\r\n ...timeSpans.current,\r\n ...(highlights as IMarkedTimeSpan[]),\r\n ];\r\n\r\n // updateView here is needed since addMarkedTimespan above is not rendered immediately on the scheduler\r\n updateView(schedulerRef.current, undefined, true);\r\n }\r\n }, [nonWorkingHours, viewMode, viewType]);\r\n\r\n /**\r\n * Sync current view props from props to scheduler instance\r\n * useDidUpdate is used here to skip first fire since the scheduler is already initialized with the current view props during initial mount, so nothing needs to be done in this case.\r\n */\r\n useDidUpdate(() => {\r\n const scheduler = schedulerRef.current;\r\n if (scheduler === undefined) {\r\n return;\r\n }\r\n\r\n // TODO: remove following block? looks like the viewType parameter is redundant and resetting the calendar/timeline event text templates with subsequent updateView call just wastes the resources\r\n // TODO: clearly separate of calendar/timeline templates (if it will be possible to untangle the event_text mess)\r\n scheduler.templates.event_text = event_text(\r\n viewType,\r\n isMobile,\r\n compiledSchedulerReservationBodyTemplate,\r\n );\r\n scheduler.templates.event_bar_text = event_text(\r\n viewType,\r\n isMobile,\r\n compiledSchedulerReservationBodyTemplate,\r\n );\r\n // is this needed to update view to apply updates in event_text & event_bar_text ?\r\n updateView(scheduler);\r\n\r\n const d = dateUtils.parseISO(date);\r\n scheduler.setCurrentView(\r\n getViewStartDate(viewLength, date, hasCustomStart),\r\n viewMode,\r\n );\r\n // scroll to 08:00 on daily timeline\r\n if (viewMode === 'day_timeline') {\r\n scheduler\r\n .getView()\r\n ?.scrollTo(dateUtils.addHours(dateUtils.startOfDay(d), 8));\r\n }\r\n if (viewMode === 'twodays_timeline') {\r\n let timeline = scheduler.matrix[viewMode];\r\n timeline.setRange(\r\n getViewStartDate(viewLength, date, hasCustomStart),\r\n getViewEndDate(viewLength, date, undefined, hasCustomStart),\r\n );\r\n }\r\n if (viewMode === 'customdays_timeline') {\r\n let timeline = scheduler.matrix[viewMode];\r\n timeline.setRange(\r\n getViewStartDate(viewLength, date, hasCustomStart),\r\n getViewEndDate(viewLength, date, customDays, hasCustomStart),\r\n );\r\n }\r\n if (hasCustomStart) {\r\n const d = dateUtils.parseISO(date);\r\n if (\r\n viewMode === 'month_timeline' ||\r\n viewMode === 'week_timeline' ||\r\n viewMode === 'quarter_timeline' ||\r\n viewMode === 'year_timeline' ||\r\n viewMode === 'week' ||\r\n viewMode === 'month'\r\n ) {\r\n let timeline = scheduler.matrix[viewMode];\r\n let newStart = getViewStartDate(viewLength, date, hasCustomStart);\r\n let newEnd = getViewEndDate(\r\n viewLength,\r\n date,\r\n customDays,\r\n hasCustomStart,\r\n );\r\n\r\n if (viewMode === 'week_timeline') {\r\n scheduler.date['week_timeline_start'] = () => newStart;\r\n scheduler.date['get_week_timeline_end'] = () => newEnd;\r\n } else if (viewMode === 'week') {\r\n scheduler.date['week_start'] = () => newStart ?? d;\r\n } else if (viewMode === 'month') {\r\n scheduler.date.month_start = () => newStart ?? d;\r\n } else {\r\n timeline.setRange(newStart, newEnd);\r\n }\r\n }\r\n }\r\n }, [\r\n compiledSchedulerReservationBodyTemplate,\r\n customDays,\r\n date,\r\n hasCustomStart,\r\n isMobile,\r\n viewLength,\r\n viewMode,\r\n viewType,\r\n ]);\r\n\r\n const withReservationsOnly = useSelector(selectWithReservationsOnly);\r\n const loadingEvents = useSelector(selectSchedulerLoadingEvents);\r\n const showProgress = withReservationsOnly === true && loadingEvents === true;\r\n const showNoDataPlaceholder = services?.length === 0 && !showProgress;\r\n const hideCalData = showNoDataPlaceholder || showProgress;\r\n const print = useSelector(selectExportToPDF);\r\n const handleClosePrintToPDF = React.useCallback(() => {\r\n dispatch(actions.resetExportToPDF());\r\n }, [actions, dispatch]);\r\n const getTitle = React.useCallback(\r\n (viewType: ViewTypes): string => {\r\n switch (viewType) {\r\n case 'calendar':\r\n return t(translations.Calendar);\r\n case 'timeline':\r\n return t(translations.Timeline);\r\n default:\r\n assertExhaustive(viewType);\r\n }\r\n },\r\n [t],\r\n );\r\n return (\r\n <>\r\n \r\n \r\n {/* \r\n native header can't be removed by removing div.dhx_cal_navline since scheduler creates it anyway\r\n display:none hides native navline\r\n scheduler.xy.nav_height = 0 - adjusts the heights\r\n */}\r\n
    \r\n
    \r\n {showNoDataPlaceholder && }\r\n {showProgress && }\r\n {/* hide the calendar data without unmounting it since it's content is handled by the dhtmlx scheduler */}\r\n \r\n \r\n \r\n );\r\n}\r\n","import * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { ISchedulerEvent } from '../types/ISchedulerEvent';\r\n\r\n/**\r\n * Retrieves scheduler event by it's id\r\n * @param scheduler\r\n * @param id\r\n * @returns\r\n */\r\nexport function getEvent(\r\n scheduler: DHTMLX.SchedulerStatic | undefined,\r\n id: string,\r\n): ISchedulerEvent {\r\n return scheduler?.getEvent(id);\r\n}\r\n","import * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport function adjustMonthTimelineLength(\r\n mode: any,\r\n date: any,\r\n scheduler: DHTMLX.SchedulerStatic,\r\n) {\r\n if (mode === 'month_timeline') {\r\n if (date !== undefined) {\r\n var year = date.getFullYear();\r\n var month = date.getMonth() + 1;\r\n var d = new Date(year, month, 0);\r\n scheduler.matrix[mode].x_size = d.getDate();\r\n scheduler.matrix[mode].x_length = d.getDate();\r\n //scheduler.date['timeline_start'] = scheduler.date.month_start;\r\n //scheduler.date.\r\n }\r\n } else if (mode === 'quarter_timeline') {\r\n if (date !== undefined) {\r\n let qst = dateUtils.startOfQuarter(date);\r\n let qet = dateUtils.endOfQuarter(date);\r\n let offsetStart =\r\n dateUtils.startOfWeek(qst) < qst\r\n ? dateUtils.startOfWeek(qst).getDay()\r\n : 0;\r\n\r\n let weeks = Math.round(dateUtils.getWeekDiff(qst, qet));\r\n scheduler.matrix[mode].x_size = weeks;\r\n scheduler.matrix[mode].x_length = weeks;\r\n scheduler.matrix[mode].x_start = offsetStart;\r\n }\r\n }\r\n}\r\n","import * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { timelineColumnWidth } from './utils';\r\nimport { scheduler_services_collection_name } from './serverListUtils';\r\nimport { scheduleServiceTemplate } from './renderServiceLabel';\r\nimport { ISchedulerServiceSection } from './types/ISchedulerSection';\r\nimport { timelineEventsSortIteratee } from './utils/timelineEventsSortIteratee';\r\n\r\ninterface ITimelineColumn {\r\n name?: string;\r\n css?: string;\r\n label?: string;\r\n width: number;\r\n template: (params: ISchedulerServiceSection) => string;\r\n}\r\n\r\nexport function createTimelineView(\r\n scheduler: DHTMLX.SchedulerStatic,\r\n isMobile: boolean,\r\n customDays: number,\r\n useAmPm?: boolean,\r\n hasCustomStart?: boolean,\r\n) {\r\n const columns: ITimelineColumn[] = [\r\n {\r\n label: '',\r\n width: timelineColumnWidth(isMobile),\r\n template: scheduleServiceTemplate,\r\n },\r\n ];\r\n\r\n const s = {\r\n y_unit: scheduler.serverList(scheduler_services_collection_name),\r\n y_property: 'service_id',\r\n column_width: 70,\r\n scrollable: true,\r\n render: 'tree',\r\n event_min_dy: isMobile ? 20 : 38,\r\n columns: columns,\r\n sort: timelineEventsSortIteratee,\r\n };\r\n\r\n scheduler.createTimelineView({\r\n name: 'day_timeline',\r\n x_unit: 'minute',\r\n x_date: ' ',\r\n x_start: 0,\r\n x_step: 15,\r\n x_size: 24 * 4,\r\n x_length: 24 * 4,\r\n second_scale: {\r\n x_unit: 'hour',\r\n x_date: useAmPm ? '%h %A' : '%H:%i',\r\n },\r\n ...{\r\n ...s,\r\n column_width: 20,\r\n },\r\n });\r\n scheduler.createTimelineView({\r\n name: 'twodays_timeline',\r\n x_unit: 'hour',\r\n x_date: useAmPm ? '%h %A' : '%H:%i', //'%H:%i',\r\n x_start: 0,\r\n x_step: 24 / 6,\r\n x_size: (24 / 6) * 2,\r\n x_length: (24 / 6) * 2,\r\n second_scale: {\r\n x_unit: 'day',\r\n x_date: '%D, %j %M', // date format which should be used for second scale, \"July 01\"\r\n },\r\n ...s,\r\n });\r\n scheduler.createTimelineView({\r\n name: 'customdays_timeline',\r\n x_unit: customDays < 28 ? 'hour' : 'day',\r\n x_date:\r\n customDays < 7\r\n ? useAmPm\r\n ? '%h %A'\r\n : '%H:%i'\r\n : customDays < 28\r\n ? ' '\r\n : '%d',\r\n x_start: 0,\r\n x_step: customDays < 7 ? 24 / 6 : customDays < 28 ? 24 / 4 : 1,\r\n x_size:\r\n customDays < 7 ? (24 / 6) * customDays : customDays < 28 ? 4 * 7 : 31,\r\n x_length:\r\n customDays < 7 ? (24 / 6) * customDays : customDays < 28 ? 4 * 7 : 31,\r\n second_scale: {\r\n x_unit: customDays < 7 ? 'day' : customDays < 28 ? 'day' : 'week',\r\n x_date:\r\n customDays < 7\r\n ? '%D, %j %M'\r\n : customDays < 28\r\n ? '%D, %j %M'\r\n : '%M, W %W', // date format which should be used for second scale, \"July 01\"\r\n },\r\n ...s,\r\n });\r\n scheduler.createTimelineView({\r\n name: 'week_timeline',\r\n x_unit: 'hour',\r\n x_date: ' ',\r\n x_step: 24 / 4,\r\n x_size: 4 * 7,\r\n x_start: 0,\r\n x_length: 4 * 7,\r\n second_scale: {\r\n x_unit: 'day',\r\n x_date: '%D, %j %M', // date format which should be used for second scale, \"July 01\"\r\n },\r\n ...{\r\n ...s,\r\n column_width: 36,\r\n },\r\n });\r\n\r\n // https://docs.dhtmlx.com/scheduler/custom_views.html\r\n // sets the week_timeline period to match the week date falls into: week start -> week end according to scheduler's settings\r\n scheduler.date.week_timeline_start = date =>\r\n hasCustomStart ? date : scheduler.date.week_start(date);\r\n scheduler.date.get_week_timeline_end = start_date =>\r\n scheduler.date.add(start_date, 7, 'day');\r\n\r\n scheduler.createTimelineView({\r\n name: 'month_timeline',\r\n x_unit: 'day',\r\n x_date: '%j',\r\n x_step: 1,\r\n x_size: 31,\r\n x_start: 0,\r\n x_length: 31,\r\n\r\n second_scale: {\r\n x_unit: 'week',\r\n x_date: '%M, W %W', // date format which should be used for second scale, \"July 01\"\r\n },\r\n // sections of the view (titles of Y-Axis)\r\n ...{\r\n ...s,\r\n column_width: 36,\r\n },\r\n });\r\n scheduler.date['timeline_start'] = scheduler.date.month_start;\r\n scheduler.createTimelineView({\r\n name: 'quarter_timeline',\r\n x_unit: 'week',\r\n x_date: '%M, W %W',\r\n x_step: 1,\r\n x_size: 15,\r\n x_start: 0,\r\n x_length: 14,\r\n second_scale: {\r\n x_unit: 'month',\r\n x_date: '%F', // date format which should be used for second scale, \"July 01\"\r\n },\r\n // sections of the view (titles of Y-Axis)\r\n ...{\r\n ...s,\r\n column_width: 70,\r\n },\r\n });\r\n scheduler.createTimelineView({\r\n name: 'year_timeline',\r\n x_unit: 'month',\r\n x_date: '%M',\r\n x_step: 1,\r\n x_size: 12,\r\n x_start: 0,\r\n x_length: 12,\r\n second_scale: {\r\n x_unit: 'year',\r\n x_date: '%Y',\r\n },\r\n // sections of the view (titles of Y-Axis)\r\n ...{\r\n ...s,\r\n column_width: 70,\r\n },\r\n });\r\n return;\r\n}\r\n","import * as DHTMLX from 'dhtmlx-scheduler';\r\nimport { scheduler_services_collection_name } from './serverListUtils';\r\nimport { scheduleServiceTemplate } from './renderServiceLabel';\r\n\r\nexport function createUnitsView(scheduler: DHTMLX.SchedulerStatic) {\r\n const sharedSettings = {\r\n property: 'service_id',\r\n y_property: 'service_id',\r\n list: scheduler.serverList(scheduler_services_collection_name),\r\n };\r\n const unitsName = 'day_unit';\r\n scheduler.createUnitsView({\r\n ...sharedSettings,\r\n name: unitsName,\r\n days: 1,\r\n xy: {\r\n scale_height: 70,\r\n },\r\n });\r\n // sets the render template for unit header\r\n // https://docs.dhtmlx.com/scheduler/api__scheduler_%7Bunitsname%7D_scale_text_template.html\r\n scheduler.templates[`${unitsName}_scale_text`] = function (\r\n _key,\r\n _label,\r\n unit,\r\n _date,\r\n ) {\r\n return scheduleServiceTemplate(unit);\r\n };\r\n}\r\n","import {\r\n scheduleImageClassName,\r\n scheduleServiceContainerClassName,\r\n scheduleServiceIdAttributeName,\r\n} from './renderServiceLabel';\r\nimport { findParentTarget } from './findParentTarget';\r\n\r\n/**\r\n * Locates the service label container click and extracts service id from the click event\r\n * @param event scheduler click event\r\n * @returns service id if present\r\n */\r\nexport function getServiceIdFromServiceClickEvent(event: MouseEvent) {\r\n // check if the click target is a service label rendered in the timeline section\r\n const containerClassName = `.${scheduleServiceContainerClassName}`;\r\n const imageClassName = `.${scheduleImageClassName}`;\r\n var serviceContainer = findParentTarget(event, [\r\n containerClassName,\r\n imageClassName,\r\n ]);\r\n if (serviceContainer === null) {\r\n return undefined;\r\n }\r\n\r\n var serviceIdAttributeValue = serviceContainer.getAttribute(\r\n scheduleServiceIdAttributeName,\r\n );\r\n if (serviceIdAttributeValue === null) {\r\n return undefined;\r\n }\r\n\r\n var serviceId = parseInt(serviceIdAttributeValue);\r\n if (isNaN(serviceId)) {\r\n return undefined;\r\n } else {\r\n return serviceId;\r\n }\r\n}\r\n","/**\r\n *\r\n * EquipmentReservationPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport {\r\n AutocompleteMultiPickerEx,\r\n AutocompleteMultiPickerExProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { IReservationEquipmentDto } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { AutocompletePicker } from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nexport interface ReservationEquipmentsPickerProps\r\n extends Omit<\r\n AutocompleteMultiPickerExProps,\r\n 'loadData'\r\n > {\r\n inputProps?: InputBaseComponentProps;\r\n}\r\nconst url = '/api/odata/v4/ReservationEquipments';\r\nexport const initEquipmentsData = (\r\n initval: string | undefined,\r\n expand: string | undefined,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n let ids = (initval.indexOf(',') !== -1\r\n ? initval.split(',')\r\n : [initval]\r\n ).map(item => {\r\n return { Id: parseInt(item) };\r\n }) as Identifiable[];\r\n let foo: string | undefined = undefined;\r\n if (ids.length > 0) {\r\n const predicates: string | Condition[] = [];\r\n\r\n predicates.push(new Condition('Id', ODataOperators.Includes, ids));\r\n\r\n foo = predicates.map(f => f.toString()).join(' and ');\r\n }\r\n\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n $expand?: string;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: foo,\r\n $skip: 0,\r\n $top: 10,\r\n $expand: expand,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n expandedColumns?: string,\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'AccServices',\r\n 'AllowOneAccSerOnly',\r\n 'AllowPartialProjectCharges',\r\n 'AllowPartialSingleProjectCharges',\r\n 'AllowReservationCollaborators',\r\n 'ForceFullDayReservations',\r\n 'AssemblyId',\r\n 'HasAssemblyParts',\r\n 'AssetId',\r\n 'Billable',\r\n 'BudgetsTurnedOn',\r\n 'Color',\r\n 'DefaultAccServiceId',\r\n 'DefaultReservationDuration',\r\n 'FirstCustomFormId',\r\n 'ForceTutoring',\r\n 'HasAttendance',\r\n 'HideProjects',\r\n 'HideTrainingSession',\r\n 'IsEquipmentTutoring',\r\n 'MandatoriesEquipments',\r\n 'OfflineServices',\r\n 'MinOrderHours',\r\n 'NotAllowReservations',\r\n 'OptionalsEquipments',\r\n 'ReservationOfflineServicesEnabled',\r\n 'RestrictReservationToTimeSlots',\r\n 'TrainingSignUpApproval',\r\n 'ServiceGroupId',\r\n 'ServiceGroupName',\r\n 'CustomFormId',\r\n 'FirstCustomFormId',\r\n 'CustomForms',\r\n 'AllowModification',\r\n 'AllowExtendReservation',\r\n 'AllowUsersToShortenReservations',\r\n 'AllowedToTransfer',\r\n 'AllowedToTransferAll',\r\n 'EnforceReservationRestrictions',\r\n 'LimitlessReservationAllowed',\r\n 'MaxOrderHours',\r\n 'MinOrderGap',\r\n 'LoanTypeId',\r\n 'StaffUserSelection',\r\n 'StaffUserSelectionRequired',\r\n 'StaffUserSelectionVisible',\r\n 'RequireUserGroupCoordApproval',\r\n 'DraftReservationsTypeId',\r\n ],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n\r\n expand: expandedColumns,\r\n });\r\nexport function ReservationEquipmentsPicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n predicates,\r\n disabled,\r\n inputProps,\r\n expandedColumns,\r\n ...props\r\n}: ReservationEquipmentsPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(\r\n predicates,\r\n globalServiceGroupFilter || [],\r\n expandedColumns,\r\n );\r\n return (\r\n \r\n );\r\n}\r\nexport function ReservationSingleEquipmentPicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n predicates,\r\n disabled,\r\n inputProps,\r\n expandedColumns,\r\n ...props\r\n}: ReservationEquipmentsPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(\r\n predicates,\r\n globalServiceGroupFilter || [],\r\n expandedColumns,\r\n );\r\n return (\r\n {\r\n if (!!onChange) {\r\n if (value !== null) {\r\n return onChange([value]);\r\n } else {\r\n return onChange([]);\r\n }\r\n }\r\n }}\r\n disabled={disabled}\r\n info={info}\r\n id={id || 'reservation-equip-single-picker'}\r\n helperText={helperText}\r\n required={required}\r\n className={className}\r\n onBlur={props.onBlur}\r\n placeholder={placeholder}\r\n defaultValue={\r\n !!defaultValue\r\n ? defaultValue.length > 0\r\n ? (defaultValue[0] as IReservationEquipmentDto | undefined | null)\r\n : undefined\r\n : undefined\r\n }\r\n label={label}\r\n value={\r\n !!value\r\n ? value.length > 0\r\n ? (value[0] as IReservationEquipmentDto | undefined | null)\r\n : undefined\r\n : undefined\r\n }\r\n ariaLabel={'Equipment search'}\r\n {...props}\r\n error={props.error}\r\n />\r\n );\r\n}\r\nexport function ReservationsEquipmentFilter(\r\n firstInitEquipments: number[],\r\n mandatoryIds: number[],\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [\r\n // assembly parts should not appear in the equipment picker on the reservation side panel\r\n // only regular equipments and those that are at the top of the assembly are bookable directly\r\n new Condition(\r\n 'AssemblyId',\r\n ODataOperators.Equals,\r\n null,\r\n ),\r\n ];\r\n if (firstInitEquipments.length > 0) {\r\n let ids = firstInitEquipments.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n ids,\r\n ),\r\n );\r\n }\r\n if (mandatoryIds.length > 0) {\r\n let ids = mandatoryIds.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Excludes,\r\n ids,\r\n ),\r\n );\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n\r\nexport const loadEquipments = loadData;\r\n","/**\r\n *\r\n * FormReservationEquipmentsPicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport {\r\n ReservationEquipmentsPicker,\r\n ReservationSingleEquipmentPicker,\r\n} from '../pickers/MultiSelectPickers/EquipmentReservationPicker';\r\nimport { IReservationEquipmentDto } from 'app/pages/ReservationDetails/Details/slice/types';\r\n\r\nexport const FormReservationEquipmentsPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps & { multiple: boolean; autoExpand?: string }) => {\r\n const [field, meta, helpers] = useField(\r\n props,\r\n );\r\n if (props.multiple) {\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onChipClick={props.onChipClick}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n expandedColumns={props.autoExpand}\r\n />\r\n );\r\n } else {\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onChipClick={props.onChipClick}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n expandedColumns={props.autoExpand}\r\n />\r\n );\r\n }\r\n};\r\n","/**\r\n *\r\n * FormReservationStatusPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { ReservationStatusPicker } from '../pickers/AutocompletePickers/ReservationStatusPicker';\r\n\r\nexport const FormReservationStatusPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","import { CustomFormControl } from 'app/components/CustomForm/CusomFormControl';\r\nimport * as React from 'react';\r\nimport { CustomFormTypeEnum } from 'enums/CustomFormType';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { ICustomFormDto } from 'api/odata/generated/entities/ICustomFormDto';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useReservationSlice } from '../slice';\r\nimport { selectAsyncChangeLoading } from '../slice/selectors';\r\n\r\nexport interface ReservationCustomFormProps {\r\n multiple?: boolean;\r\n customForms: ICustomFormDto[];\r\n readonly?: boolean;\r\n isAdmin?: boolean;\r\n customFormRef: React.MutableRefObject;\r\n formIsValid?: (isValid: boolean) => void;\r\n formValues: IFormValueDto[];\r\n disabled?: boolean;\r\n validationEnabled?: boolean;\r\n saveFormValues: (\r\n values: IFormValueDto[],\r\n files: IFormFileValue[],\r\n originalFiles: IFormFileValue[],\r\n ) => void;\r\n}\r\n\r\nexport function ReservationCustomForm(props: ReservationCustomFormProps) {\r\n const {\r\n multiple,\r\n customForms,\r\n readonly,\r\n isAdmin,\r\n customFormRef,\r\n formIsValid,\r\n formValues,\r\n saveFormValues,\r\n disabled,\r\n validationEnabled = true,\r\n } = props;\r\n const dispatch = useDispatch();\r\n const { actions } = useReservationSlice();\r\n const mandatoryForms = React.useMemo(() => {\r\n return customForms.filter(f => f.Mandatory === true);\r\n }, [customForms]);\r\n const optionalForms = React.useMemo(() => {\r\n return customForms.filter(f => !f.Mandatory);\r\n }, [customForms]);\r\n const isAsyncChangeLoading = useSelector(selectAsyncChangeLoading);\r\n const selectedForms = React.useMemo(() => {\r\n return customForms.filter(f =>\r\n formValues.some(c => c.CustomFormId === f.Id),\r\n );\r\n }, [customForms, formValues]);\r\n const formValuesForms = React.useMemo(() => {\r\n return formValues.length > 0\r\n ? [\r\n ...new Set(\r\n formValues.map(f => f.CustomFormId || 0).filter(f => f > 0),\r\n ),\r\n ]\r\n : [];\r\n }, [formValues]);\r\n const onLoadCompleted = () => {\r\n if (isAsyncChangeLoading) {\r\n dispatch(actions.setAsyncChangeLoading(false));\r\n }\r\n };\r\n const onLoadStarted = () => {\r\n dispatch(actions.setAsyncChangeLoading(true));\r\n };\r\n const formId = React.useMemo(() => {\r\n return selectedForms.length > 0\r\n ? selectedForms[0].Id\r\n : formValuesForms.length > 0\r\n ? formValuesForms[0]\r\n : mandatoryForms.length > 0\r\n ? mandatoryForms[0].Id\r\n : optionalForms.length > 0\r\n ? optionalForms[0].Id\r\n : 0;\r\n }, [formValuesForms, mandatoryForms, optionalForms, selectedForms]);\r\n return customForms.length > 0 || formId > 0 ? (\r\n \r\n {multiple ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n ) : (\r\n {''}\r\n );\r\n}\r\n","import { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { IUserGroupDto } from 'api/odata/generated/entities/IUserGroupDto';\r\n\r\nexport interface BudgetListenerProps {\r\n budget: Entity | null;\r\n ReservationUserGroupGroupByBudgetUserGroup: boolean;\r\n values?: T;\r\n setUserGroup: (value: Entity | null) => void;\r\n}\r\n\r\nexport function BudgetListener(props: BudgetListenerProps) {\r\n const {\r\n budget,\r\n ReservationUserGroupGroupByBudgetUserGroup,\r\n setUserGroup,\r\n } = props;\r\n const [initilized, setInitilized] = React.useState(true);\r\n React.useEffect(() => {\r\n if (!initilized) {\r\n if (!!budget?.Id) {\r\n if (ReservationUserGroupGroupByBudgetUserGroup) {\r\n if (!!(budget as IBudgetFilterDto).UserGroupId) {\r\n setUserGroup({\r\n Id: (budget as IBudgetFilterDto).UserGroupId,\r\n Name: (budget as IBudgetFilterDto).UserGroupName,\r\n } as IUserGroupDto);\r\n }\r\n }\r\n } else {\r\n if (ReservationUserGroupGroupByBudgetUserGroup) {\r\n setUserGroup(null);\r\n }\r\n }\r\n }\r\n setInitilized(false);\r\n return () => {};\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [budget]);\r\n\r\n return null;\r\n}\r\n","import { useFormikContext } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { GlobalSettingsType } from '../useGlobalSettingsHook';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectEquipmentsSettings } from '../../slice/selectors';\r\n\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { getWorkFlowName } from '../utils';\r\n\r\nexport interface UserNameListenerProps {\r\n userName: Entity | null;\r\n equipments: Entity[];\r\n globalSettings: GlobalSettingsType;\r\n user: AuthenticatedUser | undefined;\r\n isEdit: boolean;\r\n changeHandler: (values: T, changeStatus?: boolean | undefined) => void;\r\n values: T;\r\n}\r\nexport function UserNameListener(props: UserNameListenerProps) {\r\n const { userName, equipments, globalSettings, isEdit } = props;\r\n\r\n const equipmentSettings = useSelector(selectEquipmentsSettings);\r\n const [initilized, setInitilized] = React.useState(true);\r\n const ReservationUserGroupGroupByBudgetUserGroup = React.useMemo(() => {\r\n return !!equipmentSettings\r\n ? globalSettings.reservationUserGroupGroupByBudgetUserGroup &&\r\n !equipmentSettings.HasHideProjects &&\r\n !equipmentSettings.HasConflictProjects &&\r\n equipmentSettings.BudgetsTurnedOn\r\n : globalSettings.reservationUserGroupGroupByBudgetUserGroup;\r\n }, [\r\n equipmentSettings,\r\n globalSettings.reservationUserGroupGroupByBudgetUserGroup,\r\n ]);\r\n\r\n const { setFieldValue } = useFormikContext();\r\n\r\n React.useEffect(() => {\r\n if (!initilized) {\r\n if (equipments.length > 0 && !isEdit) {\r\n if (userName !== null) {\r\n if (!ReservationUserGroupGroupByBudgetUserGroup) {\r\n setFieldValue('ADGroup', {\r\n Id: (userName as IUserFilterDto).UserGroupId,\r\n Name: (userName as IUserFilterDto).UserGroupName,\r\n });\r\n }\r\n if (globalSettings.AllowWorkflowBooking) {\r\n setFieldValue('WorkflowBooking', getWorkFlowName(userName.Id));\r\n }\r\n }\r\n }\r\n }\r\n setInitilized(false);\r\n return () => {};\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userName]);\r\n\r\n return null;\r\n}\r\n","import { useFormikContext } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { GlobalSettingsType } from '../useGlobalSettingsHook';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectEquipmentsSettings } from '../../slice/selectors';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { IReservationEquipmentDto } from '../../slice/types';\r\nimport { getBudgetVisible } from '../../slice/getBudgetVisible';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\n\r\nexport interface UserGroupListenerProps {\r\n userName: Entity | null;\r\n equipments: Entity[];\r\n userGroup: Entity | null | undefined;\r\n startTime: Date | string;\r\n endTime: Date | string;\r\n globalSettings: GlobalSettingsType;\r\n user: AuthenticatedUser | undefined;\r\n isEdit: boolean;\r\n values?: T;\r\n}\r\nexport function UserGroupListener(props: UserGroupListenerProps) {\r\n const { userName, equipments, userGroup, globalSettings, isEdit } = props;\r\n const [initilized, setInitilized] = React.useState(true);\r\n const equipmentSettings = useSelector(selectEquipmentsSettings);\r\n const budgetVisible = React.useMemo(() => {\r\n return getBudgetVisible(\r\n globalSettings,\r\n equipments as IReservationEquipmentDto[],\r\n );\r\n }, [equipments, globalSettings]);\r\n\r\n const ReservationUserGroupGroupByBudgetUserGroup = React.useMemo(() => {\r\n return !!equipmentSettings\r\n ? globalSettings.reservationUserGroupGroupByBudgetUserGroup &&\r\n !equipmentSettings.HasHideProjects &&\r\n !equipmentSettings.HasConflictProjects &&\r\n equipmentSettings.BudgetsTurnedOn\r\n : globalSettings.reservationUserGroupGroupByBudgetUserGroup;\r\n }, [\r\n equipmentSettings,\r\n globalSettings.reservationUserGroupGroupByBudgetUserGroup,\r\n ]);\r\n const { setFieldValue } = useFormikContext();\r\n React.useEffect(() => {\r\n if (!initilized) {\r\n if (userGroup !== null) {\r\n if (\r\n budgetVisible &&\r\n !isEdit &&\r\n equipments.length > 0 &&\r\n userName !== null\r\n ) {\r\n if (!ReservationUserGroupGroupByBudgetUserGroup) {\r\n setFieldValue('Budget', null);\r\n }\r\n } else {\r\n if (!ReservationUserGroupGroupByBudgetUserGroup) {\r\n if ((userName as IUserFilterDto)?.UserGroupId !== userGroup?.Id) {\r\n setFieldValue('BookedBy', null);\r\n }\r\n\r\n if (budgetVisible && !isEdit) {\r\n setFieldValue('Budget', null);\r\n }\r\n }\r\n }\r\n } else {\r\n if (!ReservationUserGroupGroupByBudgetUserGroup) {\r\n setFieldValue('BookedBy', null);\r\n if (budgetVisible && !isEdit) {\r\n setFieldValue('Budget', null);\r\n }\r\n }\r\n }\r\n }\r\n setInitilized(false);\r\n return () => {};\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userGroup]);\r\n\r\n return null;\r\n}\r\n","import { useFormikContext } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { GlobalSettingsType } from '../useGlobalSettingsHook';\r\nimport { useDispatch } from 'react-redux';\r\nimport { newDate } from '../utils';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { ServiceSettingsState } from '../../slice/types';\r\nimport { useRepetitiveSlice } from 'app/components/Forms/FormRepetitive/slice';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { CustomDate } from 'types/CustomDate';\r\n\r\nexport interface StartTimeListenerProps {\r\n userName: Entity | null;\r\n equipments: Entity[];\r\n globalSettings: GlobalSettingsType;\r\n user: AuthenticatedUser | undefined;\r\n startTime: Date | string;\r\n endTime: Date | string;\r\n initialStart: Date | string;\r\n initialEnd: Date | string;\r\n changeHandler: (values: T, changeStatus?: boolean | undefined) => void;\r\n equipmentSettings: ServiceSettingsState | undefined;\r\n isEdit: boolean;\r\n values: T;\r\n}\r\nexport function StartTimeListener(props: StartTimeListenerProps) {\r\n const {\r\n userName,\r\n equipments,\r\n startTime,\r\n endTime,\r\n initialStart,\r\n initialEnd,\r\n values,\r\n equipmentSettings,\r\n changeHandler,\r\n } = props;\r\n const [prevStartTime, setPrevStartTime] = React.useState<\r\n Date | string | undefined\r\n >(initialStart);\r\n const [prevEndTime, setPrevEndTime] = React.useState<\r\n Date | string | undefined\r\n >(initialEnd);\r\n const [isStartChanged, setIsStartChanged] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [isEndChanged, setIsEndChanged] = React.useState(\r\n undefined,\r\n );\r\n const dispatch = useDispatch();\r\n const { actions: repetitiveActions } = useRepetitiveSlice();\r\n const [initilized, setInitilized] = React.useState(true);\r\n\r\n const { setFieldTouched, validateForm } = useFormikContext();\r\n React.useEffect(() => {\r\n if (!initilized) {\r\n let start = newDate(startTime);\r\n let end =\r\n endTime === null\r\n ? newDate(\r\n dateUtils.set(start, {\r\n hours:\r\n start.getHours() +\r\n (equipmentSettings?.DefaultReservationDuration || 1),\r\n minutes: start.getMinutes(),\r\n }),\r\n )\r\n : newDate(endTime);\r\n //Start Time Changed\r\n if (!!prevStartTime) {\r\n let prev = newDate(prevStartTime);\r\n if (start.getTime() !== prev.getTime()) {\r\n if (end === null) {\r\n let dt = newDate(start);\r\n end = newDate(\r\n new Date(\r\n dt.setHours(\r\n start.getHours() +\r\n (equipmentSettings?.DefaultReservationDuration || 1) +\r\n start.getMinutes(),\r\n ),\r\n ),\r\n );\r\n }\r\n end = newDate(\r\n new Date(end.getTime() + start.getTime() - prev.getTime()),\r\n );\r\n setTimeout(() => setFieldTouched('EndTime', true, false));\r\n\r\n setTimeout(() => validateForm({ ...values, EndTime: end }));\r\n setPrevStartTime(start);\r\n setIsStartChanged(true);\r\n setIsEndChanged(undefined);\r\n setPrevEndTime(end);\r\n dispatch(\r\n repetitiveActions.setRepetitiveValue({\r\n fieldKey: 'RecurringEndDate',\r\n fieldValue: dateUtils.formatISO(\r\n new CustomDate(dateUtils.addDays(start, 7), 'date'),\r\n ),\r\n }),\r\n );\r\n } else {\r\n let prevEnd = newDate(prevEndTime);\r\n if (end.getTime() !== prevEnd.getTime()) {\r\n setIsEndChanged(true);\r\n }\r\n setPrevEndTime(end);\r\n }\r\n }\r\n if (\r\n equipments.length > 0 &&\r\n userName != null &&\r\n (isStartChanged || isEndChanged)\r\n ) {\r\n changeHandler({ ...values, EndTime: end }, false);\r\n console.log('StartTime Changed');\r\n setIsStartChanged(undefined);\r\n setIsEndChanged(undefined);\r\n }\r\n }\r\n setInitilized(false);\r\n return () => {};\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [startTime, endTime]);\r\n\r\n return null;\r\n}\r\n","import { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { GlobalSettingsType } from '../useGlobalSettingsHook';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectAsyncChangeLoading } from '../../slice/selectors';\r\n\r\nexport interface EndTimeListenerProps {\r\n userName: Entity | null;\r\n equipments: Entity[];\r\n globalSettings: GlobalSettingsType;\r\n user: AuthenticatedUser | undefined;\r\n endTime: Date | string;\r\n isEdit: boolean;\r\n changeHandler: (values: T, changeStatus?: boolean | undefined) => void;\r\n values: T;\r\n}\r\nexport function EndTimeListener(props: EndTimeListenerProps) {\r\n const {\r\n userName,\r\n equipments,\r\n endTime,\r\n isEdit,\r\n changeHandler,\r\n values,\r\n } = props;\r\n const [initialized, setInitialized] = React.useState(true);\r\n const asyncChangeLoading = useSelector(selectAsyncChangeLoading);\r\n React.useEffect(() => {\r\n if (!initialized) {\r\n if (\r\n equipments.length > 0 &&\r\n userName != null &&\r\n !isEdit &&\r\n !asyncChangeLoading\r\n ) {\r\n changeHandler(values);\r\n }\r\n }\r\n setInitialized(false);\r\n return () => {};\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [endTime]);\r\n\r\n return null;\r\n}\r\n","/**\r\n *\r\n * ChipCheckBoxGroup\r\n *\r\n */\r\nimport {\r\n FormControl,\r\n FormGroup,\r\n FormHelperText,\r\n FormLabel,\r\n styled,\r\n} from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { inputLabelXS } from 'styles/typography/bookitTypography';\r\nimport { BookitChipWithCheck } from '.';\r\nimport { CheckEntity } from '../CheckBoxGroup';\r\nimport FormControlLabel from '../Forms/FormControls/FormControlLabel';\r\n\r\nexport interface ChipCheckBoxGroupProps {\r\n options: CheckEntity[];\r\n value?: CheckEntity[];\r\n className?: string;\r\n onChange?: (\r\n value: CheckEntity,\r\n event: React.ChangeEvent,\r\n ) => void;\r\n id: string;\r\n //formik\r\n name?: string;\r\n error?: boolean;\r\n label?: string;\r\n disabled?: boolean;\r\n required?: boolean;\r\n helperText?: string;\r\n info?: string;\r\n fullWidth?: boolean;\r\n size?: 'small' | 'medium';\r\n margin?: 'none' | 'dense' | 'normal';\r\n isRow?: boolean;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport function ChipCheckBoxGroup({\r\n name,\r\n id,\r\n value,\r\n options,\r\n onChange,\r\n label,\r\n required,\r\n helperText,\r\n disabled,\r\n fullWidth,\r\n margin,\r\n error,\r\n size,\r\n isRow,\r\n style,\r\n ...props\r\n}: ChipCheckBoxGroupProps) {\r\n const handleChange = (event: React.ChangeEvent) => {\r\n const value = {\r\n Id: parseInt(event.target.id),\r\n Name: event.target.name,\r\n checked: event.target.checked,\r\n disabled: event.target.disabled,\r\n } as CheckEntity;\r\n if (onChange !== undefined) {\r\n onChange(value, event);\r\n }\r\n };\r\n return (\r\n \r\n {label}\r\n \r\n {options.map((item, index) => (\r\n 24 ? item.Name : undefined}\r\n onChange={handleChange}\r\n size=\"medium\"\r\n color=\"primary\"\r\n />\r\n }\r\n />\r\n ))}\r\n \r\n {helperText}\r\n \r\n );\r\n}\r\nconst StyledFormLabel = styled(FormLabel)(({ theme }) => ({\r\n color: theme.palette.common.graySubtitle,\r\n inputLabelXS,\r\n '.Mui-focused &': {\r\n color: theme.palette.common.graySubtitle,\r\n },\r\n}));\r\n","/**\r\n *\r\n * ChipLabelGroup\r\n *\r\n */\r\nimport {\r\n Box,\r\n FormControl,\r\n FormHelperText,\r\n FormLabel,\r\n styled,\r\n} from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { inputLabelXS } from 'styles/typography/bookitTypography';\r\nimport { BookitChipWithInfo } from '.';\r\nimport { CheckEntity, ChipEntity } from '../CheckBoxGroup';\r\n\r\nexport interface ChipLabelGroupProps {\r\n options: ChipEntity[];\r\n value?: ChipEntity[];\r\n className?: string;\r\n onChipClick?: (chip: ChipEntity) => void;\r\n onChange?: (\r\n value: CheckEntity,\r\n event: React.ChangeEvent,\r\n ) => void;\r\n id: string;\r\n //formik\r\n name?: string;\r\n error?: boolean;\r\n label?: string;\r\n disabled?: boolean;\r\n required?: boolean;\r\n helperText?: string;\r\n info?: string;\r\n fullWidth?: boolean;\r\n size?: 'small' | 'medium';\r\n margin?: 'none' | 'dense' | 'normal';\r\n isRow?: boolean;\r\n}\r\n\r\nexport function ChipLabelGroup({\r\n name,\r\n id,\r\n value,\r\n options,\r\n onChange,\r\n label,\r\n onChipClick,\r\n required,\r\n helperText,\r\n disabled,\r\n fullWidth,\r\n margin,\r\n error,\r\n size,\r\n isRow,\r\n ...props\r\n}: ChipLabelGroupProps) {\r\n // const handleChange = (event: React.ChangeEvent) => {\r\n // const value = {\r\n // Id: parseInt(event.target.id),\r\n // Name: event.target.name,\r\n // checked: event.target.checked,\r\n // } as CheckEntity;\r\n // if (onChange !== undefined) {\r\n // onChange(value, event);\r\n // }\r\n // };\r\n return (\r\n \r\n {label}\r\n \r\n {options.map((item, index) => (\r\n \r\n !!onChipClick && onChipClick(item)}\r\n fullwidth={fullWidth}\r\n variant=\"default\"\r\n size={size || 'small'}\r\n label={item.Name}\r\n key={`chip-${item.Id}`}\r\n customwidth={260}\r\n info={item.info}\r\n />\r\n \r\n ))}\r\n \r\n {helperText && {helperText}}\r\n \r\n );\r\n}\r\nconst StyledFormLabel = styled(FormLabel)(({ theme }) => ({\r\n color: theme.palette.common.graySubtitle,\r\n ...inputLabelXS,\r\n '.Mui-focused &': {\r\n color: theme.palette.common.graySubtitle,\r\n },\r\n}));\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport { ChangeEvent } from 'react';\r\nimport {\r\n ChipCheckBoxGroup,\r\n ChipCheckBoxGroupProps,\r\n} from '../BasicChip/ChipChekBoxGroup';\r\nimport {\r\n ChipLabelGroup,\r\n ChipLabelGroupProps,\r\n} from '../BasicChip/ChipLabelGroup';\r\nimport { CheckEntity, ChipEntity } from '../CheckBoxGroup';\r\n\r\n//export type FormCheckBoxGroupProps = FieldHookConfig & CheckBoxGroupProps;\r\n\r\nexport const FormChipCheckBoxGroup = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n ChipCheckBoxGroupProps & { setOnChanged: () => void }) => {\r\n const [field, meta, helpers] = useField(props);\r\n const handleChange = (\r\n value: CheckEntity,\r\n event: ChangeEvent,\r\n ) => {\r\n const val = value as CheckEntity;\r\n helpers.setValue(\r\n field.value.map(f => {\r\n if (f.Id === val.Id) {\r\n return { ...f, checked: val.checked };\r\n }\r\n return f;\r\n }),\r\n true,\r\n );\r\n field.onChange(event);\r\n if (props.onChange !== undefined) {\r\n props.onChange(value, event);\r\n }\r\n props.setOnChanged();\r\n };\r\n return (\r\n \r\n );\r\n};\r\nexport const FormChipLabelGroup = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n ChipLabelGroupProps & { onChipClick?: (value: ChipEntity) => void }) => {\r\n const [field, meta] = useField(props);\r\n const handleChipClick = (value: ChipEntity) => {\r\n !!props.onChipClick && props.onChipClick(value);\r\n };\r\n // const handleChange = (value, event) => {\r\n // const val = value as CheckEntity;\r\n // helpers.setValue(\r\n // field.value.map(f => {\r\n // if (f.Id === val.Id) {\r\n // f.checked = val.checked;\r\n // }\r\n // return f;\r\n // }),\r\n // true,\r\n // );\r\n // if (props.onChange !== undefined) {\r\n // props.onChange(value, event);\r\n // }\r\n // field.onChange(event);\r\n // };\r\n return (\r\n \r\n );\r\n};\r\n","import { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { OtherServicesApi } from 'api/OtherServicesApi';\r\nimport { FormFieldsSection } from 'app/components/Forms/FormsLayout';\r\nimport {\r\n loadOfflineServiceData,\r\n ReservationsRelatedFilter,\r\n} from 'app/components/pickers/AutocompletePickers/OfflineServiceTypePicker';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { BookQuickServices } from 'app/pages/OtherServiceDetails/Details/components/BookQuickServices';\r\nimport { useOfflineServiceStateSlice } from 'app/pages/OtherServiceDetails/Details/slice';\r\nimport { selectSavedReservationService } from 'app/pages/OtherServiceDetails/Details/slice/selectors';\r\nimport {\r\n ErrorServices,\r\n OfflineServicesResponse,\r\n} from 'app/pages/OtherServiceDetails/Details/slice/types';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { AxiosError } from 'axios';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { useReservationSlice } from '../slice';\r\nimport { combineMandatoryOfflineServices } from '../slice/combineOfflineServiceTypes';\r\nimport {\r\n selectCloneReservations,\r\n selectSavedOfflineServices,\r\n} from '../slice/selectors';\r\nimport {\r\n ReservationDetailsState,\r\n ReservationSettingsState,\r\n ServiceSettingsState,\r\n} from '../slice/types';\r\nimport { GlobalSettingsType } from './useGlobalSettingsHook';\r\n\r\nexport interface ReservationOfflineServicesProps {\r\n values: ReservationDetailsState;\r\n reservationSettings?: ReservationSettingsState;\r\n equipmentSettings: ServiceSettingsState | undefined;\r\n globalSettings: GlobalSettingsType;\r\n isEdit: boolean;\r\n title?: React.ReactNode;\r\n hanleUpdateLocalServices: (\r\n services: IOtherServices[],\r\n operation: 'add' | 'remove' | 'update',\r\n ) => void;\r\n onServiceClick?: (item: IOtherServices) => void;\r\n disabled?: boolean;\r\n onAddBatchClick: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n setError?: (error: ErrorServices) => void;\r\n}\r\n\r\nexport const ReservationOfflineServices = React.memo(\r\n function ReservationOfflineServices(props: ReservationOfflineServicesProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const isCloned = useSelector(selectCloneReservations);\r\n const savedServices = useSelector(selectSavedOfflineServices);\r\n const savedServiceEditable = useSelector(selectSavedReservationService);\r\n const { actions: notifyActions } = useAppSettingsSlice();\r\n const { actions: offActions } = useOfflineServiceStateSlice();\r\n const { actions } = useReservationSlice();\r\n const { newDate, getOffsetDate } = useSystemDate();\r\n\r\n const {\r\n isEdit,\r\n values,\r\n equipmentSettings,\r\n reservationSettings,\r\n hanleUpdateLocalServices,\r\n onServiceClick,\r\n title,\r\n disabled,\r\n onAddBatchClick,\r\n setError,\r\n } = props;\r\n\r\n const optionalServiceTypes = React.useMemo(() => {\r\n const fooBar =\r\n !props.globalSettings.MandatoryOfflineServicesOnTrainingSignUps &&\r\n !values.TrainingSignUp;\r\n\r\n const result = (\r\n reservationSettings?.OfflineOptional?.map(f => ({\r\n Id: f.Id,\r\n Mandatory: f.Mandatory,\r\n HideProject: f.HideProjects,\r\n })) ??\r\n equipmentSettings?.OfflineServiceTypes?.map(f => ({\r\n Id: f.Id,\r\n Mandatory: f.Mandatory,\r\n HideProject: f.HideProject,\r\n })) ??\r\n []\r\n ).filter(f => !(f.Mandatory && fooBar));\r\n return result;\r\n }, [\r\n equipmentSettings?.OfflineServiceTypes,\r\n props.globalSettings.MandatoryOfflineServicesOnTrainingSignUps,\r\n reservationSettings?.OfflineOptional,\r\n values.TrainingSignUp,\r\n ]);\r\n const budgetServiceGroupServicesAllowed = React.useMemo(() => {\r\n return values.Budget === null\r\n ? undefined\r\n : (values.Budget as IBudgetFilterDto).ServiceGroupServicesAllowed;\r\n }, [values.Budget]);\r\n const fetchServiceType = async (searchTerm: string | null) => {\r\n try {\r\n const data = await loadOfflineServiceData(\r\n ReservationsRelatedFilter(\r\n equipmentSettings?.Groups || [],\r\n optionalServiceTypes,\r\n equipmentSettings?.HasHideProjects,\r\n equipmentSettings?.AllOffServicesAllowed ?? undefined,\r\n values.Budget?.Id,\r\n budgetServiceGroupServicesAllowed,\r\n ),\r\n 'public',\r\n [],\r\n undefined,\r\n 'InventoryBatches',\r\n )(searchTerm, undefined);\r\n return data.value;\r\n } catch {\r\n return [];\r\n }\r\n };\r\n const sortFunc = (a: IInventoryBatchDto, b: IInventoryBatchDto) => {\r\n return b.Id - a.Id;\r\n };\r\n const prepareService = (\r\n serviceType: IOfflineServiceFilterDto,\r\n reservation: ReservationDetailsState,\r\n ) => {\r\n let batch = serviceType.InventoryBatchesEnabled\r\n ? !!serviceType.InventoryBatches &&\r\n serviceType.InventoryBatches.length > 0\r\n ? serviceType.InventoryBatches.filter(\r\n f =>\r\n (f.ExpirationDate === null ||\r\n getOffsetDate(f.ExpirationDate) > newDate()) &&\r\n (serviceType.NotLessThanZero ? f.Inventory > 0 : true) &&\r\n f.StokRenewed === true,\r\n ).sort(sortFunc)[0]\r\n : null\r\n : null;\r\n let data = {\r\n Id: 0,\r\n BookedBy: reservation.BookedBy?.Id,\r\n UserDisplayName: reservation.BookedBy?.Name,\r\n BudgetID: reservation.Budget?.Id,\r\n Budget: reservation.Budget?.Name,\r\n BudgetExperimentId: reservation.BudgetExperiment?.Id,\r\n BudgetExperimentName: reservation.BudgetExperiment?.Name,\r\n Quantity: serviceType.DefaultQuantity,\r\n DefaultQuantity: serviceType.DefaultQuantity,\r\n ExternalCustomerId: reservation.ExternalCustomer?.Id,\r\n ExternalCustomerName: reservation.ExternalCustomer?.Name,\r\n FundingType: reservation.FundingType?.Id,\r\n IntQuantityOnly: serviceType.IntQuantityOnly,\r\n DiscountFactor: 1,\r\n InstituteProjectId: reservation.InstituteProject?.Id,\r\n InstituteProjectName: reservation.InstituteProject?.Name,\r\n PurchaseOrder: reservation.PurchaseOrder,\r\n Reference: reservation.Reference,\r\n Mandatory: false,\r\n Remarks:\r\n reservation.Id > 0\r\n ? (t(\r\n translations.ReservationOfflineServiceDefaultRemarks,\r\n ) as string)\r\n .replace('{0}', reservation.Id.toString())\r\n .replace('{1}', reservationSettings?.BaseEquipment?.Name || '')\r\n : null,\r\n ReservationId: reservation.Id,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(reservation.StartTime),\r\n ),\r\n ServiceTypeID: serviceType.Id,\r\n ServiceType: serviceType.Name,\r\n ServiceGroupId: serviceType.ServiceGroupId,\r\n Units: serviceType.UnitTypeName,\r\n UserGroup: reservation.ADGroup?.Id,\r\n UserGroupName: reservation.ADGroup?.Name,\r\n AllowToUser: serviceType.AllowToUser,\r\n BudgetsTurnedOn: serviceType.BudgetsTurnedOn,\r\n StaffOnly: serviceType.StaffOnly,\r\n TrackInventory: serviceType.TrackInventory,\r\n NotLessThanZero: serviceType.NotLessThanZero,\r\n InventoryBatchesEnabled: serviceType.InventoryBatchesEnabled,\r\n InventoryBatchId: batch === null ? null : batch.Id,\r\n InventoryBatchName: batch === null ? null : batch.Name,\r\n InventoryBatchAmount: batch === null ? null : batch.Inventory,\r\n } as IOtherServices;\r\n return data;\r\n };\r\n const createService = async (\r\n serviceType: IOfflineServiceFilterDto,\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n let staticService = prepareService(serviceType, values);\r\n hanleUpdateLocalServices([staticService], 'add');\r\n resolve(staticService);\r\n });\r\n };\r\n const initServices = async (): Promise => {\r\n return new Promise(async resolve => {\r\n if (savedServices.length < 1) {\r\n if (isEdit) {\r\n try {\r\n const result = await OtherServicesApi.getReservationOfflineServices(\r\n values.Id,\r\n reservationSettings?.Repeat,\r\n );\r\n resolve(result.value);\r\n hanleUpdateLocalServices(result.value as IOtherServices[], 'add');\r\n } catch {\r\n resolve([]);\r\n }\r\n } else if (isCloned) {\r\n try {\r\n const result = await OtherServicesApi.getReservationOfflineServices(\r\n values.Id,\r\n reservationSettings?.Repeat,\r\n );\r\n resolve(result.value);\r\n hanleUpdateLocalServices(result.value as IOtherServices[], 'add');\r\n } catch {\r\n resolve([]);\r\n }\r\n } else {\r\n //reduce an offline services to select only distinct services in case when several equipments have the same offline services.\r\n let servicesFiltered = !!reservationSettings?.OfflineMandatory\r\n ? combineMandatoryOfflineServices(\r\n reservationSettings?.OfflineMandatory,\r\n ) || []\r\n : [];\r\n resolve(servicesFiltered);\r\n hanleUpdateLocalServices(servicesFiltered, 'add');\r\n }\r\n } else {\r\n resolve(savedServices);\r\n }\r\n });\r\n };\r\n const onRemoveService = async (service: IOtherServices) => {\r\n return new Promise(async (resolve, reject) => {\r\n if (isEdit) {\r\n if (service.Id > 0) {\r\n try {\r\n const responseDel = await OtherServicesApi.deleteService(\r\n service.Id,\r\n );\r\n let response = responseDel as OfflineServicesResponse;\r\n if (response.ErrorMessages.length > 0) {\r\n dispatch(\r\n notifyActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: 'offlineServiceDeleteError',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n reject(response.ErrorMessages[0]);\r\n } else {\r\n dispatch(\r\n notifyActions.addNotification({\r\n key: 'offlineServiceDeleteSuccess',\r\n message: response.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n hanleUpdateLocalServices([service], 'remove');\r\n resolve(response.SuccessMessages[0]);\r\n }\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror\r\n ?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? t(translations.Forbidden)\r\n : undefined) ??\r\n t(translations.errormessage);\r\n dispatch(\r\n notifyActions.addNotification({\r\n key: 'offlineServiceDeleteError',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n reject(message);\r\n }\r\n } else {\r\n hanleUpdateLocalServices([service], 'remove');\r\n resolve(service);\r\n }\r\n } else {\r\n hanleUpdateLocalServices([service], 'remove');\r\n resolve(service);\r\n }\r\n });\r\n };\r\n const onUpdateService = (service: IOtherServices) => {\r\n return new Promise(async (resolve, reject) => {\r\n if (isEdit) {\r\n hanleUpdateLocalServices([service], 'update');\r\n // if (\r\n // service.Id > 0 &&\r\n // service.Quantity !== null &&\r\n // service.Quantity > 0\r\n // ) {\r\n // try {\r\n // const responseUp = await OtherServicesApi.updateOtherService(\r\n // service,\r\n // service.Id,\r\n // );\r\n // let response = responseUp as OfflineServicesResponse;\r\n // if (response.ErrorMessages.length > 0) {\r\n // dispatch(\r\n // notifyActions.addNotifications(\r\n // response.ErrorMessages.map(item => {\r\n // return {\r\n // key: 'offlineServiceUpdateError',\r\n // message: item,\r\n // variant: 'error',\r\n // };\r\n // }),\r\n // ),\r\n // );\r\n // reject(response.ErrorMessages[0]);\r\n // } else {\r\n // dispatch(\r\n // notifyActions.addNotification({\r\n // key: 'offlineServiceUpdateSuccess',\r\n // message: response.SuccessMessages[0],\r\n // variant: 'success',\r\n // }),\r\n // );\r\n // resolve(service);\r\n // }\r\n // } catch (error: unknown) {\r\n // const message =\r\n // (error as AxiosError)?.response?.data?.error?.innererror\r\n // ?.message ??\r\n // ((error as AxiosError)?.response?.status === 403\r\n // ? t(translations.Forbidden)\r\n // : undefined) ??\r\n // t(translations.errormessage);\r\n // dispatch(\r\n // notifyActions.addNotification({\r\n // key: 'offlineServiceUpdateError',\r\n // message: message,\r\n // variant: 'error',\r\n // }),\r\n // );\r\n // reject(message);\r\n // }\r\n // }\r\n resolve(service);\r\n } else {\r\n hanleUpdateLocalServices([service], 'update');\r\n resolve(service);\r\n }\r\n });\r\n };\r\n\r\n //check for any services exist to decide if show offline services component\r\n const fetchAnyServices = async (): Promise => {\r\n return new Promise(async resolve => {\r\n try {\r\n let data = await initServices();\r\n if (data.length > 0) {\r\n resolve(data.length);\r\n } else {\r\n let potentialData = await fetchServiceType(null);\r\n if (potentialData.length > 0) {\r\n resolve(potentialData.length);\r\n } else {\r\n resolve(0);\r\n }\r\n }\r\n } catch {\r\n resolve(0);\r\n }\r\n });\r\n };\r\n const [hasAnyServices, setHasAnyServices] = useAsyncExtendedState(\r\n 0,\r\n );\r\n const [fetchAnyServicesState, fetchAnyServicesPromise] = usePromise(\r\n fetchAnyServices,\r\n );\r\n React.useEffect(() => {\r\n if (\r\n !fetchAnyServicesState.status ||\r\n (fetchAnyServicesState.status !== 'pending' &&\r\n fetchAnyServicesState.status !== 'resolved')\r\n ) {\r\n setHasAnyServices(fetchAnyServicesPromise());\r\n }\r\n return () => {};\r\n }, [\r\n fetchAnyServicesPromise,\r\n fetchAnyServicesState.status,\r\n setHasAnyServices,\r\n ]);\r\n React.useEffect(() => {\r\n if (\r\n !!savedServiceEditable &&\r\n savedServices.some(\r\n f => f.ServiceTypeID === savedServiceEditable.ServiceTypeID,\r\n )\r\n ) {\r\n hanleUpdateLocalServices([savedServiceEditable], 'update');\r\n dispatch(offActions.setReservationService(undefined));\r\n dispatch(actions.setRefreshOfflineServices(true));\r\n }\r\n }, [\r\n actions,\r\n dispatch,\r\n hanleUpdateLocalServices,\r\n offActions,\r\n savedServiceEditable,\r\n savedServices,\r\n ]);\r\n return hasAnyServices > 0 ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n },\r\n);\r\n","/**\r\n *\r\n * AccompaniedServicesPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity, Identifiable } from 'types/common';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { InputBaseComponentProps } from '@material-ui/core';\r\nimport {\r\n AutocompleteMultiPickerEx,\r\n AutocompleteMultiPickerExProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPickerEx';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { AutocompletePicker } from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nexport interface AccompaniedServicesPickerProps\r\n extends Omit<\r\n AutocompleteMultiPickerExProps,\r\n 'loadData'\r\n > {\r\n inputProps?: InputBaseComponentProps;\r\n}\r\nconst url = '/api/odata/v4/AccompaniedServices';\r\nexport const initAccompaniedData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n let ids = (initval.indexOf(',') !== -1\r\n ? initval.split(',')\r\n : [initval]\r\n ).map(item => {\r\n return { Id: parseInt(item) };\r\n }) as Identifiable[];\r\n let foo: string | undefined = undefined;\r\n if (ids.length > 0) {\r\n const predicates: string | Condition[] = [];\r\n\r\n predicates.push(new Condition('Id', ODataOperators.Includes, ids));\r\n\r\n foo = predicates.map(f => f.toString()).join(' and ');\r\n }\r\n\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: foo,\r\n $skip: 0,\r\n $top: 10,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: [\r\n 'Id',\r\n 'Name',\r\n 'Active',\r\n 'CustomFormId',\r\n 'EquipmentId',\r\n 'EquipmentName',\r\n 'OverrideTraining',\r\n 'StaffOnly',\r\n 'ServiceGroupId',\r\n 'Color',\r\n 'InstrumentCatId',\r\n 'InstrumentCatName',\r\n 'MaxOrderDuration',\r\n 'MinOrderDuration',\r\n 'MinOrderGap',\r\n 'Inventory',\r\n ],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n });\r\nexport function AccompaniedServicesPicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n predicates,\r\n disabled,\r\n inputProps,\r\n ...props\r\n}: AccompaniedServicesPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(predicates, globalServiceGroupFilter || []);\r\n return (\r\n \r\n );\r\n}\r\nexport function SingleAccompaniedServicesPicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n predicates,\r\n disabled,\r\n inputProps,\r\n ...props\r\n}: AccompaniedServicesPickerProps) {\r\n const globalServiceGroupFilter = useSelector(selectGlobalServiceGroupFilter);\r\n const innerLoadData = loadData(predicates, globalServiceGroupFilter || []);\r\n return (\r\n {\r\n if (!!onChange) {\r\n if (value !== null) {\r\n return onChange([value]);\r\n } else {\r\n return onChange([]);\r\n }\r\n }\r\n }}\r\n disabled={disabled}\r\n info={info}\r\n id={id || 'acc-service-single-picker'}\r\n helperText={helperText}\r\n required={required}\r\n className={className}\r\n onBlur={props.onBlur}\r\n placeholder={placeholder}\r\n defaultValue={\r\n !!defaultValue\r\n ? defaultValue.length > 0\r\n ? (defaultValue[0] as IEquipmentAccServiceDto | undefined | null)\r\n : undefined\r\n : undefined\r\n }\r\n label={label}\r\n value={\r\n !!value\r\n ? value.length > 0\r\n ? (value[0] as IEquipmentAccServiceDto | undefined | null)\r\n : undefined\r\n : undefined\r\n }\r\n ariaLabel={'Equipment search'}\r\n {...props}\r\n error={props.error}\r\n />\r\n );\r\n}\r\nexport function ReservationsAccServicesFilter(\r\n Equipments: number[],\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n if (Equipments.length > 0) {\r\n let ids = Equipments.map(f => {\r\n return { Id: f } as Identifiable;\r\n });\r\n predicates.push(\r\n new Condition(\r\n 'EquipmentId',\r\n ODataOperators.Includes,\r\n ids,\r\n ),\r\n );\r\n }\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\n\r\nexport const loadEquipments = loadData;\r\n","/**\r\n *\r\n * FormAccompaniedServicesPicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nimport {\r\n AccompaniedServicesPicker,\r\n SingleAccompaniedServicesPicker,\r\n} from '../pickers/MultiSelectPickers/AccompaniedServicesPicker';\r\n\r\nexport const FormAccompaniedServicesPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps & { multiple: boolean }) => {\r\n const [field, meta, helpers] = useField(\r\n props,\r\n );\r\n if (props.multiple) {\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onChipClick={props.onChipClick}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n />\r\n );\r\n } else {\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onChipClick={props.onChipClick}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n />\r\n );\r\n }\r\n};\r\n","import { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport React from 'react';\r\n\r\nexport interface ReservationFormButtonProps extends ButtonProps {\r\n text: string;\r\n onClick: (e: any) => void;\r\n}\r\n\r\nexport function SaveFormButton({\r\n text,\r\n onClick,\r\n ...props\r\n}: ReservationFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function CancelReservationButton({\r\n text,\r\n onClick,\r\n ...props\r\n}: ReservationFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function ApproveReservationButton({\r\n text,\r\n onClick,\r\n ...props\r\n}: ReservationFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function SaveForLaterButton({\r\n text,\r\n onClick,\r\n ...props\r\n}: ReservationFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function TransferButton({\r\n text,\r\n onClick,\r\n ...props\r\n}: ReservationFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function TerminateReservationButton({\r\n text,\r\n onClick,\r\n ...props\r\n}: ReservationFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function ModificationButton({\r\n text,\r\n onClick,\r\n ...props\r\n}: ReservationFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function CreateTrainingButton({\r\n text,\r\n onClick,\r\n ...props\r\n}: ReservationFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { useDispatch, useSelector } from 'react-redux';\r\nimport { TerminateReservationButton } from './ReservationActions';\r\nimport * as React from 'react';\r\nimport {\r\n selectTerminateCompleted,\r\n selectTerminateProcessing,\r\n} from '../slice/selectors';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { ReservationsApi } from 'api/ReservationsApi';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { EndUsageConfirm, EndUsageData } from 'app/components/EndUsageConfirm';\r\nimport { HasUsageEndRresult } from '../slice/types';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\n\r\nexport interface TerminateReservationProps {\r\n text: string;\r\n reservationId: number;\r\n serviceId: number;\r\n isLoaanDesc: boolean;\r\n title?: string;\r\n onTerminate: () => void;\r\n}\r\n\r\nexport function TerminateReservation(props: TerminateReservationProps) {\r\n const {\r\n text,\r\n reservationId,\r\n isLoaanDesc,\r\n title,\r\n onTerminate,\r\n serviceId,\r\n } = props;\r\n const dispatch = useDispatch();\r\n const { actions: settingActions } = useAppSettingsSlice();\r\n const { t } = useTranslation();\r\n const terminateProcessing = useSelector(selectTerminateProcessing);\r\n const terminateCompleted = useSelector(selectTerminateCompleted);\r\n const [\r\n endUsageOfflineServiceIds,\r\n setEndUsageOfflineServiceIds,\r\n ] = React.useState([]);\r\n const [showConfirmEndUsage, setShowConfirmEndUsage] = React.useState(\r\n false,\r\n );\r\n const [showEndUsage, setShowEndUsage] = React.useState(false);\r\n const [usageEndProcessing, setUsageEndProcessing] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [hasUsageProcessing, setHasUsageProcessing] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const handleTerminateClick = () => {\r\n (async () => {\r\n setHasUsageProcessing(true);\r\n ReservationsApi.hasUsage({ resId: reservationId, eqId: serviceId })\r\n .then(result => {\r\n let data = result as HasUsageEndRresult;\r\n if (data.HasUsage === true && !isLoaanDesc) {\r\n setShowConfirmEndUsage(true);\r\n setEndUsageOfflineServiceIds(data.OfflineServiceTypeIds);\r\n } else {\r\n onTerminate();\r\n }\r\n setHasUsageProcessing(false);\r\n })\r\n .catch(reason => {\r\n setHasUsageProcessing(false);\r\n });\r\n })();\r\n\r\n //check if has usage\r\n //then\r\n //if yes - show confirm to end usage\r\n\r\n //if confirmed - show usage end popup\r\n //else - cancel termination\r\n // if no - terminate;\r\n };\r\n\r\n const handleEndUsage = (usageData: EndUsageData) => {\r\n setUsageEndProcessing(true);\r\n (async () => {\r\n ReservationsApi.endUsage(reservationId, usageData)\r\n .then(response => {\r\n if (response.ErrorMessages.length > 0) {\r\n response.ErrorMessages.forEach(errmsg =>\r\n dispatch(\r\n settingActions.addNotification({\r\n variant: 'error',\r\n message: errmsg,\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n response.SuccessMessages.forEach(msg =>\r\n dispatch(\r\n settingActions.addNotification({\r\n variant: 'success',\r\n message: msg,\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n response.WarningMessages.forEach(wrnmsg =>\r\n dispatch(\r\n settingActions.addNotification({\r\n variant: 'warning',\r\n message: wrnmsg,\r\n }),\r\n ),\r\n );\r\n }\r\n setUsageEndProcessing(false);\r\n setShowEndUsage(false);\r\n onTerminate();\r\n })\r\n .catch(e => {\r\n console.error(e);\r\n setUsageEndProcessing(false);\r\n setShowEndUsage(false);\r\n });\r\n })();\r\n };\r\n return (\r\n \r\n }\r\n onClick={e => handleTerminateClick()}\r\n disabled={\r\n terminateProcessing || usageEndProcessing || hasUsageProcessing\r\n }\r\n variant=\"white\"\r\n processing={\r\n (terminateProcessing || usageEndProcessing || hasUsageProcessing) &&\r\n !terminateCompleted\r\n }\r\n title={title}\r\n text={text}\r\n />\r\n {\r\n setShowEndUsage(true);\r\n setShowConfirmEndUsage(false);\r\n }}\r\n onCancel={() => setShowConfirmEndUsage(false)}\r\n onClose={() => setShowConfirmEndUsage(false)}\r\n maxWidth=\"sm\"\r\n />\r\n {\r\n setShowEndUsage(false);\r\n }}\r\n onConfirm={handleEndUsage}\r\n />\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FormTrainingSessionPicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { ITrainingSessionDto } from 'api/odata/generated/entities/ITrainingSessionDto';\r\nimport { TrainingSessionPicker } from '../pickers/AutocompletePickers/TrainingSessionPicker';\r\n\r\nexport const FormTrainingSessionPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n disabled={props.disabled}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n />\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { IBudgetExperimentsFilterDto } from 'api/odata/generated/entities/IBudgetExperimentsFilterDto';\r\nimport { IBudgetDto } from 'api/odata/generated/entities/IBudgetDto';\r\nimport {\r\n Condition,\r\n ODataOperators,\r\n quoteODataValue,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePickerProps,\r\n AutocompletePicker,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport { BudgetExperimentStatuses } from 'enums/BudgetExperimentStatuses';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { Identifiable } from 'types/common';\r\n\r\nexport function budgetExperimentsFilter(\r\n serviceTypes: number[],\r\n serviceGroups: number[],\r\n serviceType: ServiceType | undefined,\r\n budgetId: number | undefined,\r\n resStart: Date | string | null | undefined,\r\n resEnd: Date | string | null | undefined,\r\n): (string | Condition)[] {\r\n const predicates: (string | Condition)[] = [];\r\n\r\n predicates.push(\r\n new Condition(\r\n 'Active',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n\r\n predicates.push(\r\n new Condition(\r\n 'StatusId',\r\n ODataOperators.Equals,\r\n BudgetExperimentStatuses.Approved,\r\n ),\r\n );\r\n\r\n predicates.push(\r\n new Condition(\r\n 'BudgetTaskActive',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n\r\n if (!isNullOrUndefined(budgetId)) {\r\n predicates.push(\r\n new Condition(\r\n 'BudgetTaskBudgetId',\r\n ODataOperators.Equals,\r\n budgetId,\r\n ),\r\n );\r\n }\r\n\r\n if (serviceGroups.length > 0) {\r\n let ids = serviceGroups.filter(f => f !== null);\r\n if (ids.length > 0) {\r\n predicates.push(\r\n `(${new Condition(\r\n 'BudgetTaskAllCoresAllowed',\r\n ODataOperators.Equals,\r\n true,\r\n )} or ${new Condition(\r\n 'BudgetTaskServiceGroupIds',\r\n ODataOperators.AnyIn,\r\n ids,\r\n )})`,\r\n );\r\n predicates.push(\r\n `(BudgetExperimentServiceGroups/any(s: s/ServiceGroupId in ${quoteODataValue(\r\n ids,\r\n )} and s/StatusId eq ${quoteODataValue(\r\n BudgetExperimentStatuses.Approved,\r\n )}))`,\r\n );\r\n }\r\n }\r\n\r\n if (predicates.length > 0) {\r\n return predicates;\r\n }\r\n return [];\r\n}\r\nexport interface ReservationBudgetExperimentParams {\r\n serviceId: Array>;\r\n userId: string | null;\r\n budgetId: number | null;\r\n start: Timestamp | Date;\r\n end: Timestamp | Date;\r\n selectedExpirementId?: number;\r\n}\r\nexport interface ReservationBudgetExperimentPickerProps\r\n extends ReservationBudgetExperimentParams,\r\n Omit, 'loadData'> {\r\n name?: string;\r\n placeholder?: string;\r\n onBlur?: React.FocusEventHandler;\r\n error?: boolean;\r\n helperText?: string;\r\n}\r\n\r\nconst budgetDtoFields: Array = [\r\n 'Id',\r\n 'Name',\r\n 'UserGroupId',\r\n 'UserGroupName',\r\n 'Active',\r\n 'IsDefault',\r\n 'HideExperiments',\r\n 'ServiceGroupServicesAllowed',\r\n 'StartDate',\r\n 'EndDate',\r\n 'Type',\r\n];\r\nconst budgetExperimentDtoFields: Array = [\r\n 'Id',\r\n 'Name',\r\n 'Active',\r\n 'StatusId',\r\n 'BudgetTaskBudgetId',\r\n];\r\nexport const getLoadData = (p: ReservationBudgetExperimentParams) => {\r\n const { path, search } = getBudgetExperimentsValidForReservationPathInfo(p);\r\n return getAutoCompleteLoadDataFn({\r\n url: path,\r\n queryString: search,\r\n select: budgetExperimentDtoFields,\r\n // expand is needed here for the use on reservation details to auto select the related budget\r\n // otherwise, when the budget is already preselected, expand will just slow things down\r\n expand: getBudgetExpandClause(p),\r\n });\r\n};\r\n\r\nfunction getBudgetExpandClause(\r\n p: ReservationBudgetExperimentParams,\r\n): string | undefined {\r\n return p.budgetId === null\r\n ? `Budget($select=${budgetDtoFields.join(',')})`\r\n : undefined;\r\n}\r\n\r\n/**\r\n * Prepares parameters to fetch budget experiments usable to book something (e.g. reservation, offline service, etc.)\r\n * @param p dependencies used to determine relevant budget experiments\r\n * @returns path/search to fetch the budget experiments\r\n */\r\nexport function getBudgetExperimentsValidForReservationPathInfo(\r\n p: ReservationBudgetExperimentParams,\r\n): IPathAndQuery {\r\n const pp: Record<\r\n keyof Omit,\r\n string | null\r\n > = {\r\n serviceId: JSON.stringify(p.serviceId.map(f => f.Id)),\r\n userId: \"'\" + p.userId?.replaceAll(\"'\", \"''\") + \"'\",\r\n budgetId: JSON.stringify(p.budgetId),\r\n start: '@start',\r\n end: '@end',\r\n };\r\n const BudgetExperimentsValidForReservationURL = `/api/odata/v4/BudgetExperimentsFilter/BudgetExperimentsValidForReservation(serviceId=${pp.serviceId}, budgetId=${pp.budgetId}, userId=${pp.userId}, start=${pp.start}, end=${pp.end})`;\r\n\r\n // start/end parameters are extracted into QueryString to avoid triggering \"A potentially dangerous Request.Path value (:)...\" issue with .net path validation\r\n const params = {\r\n '@start': dateUtils.formatISO(dateUtils.parseISO(p.start), {\r\n representation: 'complete',\r\n }),\r\n '@end': dateUtils.formatISO(dateUtils.parseISO(p.end), {\r\n representation: 'complete',\r\n }),\r\n $select: budgetExperimentDtoFields.join(','),\r\n $expand: getBudgetExpandClause(p),\r\n };\r\n return { path: BudgetExperimentsValidForReservationURL, search: params };\r\n}\r\n\r\nexport function ReservationBudgetExperimentPicker({\r\n serviceId,\r\n budgetId,\r\n userId,\r\n start,\r\n end,\r\n ...props\r\n}: ReservationBudgetExperimentPickerProps) {\r\n const innerLoadData = React.useMemo(\r\n () =>\r\n getLoadData({\r\n serviceId,\r\n budgetId,\r\n userId,\r\n start,\r\n end,\r\n }),\r\n [budgetId, end, serviceId, start, userId],\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\nexport const loadBudgetExperiments = getLoadData;\r\n","import * as React from 'react';\r\nimport { IBudgetExperimentsFilterDto } from 'api/odata/generated/entities/IBudgetExperimentsFilterDto';\r\nimport { FieldHookConfig, useField, useFormikContext } from 'formik';\r\nimport {\r\n ReservationBudgetExperimentParams,\r\n ReservationBudgetExperimentPicker,\r\n getBudgetExperimentsValidForReservationPathInfo,\r\n} from '../pickers/AutocompletePickers/ReservationBudgetExperimentPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IWithBudget } from 'app/pages/ReservationDetails/Details/slice/types';\r\n\r\n/**\r\n * Fetches the default budget experiment matching the dependencies\r\n * @see {@link ReservationBudgetExperimentParams}\r\n * @param p relevant dependencies\r\n * @returns default budget experiment if exists, undefined - otherwise\r\n */\r\nconst getDefaultBudgetExperiment = async (\r\n p: ReservationBudgetExperimentParams,\r\n) => {\r\n const { path, search } = getBudgetExperimentsValidForReservationPathInfo(p);\r\n const result = await httpClient.get<\r\n IODataQueryResponse\r\n >(path, { ...search, ...{ $top: 10 } });\r\n if (result.value.length === 1) {\r\n return result.value[0];\r\n } else if (\r\n !!p.selectedExpirementId &&\r\n result.value.length > 0 &&\r\n result.value.some(f => f.Id === p.selectedExpirementId)\r\n ) {\r\n return result.value.filter(f => f.Id === p.selectedExpirementId)[0];\r\n } else {\r\n return undefined;\r\n }\r\n};\r\n\r\nexport const FormReservationBudgetExperimentPicker = ({\r\n label,\r\n isEdit,\r\n serviceId,\r\n budgetId,\r\n userId,\r\n start,\r\n end,\r\n onChange,\r\n ...props\r\n}: FieldHookConfig &\r\n IFieldProps &\r\n ReservationBudgetExperimentParams & { isEdit: boolean }) => {\r\n const formik = useFormikContext();\r\n const [\r\n field,\r\n meta,\r\n { setValue },\r\n ] = useField(props);\r\n const [\r\n fetchDefaultBudgetExperimentState,\r\n fetchDefaultBudgetExperiment,\r\n ] = usePromise(getDefaultBudgetExperiment);\r\n\r\n // setValue goes nuts inside the Reservation Form and spams if used in useEffect directly\r\n const setValueRef = React.useRef(setValue);\r\n React.useEffect(() => {\r\n setValueRef.current = setValue;\r\n }, [setValue]);\r\n\r\n /**\r\n * Handles the user selected budget experiment.\r\n * The budget can be auto populated when the budget experiment is selected first.\r\n * Formik values - budget experiment & optionally budget (if not yet selected) are updated in one go to prevent unnecessary re renders.\r\n */\r\n const handleChange = React.useCallback(\r\n value => {\r\n const v: Record = {\r\n BudgetExperiment: value,\r\n };\r\n if (formik.values.Budget === null && value.Budget !== undefined) {\r\n v.Budget = value.Budget;\r\n }\r\n formik.setValues(values => ({ ...values, ...v }));\r\n\r\n onChange?.(value);\r\n },\r\n [formik, onChange],\r\n );\r\n\r\n /**\r\n * Services array might go wild with array mutations (e.g. when clearing large number of services selected in the reservation service picker)\r\n * Serialize & then deserializing the service ids is intended to guard the useEffect below from drowning in these mutations\r\n */\r\n const serializedServices = React.useMemo(\r\n () => JSON.stringify(serviceId.map(f => ({ Id: f.Id }))),\r\n [serviceId],\r\n );\r\n const deserializedServices = React.useMemo(\r\n () => JSON.parse(serializedServices),\r\n [serializedServices],\r\n );\r\n\r\n /**\r\n * Ref is used to skip the first effect below\r\n */\r\n const componentDidMount = React.useRef(false);\r\n\r\n // set default budget experiment for the given parent deps (service, budget, start/end, service & user)\r\n // budget experiment is considered to be default if it's the only matching one between relevant active experiments (given the deps)\r\n // if there's no default budget experiment - the value is cleared to prevent conflicts and force user to select one\r\n React.useEffect(() => {\r\n // first effect needs to be skipped for showing reservation details, in which case the budget/experiment should be shown as is without fetching the default budget experiment\r\n // here an additional condition might be needed to distinguish between the \"reservation create\" and \"reservation details\" cases\r\n if (componentDidMount.current === false && isEdit) {\r\n componentDidMount.current = true;\r\n return;\r\n }\r\n\r\n /**\r\n * Skips default budget experiment fetching if:\r\n * * budget experiment (either default or non-default) has been selected by the user with the empty budget\r\n * * budget/budget experiment changed but their connection is valid (e.g. budget is present, budget experiment is changed to another experiment within the same budget)\r\n */\r\n if (\r\n field.value?.BudgetTaskBudgetId === budgetId ||\r\n field.value?.Budget?.Id === budgetId\r\n ) {\r\n return;\r\n }\r\n\r\n // nothing to do if the services weren't selected yet\r\n if (deserializedServices.length === 0) {\r\n return;\r\n }\r\n\r\n // budget has to be selected before the budget experiment\r\n // if the budget was not yet populated - also nothing to see here\r\n if (budgetId === null) {\r\n return;\r\n }\r\n\r\n /**\r\n * BudgetId ->\r\n */\r\n fetchDefaultBudgetExperiment({\r\n budgetId: budgetId,\r\n serviceId: deserializedServices,\r\n start: start,\r\n end: end,\r\n userId: userId,\r\n selectedExpirementId: field.value?.Id,\r\n }).then(value => {\r\n setValueRef.current?.(value ?? null);\r\n if (!!value) {\r\n onChange?.(value);\r\n }\r\n });\r\n\r\n // field.value is exluded from the deps in order to allow clearing the current value\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n fetchDefaultBudgetExperiment,\r\n budgetId,\r\n end,\r\n deserializedServices,\r\n start,\r\n userId,\r\n onChange,\r\n isEdit,\r\n // field.value\r\n ]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { dateUtils } from 'utils/date-utils';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { PeriodTypes } from 'app/components/DatePeriods';\r\n\r\n/**\r\n * Filter parameters must match the reservations filter settings\r\n * {@see app/pages/ReservationHistoryPage/Filter}\r\n */\r\ntype getReservationsLinkProps = {\r\n period?: PeriodTypes;\r\n startDate?: string | Date;\r\n endDate?: string | Date;\r\n serviceId?: number | null;\r\n trainingSignUp?: boolean;\r\n TrainingSessionId?: number;\r\n};\r\n\r\n/**\r\n * Helper function to get a link to reservations list page\r\n * @param session\r\n * @param newDate\r\n * @returns\r\n */\r\nexport function getReservationsLink(\r\n props: getReservationsLinkProps,\r\n): IPathAndQuery {\r\n return {\r\n path: '/reservations',\r\n search: {\r\n period: props.period,\r\n st:\r\n props.startDate === undefined\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(props.startDate),\r\n ),\r\n et:\r\n props.endDate === undefined\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(props.endDate),\r\n ),\r\n eid: props.serviceId,\r\n trainingSignUp: props.trainingSignUp,\r\n TrainingSessionId: props.TrainingSessionId,\r\n },\r\n };\r\n}\r\n","import { ExternalLink } from 'app/components/ExternalLink';\r\n\r\n/**\r\n * Link to edit a training session details (admin)\r\n * @param param0\r\n * @returns\r\n */\r\nexport function EditTrainingSessionLink({\r\n trainingSessionId: assetId,\r\n ...props\r\n}: React.PropsWithChildren<{ trainingSessionId: number }>) {\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Link } from 'app/components/BasicLinks/Link';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { getReservationsLink } from '../../ReservationForm/getReservationsLink';\r\nimport { EditTrainingSessionLink } from 'app/pages/TrainingSessionsPage/components/EditTrainingSessionsLink';\r\nimport { translations } from 'locales/translations';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ITrainingSessionSlotDto } from 'api/odata/generated/entities/ITrainingSessionSlotDto';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { Body } from 'app/components/Typography';\r\nimport { CircularProgress } from '@material-ui/core';\r\n\r\nexport interface TrainingSignUpAdminAlertContentProps {\r\n trainingSessionId: number;\r\n}\r\nexport function TrainingSignUpAdminAlertContent(\r\n props: TrainingSignUpAdminAlertContentProps,\r\n) {\r\n const { trainingSessionId } = props;\r\n const { t } = useTranslation();\r\n const [loading, setLoading] = React.useState(false);\r\n const attendees = useAsyncGetWthEffect(\r\n () => getSessionSlots(trainingSessionId),\r\n {\r\n Attendees: 0,\r\n },\r\n [trainingSessionId],\r\n setLoading,\r\n );\r\n\r\n // const [state, setState] = useAsyncExtendedState<\r\n // TrainingSessionInfo | undefined\r\n // >(undefined);\r\n // const [fetchState, fetch] = usePromise(getSessionSlots);\r\n // const show = React.useMemo(() => {\r\n // return (\r\n // isAdmin && trainingSessionId !== undefined && trainingSessionId !== null\r\n // );\r\n // }, [isAdmin, trainingSessionId]);\r\n\r\n // const bar = React.useMemo(() => {\r\n // if (trainingSessionId === null) {\r\n // return null;\r\n // }\r\n // if (trainingSessionId === undefined) {\r\n // return null;\r\n // }\r\n // if (!show) {\r\n // return null;\r\n // }\r\n // return trainingSessionId;\r\n // }, [show, trainingSessionId]);\r\n // React.useEffect(() => {\r\n // if (trainingSessionId !== undefined && show) {\r\n // setState(fetch(trainingSessionId));\r\n // }\r\n // });\r\n\r\n // if (bar === undefined) {\r\n // return null;\r\n // }\r\n\r\n return (\r\n \r\n \r\n \r\n {t(translations.TrainingSessionsCountMessage, {\r\n count: attendees.Attendees,\r\n })}\r\n \r\n\r\n {/* {t(translations.NotUsingThisReservation)} */}\r\n
    \r\n {loading === true && }\r\n {attendees.Attendees > 0 && (\r\n \r\n {t(translations.ManageSignUps)}\r\n \r\n )}\r\n\r\n \r\n {t(translations.EditTrainingSession)}\r\n \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\ntype TrainingSessionInfo = Pick;\r\nasync function getSessionSlots(trainingSesisonId: number) {\r\n const url = `/api/odata/v4/TrainingSessionSlots`;\r\n //const select: Array = ['Attendees'];\r\n try {\r\n const x = await httpClient.get(url, {\r\n $filter: `Id eq ${trainingSesisonId}`,\r\n });\r\n return { Attendees: x.value[0].Attendees } as TrainingSessionInfo;\r\n } catch (err) {\r\n return { Attendees: 0 } as TrainingSessionInfo;\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { useField, useFormikContext } from 'formik';\r\nimport { DatePickerVariants } from 'app/components/DatePicker';\r\nimport { FormRow } from 'app/components/Forms/FormsLayout/FormRow';\r\nimport { ReservationDetailsState } from '../../slice/types';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport produce from '@reduxjs/toolkit/node_modules/immer';\r\nimport { DatePickerProps } from '@material-ui/pickers';\r\nimport { BookitDatePicker } from 'app/components/BookitDatePicker';\r\nimport { BookitDateTimePicker } from 'app/components/BookitDatePicker/BookitDateTimePicker';\r\n\r\nexport interface ReservationTimePeriodPickerProps {\r\n /**\r\n * Full Day / Regular reservation indicator\r\n */\r\n FullDayReservation: boolean;\r\n /**\r\n * Start time property name of the formik values object\r\n */\r\n StartTimePropertyName: string;\r\n /**\r\n * End time property name of the formik values object\r\n */\r\n EndTimePropertyName: string;\r\n /**\r\n * Disables the start time picker\r\n */\r\n startTimeDisabled: boolean;\r\n /**\r\n * Disables the end time picker\r\n */\r\n endTimeDisabled: boolean;\r\n /**\r\n * Start time change handler\r\n */\r\n onStartTimeChange: DatePickerProps['onChange'];\r\n /**\r\n * End time change handler\r\n */\r\n onEndTimeChange: DatePickerProps['onChange'];\r\n /**\r\n * Start time label & placeholder\r\n */\r\n startTimeLabel: string;\r\n /**\r\n * End time label & placeholder\r\n */\r\n endTimeLabel: string;\r\n}\r\n/**\r\n * Component that handles start/end time period UI on the reservation form.\r\n * Must be inside the formik context as the rest of the FormXXX components.\r\n * FullDayReservation might checkbox might need to also be handled here.\r\n * @param param0\r\n * @returns\r\n */\r\nexport function FormReservationTimePeriodPicker({\r\n FullDayReservation,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const formik = useFormikContext();\r\n const [startField, startMeta] = useField({\r\n name: props.StartTimePropertyName,\r\n });\r\n const [endField, endMeta, endHelpers] = useField({\r\n name: props.EndTimePropertyName,\r\n });\r\n /**\r\n * For legacy reasons the reservation start/end is expected to be stored as string without tz info. for example:\r\n * \"2023-08-09T01:05:00\" = good\r\n * \"2023-08-09T01:05:00z\" = bad (not sure for what reason, but it's not the format being used in other places on reservation side panel)\r\n * @param value {\r\n return dateUtils.formatQueryStringDate(value, {\r\n representation: 'complete',\r\n });\r\n };\r\n\r\n /**\r\n * Handles start time change (triggered by date selection on date picker UI).\r\n * @param value user selected date/time\r\n */\r\n const handleStartTimeChange: DatePickerProps['onChange'] = value => {\r\n // start time value is generally not clearable and should not be empty\r\n if (value !== null) {\r\n formik.setValues(\r\n produce((values: ReservationDetailsState) => {\r\n // set the current start time value\r\n values.StartTime = getStoreValue(value);\r\n // optionally adjust the end time to keep the reservation/period the same length\r\n // for example, changing the start time effectively moves current period to another date/time\r\n if (formik.values.EndTime !== null) {\r\n const endTime = adjustEndByStart(\r\n value,\r\n formik.values.StartTime,\r\n formik.values.EndTime,\r\n );\r\n values.EndTime = getStoreValue(endTime);\r\n }\r\n }),\r\n );\r\n }\r\n // raise the start time change event\r\n props.onStartTimeChange?.(value);\r\n };\r\n\r\n /**\r\n * Handles the end time change (triggered by date selection on date picker UI)\r\n * @param value new user selected end time\r\n */\r\n const handleEndTimeChange: DatePickerProps['onChange'] = value => {\r\n var formattedValue = value === null ? null : getStoreValue(value);\r\n // set the current end\r\n endHelpers.setValue(formattedValue);\r\n // rase the end time change event\r\n props.onEndTimeChange?.(value);\r\n };\r\n\r\n const datePickerVariant: DatePickerVariants = FullDayReservation\r\n ? 'date'\r\n : 'separated';\r\n\r\n return (\r\n <>\r\n \r\n {datePickerVariant === 'separated' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n \r\n {datePickerVariant === 'separated' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\nfunction adjustEndByStart(\r\n value: Date,\r\n originalStartTime: Date | string,\r\n originalEndTime: Date | string,\r\n) {\r\n const diff = dateUtils.differenceInMinutes(\r\n value,\r\n dateUtils.dateOrStringToDate(originalStartTime),\r\n );\r\n const endTime = dateUtils.addMinutes(\r\n dateUtils.dateOrStringToDate(originalEndTime),\r\n diff,\r\n );\r\n return endTime;\r\n}\r\n","import * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IAssemblyPartDto } from 'api/odata/generated/entities/IAssemblyPartDto';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Popover } from 'app/components/Popover';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { PromiseStatus, usePromise } from 'app/hooks/usePromise';\r\nimport { translations } from 'locales/translations';\r\nimport { orderBy } from 'lodash';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Identifiable } from 'types/common';\r\nimport { IReservationEquipmentDto } from '../../slice/types';\r\nimport { Skeleton } from '@material-ui/lab';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { IReservationAssemblyPartDto } from 'api/odata/generated/entities/IReservationAssemblyPartDto';\r\n\r\n/**\r\n * Pick minimum required props from the EquipmentsData\r\n */\r\nexport interface EquipmentsDataAssembliesProps {\r\n equipmentsData: Array<\r\n Pick\r\n >;\r\n reservedAssemblyParts: IReservationAssemblyPartDto[] | null;\r\n}\r\n\r\ninterface IAssembly {\r\n /**\r\n * Top assembly instrument\r\n */\r\n assembly: IAssemblyPartDto;\r\n /**\r\n * All of the parts in a flat array\r\n */\r\n parts: IAssemblyPartDto[];\r\n}\r\n\r\n/**\r\n * Intenal React.useState interface used by the component\r\n */\r\ninterface IState {\r\n open: boolean;\r\n assemblyParts?: IAssembly[];\r\n reservedAssemblyParts?: IReservationAssemblyPartDto[];\r\n popperAnchor?: unknown;\r\n}\r\n\r\nconst fetchAssemblies = async (services: Array>) => {\r\n // send batch containing one request per each equipment\r\n const batchResponse = await httpClient.batch(\r\n services.map(service => ({\r\n method: 'GET',\r\n pathName: `/api/odata/v4/servicefilter/${service.Id}/AssemblyParts`,\r\n })),\r\n );\r\n\r\n // server returns selected instrument along it's assembly parts in a flat array\r\n // transform flat array into assembly all assembly parts in a flat array to match the structure displayed to the user\r\n const parts = batchResponse.responses.map(response => {\r\n const data = (response.body as IODataQueryResponse).value;\r\n const sorted = orderBy(data, f => f.Path);\r\n return {\r\n assembly: sorted[0],\r\n parts: sorted.slice(1),\r\n };\r\n });\r\n // return partial plug able into extendState\r\n const result: Partial = { assemblyParts: parts };\r\n return result;\r\n};\r\n\r\n/**\r\n * Enables assembly info processing only for cases where assemblies have been selected.\r\n * Otherwise abort the whole ordeal\r\n * @param props\r\n * @returns\r\n */\r\nexport function EquipmentsDataAssembliesContainer(\r\n props: EquipmentsDataAssembliesProps,\r\n) {\r\n const isAssembly = React.useMemo(\r\n () =>\r\n props.equipmentsData.some(service => service.HasAssemblyParts === true),\r\n [props.equipmentsData],\r\n );\r\n if (isAssembly === false) {\r\n return null;\r\n } else {\r\n return ;\r\n }\r\n}\r\n\r\nexport function EquipmentsDataAssemblies(props: EquipmentsDataAssembliesProps) {\r\n const { t } = useTranslation();\r\n\r\n const [state, , extendState] = useAsyncExtendedState({\r\n open: false,\r\n reservedAssemblyParts: props.reservedAssemblyParts ?? undefined,\r\n });\r\n const [fetchAssembliesPromiseState, fetchAssembliesPromise] = usePromise(\r\n fetchAssemblies,\r\n );\r\n const handleClick = React.useCallback(\r\n (e: React.MouseEvent) => {\r\n // open popover\r\n extendState(state => ({\r\n open: !state.open,\r\n popperAnchor: e.currentTarget,\r\n }));\r\n // we're showing already reserved parts for existing reservations as reserved parts can differ from current assembly configuration\r\n if (state.reservedAssemblyParts === undefined) {\r\n // start fetching data\r\n extendState(fetchAssembliesPromise(props.equipmentsData));\r\n }\r\n },\r\n [\r\n extendState,\r\n fetchAssembliesPromise,\r\n props.equipmentsData,\r\n state.reservedAssemblyParts,\r\n ],\r\n );\r\n if (props.equipmentsData.length === 0) {\r\n return null;\r\n }\r\n return (\r\n <>\r\n \r\n \r\n \r\n\r\n {state.popperAnchor !== null && (\r\n extendState({ open: false })}\r\n >\r\n
    \r\n {props.reservedAssemblyParts !== undefined && (\r\n
      \r\n {props.reservedAssemblyParts?.map(reservedAssemblyPart => (\r\n
    • {reservedAssemblyPart.Name}
    • \r\n ))}\r\n
    \r\n )}\r\n {fetchAssembliesPromiseState.status !== undefined && (\r\n \r\n {state.assemblyParts === undefined ? (\r\n <>{t(translations.NoDataFound)}\r\n ) : (\r\n <>\r\n {state.assemblyParts?.map((item, index) => (\r\n \r\n {t(translations.PartsIncludedWithin)}{' '}\r\n {item.assembly.Name}\r\n
      \r\n {item.parts.map(service => (\r\n
    • {service.Name}
    • \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\ninterface RenderAssemblyPartsProps {\r\n status?: PromiseStatus;\r\n}\r\n/**\r\n * Renders the current state of assemblies fetch result: e.g. processing/error/data\r\n * @param param0\r\n * @returns\r\n */\r\nfunction RenderAssemblyParts({\r\n status = 'pending',\r\n ...props\r\n}: React.PropsWithChildren): JSX.Element {\r\n const { t } = useTranslation();\r\n\r\n switch (status) {\r\n case 'pending':\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
    • \r\n
    • \r\n \r\n
    • \r\n
    \r\n \r\n );\r\n\r\n case 'resolved':\r\n return <>{props.children};\r\n case 'rejected':\r\n return <>{t(translations.err_ErrorOccured)};\r\n default:\r\n assertExhaustive(status);\r\n }\r\n}\r\n","import { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport { FormFieldsSection, FormRow } from 'app/components/Forms/FormsLayout';\r\nimport {\r\n filteredWorkOrderTypes,\r\n WorkOrderTypePicker,\r\n} from 'app/components/pickers/AutocompletePickers/WorkOrderTypePicker';\r\nimport { initAssetsData } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IReservationEquipmentDto } from '../../slice/types';\r\nimport * as React from 'react';\r\nimport { quoteODataValue } from 'api/odata/ODataFilter';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { loadWorkOrders } from 'app/components/pickers/AutocompletePickers/WorkOrdersPicker';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Tips } from 'app/components/Typography';\r\nimport { toQueryString } from 'utils/url-utils';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectRefreshWorkOrderLink } from '../../slice/selectors';\r\n\r\nexport interface ReservationWorkOrdersProps {\r\n reservationId: number;\r\n equipments: IReservationEquipmentDto[];\r\n onWorkTypeClick: (\r\n event: IWorkOrderTypeDto,\r\n equipmentIds: number[],\r\n reservationId: number,\r\n ) => void;\r\n}\r\n\r\nexport function ReservationWorkOrders(props: ReservationWorkOrdersProps) {\r\n const { equipments, reservationId, onWorkTypeClick } = props;\r\n const refreshWorkOrders = useSelector(selectRefreshWorkOrderLink);\r\n const equipmentIds = React.useMemo(() => {\r\n return equipments.map(f => f.Id);\r\n }, [equipments]);\r\n const { t } = useTranslation();\r\n const handleWorkTypeClick = (event: IWorkOrderTypeDto) => {\r\n onWorkTypeClick(event, equipmentIds, reservationId);\r\n };\r\n const relatedAssets = useAsyncGetWthEffect(\r\n async () =>\r\n initAssetsData(equipmentIds.join(',')).then(res => res as IAssetDto[]),\r\n [],\r\n [equipmentIds],\r\n );\r\n const relatedWorkOrders = useAsyncGetWthEffect(\r\n async () =>\r\n loadWorkOrders([`Reservation eq ${quoteODataValue(reservationId)}`])(\r\n null,\r\n undefined,\r\n ).then(res => res.value),\r\n [],\r\n [reservationId, refreshWorkOrders],\r\n );\r\n const workOrdersLink = React.useMemo(() => {\r\n return `/workorders?${toQueryString({\r\n reservationId: reservationId,\r\n })}`;\r\n }, [reservationId]);\r\n const workOrdersLinkTitle = React.useMemo(() => {\r\n return relatedWorkOrders.length > 0\r\n ? (t(translations.ReservationAlertsLink) as string).replace(\r\n '{0}',\r\n relatedWorkOrders.length.toString(),\r\n )\r\n : undefined;\r\n }, [relatedWorkOrders.length, t]);\r\n return (\r\n 0 ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.NoReservationAlerts) as string}\r\n \r\n \r\n )\r\n }\r\n >\r\n \r\n {\r\n handleWorkTypeClick(value as IWorkOrderTypeDto);\r\n }}\r\n fullWidth={true}\r\n id=\"wotype-id\"\r\n />\r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * WokFlowBooking\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { WorkflowBookingPicker } from 'app/components/pickers/AutocompletePickers/WorkflowBookingPicker';\r\nimport { IWorkflowBookingDto } from 'api/odata/generated/entities/IWorkflowBookingDto';\r\nimport { IFieldProps } from '../FormRender/IFormFieldSetting';\r\nimport BaseTextField from 'app/components/BasicInputs/BaseTextField';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { TextFieldProps } from 'app/components/TextField';\r\nimport React from 'react';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\n\r\nexport const FormWorkFlowBooking = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps &\r\n Omit & { useWorkFlowPicker?: boolean }) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n const { t } = useTranslation();\r\n return props.useWorkFlowPicker ? (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n placeholder={props.placeholder}\r\n onBlur={field?.onBlur}\r\n value={field.value as IWorkflowBookingDto}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n disabled={props.disabled}\r\n />\r\n ) : (\r\n {\r\n let val = e.currentTarget.value;\r\n let entityVal =\r\n val === undefined || val === ''\r\n ? null\r\n : ({ Id: -1, Name: val } as Entity);\r\n helpers.setValue(entityVal, true);\r\n if (props.onChange) {\r\n props.onChange(entityVal);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field?.value?.Name ?? ''}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error || props.helperText}\r\n id={props.id || 'workflowtextfieldId'}\r\n inputProps={{\r\n ...props.inputProps,\r\n 'aria-label': `${label ? undefined : 'text input'}`,\r\n }}\r\n color=\"primary\"\r\n InputProps={{\r\n ...props.InputProps,\r\n endAdornment: (\r\n \r\n {props.info ? : null}\r\n {props.InputProps?.endAdornment}\r\n \r\n ),\r\n }}\r\n />\r\n );\r\n};\r\n","import { Formik, FormikProps } from 'formik';\r\nimport * as React from 'react';\r\nimport {\r\n EquipmentsChangeStateParameters,\r\n getSingleReservationStatus,\r\n IMandatoryEquipmentsDto,\r\n IReservationEquipmentDto,\r\n PrerequisitsResult,\r\n ReservationDetailsState,\r\n ReservationQueryStringParameters,\r\n ReservationSettingsState,\r\n ReservationStatus,\r\n ReservationValidationResult,\r\n TrainingSessionResult,\r\n UserTrainingReservationData,\r\n} from '../slice/types';\r\nimport { translations } from 'locales/translations';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectAsyncChangeLoading,\r\n selectCloneReservations,\r\n selectEquipmentChangeCompleted,\r\n selectEquipmentChangeState,\r\n selectEquipmentsSettings,\r\n selectFieldHandler,\r\n selectIsCreditSubmited,\r\n selectIsEdit,\r\n selectRequestedValueFor,\r\n selectReservationCompleted,\r\n selectReservationHasError,\r\n selectReservationSettings,\r\n selectSavedForLater,\r\n selectSavedOfflineServices,\r\n} from '../slice/selectors';\r\nimport { isEmpty } from 'lodash';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRightSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { IndexNode } from 'app/components/Forms/FormsLayout/StyledForm';\r\nimport {\r\n FieldHandler,\r\n FieldValue,\r\n FormListener,\r\n SubmittingHandler,\r\n} from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { FormReservationEquipmentsPicker } from 'app/components/Forms/FormReservationEquipmentsPicker';\r\nimport { FormReservationStatusPicker } from 'app/components/Forms/FormReservationStatusPicker';\r\nimport { FormUserPicker } from 'app/components/Forms/FormUserPicker';\r\nimport { FormBudgetPicker } from 'app/components/Forms/FormBudgetPicker';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { ServicesFilter } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { RepetitiveControl } from 'app/components/Forms/FormRepetitive/RepetitiveControl';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { FormRestrictedUserGroupPicker } from 'app/components/Forms/FormRestrictedUserGroupPicker';\r\nimport { GlobalSettingsType } from '../components/useGlobalSettingsHook';\r\nimport { RestrictedFilter } from 'app/components/pickers/AutocompletePickers/UserGroupPicker';\r\nimport { restrictedBudgetFilter } from 'app/components/pickers/AutocompletePickers/BudgetPicker';\r\nimport { FormFundingTypePicker } from 'app/components/Forms/FormFundingTypePicker';\r\nimport { FormLabelText } from 'app/components/Forms/FormLabelText';\r\nimport { Box } from '@material-ui/core';\r\nimport { ReservationCustomForm } from '../components/ReservationCustomForm';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport {\r\n formValueSchema,\r\n IFormFileValue,\r\n} from 'app/components/CustomForm/CustomFormUtils';\r\nimport { RepetitiveFor } from 'app/components/Forms/FormRepetitive/slice/types';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n CheckEntityShema,\r\n EntityNumberSchema,\r\n EntityStringSchema,\r\n} from 'app/components/Forms/Schemas';\r\nimport * as Yup from 'yup';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n updateFormValues,\r\n validateAccServices,\r\n validateReservation,\r\n} from '../components/utils';\r\nimport { useReservationSlice } from '../slice';\r\nimport {\r\n initEquipmentsData,\r\n ReservationsEquipmentFilter,\r\n} from 'app/components/pickers/MultiSelectPickers/EquipmentReservationPicker';\r\nimport { Caption } from 'app/components/Typography';\r\nimport { FormSwitch } from 'app/components/Forms/Switch';\r\nimport { Body } from 'app/components/Typography';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { BudgetListener } from '../components/FormFieldListeners/BudgetListener';\r\nimport { UserNameListener } from '../components/FormFieldListeners/UserNameListener';\r\nimport { UserGroupListener } from '../components/FormFieldListeners/UserGroupListener';\r\nimport { StartTimeListener } from '../components/FormFieldListeners/StartTimeListener';\r\nimport { EndTimeListener } from '../components/FormFieldListeners/EndTimeListener';\r\n\r\nimport {\r\n FormChipCheckBoxGroup,\r\n FormChipLabelGroup,\r\n} from 'app/components/Forms/FormChipsGroup';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { ReservationOfflineServices } from '../components/ReservationOfflineServices';\r\nimport { FormAccompaniedServicesPicker } from 'app/components/Forms/FormAccompaniedServicesPicker';\r\nimport { ReservationsAccServicesFilter } from 'app/components/pickers/MultiSelectPickers/AccompaniedServicesPicker';\r\nimport { IEquipmentAccServiceDto } from 'api/odata/generated/entities/IAccServiceDto';\r\nimport { TerminateReservation } from '../components/TerminateReservation';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { quoteODataValue } from 'api/odata/ODataFilter';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { UserProfileLink } from 'app/components/BasicTable/components/UserProfileLink';\r\nimport {\r\n customFormErrorsHandler,\r\n durationErrorsHandler,\r\n otheMessagesHandler,\r\n permissionsErrorsHandler,\r\n prerquisitErrorsHandler,\r\n staffUserChangeHandler,\r\n trainingSessionChangeHandler,\r\n} from './handlers';\r\nimport { FormTrainingSessionPicker } from 'app/components/Forms/FormTrainingSessionPicker';\r\nimport { ReservRelatedFilter } from 'app/components/pickers/AutocompletePickers/TrainingSessionPicker';\r\nimport { ITrainingSessionDto } from 'api/odata/generated/entities/ITrainingSessionDto';\r\nimport { generatePath } from 'react-router-dom';\r\nimport { RUN_DETAILS_PAGE_PATH } from 'app/pages/Samples/RunDetailsPage';\r\nimport { combineOfflineServiceTypes } from '../slice/combineOfflineServiceTypes';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { FormUsersPicker } from 'app/components/Forms/FormUsersPicker';\r\nimport { getReservationCollaboratorsFilter } from './getReservationCollaboratorsFilter';\r\nimport { PurchaseOrderOptions } from 'api/odata/generated/enums/PurchaseOrderOptions';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport produce from 'immer';\r\nimport { FormReservationBudgetExperimentPicker } from 'app/components/Forms/ReservationBudgetExperimentPicker';\r\nimport { TrainingSignUpAdminAlertContent } from '../components/TrainingSignUpAdminAlertContent';\r\nimport { FormReservationTimePeriodPicker } from '../components/ReservationTimePicker';\r\nimport { adjustSchedulerEventTimes } from 'app/pages/CalendarPage/Scheduler/utils/adjustSchedulerEventTimes';\r\nimport { EquipmentsDataAssemblies } from '../components/EquipmentsDataAssemblies';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport {\r\n ListMessagesProps,\r\n SingleMessagesProps,\r\n} from 'app/Layout/FrontendLayout/components/Snackbar/Actions';\r\nimport { ErrorServices } from 'app/pages/OtherServiceDetails/Details/slice/types';\r\nimport { getSingleInvoiceFundingType } from 'app/components/pickers/StaticOptionsPickers/FundingTypeIdPicker';\r\nimport { ReservationWorkOrders } from '../components/ReservationWorkOrders';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport { FormWorkFlowBooking } from 'app/components/Forms/FormWorkFlowBooking';\r\n\r\nexport interface ReservationFormProps {\r\n onSubmit: (\r\n item: ReservationDetailsState,\r\n customFormFiles: IFormFileValue[],\r\n originalFormFiles: IFormFileValue[],\r\n ) => void;\r\n initialValues: ReservationDetailsState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isEdit: boolean;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n isUserGroupCoordinator?: boolean;\r\n repetitiveFormRef: React.MutableRefObject;\r\n globalSettings: GlobalSettingsType;\r\n customFormRef: React.MutableRefObject;\r\n formRef: React.MutableRefObject | null>;\r\n onEquipmentClicked?: (equipment: Entity) => void;\r\n onRestrictionsClick?: (equipment: Entity) => void;\r\n onOtherSrviceClick?: (service: IOtherServices) => void;\r\n onStatusChange?: (event: any, status: ReservationStatus) => void;\r\n onOfflineServiceClick?: (service: IOtherServices) => void;\r\n onAddBatchClick: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n onWorkTypeClick: (\r\n event: IWorkOrderTypeDto,\r\n equipmentIds: number[],\r\n reservationId: number,\r\n ) => void;\r\n trainingSignUp?: boolean;\r\n trainingSessionEnabled?: boolean;\r\n editable?: boolean;\r\n timeEnabled?: boolean;\r\n cancelTransfer?: () => void;\r\n waitingTransferApproval?: boolean;\r\n transferToUser?: Entity | null;\r\n transferForId?: number;\r\n terminationEnabled?: boolean;\r\n handleTerminate: () => void;\r\n allowEditMultipleEquipments: boolean;\r\n useSidePanel: boolean;\r\n offlineServicesErrors: ErrorServices[];\r\n setError?: (error: ErrorServices) => void;\r\n assistedTrainingData: UserTrainingReservationData | null;\r\n allowOngoingModifications?: boolean;\r\n isCover?: boolean;\r\n}\r\n\r\nexport const ReservationForm = React.memo(function ReservationForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isAdmin,\r\n user,\r\n isUserGroupCoordinator,\r\n repetitiveFormRef,\r\n globalSettings,\r\n customFormRef,\r\n formRef,\r\n onEquipmentClicked,\r\n onRestrictionsClick,\r\n onStatusChange,\r\n onOfflineServiceClick,\r\n onWorkTypeClick,\r\n trainingSessionEnabled,\r\n editable,\r\n timeEnabled,\r\n trainingSignUp,\r\n cancelTransfer,\r\n waitingTransferApproval,\r\n transferToUser,\r\n transferForId,\r\n terminationEnabled,\r\n handleTerminate,\r\n allowEditMultipleEquipments,\r\n useSidePanel,\r\n onAddBatchClick,\r\n offlineServicesErrors,\r\n setError,\r\n assistedTrainingData,\r\n allowOngoingModifications,\r\n isCover,\r\n}: ReservationFormProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useReservationSlice();\r\n const { actions: appActions } = useAppSettingsSlice();\r\n\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const reservationSettings = useSelector(selectReservationSettings);\r\n const equipmentSettings = useSelector(selectEquipmentsSettings);\r\n const fieldHandler = useSelector(selectFieldHandler);\r\n const requestedFor = useSelector(selectRequestedValueFor);\r\n const equipmentChangeState = useSelector(selectEquipmentChangeState);\r\n const equipmentChangeCompleted = useSelector(selectEquipmentChangeCompleted);\r\n const asyncChangeLoading = useSelector(selectAsyncChangeLoading);\r\n const savedOfflineServices = useSelector(selectSavedOfflineServices);\r\n const hasError = useSelector(selectReservationHasError);\r\n const isCloned = useSelector(selectCloneReservations);\r\n const insertUpdateCompleted = useSelector(selectReservationCompleted);\r\n const isEdit = useSelector(selectIsEdit);\r\n const savedForLater = useSelector(selectSavedForLater);\r\n const isCreditSubmited = useSelector(selectIsCreditSubmited);\r\n const [submitting, setSubmitting] = React.useState(\r\n undefined,\r\n );\r\n const { newDate } = useSystemDate();\r\n const resetSubmitting = () => {\r\n setSubmitting(true);\r\n };\r\n const [durationErrors, setDurationErrors] = React.useState([]);\r\n const [permissionErrors, setPermissionErrors] = React.useState(\r\n [],\r\n );\r\n const [prerequisitErrors, setPrerequisitErrors] = React.useState(\r\n [],\r\n );\r\n const [customFormErrors, setCustomFormErrors] = React.useState(\r\n [],\r\n );\r\n const [otherErrors, setOtherErrors] = React.useState([]);\r\n const [otherWarnings, setOtherWarnings] = React.useState([]);\r\n const [otherInfo, setOtherInfo] = React.useState([]);\r\n const [otherSuccess, setOtherSuccess] = React.useState([]);\r\n const errorMessages = React.useMemo(() => {\r\n return [\r\n ...otherErrors,\r\n ...customFormErrors,\r\n ...prerequisitErrors,\r\n ...permissionErrors,\r\n ...durationErrors,\r\n ];\r\n }, [\r\n customFormErrors,\r\n durationErrors,\r\n otherErrors,\r\n permissionErrors,\r\n prerequisitErrors,\r\n ]);\r\n const mandatoryServices = React.useMemo(() => {\r\n if (\r\n !!reservationSettings?.MandatoriesEquipments &&\r\n !isEdit &&\r\n reservationSettings.MandatoriesEquipments.length > 0\r\n ) {\r\n return reservationSettings.MandatoriesEquipments.map(f => {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n info: `Mandatory instrument for ${f.ParentName}`,\r\n };\r\n });\r\n } else return [];\r\n }, [isEdit, reservationSettings?.MandatoriesEquipments]);\r\n const resetAllErrors = () => {\r\n setDurationErrors([]);\r\n setPermissionErrors([]);\r\n setPrerequisitErrors([]);\r\n setOtherErrors([]);\r\n setCustomFormErrors([]);\r\n setOtherWarnings([]);\r\n setOtherInfo([]);\r\n setOtherSuccess([]);\r\n };\r\n const handleSubmit = (values: ReservationDetailsState) => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(values, currentFormFiles, originalFormFiles);\r\n }\r\n };\r\n const resetFieldHandler = () => {\r\n dispatch(actions.resetValueHandler());\r\n };\r\n const reserValueKey = () => {\r\n dispatch(actions.resetRequestedFor());\r\n };\r\n const saveRequestedValue = (value: any) => {\r\n dispatch(actions.getAnyValueSuccess(value));\r\n };\r\n /// func Help ///\r\n const addPrerquisitErrors = React.useCallback(\r\n (data: PrerequisitsResult, equipments: Entity[]) => {\r\n if (!data.IsValid) {\r\n prerquisitErrorsHandler(\r\n data,\r\n equipments,\r\n (nodes: IndexNode[]) => setPrerequisitErrors(nodes),\r\n onEquipmentClicked,\r\n onRestrictionsClick,\r\n );\r\n }\r\n },\r\n [onEquipmentClicked, onRestrictionsClick],\r\n );\r\n const addDurationErrors = React.useCallback(\r\n (data: string[], equipments: Entity[]) => {\r\n if (data.length > 0) {\r\n durationErrorsHandler(\r\n data,\r\n equipments,\r\n (nodes: IndexNode[]) => setDurationErrors(nodes),\r\n onRestrictionsClick,\r\n );\r\n }\r\n },\r\n [onRestrictionsClick],\r\n );\r\n const addOtheMessages = React.useCallback(\r\n (data: string[], type: 'warning' | 'error' | 'info' | 'success') => {\r\n if (data.length > 0) {\r\n otheMessagesHandler(data, type, (nodes: IndexNode[]) => {\r\n switch (type) {\r\n case 'error':\r\n setOtherErrors(() => nodes);\r\n break;\r\n case 'warning':\r\n setOtherWarnings(() => nodes);\r\n break;\r\n case 'info':\r\n setOtherInfo(() => nodes);\r\n break;\r\n case 'success':\r\n setOtherSuccess(() => nodes);\r\n break;\r\n }\r\n });\r\n }\r\n },\r\n [],\r\n );\r\n const addCustomFormErrors = React.useCallback((data: string[]) => {\r\n if (data.length > 0) {\r\n customFormErrorsHandler(data, (nodes: IndexNode[]) =>\r\n setCustomFormErrors(nodes),\r\n );\r\n }\r\n }, []);\r\n const addPermissionsErrors = React.useCallback(\r\n (data: string[], equipments: Entity[]) => {\r\n permissionsErrorsHandler(\r\n data,\r\n equipments,\r\n (nodes: IndexNode[]) => setPermissionErrors(nodes),\r\n onRestrictionsClick,\r\n );\r\n },\r\n [onRestrictionsClick],\r\n );\r\n\r\n /// Local State ///\r\n const [userGroupChanged, setUserGroupChanged] = React.useState(false);\r\n const [bookedbyChanged, setBookedByChanged] = React.useState(false);\r\n const [staffChanged, setStaffChanged] = React.useState(false);\r\n const [serviceChanged, setServiceChanged] = React.useState(false);\r\n const [accServiceChanged, setAccServiceChanged] = React.useState(false);\r\n const [budgetChanged, setBudgetChanged] = React.useState(false);\r\n const [statusChanged, setStatusChanged] = React.useState(false);\r\n const [startTimeChanged, setStartTimeChanged] = React.useState(false);\r\n const [endTimeChanged, setEndTimeChanged] = React.useState(false);\r\n const [tutoringChanged, setTutoringChanged] = React.useState(false);\r\n const [optionalChanged, setOptionalChanged] = React.useState(false);\r\n\r\n const [allIsValid, setAllIsValid] = React.useState(true);\r\n const [trainingSessionChanged, setTrainingSessionChanged] = React.useState(\r\n false,\r\n );\r\n const [originalFormFiles, setOriginalFormFiles] = React.useState<\r\n IFormFileValue[]\r\n >([]);\r\n const [currentFormFiles, setCurrentFormFiles] = React.useState<\r\n IFormFileValue[]\r\n >([]);\r\n\r\n const [firstInitEquipments, setFirstInitEquipments] = React.useState<\r\n number[]\r\n >(reservationSettings?.FirstInitEquipments || []);\r\n const [currentStatus, setCurrentStatus] = React.useState(\r\n initialValues.Status?.Id || 1,\r\n );\r\n const [isTrainingSignUp, setIsTrainingSignUp] = React.useState<\r\n boolean | undefined\r\n >(trainingSignUp);\r\n const changeOfflineServices = React.useCallback(\r\n (services: IOtherServices[], operation: 'add' | 'remove' | 'update') => {\r\n if (operation === 'add') {\r\n let addedServ = services.filter(\r\n f =>\r\n !savedOfflineServices.some(\r\n s => s.ServiceTypeID === f.ServiceTypeID,\r\n ),\r\n );\r\n dispatch(\r\n actions.setSavedOfflineServices([\r\n ...savedOfflineServices,\r\n ...addedServ,\r\n ]),\r\n );\r\n }\r\n if (operation === 'remove') {\r\n dispatch(\r\n actions.setSavedOfflineServices(\r\n savedOfflineServices.filter(f => {\r\n return !services.some(a => a.ServiceTypeID === f.ServiceTypeID);\r\n }),\r\n ),\r\n );\r\n }\r\n if (operation === 'update') {\r\n dispatch(\r\n actions.setSavedOfflineServices(\r\n savedOfflineServices.map(f => {\r\n let service = services.find(\r\n s => s.ServiceTypeID === f.ServiceTypeID,\r\n );\r\n if (!!service && service !== null) {\r\n return Object.assign({}, f, service);\r\n } else {\r\n return f;\r\n }\r\n }),\r\n ),\r\n );\r\n }\r\n },\r\n [actions, dispatch, savedOfflineServices],\r\n );\r\n /// memo ///\r\n const isServiceAdmin = React.useMemo(() => {\r\n return equipmentSettings?.IsAllAdmin;\r\n }, [equipmentSettings?.IsAllAdmin]);\r\n\r\n const readonly = React.useMemo(() => {\r\n return (\r\n equipmentChangeCompleted === false ||\r\n asyncChangeLoading === true ||\r\n waitingTransferApproval === true\r\n );\r\n }, [asyncChangeLoading, equipmentChangeCompleted, waitingTransferApproval]);\r\n const fundingTypeVisible = React.useMemo(() => {\r\n return (\r\n globalSettings.purchaseOrderBudgetEnabled &&\r\n globalSettings.fundingTypeBudgetEnabled\r\n );\r\n }, [globalSettings]);\r\n const ReservationUserGroupGroupByBudgetUserGroup = React.useMemo(() => {\r\n return !!equipmentSettings\r\n ? globalSettings.reservationUserGroupGroupByBudgetUserGroup &&\r\n !equipmentSettings.HasHideProjects &&\r\n !equipmentSettings.HasConflictProjects &&\r\n equipmentSettings.BudgetsTurnedOn\r\n : globalSettings.reservationUserGroupGroupByBudgetUserGroup;\r\n }, [\r\n equipmentSettings,\r\n globalSettings.reservationUserGroupGroupByBudgetUserGroup,\r\n ]);\r\n\r\n const userGroupVisible = React.useMemo(() => {\r\n return (\r\n isServiceAdmin &&\r\n (!isEdit ||\r\n (isEdit && !globalSettings.DoNotAllowReservationUserChangeByStaff)) &&\r\n // !isUserGroupCoordinator &&\r\n !ReservationUserGroupGroupByBudgetUserGroup\r\n );\r\n }, [\r\n isServiceAdmin,\r\n isEdit,\r\n globalSettings.DoNotAllowReservationUserChangeByStaff,\r\n ReservationUserGroupGroupByBudgetUserGroup,\r\n ]);\r\n const userVisible = React.useMemo(() => {\r\n return (\r\n (isServiceAdmin || isUserGroupCoordinator) &&\r\n (!isEdit ||\r\n (isEdit && !globalSettings.DoNotAllowReservationUserChangeByStaff))\r\n );\r\n }, [\r\n isServiceAdmin,\r\n isUserGroupCoordinator,\r\n isEdit,\r\n globalSettings.DoNotAllowReservationUserChangeByStaff,\r\n ]);\r\n const userProfileVisible = React.useMemo(() => {\r\n return (\r\n (isServiceAdmin || isUserGroupCoordinator) &&\r\n isEdit &&\r\n globalSettings.DoNotAllowReservationUserChangeByStaff\r\n );\r\n }, [\r\n isServiceAdmin,\r\n isUserGroupCoordinator,\r\n isEdit,\r\n globalSettings.DoNotAllowReservationUserChangeByStaff,\r\n ]);\r\n const tutoringVisible = React.useMemo(() => {\r\n return (\r\n globalSettings.assistedReservationsEnabled &&\r\n globalSettings.tutoringModulesEnabled &&\r\n equipmentSettings?.IsEquipmentTutoring &&\r\n !isTrainingSignUp\r\n );\r\n }, [\r\n equipmentSettings?.IsEquipmentTutoring,\r\n globalSettings.assistedReservationsEnabled,\r\n globalSettings.tutoringModulesEnabled,\r\n isTrainingSignUp,\r\n ]);\r\n const tutoringEnabled = React.useMemo(() => {\r\n let tutoringAllowed =\r\n globalSettings.assistedReservationsEnabled &&\r\n globalSettings.tutoringModulesEnabled &&\r\n equipmentSettings?.IsEquipmentTutoring &&\r\n !isTrainingSignUp;\r\n let forceTutoring =\r\n equipmentSettings?.ForceTutoring || reservationSettings?.IsForceTutoring;\r\n let hasValidTraining =\r\n assistedTrainingData === null\r\n ? false\r\n : assistedTrainingData.Equipments.some(f => f.RequiresAdminApproval)\r\n ? false\r\n : isEdit\r\n ? editable\r\n : true;\r\n if (!isEdit) {\r\n return (\r\n (tutoringAllowed && (isServiceAdmin || hasValidTraining)) ||\r\n !forceTutoring\r\n );\r\n } else {\r\n return tutoringAllowed && forceTutoring\r\n ? isServiceAdmin || hasValidTraining\r\n : editable;\r\n }\r\n }, [\r\n globalSettings.assistedReservationsEnabled,\r\n globalSettings.tutoringModulesEnabled,\r\n equipmentSettings?.IsEquipmentTutoring,\r\n equipmentSettings?.ForceTutoring,\r\n isTrainingSignUp,\r\n reservationSettings?.IsForceTutoring,\r\n assistedTrainingData,\r\n isEdit,\r\n editable,\r\n isServiceAdmin,\r\n ]);\r\n const trainingSessionVisible = React.useMemo(() => {\r\n return (\r\n trainingSessionEnabled &&\r\n (reservationSettings?.TrainingSessionOnly || isTrainingSignUp)\r\n );\r\n }, [\r\n reservationSettings?.TrainingSessionOnly,\r\n trainingSessionEnabled,\r\n isTrainingSignUp,\r\n ]);\r\n const workflowBookingVisible = React.useMemo(() => {\r\n return globalSettings.AllowWorkflowBooking;\r\n }, [globalSettings.AllowWorkflowBooking]);\r\n const workflowBookingEnabled = React.useMemo(() => {\r\n return (\r\n workflowBookingVisible &&\r\n (globalSettings.ModifyReservationNameForUsers || isAdmin)\r\n );\r\n }, [\r\n globalSettings.ModifyReservationNameForUsers,\r\n isAdmin,\r\n workflowBookingVisible,\r\n ]);\r\n const trainingSignUpVisible = React.useMemo(() => {\r\n return (\r\n globalSettings.trainingSessionEnabled &&\r\n !equipmentSettings?.HideTrainingSession &&\r\n reservationSettings?.HasTrainingSession\r\n );\r\n }, [\r\n globalSettings.trainingSessionEnabled,\r\n equipmentSettings?.HideTrainingSession,\r\n reservationSettings?.HasTrainingSession,\r\n ]);\r\n const staffVisible = React.useMemo(() => {\r\n return (\r\n equipmentSettings?.StaffUserVisibleAllways ||\r\n (equipmentSettings?.StaffUserVisibleOnPending &&\r\n currentStatus === ReservationStatus.Pending)\r\n );\r\n }, [\r\n equipmentSettings?.StaffUserVisibleAllways,\r\n equipmentSettings?.StaffUserVisibleOnPending,\r\n currentStatus,\r\n ]);\r\n const reservationCollaboratorsVisible = React.useMemo(() => {\r\n return equipmentSettings?.AllowReservationCollaborators;\r\n }, [equipmentSettings?.AllowReservationCollaborators]);\r\n const ForceFullDayReservations = React.useMemo(\r\n () => equipmentSettings?.ForceFullDayReservations,\r\n [equipmentSettings?.ForceFullDayReservations],\r\n );\r\n const budgetExperimentVisible = React.useMemo(\r\n () => equipmentSettings?.budgetExperimentVisible,\r\n [equipmentSettings?.budgetExperimentVisible],\r\n );\r\n const staffRequired = React.useMemo(() => {\r\n return (\r\n equipmentSettings?.StaffUserRequiredAlwais ||\r\n (equipmentSettings?.StaffUserRequiredOnPending &&\r\n currentStatus === ReservationStatus.Pending)\r\n );\r\n }, [\r\n equipmentSettings?.StaffUserRequiredAlwais,\r\n equipmentSettings?.StaffUserRequiredOnPending,\r\n currentStatus,\r\n ]);\r\n const warningMessages: IndexNode[] = React.useMemo(() => {\r\n let nodes: IndexNode[] = [];\r\n if (firstInitEquipments.length > 0) {\r\n nodes.push({\r\n index: 'notMoreThenOneIndex',\r\n node: (\r\n \r\n {t(translations.AvailableInstrumentsMessage) as string}\r\n \r\n ),\r\n });\r\n }\r\n if (isEdit) {\r\n if (\r\n currentStatus !== ReservationStatus.Cancelled &&\r\n currentStatus !== ReservationStatus.CancelledByAdmin\r\n ) {\r\n if (\r\n initialValues.Tutoring &&\r\n currentStatus === ReservationStatus.Pending\r\n ) {\r\n nodes.push({\r\n index: 'pendingApproval',\r\n node: (\r\n \r\n \r\n {t(translations.ReservationPendingApproval) as string}\r\n \r\n {isServiceAdmin && (\r\n \r\n !!onStatusChange &&\r\n onStatusChange(e, ReservationStatus.Approved)\r\n }\r\n >\r\n {t(translations.Approve) as string}\r\n \r\n )}\r\n \r\n {t(translations.res_wrn_NewPendingReservation) as string}\r\n \r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n } else if (currentStatus === ReservationStatus.PendingCoord) {\r\n nodes.push({\r\n index: 'pendingCoordApproval',\r\n node: (\r\n \r\n \r\n {t(translations.RequireGroupCoordApprovalMessage) as string}\r\n \r\n \r\n {t(translations.res_wrn_NewPendingCoordReservation) as string}\r\n \r\n {isUserGroupCoordinator && (\r\n \r\n !!onStatusChange &&\r\n onStatusChange(e, ReservationStatus.Approved)\r\n }\r\n >\r\n {t(translations.Approve) as string}\r\n \r\n )}\r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n if (\r\n equipmentSettings?.DraftSaveForLater &&\r\n currentStatus === ReservationStatus.Draft\r\n ) {\r\n nodes.push({\r\n index: 'draftReservation',\r\n node: (\r\n \r\n \r\n {t(translations.res_wrn_DraftReservation) as string}\r\n \r\n {(isServiceAdmin ||\r\n initialValues.BookedBy?.Id === user?.Id) && (\r\n \r\n !!onStatusChange &&\r\n onStatusChange(e, ReservationStatus.Approved)\r\n }\r\n >\r\n {t(translations.MakeFirm) as string}\r\n \r\n )}\r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n }\r\n }\r\n if (\r\n !isEdit &&\r\n initialValues.TransferFromId !== null &&\r\n initialValues.TransferFromId !== undefined\r\n ) {\r\n nodes.push({\r\n index: 'transferWarning',\r\n node: (\r\n \r\n \r\n {t(translations.Transfer) as string}\r\n \r\n \r\n {t(translations.ReservationTransferMessage) as string}\r\n \r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n if (\r\n !isEdit &&\r\n (equipmentSettings?.RequireUserGroupCoordApproval ||\r\n user?.RequireUserGroupCoordApproval)\r\n ) {\r\n nodes.push({\r\n index: 'pendingCoordApproval',\r\n node: (\r\n \r\n \r\n {t(translations.RequireGroupCoordApprovalMessage) as string}\r\n \r\n \r\n {t(translations.res_wrn_NewPendingCoordReservation) as string}\r\n \r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n if (\r\n reservationSettings?.TrainingSessionOnly === true &&\r\n reservationSettings?.HasTrainingSession !== true\r\n ) {\r\n nodes.push({\r\n index: 'trainingSessionMissingWarning',\r\n node: (\r\n \r\n \r\n {t(translations.TrainingSession) as string}\r\n \r\n \r\n {t(translations.TrainingSessionsRes_warning) as string}\r\n \r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n return [...nodes, ...otherWarnings];\r\n }, [\r\n currentStatus,\r\n equipmentSettings?.DraftSaveForLater,\r\n equipmentSettings?.RequireUserGroupCoordApproval,\r\n firstInitEquipments.length,\r\n initialValues.BookedBy?.Id,\r\n initialValues.TransferFromId,\r\n initialValues.Tutoring,\r\n isEdit,\r\n isServiceAdmin,\r\n isUserGroupCoordinator,\r\n onStatusChange,\r\n otherWarnings,\r\n reservationSettings?.HasTrainingSession,\r\n reservationSettings?.TrainingSessionOnly,\r\n t,\r\n user?.Id,\r\n user?.RequireUserGroupCoordApproval,\r\n ]);\r\n const infoMessages = React.useMemo(() => {\r\n let nodes: IndexNode[] = [];\r\n if (\r\n globalSettings.assistedReservationsEnabled &&\r\n !equipmentSettings?.IsAllAdmin &&\r\n equipmentSettings?.ForceTutoring &&\r\n !isEdit &&\r\n currentStatus === ReservationStatus.Pending\r\n ) {\r\n nodes.push({\r\n index: 'asiistedTutorInfo',\r\n node: (\r\n \r\n {`${\r\n t(translations.TutoringAssistedReservation) as string\r\n } - ${getSingleReservationStatus(currentStatus).Name}`}\r\n \r\n {\r\n t(\r\n translations.AssistedReservationsPendingApprovalInfo,\r\n ) as string\r\n }\r\n \r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n if (\r\n isEdit &&\r\n transferToUser !== null &&\r\n transferToUser !== undefined &&\r\n waitingTransferApproval === true\r\n ) {\r\n nodes.push({\r\n index: 'waitingTraferInfo',\r\n node: (\r\n \r\n \r\n {t(translations.TransferReservation) as string}\r\n \r\n \r\n {(t(translations.TransferredToDetailsMessage) as string).replace(\r\n '{0}',\r\n transferToUser?.Name || '',\r\n )}\r\n \r\n \r\n {editable && (\r\n {\r\n !!cancelTransfer && cancelTransfer();\r\n }}\r\n >\r\n {t(translations.CancelTransfer) as string}\r\n \r\n )}\r\n\r\n {(isServiceAdmin ||\r\n initialValues.TransferredTo?.Id === user?.Id) && (\r\n \r\n {t(translations.TakeOverTransfer) as string}\r\n \r\n )}\r\n \r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n if (isEdit && terminationEnabled) {\r\n nodes.push({\r\n index: 'terminationInfo',\r\n node: (\r\n \r\n \r\n {t(translations.NotUsingThisReservation)}\r\n \r\n {/* {t(translations.NotUsingThisReservation)} */}\r\n \r\n \r\n \r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n if (trainingSessionVisible && isServiceAdmin) {\r\n let reservation = formRef.current?.values || initialValues;\r\n let session =\r\n reservation.TrainingSession !== null\r\n ? (reservation.TrainingSession as ITrainingSessionDto)\r\n : null;\r\n if (session !== null && trainingSignUp) {\r\n nodes.push({\r\n index: 'trainingSignUps',\r\n showMore: false,\r\n node: (\r\n
    \r\n \r\n
    \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n }\r\n if (!isEdit) {\r\n const assemblyPartsSelected = formRef.current?.values.EquipmentsData.some(\r\n service => (service as IReservationEquipmentDto)?.AssemblyId !== null,\r\n );\r\n if (assemblyPartsSelected) {\r\n nodes.push({\r\n index: 'index',\r\n showMore: false,\r\n node: (\r\n <>{t(translations.ReservationSidePanelAssemblyPart_ErrorMessage)}\r\n ),\r\n });\r\n }\r\n }\r\n\r\n return [...nodes, ...otherInfo];\r\n }, [\r\n cancelTransfer,\r\n currentStatus,\r\n editable,\r\n equipmentSettings?.ForceTutoring,\r\n equipmentSettings?.IsAllAdmin,\r\n equipmentSettings?.IsLoanDesc,\r\n formRef,\r\n globalSettings.assistedReservationsEnabled,\r\n handleTerminate,\r\n initialValues,\r\n isEdit,\r\n isServiceAdmin,\r\n otherInfo,\r\n reservationSettings?.BaseEquipment?.Id,\r\n t,\r\n terminationEnabled,\r\n trainingSessionVisible,\r\n trainingSignUp,\r\n transferToUser,\r\n user?.Id,\r\n waitingTransferApproval,\r\n ]);\r\n const successMessages = React.useMemo(() => {\r\n let nodes: IndexNode[] = [];\r\n if (\r\n globalSettings.assistedReservationsEnabled &&\r\n equipmentSettings?.ForceTutoring &&\r\n isEdit &&\r\n currentStatus === ReservationStatus.Approved\r\n ) {\r\n nodes.push({\r\n index: 'asiistedTutorApproved',\r\n node: (\r\n \r\n {t(translations.ReservationAssistedApproved) as string}\r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n return [...nodes, ...otherSuccess];\r\n }, [\r\n currentStatus,\r\n equipmentSettings?.ForceTutoring,\r\n globalSettings.assistedReservationsEnabled,\r\n isEdit,\r\n otherSuccess,\r\n t,\r\n ]);\r\n const equipmentsChangeHandler = React.useCallback(\r\n (\r\n values: ReservationDetailsState,\r\n changeStatus?: boolean,\r\n selectedEqs?: IReservationEquipmentDto[],\r\n ) => {\r\n let allEquipments = !!selectedEqs\r\n ? selectedEqs\r\n : [\r\n ...(values.EquipmentsData as IReservationEquipmentDto[]),\r\n ...(((reservationSettings?.MandatoriesEquipments || []) as Entity<\r\n number\r\n >[]) as IReservationEquipmentDto[]),\r\n ...((values.OptionalsEquipments.filter(\r\n f => f.checked === true,\r\n ) as Entity[]) as IReservationEquipmentDto[]),\r\n ];\r\n dispatch(\r\n actions.extendEquipmentSettingsState({\r\n equipments: allEquipments,\r\n mandatories: [],\r\n accServices: values.AccServices as IEquipmentAccServiceDto[],\r\n globalSettings: globalSettings,\r\n settings: equipmentSettings,\r\n }),\r\n );\r\n const payload: EquipmentsChangeStateParameters = {\r\n AccServices: values.AccServices.map(f => f.Id),\r\n Equipments: allEquipments.map(f => f.Id),\r\n ReservationId: (values.Id ?? 0) > 0 ? values.Id : null,\r\n Start: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.StartTime),\r\n { representation: 'complete' },\r\n ),\r\n End: dateUtils.formatISO(dateUtils.dateOrStringToDate(values.EndTime), {\r\n representation: 'complete',\r\n }),\r\n BookedBy: values.BookedBy?.Id || null,\r\n Status: values.Status?.Id || 1,\r\n TrainingSignUp: values.TrainingSignUp,\r\n Tutoring: values.Tutoring,\r\n ADGroup: values.ADGroup?.Id || user?.ActiveUserGroup?.Id || null,\r\n FundingTypeId: values.FundingType?.Id || 0,\r\n CheckStatus: changeStatus || false,\r\n TrainingSessionId: values.TrainingSession?.Id || null,\r\n Remarks: values.Remarks || null,\r\n BudgetId: values.Budget?.Id || null,\r\n CheckSession: !equipmentSettings?.HideTrainingSession,\r\n FullDayReservation: values.FullDayReservation,\r\n };\r\n console.log('initValidationData-equipment');\r\n resetAllErrors();\r\n dispatch(\r\n actions.initValidationData({\r\n parameters: payload,\r\n warnings: [],\r\n errors: [],\r\n }),\r\n );\r\n },\r\n [\r\n actions,\r\n dispatch,\r\n equipmentSettings,\r\n globalSettings,\r\n reservationSettings?.MandatoriesEquipments,\r\n user?.ActiveUserGroup?.Id,\r\n ],\r\n );\r\n const extendStaffMandatoryEquipment = React.useCallback(\r\n (staff: IReservationEquipmentDto | null) => {\r\n dispatch(\r\n actions.extendReservationSettings({\r\n StaffMandatoryEquipment: staff,\r\n }),\r\n );\r\n },\r\n [actions, dispatch],\r\n );\r\n const extendMandatoryEquipments = React.useCallback(\r\n (mandatories: IMandatoryEquipmentsDto[]) => {\r\n dispatch(\r\n actions.extendReservationSettings({\r\n MandatoriesEquipments: mandatories,\r\n }),\r\n );\r\n },\r\n [actions, dispatch],\r\n );\r\n const initStaffReservation = React.useCallback(\r\n (staffEquipmentId: number, values: ReservationDetailsState) => {\r\n resetAllErrors();\r\n dispatch(\r\n actions.initReservation({\r\n query: {\r\n id: undefined,\r\n selectedIds: values.EquipmentsData.map(f => f.Id).join(','),\r\n Start: values.StartTime.toString(),\r\n End: values.EndTime.toString(),\r\n tsid:\r\n values.TrainingSession === null\r\n ? undefined\r\n : values.TrainingSession.Id.toString(),\r\n remarks: values.Remarks,\r\n accid: values.AccServices.map(f => f.Id).join(','),\r\n singleClick: undefined,\r\n duration: undefined,\r\n ug: values.ADGroup?.Id,\r\n un: values.BookedBy?.Id,\r\n ft:\r\n values.FundingType === null || values.FundingType === undefined\r\n ? undefined\r\n : values.FundingType.Id.toString(),\r\n srid: undefined,\r\n srrid: undefined,\r\n srsid: undefined,\r\n sampleRunId: undefined,\r\n defaultMulti: undefined,\r\n resIdTransferredFrom: values.TransferFromId?.toString(),\r\n source: undefined,\r\n UpdateToNow: undefined,\r\n terminated: undefined,\r\n resourceChanged: true.toString(),\r\n staffEquipmentId: staffEquipmentId.toString(),\r\n staffUser: values.StaffUser?.Id,\r\n } as ReservationQueryStringParameters,\r\n globalSettings: globalSettings,\r\n prevState: values,\r\n }),\r\n );\r\n setFirstInitEquipments([]);\r\n setServiceChanged(false);\r\n setAccServiceChanged(false);\r\n },\r\n [actions, dispatch, globalSettings],\r\n );\r\n const initTrainingSession = React.useCallback(\r\n (\r\n trainingSessionData: TrainingSessionResult,\r\n values: ReservationDetailsState,\r\n ) => {\r\n resetAllErrors();\r\n dispatch(\r\n actions.initReservation({\r\n query: {\r\n id: undefined,\r\n selectedIds: values.EquipmentsData.map(f => f.Id).join(','),\r\n Start: trainingSessionData.Start.toString(),\r\n End: trainingSessionData.End.toString(),\r\n tsid:\r\n trainingSessionData.TrainingSessionId === null\r\n ? undefined\r\n : trainingSessionData.TrainingSessionId.toString(),\r\n remarks: values.Remarks,\r\n accid: undefined,\r\n singleClick: undefined,\r\n duration: undefined,\r\n ug: values.ADGroup?.Id,\r\n un: values.BookedBy?.Id,\r\n ft:\r\n values.FundingType === null || values.FundingType === undefined\r\n ? undefined\r\n : values.FundingType.Id.toString(),\r\n srid: undefined,\r\n srrid: undefined,\r\n srsid: undefined,\r\n sampleRunId: undefined,\r\n defaultMulti: undefined,\r\n resIdTransferredFrom: undefined,\r\n source: undefined,\r\n UpdateToNow: undefined,\r\n terminated: undefined,\r\n resourceChanged: true.toString(),\r\n staffEquipmentId: undefined,\r\n staffUser: trainingSessionData.StaffUser,\r\n } as ReservationQueryStringParameters,\r\n globalSettings: globalSettings,\r\n prevState: values,\r\n }),\r\n );\r\n setFirstInitEquipments([]);\r\n setServiceChanged(false);\r\n setAccServiceChanged(false);\r\n },\r\n [actions, dispatch, globalSettings],\r\n );\r\n const setStaffEquipmentRestricted = React.useCallback(\r\n (staffUserName: string) => {\r\n setOtherErrors(() => [\r\n {\r\n index: 3,\r\n node: (\r\n \r\n \r\n {(t(\r\n translations.err_res_StaffUserEquipmentRestricted,\r\n ) as string).replace('{0}', staffUserName)}\r\n \r\n \r\n ),\r\n },\r\n ]);\r\n },\r\n [t],\r\n );\r\n const staffChangeHandler = React.useCallback(\r\n (\r\n values: ReservationDetailsState,\r\n setValue: (\r\n field: string,\r\n value: any,\r\n shouldValidate?: boolean | undefined,\r\n ) => void,\r\n ) => {\r\n return staffUserChangeHandler(\r\n values,\r\n isEdit,\r\n setValue,\r\n equipmentsChangeHandler,\r\n extendStaffMandatoryEquipment,\r\n extendMandatoryEquipments,\r\n initStaffReservation,\r\n setStaffEquipmentRestricted,\r\n reservationSettings,\r\n );\r\n },\r\n [\r\n equipmentsChangeHandler,\r\n extendMandatoryEquipments,\r\n extendStaffMandatoryEquipment,\r\n initStaffReservation,\r\n isEdit,\r\n reservationSettings,\r\n setStaffEquipmentRestricted,\r\n ],\r\n );\r\n const multipleEquipmentsChangeHandler = React.useCallback(\r\n (\r\n values: ReservationDetailsState,\r\n setValue: (\r\n field: string,\r\n value: any,\r\n shouldValidate?: boolean | undefined,\r\n ) => void,\r\n ) => {\r\n let equipments = values.EquipmentsData as IReservationEquipmentDto[];\r\n let mandatories = (equipments.length > 0 &&\r\n equipments.some(f => f.MandatoriesEquipments.length > 0)\r\n ? equipments.reduce((acc, next) => {\r\n return acc;\r\n }, equipments.filter(f => f.MandatoriesEquipments.length > 0)[0].MandatoriesEquipments)\r\n : []\r\n ).filter(f => !equipments.some(s => f.Id === s.Id));\r\n /**\r\n * Gets the mandatory offline service types attached to reservation services.\r\n * @param services services selected for the reservation\r\n * @returns array of mandatory offline service type details\r\n */\r\n const getMandatoryOfflineServices = (\r\n services: IReservationEquipmentDto[],\r\n ) => {\r\n const MandatoryOfflineServicesOnTrainingSignUps =\r\n globalSettings.MandatoryOfflineServicesOnTrainingSignUps ||\r\n !values.TrainingSignUp;\r\n /**\r\n * If the MandatoryOfflineServicesOnTrainingSignUps system setting is turned off, then no offline service types should be mandatory for training signups\r\n */\r\n\r\n const initialValue: Pick<\r\n ReservationSettingsState,\r\n 'OfflineMandatory' | 'OfflineOptional'\r\n > = {\r\n OfflineMandatory: [],\r\n OfflineOptional: [],\r\n };\r\n const result = combineOfflineServiceTypes(services)?.reduce(\r\n (previousValue, currentValue) => {\r\n const mandatory =\r\n MandatoryOfflineServicesOnTrainingSignUps && currentValue;\r\n\r\n (mandatory\r\n ? previousValue.OfflineMandatory\r\n : previousValue.OfflineOptional\r\n ).push((currentValue as unknown) as IOtherServices);\r\n return previousValue;\r\n },\r\n initialValue,\r\n );\r\n return result;\r\n };\r\n if (mandatories.length > 0) {\r\n (async () => {\r\n try {\r\n const data = (await initEquipmentsData(\r\n mandatories.map(f => f.Id).join(','),\r\n 'AccServices,OfflineServices,StaffUserSelection,MandatoriesEquipments,OptionalsEquipments',\r\n )) as IMandatoryEquipmentsDto[];\r\n\r\n const allEquipments = [\r\n ...values.EquipmentsData,\r\n ...data,\r\n ] as IReservationEquipmentDto[];\r\n dispatch(\r\n actions.extendReservationSettings({\r\n MandatoriesEquipments: data,\r\n ...getMandatoryOfflineServices(allEquipments),\r\n }),\r\n );\r\n\r\n setValue('EquipmentsData', allEquipments);\r\n equipmentsChangeHandler(\r\n Object.assign({}, values, {\r\n EquipmentsData: allEquipments,\r\n }),\r\n true,\r\n );\r\n } catch {}\r\n })();\r\n } else {\r\n dispatch(\r\n actions.extendReservationSettings({\r\n MandatoriesEquipments: mandatories,\r\n ...getMandatoryOfflineServices(equipments),\r\n }),\r\n );\r\n equipmentsChangeHandler(\r\n Object.assign({}, values, {\r\n EquipmentsData: equipments,\r\n }),\r\n true,\r\n );\r\n }\r\n },\r\n [\r\n actions,\r\n dispatch,\r\n equipmentsChangeHandler,\r\n globalSettings.MandatoryOfflineServicesOnTrainingSignUps,\r\n ],\r\n );\r\n const warnOnTrainingSession = React.useCallback(\r\n (data: TrainingSessionResult | null, values: ReservationDetailsState) => {\r\n trainingSessionChangeHandler(\r\n data,\r\n (nodes: IndexNode[]) => setOtherWarnings(nodes),\r\n (data, values) => {\r\n initTrainingSession(data, values);\r\n setIsTrainingSignUp(true);\r\n },\r\n values,\r\n );\r\n },\r\n [initTrainingSession],\r\n );\r\n const handleFormChange = React.useCallback(\r\n (\r\n values: ReservationDetailsState,\r\n isValid,\r\n dirty,\r\n setValue,\r\n setTouched,\r\n validateField,\r\n setError,\r\n validate,\r\n ) => {\r\n if (staffChanged) {\r\n staffChangeHandler(values, setValue);\r\n setStaffChanged(false);\r\n }\r\n if ((serviceChanged || accServiceChanged) && !isEdit) {\r\n resetAllErrors();\r\n dispatch(\r\n actions.initReservation({\r\n query: {\r\n id: undefined,\r\n selectedIds: values.EquipmentsData.map(f => f.Id).join(','),\r\n Start: values.StartTime.toString(),\r\n End: values.EndTime.toString(),\r\n tsid:\r\n values.TrainingSession === null\r\n ? undefined\r\n : values.TrainingSession.Id.toString(),\r\n remarks: values.Remarks,\r\n accid: values.AccServices.map(f => f.Id).join(','),\r\n singleClick: undefined,\r\n duration: undefined,\r\n ug: values.ADGroup?.Id,\r\n un: values.BookedBy?.Id,\r\n ft:\r\n values.FundingType === null || values.FundingType === undefined\r\n ? undefined\r\n : values.FundingType.Id.toString(),\r\n srid: undefined,\r\n srrid: undefined,\r\n srsid: undefined,\r\n sampleRunId: values.SampleRunId?.toString(),\r\n defaultMulti: undefined,\r\n resIdTransferredFrom: values.TransferFromId?.toString(),\r\n source: undefined,\r\n UpdateToNow: undefined,\r\n terminated: undefined,\r\n resourceChanged: true.toString(),\r\n staffEquipmentId: (\r\n (values.StaffUser as IUserFilterDto)?.StaffEquipmentId ??\r\n undefined\r\n )?.toString(),\r\n staffUser: values.StaffUser?.Id,\r\n } as ReservationQueryStringParameters,\r\n globalSettings: globalSettings,\r\n prevState: values,\r\n }),\r\n );\r\n setFirstInitEquipments([]);\r\n setServiceChanged(false);\r\n setAccServiceChanged(false);\r\n setStaffChanged(false);\r\n }\r\n if (serviceChanged && isEdit && allowEditMultipleEquipments) {\r\n multipleEquipmentsChangeHandler(values, setValue);\r\n setServiceChanged(false);\r\n }\r\n if (userGroupChanged) {\r\n console.log('User Group Changed', values.ADGroup);\r\n setDurationErrors([]);\r\n setPermissionErrors([]);\r\n setPrerequisitErrors([]);\r\n setUserGroupChanged(false);\r\n }\r\n if (bookedbyChanged) {\r\n console.log('BookedBy Changed', values.BookedBy);\r\n if (values.BookedBy !== null) {\r\n equipmentsChangeHandler(values, true);\r\n }\r\n resetAllErrors();\r\n setBookedByChanged(false);\r\n }\r\n if (budgetChanged) {\r\n console.log('Budget Changed', values.Budget);\r\n setBudgetChanged(false);\r\n }\r\n if (statusChanged) {\r\n setCurrentStatus(values.Status?.Id || 1);\r\n console.log('Status Changed', values.Status);\r\n setStatusChanged(false);\r\n }\r\n if (startTimeChanged) {\r\n resetAllErrors();\r\n console.log('Start Time Changed', values.StartTime);\r\n setStartTimeChanged(false);\r\n }\r\n if (endTimeChanged) {\r\n resetAllErrors();\r\n console.log('End Time Changed', values.EndTime);\r\n setEndTimeChanged(false);\r\n }\r\n if (tutoringChanged) {\r\n console.log('Tutoring Changed', values.Tutoring);\r\n if (values.Tutoring === true) {\r\n setValue(\r\n 'Status',\r\n getSingleReservationStatus(ReservationStatus.Pending),\r\n );\r\n setCurrentStatus(\r\n getSingleReservationStatus(ReservationStatus.Pending).Id,\r\n );\r\n } else {\r\n setValue(\r\n 'Status',\r\n getSingleReservationStatus(ReservationStatus.Approved),\r\n );\r\n setCurrentStatus(\r\n getSingleReservationStatus(ReservationStatus.Approved).Id,\r\n );\r\n if (equipmentSettings?.StaffUserVisibleOnPending) {\r\n setValue('StaffUser', null);\r\n }\r\n }\r\n setTutoringChanged(false);\r\n }\r\n if (optionalChanged) {\r\n setOtherErrors([]);\r\n equipmentsChangeHandler(values);\r\n console.log('Optional Changed');\r\n setOptionalChanged(false);\r\n }\r\n if (trainingSessionChanged) {\r\n if (!!values.TrainingSession && values.TrainingSession !== null) {\r\n setValue(\r\n 'StartTime',\r\n (values.TrainingSession as ITrainingSessionDto).StartDate,\r\n );\r\n setValue(\r\n 'EndTime',\r\n (values.TrainingSession as ITrainingSessionDto).EndDate,\r\n );\r\n setValue('StaffUser', {\r\n Id: (values.TrainingSession as ITrainingSessionDto).Trainer,\r\n Name: (values.TrainingSession as ITrainingSessionDto).TrainerName,\r\n });\r\n }\r\n setTrainingSessionChanged(false);\r\n }\r\n },\r\n [\r\n staffChanged,\r\n serviceChanged,\r\n accServiceChanged,\r\n isEdit,\r\n allowEditMultipleEquipments,\r\n userGroupChanged,\r\n bookedbyChanged,\r\n budgetChanged,\r\n statusChanged,\r\n startTimeChanged,\r\n endTimeChanged,\r\n tutoringChanged,\r\n optionalChanged,\r\n trainingSessionChanged,\r\n staffChangeHandler,\r\n dispatch,\r\n actions,\r\n globalSettings,\r\n multipleEquipmentsChangeHandler,\r\n equipmentsChangeHandler,\r\n equipmentSettings?.StaffUserVisibleOnPending,\r\n ],\r\n );\r\n const validateForms = React.useCallback((isValid: boolean) => {\r\n setAllIsValid(isValid);\r\n }, []);\r\n\r\n /// useEffects\r\n React.useEffect(() => {\r\n if (formRef.current) {\r\n formRef.current.validateForm();\r\n }\r\n }, [formRef]);\r\n React.useEffect(() => {\r\n if (!!equipmentChangeState) {\r\n console.log('equipment settings: ', equipmentSettings);\r\n if (\r\n !!equipmentChangeState.CustomForms &&\r\n equipmentChangeState.CustomForms.ErrorMessages.length > 0\r\n ) {\r\n addCustomFormErrors(equipmentChangeState.CustomForms.ErrorMessages);\r\n }\r\n\r\n if (equipmentChangeState.ErrorMessages.length > 0) {\r\n addOtheMessages(equipmentChangeState.ErrorMessages, 'error');\r\n }\r\n if (equipmentChangeState.WarningMessages.length > 0) {\r\n addOtheMessages(equipmentChangeState.ErrorMessages, 'warning');\r\n }\r\n if (equipmentChangeState.TrainingSessionData !== null) {\r\n if (equipmentChangeState.TrainingSessionData.HasTrainingSession) {\r\n setOtherErrors([]);\r\n warnOnTrainingSession(\r\n equipmentChangeState.TrainingSessionData,\r\n formRef.current?.values || initialValues,\r\n );\r\n }\r\n }\r\n let budget: IBudgetFilterDto | null = null;\r\n let userGroup: Entity | null = null;\r\n if (equipmentSettings?.BudgetVisible && !isEdit) {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'Budget',\r\n fieldValue: equipmentChangeState.DefaultBudget,\r\n }),\r\n );\r\n if (\r\n fundingTypeVisible &&\r\n equipmentChangeState.DefaultBudget?.FundingTypeId !== undefined &&\r\n equipmentChangeState.DefaultBudget?.FundingTypeId !== null\r\n ) {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'FundingType',\r\n fieldValue: getSingleInvoiceFundingType(\r\n equipmentChangeState.DefaultBudget?.FundingTypeId,\r\n ),\r\n }),\r\n );\r\n }\r\n budget = equipmentChangeState.DefaultBudget;\r\n if (\r\n ReservationUserGroupGroupByBudgetUserGroup &&\r\n equipmentChangeState.DefaultBudget !== null\r\n ) {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'ADGroup',\r\n fieldValue: {\r\n Id: equipmentChangeState.DefaultBudget.UserGroupId,\r\n Name: equipmentChangeState.DefaultBudget.UserGroupName,\r\n },\r\n }),\r\n );\r\n userGroup = {\r\n Id: equipmentChangeState?.DefaultBudget?.UserGroupId ?? '',\r\n Name: equipmentChangeState?.DefaultBudget?.UserGroupName ?? '',\r\n };\r\n }\r\n }\r\n if (equipmentChangeState.StatusChange !== null) {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'Status',\r\n fieldValue: getSingleReservationStatus(\r\n equipmentChangeState.StatusChange.Status,\r\n ),\r\n }),\r\n );\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'Tutoring',\r\n fieldValue: equipmentChangeState.StatusChange.Tutoring,\r\n }),\r\n );\r\n setCurrentStatus(equipmentChangeState.StatusChange.Status);\r\n }\r\n let values = formRef.current?.values || initialValues;\r\n if (!!values) {\r\n let allEquipments = [\r\n ...(values.EquipmentsData as IReservationEquipmentDto[]),\r\n ...(((reservationSettings?.MandatoriesEquipments || []) as Entity<\r\n number\r\n >[]) as IReservationEquipmentDto[]),\r\n ...((values.OptionalsEquipments.filter(\r\n f => f.checked === true,\r\n ) as Entity[]) as IReservationEquipmentDto[]),\r\n ];\r\n const payload = {\r\n AccServices: values.AccServices.map(f => f.Id),\r\n Equipments: allEquipments.map(f => f.Id),\r\n ReservationId: (values.Id ?? 0) > 0 ? values.Id : null,\r\n Start: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.StartTime),\r\n ),\r\n End: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.EndTime),\r\n ),\r\n BookedBy: values.BookedBy?.Id || null,\r\n Status: values.Status?.Id || 1,\r\n TrainingSignUp: values.TrainingSignUp,\r\n Tutoring: values.Tutoring,\r\n ADGroup: values.ADGroup?.Id || userGroup?.Id || null,\r\n FundingTypeId: fundingTypeVisible ? 0 : values.FundingType?.Id || 0,\r\n CheckStatus: false,\r\n TrainingSessionId: values.TrainingSession?.Id || null,\r\n Remarks: values.Remarks || null,\r\n BudgetId: values.Budget?.Id || budget?.Id || null,\r\n CheckSession: false,\r\n } as EquipmentsChangeStateParameters;\r\n (async () => {\r\n var validations = await validateReservation(payload);\r\n let resultValidation = validations as ReservationValidationResult;\r\n if (!!resultValidation) {\r\n if (!!resultValidation.PrerequisiteTrainings) {\r\n if (!resultValidation.PrerequisiteTrainings.IsValid) {\r\n addPrerquisitErrors(\r\n resultValidation.PrerequisiteTrainings,\r\n values.EquipmentsData,\r\n );\r\n }\r\n }\r\n if (resultValidation.PermissionErrors.length > 0) {\r\n addPermissionsErrors(\r\n resultValidation.PermissionErrors,\r\n values.EquipmentsData,\r\n );\r\n }\r\n if (\r\n resultValidation.ErrorMessages.length > 0 &&\r\n !equipmentChangeState.TrainingSessionData === null\r\n ) {\r\n addOtheMessages(resultValidation.ErrorMessages, 'error');\r\n }\r\n if (resultValidation.WarningMessages.length > 0) {\r\n addOtheMessages(resultValidation.WarningMessages, 'error');\r\n }\r\n }\r\n //accServicesValidation\r\n if (\r\n allEquipments.some(\r\n f => !!f.AccServices && f.AccServices.length > 0,\r\n ) &&\r\n !isTrainingSignUp\r\n ) {\r\n let res = validateAccServices(allEquipments);\r\n if (res.length > 0) {\r\n let error = (t(\r\n translations.err_MultipleEquipmentsWithAndWithoutAccServices,\r\n ) as string).replace('{0}', res.join(', '));\r\n addOtheMessages([error], 'error');\r\n }\r\n }\r\n })();\r\n }\r\n\r\n dispatch(actions.resetEquipmentChangeState());\r\n }\r\n }, [\r\n ReservationUserGroupGroupByBudgetUserGroup,\r\n actions,\r\n addCustomFormErrors,\r\n addDurationErrors,\r\n addOtheMessages,\r\n addPermissionsErrors,\r\n addPrerquisitErrors,\r\n dispatch,\r\n equipmentChangeState,\r\n equipmentSettings,\r\n formRef,\r\n fundingTypeVisible,\r\n initialValues,\r\n isEdit,\r\n isTrainingSignUp,\r\n reservationSettings?.MandatoriesEquipments,\r\n t,\r\n warnOnTrainingSession,\r\n ]);\r\n const computedSchema = React.useMemo(() => {\r\n const reservationSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().notRequired().default(-1),\r\n EquipmentsData: Yup.array()\r\n .of(Yup.mixed() as Yup.SchemaOf)\r\n .min(1)\r\n .label(t(translations.OnlineService) as string)\r\n .required(t(translations.err_OnlineServiceFieldRequired) as string)\r\n .test(\r\n 'assembly',\r\n t(\r\n translations.AssemblyPartReservationCanNotBeUpdatedDirectly,\r\n ) as string,\r\n\r\n (value, context) => {\r\n const isValid = (value as IReservationEquipmentDto[]).every(\r\n service => service.AssemblyId === null,\r\n );\r\n return isValid;\r\n },\r\n ),\r\n Budget: Yup.mixed()\r\n .label(t(translations.BudgetNumber) as string)\r\n .nullable(true),\r\n BudgetExperiment: Yup.mixed()\r\n .label(t(translations.BudgetExperiment) as string)\r\n .nullable(true)\r\n .when('Budget', {\r\n is: (Budget: IBudgetFilterDto | null) =>\r\n equipmentSettings?.BudgetVisible !== false &&\r\n equipmentSettings?.budgetExperimentVisible &&\r\n Budget !== null &&\r\n Budget.HideExperiments !== true,\r\n then: schema =>\r\n schema.required(\r\n t(translations.res_err_BudgetExperimentRequired) as string,\r\n ),\r\n otherwise: schema => schema,\r\n }),\r\n\r\n TrainingSession: Yup.mixed().label(\r\n t(translations.TrainingSession) as string,\r\n ),\r\n StaffUser: Yup.mixed()\r\n .label(t(translations.StaffUser) as string)\r\n .nullable(true),\r\n BookedBy: Yup.mixed()\r\n .label(t(translations.User) as string)\r\n .required(() => t(translations.err_UserFieldRequired) as string),\r\n Remarks: Yup.string()\r\n .nullable()\r\n .label(t(translations.Remarks) as string),\r\n FullDayReservation: Yup.boolean().required(),\r\n StartTime: Yup.date()\r\n .default(newDate())\r\n .label(t(translations.StartTime) as string)\r\n .required(t(translations._errStartTimeRequired) as string),\r\n EndTime: Yup.date()\r\n .label(t(translations.EndTime) as string)\r\n .required(t(translations._errEndTimeRequired) as string)\r\n .min(\r\n Yup.ref('StartTime'),\r\n t(translations.err_EndTimeLowerThanStartTime) as string,\r\n ),\r\n Tutoring: Yup.boolean()\r\n .label(t(translations.TutoringAssistedReservation) as string)\r\n .default(false),\r\n TutorName: Yup.string()\r\n .label(t(translations.TutorName) as string)\r\n .nullable(true),\r\n Status: Yup.mixed()\r\n .label(t(translations.OrderStatus) as string)\r\n .required(),\r\n TrainingSignUp: Yup.boolean()\r\n .default(false)\r\n .label(t(translations.TrainingSignUp) as string),\r\n ADGroup: Yup.mixed()\r\n .label(t(translations.UserGroup) as string)\r\n .nullable(true),\r\n DisplayName: Yup.string()\r\n .label(t(translations.Name) as string)\r\n .nullable(),\r\n InstituteProject: Yup.mixed()\r\n .label(t(translations.InstituteProject) as string)\r\n .nullable(true),\r\n ExperimentEln: Yup.mixed()\r\n .label(t(translations.Experiment) as string)\r\n .nullable(true),\r\n WorkflowBooking: Yup.mixed()\r\n .label(t(translations.WorkflowBooking) as string)\r\n .nullable(true),\r\n ExternalCustomer: Yup.mixed()\r\n .label(t(translations.ExternalCustomer) as string)\r\n .nullable(true),\r\n FundingType: Yup.mixed().label(t(translations.FundingType) as string),\r\n PurchaseOrder: Yup.string()\r\n .label(t(translations.PurchaseOrder) as string)\r\n .nullable(true)\r\n .min(globalSettings.purchaseOrderLengthSetting ?? 0)\r\n .when('Budget', {\r\n is: budget => {\r\n const result =\r\n globalSettings.purchaseOrderBudgetEnabled &&\r\n (budget as IBudgetFilterDto)?.PurchaseOrderOptionId ===\r\n PurchaseOrderOptions.Mandatory;\r\n return result;\r\n },\r\n then: schema => schema.required(),\r\n }),\r\n\r\n Reference: Yup.string()\r\n .label(t(translations.Reference) as string)\r\n .nullable(true),\r\n PartialAttendance: Yup.boolean()\r\n .default(false)\r\n .label(t(translations.Attendance) as string),\r\n PartialAttendanceStart: Yup.number()\r\n .label(t(translations.PartialAttendanceStartDuration) as string)\r\n .nullable(true),\r\n PartialAttendanceEnd: Yup.number()\r\n .label(t(translations.PartialAttendanceEndDuration) as string)\r\n .nullable(true),\r\n TransferredTo: Yup.mixed()\r\n .label(t(translations.TransferReservation) as string)\r\n .nullable(true),\r\n SampleRunId: Yup.number()\r\n .label(t(translations.SampleRunId) as string)\r\n .nullable(true),\r\n AccServices: Yup.array()\r\n .of(EntityNumberSchema)\r\n .label(t(translations.AccompaniedService) as string),\r\n FormValues: Yup.array().of(formValueSchema),\r\n CollaboratedUsers: Yup.array()\r\n .of(EntityStringSchema)\r\n .label(t(translations.CollaboratorUsers) as string),\r\n SampleIds: Yup.array()\r\n .of(Yup.number().required())\r\n .label(t(translations.SampleIds) as string),\r\n OptionalsEquipments: Yup.array().of(CheckEntityShema),\r\n WaitingTransferApproval: Yup.boolean().default(false),\r\n TransferFromId: Yup.number().nullable(true).default(null),\r\n // not really needed on the form\r\n AssemblyParts: Yup.mixed().nullable().optional(),\r\n },\r\n );\r\n if (equipmentSettings?.BudgetVisible === true) {\r\n reservationSchema.fields.Budget.withMutation(schema =>\r\n schema.required(t(translations.BudgetIsRequired) as string),\r\n );\r\n }\r\n if (\r\n globalSettings.accServicesEnabled &&\r\n equipmentSettings?.HasAccServices &&\r\n !isTrainingSignUp\r\n ) {\r\n reservationSchema.fields.AccServices.withMutation(schema =>\r\n schema\r\n .min(1, t(translations.err_AccompaniedService_required) as string)\r\n .required(t(translations.err_AccompaniedService_required) as string),\r\n );\r\n }\r\n if (staffRequired) {\r\n reservationSchema.fields.StaffUser.withMutation(schema =>\r\n schema.required(t(translations.StaffUserRequired) as string),\r\n );\r\n }\r\n if (workflowBookingVisible) {\r\n reservationSchema.fields.WorkflowBooking.withMutation(schema =>\r\n schema.required(t(translations.err_WorkflowBookingRequired) as string),\r\n );\r\n }\r\n return reservationSchema;\r\n }, [\r\n equipmentSettings?.BudgetVisible,\r\n equipmentSettings?.HasAccServices,\r\n equipmentSettings?.budgetExperimentVisible,\r\n globalSettings.accServicesEnabled,\r\n globalSettings.purchaseOrderBudgetEnabled,\r\n globalSettings.purchaseOrderLengthSetting,\r\n isTrainingSignUp,\r\n newDate,\r\n staffRequired,\r\n t,\r\n workflowBookingVisible,\r\n ]);\r\n const handleFullDayReservationChange = (\r\n event: React.ChangeEvent,\r\n ) => {\r\n // todo: move this to a callback with the formik.values accessible there instead of this mess\r\n const startTime = formRef.current?.values.StartTime;\r\n const endTime = formRef.current?.values.EndTime;\r\n if (\r\n startTime !== null &&\r\n endTime !== null &&\r\n startTime !== undefined &&\r\n endTime !== undefined\r\n ) {\r\n const fullDayReservation = event.target.checked === true;\r\n if (fullDayReservation) {\r\n const currentPeriod = {\r\n start_date: dateUtils.dateOrStringToDate(startTime),\r\n end_date: dateUtils.dateOrStringToDate(endTime),\r\n };\r\n /**\r\n * When full day reservation is being checked, the end time needs to be moved to the end of the day, start - to the start of the day\r\n */\r\n const adjusted = adjustSchedulerEventTimes(\r\n currentPeriod,\r\n fullDayReservation,\r\n );\r\n const partialReservationDetailsState: Pick<\r\n ReservationDetailsState,\r\n 'StartTime' | 'EndTime'\r\n > = {\r\n /**\r\n * TODO: adjust the starttime of the reservation. Currently setting the startTime messes up the end time also\r\n * e.g.\r\n * {start:'2023-08-02T11:05:00', end:'2023-08-02T12:05:00'} -> (original)\r\n * {start:'2023-08-02T00:00:00', end:'2023-08-03T00:00:00'} -> (in setValues)\r\n * {start:'2023-08-02T00:00:00', end:'2023-08-03T22:27:12Z'} -> (final formik Values)\r\n */\r\n StartTime: dateUtils.formatQueryStringDate(adjusted.start_date, {\r\n representation: 'complete',\r\n }),\r\n EndTime: dateUtils.formatQueryStringDate(adjusted.end_date, {\r\n representation: 'complete',\r\n }),\r\n };\r\n formRef.current?.setValues(values => ({\r\n ...values,\r\n ...partialReservationDetailsState,\r\n }));\r\n }\r\n }\r\n };\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n if (allIsValid) {\r\n console.log(reservationSettings);\r\n formikHelpers.validateForm(values).then(responseErrors => {\r\n if (!isEmpty(responseErrors)) {\r\n formikHelpers.setSubmitting(false);\r\n console.debug('errors', responseErrors);\r\n } else if (errorMessages.length > 0) {\r\n console.debug('errors', errorMessages);\r\n formikHelpers.setSubmitting(false);\r\n } else if (offlineServicesErrors.length > 0) {\r\n formikHelpers.setSubmitting(false);\r\n dispatch(\r\n appActions.addNotification({\r\n variant: 'error',\r\n message: '',\r\n messageType: SnackBarMessageType.messageList,\r\n messageTypeProps: {\r\n messages: offlineServicesErrors.map(f => {\r\n return {\r\n Id: f.id.toString(),\r\n message: f.error,\r\n } as SingleMessagesProps;\r\n }),\r\n } as ListMessagesProps,\r\n }),\r\n );\r\n if (isCreditSubmited) {\r\n dispatch(actions.setSubmitCredit(false));\r\n }\r\n } else {\r\n if (isCreditSubmited) {\r\n handleSubmit(values);\r\n } else {\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n dispatch(actions.resetOperateState());\r\n if (submitting) {\r\n setSubmitting(undefined);\r\n }\r\n handleSubmit(values);\r\n }\r\n }\r\n });\r\n } else {\r\n formikHelpers.setSubmitting(false);\r\n }\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n console.log('Reservation errors', formik.errors);\r\n }\r\n console.log('Reservation submitting', formik.isSubmitting);\r\n const reservationCollaboratorsFilter = getReservationCollaboratorsFilter(\r\n equipmentSettings,\r\n formik,\r\n );\r\n const staffUserPickerPredicates =\r\n (equipmentSettings?.StaffUserSelection?.length || 0) > 0\r\n ? [\r\n `(Id in ${quoteODataValue(\r\n equipmentSettings?.StaffUserSelection.filter(f =>\r\n (formik.values\r\n .EquipmentsData as IReservationEquipmentDto[]).some(c =>\r\n c.StaffUserSelection.some(u => u.Id === f.Id),\r\n ),\r\n ) || [],\r\n )})`,\r\n ]\r\n : [\r\n `(IsLabTech or isEquipmentAdmin or isGroupAdmin) and ${(formik\r\n .values.EquipmentsData as IReservationEquipmentDto[])\r\n ?.map(\r\n equipment =>\r\n `(Services/any(s:s/Id eq ${equipment.Id}) or (${equipment.ServiceGroupId} in ServiceGroupIds)`,\r\n )\r\n .join(' and ')})`,\r\n ];\r\n\r\n return (\r\n \r\n \r\n <>\r\n \r\n \r\n \r\n \r\n \r\n formik.setFieldValue('ADGroup', value)\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n f.Id,\r\n )\r\n : [],\r\n )}\r\n name=\"EquipmentsData\"\r\n label={t(translations.OnlineService)}\r\n placeholder={t(translations.PleaseSelectServices)}\r\n disabled={\r\n formik.isSubmitting ||\r\n (isEdit &&\r\n !(editable && allowEditMultipleEquipments)) ||\r\n readonly\r\n }\r\n onChange={() => setServiceChanged(true)}\r\n onChipClick={onEquipmentClicked}\r\n multiple={\r\n globalSettings.multipleInstrumentsEnabled &&\r\n !trainingSessionVisible\r\n }\r\n autoExpand={\r\n 'MandatoriesEquipments,OptionalsEquipments,AccServices,OfflineServices,StaffUserSelection'\r\n }\r\n fullWidth\r\n />\r\n {globalSettings.AssemblyPartsEnabled && (\r\n \r\n )}\r\n \r\n {globalSettings.accServicesEnabled &&\r\n equipmentSettings?.HasAccServices &&\r\n !isTrainingSignUp && (\r\n \r\n f.Id),\r\n )}\r\n name=\"AccServices\"\r\n label={t(translations.AccompaniedService)}\r\n placeholder={t(\r\n translations.PleaseSelectAnAccompaniedService,\r\n )}\r\n disabled={\r\n formik.isSubmitting ||\r\n (isEdit && !editable) ||\r\n readonly\r\n }\r\n onChange={() => setAccServiceChanged(true)}\r\n multiple={\r\n equipmentSettings.HasAccServices &&\r\n !equipmentSettings.AllowOneAccSerOnly\r\n }\r\n fullWidth\r\n />\r\n \r\n )}\r\n {mandatoryServices.length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!!reservationSettings?.OptionalsEquipments &&\r\n !isEdit &&\r\n reservationSettings.OptionalsEquipments.length > 0 && (\r\n \r\n \r\n {\r\n setOptionalChanged(() => true);\r\n }}\r\n disabled={formik.isSubmitting || readonly}\r\n label={t(translations.AddingsOptionalEquipments)}\r\n size=\"small\"\r\n />\r\n \r\n )}\r\n {trainingSessionVisible && (\r\n \r\n setTrainingSessionChanged(true)}\r\n predicates={ReservRelatedFilter(\r\n formik.values.EquipmentsData[0].Id,\r\n )}\r\n fullWidth\r\n />\r\n \r\n )}\r\n {workflowBookingVisible && (\r\n \r\n \r\n \r\n )}\r\n {!trainingSessionVisible && (\r\n \r\n \r\n \r\n \r\n 0 &&\r\n // (equipmentSettings?.RestrictDurationUnitsAmount ??\r\n // 0) > 0)\r\n }\r\n onStartTimeChange={() => setStartTimeChanged(true)}\r\n onEndTimeChange={() => setEndTimeChanged(true)}\r\n startTimeLabel={t(translations.From)}\r\n endTimeLabel={t(translations.To)}\r\n />\r\n \r\n )}\r\n\r\n {userGroupVisible ? (\r\n \r\n setUserGroupChanged(true)}\r\n fullWidth\r\n />\r\n \r\n ) : (\r\n \r\n \r\n {formik.values.ADGroup !== undefined &&\r\n formik.values.ADGroup !== null\r\n ? formik.values.ADGroup.Name\r\n : (t(translations.NA) as string)}\r\n \r\n }\r\n />\r\n \r\n )}\r\n {userVisible ? (\r\n \r\n {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n ServiceTypeId: 1,\r\n ServiceGroupId: f.ServiceGroupId,\r\n HideProject: f.HideProjects,\r\n } as IServiceTypeFilterDto;\r\n },\r\n ),\r\n globalSettings.budgetExperimentModuleEnabled,\r\n formik.values.ADGroup?.Id,\r\n formik.values.Budget?.Id,\r\n )}\r\n label={t(translations.User)}\r\n disabled={\r\n formik.isSubmitting ||\r\n readonly ||\r\n (isEdit && !editable)\r\n }\r\n onChange={value => {\r\n setBookedByChanged(true);\r\n }}\r\n fullWidth\r\n />\r\n \r\n ) : (\r\n \r\n \r\n {userProfileVisible &&\r\n formik.values.BookedBy !== null && (\r\n \r\n )}\r\n {/* {formik.values.BookedBy !== null\r\n ? formik.values.BookedBy.Name\r\n : (t(translations.NA) as string)} */}\r\n \r\n }\r\n />\r\n \r\n )}\r\n {staffVisible && (\r\n \r\n 0\r\n ? 'full'\r\n : 'admin'\r\n }\r\n predicates={staffUserPickerPredicates}\r\n label={t(translations.StaffUser)}\r\n disabled={\r\n formik.isSubmitting ||\r\n readonly ||\r\n (isEdit && !editable)\r\n }\r\n onChange={() => setStaffChanged(true)}\r\n fullWidth\r\n />\r\n \r\n )}\r\n {equipmentSettings?.BudgetVisible && fundingTypeVisible && (\r\n \r\n {\r\n formik.setValues(\r\n produce(values => {\r\n // clear budget selection when funding type is changed to an incompatible value\r\n // for example, if an external budget is selected, and funding type is changed to internal - budget should be reset\r\n if (\r\n (value as Entity).Id !==\r\n (values.Budget as IBudgetFilterDto)\r\n ?.FundingTypeId\r\n ) {\r\n values.Budget = null;\r\n }\r\n values.FundingType = value;\r\n }),\r\n );\r\n }}\r\n fullWidth\r\n />\r\n \r\n )}\r\n {equipmentSettings?.BudgetVisible && (\r\n <>\r\n \r\n {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n ServiceTypeId: 1,\r\n ServiceGroupId: f.ServiceGroupId,\r\n HideProject: f.HideProjects,\r\n } as IServiceTypeFilterDto;\r\n },\r\n ),\r\n startTime: dateUtils.dateOrStringToDate(\r\n formik.values.StartTime,\r\n ),\r\n endTime: dateUtils.dateOrStringToDate(\r\n formik.values.EndTime,\r\n ),\r\n user: isServiceAdmin\r\n ? formik.values.BookedBy === null\r\n ? undefined\r\n : formik.values.BookedBy.Id\r\n : user?.Id,\r\n defaultBudgetEnabled:\r\n globalSettings.defaultBudgetEnabled,\r\n userDefaultBudgetEnabled:\r\n globalSettings.userDefaultBudgetEnabled,\r\n hideNonDefaultBudgets:\r\n globalSettings.hideNonDefaultBudgets,\r\n // funding type is set to Internal by default even if it's not in use\r\n fundingType: fundingTypeVisible\r\n ? formik.values.FundingType\r\n : null,\r\n })}\r\n label={t(translations.BudgetNumber)}\r\n onChange={() => {\r\n setBudgetChanged(true);\r\n formik.setFieldValue('CollaboratedUsers', []);\r\n }}\r\n disabled={\r\n formik.isSubmitting ||\r\n readonly ||\r\n (isEdit && !editable)\r\n }\r\n useSearchOrPredicate={\r\n globalSettings.hideNonDefaultBudgets\r\n }\r\n fullWidth\r\n />\r\n \r\n {budgetExperimentVisible &&\r\n !(\r\n (formik.values.Budget as IBudgetFilterDto)\r\n ?.HideExperiments ?? true\r\n ) && (\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n {reservationCollaboratorsVisible && (\r\n \r\n \r\n \r\n )}\r\n {globalSettings.purchaseOrderBudgetEnabled &&\r\n ((formik.values.Budget as IBudgetFilterDto)\r\n ?.PurchaseOrderOptionId ??\r\n PurchaseOrderOptions.Hidden) !==\r\n PurchaseOrderOptions.Hidden && (\r\n \r\n \r\n \r\n )}\r\n \r\n {isEdit &&\r\n (!useSidePanel || (useSidePanel && sidePanelExpanded)) &&\r\n allowOngoingModifications && (\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n {(!useSidePanel || (useSidePanel && sidePanelExpanded)) && (\r\n \r\n \r\n setStatusChanged(true)}\r\n fullWidth\r\n />\r\n \r\n \r\n )}\r\n {tutoringVisible && (\r\n \r\n setTutoringChanged(true)}\r\n />\r\n \r\n )}\r\n {(!useSidePanel || (useSidePanel && sidePanelExpanded)) && (\r\n \r\n {trainingSignUpVisible && (\r\n \r\n {\r\n setIsTrainingSignUp(!isTrainingSignUp);\r\n }}\r\n />\r\n \r\n )}\r\n \r\n )}\r\n \r\n {!isEdit && !formik.values.TrainingSignUp && (\r\n \r\n )}\r\n {globalSettings.offlineServiceWithReservation &&\r\n !!reservationSettings &&\r\n (equipmentSettings?.OfflineServicesVisible ||\r\n (reservationSettings?.OfflineMandatory !== undefined &&\r\n reservationSettings?.OfflineMandatory?.length > 0)) && (\r\n \r\n )}\r\n\r\n {globalSettings.resCustomFormEnabled &&\r\n !!reservationSettings &&\r\n (reservationSettings.CustomForms?.length > 0 ||\r\n (isEdit && formik.values.FormValues?.length > 0)) && (\r\n \r\n 0\r\n ? reservationSettings.CustomForms\r\n : []\r\n }\r\n readonly={readonly}\r\n isAdmin={isAdmin}\r\n customFormRef={customFormRef}\r\n formIsValid={validateForms}\r\n disabled={\r\n formik.isSubmitting ||\r\n (isEdit && !editable) ||\r\n readonly\r\n }\r\n validationEnabled={!savedForLater}\r\n saveFormValues={(\r\n values: IFormValueDto[],\r\n files: IFormFileValue[],\r\n originalFiles: IFormFileValue[],\r\n ) => {\r\n formik.setFieldValue(\r\n 'FormValues',\r\n updateFormValues(\r\n formik.values.FormValues,\r\n values,\r\n ),\r\n false,\r\n );\r\n setCurrentFormFiles(files);\r\n setOriginalFormFiles(originalFiles);\r\n }}\r\n formValues={formik.values.FormValues}\r\n />\r\n \r\n )}\r\n {formik.values.SampleRunId !== null &&\r\n formik.values.SampleRunId !== undefined && (\r\n \r\n \r\n {t(translations.SampleRunId)}: \r\n {formik.values.SampleRunId}\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","import { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { ReservationsApi } from 'api/ReservationsApi';\r\nimport { initEquipmentsData } from 'app/components/pickers/MultiSelectPickers/EquipmentReservationPicker';\r\nimport { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport {\r\n IMandatoryEquipmentsDto,\r\n IReservationEquipmentDto,\r\n PrerequisitsResult,\r\n ReservationDetailsState,\r\n ReservationSettingsState,\r\n TrainingSessionResult,\r\n} from '../slice/types';\r\nimport { IndexNode } from 'app/components/Forms/FormsLayout/StyledForm';\r\nimport { Box, Link as MuiLink } from '@material-ui/core';\r\nimport { Caption } from 'app/components/Typography';\r\nimport { Body } from 'app/components/Typography';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { BulletedList } from 'app/components/BasicList/StyledList';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport const staffUserChangeHandler = (\r\n values: ReservationDetailsState,\r\n isEdit: boolean,\r\n setValue: (\r\n field: string,\r\n value: any,\r\n shouldValidate?: boolean | undefined,\r\n ) => void,\r\n equipmentsChangeHandler: (\r\n values: ReservationDetailsState,\r\n changeStatus?: boolean | undefined,\r\n selectedEqs?: IReservationEquipmentDto[],\r\n ) => void,\r\n extendStaffMandatoryEquipment: (\r\n staff: IReservationEquipmentDto | null,\r\n ) => void,\r\n extendMandatoryEquipments: (mandatories: IMandatoryEquipmentsDto[]) => void,\r\n initStaffReservation: (\r\n staffEquipmentId: number,\r\n values: ReservationDetailsState,\r\n ) => void,\r\n setStaffEquipmentRestricted: (staffUser: string) => void,\r\n reservationSettings?: ReservationSettingsState,\r\n) => {\r\n let staffEquipmentId =\r\n values.StaffUser !== null\r\n ? (values.StaffUser as IUserFilterDto).StaffEquipmentId\r\n : null;\r\n if (staffEquipmentId !== null) {\r\n let allEquipments = [\r\n ...(values.EquipmentsData as IReservationEquipmentDto[]),\r\n ...(((reservationSettings?.MandatoriesEquipments || []) as Entity<\r\n number\r\n >[]) as IReservationEquipmentDto[]),\r\n ...((values.OptionalsEquipments.filter(f => f.checked === true) as Entity<\r\n number\r\n >[]) as IReservationEquipmentDto[]),\r\n ];\r\n if (!allEquipments.some(f => f.Id === staffEquipmentId)) {\r\n if (isEdit) {\r\n (async () => {\r\n try {\r\n let setEquipments: Entity[] = [];\r\n let data = await initEquipmentsData(\r\n staffEquipmentId.toString(),\r\n 'AccServices,OfflineServices,StaffUserSelection,MandatoriesEquipments,OptionalsEquipments',\r\n );\r\n if (data.length > 0) {\r\n let staffEquipment = data[0];\r\n if (\r\n !!reservationSettings &&\r\n reservationSettings.StaffMandatoryEquipment !== null\r\n ) {\r\n setEquipments = [\r\n ...values.EquipmentsData.filter(\r\n f =>\r\n f.Id !== reservationSettings.StaffMandatoryEquipment?.Id,\r\n ),\r\n Object.assign({}, staffEquipment, {\r\n noremoved: true,\r\n titleInfo: `Mandatory instrument for ${values.StaffUser?.Name}`,\r\n }),\r\n ];\r\n } else {\r\n setEquipments = [\r\n ...values.EquipmentsData,\r\n Object.assign({}, staffEquipment, {\r\n noremoved: true,\r\n titleInfo: `Mandatory instrument for ${values.StaffUser?.Name}`,\r\n }),\r\n ];\r\n }\r\n setValue('EquipmentsData', setEquipments);\r\n extendStaffMandatoryEquipment(\r\n staffEquipment as IReservationEquipmentDto,\r\n );\r\n equipmentsChangeHandler(\r\n Object.assign({}, values, {\r\n EquipmentsData: setEquipments,\r\n }),\r\n true,\r\n );\r\n } else {\r\n setStaffEquipmentRestricted(values.StaffUser?.Name ?? '');\r\n setValue('StaffUser', null);\r\n }\r\n } catch {}\r\n })();\r\n } else {\r\n (async () => {\r\n try {\r\n let notRestricted = await ReservationsApi.userCanBookEquipment(\r\n staffEquipmentId,\r\n );\r\n\r\n if (notRestricted.value === true) {\r\n initStaffReservation(staffEquipmentId, values);\r\n } else {\r\n setStaffEquipmentRestricted(values.StaffUser?.Name ?? '');\r\n setValue('StaffUser', null);\r\n }\r\n } catch {}\r\n })();\r\n }\r\n }\r\n } else {\r\n if (\r\n !!reservationSettings &&\r\n reservationSettings.StaffMandatoryEquipment !== null\r\n ) {\r\n if (isEdit) {\r\n let setEquipments = values.EquipmentsData.filter(\r\n f => f.Id !== reservationSettings.StaffMandatoryEquipment?.Id,\r\n );\r\n setValue('EquipmentsData', setEquipments);\r\n equipmentsChangeHandler(\r\n Object.assign({}, values, { EquipmentsData: setEquipments }),\r\n true,\r\n );\r\n } else {\r\n if (reservationSettings.MandatoriesEquipments.length > 0) {\r\n let mand = reservationSettings.MandatoriesEquipments.filter(\r\n f => f.Id !== reservationSettings.StaffMandatoryEquipment?.Id,\r\n );\r\n let alleqs = [\r\n ...(values.EquipmentsData as IReservationEquipmentDto[]),\r\n ...((mand as Entity[]) as IReservationEquipmentDto[]),\r\n ...((values.OptionalsEquipments.filter(\r\n f => f.checked === true,\r\n ) as Entity[]) as IReservationEquipmentDto[]),\r\n ];\r\n extendMandatoryEquipments(mand);\r\n equipmentsChangeHandler(values, true, alleqs);\r\n }\r\n }\r\n extendStaffMandatoryEquipment(null);\r\n }\r\n }\r\n};\r\nexport const prerquisitErrorsHandler = (\r\n data: PrerequisitsResult,\r\n equipments: Entity[],\r\n setPrerequisitErrors: (items: IndexNode[]) => void,\r\n onEquipmentClicked?: (equipment: Entity) => void,\r\n onRestrictionsClick?: (equipment: Entity) => void,\r\n) => {\r\n setPrerequisitErrors(\r\n data.PrerequisiteTrainings.length > 0\r\n ? [\r\n {\r\n index: 'prerequisiteIndex',\r\n node: (\r\n \r\n {data.ErrorMessage}\r\n {data.PrerequisiteTrainings.map(pre => (\r\n \r\n {' '}\r\n \r\n !!onEquipmentClicked && onEquipmentClicked(pre)\r\n }\r\n >\r\n {pre.Name}\r\n \r\n \r\n ))}\r\n {equipments.length === 1 ? (\r\n \r\n \r\n !!onRestrictionsClick &&\r\n onRestrictionsClick(equipments[0])\r\n }\r\n >\r\n {i18next.t(translations.AllRestrictions)}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {i18next.t(translations.AllRestrictions)}\r\n \r\n {\r\n return {\r\n key: per.Id,\r\n node: (\r\n \r\n \r\n !!onRestrictionsClick &&\r\n onRestrictionsClick(per)\r\n }\r\n >\r\n {per.Name}\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 index: 'pErrorIndex',\r\n node: {data.ErrorMessage},\r\n },\r\n ],\r\n );\r\n};\r\nexport const trainingSessionChangeHandler = (\r\n data: TrainingSessionResult | null,\r\n setMessage: (items: IndexNode[]) => void,\r\n initTrainingSession: (\r\n data: TrainingSessionResult,\r\n values: ReservationDetailsState,\r\n ) => void,\r\n values: ReservationDetailsState,\r\n) => {\r\n if (data !== null && data.HasTrainingSession === true) {\r\n setMessage([\r\n {\r\n index: 'trainingSessionWarning',\r\n node: (\r\n \r\n \r\n {(i18next.t(translations.warn_TrainingSessionsTimeSlot) as string)\r\n .replace('{0}', dateUtils.shortDateTimeFormat(data.Start) ?? '')\r\n .replace('{1}', dateUtils.shortDateTimeFormat(data.End) ?? '')}\r\n \r\n initTrainingSession(data, values)}\r\n >\r\n {i18next.t(translations.SignUp) as string}\r\n \r\n \r\n ),\r\n },\r\n ]);\r\n }\r\n};\r\nexport const durationErrorsHandler = (\r\n data: string[],\r\n equipments: Entity[],\r\n setDurationErrors: (items: IndexNode[]) => void,\r\n onRestrictionsClick?: (equipment: Entity) => void,\r\n) => {\r\n setDurationErrors([\r\n {\r\n index: 'durationErrors',\r\n node: (\r\n \r\n {data.map(dur => (\r\n {dur}\r\n ))}\r\n {equipments.length === 1 ? (\r\n \r\n \r\n !!onRestrictionsClick && onRestrictionsClick(equipments[0])\r\n }\r\n >\r\n {i18next.t(translations.AllRestrictions)}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {i18next.t(translations.AllRestrictions)}\r\n \r\n {\r\n return {\r\n key: per.Id,\r\n node: (\r\n \r\n \r\n !!onRestrictionsClick && onRestrictionsClick(per)\r\n }\r\n >\r\n {per.Name}\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\nexport const otheMessagesHandler = (\r\n data: string[],\r\n type: 'warning' | 'error' | 'info' | 'success',\r\n setMessage: (items: IndexNode[]) => void,\r\n) => {\r\n let index = `other_${type}_${data.length}`;\r\n let message = [\r\n {\r\n index: index,\r\n node: (\r\n \r\n {data.map(msg => (\r\n \r\n {msg}\r\n \r\n ))}\r\n \r\n ),\r\n },\r\n ];\r\n setMessage(message);\r\n};\r\nexport const customFormErrorsHandler = (\r\n data: string[],\r\n setMessage: (items: IndexNode[]) => void,\r\n) => {\r\n setMessage([\r\n {\r\n index: 'cutFErrors',\r\n node: (\r\n \r\n {data.map(dur => (\r\n \r\n {dur}\r\n \r\n ))}\r\n \r\n ),\r\n },\r\n ]);\r\n};\r\nexport const permissionsErrorsHandler = (\r\n data: string[],\r\n equipments: Entity[],\r\n setMessage: (items: IndexNode[]) => void,\r\n onRestrictionsClick?: (equipment: Entity) => void,\r\n) => {\r\n setMessage([\r\n {\r\n index: 'permIndex',\r\n node: (\r\n \r\n {data.map((t, index) => (\r\n {t}\r\n ))}\r\n {equipments.length === 1 ? (\r\n \r\n \r\n !!onRestrictionsClick && onRestrictionsClick(equipments[0])\r\n }\r\n >\r\n {i18next.t(translations.AllRestrictions)}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {i18next.t(translations.AllRestrictions)}\r\n \r\n {\r\n return {\r\n key: per.Id,\r\n node: (\r\n \r\n \r\n !!onRestrictionsClick && onRestrictionsClick(per)\r\n }\r\n >\r\n {per.Name}\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","import { FormikProps } from 'formik';\r\nimport { ReservationDetailsState, ServiceSettingsState } from '../slice/types';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\n\r\nexport function getReservationCollaboratorsFilter(\r\n equipmentSettings: ServiceSettingsState | undefined,\r\n formik: FormikProps,\r\n) {\r\n return [\r\n equipmentSettings?.BudgetVisible === true\r\n ? new Condition(\r\n 'Budgets',\r\n ODataOperators.Any,\r\n formik.values.Budget?.Id ?? 0,\r\n )\r\n : undefined,\r\n formik.values.BookedBy?.Id !== undefined\r\n ? new Condition(\r\n 'Id',\r\n ODataOperators.NotEquals,\r\n formik.values.BookedBy?.Id,\r\n )\r\n : undefined,\r\n ].filter(f => f !== undefined) as Condition[];\r\n}\r\n","import { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { UserTrainingReservationData } from '../slice/types';\r\nimport { translations } from 'locales/translations';\r\nimport { ActionButton } from 'app/components/BasicButtons/ActionButton';\r\nimport { DialogActionsRenderer } from 'app/components/BasicDialog/DialogActionsRender';\r\nimport { useDispatch } from 'react-redux';\r\nimport { TrainingDetailsProps } from 'app/pages/UserTrainings/TrainingDetailsPage/Details';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { ITrainingReservations } from 'app/pages/ReservationHistoryPage/ITrainingReservations';\r\nimport { ReservationsApi } from 'api/ReservationsApi';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { AxiosError } from 'axios';\r\nimport i18next from 'i18next';\r\n\r\nexport interface ApproveTrainingRecordsProps {\r\n show: boolean;\r\n data: UserTrainingReservationData;\r\n handleApproveOnce: () => void;\r\n handleEditAssisted: (p: TrainingDetailsProps, reset: boolean) => void;\r\n}\r\nexport function ApproveTrainingRecords(props: ApproveTrainingRecordsProps) {\r\n const { show, data, handleApproveOnce, handleEditAssisted } = props;\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const { actions: appSetActions } = useAppSettingsSlice();\r\n const { t } = useTranslation();\r\n const existingTrainings = React.useMemo(() => {\r\n return data.Equipments.filter(f => f.RequiresAdminApproval === true);\r\n }, [data.Equipments]);\r\n const servicesWithoutTraining = React.useMemo(() => {\r\n return data.Equipments.filter(f => f.TrainingRecordId === null);\r\n }, [data.Equipments]);\r\n\r\n //BKT-9144 Customer feedback UiO: Assisted: Toggle “DO NOT SHOW POP UP FOR APPROVING THE USER FOR GOOD/ CREATING TRAINING RECORD” to ON does not hide the pop up.\r\n //setting - DO NOT SHOW POP UP FOR APPROVING THE USER FOR GOOD/ CREATING TRAINING RECORD\r\n const showPopupAccordingToSetting = React.useMemo(() => {\r\n return !data.Equipments.every(f => f.NotShowPopup === true);\r\n }, [data.Equipments]);\r\n\r\n const showPopup = React.useMemo(() => {\r\n return (\r\n (!data.Equipments.every(f => f.NotShowPopup === true) &&\r\n existingTrainings.length > 0) ||\r\n servicesWithoutTraining.length > 0\r\n );\r\n }, [\r\n data.Equipments,\r\n existingTrainings.length,\r\n servicesWithoutTraining.length,\r\n ]);\r\n\r\n const handleEditClick = React.useCallback(() => {\r\n if (existingTrainings.length === 1) {\r\n handleEditAssisted(\r\n {\r\n id: (existingTrainings[0].TrainingRecordId ?? 0).toString(),\r\n equId: undefined,\r\n equIds: undefined,\r\n fatherId: undefined,\r\n rid: undefined,\r\n date: undefined,\r\n user: undefined,\r\n useSidePanel: true,\r\n } as TrainingDetailsProps,\r\n true,\r\n );\r\n } else {\r\n history.push(\r\n `/History?un=${data.UserName}&st=${dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(data.StartTime),\r\n )}&et=${dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(data.EndTime),\r\n )}`,\r\n );\r\n }\r\n }, [\r\n data.EndTime,\r\n data.StartTime,\r\n data.UserName,\r\n existingTrainings,\r\n handleEditAssisted,\r\n history,\r\n ]);\r\n const handleNweCreateClick = React.useCallback(() => {\r\n handleEditAssisted(\r\n {\r\n id: undefined,\r\n equId: undefined,\r\n equIds: data.Equipments.map(f => f.EquipmentId).join(','),\r\n fatherId: data.FatherId !== null ? data.FatherId.toString() : undefined,\r\n rid:\r\n data.FatherId !== null\r\n ? undefined\r\n : data.ReservationId !== null\r\n ? data.ReservationId.toString()\r\n : undefined,\r\n date: dateUtils.formatISO(dateUtils.dateOrStringToDate(data.StartTime)),\r\n user: data.UserName,\r\n useSidePanel: true,\r\n } as TrainingDetailsProps,\r\n true,\r\n );\r\n }, [\r\n handleEditAssisted,\r\n data.Equipments,\r\n data.FatherId,\r\n data.ReservationId,\r\n data.StartTime,\r\n data.UserName,\r\n ]);\r\n const handleCreateTrainings = React.useCallback(() => {\r\n const postData = servicesWithoutTraining.map(item => {\r\n return {\r\n BookedBy: data.UserName,\r\n ReservationId: data.ReservationId,\r\n EquipmentId: item.EquipmentId,\r\n StartTime: data.StartTime,\r\n TrainingLevelId: item.TrainingRecordId,\r\n };\r\n }) as ITrainingReservations[];\r\n (async () => {\r\n try {\r\n let trdata = await ReservationsApi.createTraining(postData);\r\n if (trdata.length > 0) {\r\n let success = t(translations.TrainingsCreatedSuccessfully) as string;\r\n dispatch(\r\n appSetActions.addNotification({\r\n variant: 'success',\r\n message: success.replace('{0}', trdata.length),\r\n key: 'training-created',\r\n }),\r\n );\r\n } else {\r\n let info = t(translations.TrainingsAlreadyExist) as string;\r\n dispatch(\r\n appSetActions.addNotification({\r\n variant: 'warning',\r\n message: info,\r\n key: 'training-warning',\r\n }),\r\n );\r\n }\r\n handleApproveOnce();\r\n } catch (error) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n dispatch(\r\n appSetActions.addNotification({\r\n variant: 'error',\r\n message: message,\r\n key: 'training-error',\r\n }),\r\n );\r\n }\r\n })();\r\n }, [\r\n appSetActions,\r\n data.ReservationId,\r\n data.StartTime,\r\n data.UserName,\r\n dispatch,\r\n handleApproveOnce,\r\n servicesWithoutTraining,\r\n t,\r\n ]);\r\n const actions: DialogActionsRenderer[] = React.useMemo(() => {\r\n let buttons: DialogActionsRenderer[] = [];\r\n buttons.push(() => (\r\n handleApproveOnce()}\r\n />\r\n ));\r\n if (existingTrainings.length > 0) {\r\n buttons.push(() => (\r\n handleEditClick()}\r\n />\r\n ));\r\n }\r\n buttons.push(() => (\r\n handleNweCreateClick()}\r\n />\r\n ));\r\n if (servicesWithoutTraining.length > 0) {\r\n buttons.push(() => (\r\n handleCreateTrainings()}\r\n />\r\n ));\r\n }\r\n return buttons;\r\n }, [\r\n existingTrainings,\r\n handleApproveOnce,\r\n handleCreateTrainings,\r\n handleEditClick,\r\n handleNweCreateClick,\r\n servicesWithoutTraining.length,\r\n t,\r\n ]);\r\n return (\r\n 0\r\n ? t(translations.This_user_already_has_a_valid_training)\r\n : t(translations.CreateNewTrainingRecord_YesNo)\r\n }\r\n maxWidth=\"md\"\r\n actions={actions}\r\n />\r\n );\r\n}\r\n","import { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { translations } from 'locales/translations';\r\nimport { FormFieldsSection, FormRow } from 'app/components/Forms/FormsLayout';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport {\r\n ServicesFilter,\r\n UserPicker,\r\n} from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { Caption } from 'app/components/Typography';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { quoteODataValue } from 'api/odata/ODataFilter';\r\n\r\nexport interface TransferReservationProps {\r\n show: boolean;\r\n handleTransfer: (value: IUserFilterDto) => void;\r\n transferAllowedToGroup: boolean;\r\n services: IServiceTypeFilterDto[];\r\n adGroup?: string;\r\n budgetExpirementModuleEnabled?: boolean;\r\n trnsferSubmitted?: boolean;\r\n onClose: () => void;\r\n user?: AuthenticatedUser;\r\n}\r\n\r\nexport function TransferReservation(props: TransferReservationProps) {\r\n const {\r\n show,\r\n handleTransfer,\r\n transferAllowedToGroup,\r\n services,\r\n adGroup,\r\n budgetExpirementModuleEnabled,\r\n trnsferSubmitted,\r\n user,\r\n onClose,\r\n } = props;\r\n const { t } = useTranslation();\r\n const [\r\n trasferToUser,\r\n setTranferToUser,\r\n ] = React.useState(null);\r\n\r\n return (\r\n \r\n \r\n {t(translations.TransferReservation_info) as string}\r\n \r\n }\r\n >\r\n \r\n setTranferToUser(value)}\r\n value={trasferToUser}\r\n error={trasferToUser === null || trasferToUser === undefined}\r\n helperText={\r\n trasferToUser === null || trasferToUser === undefined\r\n ? (t(translations.err_UserFieldRequired) as string)\r\n : undefined\r\n }\r\n fullWidth\r\n selectArray={['Id', 'Name', 'UserGroups']}\r\n />\r\n \r\n \r\n \r\n }\r\n onConfirm={ev => {\r\n if (trasferToUser !== null) {\r\n handleTransfer(trasferToUser);\r\n }\r\n }}\r\n onCancel={() => onClose()}\r\n onClose={() => onClose()}\r\n maxWidth=\"sm\"\r\n />\r\n );\r\n}\r\n","import { IModificationsDto } from 'api/odata/generated/entities/IModificationsDto';\r\nimport { filterHandler } from 'app/components/BasicTable/UnconfigurableTable/FilterHandler';\r\nimport { UnconfigurableTable } from 'app/components/BasicTable/UnconfigurableTable/UnconfigurableTable';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { getColumns } from './Columns';\r\nimport { GetFilters } from './Filter';\r\n\r\nexport interface ReservationModificationsProps {\r\n resId: number;\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n}\r\nexport const ReservationModifications = ({\r\n resId,\r\n open,\r\n setOpen,\r\n}: ReservationModificationsProps) => {\r\n const { t } = useTranslation();\r\n const columns = useMemo(() => getColumns(t), [t]);\r\n const url = `/api/odata/v4/ModificationHistory/Reservations`;\r\n return (\r\n \r\n \r\n \r\n }\r\n onCancel={() => setOpen(false)}\r\n maxWidth=\"md\"\r\n />\r\n );\r\n};\r\n\r\nconst TTable = filterHandler(\r\n UnconfigurableTable,\r\n GetFilters,\r\n {\r\n isSidePanel: true,\r\n },\r\n);\r\n","import { IModificationsDto } from 'api/odata/generated/entities/IModificationsDto';\r\nimport DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\n\r\nexport const getColumns = (t: TFunction) => {\r\n const res: Column[] = [\r\n // {\r\n // accessor: 'Id',\r\n // Header: t(translations.HashSymbol) as string,\r\n // },\r\n {\r\n accessor: 'Field',\r\n Header: t(translations.Field) as string,\r\n },\r\n {\r\n accessor: 'OldValue',\r\n Header: t(translations.OldValue) as string,\r\n },\r\n {\r\n accessor: 'NewValue',\r\n Header: t(translations.NewValue) as string,\r\n },\r\n {\r\n accessor: 'UserDisplayName',\r\n Header: t(translations.User) as string,\r\n },\r\n {\r\n accessor: 'Date',\r\n Header: t(translations.Date) as string,\r\n Cell: DateRenderer,\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { IModificationsDto } from 'api/odata/generated/entities/IModificationsDto';\r\nimport { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport DatesRangeFilter from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport {\r\n getDefaultFilterDatePeriod,\r\n presetDatesRangeToQueryString,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { translations } from 'locales/translations';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParams(search);\r\n const res: IFilterSettings[] = [\r\n {\r\n fieldName: 'Date',\r\n displayName: t(translations.Period),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'st', 'et', params),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'period',\r\n 'st',\r\n 'et',\r\n ),\r\n component: DatesRangeFilter,\r\n urlKey: 'period',\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { LinearProgress, useTheme } from '@material-ui/core';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { Body, ButtonLabel } from 'app/components/Typography';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { PricingState } from '../../slice/types';\r\n\r\nexport interface CalculatePricingProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title: React.ReactNode;\r\n edit: boolean;\r\n credit?: PricingState;\r\n creditProcessing?: boolean;\r\n creditCompleted?: boolean;\r\n}\r\nconst CreditContainer = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n paddingTop: '16px',\r\n gap: 32,\r\n width: '100%',\r\n '& .creditItem': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n gap: 16,\r\n width: '100%',\r\n },\r\n}));\r\nexport function CalculatePricing(props: CalculatePricingProps) {\r\n const {\r\n open,\r\n onClose,\r\n credit,\r\n creditProcessing,\r\n title,\r\n creditCompleted,\r\n edit,\r\n } = props;\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n return (\r\n onClose()}\r\n body={\r\n creditProcessing && !creditCompleted ? (\r\n
    \r\n \r\n
    \r\n ) : (\r\n \r\n
    \r\n \r\n {t(translations.Pricing_EstimatedCost)}\r\n \r\n \r\n {(t(\r\n edit\r\n ? translations.PricingConfirmationLabelEditText1\r\n : translations.PricingConfirmationLabelText1,\r\n ) as string).replace('{0}', (credit?.credit || 0).toFixed(2))}\r\n \r\n
    \r\n {!!credit?.balance && credit?.balance !== null && (\r\n
    \r\n \r\n {t(translations.Pricing_Balance)}\r\n \r\n \r\n {(t(translations.Pricing_BalanceResult) as string).replace(\r\n '{0}',\r\n (credit?.balance || 0).toFixed(2),\r\n )}\r\n \r\n
    \r\n )}\r\n
    \r\n )\r\n }\r\n maxWidth={'sm'}\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * ReservationDetails\r\n *\r\n */\r\nimport React from 'react';\r\nimport { Box } from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n getSingleReservationStatus,\r\n IReservationEquipmentDto,\r\n RecurringReservationUpdateOptions,\r\n ReservationDetailsState,\r\n ReservationGlobalState,\r\n ReservationQueryStringParameters,\r\n ReservationStatus,\r\n TransferToReservation,\r\n} from './slice/types';\r\nimport { useReservationSlice } from './slice';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport {\r\n selectAsyncChangeLoading,\r\n selectByApprovalErrors,\r\n selectCloneReservations,\r\n selectConfirmAssistedReservations,\r\n selectCredit,\r\n selectCreditCompleted,\r\n selectCreditProcessing,\r\n selectEquipmentChangeCompleted,\r\n selectEquipmentsSettings,\r\n selectIsCreditSubmited,\r\n selectIsEdit,\r\n selectProcessing,\r\n selectReservation,\r\n selectReservationCompleted,\r\n selectReservationHasError,\r\n selectReservationProcessing,\r\n selectReservationSettings,\r\n selectSavedOfflineServices,\r\n selectTransferProcessing,\r\n selectTransferReservation,\r\n selectTransferStepCompleted,\r\n selectTransferToUser,\r\n selectTransferWaitingApproval,\r\n selectUserTrainingData,\r\n} from './slice/selectors';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { push } from 'connected-react-router';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { ReservationForm } from './ReservationForm';\r\nimport { selectRepetitiveData } from 'app/components/Forms/FormRepetitive/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport useGlobalSettingsHook from './components/useGlobalSettingsHook';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { ActionButton } from 'app/components/BasicButtons/ActionButton';\r\nimport {\r\n ApproveReservationButton,\r\n CancelReservationButton,\r\n CreateTrainingButton,\r\n SaveForLaterButton,\r\n SaveFormButton,\r\n TransferButton,\r\n} from './components/ReservationActions';\r\nimport { ApproveTrainingRecords } from './components/ApproveTrainingRecords';\r\nimport { TrainingDetailsProps } from 'app/pages/UserTrainings/TrainingDetailsPage/Details';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { WorkOrderDetailsProps } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { WorkOrderQueryStringParameters } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/types';\r\nimport { FormikProps } from 'formik';\r\nimport { TransferReservation } from './components/TransferReservation';\r\nimport { ReservationModifications } from './components/Modifications';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { FlexRowDiv } from 'app/components/basic/Wrappers/FlexWrappers/flexRow';\r\nimport { Body, H3 } from 'app/components/Typography';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport {\r\n SwitchActionsProps,\r\n SwitchTarget,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/SwitchActions';\r\nimport { Entity } from 'types/common';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { ErrorServices } from 'app/pages/OtherServiceDetails/Details/slice/types';\r\nimport { CalculatePricing } from './components/CalculatePricing';\r\nimport { Alert } from '@material-ui/lab';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { LinkBehavior } from 'app/components/ExternalLink';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport { toLocationDescriptor } from 'app/components/BasicLinks/Link';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface ReservationDetailsProps\r\n extends SidePanelContentProps,\r\n CoverProps {\r\n queryParams: ReservationQueryStringParameters;\r\n useSwitchButtons?: boolean;\r\n}\r\n\r\nexport const ReservationDetails = React.memo(function ReservationDetails(\r\n props: ReservationDetailsProps,\r\n) {\r\n const {\r\n queryParams,\r\n useSidePanel,\r\n useSwitchButtons,\r\n closeCover,\r\n isCover,\r\n } = props;\r\n\r\n const dispatch = useDispatch();\r\n const { t } = useTranslation();\r\n const { actions } = useReservationSlice();\r\n\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n const isMobile = DetectIsMobile();\r\n\r\n /// Refs ///\r\n const submitFormRef = React.useRef(null);\r\n const repetitiveFormRef = React.useRef(null);\r\n const customFormRef = React.useRef(null);\r\n const innerFormRef = React.useRef | null>(null);\r\n\r\n /// selectors ///\r\n const processing = useSelector(selectProcessing);\r\n const reservation = useSelector(selectReservation);\r\n const reservationId = reservation.data?.Id ?? tryParseInt(queryParams.id);\r\n const reservationSettings = useSelector(selectReservationSettings);\r\n const equipmentSettings = useSelector(selectEquipmentsSettings);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const repetitiveValues = useSelector(selectRepetitiveData);\r\n const actionCompleted = useSelector(selectReservationCompleted);\r\n const hasError = useSelector(selectReservationHasError);\r\n const reservationProcessing = useSelector(selectReservationProcessing);\r\n const confirmAssisted = useSelector(selectConfirmAssistedReservations);\r\n const assistedTrainingData = useSelector(selectUserTrainingData);\r\n const equipmentChangeCompleted = useSelector(selectEquipmentChangeCompleted);\r\n const transferProcessing = useSelector(selectTransferProcessing);\r\n const transferStepWaiting = useSelector(selectTransferWaitingApproval);\r\n const transferUser = useSelector(selectTransferToUser);\r\n const transferredForId = useSelector(selectTransferReservation);\r\n const transferStepCompleted = useSelector(selectTransferStepCompleted);\r\n const savedOfflineServices = useSelector(selectSavedOfflineServices);\r\n const creditProcessing = useSelector(selectCreditProcessing);\r\n const credit = useSelector(selectCredit);\r\n const creditCompleted = useSelector(selectCreditCompleted);\r\n const isCloned = useSelector(selectCloneReservations);\r\n const edit = useSelector(selectIsEdit);\r\n const asyncChangeLoading = useSelector(selectAsyncChangeLoading);\r\n const isCreditSubmited = useSelector(selectIsCreditSubmited);\r\n const ByApprovalErrors = useSelector(selectByApprovalErrors);\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const showShortView = React.useMemo(() => {\r\n return isMobile || (useSidePanel && !sidePanelExpanded);\r\n }, [isMobile, sidePanelExpanded, useSidePanel]);\r\n\r\n //cover\r\n // const [cover, setCover] = React.useState();\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState(\r\n () => {\r\n if (confirmBeforeTransfer) {\r\n setShowTransfer(true);\r\n return false;\r\n } else {\r\n dispatch(actions.resetDetailsState());\r\n return true;\r\n }\r\n },\r\n () => {\r\n if (confirmBeforeTransfer) {\r\n setConfirmBeforeTransfer(false);\r\n }\r\n },\r\n useSidePanel,\r\n isCover,\r\n );\r\n /// Settings ///\r\n const globalSettings = useGlobalSettingsHook();\r\n /// Local State ///\r\n const [busy, setBusy] = React.useState(false);\r\n //const [edit, setEdit] = React.useState(false);\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [showConfirmRecurring, setShowConfirmRecurring] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [showConfirmAssisted, setShowConfirmAssisted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [confirmBeforeTransfer, setConfirmBeforeTransfer] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [showTransfer, setShowTransfer] = React.useState(\r\n undefined,\r\n );\r\n const [showCalculateCredit, setShowCalculateCredit] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [confirmCloned, setConfirmCloned] = React.useState(\r\n undefined,\r\n );\r\n const [canceled, setCanceled] = React.useState(\r\n undefined,\r\n );\r\n const [openModifications, setOpenModifications] = React.useState(\r\n false,\r\n );\r\n const { newDate } = useSystemDate();\r\n /// Memo State ///\r\n const repeat = React.useMemo(() => {\r\n return edit && reservationSettings?.Repeat;\r\n }, [edit, reservationSettings]);\r\n\r\n const IsAdmin = React.useMemo(() => {\r\n return (\r\n equipmentSettings?.IsAllAdmin ||\r\n User?.IsAllGroupOrLabTechAdmin(\r\n reservation?.data?.EquipmentsData.map(\r\n g => (g as IReservationEquipmentDto).ServiceGroupId,\r\n ),\r\n reservation?.data?.EquipmentsData.map(f => {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n ServiceTypeId: ServiceType.Online,\r\n } as IServiceTypeFilterDto;\r\n }),\r\n ) ||\r\n false\r\n );\r\n }, [equipmentSettings?.IsAllAdmin, User, reservation?.data?.EquipmentsData]);\r\n const isOwner = React.useMemo(() => {\r\n return reservation?.data?.BookedBy?.Id === User?.Id;\r\n }, [User?.Id, reservation?.data?.BookedBy]);\r\n const isUserGroupCoordinator = React.useMemo(() => {\r\n return (\r\n User &&\r\n User.Roles.includes(Roles.UserGroupCoord) &&\r\n (edit\r\n ? reservation?.data?.ADGroup?.Id === User.ActiveUserGroup?.Id\r\n : true)\r\n );\r\n }, [User, edit, reservation?.data?.ADGroup?.Id]);\r\n const trainingSessionEnabled = React.useMemo(() => {\r\n return (\r\n globalSettings.trainingSessionEnabled &&\r\n !equipmentSettings?.HideTrainingSession\r\n );\r\n }, [\r\n equipmentSettings?.HideTrainingSession,\r\n globalSettings.trainingSessionEnabled,\r\n ]);\r\n const trainingSignUp = React.useMemo(() => {\r\n return (\r\n trainingSessionEnabled &&\r\n (reservation?.data?.TrainingSignUp ||\r\n innerFormRef.current?.values.TrainingSignUp)\r\n //&&\r\n // innerFormRef.current?.values.EquipmentsData.length === 1\r\n );\r\n }, [reservation?.data?.TrainingSignUp, trainingSessionEnabled]);\r\n const allowOngoingModifications = React.useMemo(() => {\r\n return (\r\n isOwner &&\r\n reservationSettings?.Ongoing &&\r\n equipmentSettings?.AllowModification\r\n );\r\n }, [\r\n equipmentSettings?.AllowModification,\r\n isOwner,\r\n reservationSettings?.Ongoing,\r\n ]);\r\n const editable = React.useMemo(() => {\r\n return (\r\n IsAdmin ||\r\n isUserGroupCoordinator ||\r\n (isOwner && reservationSettings?.FutureReservation) ||\r\n (reservationSettings?.Ongoing && allowOngoingModifications)\r\n );\r\n }, [\r\n allowOngoingModifications,\r\n IsAdmin,\r\n isUserGroupCoordinator,\r\n reservationSettings?.FutureReservation,\r\n reservationSettings?.Ongoing,\r\n isOwner,\r\n ]);\r\n const terminationEnabled = React.useMemo(() => {\r\n return (\r\n globalSettings.reservationTerminationEnabled &&\r\n reservationSettings?.Ongoing &&\r\n reservation?.data?.Status?.Id !== ReservationStatus.Cancelled &&\r\n reservation?.data?.Status?.Id !== ReservationStatus.CancelledByAdmin &&\r\n equipmentSettings?.AllowUsersToShortenReservations &&\r\n (IsAdmin || isOwner)\r\n );\r\n }, [\r\n IsAdmin,\r\n equipmentSettings?.AllowUsersToShortenReservations,\r\n globalSettings.reservationTerminationEnabled,\r\n isOwner,\r\n reservation?.data?.Status?.Id,\r\n reservationSettings?.Ongoing,\r\n ]);\r\n const allowSortenReservation = React.useMemo(() => {\r\n return globalSettings.reservationTerminationEnabled\r\n ? false\r\n : equipmentSettings?.AllowUsersToShortenReservations;\r\n }, [\r\n equipmentSettings?.AllowUsersToShortenReservations,\r\n globalSettings.reservationTerminationEnabled,\r\n ]);\r\n const timeEnabledForOwner = React.useMemo(() => {\r\n return (\r\n reservationSettings?.FutureReservation ||\r\n (reservationSettings?.Ongoing &&\r\n (allowSortenReservation ||\r\n equipmentSettings?.AllowModification ||\r\n equipmentSettings?.AllowExtendReservation))\r\n );\r\n }, [\r\n equipmentSettings?.AllowExtendReservation,\r\n equipmentSettings?.AllowModification,\r\n reservationSettings?.FutureReservation,\r\n reservationSettings?.Ongoing,\r\n allowSortenReservation,\r\n ]);\r\n const timeEnabled = React.useMemo(() => {\r\n return (\r\n (IsAdmin || isUserGroupCoordinator || (isOwner && timeEnabledForOwner)) &&\r\n !reservationSettings?.TerminateReservation\r\n );\r\n }, [\r\n IsAdmin,\r\n isOwner,\r\n isUserGroupCoordinator,\r\n reservationSettings?.TerminateReservation,\r\n timeEnabledForOwner,\r\n ]);\r\n const canBeCanceled = React.useMemo(() => {\r\n return (\r\n edit &&\r\n editable &&\r\n reservation?.data?.Status?.Id !== ReservationStatus.Cancelled &&\r\n reservation?.data?.Status?.Id !== ReservationStatus.CancelledByAdmin\r\n );\r\n }, [edit, editable, reservation?.data?.Status?.Id]);\r\n const canBeApproved = React.useMemo(() => {\r\n return (\r\n edit &&\r\n editable &&\r\n ((reservation?.data?.Status?.Id === ReservationStatus.Pending &&\r\n IsAdmin) ||\r\n (reservation?.data?.Status?.Id === ReservationStatus.PendingCoord &&\r\n isUserGroupCoordinator))\r\n );\r\n }, [\r\n IsAdmin,\r\n edit,\r\n editable,\r\n isUserGroupCoordinator,\r\n reservation?.data?.Status?.Id,\r\n ]);\r\n const canSaveForLater = React.useMemo(() => {\r\n return (\r\n globalSettings.draftReservationsEnabled &&\r\n equipmentSettings?.DraftSaveForLater &&\r\n (IsAdmin || isOwner) &&\r\n reservation?.data?.Status?.Id !== ReservationStatus.Cancelled &&\r\n reservation?.data?.Status?.Id !== ReservationStatus.CancelledByAdmin\r\n );\r\n }, [\r\n IsAdmin,\r\n equipmentSettings?.DraftSaveForLater,\r\n globalSettings.draftReservationsEnabled,\r\n isOwner,\r\n reservation?.data?.Status?.Id,\r\n ]);\r\n const reservationCanceled = React.useMemo(() => {\r\n return (\r\n (edit && reservation?.data?.Status?.Id === ReservationStatus.Cancelled) ||\r\n reservation?.data?.Status?.Id === ReservationStatus.CancelledByAdmin\r\n );\r\n }, [edit, reservation?.data?.Status?.Id]);\r\n const calculateButtonVisible = React.useMemo(() => {\r\n return globalSettings.showCalculatePrice &&\r\n globalSettings.budgetModuleEnabled\r\n ? equipmentSettings?.BudgetsTurnedOn\r\n : true;\r\n }, [\r\n equipmentSettings?.BudgetsTurnedOn,\r\n globalSettings.budgetModuleEnabled,\r\n globalSettings.showCalculatePrice,\r\n ]);\r\n const not_restricted = React.useMemo(() => {\r\n if (edit) {\r\n let budget =\r\n reservation?.data?.Budget !== null &&\r\n reservation?.data?.Budget !== undefined\r\n ? reservation.data.Budget\r\n : null;\r\n let noInstumentRestricted = globalSettings.reservationRestricted\r\n ? IsAdmin || isUserGroupCoordinator || isOwner\r\n : globalSettings.userGroupReservationRestricted\r\n ? reservation?.data?.ADGroup?.Id === User?.ActiveUserGroup?.Id ||\r\n IsAdmin ||\r\n isUserGroupCoordinator ||\r\n isOwner\r\n : true;\r\n let confidential =\r\n ((!!reservation?.data?.BudgetExperiment &&\r\n reservation?.data?.BudgetExperiment !== null) ||\r\n globalSettings.confidentialBudgetsEnabled) &&\r\n !!reservation?.data?.Budget &&\r\n (budget === null\r\n ? false\r\n : (budget as IBudgetFilterDto).Confidential ?? false);\r\n let noBudgetRestricted = confidential ? IsAdmin || isOwner : true;\r\n\r\n return noInstumentRestricted && noBudgetRestricted;\r\n }\r\n\r\n return true;\r\n }, [\r\n IsAdmin,\r\n User?.ActiveUserGroup?.Id,\r\n edit,\r\n globalSettings.confidentialBudgetsEnabled,\r\n globalSettings.reservationRestricted,\r\n globalSettings.userGroupReservationRestricted,\r\n isOwner,\r\n isUserGroupCoordinator,\r\n reservation?.data?.ADGroup?.Id,\r\n reservation?.data?.Budget,\r\n reservation?.data?.BudgetExperiment,\r\n ]);\r\n /// get initial state of the equipmentSettings\r\n // const equipmentSettings = React.useMemo(() => {\r\n // if (!!reservation.data) {\r\n // let sett = mapSettingsFromServices(\r\n // reservation.data.EquipmentsData as IReservationEquipmentDto[],\r\n // {} as ServiceSettingsState,\r\n // globalSettings,\r\n // );\r\n // return Object.assign(sett, {\r\n // CustomForms: reservationSettings?.CustomForms,\r\n // });\r\n // } else {\r\n // return {} as ServiceSettingsState;\r\n // }\r\n // }, [globalSettings, reservation.data, reservationSettings?.CustomForms]);\r\n /// mount effect - init ///\r\n // useEffectOnMount(() => {\r\n // setRequestCompleted(undefined);\r\n // dispatch(\r\n // actions.initReservation({\r\n // query: queryParams,\r\n // globalSettings: globalSettings,\r\n // }),\r\n // );\r\n // return () => {};\r\n // });\r\n const workOrderSwithProps = React.useMemo(() => {\r\n if (!edit) {\r\n let eqids = queryParams.selectedIds;\r\n let start = queryParams.Start;\r\n let end = queryParams.singleClick ? undefined : queryParams.End;\r\n let defaultMulti = globalSettings.multipleInstrumentsEnabled;\r\n if (reservation && reservation.data) {\r\n start = dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(reservation.data.StartTime),\r\n );\r\n end = queryParams.singleClick\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(reservation.data.EndTime),\r\n );\r\n defaultMulti =\r\n globalSettings.multipleInstrumentsEnabled &&\r\n reservation.data.EquipmentsData.length > 0;\r\n eqids = reservation.data.EquipmentsData.map(f => f.Id).join(',');\r\n }\r\n\r\n let p = {\r\n queryParams: {\r\n eqid: eqids,\r\n down: 'true',\r\n offH: 'true',\r\n eStart: start,\r\n offStart: start,\r\n offEnd: end,\r\n defaultMulti: defaultMulti.toString(),\r\n source: queryParams.source,\r\n id: undefined,\r\n aType: undefined,\r\n title: undefined,\r\n sympt: undefined,\r\n aStatus: undefined,\r\n aStart: undefined,\r\n desc: undefined,\r\n assetId: undefined,\r\n reason: undefined,\r\n sid: undefined,\r\n } as WorkOrderQueryStringParameters,\r\n useSidePanel: true,\r\n useSwithButtons: useSwitchButtons,\r\n } as WorkOrderDetailsProps;\r\n return p;\r\n }\r\n return undefined;\r\n }, [\r\n edit,\r\n globalSettings.multipleInstrumentsEnabled,\r\n queryParams.End,\r\n queryParams.Start,\r\n queryParams.selectedIds,\r\n queryParams.singleClick,\r\n queryParams.source,\r\n reservation,\r\n useSwitchButtons,\r\n ]);\r\n const allowEditMultipleEquipments = React.useMemo(() => {\r\n return (\r\n globalSettings.multipleInstrumentsEnabled &&\r\n !trainingSignUp &&\r\n globalSettings.allowAddRemoveOnEditReservation\r\n );\r\n }, [\r\n globalSettings.allowAddRemoveOnEditReservation,\r\n globalSettings.multipleInstrumentsEnabled,\r\n trainingSignUp,\r\n ]);\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n // if (!reservation || !reservation.data) {\r\n\r\n // }\r\n if (globalSettings.loadCompleted && active) {\r\n setFirstLoad(false);\r\n dispatch(\r\n actions.initReservation({\r\n query: queryParams,\r\n globalSettings: globalSettings,\r\n }),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [actions, dispatch, firstLoad, globalSettings, queryParams, reservation]);\r\n React.useEffect(() => {\r\n if (edit) {\r\n if (\r\n savedOfflineServices.length > 0 &&\r\n savedOfflineServices.some(f => f.Id < 1)\r\n ) {\r\n dispatch(layoutActions.setNotSavedChanges(true));\r\n }\r\n }\r\n }, [dispatch, edit, layoutActions, savedOfflineServices]);\r\n /// functions, callbacks ///\r\n // const closeCover = () => {\r\n // setCover(undefined);\r\n // };\r\n // const handleClose = () => {\r\n // if (hasChanges) {\r\n // dispatch(layoutActions.setConfirmOpen(true));\r\n // } else {\r\n // handleCloselClick();\r\n // }\r\n // };\r\n const handleCloselClick = React.useCallback(() => {\r\n if (useSidePanel) {\r\n closePanel({\r\n isCover: isCover || !!cover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: hasChanges,\r\n onClose: () => {\r\n dispatch(actions.resetDetailsState());\r\n },\r\n } as SidePanelCloseState);\r\n } else {\r\n dispatch(push('/reservations'));\r\n }\r\n }, [actions, closePanel, cover, dispatch, hasChanges, isCover, useSidePanel]);\r\n\r\n const handleSaveClick = React.useCallback(\r\n (e: any) => {\r\n if (repeat) {\r\n setShowConfirmRecurring(true);\r\n } else {\r\n handleSubmitForm(e);\r\n }\r\n },\r\n [repeat],\r\n );\r\n\r\n const cancelReservation = React.useCallback(() => {\r\n let status = getSingleReservationStatus(\r\n ReservationStatus.Cancelled as number,\r\n );\r\n dispatch(actions.setAnyValue({ fieldKey: 'Status', fieldValue: status }));\r\n setCanceled(true);\r\n }, [actions, dispatch]);\r\n const approveReservation = React.useCallback(() => {\r\n let status = getSingleReservationStatus(\r\n ReservationStatus.Approved as number,\r\n );\r\n dispatch(actions.setAnyValue({ fieldKey: 'Status', fieldValue: status }));\r\n }, [actions, dispatch]);\r\n const draftReservation = React.useCallback(() => {\r\n let status = getSingleReservationStatus(ReservationStatus.Draft as number);\r\n dispatch(actions.extendReservationSettings({ SaveForLater: true }));\r\n dispatch(actions.setAnyValue({ fieldKey: 'Status', fieldValue: status }));\r\n }, [actions, dispatch]);\r\n const handleChangeStatus = React.useCallback(\r\n (event: any, status: ReservationStatus) => {\r\n if (status === ReservationStatus.Cancelled) {\r\n cancelReservation();\r\n } else if (status === ReservationStatus.Approved) {\r\n approveReservation();\r\n } else if (status === ReservationStatus.Draft) {\r\n draftReservation();\r\n }\r\n setTimeout(() => handleSaveClick(event), 10);\r\n },\r\n [approveReservation, cancelReservation, draftReservation, handleSaveClick],\r\n );\r\n const handleSubmitForm = (e: any) => {\r\n if (customFormRef.current) {\r\n customFormRef.current(e);\r\n setTimeout(() => {\r\n if (repetitiveFormRef.current) {\r\n repetitiveFormRef.current(e);\r\n }\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n }, 50);\r\n } else {\r\n if (repetitiveFormRef.current) {\r\n repetitiveFormRef.current(e);\r\n }\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (\r\n values: ReservationDetailsState,\r\n customFormFiles: IFormFileValue[],\r\n originalFormFiles: IFormFileValue[],\r\n ) => {\r\n setBusy(true);\r\n if (isCreditSubmited) {\r\n setShowCalculateCredit(true);\r\n let value = {\r\n details: values,\r\n settings: reservationSettings,\r\n customFormFiles: [],\r\n RepetitiveOptions: repetitiveValues,\r\n offlineServices: savedOfflineServices,\r\n } as ReservationGlobalState;\r\n dispatch(\r\n actions.createReservation({\r\n state: value,\r\n calcCredit: true,\r\n }),\r\n );\r\n } else {\r\n if (edit) {\r\n dispatch(\r\n actions.updateReservation({\r\n current: values,\r\n original: reservation.data || values,\r\n currentCustomFormFiles: customFormFiles,\r\n originalCustomFormFiles: originalFormFiles,\r\n offlineServices: savedOfflineServices,\r\n settings: reservationSettings,\r\n }),\r\n );\r\n } else {\r\n let value = {\r\n details: {\r\n ...values,\r\n SampleRunId: reservation.data?.SampleRunId,\r\n },\r\n settings: reservationSettings,\r\n customFormFiles: customFormFiles,\r\n RepetitiveOptions: repetitiveValues,\r\n offlineServices: savedOfflineServices,\r\n } as ReservationGlobalState;\r\n //console.log('data', value);\r\n dispatch(\r\n actions.createReservation({\r\n state: value,\r\n calcCredit: undefined,\r\n }),\r\n );\r\n }\r\n }\r\n },\r\n [\r\n actions,\r\n dispatch,\r\n edit,\r\n isCreditSubmited,\r\n repetitiveValues,\r\n reservation.data,\r\n reservationSettings,\r\n savedOfflineServices,\r\n ],\r\n );\r\n const [offlineServicesErrors, setOfflineServicesErrors] = React.useState<\r\n ErrorServices[]\r\n >([]);\r\n const handleSetError = React.useCallback(\r\n (error: ErrorServices) => {\r\n if (error.error !== undefined) {\r\n setOfflineServicesErrors([\r\n ...offlineServicesErrors.filter(f => f.id !== error.id),\r\n error,\r\n ]);\r\n } else {\r\n setOfflineServicesErrors([\r\n ...offlineServicesErrors.filter(f => f.id !== error.id),\r\n ]);\r\n }\r\n },\r\n [offlineServicesErrors],\r\n );\r\n const handleTerminate = React.useCallback(() => {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'EndTime',\r\n fieldValue: dateUtils.formatISO(newDate()),\r\n }),\r\n );\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'Remarks',\r\n fieldValue: t(translations.AutoEndReservation_remarks) as string,\r\n }),\r\n );\r\n setTimeout(() => {\r\n dispatch(\r\n actions.updateReservation({\r\n current:\r\n innerFormRef?.current?.values ||\r\n reservation.data ||\r\n ({} as ReservationDetailsState),\r\n original: reservation.data || ({} as ReservationDetailsState),\r\n currentCustomFormFiles: [],\r\n originalCustomFormFiles: [],\r\n offlineServices: savedOfflineServices,\r\n settings: reservationSettings,\r\n terminate: true,\r\n }),\r\n );\r\n }, 10);\r\n }, [\r\n actions,\r\n dispatch,\r\n newDate,\r\n reservation.data,\r\n reservationSettings,\r\n savedOfflineServices,\r\n t,\r\n ]);\r\n //------ Confirm Repetitive Update/Delete handlers -------//\r\n const handleUpdateAllRecurrent = (e: any) => {\r\n dispatch(\r\n actions.updateReservationSettings({\r\n RecurringUpdateOption: RecurringReservationUpdateOptions.All,\r\n }),\r\n );\r\n handleSubmitForm(e);\r\n setShowConfirmRecurring(false);\r\n setCanceled(undefined);\r\n };\r\n const handleUpdateFollowing = (e: any) => {\r\n dispatch(\r\n actions.updateReservationSettings({\r\n RecurringUpdateOption: RecurringReservationUpdateOptions.Following,\r\n }),\r\n );\r\n handleSubmitForm(e);\r\n setShowConfirmRecurring(false);\r\n setCanceled(undefined);\r\n };\r\n const handleUpdateJustOne = (e: any) => {\r\n dispatch(\r\n actions.updateReservationSettings({\r\n RecurringUpdateOption:\r\n RecurringReservationUpdateOptions.CurrentReservation,\r\n }),\r\n );\r\n handleSubmitForm(e);\r\n setShowConfirmRecurring(false);\r\n setCanceled(undefined);\r\n };\r\n const assistedApproveOnse = () => {\r\n setShowConfirmAssisted(false);\r\n dispatch(actions.resetAssisteTrainingData());\r\n dispatch(layoutActions.setRefreshTable(true));\r\n if (!isCloned) {\r\n handleCloselClick();\r\n }\r\n };\r\n const handleByApprovalConfirm = React.useCallback(\r\n (e: any) => {\r\n dispatch(\r\n actions.updateReservationSettings({\r\n UserRequestedByApproval: true,\r\n }),\r\n );\r\n dispatch(actions.setByApprovalErrors());\r\n handleSubmitForm(e);\r\n },\r\n [actions, dispatch],\r\n );\r\n const editAssisted = React.useCallback(\r\n (p: TrainingDetailsProps, reset: boolean) => {\r\n openPanel({\r\n renderPageType: RenderPageType.TrainingDetails,\r\n renderPageProps: {\r\n ...p,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n onClose: () => {\r\n if (reset) {\r\n dispatch(actions.resetAssisteTrainingData());\r\n }\r\n dispatch(layoutActions.setRefreshTable(true));\r\n },\r\n } as TrainingDetailsProps,\r\n });\r\n // setCover(\r\n // {\r\n // closeCover();\r\n // if (reset) {\r\n // dispatch(actions.resetAssisteTrainingData());\r\n // }\r\n\r\n // dispatch(layoutActions.setRefreshTable(true));\r\n // }}\r\n // onClose={() => {\r\n // closeCover();\r\n // if (reset) {\r\n // dispatch(actions.resetAssisteTrainingData());\r\n // }\r\n\r\n // dispatch(layoutActions.setRefreshTable(true));\r\n // }}\r\n // />,\r\n // );\r\n setShowConfirmAssisted(false);\r\n },\r\n [actions, dispatch, useSidePanel, layoutActions, openPanel],\r\n );\r\n const handleCancelTransfer = () => {\r\n if (transferUser !== null) {\r\n dispatch(\r\n actions.cancelTransfer({\r\n User: transferUser,\r\n ReservtionId: transferredForId || reservation?.data?.Id || 0,\r\n }),\r\n );\r\n }\r\n };\r\n const handleEquipmentClick = React.useCallback(\r\n (equipment: Entity) => {\r\n let assetProps = {\r\n serviceId: equipment.Id,\r\n useSidePanel: true,\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.AssetDetails,\r\n renderPageProps: assetProps,\r\n expanded: false,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n // useSidePanel\r\n // ? setCover(\r\n // ,\r\n // )\r\n // : dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.AssetDetails,\r\n // props: {\r\n // Id: undefined,\r\n // serviceId: equipment.Id,\r\n // useSidePanel: true,\r\n // },\r\n // expanded: false,\r\n // }),\r\n // );\r\n },\r\n [openPanel, useSidePanel],\r\n );\r\n const handleRestrictionsClick = React.useCallback(\r\n (equipment: Entity) => {\r\n let restrictProps = {\r\n serviceId: equipment.Id,\r\n showTable: IsAdmin,\r\n serviceGroupId: (equipment as IReservationEquipmentDto).ServiceGroupId,\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.RestrictionDetails,\r\n renderPageProps: restrictProps,\r\n expanded: false,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n // useSidePanel\r\n // ? setCover(\r\n // ,\r\n // )\r\n // : dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.RestrictionDetails,\r\n // props: {\r\n // serviceId: equipment.Id,\r\n // showTable: IsAdmin,\r\n // useSidePanel: useSidePanel,\r\n // isCover: false,\r\n // serviceGroupId: (equipment as IReservationEquipmentDto)\r\n // .ServiceGroupId,\r\n // },\r\n // expanded: false,\r\n // }),\r\n // );\r\n },\r\n [IsAdmin, useSidePanel, openPanel],\r\n );\r\n const handleOfflineServiceClick = React.useCallback(\r\n (service: IOtherServices) => {\r\n if (edit) {\r\n let otherProps = {\r\n initialService: service,\r\n saveCreatable: true,\r\n queryParams: {\r\n id: '' + service.Id ?? -1,\r\n },\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.OtherServiceDetails,\r\n renderPageProps: otherProps,\r\n expanded: false,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n // useSidePanel\r\n // ? setCover(\r\n // {\r\n // closeCover();\r\n // // dispatch(actions.setRefreshOfflineServices(true));\r\n // }}\r\n // onClose={() => {\r\n // closeCover();\r\n // // dispatch(actions.setRefreshOfflineServices(true));\r\n // }}\r\n // initialService={service}\r\n // saveCreatable={true}\r\n // queryParams={{\r\n // id: '' + service.Id ?? -1,\r\n // }}\r\n // />,\r\n // )\r\n // : dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.OtherServiceDetails,\r\n // props: {\r\n // useSidePanel: true,\r\n // initialService: service,\r\n // saveCreatable: true,\r\n // queryParams: {\r\n // id: '' + service.Id ?? -1,\r\n // },\r\n // },\r\n // }),\r\n // );\r\n }\r\n },\r\n [edit, openPanel, useSidePanel],\r\n );\r\n const handleWorkTypeClick = React.useCallback(\r\n (\r\n event: IWorkOrderTypeDto,\r\n equipmentIds: number[],\r\n reservationId: number,\r\n ) => {\r\n let woProps = {\r\n queryParams: {\r\n id: undefined,\r\n aType: event.Id.toString(),\r\n eqid: equipmentIds.join(','),\r\n reservationId: reservationId.toString(),\r\n } as WorkOrderQueryStringParameters,\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: woProps,\r\n expanded: false,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n onClose: () => dispatch(actions.setRefreshWorkOrderLink(true)),\r\n } as SidePanelOpenState);\r\n // useSidePanel\r\n // ? setCover(\r\n // {\r\n // closeCover();\r\n // dispatch(actions.setRefreshWorkOrderLink(true));\r\n // }}\r\n // onClose={() => {\r\n // closeCover();\r\n // dispatch(actions.setRefreshWorkOrderLink(true));\r\n // }}\r\n // queryParams={{\r\n // id: undefined,\r\n // aType: event.Id.toString(),\r\n // eqid: equipmentIds.join(','),\r\n // reservationId: reservationId.toString(),\r\n // }}\r\n // />,\r\n // )\r\n // : dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.WorkOrderDetails,\r\n // props: {\r\n // useSidePanel: true,\r\n // queryParams: {\r\n // id: undefined,\r\n // aType: event.Id.toString(),\r\n // eqid: equipmentIds.join(','),\r\n // reservationId: reservationId.toString(),\r\n // } as WorkOrderQueryStringParameters,\r\n // } as WorkOrderDetailsProps,\r\n // }),\r\n // );\r\n },\r\n [actions, dispatch, openPanel, useSidePanel],\r\n );\r\n const handleAddBatchClick = React.useCallback(\r\n (batch: IInventoryBatchDto | null, serviceTypeId: number) => {\r\n let batchProps = {\r\n initialBatch: batch ?? undefined,\r\n queryParams: {\r\n id: '' + (batch?.Id ?? -1),\r\n stid: '' + serviceTypeId,\r\n },\r\n saveCreatable: useSidePanel,\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.InventoryBatch,\r\n renderPageProps: batchProps,\r\n expanded: false,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n // useSidePanel\r\n // ? setCover(\r\n // {\r\n // closeCover();\r\n // }}\r\n // onClose={() => {\r\n // closeCover();\r\n // }}\r\n // initialBatch={batch ?? undefined}\r\n // saveCreatable={true}\r\n // queryParams={{\r\n // id: '' + (batch?.Id ?? -1),\r\n // stid: '' + serviceTypeId,\r\n // }}\r\n // />,\r\n // )\r\n // : dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.InventoryBatch,\r\n // props: {\r\n // useSidePanel: true,\r\n // initialBatch: batch ?? undefined,\r\n // queryParams: {\r\n // id: '' + (batch?.Id ?? -1),\r\n // stid: '' + serviceTypeId,\r\n // },\r\n // } as InventoryBatchProps,\r\n // }),\r\n // );\r\n },\r\n [openPanel, useSidePanel],\r\n );\r\n const handleCalculateCredit = React.useCallback(\r\n (e: any) => {\r\n dispatch(actions.setSubmitCredit(true));\r\n handleSubmitForm(e);\r\n },\r\n [actions, dispatch],\r\n );\r\n // const handleCalculateClose = React.useCallback(() => {\r\n // setShowCalculateCredit(false);\r\n // dispatch(actions.resetCreditState());\r\n // }, [actions, dispatch]);\r\n //const [setSubmitting] = useSubmittingHandler();\r\n /// Use Effects ///\r\n React.useEffect(() => {\r\n let active = processing === false;\r\n if (active) {\r\n if (reservationId !== undefined && !isCloned) {\r\n //setEdit(true);\r\n } else {\r\n //setEdit(false);\r\n }\r\n if (actionCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n if (confirmAssisted && assistedTrainingData !== null) {\r\n setShowConfirmAssisted(true);\r\n } else {\r\n setShowConfirmAssisted(false);\r\n if (!isCloned) {\r\n handleCloselClick();\r\n }\r\n }\r\n }\r\n if (terminationEnabled) {\r\n dispatch(actions.resetTerminateState());\r\n }\r\n } else if (actionCompleted === false) {\r\n setRequestCompleted(undefined);\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actionCompleted,\r\n actions,\r\n assistedTrainingData,\r\n confirmAssisted,\r\n dispatch,\r\n handleCloselClick,\r\n hasError,\r\n isCloned,\r\n processing,\r\n reservationId,\r\n terminationEnabled,\r\n ]);\r\n React.useEffect(() => {\r\n let active = creditProcessing === false;\r\n if (active) {\r\n if (creditCompleted === true && !showCalculateCredit) {\r\n dispatch(actions.resetCreditState());\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n creditCompleted,\r\n creditProcessing,\r\n dispatch,\r\n showCalculateCredit,\r\n ]);\r\n // React.useEffect(() => {\r\n // if (confirmApproved) {\r\n // if (confirmBeforeTransfer) {\r\n // dispatch(layoutActions.resetConfirmState());\r\n // setShowTransfer(true);\r\n // } else {\r\n // dispatch(actions.resetDetailsState());\r\n // if (continueToOther.continueOnApprove) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // setTimeout(() => {\r\n // dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: continueToOther.pageType,\r\n // props: continueToOther.pageProps,\r\n // expanded: continueToOther.expanded,\r\n // }),\r\n // );\r\n // dispatch(layoutActions.resetContinueState());\r\n // }, 100);\r\n // } else if (continueLink !== undefined) {\r\n // dispatch(appSettingsActions.navigate(continueLink));\r\n // dispatch(layoutActions.resetSidePanel());\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }\r\n // //dispatch(actions.setChangedState(false));\r\n // }\r\n // }\r\n // if (confirmRejected) {\r\n // dispatch(layoutActions.resetConfirmState());\r\n // if (confirmBeforeTransfer) {\r\n // setConfirmBeforeTransfer(false);\r\n // }\r\n // }\r\n\r\n // return () => undefined;\r\n // }, [\r\n // actions,\r\n // appSettingsActions,\r\n // confirmApproved,\r\n // confirmBeforeTransfer,\r\n // confirmRejected,\r\n // continueLink,\r\n // continueToOther,\r\n // dispatch,\r\n // edit,\r\n // layoutActions,\r\n // ]);\r\n React.useEffect(() => {\r\n if (transferProcessing === false && transferStepCompleted === true) {\r\n setShowTransfer(false);\r\n }\r\n }, [actions, dispatch, transferProcessing, transferStepCompleted]);\r\n\r\n /// actions ///\r\n const leftActions = React.useMemo(() => {\r\n let mactions = [] as ActionRenderer[];\r\n if (!edit || (edit && (IsAdmin || isUserGroupCoordinator || isOwner))) {\r\n mactions.push(() => (\r\n \r\n }\r\n onClick={e => {\r\n dispatch(actions.setCloneReservation(false));\r\n dispatch(actions.resetOperateState());\r\n handleSaveClick(e);\r\n }}\r\n disabled={\r\n busy ||\r\n equipmentChangeCompleted === false ||\r\n transferStepWaiting === true ||\r\n (edit && reservationCanceled && !IsAdmin)\r\n }\r\n processing={!requestCompleted && busy}\r\n text={t(translations.Save)}\r\n />\r\n \r\n ));\r\n }\r\n if (edit) {\r\n if (!!equipmentSettings && !!reservationSettings) {\r\n if (canBeCanceled) {\r\n mactions.push(() => (\r\n \r\n }\r\n onClick={e =>\r\n handleChangeStatus(e, ReservationStatus.Cancelled)\r\n }\r\n disabled={\r\n busy ||\r\n transferStepWaiting === true ||\r\n equipmentChangeCompleted === false\r\n }\r\n variant=\"white\"\r\n processing={!requestCompleted && busy}\r\n text={\r\n showShortView\r\n ? t(translations.Cancel)\r\n : t(translations.CancelReservation)\r\n }\r\n />\r\n \r\n ));\r\n }\r\n if (canBeApproved) {\r\n mactions.push(() => (\r\n \r\n }\r\n onClick={e => handleChangeStatus(e, ReservationStatus.Approved)}\r\n disabled={\r\n busy ||\r\n transferStepWaiting === true ||\r\n equipmentChangeCompleted === false\r\n }\r\n variant=\"white\"\r\n processing={!requestCompleted && busy}\r\n text={\r\n showShortView\r\n ? t(translations.Approve)\r\n : t(translations.ApproveReservation)\r\n }\r\n />\r\n \r\n ));\r\n }\r\n if (\r\n (equipmentSettings.AllowedToTransfer ||\r\n equipmentSettings.AllowedToTransferAll) &&\r\n !transferStepWaiting &&\r\n !repeat &&\r\n canBeCanceled\r\n ) {\r\n mactions.push(() => (\r\n \r\n {\r\n if (hasChanges) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n setConfirmBeforeTransfer(true);\r\n } else {\r\n setShowTransfer(true);\r\n }\r\n }}\r\n disabled={busy}\r\n variant=\"white\"\r\n title={t(translations.TransferReservation)}\r\n processing={transferProcessing}\r\n text={t(translations.Transfer)}\r\n />\r\n \r\n ));\r\n }\r\n }\r\n // if (terminationEnabled) {\r\n // actions.push(() => (\r\n // \r\n // \r\n // \r\n // ));\r\n // }\r\n }\r\n if (\r\n IsAdmin &&\r\n globalSettings.assistedReservationsEnabled &&\r\n globalSettings.tutoringModulesEnabled &&\r\n equipmentSettings?.IsEquipmentTutoring &&\r\n edit &&\r\n assistedTrainingData !== null &&\r\n assistedTrainingData.Equipments.some(f => f.TrainingRecordId === null)\r\n ) {\r\n mactions.push(() => (\r\n \r\n }\r\n onClick={e =>\r\n editAssisted(\r\n {\r\n id: undefined,\r\n equId: undefined,\r\n equIds: assistedTrainingData.Equipments.map(\r\n f => f.EquipmentId,\r\n ).join(','),\r\n fatherId:\r\n assistedTrainingData.FatherId !== null\r\n ? assistedTrainingData.FatherId.toString()\r\n : undefined,\r\n rid:\r\n assistedTrainingData.FatherId !== null &&\r\n assistedTrainingData.FatherId !== undefined\r\n ? undefined\r\n : assistedTrainingData.ReservationId !== null\r\n ? assistedTrainingData.ReservationId.toString()\r\n : undefined,\r\n date: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(\r\n assistedTrainingData.StartTime,\r\n ),\r\n ),\r\n user: assistedTrainingData.UserName,\r\n useSidePanel: true,\r\n } as TrainingDetailsProps,\r\n false,\r\n )\r\n }\r\n disabled={busy}\r\n variant=\"white\"\r\n text={t(translations.CreateTraining)}\r\n />\r\n \r\n ));\r\n }\r\n if (canSaveForLater) {\r\n mactions.push(() => (\r\n \r\n }\r\n onClick={e => handleChangeStatus(e, ReservationStatus.Draft)}\r\n disabled={\r\n busy ||\r\n transferStepWaiting === true ||\r\n equipmentChangeCompleted === false\r\n }\r\n variant=\"white\"\r\n processing={!requestCompleted && busy}\r\n text={t(translations.SaveForLater)}\r\n />\r\n \r\n ));\r\n }\r\n if (calculateButtonVisible) {\r\n mactions.push(() => (\r\n }\r\n onClick={e => handleCalculateCredit(e)}\r\n title={\r\n offlineServicesErrors.length > 0\r\n ? (t(translations.OfflineServicesError_info) as string)\r\n : (t(translations.CalculatePricing_info) as string)\r\n }\r\n disabled={\r\n creditProcessing ||\r\n equipmentChangeCompleted === false ||\r\n offlineServicesErrors.length > 0\r\n }\r\n processing={creditProcessing}\r\n >\r\n {t(translations.CalculatePricing)}\r\n \r\n ));\r\n }\r\n if (edit && (IsAdmin || isUserGroupCoordinator || isOwner)) {\r\n mactions.push(() => (\r\n }\r\n aria-label=\"history\"\r\n onClick={() => setOpenModifications(true)}\r\n >\r\n {t(translations.ModificationsHistory)}\r\n \r\n ));\r\n }\r\n if (IsAdmin || isOwner) {\r\n mactions.push(() => (\r\n }\r\n aria-label=\"clone\"\r\n disabled={\r\n busy ||\r\n equipmentChangeCompleted === false ||\r\n transferStepWaiting === true ||\r\n (edit && reservationCanceled && !IsAdmin)\r\n }\r\n title={t(translations.res_SaveAndClone_info)}\r\n onClick={e => {\r\n dispatch(actions.resetOperateState());\r\n if (edit) {\r\n if (hasChanges) {\r\n setConfirmCloned(hasChanges);\r\n } else {\r\n dispatch(actions.setCloneReservation(true));\r\n handleSaveClick(e);\r\n }\r\n } else {\r\n dispatch(actions.setCloneReservation(true));\r\n handleSaveClick(e);\r\n }\r\n }}\r\n >\r\n {edit ? t(translations.SaveAndClone) : t(translations.CreateAndClone)}\r\n \r\n ));\r\n }\r\n mactions.push(() => (\r\n \r\n }\r\n size=\"small\"\r\n onClick={e => {\r\n dispatch(\r\n appSettingsActions.navigate(\r\n toLocationDescriptor({\r\n path: '/reservations',\r\n search: { relId: reservationId },\r\n }),\r\n ),\r\n );\r\n if (sidePanelExpanded) {\r\n dispatch(layoutActions.setExpanded(false));\r\n }\r\n }}\r\n >\r\n {t(translations.ShowRelatedReservations)}\r\n \r\n \r\n ));\r\n return mactions;\r\n }, [\r\n IsAdmin,\r\n actions,\r\n appSettingsActions,\r\n assistedTrainingData,\r\n busy,\r\n calculateButtonVisible,\r\n canBeApproved,\r\n canBeCanceled,\r\n canSaveForLater,\r\n creditProcessing,\r\n dispatch,\r\n edit,\r\n editAssisted,\r\n equipmentChangeCompleted,\r\n equipmentSettings,\r\n globalSettings.assistedReservationsEnabled,\r\n globalSettings.tutoringModulesEnabled,\r\n handleCalculateCredit,\r\n handleChangeStatus,\r\n handleSaveClick,\r\n hasChanges,\r\n isOwner,\r\n isUserGroupCoordinator,\r\n layoutActions,\r\n offlineServicesErrors.length,\r\n repeat,\r\n requestCompleted,\r\n reservationCanceled,\r\n reservationId,\r\n reservationSettings,\r\n showShortView,\r\n sidePanelExpanded,\r\n t,\r\n transferProcessing,\r\n transferStepWaiting,\r\n ]);\r\n\r\n const rightActions = React.useMemo(() => {\r\n return [\r\n () => (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [handleCloselClick, t]);\r\n // const rightTopActions = React.useMemo(() => {\r\n // let rtactions = [] as ActionRenderer[];\r\n // if (edit && (IsAdmin || isUserGroupCoordinator || isOwner)) {\r\n // rtactions.push(() => (\r\n // setOpenModifications(true)}\r\n // noChangeOnMobile\r\n // text={t(translations.ModificationsHistory)}\r\n // />\r\n // ));\r\n // }\r\n // if (IsAdmin || isOwner) {\r\n // rtactions.push(() => (\r\n // {\r\n // dispatch(actions.resetOperateState());\r\n // if (edit) {\r\n // if (hasChanges) {\r\n // setConfirmCloned(hasChanges);\r\n // } else {\r\n // dispatch(actions.setCloneReservation(true));\r\n // handleSaveClick(e);\r\n // }\r\n // } else {\r\n // dispatch(actions.setCloneReservation(true));\r\n // handleSaveClick(e);\r\n // }\r\n // }}\r\n // noChangeOnMobile\r\n // text={\r\n // edit ? t(translations.SaveAndClone) : t(translations.CreateAndClone)\r\n // }\r\n // />\r\n // ));\r\n // }\r\n // if (edit) {\r\n // if (!!equipmentSettings && !!reservationSettings) {\r\n // if (canBeCanceled) {\r\n // rtactions.push(() => (\r\n // handleChangeStatus(e, ReservationStatus.Cancelled)}\r\n // disabled={\r\n // busy ||\r\n // transferStepWaiting === true ||\r\n // equipmentChangeCompleted === false\r\n // }\r\n // noChangeOnMobile\r\n // text={t(translations.Cancel)}\r\n // />\r\n // ));\r\n // }\r\n // if (canBeApproved) {\r\n // rtactions.push(() => (\r\n // handleChangeStatus(e, ReservationStatus.Approved)}\r\n // disabled={\r\n // busy ||\r\n // transferStepWaiting === true ||\r\n // equipmentChangeCompleted === false\r\n // }\r\n // noChangeOnMobile\r\n // text={t(translations.Approve)}\r\n // />\r\n // ));\r\n // }\r\n // if (\r\n // (equipmentSettings.AllowedToTransfer ||\r\n // equipmentSettings.AllowedToTransferAll) &&\r\n // !transferStepWaiting &&\r\n // !repeat &&\r\n // canBeCanceled\r\n // ) {\r\n // rtactions.push(() => (\r\n // {\r\n // if (hasChanges) {\r\n // dispatch(layoutActions.setConfirmOpen(true));\r\n // setConfirmBeforeTransfer(true);\r\n // } else {\r\n // setShowTransfer(true);\r\n // }\r\n // }}\r\n // disabled={busy}\r\n // noChangeOnMobile\r\n // text={t(translations.Transfer)}\r\n // />\r\n // ));\r\n // }\r\n // if (\r\n // IsAdmin &&\r\n // globalSettings.assistedReservationsEnabled &&\r\n // globalSettings.tutoringModulesEnabled &&\r\n // equipmentSettings?.IsEquipmentTutoring &&\r\n // edit &&\r\n // assistedTrainingData !== null &&\r\n // assistedTrainingData.Equipments.some(f => f.TrainingRecordId === null)\r\n // ) {\r\n // rtactions.push(() => (\r\n // \r\n // editAssisted(\r\n // {\r\n // id: undefined,\r\n // equId: undefined,\r\n // equIds: assistedTrainingData.Equipments.map(\r\n // f => f.EquipmentId,\r\n // ).join(','),\r\n // fatherId:\r\n // assistedTrainingData.FatherId !== null\r\n // ? assistedTrainingData.FatherId.toString()\r\n // : undefined,\r\n // rid:\r\n // assistedTrainingData.FatherId !== null\r\n // ? undefined\r\n // : assistedTrainingData.ReservationId !== null\r\n // ? assistedTrainingData.ReservationId.toString()\r\n // : undefined,\r\n // date: dateUtils.formatISO(\r\n // dateUtils.dateOrStringToDate(\r\n // assistedTrainingData.StartTime,\r\n // ),\r\n // ),\r\n // user: assistedTrainingData.UserName,\r\n // useSidePanel: true,\r\n // } as TrainingDetailsProps,\r\n // false,\r\n // )\r\n // }\r\n // disabled={busy}\r\n // noChangeOnMobile\r\n // text={t(translations.CreateTraining)}\r\n // />\r\n // ));\r\n // }\r\n // }\r\n // }\r\n // if (canSaveForLater) {\r\n // rtactions.push(() => (\r\n // handleChangeStatus(e, ReservationStatus.Draft)}\r\n // disabled={\r\n // busy ||\r\n // transferStepWaiting === true ||\r\n // equipmentChangeCompleted === false\r\n // }\r\n // noChangeOnMobile\r\n // text={t(translations.SaveForLater)}\r\n // />\r\n // ));\r\n // }\r\n // if (calculateButtonVisible) {\r\n // rtactions.push(() => (\r\n // handleCalculateCredit(e)}\r\n // disabled={creditProcessing || equipmentChangeCompleted === false}\r\n // noChangeOnMobile\r\n // text={t(translations.CalculatePricing)}\r\n // />\r\n // ));\r\n // }\r\n // return rtactions;\r\n // }, [\r\n // IsAdmin,\r\n // actions,\r\n // assistedTrainingData,\r\n // busy,\r\n // calculateButtonVisible,\r\n // canBeApproved,\r\n // canBeCanceled,\r\n // canSaveForLater,\r\n // creditProcessing,\r\n // dispatch,\r\n // edit,\r\n // editAssisted,\r\n // equipmentChangeCompleted,\r\n // equipmentSettings,\r\n // globalSettings.assistedReservationsEnabled,\r\n // globalSettings.tutoringModulesEnabled,\r\n // handleCalculateCredit,\r\n // handleChangeStatus,\r\n // handleSaveClick,\r\n // hasChanges,\r\n // isOwner,\r\n // isUserGroupCoordinator,\r\n // layoutActions,\r\n // repeat,\r\n // reservationCanceled,\r\n // reservationSettings,\r\n // t,\r\n // transferStepWaiting,\r\n // ]);\r\n const pageTitle = reservation?.data\r\n ? edit\r\n ? ` ${\r\n isCloned\r\n ? t(translations.CloneReservation)\r\n : t(translations.Reservation)\r\n } #${reservationId || 'N/A'}`\r\n : reservation.data.TrainingSignUp\r\n ? t(translations.TrainingSignUp)\r\n : ` ${\r\n isCloned\r\n ? t(translations.CloneReservation)\r\n : t(translations.AddReservation)\r\n }`\r\n : undefined;\r\n const pageName = edit\r\n ? t(translations.menu_ReservationDetails)\r\n : t(translations.menu_NewReservation);\r\n const useSwitchActions =\r\n !edit && IsAdmin && !reservation.data?.TransferFromId && useSwitchButtons;\r\n const switchState =\r\n !!workOrderSwithProps && !edit && useSwitchButtons\r\n ? ({\r\n target: SwitchTarget.WorkOrder,\r\n getProps: () => workOrderSwithProps,\r\n } as SwitchActionsProps)\r\n : undefined;\r\n const ByApprovalAvailable =\r\n ByApprovalErrors !== undefined && ByApprovalErrors.length > 0;\r\n /// render ///\r\n return (\r\n \r\n {\r\n setShowConfirmRecurring(false);\r\n }}\r\n actions={[\r\n () => (\r\n \r\n ),\r\n () => (\r\n \r\n ),\r\n ]}\r\n />\r\n ) : confirmCloned ? (\r\n {\r\n dispatch(actions.setCloneReservation(true));\r\n handleSaveClick(e);\r\n setConfirmCloned(false);\r\n }}\r\n maxWidth=\"md\"\r\n onCancel={() => {\r\n setConfirmCloned(false);\r\n }}\r\n />\r\n ) : requestCompleted &&\r\n confirmAssisted &&\r\n assistedTrainingData !== null ? (\r\n \r\n ) : showTransfer ? (\r\n {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n ServiceTypeId: 1,\r\n ServiceGroupId: f.ServiceGroupId,\r\n HideProject: f.HideProjects,\r\n } as IServiceTypeFilterDto;\r\n })}\r\n adGroup={reservation?.data?.ADGroup?.Id}\r\n trnsferSubmitted={transferProcessing}\r\n handleTransfer={value => {\r\n let transfer = {\r\n User: value,\r\n ReservtionId: reservation?.data?.Id ?? 0,\r\n } as TransferToReservation;\r\n dispatch(actions.transferReservation(transfer));\r\n }}\r\n user={User}\r\n onClose={() => setShowTransfer(false)}\r\n />\r\n ) : showCalculateCredit ? (\r\n setShowCalculateCredit(false)}\r\n edit={edit}\r\n credit={credit}\r\n creditCompleted={creditCompleted}\r\n creditProcessing={creditProcessing}\r\n />\r\n ) : !!openModifications ? (\r\n setOpenModifications(value)}\r\n resId={reservation?.data?.Id ?? 0}\r\n />\r\n ) : ByApprovalAvailable ? (\r\n \r\n {ByApprovalErrors.map((error, index) => (\r\n \r\n {error}\r\n \r\n ))}\r\n {t(translations.ReservationConfirmByApproval)}\r\n \r\n }\r\n confirmButtonLabel={t(translations.Confirm)}\r\n onConfirm={handleByApprovalConfirm}\r\n maxWidth=\"md\"\r\n onCancel={() => {\r\n dispatch(actions.setByApprovalErrors(undefined));\r\n }}\r\n />\r\n ) : (\r\n <>\r\n )\r\n }\r\n cover={cover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n coverClosed={coverClosed}\r\n >\r\n {reservation?.data !== undefined && !processing ? (\r\n not_restricted ? (\r\n \r\n ) : (\r\n \r\n \r\n

    {t(translations.RestrictedNotAllowed) as string}

    \r\n }\r\n onClick={handleCloselClick}\r\n >\r\n {t(translations.Continue)}\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 {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n
    \r\n );\r\n});\r\n","import {\r\n BaseURLPicker,\r\n BaseURLPickerProps,\r\n} from 'app/components/BasicPickers/BaseURLPicker';\r\nimport { Entity } from 'types/common';\r\n\r\nconst url = '/api/odata/v4/InvoiceTemplateFilter';\r\nexport interface InvoiceTemplatePickerProps\r\n extends Omit>, 'url'> {}\r\n\r\nexport const InvoiceTemplatePicker = (props: InvoiceTemplatePickerProps) => {\r\n return (\r\n \r\n );\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { call, put, takeLatest } from 'redux-saga/effects';\r\nimport { InvoiceDetailActions as actions } from '.';\r\n\r\nexport function* doGetInvoice(action: PayloadAction) {\r\n yield put(actions.setLoading(true));\r\n try {\r\n const invoice = yield call(\r\n httpClient.get,\r\n '/api/odata/v4/InvoiceDetails(' + action.payload + ')',\r\n {\r\n $expand: 'ServiceGroups',\r\n },\r\n );\r\n yield put(actions.setInvoice(invoice));\r\n yield put(actions.setLoading(false));\r\n } catch {\r\n yield put(actions.notFound());\r\n }\r\n}\r\n\r\nexport function* InvoiceDetailsSaga() {\r\n yield takeLatest(actions.getInvoice.type, doGetInvoice);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { IInvoice } from '../ReadOnly/IInvoice';\r\nimport { InvoiceDetailsSaga } from './saga';\r\nimport { InvoiceDetailsState } from './type';\r\n\r\nexport const initialState: InvoiceDetailsState = {\r\n loading: false,\r\n notFound: false,\r\n invoice: null,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'InvoiceDetails',\r\n initialState,\r\n reducers: {\r\n setLoading(state, action: PayloadAction) {\r\n state.loading = action.payload;\r\n },\r\n notFound(state, action: PayloadAction) {\r\n state.notFound = true;\r\n },\r\n setFilters(state, action: PayloadAction | undefined>) {\r\n state.filters = action.payload;\r\n },\r\n setInvoice(state, action: PayloadAction) {\r\n state.invoice = action.payload;\r\n },\r\n getInvoice(state, action: PayloadAction) {},\r\n reset(state, action: PayloadAction) {\r\n state.filters = undefined;\r\n state.notFound = false;\r\n state.loading = false;\r\n state.invoice = null;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: InvoiceDetailActions } = slice;\r\n\r\nexport const useInvoiceDetailsSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: InvoiceDetailsSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => {\r\n return state.InvoiceDetails || initialState;\r\n};\r\n\r\nexport const selectLoading = createSelector(\r\n [selectSlice],\r\n state => state.loading,\r\n);\r\nexport const selectNotFound = createSelector(\r\n [selectSlice],\r\n state => state.notFound,\r\n);\r\nexport const selectActiveFilters = createSelector(\r\n [selectSlice],\r\n state => state.filters,\r\n);\r\nexport const selectInvoice = createSelector(\r\n [selectSlice],\r\n state => state.invoice,\r\n);\r\n","import { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { useMemo } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useAbsolute } from 'utils/url-utils';\r\nimport { selectInvoice } from '../Slice/selector';\r\nimport { Comments } from 'app/components/Comments';\r\nimport { useUploadToNewComment } from 'app/components/LargeFilesUpload/Components/useUploadToNewComment';\r\n\r\nexport const InvoiceComments = () => {\r\n const invoice = useSelector(selectInvoice);\r\n const { onCommentAdded } = useUploadToNewComment();\r\n\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const isAdmin = useMemo(() => {\r\n return authenticatedUser?.Roles.includes(Roles.Administrators);\r\n }, [authenticatedUser]);\r\n const referenceId = invoice?.Id;\r\n const link = useAbsolute(`Invoices/Details/${referenceId}`);\r\n if (isAdmin === undefined || referenceId === undefined) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n};\r\n","import { makeStyles } from '@material-ui/core';\r\n\r\nexport const useStyles = makeStyles(theme => ({\r\n base: {\r\n border: `solid 1px ${theme.palette.divider}`,\r\n borderRadius: '6px',\r\n padding: 'inherit',\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n gap: '10px',\r\n },\r\n}));\r\n","import { Box } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { BasicDialog } from 'app/components/BasicDialog';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { FormRow } from 'app/components/Forms/FormsLayout';\r\nimport { InvoiceStatuses } from 'enums/InvoiceStatuses';\r\nimport { Form, Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport { uniqueId } from 'lodash';\r\nimport { useRef, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectInvoice } from '../Slice/selector';\r\nimport { useStyles } from './styles';\r\nimport * as yup from 'yup';\r\nimport { removeHtml } from 'utils/string-utils';\r\nimport { CommentsApi } from 'api/CommentsApi';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { InvoiceDetailsUrl } from '..';\r\nimport { useInvoiceDetailsSlice } from '../Slice';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { Body } from 'app/components/Typography';\r\n\r\nexport const InvoiceInReview = () => {\r\n const invoice = useSelector(selectInvoice);\r\n const { actions } = useInvoiceDetailsSlice();\r\n const { actions: notifActions } = useAppSettingsSlice();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const dispatch = useDispatch();\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const [open, setOpen] = useState(false);\r\n const submitForm = useRef();\r\n if (!invoice || invoice.StatusId !== InvoiceStatuses.SentToReview)\r\n return <>;\r\n const admin =\r\n authenticatedUser?.Roles.includes(Roles.Administrators) ||\r\n (authenticatedUser?.Roles.includes(Roles.GroupAdministrators) &&\r\n authenticatedUser.UserGroups.some(g => g.Id === invoice.UserGroupId));\r\n const schema: yup.SchemaOf<{ Text: string }> = yup.object({\r\n Text: yup\r\n .string()\r\n .test({\r\n name: 'not empty p',\r\n test: s => s !== undefined && removeHtml(s).trim() !== '',\r\n message: 'Text is required',\r\n })\r\n .required(),\r\n });\r\n\r\n return (\r\n \r\n {t(translations.InvoiceInReviewMessage)}\r\n {admin && (\r\n <>\r\n {\r\n httpClient\r\n .post(InvoiceDetailsUrl + '/UpdateStatus', {\r\n status: InvoiceStatuses.ReviewApproved,\r\n id: invoice.Id,\r\n })\r\n .then(() => {\r\n dispatch(actions.getInvoice(invoice.Id));\r\n dispatch(\r\n notifActions.addNotification({\r\n variant: 'success',\r\n message: t(translations.InvoiceApprovedMsg),\r\n }),\r\n );\r\n })\r\n .catch(e => console.log(e));\r\n }}\r\n size=\"small\"\r\n variant=\"white\"\r\n >\r\n {t(translations.Approve)}\r\n \r\n \r\n {\r\n CommentsApi.SendComment(\r\n CommentReferenceTypes.Invoice,\r\n invoice.Id,\r\n {\r\n Text:\r\n t(translations.InvoiceRejectReasonPrefix) + value.Text,\r\n },\r\n )\r\n .then(() => {\r\n httpClient\r\n .post(InvoiceDetailsUrl + '/UpdateStatus', {\r\n status: InvoiceStatuses.ReviewRejected,\r\n id: invoice.Id,\r\n })\r\n .then(() => {\r\n dispatch(actions.getInvoice(invoice.Id));\r\n })\r\n .catch(e => console.log(e));\r\n })\r\n .catch(console.error);\r\n setOpen(false);\r\n }}\r\n validationSchema={schema}\r\n >\r\n {formik => {\r\n submitForm.current = formik.submitForm;\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n );\r\n }}\r\n \r\n }\r\n id={uniqueId()}\r\n isopen={open}\r\n onClose={() => setOpen(false)}\r\n onCancel={() => setOpen(false)}\r\n leftActions={[\r\n () => (\r\n \r\n ),\r\n ]}\r\n rightActions={[\r\n () => (\r\n \r\n ),\r\n ]}\r\n />\r\n \r\n )}\r\n
    \r\n );\r\n};\r\n","import { makeStyles, Theme } from '@material-ui/core';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) => ({\r\n base: {\r\n paddingInline: theme.spacing(2),\r\n },\r\n}));\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { Body } from 'app/components/Typography';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { RichTextEditor } from 'app/components/RichTextEditor';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { translations } from 'locales/translations';\r\nimport { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useStyles } from '../ReadOnly/styles';\r\nimport { selectInvoice } from '../Slice/selector';\r\nconst url = '/api/odata/v4/InvoiceDetails';\r\nexport const InvoiceRemarks = () => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n\r\n const invoice = useSelector(selectInvoice);\r\n const [remarks, setRemarks] = useState(invoice?.Remarks);\r\n if (!invoice) return null;\r\n const updateRemarks = () => {\r\n httpClient\r\n .patch(url + '(' + invoice.Id + ')', { Remarks: remarks })\r\n .then(() =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'success',\r\n message: t(translations.UpdatedOK),\r\n }),\r\n ),\r\n )\r\n .catch(e =>\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: t(translations.UpdateFailed),\r\n }),\r\n ),\r\n );\r\n };\r\n return (\r\n \r\n {t(translations.Remarks)}\r\n \r\n
    \r\n \r\n
    \r\n );\r\n};\r\n","import { Grid } from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { selectglobalSettings } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport React, { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectInvoice } from '../Slice/selector';\r\nimport { getRows } from './Rows';\r\nimport { useStyles } from './styles';\r\n\r\nexport interface InvoiceReadOnlyProps {\r\n id: number;\r\n openChangeStatus?: () => void;\r\n openChangeInvoiceTemplate?: () => void;\r\n}\r\nexport const ReadOnlyDetails = (props: InvoiceReadOnlyProps) => {\r\n const { id, openChangeStatus, openChangeInvoiceTemplate } = props;\r\n const { t } = useTranslation();\r\n const invoice = useSelector(selectInvoice);\r\n const settings = useSelector(selectglobalSettings);\r\n const rows = useMemo(\r\n () => getRows(t, settings, openChangeStatus, openChangeInvoiceTemplate),\r\n [openChangeStatus, openChangeInvoiceTemplate, settings, t],\r\n );\r\n const classes = useStyles();\r\n\r\n if (!invoice) {\r\n return <>{t(translations.InvoiceNotFound).replace('{0}', id.toString())};\r\n }\r\n\r\n return (\r\n \r\n \r\n {rows.map(r => {\r\n const cell = r.Cell ?? (({ value }) => <>{value});\r\n const val = cell({ original: invoice, value: invoice[r.accessor] });\r\n if (val) {\r\n const header =\r\n typeof r.Header === 'string'\r\n ? () => (\r\n \r\n {r.Header}\r\n \r\n )\r\n : r.Header;\r\n return (\r\n \r\n \r\n {header && (\r\n \r\n {header({\r\n original: invoice,\r\n value: invoice[r.accessor],\r\n })}\r\n \r\n )}\r\n \r\n {val}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n })}\r\n \r\n \r\n );\r\n};\r\n","import { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { DetailRowRenderer } from 'types/DetailRow';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { IInvoice } from './IInvoice';\r\n\r\nexport const getRows = (\r\n t: TFunction,\r\n settings: GlobalSettings,\r\n openChangeStatus?: () => void,\r\n openChangeInvoiceTemplate?: () => void,\r\n) => {\r\n const currency = settings.GetString(AllowedSettings.ISOCurrencySymbol);\r\n const res: DetailRowRenderer[] = [\r\n {\r\n Header: t(translations.InvoiceId),\r\n accessor: 'Id',\r\n },\r\n {\r\n accessor: 'Amount',\r\n Header: t(translations.Amount),\r\n Cell: ({ value }) => <>{currency + (value ?? 0).toFixed(2)},\r\n },\r\n {\r\n accessor: 'Balance',\r\n Header: t(translations.InvoiceBalance),\r\n Cell: ({ value }) => <>{currency + (value ?? 0).toFixed(2)},\r\n },\r\n {\r\n accessor: 'ServiceGroups',\r\n Header: t(translations.ServiceGroup),\r\n Cell: ({ value }) => (\r\n \r\n {value.map(v => (\r\n
  • {v.Name}
  • \r\n ))}\r\n \r\n }\r\n arrow\r\n >\r\n \r\n {value\r\n .slice(0, 3)\r\n .map(v => v.Name)\r\n .join(',')}\r\n {value.length > 3 && , {value.length - 3} more}\r\n \r\n \r\n ),\r\n },\r\n {\r\n accessor: 'UserGroup',\r\n Header: t(translations.UserGroup),\r\n Cell: attrib => (\r\n <>{!!attrib.original.UserGroupId ? attrib.value : t(translations.NA)}\r\n ),\r\n },\r\n {\r\n accessor: 'BudgetNumber',\r\n Header: t(translations.BudgetNumber),\r\n Cell: attrib => (\r\n <>{!!attrib.original.BudgetId ? attrib.value : t(translations.NA)}\r\n ),\r\n },\r\n {\r\n accessor: 'StatusName',\r\n Header: () => (\r\n <>\r\n {' '}\r\n {t(translations.Status)}{' '}\r\n {!!openChangeStatus ? (\r\n \r\n ) : undefined}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'CreatedBy',\r\n Header: t(translations.CreatedBy),\r\n },\r\n {\r\n accessor: 'CreatedAt',\r\n Header: t(translations.CreatedAt),\r\n Cell: ({ value }) => <>{dateUtils.shortDateTimeFormat(value)},\r\n },\r\n {\r\n accessor: 'InvoiceTemplateName',\r\n Header: () => (\r\n <>\r\n {' '}\r\n {t(translations.InvoiceTemplate)}{' '}\r\n {!!openChangeInvoiceTemplate ? (\r\n \r\n ) : undefined}\r\n \r\n ),\r\n Cell: attrib => (\r\n <>\r\n {!!attrib.original.InvoiceTemplateId\r\n ? attrib.value\r\n : `Invoice #${attrib.original.Id} is missing a template`}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'Start',\r\n Header: t(translations.Period),\r\n Cell: ({ original }) => (\r\n <>\r\n {dateUtils.shortDateFormat(original.Start)} -{' '}\r\n {dateUtils.shortDateFormat(\r\n dateUtils.addDays(dateUtils.dateOrStringToDate(original.End), -1),\r\n )}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'LastSentToBilling',\r\n Header: t(translations.LastSentToBilling),\r\n Cell: ({ value }) => (\r\n <>\r\n {!!value ? dateUtils.shortDateTimeFormat(value) : t(translations.NA)}\r\n \r\n ),\r\n },\r\n ];\r\n return res;\r\n};\r\n","import DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport UserRenderer from 'app/components/BasicTable/CellRenderers/UserRenderer';\r\nimport { BudgetFields } from 'enums/BudgetFields';\r\nimport { PriceSheetBy } from 'enums/enums';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\nimport {\r\n AppSettings,\r\n IsBudgetFieldEnabled,\r\n IsModuleEnabled,\r\n} from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { IInvoiceRow } from './IInvoicRow';\r\nimport { Link as MuiLink } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { UserProfileLink } from 'app/components/BasicTable/components/UserProfileLink';\r\nimport { DescriptionCell } from 'app/components/BasicTable/components/DescriptionCell';\r\nimport { InvoiceRowReferenceLinks } from 'app/components/InvoiceRowReferenceLinks';\r\n\r\nconst hasSubRows = row => {\r\n return !!row.original.Rows && row.original.Rows.length > 1;\r\n};\r\n\r\nexport const getColumns = (\r\n t: TFunction,\r\n settings: GlobalSettings,\r\n appsettings: AppSettings | null,\r\n openEdit?: (id: number) => void,\r\n useSidePanel?: boolean,\r\n) => {\r\n const currency = settings.GetString(AllowedSettings.ISOCurrencySymbol);\r\n const cols: (Column & { invisible?: boolean })[] = [\r\n {\r\n accessor: 'Id',\r\n Header: t(translations.HashSymbol) as string,\r\n Cell: ({ value }) => {\r\n return !openEdit ? (\r\n <>{value}\r\n ) : (\r\n openEdit(value)}>{value}\r\n );\r\n },\r\n },\r\n {\r\n accessor: 'BudgetCat',\r\n Header: t(translations.BudgetCat) as string,\r\n invisible:\r\n !IsModuleEnabled(appsettings, KnownModules.BudgetCats) &&\r\n settings.TryGet('PriceSheetBy') !== null &&\r\n parseInt(\r\n settings.TryGet('PriceSheetBy') ??\r\n PriceSheetBy.InstrumentsAndServices.toString(),\r\n ) === PriceSheetBy.InstrumentsAndServices,\r\n },\r\n {\r\n accessor: 'Budget',\r\n Header: t(translations.Budget) as string,\r\n invisible: !IsModuleEnabled(appsettings, KnownModules.Budgets),\r\n },\r\n {\r\n accessor: 'Task',\r\n Header: t(translations.Task) as string,\r\n invisible: !IsModuleEnabled(appsettings, KnownModules.BudgetExperiments),\r\n },\r\n {\r\n accessor: 'Experiment',\r\n Header: t(translations.Experiment) as string,\r\n invisible: !IsModuleEnabled(appsettings, KnownModules.BudgetExperiments),\r\n },\r\n {\r\n accessor: 'User',\r\n Header: t(translations.User) as string,\r\n Cell: UserRenderer,\r\n },\r\n {\r\n accessor: 'InstrumentCat',\r\n Header: t(translations.InstrumentCat) as string,\r\n invisible:\r\n parseInt(\r\n settings.TryGet('PriceSheetBy') ??\r\n PriceSheetBy.InstrumentsAndServices.toString(),\r\n ) === PriceSheetBy.InstrumentsAndServices,\r\n },\r\n {\r\n accessor: 'EquipmentService',\r\n Header: t(translations.EquipmentService) as string,\r\n },\r\n /* {\r\n accessor: 'OnlineService',\r\n Header: t(translations.EquipmentService) as string,\r\n Cell: ({ row }) => {\r\n const vals = [\r\n row.original.OnlineService,\r\n row.original.SampleService,\r\n row.original.OfflineServiceType,\r\n row.original.AccService,\r\n row.original.SubscriptionName,\r\n ];\r\n if (\r\n !!row.original.ServiceRequestMilestoneChargeId &&\r\n !row.original.OfflineServiceType\r\n ) {\r\n vals.push(t(translations.Charges) as string);\r\n }\r\n return vals.filter(v => !!v).join(' - ');\r\n },\r\n }, */\r\n {\r\n accessor: 'Date',\r\n Header: t(translations.Date) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'CatRateType',\r\n Header: t(translations.FeeType) as string,\r\n Cell: ({ row, value }) => {\r\n if (hasSubRows(row)) return <>{t(translations.Mixed)};\r\n return (\r\n <>\r\n {value +\r\n (!!row.original.TimeSlotType\r\n ? '(' + row.original.TimeSlotType + ')'\r\n : '')}\r\n \r\n );\r\n },\r\n },\r\n {\r\n accessor: 'Quantity',\r\n Header: t(translations.Quantity) as string,\r\n Cell: ({ row, value }) => {\r\n if (hasSubRows(row)) return <>{t(translations.Mixed)};\r\n return <>{value};\r\n },\r\n },\r\n {\r\n accessor: 'Units',\r\n Header: t(translations.Units) as string,\r\n Cell: ({ row, value }) => {\r\n if (hasSubRows(row)) return <>{t(translations.Mixed)};\r\n return <>{value};\r\n },\r\n },\r\n {\r\n accessor: 'BaseRate',\r\n Header: t(translations.BaseRate) as string,\r\n Cell: ({ value, row }) => {\r\n if (hasSubRows(row)) return <>{t(translations.Mixed)};\r\n return <>{currency + (value ?? 0).toFixed(2)};\r\n },\r\n },\r\n {\r\n accessor: 'SubsProfPercentage',\r\n Header: t(translations.SubsProfPercentage) as string,\r\n Cell: ({ value, row }) => {\r\n if (hasSubRows(row)) {\r\n return t(translations.Mixed);\r\n } else if (value === null || value === undefined) {\r\n return t(translations.NA);\r\n } else {\r\n return value.toFixed(2) + '%';\r\n }\r\n },\r\n invisible: !IsBudgetFieldEnabled(appsettings, BudgetFields.SubsidyProfit),\r\n },\r\n {\r\n accessor: 'ActualRate',\r\n Header: t(translations.ActualRate) as string,\r\n Cell: ({ value, row }) => {\r\n if (hasSubRows(row)) return <>{t(translations.Mixed)};\r\n return <>{currency + (value ?? 0).toFixed(2)};\r\n },\r\n invisible: !IsBudgetFieldEnabled(appsettings, BudgetFields.SubsidyProfit),\r\n },\r\n {\r\n accessor: 'Amount',\r\n Header: t(translations.Amount) as string,\r\n Cell: ({ value }) => <>{currency + (value ?? 0).toFixed(2)},\r\n },\r\n {\r\n accessor: 'InsertedAt',\r\n Header: (\r\n \r\n {t(translations.InsertedAt)}\r\n \r\n ),\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'InsertedBy',\r\n Header: (\r\n \r\n {t(translations.InsertedBy)}\r\n \r\n ),\r\n Cell: ({ value, row }) => {\r\n if (value && row.original.InsertedBy) {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n }\r\n return <>{value};\r\n },\r\n },\r\n {\r\n accessor: 'ServiceGroupName',\r\n Header: (\r\n \r\n {t(translations.ServiceGroup)}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'ReservationId',\r\n Header: t(translations.Reference) as string,\r\n // Cell: InvoiceRowReferenceRenderer,\r\n Cell: ({ value, row }) => (\r\n \r\n ),\r\n },\r\n {\r\n Header: t(translations.Remarks) as string,\r\n accessor: 'Remarks',\r\n Cell: DescriptionCell({ width: 'medium' }),\r\n },\r\n ];\r\n return cols.filter(v => !v.invisible) as Column[];\r\n};\r\n","import { SampleTypePicker } from 'app/components/pickers/AutocompletePickers/SampleTypePicker.index';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\n\r\nexport function SampleTypeFilter(props: IFilterComponentProps) {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n}\r\n","import { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport BooleanPickerFilter from 'app/components/BasicTable/Filters/BooleanPickerFilter';\r\nimport DatesRangeFilter from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport { SampleTypeFilter } from 'app/components/BasicTable/Filters/SampleTypeFilter';\r\nimport ServiceFilter from 'app/components/BasicTable/Filters/ServiceFilter';\r\nimport ServiceGroupFilter from 'app/components/BasicTable/Filters/ServiceGroupFilter';\r\nimport ServiceTypeFilter from 'app/components/BasicTable/Filters/ServiceTypeFilter';\r\nimport UserFilter from 'app/components/BasicTable/Filters/UserFilter';\r\nimport {\r\n GetBooleanEntity,\r\n GetBooleanOrUndefined,\r\n getDefaultFilterDatePeriod,\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n GetStringOrUndefined,\r\n initExPickerValue,\r\n initPickerValue,\r\n presetDatesRangeToQueryString,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { initSampleTypeData } from 'app/components/pickers/AutocompletePickers/SampleTypePicker.index';\r\nimport { initServiceTypeData } from 'app/components/pickers/AutocompletePickers/ServiceTypePicker';\r\nimport { initUserData } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { initOnlineServicesData } from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { initServiceGroupsData } from 'app/components/pickers/ServiceGroupPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { IInvoiceRow } from './Details/IInvoicRow';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParams(search);\r\n const res: IFilterSettings[] = [\r\n {\r\n displayName: t(translations.ServiceGroup),\r\n queryStringSerializer: 'sgid',\r\n fieldName: 'ServiceGroupId',\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'sgid')),\r\n ),\r\n component: ServiceGroupFilter,\r\n initData: initExPickerValue(initServiceGroupsData),\r\n },\r\n {\r\n fieldName: 'OnlineServiceId',\r\n queryStringSerializer: 'osid',\r\n displayName: t(translations.OnlineService),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'osid')),\r\n ),\r\n component: ServiceFilter,\r\n initData: initPickerValue(initOnlineServicesData),\r\n },\r\n {\r\n fieldName: 'OfflineServiceTypeId',\r\n queryStringSerializer: 'ostid',\r\n displayName: t(translations.OfflineServiceType),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'ostid')),\r\n ),\r\n component: ServiceTypeFilter,\r\n initData: initPickerValue(initServiceTypeData),\r\n },\r\n {\r\n fieldName: 'SampleServiceId',\r\n queryStringSerializer: 'ssid',\r\n displayName: t(translations.SampleType),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'ssid')),\r\n ),\r\n component: SampleTypeFilter,\r\n initData: initPickerValue(initSampleTypeData),\r\n },\r\n {\r\n fieldName: 'UserId',\r\n queryStringSerializer: 'user',\r\n displayName: t(translations.User),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'user')),\r\n ),\r\n component: UserFilter,\r\n initData: initPickerValue(initUserData),\r\n },\r\n {\r\n fieldName: 'Date',\r\n displayName: t(translations.RG_DatePeriod),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'st', 'et', params),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'period',\r\n 'st',\r\n 'et',\r\n ),\r\n component: DatesRangeFilter,\r\n urlKey: 'period',\r\n },\r\n {\r\n fieldName: 'Amount',\r\n displayName: t(translations.ShowZeroAmountRows),\r\n queryStringSerializer: 'showZeroAmountRows',\r\n operator: ODataOperators.Equals,\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'showZeroAmountRows')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n customFilter: (value, setting) => {\r\n if (!!value && value['Id'] === true) {\r\n return 'true';\r\n }\r\n return new Condition(\r\n setting.fieldName,\r\n ODataOperators.NotEquals,\r\n 0,\r\n ).toString();\r\n },\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { toQueryString } from 'utils/url-utils';\r\n\r\nexport const getDefaultFilter = () => {\r\n const result = toQueryString({\r\n showZeroAmountRows: false,\r\n });\r\n return result;\r\n};\r\n","import * as React from 'react';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { selectAppSettings, selectglobalSettings } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { IInvoiceRow } from './IInvoicRow';\r\n// import { UnconfigurableTable } from '../UnconfigurableTable';\r\nimport { getColumns } from './Columns';\r\nimport { GetFilters } from '../Filter';\r\nimport { CellRenderer } from 'app/components/BasicTable/BasicTableProps';\r\nimport {\r\n RowActionsMenu,\r\n RowActionsProps,\r\n} from 'app/components/BasicTable/RowActions';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { SelectedRowsActionRenderer } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { SelectedRowsActionIconButton } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IPathAndQuery } from 'utils/url-utils';\r\nimport { BudgetPicker } from 'app/components/pickers/AutocompletePickers/BudgetPicker';\r\nimport { Entity } from 'types/common';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { BasicTable } from 'app/components/BasicTable';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { selectInvoice } from '../../Slice/selector';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { getDefaultFilter } from './getDefaultFilters';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { filterHandler } from 'app/components/BasicTable/UnconfigurableTable/FilterHandler';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\n\r\nexport interface InvoiceDetailsTableProps {\r\n isSidePanel?: boolean;\r\n id: number;\r\n setFilters?: (\r\n appliedFilters: IFilterSettings[] | undefined,\r\n ) => void;\r\n OpenEditRow?: (rowId: number) => void;\r\n}\r\nconst url = '/api/odata/v4/InvoiceRows';\r\nconst groupedUrl = '/api/odata/v4/GroupedInvoiceRows';\r\nexport const DetailsTable = ({\r\n isSidePanel,\r\n id,\r\n setFilters,\r\n OpenEditRow,\r\n}: InvoiceDetailsTableProps) => {\r\n const TTable = useMemo(\r\n () =>\r\n filterHandler(BasicTable, GetFilters, {\r\n isSidePanel,\r\n setFilters,\r\n getDefaultFilter,\r\n reservedQueryStringParameterNames: ['id', 'invoiceId'],\r\n }),\r\n [isSidePanel, setFilters],\r\n );\r\n const invoice = useSelector(selectInvoice);\r\n const [budget, setBudget] = React.useState | null>(null);\r\n\r\n // const rowActions: CellRenderer[] = [\r\n // !!OpenEditRow\r\n // ? ({ row: { original } }) => (\r\n // OpenEditRow(original.Id)}\r\n // >\r\n // \r\n // \r\n // \r\n // ,\r\n // ]}\r\n // />\r\n // )\r\n // : undefined,\r\n // ].filter(v => !!v) as CellRenderer[];\r\n const { t } = useTranslation();\r\n const settings = useSelector(selectglobalSettings);\r\n const appSettings = useSelector(selectAppSettings);\r\n const columns = useMemo(() => {\r\n return getColumns(t, settings, appSettings, OpenEditRow, isSidePanel);\r\n }, [OpenEditRow, appSettings, isSidePanel, settings, t]);\r\n const rowActions: CellRenderer[] = useMemo<\r\n CellRenderer[]\r\n >(\r\n () => [\r\n ({ row }) => {\r\n const items: RowActionsProps[] = [];\r\n if (!!OpenEditRow) {\r\n items.push({\r\n onClick: () => {\r\n OpenEditRow(row.original.Id);\r\n },\r\n text: t(translations.Edit) as string,\r\n title: t(translations.EditInvoiceLine) as string,\r\n icon: 'pencil-alt',\r\n } as RowActionsProps);\r\n }\r\n\r\n if (items.length > 0) {\r\n return (\r\n \r\n );\r\n } else {\r\n return undefined;\r\n }\r\n },\r\n ],\r\n [OpenEditRow, t],\r\n );\r\n const selectedRowActions: SelectedRowsActionRenderer[] = useMemo(\r\n () => [\r\n (rows, onRefresh) => (\r\n \r\n await httpClient.post(url + '/DeleteMany', {\r\n invoiceId: id,\r\n ids: rows.map(v => v.Id),\r\n })\r\n }\r\n />\r\n ),\r\n (rows, onRefresh, toggleAll) => (\r\n setBudget(val)}\r\n variant=\"filled\"\r\n fullWidth\r\n predicates={[\r\n invoice?.UserGroupId\r\n ? new Condition(\r\n 'UserGroupId',\r\n ODataOperators.Equals,\r\n invoice.UserGroupId,\r\n )\r\n : '',\r\n new Condition('Active', ODataOperators.Equals, true),\r\n invoice?.ServiceGroups\r\n ? '(' +\r\n new Condition(\r\n 'ServiceGroupServicesAllowed',\r\n ODataOperators.Equals,\r\n true,\r\n ).toString() +\r\n ' or ' +\r\n new Condition(\r\n 'ServiceGroupIds',\r\n ODataOperators.AnyIn,\r\n invoice.ServiceGroups,\r\n ).toString() +\r\n ')'\r\n : '',\r\n ]}\r\n />\r\n }\r\n confirmTitle={\r\n <>\r\n {t(translations.EditBudgetInvoiceRows)} \r\n \r\n \r\n \r\n \r\n }\r\n confirmButtonLabel={t(translations.Change)}\r\n validConfirm={!!budget}\r\n action={async () => {\r\n setBudget(null);\r\n toggleAll(false);\r\n return await httpClient.post(url + '/UpdateBudget', {\r\n invoiceId: id,\r\n ids: rows.map(v => v.Id),\r\n budgetId: budget?.Id ?? 0,\r\n });\r\n }}\r\n />\r\n ),\r\n ],\r\n [budget, id, invoice, t],\r\n );\r\n /**\r\n * Each row in the table should have a unique Id including the parent and sub rows.\r\n * InvoiceId (Id) can be used on subrows as they are unique, for parent grouped row the grouping key can be used as a unique id provided the goruping is done on exact the same columns\r\n */\r\n const getRowId = React.useCallback(\r\n (row: IInvoiceRow) =>\r\n row.Rows !== undefined && row.Rows.length > 1\r\n ? [\r\n row.ReferenceId,\r\n row.User,\r\n row.UserId,\r\n row.OnlineService,\r\n row.OnlineServiceId,\r\n row.SampleService,\r\n row.SampleServiceId,\r\n row.SubscriptionId,\r\n row.SubscriptionName,\r\n ].join('.')\r\n : String(row.Id),\r\n [],\r\n );\r\n const [isGrouped, setIsGrouped] = React.useState(false);\r\n const api: IPathAndQuery = isGrouped\r\n ? {\r\n path: groupedUrl,\r\n search: {\r\n Id: id,\r\n $expand:\r\n 'Rows($select=' +\r\n [\r\n ...columns\r\n ?.filter(c => typeof c.accessor === 'string')\r\n ?.filter(c => c.accessor !== undefined)\r\n ?.map(c => c.accessor as keyof IInvoiceRow),\r\n ...[\r\n 'UserId',\r\n 'SampleService',\r\n 'OfflineServiceType',\r\n 'AccService',\r\n 'SubscriptionName',\r\n 'ServiceRequestMilestoneChargeId',\r\n 'TimeSlotType',\r\n 'ReservationId',\r\n 'OfflineServiceId',\r\n 'ServiceRequestId',\r\n 'UsageId',\r\n 'SubscriptionId',\r\n ],\r\n ].join(',') +\r\n ')',\r\n },\r\n }\r\n : {\r\n path: url,\r\n search: {\r\n Id: id,\r\n },\r\n };\r\n\r\n return (\r\n 0 ? rowActions : undefined}\r\n selectedRowsActions={selectedRowActions}\r\n pageActions={[\r\n () => (\r\n \r\n setIsGrouped(v => !v)}\r\n title={t(translations.GroupByReferenceDescription)}\r\n variant=\"ghost\"\r\n size=\"small\"\r\n >\r\n {isGrouped\r\n ? t(translations.DoNotGroupByReference)\r\n : t(translations.GroupByReference)}\r\n \r\n ,\r\n ]}\r\n />\r\n ),\r\n ]}\r\n additionalColumns={[\r\n 'UserId',\r\n 'SampleService',\r\n 'OfflineServiceType',\r\n 'AccService',\r\n 'SubscriptionName',\r\n 'ServiceRequestMilestoneChargeId',\r\n 'TimeSlotType',\r\n 'ReservationId',\r\n 'OfflineServiceId',\r\n 'ServiceRequestId',\r\n 'UsageId',\r\n 'SubscriptionId',\r\n 'InsertedByDisplay',\r\n ]}\r\n useRowSelect\r\n searchColumns={[\r\n 'Budget',\r\n 'OnlineService',\r\n 'OfflineServiceType',\r\n 'SampleService',\r\n 'CatRateType',\r\n 'TimeSlotType',\r\n 'User',\r\n 'cast(ReservationId,Edm.String)',\r\n 'cast(UsageId,Edm.String)',\r\n 'cast(OfflineServiceId,Edm.String)',\r\n 'cast(ServiceRequestId,Edm.String)',\r\n 'cast(Id,Edm.String)',\r\n ]}\r\n />\r\n );\r\n};\r\n","import { filterHandler } from 'app/components/BasicTable/UnconfigurableTable/FilterHandler';\r\nimport { translations } from 'locales/translations';\r\nimport { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { UnconfigurableTable } from '../../../../components/BasicTable/UnconfigurableTable/UnconfigurableTable';\r\nimport { getColumns } from './Columns';\r\nimport { GetFilters } from './Filter';\r\nimport { IInvoiceHistory } from './IInvoiceHistory';\r\n\r\nexport interface InvoiceHistoryProps {\r\n invoiceId: number;\r\n}\r\nexport const InvoiceHistory = ({ invoiceId }: InvoiceHistoryProps) => {\r\n const { t } = useTranslation();\r\n const columns = useMemo(() => getColumns(t), [t]);\r\n const url = '/api/odata/v4/InvoiceHistory';\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst TTable = filterHandler(\r\n UnconfigurableTable,\r\n GetFilters,\r\n {\r\n isSidePanel: true,\r\n },\r\n);\r\n","import DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\nimport { IInvoiceHistory } from './IInvoiceHistory';\r\n\r\nexport const getColumns = (t: TFunction) => {\r\n const res: Column[] = [\r\n {\r\n accessor: 'InvoiceId',\r\n Header: t(translations.HashSymbol) as string,\r\n },\r\n {\r\n accessor: 'FieldName',\r\n Header: t(translations.Field) as string,\r\n },\r\n {\r\n accessor: 'OldValue',\r\n Header: t(translations.OldValue) as string,\r\n },\r\n {\r\n accessor: 'NewValue',\r\n Header: t(translations.NewValue) as string,\r\n },\r\n {\r\n accessor: 'DisplayName',\r\n Header: t(translations.User) as string,\r\n },\r\n {\r\n accessor: 'UpdatedAt',\r\n Header: t(translations.Date) as string,\r\n Cell: DateRenderer,\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport DatesRangeFilter from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport NumberFieldFilter from 'app/components/BasicTable/Filters/NumberFieldFilter';\r\nimport {\r\n getDefaultFilterDatePeriod,\r\n GetNumberOrUndefined,\r\n GetRawValue,\r\n presetDatesRangeToQueryString,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { translations } from 'locales/translations';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { IInvoiceHistory } from './IInvoiceHistory';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParams(search);\r\n const res: IFilterSettings[] = [\r\n {\r\n fieldName: 'UpdatedAt',\r\n displayName: t(translations.Period),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'st', 'et', params),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'period',\r\n 'st',\r\n 'et',\r\n ),\r\n component: DatesRangeFilter,\r\n urlKey: 'period',\r\n },\r\n {\r\n fieldName: 'InvoiceId',\r\n queryStringSerializer: 'rowId',\r\n displayName: t(translations.InvoiceId),\r\n operator: ODataOperators.Equals,\r\n value: GetNumberOrUndefined(GetRawValue(params, 'rowId')),\r\n component: NumberFieldFilter,\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { filterHandler } from 'app/components/BasicTable/UnconfigurableTable/FilterHandler';\r\nimport { translations } from 'locales/translations';\r\nimport { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { UnconfigurableTable } from '../../../../components/BasicTable/UnconfigurableTable/UnconfigurableTable';\r\nimport { getColumns } from './columns';\r\nimport { GetFilters } from './Filter';\r\nimport { IPayHistory } from './IPayHistory';\r\n\r\nexport interface InvoicePayHistoryProps {\r\n invoiceId: number;\r\n}\r\nexport const PayHistory = ({ invoiceId }: InvoicePayHistoryProps) => {\r\n const { t } = useTranslation();\r\n const columns = useMemo(() => getColumns(t), [t]);\r\n const url = '/api/odata/v4/InvoicePayHistory';\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst TTable = filterHandler(UnconfigurableTable, GetFilters, {\r\n isSidePanel: true,\r\n});\r\n","import DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport { parse } from 'app/components/CommentsContainer/commentParser';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\nimport { IPayHistory } from './IPayHistory';\r\n\r\nexport const getColumns = (t: TFunction) => {\r\n const res: Column[] = [\r\n {\r\n accessor: 'InvoicePaymentId',\r\n Header: t(translations.HashSymbol) as string,\r\n },\r\n {\r\n accessor: 'FieldName',\r\n Header: t(translations.Field) as string,\r\n },\r\n {\r\n accessor: 'OldValue',\r\n Header: t(translations.OldValue) as string,\r\n Cell: ({ value }) => {\r\n if (!value) return <>;\r\n return {parse(value)};\r\n },\r\n },\r\n {\r\n accessor: 'NewValue',\r\n Header: t(translations.NewValue) as string,\r\n Cell: ({ value }) => {\r\n if (!value) return <>;\r\n return {parse(value)};\r\n },\r\n },\r\n {\r\n accessor: 'DisplayName',\r\n Header: t(translations.User) as string,\r\n },\r\n {\r\n accessor: 'UpdatedAt',\r\n Header: t(translations.Date) as string,\r\n Cell: DateRenderer,\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport DatesRangeFilter from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport NumberFieldFilter from 'app/components/BasicTable/Filters/NumberFieldFilter';\r\nimport {\r\n getDefaultFilterDatePeriod,\r\n GetNumberOrUndefined,\r\n GetRawValue,\r\n presetDatesRangeToQueryString,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { translations } from 'locales/translations';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { IPayHistory } from './IPayHistory';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParams(search);\r\n const res: IFilterSettings[] = [\r\n {\r\n fieldName: 'UpdatedAt',\r\n displayName: t(translations.Period),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'st', 'et', params),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'period',\r\n 'st',\r\n 'et',\r\n ),\r\n component: DatesRangeFilter,\r\n urlKey: 'period',\r\n },\r\n {\r\n fieldName: 'InvoicePaymentId',\r\n queryStringSerializer: 'payId',\r\n displayName: t(translations.InvoiceRowId),\r\n operator: ODataOperators.Equals,\r\n value: GetNumberOrUndefined(GetRawValue(params, 'payId')),\r\n component: NumberFieldFilter,\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { CellRenderer } from 'app/components/BasicTable/BasicTableProps';\r\nimport { PageActionRenderer } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport {\r\n RowActionsMenu,\r\n RowActionsProps,\r\n} from 'app/components/BasicTable/RowActions';\r\nimport { SelectedRowsActionIconButton } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { SelectedRowsActionRenderer } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { translations } from 'locales/translations';\r\nimport { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { UnconfigurableTable } from '../../../../components/BasicTable/UnconfigurableTable/UnconfigurableTable';\r\nimport { getColumns } from './Columns';\r\nimport { IInvoicePayment } from './IInvoicePayment';\r\n\r\nexport interface PaymentTableProps {\r\n invoiceId: number;\r\n isSidePanel: boolean;\r\n pageActions?: PageActionRenderer[];\r\n openEditPayment?: (payId: number) => void;\r\n}\r\nconst url = '/api/odata/v4/InvoicePayments';\r\nexport const PaymentTable = ({\r\n invoiceId,\r\n pageActions,\r\n openEditPayment,\r\n}: PaymentTableProps) => {\r\n const { t } = useTranslation();\r\n const columns = useMemo(() => getColumns(t, openEditPayment), [\r\n openEditPayment,\r\n t,\r\n ]);\r\n const rowActions: CellRenderer[] = useMemo<\r\n CellRenderer[]\r\n >(\r\n () => [\r\n ({ row }) => {\r\n const items: RowActionsProps[] = [];\r\n if (!!openEditPayment) {\r\n items.push({\r\n onClick: () => {\r\n openEditPayment(row.original.Id);\r\n },\r\n text: t(translations.Edit) as string,\r\n title: t(translations.EditInvoicePayment) as string,\r\n icon: 'pencil-alt',\r\n } as RowActionsProps);\r\n }\r\n\r\n if (items.length > 0) {\r\n return (\r\n \r\n );\r\n } else {\r\n return undefined;\r\n }\r\n },\r\n ],\r\n [openEditPayment, t],\r\n );\r\n const selectedRowActions: SelectedRowsActionRenderer<\r\n IInvoicePayment\r\n >[] = useMemo(\r\n () => [\r\n (rows, onRefresh) => (\r\n {\r\n try {\r\n await httpClient.post(url + '/DeleteMany', {\r\n invoiceId,\r\n ids: rows.map(v => v.Id),\r\n });\r\n return {\r\n SuccessMessages: [t(translations.PaymentsDelete_success)],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n } catch {\r\n return {\r\n SuccessMessages: [],\r\n WarningMessages: [],\r\n ErrorMessages: [t(translations.PaymentsDelete_err)],\r\n };\r\n }\r\n }}\r\n />\r\n ),\r\n ],\r\n [invoiceId, t],\r\n );\r\n return (\r\n 0 ? rowActions : undefined}\r\n searchColumns={[\r\n 'CreatedByDN',\r\n 'CreatedBy',\r\n 'PaymentMethodName',\r\n 'Remarks',\r\n 'Reference',\r\n ]}\r\n additionalColumns={['CreatedBy']}\r\n />\r\n );\r\n};\r\n","import parse from 'html-react-parser';\r\nimport DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\nimport { IInvoicePayment } from './IInvoicePayment';\r\nimport { Link as MuiLink } from '@material-ui/core';\r\n\r\nexport const getColumns = (t: TFunction, openEdit?: (id: number) => void) => {\r\n const res: Column[] = [\r\n {\r\n accessor: 'Id',\r\n Header: t(translations.HashSymbol) as string,\r\n Cell: ({ value }) => {\r\n return !openEdit ? (\r\n <>{value}\r\n ) : (\r\n openEdit(value)}>{value}\r\n );\r\n },\r\n },\r\n {\r\n accessor: 'Date',\r\n Header: t(translations.Date) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'Amount',\r\n Header: t(translations.Amount) as string,\r\n Cell: ({ value }) => <>{value.toFixed(2)},\r\n },\r\n {\r\n accessor: 'PaymentMethodName',\r\n Header: t(translations.PaymentMethod) as string,\r\n },\r\n {\r\n accessor: 'CreatedByDN',\r\n Header: t(translations.CreatedBy) as string,\r\n Cell: ({ row: { original }, value }) => (\r\n \r\n {value}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'CreatedAt',\r\n Header: t(translations.CreatedAt) as string,\r\n Cell: DateRenderer,\r\n },\r\n {\r\n accessor: 'Remarks',\r\n Header: t(translations.Remarks) as string,\r\n Cell: ({ value }) => (!!value ? <>{parse(value)} : <>),\r\n },\r\n {\r\n accessor: 'Reference',\r\n Header: t(translations.Reference) as string,\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { filterHandler } from 'app/components/BasicTable/UnconfigurableTable/FilterHandler';\r\nimport { translations } from 'locales/translations';\r\nimport { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { UnconfigurableTable } from '../../../../components/BasicTable/UnconfigurableTable/UnconfigurableTable';\r\nimport { getColumns } from './Columns';\r\nimport { GetFilters } from './Filter';\r\nimport { IRowHistory } from './IRowHistory';\r\n\r\nexport interface InvoiceRowHistoryProps {\r\n invoiceId: number;\r\n}\r\nexport const RowHistory = ({ invoiceId }: InvoiceRowHistoryProps) => {\r\n const { t } = useTranslation();\r\n const columns = useMemo(() => getColumns(t), [t]);\r\n const url = '/api/odata/v4/InvoiceRowHistory';\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst TTable = filterHandler(UnconfigurableTable, GetFilters, {\r\n isSidePanel: true,\r\n});\r\n","import DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\nimport { IRowHistory } from './IRowHistory';\r\n\r\nexport const getColumns = (t: TFunction) => {\r\n const res: Column[] = [\r\n {\r\n accessor: 'InvoiceRowId',\r\n Header: t(translations.HashSymbol) as string,\r\n },\r\n {\r\n accessor: 'FieldName',\r\n Header: t(translations.Field) as string,\r\n },\r\n {\r\n accessor: 'OldValue',\r\n Header: t(translations.OldValue) as string,\r\n },\r\n {\r\n accessor: 'NewValue',\r\n Header: t(translations.NewValue) as string,\r\n },\r\n {\r\n accessor: 'DisplayName',\r\n Header: t(translations.User) as string,\r\n },\r\n {\r\n accessor: 'UpdatedAt',\r\n Header: t(translations.Date) as string,\r\n Cell: DateRenderer,\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport DatesRangeFilter from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport NumberFieldFilter from 'app/components/BasicTable/Filters/NumberFieldFilter';\r\nimport {\r\n getDefaultFilterDatePeriod,\r\n GetNumberOrUndefined,\r\n GetRawValue,\r\n presetDatesRangeToQueryString,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { translations } from 'locales/translations';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { IRowHistory } from './IRowHistory';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParams(search);\r\n const res: IFilterSettings[] = [\r\n {\r\n fieldName: 'UpdatedAt',\r\n displayName: t(translations.Period),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'st', 'et', params),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'period',\r\n 'st',\r\n 'et',\r\n ),\r\n component: DatesRangeFilter,\r\n urlKey: 'period',\r\n },\r\n {\r\n fieldName: 'InvoiceRowId',\r\n queryStringSerializer: 'rowId',\r\n displayName: t(translations.InvoiceRowId),\r\n operator: ODataOperators.Equals,\r\n value: GetNumberOrUndefined(GetRawValue(params, 'rowId')),\r\n component: NumberFieldFilter,\r\n },\r\n ];\r\n return res;\r\n};\r\n","import { Dialog, DialogActions, DialogContent } from '@material-ui/core';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { PageActionRenderer } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport { toURLSearchParams } from 'app/components/BasicTable/withSavedHistory';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { NotFoundPage } from 'app/pages/NotFoundPage';\r\nimport { InvoiceStatusPicker } from 'app/components/pickers/AutocompletePickers/InvoiceStatusPicker';\r\nimport { InvoiceTemplatePicker } from 'app/components/pickers/AutocompletePickers/InvoiceTemplatePicker';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useResponseModel } from 'app/hooks/useResponseModel';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n selectPublicUrl,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { translations } from 'locales/translations';\r\nimport { useCallback, useMemo, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { buildURL, openExportLink, toRootedURL } from 'utils/url-utils';\r\nimport { ChargeProps } from '../AddChargePage';\r\nimport { PaymentProps } from '../AddPaymentPage';\r\nimport { InvoiceComments } from './InvoiceComments';\r\nimport { InvoiceInReview } from './InvoiceInReview';\r\nimport { InvoiceRemarks } from './InvoiceRemarks';\r\nimport { ReadOnlyDetails } from './ReadOnly';\r\nimport { useInvoiceDetailsSlice } from './Slice';\r\nimport {\r\n selectActiveFilters,\r\n selectInvoice,\r\n selectLoading,\r\n selectNotFound,\r\n} from './Slice/selector';\r\nimport { DetailsTable } from './Tables/Details';\r\nimport { IInvoiceRow } from './Tables/Details/IInvoicRow';\r\nimport { InvoiceHistory } from './Tables/InvoiceHistory';\r\nimport { PayHistory } from './Tables/PayHistory';\r\nimport { PaymentTable } from './Tables/Payments';\r\nimport { RowHistory } from './Tables/RowHistory';\r\nimport { InvoiceIdMultiPicker } from 'app/components/pickers/AutocompletePickers/InvoiceIdMultiPicker';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nconst url = '/api/odata/v4/InvoiceDetails';\r\nexport interface InvoiceDetailsProps extends CoverProps, SidePanelContentProps {\r\n id: number;\r\n}\r\nexport const InvoiceDetails = ({\r\n id,\r\n useSidePanel,\r\n closeCover,\r\n isCover,\r\n}: InvoiceDetailsProps) => {\r\n const { t } = useTranslation();\r\n const loading = useSelector(selectLoading);\r\n const notFound = useSelector(selectNotFound);\r\n const filters = useSelector(selectActiveFilters);\r\n const dispatch = useDispatch();\r\n const { actions } = useInvoiceDetailsSlice();\r\n const { actions: appActions } = useAppSettingsSlice();\r\n const invoice = useSelector(selectInvoice);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const response = useResponseModel();\r\n const [deleteInvoiceOpen, setDeleteInvoiceOpen] = useState(false);\r\n const settings = useSelector(selectglobalSettings);\r\n const allowedFees = settings.GetString(AllowedSettings.AllowedFeeTypes);\r\n const isChargesAllowed = allowedFees && allowedFees.trim() !== '';\r\n useEffectOnMount(() => {\r\n dispatch(actions.reset());\r\n dispatch(actions.getInvoice(id));\r\n });\r\n const pagelink = useMemo(\r\n () => buildURL(`${publicUrl}Invoices/Details/${id}`, filters ?? {}),\r\n [filters, id, publicUrl],\r\n );\r\n const setfilterCallback = useCallback(\r\n (v: IFilterSettings[] | undefined) => {\r\n const res = {};\r\n if (!!v) {\r\n toURLSearchParams(v).forEach((val, name) => {\r\n res[name] = val;\r\n });\r\n }\r\n dispatch(actions.setFilters(!v || v.length === 0 ? undefined : res));\r\n },\r\n [actions, dispatch],\r\n );\r\n const [invoiceHistoryOpen, setInvoiceHistoryOpen] = useState(false);\r\n const [rowHistoryOpen, setRowHistoryOpen] = useState(false);\r\n const [payHistoryOpen, setPayHistoryOpen] = useState(false);\r\n const [updateStatusOpen, setUpdateStatusOpen] = useState(false);\r\n const [updateInvoiceTemplateOpen, setUpdateInvoiceTemplateOpen] = useState(\r\n false,\r\n );\r\n const [updateInvoiceIdsOpen, setUpdateInvoiceIdsOpen] = useState(false);\r\n // const [cover, setCover] = useState();\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState();\r\n const openNewCharge = useCallback(\r\n (chargProps: ChargeProps) => {\r\n openPanel({\r\n renderPageType: RenderPageType.AddCharge,\r\n renderPageProps: chargProps,\r\n expanded: false,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n // if (isSidePanel) {\r\n // setCover(\r\n // setCover(undefined)}\r\n // isCover\r\n // {...props}\r\n // />,\r\n // );\r\n // } else {\r\n // dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.AddCharge,\r\n // props,\r\n // }),\r\n // );\r\n // }\r\n },\r\n [openPanel, useSidePanel],\r\n );\r\n const openNewPayment = useCallback(\r\n (paymentProps: PaymentProps) => {\r\n openPanel({\r\n renderPageType: RenderPageType.AddPayment,\r\n renderPageProps: Object.assign({}, paymentProps, {\r\n userGroupId: invoice?.UserGroupId,\r\n }),\r\n expanded: false,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n // if (isSidePanel) {\r\n // setCover(\r\n // setCover(undefined)}\r\n // isCover\r\n // userGroupId={invoice?.UserGroupId}\r\n // {...props}\r\n // />,\r\n // );\r\n // } else {\r\n // dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.AddPayment,\r\n // props,\r\n // }),\r\n // );\r\n // }\r\n },\r\n [invoice?.UserGroupId, openPanel, useSidePanel],\r\n );\r\n const deletable = useMemo(() => !!invoice && !invoice.LastSentToBilling, [\r\n invoice,\r\n ]);\r\n const [newStatus, setNewStatus] = useState | null>(null);\r\n const [invoiceTemplate, setInvoiceTemplate] = useState | null>(\r\n null,\r\n );\r\n const [invoiceIds, setInvoiceIds] = useState[] | undefined>(\r\n undefined,\r\n );\r\n\r\n const deleteInvoice = useCallback(() => {\r\n if (deletable) {\r\n httpClient\r\n .delete(url + '(' + id + ')')\r\n .then((v: any) => {\r\n const value = v as IResponseType;\r\n if (value.ErrorMessages.length > 0) {\r\n response(value);\r\n } else {\r\n if (useSidePanel) {\r\n closePanel({\r\n useSidePanel: true,\r\n isCover: isCover,\r\n } as SidePanelCloseState);\r\n } else {\r\n dispatch(appActions.navigate(toRootedURL('/Billing')));\r\n }\r\n }\r\n })\r\n .catch(e => console.warn(e));\r\n }\r\n }, [\r\n appActions,\r\n closePanel,\r\n deletable,\r\n dispatch,\r\n id,\r\n isCover,\r\n response,\r\n useSidePanel,\r\n ]);\r\n const updateStatus = useCallback(\r\n (status: number) => {\r\n httpClient\r\n .post(url + '/UpdateStatus', {\r\n status,\r\n id,\r\n })\r\n .then(() => {\r\n dispatch(actions.getInvoice(id));\r\n })\r\n .catch(e => console.log(e));\r\n },\r\n [actions, dispatch, id],\r\n );\r\n\r\n const updateInvoiceTemplate = useCallback(\r\n (invoiceTemplateId: number) => {\r\n httpClient\r\n .post(url + '/UpdateInvoiceTemplate', {\r\n invoiceTemplateId,\r\n id,\r\n })\r\n .then(() => {\r\n dispatch(actions.getInvoice(id));\r\n })\r\n .catch(e => console.log(e));\r\n },\r\n [actions, dispatch, id],\r\n );\r\n\r\n const handlePreview = () => {\r\n if (!!invoiceIds) {\r\n const ids: string = invoiceIds.map(item => item.Id).join(',');\r\n var params = {\r\n ids: ids,\r\n };\r\n //BillingController->InvoiceExportPDFs - [Route(\"api/Billing/Invoices/InvoiceExportPDFs\")]\r\n const url = buildURL('api/Billing/Invoices/InvoiceExportPDFs', params);\r\n openExportLink(url);\r\n setInvoiceIds([]);\r\n }\r\n };\r\n\r\n const topButtons: ActionRenderer[] = useMemo(\r\n () => [\r\n () => {\r\n if (!isChargesAllowed) return undefined;\r\n return (\r\n \r\n openNewCharge({\r\n invoiceId: id,\r\n budget:\r\n invoice && invoice.BudgetId\r\n ? { Id: invoice.BudgetId, Name: invoice.BudgetNumber }\r\n : null,\r\n serviceGroup:\r\n authenticatedUser?.Roles?.includes(\r\n Roles.ServiceGroupBudgetsAdmin,\r\n ) && authenticatedUser.AdminServiceGroups.length === 1\r\n ? authenticatedUser.AdminServiceGroups[0]\r\n : null,\r\n serviceGroupPredicate:\r\n invoice &&\r\n invoice.ServiceGroups &&\r\n invoice.ServiceGroups.length > 0\r\n ? [\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n invoice.ServiceGroups,\r\n ),\r\n ]\r\n : undefined,\r\n })\r\n }\r\n />\r\n );\r\n },\r\n () => {\r\n return (\r\n setUpdateStatusOpen(true)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n />\r\n );\r\n },\r\n () => {\r\n return (\r\n setUpdateInvoiceTemplateOpen(true)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n />\r\n );\r\n },\r\n () => {\r\n return (\r\n setDeleteInvoiceOpen(true)}\r\n icon=\"trash\"\r\n startIcon=\"trash\"\r\n disabled={!deletable}\r\n size=\"small\"\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n />\r\n );\r\n },\r\n () => {\r\n return (\r\n setInvoiceHistoryOpen(true)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n />\r\n );\r\n },\r\n () => {\r\n return (\r\n setRowHistoryOpen(true)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n />\r\n );\r\n },\r\n () => {\r\n return (\r\n {\r\n let invoiceIdEntity: Entity = {\r\n Id: id,\r\n Name: id.toString(),\r\n };\r\n !!invoiceIdEntity\r\n ? setInvoiceIds([invoiceIdEntity])\r\n : setInvoiceIds([]);\r\n setUpdateInvoiceIdsOpen(true);\r\n }}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n />\r\n );\r\n },\r\n ],\r\n [\r\n authenticatedUser,\r\n isChargesAllowed,\r\n deletable,\r\n id,\r\n invoice,\r\n openNewCharge,\r\n t,\r\n ],\r\n );\r\n const paymentPageActions: PageActionRenderer[] = useMemo(\r\n () => [\r\n () => (\r\n \r\n openNewPayment({\r\n invoiceId: id,\r\n budget:\r\n invoice && invoice.BudgetId\r\n ? { Id: invoice.BudgetId, Name: invoice.BudgetNumber }\r\n : null,\r\n serviceGroup: null,\r\n serviceGroupPredicate:\r\n invoice &&\r\n invoice.ServiceGroups &&\r\n invoice.ServiceGroups.length > 0\r\n ? [\r\n new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n invoice.ServiceGroups,\r\n ),\r\n ]\r\n : undefined,\r\n })\r\n }\r\n />\r\n ),\r\n () => (\r\n setPayHistoryOpen(true)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />,\r\n ]}\r\n />\r\n ),\r\n ],\r\n [id, invoice, openNewPayment, t],\r\n );\r\n if (notFound) {\r\n return ;\r\n }\r\n return (\r\n {t(translations.Invoices)}\r\n }\r\n titlePage={`${t(translations.Invoices)} #${id}`}\r\n closable\r\n disableExpandToggle\r\n rightTopActions={topButtons}\r\n cover={cover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n isCover={isCover}\r\n coverClosed={coverClosed}\r\n children={\r\n \r\n \r\n setUpdateStatusOpen(true)}\r\n openChangeInvoiceTemplate={() => setUpdateInvoiceTemplateOpen(true)}\r\n />\r\n \r\n openNewCharge({\r\n invoiceId: id,\r\n rowId: rowId,\r\n budget: null,\r\n serviceGroup: null,\r\n })\r\n }\r\n />\r\n {\r\n openNewPayment({\r\n invoiceId: id,\r\n paymentId: PayId,\r\n budget: null,\r\n serviceGroup: null,\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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setNewStatus(v)}\r\n />\r\n }\r\n confirmButtonLabel={t(translations.UpdateInvoiceStatus)}\r\n onConfirm={() => {\r\n updateStatus(newStatus?.Id ?? -1);\r\n setUpdateStatusOpen(false);\r\n }}\r\n disabled={!newStatus}\r\n onCancel={() => setUpdateStatusOpen(false)}\r\n isOpen={updateStatusOpen}\r\n />\r\n setInvoiceTemplate(v)}\r\n />\r\n }\r\n confirmButtonLabel={t(translations.UpdateInvoiceTemplate)}\r\n onConfirm={() => {\r\n updateInvoiceTemplate(invoiceTemplate?.Id ?? -1);\r\n setUpdateInvoiceTemplateOpen(false);\r\n }}\r\n disabled={!invoiceTemplate}\r\n onCancel={() => setUpdateInvoiceTemplateOpen(false)}\r\n isOpen={updateInvoiceTemplateOpen}\r\n />\r\n setInvoiceIds(v)}\r\n />\r\n }\r\n confirmButtonLabel={t(translations.Preview)}\r\n onConfirm={() => {\r\n handlePreview();\r\n setUpdateInvoiceIdsOpen(false);\r\n }}\r\n onClose={() => setInvoiceIds([])}\r\n disabled={\r\n invoiceIds === null ||\r\n invoiceIds === undefined ||\r\n invoiceIds.length === 0\r\n }\r\n onCancel={() => {\r\n setUpdateInvoiceIdsOpen(false);\r\n setInvoiceIds([]);\r\n }}\r\n isOpen={updateInvoiceIdsOpen}\r\n />\r\n setDeleteInvoiceOpen(false)}\r\n disabled={!deletable}\r\n />\r\n \r\n }\r\n />\r\n );\r\n};\r\n\r\nexport const InvoiceDetailsUrl = url;\r\n","import { Box, MenuItem } from '@material-ui/core';\r\nimport { IWorkOrderTypeStatusDto } from 'api/odata/generated/entities/IWorkOrderTypeStatusDto';\r\nimport { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface SaveFormButtonProps extends ButtonProps {\r\n edit: boolean;\r\n text: string;\r\n onClick: (e: any) => void;\r\n}\r\nexport interface CloseWorkOrderButtonProps extends ButtonProps {\r\n text: string;\r\n closedStatuses: IWorkOrderTypeStatusDto[];\r\n handleClose: (e: any, status: IWorkOrderTypeStatusDto) => void;\r\n body?: string;\r\n}\r\nexport interface ReopenOrderButtonProps extends ButtonProps {\r\n text: string;\r\n handleOpen: (e: any) => void;\r\n}\r\nexport interface DeleteButtonProps extends ButtonProps {\r\n text: string;\r\n handleDelete: (e: any) => void;\r\n}\r\n\r\nexport function SaveFormButton({\r\n edit,\r\n text,\r\n onClick,\r\n ...props\r\n}: SaveFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function ReopenOrderButton({\r\n text,\r\n handleOpen,\r\n ...props\r\n}: ReopenOrderButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\nexport function DeleteOrderButton({\r\n text,\r\n handleDelete,\r\n ...props\r\n}: DeleteButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport function CloseWorkOrderButton({\r\n text,\r\n closedStatuses,\r\n handleClose,\r\n ...props\r\n}: CloseWorkOrderButtonProps) {\r\n //PROPS\r\n const { t } = useTranslation();\r\n\r\n //STATES\r\n const [open, setOpen] = React.useState(false);\r\n const [closedStatus, setClosedStatus] = React.useState<\r\n IWorkOrderTypeStatusDto | undefined\r\n >(undefined);\r\n const useOpen = React.useMemo(() => {\r\n return open;\r\n }, [open]);\r\n //RENDER\r\n return (\r\n \r\n {closedStatuses.length === 1 ? (\r\n {\r\n setOpen(true);\r\n setClosedStatus(closedStatuses[0]);\r\n }}\r\n >\r\n {text}\r\n \r\n ) : (\r\n \r\n closedStatuses.map(s => (\r\n \r\n {\r\n setOpen(true);\r\n setClosedStatus(s);\r\n }}\r\n >\r\n {s.Name}\r\n \r\n \r\n ))\r\n }\r\n menuProps={{\r\n anchorOrigin: {\r\n vertical: 'top',\r\n horizontal: 'center',\r\n },\r\n transformOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'center',\r\n },\r\n }}\r\n addChevron\r\n {...props}\r\n >\r\n {text}\r\n \r\n )}\r\n {useOpen && (\r\n {\r\n if (!!closedStatus) {\r\n handleClose(e, closedStatus);\r\n }\r\n }}\r\n onCancel={() => {\r\n setClosedStatus(undefined);\r\n setOpen(false);\r\n }}\r\n onClose={() => {\r\n setClosedStatus(undefined);\r\n setOpen(false);\r\n }}\r\n maxWidth=\"md\"\r\n />\r\n )}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { WorkOrderTypePicker } from '../pickers/AutocompletePickers/WorkOrderTypePicker';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\n\r\nexport const FormWorkOrderTypePicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n disabled={props.disabled}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n predicates={props.predicates}\r\n fullWidth={props.fullWidth}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * AssetCatGroupPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IWorkOrderTypeStatusDto } from 'api/odata/generated/entities/IWorkOrderTypeStatusDto';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\n\r\nimport * as React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nexport interface IWorkOrderTypeStatusParamsPicker {\r\n typeId?: number;\r\n onlyNew?: boolean;\r\n}\r\nexport interface WorkOrderTypeStatusPickerProps\r\n extends Omit>, 'loadData'>,\r\n IWorkOrderTypeStatusParamsPicker {}\r\n\r\nconst url = '/api/odata/v4/WorkOrderStatus';\r\nexport const initWOTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Order asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select:\r\n 'Id,Name,Order,New,Closed,StatusId,WorkOrderTypeId,StatusName,Status',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nexport function withParamsFilter(\r\n typeId: number | undefined,\r\n onlyNew: boolean | undefined,\r\n) {\r\n if (typeId === undefined) {\r\n return (searchTerm: string | null) =>\r\n new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string; $select?: string } = {\r\n $orderby: 'Order asc',\r\n $select:\r\n 'Id,Name,Order,New,Closed,StatusId,WorkOrderTypeId,StatusName,Status',\r\n };\r\n const predicates: (string | Condition)[] = [];\r\n predicates.push(\r\n new Condition('WorkOrderTypeId', ODataOperators.Equals, typeId),\r\n );\r\n if (onlyNew !== undefined) {\r\n predicates.push(new Condition('New', ODataOperators.Equals, true));\r\n }\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm === null ? undefined : searchTerm,\r\n globalServiceGroupFilter: [],\r\n }).toString();\r\n return httpClient\r\n .get(url, params)\r\n .then(\r\n response =>\r\n (response.value as IWorkOrderTypeStatusDto[]) as Entity[],\r\n );\r\n };\r\n }\r\n}\r\nexport function WorkOrderTypeStatusPicker(\r\n props: WorkOrderTypeStatusPickerProps,\r\n) {\r\n const loadData = withParamsFilter(props.typeId, props.onlyNew);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport {\r\n IWorkOrderTypeStatusParamsPicker,\r\n WorkOrderTypeStatusPicker,\r\n} from '../pickers/AutocompletePickers/WorkOrderTypeStatusPicker';\r\n\r\nexport const FormWorkOrderTypeStatusPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps &\r\n IWorkOrderTypeStatusParamsPicker) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { RemindBeforePicker } from '../pickers/StaticOptionsPickers/RemindBeforePicker';\r\n\r\nexport const FormRemindBeforePicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * SymptomCodesPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ISymptomCodeDto } from 'api/odata/generated/entities/ISymptomCodeDto';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\n\r\nimport * as React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nexport interface ISymptomCodesParamsPicker {\r\n AssetCats?: number[];\r\n}\r\nexport interface SymptomCodesPickerProps\r\n extends Omit>, 'loadData'>,\r\n ISymptomCodesParamsPicker {}\r\n\r\nconst url = '/api/odata/v4/SymptomCodes';\r\nexport const initSymptomCodesData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: `Id,Name,Active,AssetCatId,AssetCatName`,\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nexport function withParamsFilter(AssetCats: number[] | undefined) {\r\n if (!AssetCats || AssetCats.length < 1) {\r\n return (searchTerm: string | null) =>\r\n new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n }\r\n return (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string; $select?: string } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name,Active,AssetCatId,AssetCatName',\r\n };\r\n const predicates: (string | Condition)[] = [];\r\n if (AssetCats !== undefined && AssetCats.length > 0) {\r\n AssetCats.forEach(a =>\r\n predicates.push(new Condition('AssetCatId', ODataOperators.Equals, a)),\r\n );\r\n }\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm === null ? undefined : searchTerm,\r\n globalServiceGroupFilter: [],\r\n }).toString();\r\n return httpClient\r\n .get(url, params)\r\n .then(\r\n response => (response.value as ISymptomCodeDto[]) as Entity[],\r\n );\r\n };\r\n}\r\nexport function SymptomCodesPicker(props: SymptomCodesPickerProps) {\r\n const loadData = withParamsFilter(props.AssetCats);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FormSymptomCodesPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport {\r\n ISymptomCodesParamsPicker,\r\n SymptomCodesPicker,\r\n} from '../pickers/AutocompletePickers/SymptomCodesPicker';\r\n\r\nexport const FormSymptomCodesPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps &\r\n ISymptomCodesParamsPicker) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * SymptomCodesPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IRepairCodeDto } from 'api/odata/generated/entities/IRepairCodeDto';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\n\r\nimport * as React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\nexport interface IRepairCodesParamsPicker {\r\n AssetCatIds?: number[];\r\n}\r\nexport interface RepairCodesPickerProps\r\n extends Omit>, 'loadData'>,\r\n IRepairCodesParamsPicker {}\r\n\r\nconst url = '/api/odata/v4/RepairCodes';\r\nexport const initRepairCodesData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: `Id,Name,Active,AssetCatId,AssetCatName`,\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nexport function withParamsFilter(AssetCatIds: number[] | undefined) {\r\n return (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string; $select?: string } = {\r\n $orderby: 'Name asc',\r\n $select: 'Id,Name,Active,AssetCatId,AssetCatName',\r\n };\r\n const predicates: (string | Condition)[] = [];\r\n if (AssetCatIds !== undefined && AssetCatIds.length > 0) {\r\n predicates.push(\r\n AssetCatIds.map(ac =>\r\n new Condition('AssetCatId', ODataOperators.Equals, ac).toString(),\r\n ).join(' or '),\r\n );\r\n }\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm === null ? undefined : searchTerm,\r\n globalServiceGroupFilter: [],\r\n }).toString();\r\n return httpClient\r\n .get(url, params)\r\n .then(\r\n response => (response.value as IRepairCodeDto[]) as Entity[],\r\n );\r\n };\r\n}\r\nexport function RepairCodesPicker(props: RepairCodesPickerProps) {\r\n const loadData = withParamsFilter(props.AssetCatIds);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FormRepairCodesPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport {\r\n IRepairCodesParamsPicker,\r\n RepairCodesPicker,\r\n} from '../pickers/AutocompletePickers/RepairCodesPicker';\r\n\r\nexport const FormRepairCodesPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps &\r\n IRepairCodesParamsPicker) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * SymptomCodesPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\n\r\nimport * as React from 'react';\r\n\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface ReasonTypePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/ReasonType';\r\nexport const initReasonTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: `Id,Name`,\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nconst loadData = (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n if (searchTerm !== null) {\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: [],\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm,\r\n }).toString();\r\n }\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n};\r\nexport function ReasonTypePicker(props: ReasonTypePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport { ReasonTypePicker } from '../pickers/AutocompletePickers/ReasonTypePicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport const FormReasonTypePicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gridGap: '4px',\r\n padding: '0',\r\n width: '100%',\r\n },\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gridGap: '16px',\r\n padding: '16px 0px',\r\n //boxShadow: 'inset 0px -1px 0px #E0E5EC',\r\n width: '100%',\r\n },\r\n row: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '0',\r\n width: 'inherit',\r\n },\r\n }),\r\n);\r\n","import { Box } from '@material-ui/core';\r\nimport { Body } from 'app/components/Typography';\r\nimport { ReservationEditButton } from 'app/components/ReservationEditButton';\r\nimport { selectglobalSettings } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { WorkOrderReadonlyState } from '../slice/types';\r\nimport { useStyles } from './styles';\r\n\r\nexport interface CreationDetailsProps {\r\n details: WorkOrderReadonlyState;\r\n}\r\n\r\nexport function CreationDetails(props: CreationDetailsProps) {\r\n const { details } = props;\r\n const globalSettings = useSelector(selectglobalSettings);\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n return (\r\n \r\n \r\n {t(translations.WorkOrderAdvancedDetails)}\r\n \r\n \r\n {t(translations.ReportedBy)}\r\n \r\n {details.ReportedByDisplayName}\r\n \r\n \r\n \r\n {t(translations.ReportedDate)}\r\n \r\n {dateUtils.longDateTimeFormat(details.CreateDate)}\r\n \r\n \r\n \r\n {t(translations.LastUpdated)}\r\n \r\n {dateUtils.longDateTimeFormat(details.LastUpdated) ?? 'N/A'}\r\n \r\n \r\n \r\n {t(translations.AlertType)}\r\n \r\n {details.AlertType ?? 'N/A'}\r\n \r\n \r\n \r\n {t(translations.EventTypeStatus)}\r\n \r\n {details.StatusName ?? 'N/A'}\r\n \r\n \r\n \r\n {t(translations.ClosedAt)}\r\n \r\n {dateUtils.longDateTimeFormat(details.DoneDate) ||\r\n t(translations.WorkStillInProgress)}\r\n \r\n \r\n \r\n {t(translations.ClosedBy)}\r\n \r\n {details.DoneBy ?? 'N/A'}\r\n \r\n \r\n {details.Reservation !== null && (\r\n \r\n {t(translations.Reservation)}\r\n \r\n {`# ${details.Reservation}`}\r\n \r\n \r\n )}\r\n {globalSettings.GetBooleanByKey(AllowedSettings.AssetCatEnabled) &&\r\n !isNullOrUndefined(details.AssetCatName) && (\r\n \r\n {t(translations.AssetCatName)}\r\n {`${details.AssetCatName} - ${\r\n details.InternalServiceAvaliable\r\n ? t(translations.InternalServiceAvaliable)\r\n : ''\r\n }`}\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n}\r\n","import { Box } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { FormLabelText } from 'app/components/Forms/FormLabelText';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nexport interface FormUnlimitedDowntimeProps {\r\n onClick: () => void;\r\n}\r\nexport function FormUnlimitedDowntime(props: FormUnlimitedDowntimeProps) {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n \r\n \r\n \r\n }\r\n />\r\n );\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { quoteODataValue } from 'api/odata/ODataFilter';\r\nimport {\r\n BaseURLPicker,\r\n BaseURLPickerProps,\r\n} from 'app/components/BasicPickers/BaseURLPicker';\r\nimport { CustomFormTypeEnum } from 'enums/CustomFormType';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nexport interface CustomFormPickerProps\r\n extends Omit>, 'url' | 'queryfilter'> {\r\n formType: CustomFormTypeEnum;\r\n referenceId?: number;\r\n filter?: string;\r\n}\r\n\r\nexport const initCustomFormData = (\r\n initval: string | undefined,\r\n type: CustomFormTypeEnum,\r\n) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const url = `/api/odata/v4/CustomForm(${type})`;\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,FormFields,ServiceGroups,Active,Type',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nexport function AlertFormFilter(\r\n alertTypeId: number,\r\n assetCatId: number,\r\n): string | undefined {\r\n let filter = `(WorkOrderFormMatrices/any(m: m/AlertTypeId eq ${quoteODataValue(\r\n alertTypeId,\r\n )} and m/AssetCatId eq ${assetCatId}))`;\r\n return filter;\r\n}\r\nexport function CustomFormPicker(props: CustomFormPickerProps) {\r\n const { filter, formType } = props;\r\n const url = `/api/odata/v4/CustomForm(${formType})`;\r\n return (\r\n \r\n );\r\n}\r\n","import { CustomFormTypeEnum } from 'enums/CustomFormType';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport { CustomFormPicker } from '../pickers/AutocompletePickers/CustomFormPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport const FormCustomFormPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps & { formType: CustomFormTypeEnum }) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","import { CommentsApi } from 'api/CommentsApi';\r\nimport {\r\n ConvertNewToComment,\r\n IComment,\r\n NewComment,\r\n} from 'app/components/CommentsContainer/IComment';\r\nimport { selectPublicUrl } from 'app/slice/selectors';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport * as React from 'react';\r\nimport { WorkOrderDetailsState } from '../slice/types';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { CommentsContainer } from 'app/components/CommentsContainer';\r\nimport { translations } from 'locales/translations';\r\nimport { buildURL } from 'utils/url-utils';\r\nimport { Portal } from '@material-ui/core';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { selectCreatedOrders, selectSaveNewComments } from '../slice/selectors';\r\nimport { useWorkOrderSlice } from '../slice';\r\nimport { useUploadToNewComment } from 'app/components/LargeFilesUpload/Components/useUploadToNewComment';\r\nimport { useLargeFilesUploadSlice } from 'app/components/LargeFilesUpload/slice';\r\n\r\nexport interface WorkOrderCommentsProps {\r\n isAdmin?: boolean;\r\n order: WorkOrderDetailsState;\r\n disabled?: boolean;\r\n commentsFormRef: React.MutableRefObject;\r\n isEdit?: boolean;\r\n user?: AuthenticatedUser;\r\n sectionTitle?: React.ReactNode;\r\n}\r\n\r\nexport const WorkOrderComments = (props: WorkOrderCommentsProps) => {\r\n const {\r\n order,\r\n isAdmin,\r\n disabled,\r\n commentsFormRef,\r\n isEdit,\r\n user,\r\n sectionTitle,\r\n } = props;\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const { t } = useTranslation();\r\n const { newDate } = useSystemDate();\r\n const dispatch = useDispatch();\r\n const { actions: workOrderActions } = useWorkOrderSlice();\r\n const doSaveComments = useSelector(selectSaveNewComments);\r\n const createdOrders = useSelector(selectCreatedOrders);\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const [changed, setchanged] = React.useState(false);\r\n const [newSavedComments, setNewSavedComments] = React.useState(\r\n [],\r\n );\r\n const [newComments, setNewComments] = React.useState([]);\r\n const comments = useAsyncGetWthEffect(\r\n () => CommentsApi.GetComments(CommentReferenceTypes.Alerts, order.Id),\r\n [],\r\n [changed],\r\n );\r\n const saveComments = async (\r\n comments: NewComment[],\r\n referenceIds: number[],\r\n ): Promise => {\r\n var result = await Promise.all(\r\n comments.map(async item => {\r\n referenceIds.map(refId => {\r\n try {\r\n return CommentsApi.SendComment(\r\n CommentReferenceTypes.Alerts,\r\n refId,\r\n item,\r\n );\r\n } catch {\r\n return item;\r\n }\r\n });\r\n }),\r\n );\r\n return result;\r\n };\r\n const bindSubmitComment = React.useCallback(\r\n submitForm => {\r\n commentsFormRef.current = submitForm;\r\n },\r\n [commentsFormRef],\r\n );\r\n React.useEffect(() => {\r\n if (doSaveComments === true && createdOrders.length > 0) {\r\n saveComments(newSavedComments, createdOrders);\r\n dispatch(workOrderActions.setSaveNewComments(undefined));\r\n dispatch(workOrderActions.setOrderNumbers([]));\r\n }\r\n }, [\r\n createdOrders,\r\n dispatch,\r\n doSaveComments,\r\n newSavedComments,\r\n workOrderActions,\r\n ]);\r\n const { onCommentAdded } = useUploadToNewComment();\r\n React.useEffect(() => {\r\n dispatch(\r\n largeFileActions.setCommentProperties({\r\n commentType: CommentReferenceTypes.Alerts,\r\n referenceId: order.Id,\r\n }),\r\n );\r\n }, [dispatch, largeFileActions, order.Id]);\r\n\r\n const portalRef = React.useRef(null);\r\n return (\r\n \r\n
    \r\n \r\n {\r\n if (!disabled) {\r\n if (isEdit) {\r\n CommentsApi.SendComment(\r\n CommentReferenceTypes.Alerts,\r\n order.Id,\r\n c,\r\n )\r\n .then(res => onCommentAdded?.(res))\r\n .finally(() => setchanged(prev => !prev));\r\n } else {\r\n setNewSavedComments(() => [...newSavedComments, c]);\r\n setNewComments(() => [\r\n ...newComments,\r\n ConvertNewToComment(c, newComments.length + 1, newDate(), {\r\n Id: user?.Id || '',\r\n Name: user?.Name || '',\r\n }),\r\n ]);\r\n }\r\n }\r\n }}\r\n isAdmin={isAdmin}\r\n withMentions\r\n pageName={t(translations.menu_EditWorkOrder)}\r\n referenceName={order.Id.toString()}\r\n linkUrl={buildURL(`${publicUrl}workorders/details/${order.Id}`, {})}\r\n emailType={'Alert'}\r\n />\r\n \r\n \r\n );\r\n};\r\n","import Box from '@material-ui/core/Box';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Popover from '@material-ui/core/Popover';\r\nimport { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Body } from 'app/components/Typography';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n bindPopover,\r\n bindTrigger,\r\n usePopupState,\r\n} from 'material-ui-popup-state/hooks';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as React from 'react';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { AssetsFilterForCalibrationWorkOrder } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { AssetPicker } from 'app/components/pickers/AutocompletePickers/AssetPicker';\r\nimport { Divider } from '@material-ui/core';\r\nimport {\r\n filteredWorkOrderTypes,\r\n initWOTypeData,\r\n WorkOrderTypePicker,\r\n} from 'app/components/pickers/AutocompletePickers/WorkOrderTypePicker';\r\nimport {\r\n WorkOrderPicker,\r\n WorkOrdersCalibrationFilter,\r\n} from 'app/components/pickers/AutocompletePickers/WorkOrdersPicker';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\n\r\nexport interface AddCalibrationWorkOrderProps {\r\n saveLinkedOrders: (order: IWorkOrderDetailsDto) => void;\r\n workOrederTypeId?: number;\r\n workOrederIds?: number[];\r\n showProcessing?: boolean;\r\n}\r\n\r\nexport function AddCalibrationWorkOrder(props: AddCalibrationWorkOrderProps) {\r\n const { t } = useTranslation();\r\n\r\n const {\r\n workOrederIds,\r\n workOrederTypeId,\r\n saveLinkedOrders,\r\n showProcessing,\r\n } = props;\r\n const [asset, setAsset] = useAsyncExtendedState(null);\r\n\r\n const [workOrder, setWorkOrder] = React.useState(\r\n null,\r\n );\r\n const [\r\n workOrderType,\r\n setWorkOrderType,\r\n ] = useAsyncExtendedState(null);\r\n\r\n const popupState = usePopupState({\r\n variant: 'popover',\r\n popupId: 'workOrderTypeSelection',\r\n });\r\n const fetchWorkOrderType = async (woId?: number) =>\r\n initWOTypeData(woId === undefined ? undefined : '' + woId).then(\r\n data => (data[0] as IWorkOrderTypeDto) ?? null,\r\n );\r\n useEffectOnMount(() => {\r\n if (workOrederTypeId) {\r\n setWorkOrderType(fetchWorkOrderType(workOrederTypeId));\r\n }\r\n return () => {};\r\n });\r\n const handleAssetChange = React.useCallback(\r\n (value: IAssetDto | null) => {\r\n setAsset(value);\r\n },\r\n [setAsset],\r\n );\r\n const handleWorkTypeChange = React.useCallback(\r\n (value: IWorkOrderTypeDto | null) => {\r\n setWorkOrderType(value);\r\n },\r\n [setWorkOrderType],\r\n );\r\n const handleWorkOrderChange = React.useCallback(\r\n (value: IWorkOrderDetailsDto | null) => {\r\n setWorkOrder(value);\r\n },\r\n [],\r\n );\r\n const handleSaveLinked = (value: IWorkOrderDetailsDto | null) => {\r\n if (value !== null) {\r\n saveLinkedOrders(value);\r\n popupState.close();\r\n }\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 \r\n \r\n \r\n {t(translations.AddCalibrationReference)}\r\n \r\n {\r\n popupState.close();\r\n setAsset(null);\r\n setWorkOrderType(null);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n handleWorkTypeChange(value as IWorkOrderTypeDto);\r\n }}\r\n fullWidth={true}\r\n id=\"wotype-id\"\r\n value={workOrderType}\r\n />\r\n \r\n \r\n {\r\n handleAssetChange(value);\r\n }}\r\n placeholder={t(translations.QuickWorkOrderPleaseSelectAssets)}\r\n fullWidth={true}\r\n name=\"assets\"\r\n variant=\"filled\"\r\n id=\"asset-id\"\r\n showOnlyActiveAssets={true}\r\n label={t(translations.Asset)}\r\n value={asset || undefined}\r\n />\r\n \r\n\r\n \r\n {\r\n handleWorkOrderChange(value);\r\n }}\r\n predicates={WorkOrdersCalibrationFilter(\r\n asset?.Id,\r\n workOrderType?.Id,\r\n workOrederIds,\r\n )}\r\n fullWidth={true}\r\n id=\"wo-id\"\r\n />\r\n \r\n \r\n \r\n handleSaveLinked(workOrder)}\r\n >\r\n {t(translations.LinkWorkOrder)}\r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n","import { IconProp } from 'app/AllIcons';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Entity } from 'types/common';\r\nimport * as React from 'react';\r\n\r\nexport interface HoverLinkedItemProps {\r\n linked: Entity;\r\n children: React.ReactChild;\r\n onHoverClick?: (linked: Entity) => void;\r\n useHoverButton?: boolean;\r\n hoverIcon?: IconProp;\r\n}\r\n\r\nexport function HoverLinkedItem(props: HoverLinkedItemProps) {\r\n const { linked, children, useHoverButton, onHoverClick, hoverIcon } = props;\r\n\r\n const [hover, setHover] = React.useState(false);\r\n return (\r\n setHover(true)}\r\n onMouseLeave={() => setHover(false)}\r\n >\r\n {children}\r\n {useHoverButton && hover && (\r\n !!onHoverClick && onHoverClick(linked)}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n","import Collapse from '@material-ui/core/Collapse';\r\nimport List from '@material-ui/core/List';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { Entity } from 'types/common';\r\nimport * as React from 'react';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport { Box, LinearProgress, ListItem, ListItemText } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { HoverLinkedItem } from './HoverLinkItem';\r\nimport { translations } from 'locales/translations';\r\nimport { Body } from 'app/components/Typography';\r\nimport { useTranslation } from 'react-i18next';\r\nimport cliTruncate from 'cli-truncate';\r\n\r\nexport interface LinkedList extends Entity {\r\n Id: number;\r\n Name: string;\r\n ParentId: number;\r\n Linked: LinkedList[];\r\n}\r\nexport interface WorkOrderLinksCollapsedProps {\r\n links: LinkedList[];\r\n hoverIcon?: IconProp;\r\n onHoverClick?: (linked: LinkedList) => void;\r\n onItemClcik?: (linked: Entity) => void;\r\n}\r\n\r\nexport function WorkOrderLinksCollapsed(props: WorkOrderLinksCollapsedProps) {\r\n const { links, hoverIcon, onHoverClick, onItemClcik } = props;\r\n const { t } = useTranslation();\r\n return (\r\n {t(translations.AllLinkedWorkOrders)}}\r\n >\r\n {links.map(link => (\r\n \r\n ))}\r\n \r\n );\r\n}\r\nexport interface HoverLinkedItemsProps {\r\n linked: LinkedList;\r\n onHoverClick?: (linked: LinkedList) => void;\r\n onItemClcik?: (linked: Entity) => void;\r\n hoverIcon?: IconProp;\r\n}\r\n\r\nexport function HoverLinkedCollapsedItems(props: HoverLinkedItemsProps) {\r\n const { linked, onHoverClick, onItemClcik, hoverIcon } = props;\r\n\r\n const [open, setOpen] = React.useState(false);\r\n return linked.Linked.length > 0 ? (\r\n \r\n setOpen(!open)}\r\n style={{ cursor: 'pointer' }}\r\n disableGutters\r\n >\r\n \r\n {}\r\n \r\n \r\n {cliTruncate(linked.Name, 32, { position: 'middle' })}\r\n \r\n \r\n {}\r\n \r\n \r\n \r\n {/* */}\r\n \r\n {linked.Linked.map((item, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n {}\r\n \r\n !!onHoverClick && onHoverClick(linked)}\r\n >\r\n !!onItemClcik && onItemClcik(linked)}\r\n >\r\n {cliTruncate(linked.Name, 32, { position: 'middle' })}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport function HoverLinkedItems(props: HoverLinkedItemsProps) {\r\n const { linked, onHoverClick, onItemClcik, hoverIcon } = props;\r\n\r\n return linked.Linked.length > 0 ? (\r\n \r\n \r\n \r\n {}\r\n \r\n !!onHoverClick && onHoverClick(linked)}\r\n >\r\n !!onItemClcik && onItemClcik(linked)}\r\n >\r\n {cliTruncate(linked.Name, 32, { position: 'middle' })}\r\n \r\n \r\n \r\n \r\n {linked.Linked.map((item, index) => (\r\n \r\n ))}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {}\r\n \r\n !!onHoverClick && onHoverClick(linked)}\r\n >\r\n !!onItemClcik && onItemClcik(linked)}\r\n >\r\n {cliTruncate(linked.Name, 32, { position: 'middle' })}\r\n \r\n \r\n \r\n );\r\n}\r\nexport interface WorkOrderLinksProps {\r\n links: LinkedList[];\r\n hoverIcon?: IconProp;\r\n onHoverClick?: (linked: LinkedList) => void;\r\n onItemClcik?: (linked: Entity) => void;\r\n showProcessing?: boolean;\r\n}\r\nconst getLength = (link: LinkedList) => {\r\n let count = link.Linked.length;\r\n if (link.Linked.length > 0) {\r\n link.Linked.forEach(item => {\r\n count += getLength(item);\r\n });\r\n }\r\n return count;\r\n};\r\nexport function WorkOrderLinks(props: WorkOrderLinksProps) {\r\n const { links, hoverIcon, onHoverClick, onItemClcik, showProcessing } = props;\r\n const { t } = useTranslation();\r\n const [open, setOpen] = React.useState(true);\r\n const countLinks = React.useMemo(() => {\r\n let count = links.length;\r\n if (links.length > 0) {\r\n links.forEach(item => {\r\n count += getLength(item);\r\n });\r\n }\r\n return count;\r\n }, [links]);\r\n return (\r\n \r\n \r\n setOpen(!open)}\r\n style={{ cursor: 'pointer' }}\r\n disableGutters\r\n >\r\n \r\n {\r\n \r\n {t(translations.LinkedWorkOrders).replace(\r\n '{0}',\r\n countLinks.toString(),\r\n )}\r\n \r\n }\r\n \r\n \r\n {}\r\n \r\n \r\n {showProcessing && (\r\n \r\n \r\n \r\n )}\r\n \r\n {/* */}\r\n \r\n {links.map((item, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { useTranslation } from 'react-i18next';\r\nimport {\r\n getAlertStart,\r\n WorkOrderDetailsState,\r\n WorkOrderReadonlyState,\r\n} from '../slice/types';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { FormAssetsPicker } from 'app/components/Forms/FormAssetsPicker';\r\nimport { FormWorkOrderTypePicker } from 'app/components/Forms/FormWorkOrderTypePicker';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { FormWorkOrderTypeStatusPicker } from 'app/components/Forms/FormWorkOrderTypeStatusPicker';\r\nimport { FormRemindBeforePicker } from 'app/components/Forms/FormRemindBeforePicker';\r\nimport { FormSymptomCodesPicker } from 'app/components/Forms/FormSymptomCodesPicker';\r\nimport { FormRepairCodesPicker } from 'app/components/Forms/FormRepairCodesPicker';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { Formik, FormikProps } from 'formik';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRightSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport {\r\n FieldHandler,\r\n FormListener,\r\n} from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport {\r\n IAssetDto,\r\n mapAssetsToServiceFilterDto,\r\n} from 'api/odata/generated/entities/IAssetDto';\r\nimport { FormSwitch } from 'app/components/Forms/Switch';\r\nimport { FormReasonTypePicker } from 'app/components/Forms/FormReasonTypePicker';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { FormAdminUsersPicker } from 'app/components/Forms/FormAdminUserPicker';\r\nimport { getWorkOrdersShema } from './validationSchema';\r\nimport { AssetsFilterForWorkOrder } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { dateUtils, WeekStartsOn } from 'utils/date-utils';\r\nimport { initReasonTypeData } from 'app/components/pickers/AutocompletePickers/ReasonTypePicker';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectSystemFirstDayOfWeek } from 'app/slice/selectors';\r\nimport { GetAutoCreateTitle } from 'types/IRepetitiveDto';\r\nimport { getSingleReminder } from 'app/components/pickers/StaticOptionsPickers/RemindBeforePicker';\r\nimport { Entity } from 'types/common';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { RepetitiveControl } from 'app/components/Forms/FormRepetitive/RepetitiveControl';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { CreationDetails } from '../CreationDetails';\r\nimport { FormUnlimitedDowntime } from './FormUnlimitedDowntime';\r\nimport { CustomFormControl } from '../../../../../components/CustomForm/CusomFormControl';\r\nimport { CustomFormTypeEnum } from 'enums/CustomFormType';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { FormCustomFormPicker } from 'app/components/Forms/FormCustomFormPicker';\r\nimport { AlertFormFilter } from 'app/components/pickers/AutocompletePickers/CustomFormPicker';\r\nimport { WorkOrderComments } from './WorkOrderComments';\r\nimport { isEmpty } from 'lodash';\r\nimport { RepetitiveFor } from 'app/components/Forms/FormRepetitive/slice/types';\r\n\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { WorkOrderDetailsProps } from '..';\r\nimport { useWorkOrderSlice } from '../slice';\r\n\r\nimport {\r\n selectDowntimeOverlaps,\r\n selectFieldHandler,\r\n selectLinksProcessing,\r\n selectOfflineEventEnd,\r\n selectOfflineEventStart,\r\n selectSavedLinkedOrders,\r\n} from '../slice/selectors';\r\nimport produce from 'immer';\r\nimport {\r\n AdminServicesFilter,\r\n initAssigneeAdminUsers,\r\n} from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { AddCalibrationWorkOrder } from './WorkOrderLinks/AddCalibrationWorkOrder';\r\nimport { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { LinkedList, WorkOrderLinks } from './WorkOrderLinks/WorkOrderLinks';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { WorkOrderApi } from 'api/WorkOrderApi';\r\nimport { FormBookitDateTimePicker } from 'app/components/Forms/FormBookitDateTimePicker';\r\nimport { IndexNode } from 'app/components/Forms/FormsLayout/StyledForm';\r\nimport { Body, Caption } from 'app/components/Typography';\r\nimport { CalendarButton } from 'app/components/CalendarButton';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\n\r\nexport interface WorkOrderFormProps {\r\n onSubmit: (\r\n item: WorkOrderDetailsState,\r\n subFormFiles: IFormFileValue[],\r\n staffFormFiles: IFormFileValue[],\r\n ) => void;\r\n initialValues: WorkOrderDetailsState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isEdit: boolean;\r\n repetitiveFormRef: React.MutableRefObject;\r\n workOrderTypeFormRef: React.MutableRefObject;\r\n workOrderStaffFormRef: React.MutableRefObject;\r\n readonlyDetails?: WorkOrderReadonlyState;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n handleTypeChange: (type: IWorkOrderTypeDto | undefined) => void;\r\n canView?: boolean;\r\n commentsFormRef: React.MutableRefObject;\r\n onAssetClicked?: (asset: Entity) => void;\r\n onLinkedClick?: (linked: Entity) => void;\r\n expanded: boolean;\r\n formRef: React.MutableRefObject | null>;\r\n setWorkOrderOfflineStartChangedValue: React.Dispatch<\r\n React.SetStateAction\r\n >;\r\n setWorkOrderOfflineEndChangedValue: React.Dispatch<\r\n React.SetStateAction\r\n >;\r\n useSidePanel?: boolean;\r\n pageLink?: string;\r\n showShortView?: boolean;\r\n isCover?: boolean;\r\n bringUp?: boolean;\r\n}\r\n\r\nexport const WorkOrderForm = React.memo(function WorkOrderForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isEdit,\r\n isAdmin,\r\n user,\r\n handleTypeChange,\r\n repetitiveFormRef,\r\n workOrderTypeFormRef,\r\n workOrderStaffFormRef,\r\n readonlyDetails,\r\n canView,\r\n commentsFormRef,\r\n setWorkOrderOfflineStartChangedValue,\r\n setWorkOrderOfflineEndChangedValue,\r\n onAssetClicked,\r\n expanded,\r\n formRef,\r\n onLinkedClick,\r\n useSidePanel,\r\n pageLink,\r\n showShortView,\r\n isCover,\r\n bringUp,\r\n}: WorkOrderFormProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const { actions: workOrderActions } = useWorkOrderSlice();\r\n // const [addToLinked, setAddToLinked] = React.useState | null>(\r\n // null,\r\n // );\r\n const readonly = !isAdmin && isEdit;\r\n const firstDayOfWeek = useSelector(selectSystemFirstDayOfWeek);\r\n const fieldHandler = useSelector(selectFieldHandler);\r\n const savedLinkedOrders = useSelector(selectSavedLinkedOrders);\r\n const linksProcessing = useSelector(selectLinksProcessing);\r\n const overlaps = useSelector(selectDowntimeOverlaps);\r\n // const linkedCalibrationsChanged = useSelector(selectCalibrationsChanged);\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value, originalSubFormFiles, originalStaffFormFiles);\r\n }\r\n };\r\n const resetFieldHandler = () => {\r\n dispatch(workOrderActions.resetValueHandler());\r\n };\r\n const [unlimitedDowntime, setUnlimitedDowntime] = React.useState(\r\n isEdit &&\r\n initialValues.OfflineEventEnd !== null &&\r\n initialValues.OfflineEventEnd !== undefined &&\r\n dateUtils\r\n .dateOrStringToDate(initialValues.OfflineEventEnd)\r\n .getFullYear() === 9999,\r\n );\r\n const [typeChanged, setTypeChanged] = React.useState(false);\r\n const [downTimeChanged, setDownTimeChanged] = React.useState(false);\r\n const [allIsValid, setAllIsValid] = React.useState(true);\r\n const [remindBeforeChanged, setRemindBeforeChanged] = React.useState(\r\n false,\r\n );\r\n const [originalSubFormFiles, setOriginalSubFormFiles] = React.useState<\r\n IFormFileValue[]\r\n >([]);\r\n const [originalStaffFormFiles, setOriginalStaffFormFiles] = React.useState<\r\n IFormFileValue[]\r\n >([]);\r\n const linkedWorkOrders = useAsyncGetWthEffect(\r\n //WorkOrderApi.getLinkedToCalibration(initialValues.Id),\r\n async (): Promise => {\r\n if (isEdit) {\r\n if (linksProcessing === true) {\r\n return new Promise(resolve => {\r\n resolve(linkedWorkOrders);\r\n });\r\n } else {\r\n return WorkOrderApi.getLinkedToCalibration(initialValues.Id).then(\r\n res => {\r\n return res.Links as LinkedList[];\r\n },\r\n );\r\n }\r\n } else {\r\n return new Promise(resolve => {\r\n resolve(\r\n savedLinkedOrders.map(f => {\r\n return {\r\n Id: f.Id,\r\n Name: `#${f.Id}: ${f.AssetName} - ${f.Name}`,\r\n ParentId: -1,\r\n Linked: [],\r\n };\r\n }),\r\n );\r\n });\r\n }\r\n },\r\n [],\r\n [savedLinkedOrders, linksProcessing],\r\n );\r\n const { newDate } = useSystemDate();\r\n const updateFormValues = (\r\n original: IFormValueDto[],\r\n coming: IFormValueDto[],\r\n alertId: number | null,\r\n typeId: number | null,\r\n ) => {\r\n const result = coming.map(v => {\r\n let orn = original.find(o => o.FormFieldId === v.FormFieldId);\r\n if (!!orn) {\r\n return Object.assign({}, orn, {\r\n Value: v.Value,\r\n AlertId: alertId,\r\n AlertTypeId: typeId,\r\n });\r\n } else {\r\n return Object.assign(v, {\r\n AlertId: alertId,\r\n AlertTypeId: typeId,\r\n });\r\n }\r\n });\r\n //console.log('form values:', result);\r\n return result;\r\n };\r\n const workOrderSchema = React.useMemo(() => {\r\n return getWorkOrdersShema(t);\r\n }, [t]);\r\n const handleFormChange = React.useCallback(\r\n (values: WorkOrderDetailsState, isValid, dirty, setValue) => {\r\n if (typeChanged) {\r\n let type = values.WorkOrderType as IWorkOrderTypeDto;\r\n handleTypeChange(type);\r\n if (!!type) {\r\n if (type.DefaultSubject !== null) {\r\n setValue('AlertTitle', type.DefaultSubject, false);\r\n }\r\n if (initialValues.ToDown) {\r\n setValue('Downtime', true, false);\r\n setValue('OfflineEventStart', newDate(), true);\r\n (async () => {\r\n try {\r\n let id = type.DowntimeReasonTypeId ?? 3; // - Unexpected Malfunction\r\n const reason = await initReasonTypeData(id.toString());\r\n if (!!reason && reason.length > 0) {\r\n setValue('ReasonType', reason[0], false);\r\n }\r\n } catch {}\r\n })();\r\n } else if (type.DowntimeDuration !== null) {\r\n setValue('Downtime', true, false);\r\n if (values.EventStart !== null) {\r\n let endTime = dateUtils.addHours(\r\n dateUtils.dateOrStringToDate(values.EventStart),\r\n type.DowntimeDuration,\r\n );\r\n setValue('OfflineEventStart', values.EventStart, false);\r\n setValue('OfflineEventEnd', endTime, false);\r\n if (type.DowntimeReasonTypeId != null) {\r\n (async () => {\r\n try {\r\n let id = type.DowntimeReasonTypeId ?? 0;\r\n const reason = await initReasonTypeData(id.toString());\r\n if (!!reason && reason.length > 0) {\r\n setValue('ReasonType', reason[0], false);\r\n }\r\n } catch {}\r\n })();\r\n }\r\n }\r\n } else {\r\n setValue('Downtime', false, false);\r\n }\r\n setValue(\r\n 'AutoCreateTitle',\r\n GetAutoCreateTitle(\r\n type,\r\n values.EventStart,\r\n firstDayOfWeek as WeekStartsOn,\r\n ),\r\n false,\r\n );\r\n if (type.DefaultRemaindBefore !== null) {\r\n let remb = getSingleReminder(type.DefaultRemaindBefore);\r\n if (!!remb) {\r\n setValue('RemindBefore', remb, false);\r\n setValue('AlertStart', getAlertStart(remb.Id, values.EventStart));\r\n }\r\n }\r\n let assignee: Entity[] = [];\r\n if (type.AssignedUsers.length > 0) {\r\n assignee.concat(type.AssignedUsers);\r\n }\r\n if (type.AssignedToCreator && !!user) {\r\n assignee.push({\r\n Id: user.Id,\r\n Name: user.FormatedName || user.Id,\r\n });\r\n }\r\n (async () => {\r\n try {\r\n let assets = values.Assets as IAssetDto[]; // - Unexpected Malfunction\r\n const users = await initAssigneeAdminUsers(\r\n type,\r\n mapAssetsToServiceFilterDto(assets),\r\n );\r\n assignee.concat(users);\r\n if (assignee.length > 0) {\r\n setValue('AssignUsers', assignee, false);\r\n }\r\n } catch {}\r\n })();\r\n }\r\n setTypeChanged(false);\r\n }\r\n if (downTimeChanged) {\r\n if (values.Downtime) {\r\n setValue('OfflineEventStart', newDate(), true);\r\n }\r\n setDownTimeChanged(false);\r\n }\r\n if (remindBeforeChanged) {\r\n setValue(\r\n 'AlertStart',\r\n getAlertStart(values.RemindBefore?.Id ?? 0, values.EventStart),\r\n );\r\n setRemindBeforeChanged(false);\r\n }\r\n },\r\n [\r\n downTimeChanged,\r\n firstDayOfWeek,\r\n handleTypeChange,\r\n initialValues.ToDown,\r\n newDate,\r\n remindBeforeChanged,\r\n typeChanged,\r\n user,\r\n ],\r\n );\r\n React.useEffect(() => {\r\n if (formRef.current) {\r\n formRef.current.validateForm();\r\n }\r\n }, [formRef]);\r\n const validateForms = React.useCallback((isValid: boolean) => {\r\n setAllIsValid(isValid);\r\n }, []);\r\n const changeLinkedOrders = React.useCallback(\r\n (\r\n orders: IWorkOrderDetailsDto[],\r\n operation: 'add' | 'remove' | 'update',\r\n ) => {\r\n if (operation === 'add') {\r\n let addedOrders = orders.filter(\r\n f => !savedLinkedOrders.some(s => s.Id === f.Id),\r\n );\r\n dispatch(\r\n workOrderActions.setSavedLinkedOrders([\r\n ...savedLinkedOrders,\r\n ...addedOrders,\r\n ]),\r\n );\r\n }\r\n if (operation === 'remove') {\r\n let removedOrders = savedLinkedOrders.filter(f => {\r\n return !orders.some(a => a.Id === f.Id);\r\n });\r\n dispatch(workOrderActions.setSavedLinkedOrders(removedOrders));\r\n }\r\n if (operation === 'update') {\r\n dispatch(\r\n workOrderActions.setSavedLinkedOrders(\r\n savedLinkedOrders.map(f => {\r\n let order = orders.find(s => s.Id === f.Id);\r\n if (!!order && order !== null) {\r\n return Object.assign({}, f, order);\r\n } else {\r\n return f;\r\n }\r\n }),\r\n ),\r\n );\r\n }\r\n },\r\n [dispatch, savedLinkedOrders, workOrderActions],\r\n );\r\n const removeCalibrationOrder = React.useCallback(\r\n (linked: LinkedList) => {\r\n dispatch(\r\n workOrderActions.removeLinkedCalibration({\r\n id: linked.ParentId,\r\n link: linked.Id,\r\n }),\r\n );\r\n },\r\n [dispatch, workOrderActions],\r\n );\r\n const addCalibrationOrder = React.useCallback(\r\n (linked: Entity) => {\r\n dispatch(\r\n workOrderActions.addLinkedCalibration({\r\n id: initialValues.Id,\r\n link: linked.Id,\r\n }),\r\n );\r\n },\r\n [dispatch, initialValues.Id, workOrderActions],\r\n );\r\n const handleOfflineEventStartChange = (v: any) => {\r\n dispatch(\r\n workOrderActions.setOfflineEventStart(\r\n dateUtils.tryParse(v) === null\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(v),\r\n ),\r\n );\r\n };\r\n const handleOfflineEventEndChange = (v: any) => {\r\n dispatch(\r\n workOrderActions.setOfflineEventEnd(\r\n // dateUtils.tryFormatIso(dateUtils.tryParse(v)) ?? undefined,\r\n dateUtils.tryParse(v) === null\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(v),\r\n ),\r\n );\r\n };\r\n const OfflineEventStart = useSelector(selectOfflineEventStart);\r\n const OfflineEventEnd = useSelector(selectOfflineEventEnd);\r\n const warningMessages: IndexNode[] = React.useMemo(() => {\r\n let nodes: IndexNode[] = [];\r\n if (!!overlaps && overlaps.length > 0) {\r\n nodes.push({\r\n index: 'overlapsLinks',\r\n node: (\r\n \r\n \r\n {t(translations.InstrumentHasOverlappingDowntimeEvents) as string}\r\n \r\n \r\n {t(translations.ShowAllDowntimeEventsOn) as string}\r\n \r\n \r\n f.AssetId !== -1)\r\n .map(f => f.AssetId)\r\n .join(',')}&downTime=2`}\r\n aria-label=\"work orders\"\r\n target=\"_blank\"\r\n >\r\n {t(translations.menu_WorkOrders) as string}\r\n \r\n f.ServiceId !== -1)\r\n .map(f => f.ServiceId)}\r\n >\r\n {t(translations.Calendar) as string}\r\n \r\n
    \r\n\r\n {/* f.ServiceId !== -1)\r\n .map(f => f.ServiceId)\r\n .join(',')}`}\r\n aria-label=\"calendar\"\r\n target=\"_blank\"\r\n >\r\n {t(translations.Calendar) as string}\r\n */}\r\n \r\n ),\r\n variant: 'outlined',\r\n });\r\n }\r\n return nodes;\r\n }, [overlaps, t]);\r\n // React.useEffect(() => {\r\n // if (linkedCalibrationsChanged === true) {\r\n // dispatch(workOrderActions.setCalibrationChanged(undefined));\r\n // }\r\n // }, [dispatch, linkedCalibrationsChanged, workOrderActions]);\r\n React.useEffect(() => {\r\n if (\r\n isEdit &&\r\n !!initialValues.OfflineEventStart &&\r\n initialValues.OfflineEventStart !== null\r\n ) {\r\n dispatch(workOrderActions.checkDowntimeOverlaps(initialValues.Id));\r\n }\r\n }, [\r\n bringUp,\r\n dispatch,\r\n initialValues.Id,\r\n initialValues.OfflineEventStart,\r\n isEdit,\r\n workOrderActions,\r\n ]);\r\n React.useEffect(() => {\r\n formRef.current?.setValues(\r\n produce(v => {\r\n if (OfflineEventStart !== undefined) {\r\n v.OfflineEventStart = dateUtils.parseISOOrNull(OfflineEventStart);\r\n }\r\n if (OfflineEventEnd !== undefined) {\r\n v.OfflineEventEnd = dateUtils.parseISOOrNull(OfflineEventEnd);\r\n }\r\n }),\r\n );\r\n }, [OfflineEventStart, OfflineEventEnd, formRef]);\r\n\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n if (allIsValid) {\r\n formikHelpers.validateForm(values).then(responseErrors => {\r\n if (!isEmpty(responseErrors)) {\r\n formikHelpers.setSubmitting(false);\r\n console.debug('errors', responseErrors);\r\n } else {\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }\r\n });\r\n } else {\r\n formikHelpers.setSubmitting(false);\r\n }\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n console.log('Work order errors', formik.errors);\r\n }\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n setAssetChanged(true)}\r\n fullWidth\r\n />\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setTypeChanged(true)}\r\n fullWidth\r\n />\r\n \r\n \r\n setStatusChanged(true)}\r\n fullWidth\r\n />\r\n \r\n \r\n 0\r\n ? formik.values.Assets.filter(\r\n f =>\r\n !isNullOrUndefined(\r\n (f as IAssetDto).AssetCatId,\r\n ),\r\n ).map(\r\n asset => (asset as IAssetDto).AssetCatId ?? 0,\r\n )\r\n : undefined\r\n }\r\n label={t(translations.SymptomCodes)}\r\n placeholder={t(\r\n translations.PleaseSelectAnAlertSymptomCode,\r\n )}\r\n disabled={\r\n formik.isSubmitting ||\r\n readonly ||\r\n ((formik.values.WorkOrderType as IWorkOrderTypeDto)\r\n .NotEditable === true &&\r\n formik.values.IsClosed === true)\r\n }\r\n fullWidth\r\n />\r\n \r\n \r\n 0\r\n ? formik.values.Assets.filter(\r\n f =>\r\n !isNullOrUndefined(\r\n (f as IAssetDto).AssetCatId,\r\n ),\r\n ).map(\r\n asset => (asset as IAssetDto).AssetCatId ?? 0,\r\n )\r\n : undefined\r\n }\r\n label={t(translations.RepairCodes)}\r\n placeholder={t(\r\n translations.PleaseSelectAnAlertRepairCode,\r\n )}\r\n disabled={\r\n formik.isSubmitting ||\r\n readonly ||\r\n ((formik.values.WorkOrderType as IWorkOrderTypeDto)\r\n .NotEditable === true &&\r\n formik.values.IsClosed === true)\r\n }\r\n fullWidth\r\n />\r\n \r\n \r\n \r\n \r\n \r\n setRemindBeforeChanged(true)}\r\n fullWidth\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {formik.values.Assets.length > 0 &&\r\n (formik.values.Assets as IAssetDto[])[0].ServiceTypeId ===\r\n ServiceType.Online &&\r\n ((isEdit &&\r\n (isAdmin || initialValues.OfflineEventStart !== null)) ||\r\n (!isEdit && isAdmin)) && (\r\n \r\n \r\n setDownTimeChanged(true)}\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 formik.setFieldValue(\r\n 'OfflineEventEnd',\r\n dateUtils.formatISO(newDate()),\r\n );\r\n setUnlimitedDowntime(false);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {/* \r\n \r\n */}\r\n \r\n )}\r\n {formik.values.WorkOrderType !== null &&\r\n (formik.values.WorkOrderType as IWorkOrderTypeDto)\r\n .CustomFormId !== null && (\r\n {\r\n formik.setFieldValue(\r\n 'SubmissionFormValues',\r\n updateFormValues(\r\n formik.values.SubmissionFormValues,\r\n values,\r\n formik.values.Id > 0 ? formik.values.Id : null,\r\n formik.values.WorkOrderType?.Id || null,\r\n ),\r\n false,\r\n );\r\n formik.setFieldValue(\r\n 'SubmissionFormFiles',\r\n files,\r\n false,\r\n );\r\n setOriginalSubFormFiles(originalFiles);\r\n }}\r\n />\r\n )}\r\n \r\n \r\n {!isEdit && (\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 {isEdit && formik.values.HasAletForm && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {formik.values.StuffCustomForm !== null &&\r\n formik.values.StuffCustomForm.Id !== 0 && (\r\n {\r\n formik.setFieldValue(\r\n 'StaffFormValues',\r\n updateFormValues(\r\n formik.values.StaffFormValues,\r\n values,\r\n formik.values.Id > 0\r\n ? formik.values.Id\r\n : null,\r\n null,\r\n ),\r\n false,\r\n );\r\n formik.setFieldValue(\r\n 'StaffFormFiles',\r\n files,\r\n false,\r\n );\r\n setOriginalStaffFormFiles(originalFiles);\r\n }}\r\n />\r\n )}\r\n \r\n )}\r\n\r\n {readonlyDetails !== undefined && isEdit && expanded && (\r\n \r\n \r\n \r\n )}\r\n {(isEdit\r\n ? !!linkedWorkOrders && linkedWorkOrders.length > 0\r\n : savedLinkedOrders.length > 0) && (\r\n {\r\n return {\r\n Id: f.Id,\r\n Name: `${f.AssetName} - ${f.Name}`,\r\n ParentId: -1,\r\n Linked: [],\r\n };\r\n })\r\n }\r\n onHoverClick={item => {\r\n isEdit\r\n ? removeCalibrationOrder(item)\r\n : changeLinkedOrders(\r\n [\r\n (item as Entity<\r\n number\r\n >) as IWorkOrderDetailsDto,\r\n ],\r\n 'remove',\r\n );\r\n }}\r\n onItemClcik={item => {\r\n isEdit\r\n ? dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.WorkOrderDetails,\r\n props: {\r\n queryParams: { id: '' + item.Id },\r\n useSidePanel: true,\r\n continueTo: {\r\n pageType: useSidePanel\r\n ? RenderPageType.WorkOrderDetails\r\n : undefined,\r\n pageProps: useSidePanel\r\n ? {\r\n queryParams: {\r\n id: '' + formik.values.Id,\r\n },\r\n useSidePanel: true,\r\n }\r\n : undefined,\r\n continueToLink: useSidePanel\r\n ? undefined\r\n : pageLink,\r\n },\r\n } as WorkOrderDetailsProps,\r\n }),\r\n )\r\n : !!onLinkedClick && onLinkedClick(item);\r\n }}\r\n showProcessing={linksProcessing}\r\n />\r\n )}\r\n {isAdmin &&\r\n formik.values.WorkOrderType !== null &&\r\n formik.values.Assets.length > 0 && (\r\n \r\n f.Id),\r\n ...[formik.values.Id],\r\n ]\r\n : savedLinkedOrders.map(f => f.Id)\r\n }\r\n saveLinkedOrders={value => {\r\n if (isEdit) {\r\n addCalibrationOrder({\r\n Id: value.Id,\r\n Name: value.Name,\r\n });\r\n } else {\r\n changeLinkedOrders([value], 'add');\r\n }\r\n }}\r\n />\r\n \r\n )}\r\n {/* {readonlyDetails !== undefined &&\r\n readonlyDetails.LinkedAlerts.length > 0 &&\r\n isEdit && (\r\n <>\r\n {expanded ? (\r\n \r\n <>\r\n {readonlyDetails.LinkedAlerts.map((l, i) => {\r\n return (\r\n \r\n dispatch(\r\n workOrderActions.removeFromLinked(\r\n item.Id,\r\n ),\r\n )\r\n }\r\n >\r\n \r\n dispatch(\r\n actions.openSidePanel({\r\n type:\r\n RenderPageType.WorkOrderDetails,\r\n props: {\r\n queryParams: { id: '' + l.Id },\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n }),\r\n )\r\n }\r\n >\r\n #{l.Id} - {l.Name}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n \r\n dispatch(actions.setExpanded(true))\r\n }\r\n >\r\n {t(translations.LinkedWorkOrders).replace(\r\n '{0}',\r\n readonlyDetails.LinkedAlerts.length.toString(),\r\n )}\r\n \r\n \r\n )}\r\n \r\n )}\r\n {initialValues.RecurringAssetId &&\r\n isEdit &&\r\n isAdmin &&\r\n expanded && (\r\n \r\n setAddToLinked(v)}\r\n value={addToLinked}\r\n />\r\n \r\n dispatch(\r\n workOrderActions.addToLinked({\r\n id: addToLinked!.Id,\r\n link: initialValues.RecurringAssetId!,\r\n }),\r\n )\r\n }\r\n >\r\n Add to linked\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","import {\r\n formFileSchema,\r\n formValueSchema,\r\n} from 'app/components/CustomForm/CustomFormUtils';\r\nimport {\r\n EntityNumberSchema,\r\n EntityStringSchema,\r\n} from 'app/components/Forms/Schemas';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport * as Yup from 'yup';\r\nimport { WorkOrderDetailsState } from '../slice/types';\r\n\r\nexport const getWorkOrdersShema = (\r\n t: TFunction,\r\n): Yup.SchemaOf => {\r\n return Yup.object({\r\n Id: Yup.number().notRequired().default(-1),\r\n Assets: Yup.array()\r\n .of(EntityNumberSchema)\r\n .label(t(translations.Asset) as string)\r\n .min(1)\r\n .required(t(translations.err_AssetRequired)),\r\n WorkOrderType: Yup.mixed()\r\n .label(t(translations.AlertType) as string)\r\n .required(t(translations.errEvent_Type_Required) as string)\r\n .typeError(t(translations.errEvent_Type_Required) as string),\r\n AlertTitle: Yup.string()\r\n .label(t(translations.AlertName) as string)\r\n .nullable(true)\r\n .required(t(translations.err_AlertNameRequired) as string),\r\n WorkOrderTypeStatus: Yup.mixed()\r\n .label(t(translations.EventTypeStatus) as string)\r\n .required(t(translations.errEvent_Type_Status_Required) as string),\r\n EventStart: Yup.date()\r\n .label(t(translations.EventDueDate) as string)\r\n .default(dateUtils.dateOrStringToDate(new Date()))\r\n\r\n .required(() => t(translations.err_EventDueDateRequired) as string),\r\n EventEnd: Yup.date().notRequired().nullable(),\r\n RemindBefore: Yup.mixed().label(t(translations.RemindMeBefore) as string),\r\n AlertStart: Yup.date()\r\n .label(t(translations.AlertStartTimeLabel) as string)\r\n .nullable()\r\n .when('RemindBefore', {\r\n is: val => val.Id === 6,\r\n then: Yup.date()\r\n .label(t(translations.AlertStartTimeLabel) as string)\r\n .default(\r\n dateUtils.addDays(dateUtils.dateOrStringToDate(new Date()), -1),\r\n )\r\n .nullable()\r\n .required(\r\n `${t(translations.AlertStartTimeLabel) as string} is required.`,\r\n )\r\n .max(Yup.ref('EventStart')),\r\n }),\r\n SymptomCodes: Yup.array()\r\n .of(EntityNumberSchema)\r\n .label(t(translations.SymptomCodes) as string),\r\n\r\n AssignUsers: Yup.array()\r\n .of(EntityStringSchema)\r\n .label(t(translations.AssignedUsers) as string),\r\n RepairCodes: Yup.array()\r\n .of(EntityNumberSchema)\r\n .label(t(translations.RepairCodes) as string),\r\n Description: Yup.string()\r\n .label(t(translations.Description) as string)\r\n .nullable(),\r\n Downtime: Yup.boolean().label(t(translations.Downtime) as string),\r\n OfflineEventStart: Yup.date()\r\n .label(t(translations.OfflineEventStartLabel) as string)\r\n .nullable()\r\n .when('Downtime', {\r\n is: check => check === true,\r\n then: Yup.date()\r\n .label(t(translations.OfflineEventStartLabel) as string)\r\n .nullable()\r\n .required(t(translations.OfflineEventStartRequired) as string),\r\n }),\r\n OfflineEventEnd: Yup.date()\r\n .label(t(translations.OfflineEventEndLabel) as string)\r\n .nullable()\r\n .when('OfflineEventStart', {\r\n is: start => start != null,\r\n then: Yup.date()\r\n .label(t(translations.OfflineEventEndLabel) as string)\r\n .nullable()\r\n .min(\r\n Yup.ref('OfflineEventStart'),\r\n t(translations.err_DownTimeEndGreaterThenStart) as string,\r\n ),\r\n }),\r\n OfflineRemarks: Yup.string().nullable(),\r\n ReasonType: Yup.mixed(),\r\n ToDown: Yup.boolean().default(false),\r\n AutoCreateTitle: Yup.string().nullable(true).notRequired(),\r\n RecurringAssetId: Yup.number().nullable(true).notRequired().default(null),\r\n RecurringGroupId: Yup.number().nullable(true).notRequired().default(null),\r\n StaffFormValues: Yup.array().of(formValueSchema),\r\n SubmissionFormValues: Yup.array().of(formValueSchema),\r\n SubmissionFormFiles: Yup.array().of(formFileSchema),\r\n StaffFormFiles: Yup.array().of(formFileSchema),\r\n StuffCustomForm: Yup.mixed().nullable(true).notRequired().default(null),\r\n HasAletForm: Yup.boolean().default(false),\r\n IsClosed: Yup.boolean().default(false),\r\n ClosedStatuses: Yup.array().of(EntityNumberSchema),\r\n ReportedBy: Yup.string().nullable(true),\r\n ShowOnCalibrationHistory: Yup.boolean().default(false),\r\n NotEditable: Yup.boolean().default(false),\r\n ReservationId: Yup.number().nullable(true).notRequired().default(null),\r\n });\r\n};\r\n","import { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectExpandedSidePanel,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\r\nimport { useWorkOrderSlice } from './slice';\r\nimport {\r\n selectCreateWorkOrder,\r\n selectCreateWorkOrderCompleted,\r\n selectCreateWorkOrderHasError,\r\n selectCreateWorkOrderProcessing,\r\n selectReadonlyWorkOrder,\r\n selectReservationOfflineCompleted,\r\n selectReservationOfflineData,\r\n selectReservationOfflineProcessing,\r\n selectSendEmailOnResOffline,\r\n selectUpdateWorkOrder,\r\n selectUpdateWorkOrderCompleted,\r\n selectUpdateWorkOrderHasError,\r\n selectUpdateWorkOrderProcessing,\r\n selectWorkOrderProcessing,\r\n} from './slice/selectors';\r\nimport {\r\n ContinueToState,\r\n WorkOrderDetailsState,\r\n WorkOrderGlobalState,\r\n WorkOrderQueryStringParameters,\r\n} from './slice/types';\r\nimport * as React from 'react';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { push, routerActions } from 'connected-react-router';\r\nimport {\r\n DeleteOrderButton,\r\n ReopenOrderButton,\r\n SaveFormButton,\r\n} from './Actions/WorkOrderActions';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { WorkOrderForm } from './WorkOrderForm';\r\nimport { Roles } from 'app/slice/types';\r\nimport {\r\n IAssetDto,\r\n mapAssetsToServiceTypeFilterDto,\r\n} from 'api/odata/generated/entities/IAssetDto';\r\nimport { selectRepetitiveData } from 'app/components/Forms/FormRepetitive/slice/selectors';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { ActionButton } from 'app/components/BasicButtons/ActionButton';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport Box from '@material-ui/core/Box';\r\nimport { IFormFileValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { IWorkOrderTypeStatusDto } from 'api/odata/generated/entities/IWorkOrderTypeStatusDto';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { WorkOrderApi as api } from 'api/WorkOrderApi';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { ActionIconButton } from 'app/components/BasicButtons/ActionIconButton';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { RadioGroup } from 'app/components/RadioGroup';\r\nimport { ReservationQueryStringParameters } from 'app/pages/ReservationDetails/Details/slice/types';\r\nimport { ReservationDetailsProps } from 'app/pages/ReservationDetails/Details';\r\nimport useGlobalSettingsHook from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport {\r\n SwitchActionsProps,\r\n SwitchTarget,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/SwitchActions';\r\nimport { FormikProps } from 'formik';\r\nimport { CalendarButton } from 'app/components/CalendarButton';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { FlexRowDiv } from 'app/components/basic/Wrappers/FlexWrappers/flexRow';\r\nimport { H3 } from 'app/components/Typography';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { MenuItem } from '@material-ui/core';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { useOpenAssetPopUp } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nexport type NotifyUsersRadioGroupOptionTypes =\r\n | 'No'\r\n | 'JustBookedUsers'\r\n | 'AllAffectedUsers';\r\n\r\nexport type CancelAffectedReservationsRadioGroupOptionTypes = 'No' | 'Yes';\r\nexport type ContinueWOAction = 'list' | 'edit';\r\nexport interface WorkOrderDetailsProps\r\n extends CoverProps,\r\n SidePanelContentProps {\r\n queryParams: WorkOrderQueryStringParameters;\r\n useSwithButtons?: boolean;\r\n continueTo?: ContinueToState;\r\n onClose?: () => void;\r\n}\r\nexport function WorkOrderDetails(props: WorkOrderDetailsProps) {\r\n const {\r\n queryParams,\r\n useSidePanel,\r\n useSwithButtons,\r\n continueTo,\r\n closeCover,\r\n isCover,\r\n } = props;\r\n const dispatch = useDispatch();\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const { actions } = useWorkOrderSlice();\r\n const { actions: globalActions } = useAppSettingsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n /// Use Effect on Mount ///\r\n\r\n /// Selectors ///\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const loading = useSelector(selectWorkOrderProcessing);\r\n const hasChanges = useSelector(selectHasNotSavedChanges, shallowEqual);\r\n const repetitiveValues = useSelector(selectRepetitiveData);\r\n const readonlyDetails = useSelector(selectReadonlyWorkOrder);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const sendOfflineEmail = useSelector(selectSendEmailOnResOffline);\r\n const sendOfflineProcessing = useSelector(selectReservationOfflineProcessing);\r\n const sendOfflineData = useSelector(selectReservationOfflineData);\r\n const sendEmailCompleted = useSelector(selectReservationOfflineCompleted);\r\n const createModel = useSelector(selectCreateWorkOrder, shallowEqual);\r\n const editModel = useSelector(selectUpdateWorkOrder, shallowEqual);\r\n const requestCreateCompleted = useSelector(selectCreateWorkOrderCompleted);\r\n const requestUpdateCompleted = useSelector(selectUpdateWorkOrderCompleted);\r\n const hasCreateProcessing = useSelector(selectCreateWorkOrderProcessing);\r\n const hasUpdateUpdateProcessing = useSelector(\r\n selectUpdateWorkOrderProcessing,\r\n );\r\n const hasCreateError = useSelector(selectCreateWorkOrderHasError);\r\n const hasUpdateError = useSelector(selectUpdateWorkOrderHasError);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const globalSettings = useGlobalSettingsHook();\r\n //cover\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState(\r\n () => {\r\n if (edit) {\r\n dispatch(actions.resetUpdateWorkOrderState());\r\n } else {\r\n dispatch(actions.resetCreateWorkOrderState());\r\n }\r\n dispatch(actions.resetReservationsOfflineState());\r\n return true;\r\n },\r\n undefined,\r\n useSidePanel,\r\n isCover,\r\n );\r\n\r\n /// Local State ///\r\n const [busy, setBusy] = React.useState(false);\r\n const [edit, setEdit] = React.useState(false);\r\n const innerFormRef = React.useRef | null>(\r\n null,\r\n );\r\n const [showConfirmRecurring, setShowConfirmRecurring] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [showDeleteRecurring, setShowDeleteRecurring] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [showSendEmail, setShowSendEmail] = React.useState(\r\n undefined,\r\n );\r\n const [showCloseStatus, setShowCloseStatus] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [closedStatus, setClosedStatus] = React.useState<\r\n IWorkOrderTypeStatusDto | undefined\r\n >(undefined);\r\n const [radioNotifyUsersValue, setRadioNotifyUsersValue] = React.useState<\r\n NotifyUsersRadioGroupOptionTypes | undefined\r\n >('JustBookedUsers');\r\n\r\n const [\r\n radioCancelAffectedReservationsValue,\r\n setRadioCancelAffectedReservationsValue,\r\n ] = React.useState<\r\n CancelAffectedReservationsRadioGroupOptionTypes | undefined\r\n >('No');\r\n\r\n const [\r\n workOrderOfflineStartChangedValue,\r\n setWorkOrderOfflineStartChangedValue,\r\n ] = React.useState();\r\n\r\n const [\r\n workOrderOfflineEndChangedValue,\r\n setWorkOrderOfflineEndChangedValue,\r\n ] = React.useState();\r\n\r\n const [isCloseWorkOrderClicked, setIsCloseWorkOrderClicked] = React.useState<\r\n boolean\r\n >(false);\r\n\r\n /// Memo variables ///\r\n const hasProcessing = React.useMemo(() => {\r\n return hasCreateProcessing || hasUpdateUpdateProcessing;\r\n }, [hasCreateProcessing, hasUpdateUpdateProcessing]);\r\n\r\n const hasError = React.useMemo(() => {\r\n return hasCreateError || hasUpdateError;\r\n }, [hasCreateError, hasUpdateError]);\r\n\r\n const baseModel = React.useMemo(() => {\r\n return createModel || editModel || undefined;\r\n }, [createModel, editModel]);\r\n\r\n const showShortView = React.useMemo(() => {\r\n return isMobile || (useSidePanel && !sidePanelExpanded);\r\n }, [isMobile, useSidePanel, sidePanelExpanded]);\r\n\r\n const IsAdmin = React.useMemo(() => {\r\n return (\r\n User?.Roles?.includes(Roles.InstrumentEventsAdmin) ||\r\n User?.IsAllGroupOrLabTechAdmin(\r\n baseModel?.Assets.map(g => (g as IAssetDto).ServiceGroupId ?? 0),\r\n mapAssetsToServiceTypeFilterDto(\r\n (baseModel?.Assets === undefined\r\n ? []\r\n : baseModel?.Assets) as IAssetDto[],\r\n ),\r\n ) ||\r\n User?.IsAllInstrumentEventsGroupPermissions(\r\n baseModel?.Assets.map(g => (g as IAssetDto).ServiceGroupId ?? 0),\r\n )\r\n );\r\n }, [User, baseModel]);\r\n const isReadOnlyUser = React.useMemo(() => {\r\n return (\r\n User !== undefined &&\r\n (User.Roles.includes(Roles.CalendarOnly) ||\r\n User.Roles.includes(Roles.Readonly) ||\r\n User.Roles.includes(Roles.RoomOnly))\r\n );\r\n }, [User]);\r\n const viewPermissions = React.useMemo(() => {\r\n return (\r\n !edit ||\r\n (edit &&\r\n (IsAdmin ||\r\n (baseModel?.ReportedBy === (User?.Id || '') &&\r\n !(baseModel?.WorkOrderType as IWorkOrderTypeDto).StaffOnly)))\r\n );\r\n }, [\r\n IsAdmin,\r\n User?.Id,\r\n baseModel?.ReportedBy,\r\n baseModel?.WorkOrderType,\r\n edit,\r\n ]);\r\n const openAsset = useOpenAssetPopUp();\r\n const repeat = React.useMemo(() => {\r\n return (\r\n edit &&\r\n (!isNullOrUndefined(baseModel?.RecurringAssetId) ||\r\n !isNullOrUndefined(baseModel?.RecurringGroupId))\r\n );\r\n }, [edit, baseModel]);\r\n\r\n const [typeName, setTypeName] = React.useState(\r\n baseModel?.WorkOrderType?.Name,\r\n );\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n\r\n if (globalSettings.loadCompleted && active) {\r\n setFirstLoad(false);\r\n if (\r\n queryParams.id !== undefined &&\r\n !isNaN(parseInt(queryParams.id || ''))\r\n ) {\r\n dispatch(actions.initUpdateWorkOrder(queryParams));\r\n } else {\r\n dispatch(actions.initWorkOrder(queryParams));\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [actions, dispatch, firstLoad, globalSettings, queryParams]);\r\n React.useEffect(() => {\r\n setTypeName(\r\n innerFormRef.current?.values.WorkOrderType?.Name ??\r\n baseModel?.WorkOrderType?.Name,\r\n );\r\n }, [\r\n baseModel?.WorkOrderType?.Name,\r\n innerFormRef.current?.values.WorkOrderType?.Name,\r\n ]);\r\n\r\n const reservationSwithProps = React.useMemo(() => {\r\n if (!edit && baseModel) {\r\n let eqids = queryParams.eqid;\r\n let start = queryParams.eStart || queryParams.offStart;\r\n let end = queryParams.offEnd;\r\n let defaultMulti = globalSettings.multipleInstrumentsEnabled;\r\n if (!!baseModel) {\r\n start = dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(baseModel.EventStart),\r\n );\r\n end =\r\n baseModel.OfflineEventEnd !== null &&\r\n baseModel.OfflineEventEnd !== undefined\r\n ? dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(baseModel.OfflineEventEnd),\r\n )\r\n : undefined;\r\n defaultMulti =\r\n globalSettings.multipleInstrumentsEnabled &&\r\n baseModel.Assets.length > 0;\r\n eqids = (baseModel.Assets as IAssetDto[])\r\n .map(f => f.ServiceId)\r\n .filter(f => f !== undefined && f !== null)\r\n .join(',');\r\n }\r\n\r\n let p = {\r\n useSidePanel: true,\r\n queryParams: {\r\n selectedIds: eqids,\r\n Start: start,\r\n End: end,\r\n defaultMulti: defaultMulti.toString(),\r\n source: queryParams.source,\r\n } as ReservationQueryStringParameters,\r\n useSwitchButtons: useSwithButtons,\r\n } as ReservationDetailsProps;\r\n return p;\r\n }\r\n return undefined;\r\n }, [\r\n baseModel,\r\n edit,\r\n globalSettings.multipleInstrumentsEnabled,\r\n queryParams.eStart,\r\n queryParams.eqid,\r\n queryParams.offEnd,\r\n queryParams.offStart,\r\n queryParams.source,\r\n useSwithButtons,\r\n ]);\r\n /// Refs ///\r\n const submitFormRef = React.useRef(null);\r\n const repetitiveFormRef = React.useRef(null);\r\n const workOrderTypeFormRef = React.useRef(null);\r\n const workOrderStaffFormRef = React.useRef(null);\r\n const submitCommentRef = React.useRef(null);\r\n\r\n /// Handlers ///\r\n const handleSaveClick = React.useCallback(\r\n (e: any) => {\r\n if (repeat) {\r\n setShowConfirmRecurring(true);\r\n } else {\r\n handleSubmitForm(e);\r\n }\r\n },\r\n [repeat],\r\n );\r\n const handleSubmitForm = (e: any) => {\r\n if (workOrderTypeFormRef.current) {\r\n workOrderTypeFormRef.current(e);\r\n }\r\n if (workOrderStaffFormRef.current) {\r\n workOrderStaffFormRef.current(e);\r\n }\r\n if (repetitiveFormRef.current) {\r\n repetitiveFormRef.current(e);\r\n }\r\n // if (submitCommentRef.current) {\r\n // submitCommentRef.current(e);\r\n // }\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (\r\n values: WorkOrderDetailsState,\r\n subFormFiles: IFormFileValue[],\r\n staffFormFiles: IFormFileValue[],\r\n ) => {\r\n setBusy(true);\r\n if (edit) {\r\n dispatch(\r\n actions.updateWorkOrder({\r\n current: values,\r\n original: baseModel,\r\n originalSubFormFiles: subFormFiles,\r\n originalStaffFormFiles: staffFormFiles,\r\n }),\r\n );\r\n } else {\r\n let value = {\r\n workOrderDetails: values,\r\n RepetitiveOptions: repetitiveValues,\r\n } as WorkOrderGlobalState;\r\n //console.log('data', value);\r\n dispatch(actions.createWorkOrder(value));\r\n }\r\n },\r\n [actions, baseModel, dispatch, edit, repetitiveValues],\r\n );\r\n\r\n const handleCancelClick = React.useCallback(() => {\r\n if (useSidePanel) {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: hasChanges,\r\n onClose: () => {\r\n if (edit) {\r\n dispatch(actions.resetUpdateWorkOrderState());\r\n } else {\r\n dispatch(actions.resetCreateWorkOrderState());\r\n }\r\n dispatch(actions.resetReservationsOfflineState());\r\n },\r\n } as SidePanelCloseState);\r\n } else {\r\n dispatch(push('/workorders'));\r\n }\r\n }, [actions, closePanel, dispatch, edit, hasChanges, isCover, useSidePanel]);\r\n const handleTypeChange = React.useCallback(\r\n (orderType: IWorkOrderTypeDto | undefined) => {},\r\n [],\r\n );\r\n //------ Confirm Repetitive Update/Delete handlers -------//\r\n const handleUpdateAllRecurrent = (e: any) => {\r\n dispatch(actions.setUpdateAllRecurrent(true));\r\n handleSubmitForm(e);\r\n setShowConfirmRecurring(false);\r\n };\r\n const handleUpdateJustOne = (e: any) => {\r\n dispatch(actions.setUpdateAllRecurrent(false));\r\n handleSubmitForm(e);\r\n setShowConfirmRecurring(false);\r\n };\r\n const handleDeleteOrder = React.useCallback(\r\n (action: boolean | null) => {\r\n var payload = {\r\n Id: baseModel?.Id || 0,\r\n all: action,\r\n };\r\n api\r\n .deleteOrders(payload)\r\n .then(response => {\r\n // const messages: IResponseType = GetResponseMessages(\r\n // response,\r\n // t(translations.Success) as string,\r\n // );\r\n //console.log(response);\r\n handleCancelClick();\r\n if (response.ErrorMessages.length > 0) {\r\n dispatch(\r\n globalActions.addNotification({\r\n key: 'deleteOrderError',\r\n message: t(\r\n translations.OnlyMainOrResourceWorkOrdersAdminCanDeleteCalibrationRecords,\r\n ) as string,\r\n variant: 'error',\r\n }),\r\n );\r\n } else {\r\n dispatch(\r\n globalActions.addNotification({\r\n key: 'deleteOrder',\r\n message: 'Item deleted successfully',\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n dispatch(layoutActions.setRefreshTable(true));\r\n })\r\n .catch(error => {\r\n console.log('status error', error);\r\n let err = t(translations.Failed) as string;\r\n dispatch(\r\n globalActions.addNotification({\r\n variant: 'error',\r\n message:\r\n 'Some thing went wrong. Item can not be deleted.: ' + !!err\r\n ? err\r\n : '',\r\n key: 'deleteOrder',\r\n }),\r\n );\r\n });\r\n },\r\n [baseModel, dispatch, globalActions, handleCancelClick, layoutActions, t],\r\n );\r\n //------ Send Emails on Reservation Downtime handlets ------//\r\n const handleSendEmailClick = React.useCallback(() => {\r\n if (sendOfflineData && sendOfflineData.length > 0) {\r\n dispatch(\r\n actions.sendReservationsOfflineEmail({\r\n cancel: radioCancelAffectedReservationsValue === 'Yes' ? true : false,\r\n deleted: false,\r\n insert: !edit,\r\n doNotNotifyUsers: radioNotifyUsersValue === 'No' ? true : false,\r\n allAffectedUsers:\r\n radioNotifyUsersValue === 'AllAffectedUsers' ? true : false,\r\n reservationOffline: sendOfflineData,\r\n }),\r\n );\r\n }\r\n setIsCloseWorkOrderClicked(false);\r\n }, [\r\n actions,\r\n dispatch,\r\n edit,\r\n radioCancelAffectedReservationsValue,\r\n radioNotifyUsersValue,\r\n sendOfflineData,\r\n ]);\r\n /* const handleSendEmailWithCancel = React.useCallback(() => {\r\n if (sendOfflineData && sendOfflineData.length > 0) {\r\n dispatch(\r\n actions.sendReservationsOfflineEmail({\r\n cancel: true,\r\n deleted: false,\r\n insert: !edit,\r\n reservationOffline: sendOfflineData,\r\n }),\r\n );\r\n }\r\n }, [actions, dispatch, edit, sendOfflineData]); */\r\n const handleCancelSend = React.useCallback(() => {\r\n dispatch(actions.resetReservationsOfflineState());\r\n setIsCloseWorkOrderClicked(false);\r\n }, [actions, dispatch]);\r\n const handleCloseOrder = React.useCallback(\r\n (event: any, status: IWorkOrderTypeStatusDto) => {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'WorkOrderTypeStatus',\r\n fieldValue: status,\r\n }),\r\n );\r\n //setChangedStatus(status);\r\n handleSaveClick(event);\r\n setIsCloseWorkOrderClicked(true);\r\n },\r\n [actions, dispatch, handleSaveClick],\r\n );\r\n const handleOpenOrder = React.useCallback(\r\n (event: any) => {\r\n api\r\n .getNewWorkOrderStatus(baseModel?.WorkOrderType?.Id || 0)\r\n .then(result => {\r\n let res = result as IWorkOrderTypeStatusDto[];\r\n if (res.length > 0) {\r\n dispatch(\r\n actions.setAnyValue({\r\n fieldKey: 'WorkOrderTypeStatus',\r\n fieldValue: res[0],\r\n }),\r\n );\r\n //setChangedStatus(res[0]);\r\n handleSaveClick(event);\r\n }\r\n });\r\n },\r\n [actions, baseModel?.WorkOrderType?.Id, dispatch, handleSaveClick],\r\n );\r\n const handleDeleteClick = React.useCallback(() => {\r\n if (repeat) {\r\n setShowDeleteRecurring(true);\r\n } else {\r\n handleDeleteOrder(null);\r\n }\r\n }, [handleDeleteOrder, repeat]);\r\n\r\n const handleDeleteAllNext = (e: any) => {\r\n handleDeleteOrder(false);\r\n setShowDeleteRecurring(false);\r\n };\r\n const handleDeleteAll = (e: any) => {\r\n handleDeleteOrder(true);\r\n setShowDeleteRecurring(false);\r\n };\r\n const handleNotifyUsersChange = event => {\r\n setRadioNotifyUsersValue(event);\r\n console.log(radioNotifyUsersValue);\r\n };\r\n\r\n const handleCancelAffectedReservationsChange = event => {\r\n setRadioCancelAffectedReservationsValue(event);\r\n console.log(radioCancelAffectedReservationsValue);\r\n };\r\n\r\n const isChangedDowntimeShorter = (): boolean => {\r\n let isChangedStartDowntimeShorter: boolean = true;\r\n let isChangedEndDowntimeShorter: boolean = true;\r\n if (\r\n !!workOrderOfflineStartChangedValue &&\r\n !!baseModel &&\r\n !!baseModel.OfflineEventStart\r\n ) {\r\n isChangedStartDowntimeShorter =\r\n dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(workOrderOfflineStartChangedValue ?? ''),\r\n ) <\r\n dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(baseModel?.OfflineEventStart ?? ''),\r\n );\r\n }\r\n if (\r\n !!workOrderOfflineEndChangedValue &&\r\n !!baseModel &&\r\n !!baseModel.OfflineEventEnd\r\n ) {\r\n isChangedEndDowntimeShorter =\r\n dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(workOrderOfflineEndChangedValue ?? ''),\r\n ) >\r\n dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(baseModel?.OfflineEventEnd ?? ''),\r\n );\r\n }\r\n //return workOrderOfflineStartChangedValue < OfflineEventStart || workOrderOfflineEndChangedValue > OfflineEventEnd\r\n return isChangedStartDowntimeShorter && isChangedEndDowntimeShorter;\r\n };\r\n\r\n /// Use Effects ///\r\n React.useEffect(() => {\r\n let active = loading === false;\r\n if (active) {\r\n if (queryParams.id !== undefined && !isNaN(parseInt(queryParams.id))) {\r\n setEdit(true);\r\n } else {\r\n setEdit(false);\r\n }\r\n if (requestCreateCompleted === true || requestUpdateCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n if (sendOfflineEmail) {\r\n setShowSendEmail(true);\r\n } else {\r\n setShowSendEmail(false);\r\n handleCancelClick();\r\n }\r\n }\r\n } else if (\r\n requestCreateCompleted === false ||\r\n requestUpdateCompleted === false\r\n ) {\r\n setRequestCompleted(false);\r\n setBusy(false);\r\n }\r\n if (sendEmailCompleted) {\r\n handleCancelClick();\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n baseModel,\r\n handleCancelClick,\r\n hasError,\r\n queryParams,\r\n loading,\r\n requestCompleted,\r\n requestCreateCompleted,\r\n requestUpdateCompleted,\r\n sendEmailCompleted,\r\n sendOfflineEmail,\r\n ]);\r\n // To do: implement confirmSendEmails when downtime pass on existing reservation\r\n\r\n const leftActions = React.useMemo(() => {\r\n let actions = [\r\n () => (\r\n \r\n }\r\n onClick={handleSaveClick}\r\n disabled={busy || (baseModel?.NotEditable && baseModel?.IsClosed)}\r\n processing={!requestCompleted && busy}\r\n edit={edit || false}\r\n text={t(translations.Save)}\r\n />\r\n \r\n ),\r\n ] as ActionRenderer[];\r\n if (\r\n edit &&\r\n IsAdmin &&\r\n baseModel &&\r\n !baseModel.IsClosed &&\r\n baseModel.ClosedStatuses.length > 0\r\n ) {\r\n actions.push(() => (\r\n \r\n {baseModel.ClosedStatuses.length === 1 ? (\r\n {\r\n setShowCloseStatus(true);\r\n setClosedStatus(\r\n baseModel.ClosedStatuses[0] as IWorkOrderTypeStatusDto,\r\n );\r\n }}\r\n >\r\n {showShortView\r\n ? t(translations.CloseIncident)\r\n : t(translations.CloseEvent)}\r\n \r\n ) : (\r\n \r\n (baseModel.ClosedStatuses as IWorkOrderTypeStatusDto[]).map(\r\n s => (\r\n
    \r\n {\r\n setShowCloseStatus(true);\r\n setClosedStatus(s);\r\n }}\r\n >\r\n {s.Name}\r\n \r\n
    \r\n ),\r\n )\r\n }\r\n menuProps={{\r\n anchorOrigin: {\r\n vertical: 'top',\r\n horizontal: 'center',\r\n },\r\n transformOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'center',\r\n },\r\n }}\r\n addChevron\r\n >\r\n {showShortView\r\n ? t(translations.CloseIncident)\r\n : t(translations.CloseEvent)}\r\n \r\n )}\r\n
    \r\n // \r\n ));\r\n }\r\n if (edit && IsAdmin && baseModel && baseModel.IsClosed) {\r\n actions.push(() => (\r\n \r\n ));\r\n }\r\n if (edit && IsAdmin && baseModel) {\r\n actions.push(() => (\r\n \r\n ));\r\n }\r\n return actions;\r\n }, [\r\n IsAdmin,\r\n baseModel,\r\n busy,\r\n edit,\r\n handleDeleteClick,\r\n handleOpenOrder,\r\n handleSaveClick,\r\n requestCompleted,\r\n showShortView,\r\n t,\r\n ]);\r\n const rightActions = React.useMemo(() => {\r\n return [\r\n () => (\r\n \r\n }\r\n onClick={handleCancelClick}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [handleCancelClick, t]);\r\n\r\n const topActions = React.useMemo(() => {\r\n let actions = [] as ActionRenderer[];\r\n if (edit) {\r\n if (baseModel?.Downtime) {\r\n if (IsAdmin) {\r\n actions.push(() => (\r\n }\r\n href={`/SendEmailToUsers?eid=${\r\n (baseModel.Assets[0] as IAssetDto).ServiceId || ''\r\n }&rf=${\r\n !isNullOrUndefined(baseModel.OfflineEventStart)\r\n ? dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(baseModel.OfflineEventStart),\r\n )\r\n : ''\r\n }&rt=${\r\n !isNullOrUndefined(baseModel.OfflineEventEnd)\r\n ? dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(baseModel.OfflineEventEnd),\r\n )\r\n : ''\r\n }`}\r\n >\r\n {showShortView\r\n ? t(translations.SendCustomEmail_short)\r\n : t(translations.SendCustomEmail)}\r\n \r\n ));\r\n }\r\n actions.push(() => (\r\n }\r\n variant=\"white\"\r\n target={'_blank'}\r\n start={\r\n !isNullOrUndefined(baseModel.OfflineEventStart)\r\n ? dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(baseModel.OfflineEventStart),\r\n )\r\n : ''\r\n }\r\n equipments={[\r\n (baseModel.Assets[0] as IAssetDto)?.ServiceId ?? undefined,\r\n ]}\r\n >\r\n {showShortView\r\n ? t(translations.ViewCalendar_short)\r\n : t(translations.ViewCalendar)}\r\n \r\n ));\r\n }\r\n if (!isNullOrUndefined(baseModel?.RecurringGroupId)) {\r\n actions.push(() => (\r\n \r\n ));\r\n }\r\n }\r\n return actions;\r\n }, [IsAdmin, baseModel, edit, showShortView, t]);\r\n\r\n const notifyUsersRadioGroupOptions = [\r\n {\r\n Id: 'No',\r\n Name: t(translations.No),\r\n Info: '',\r\n },\r\n {\r\n Id: 'JustBookedUsers',\r\n Name: t(translations.JustBookedUsers),\r\n Info: '',\r\n },\r\n {\r\n Id: 'AllAffectedUsers',\r\n Name: t(translations.AllAffectedUsers),\r\n Info: t(translations.AllAffectedUsers_info),\r\n },\r\n ];\r\n\r\n const cancelAffectedReservationsRadioGroupOptions = [\r\n {\r\n Id: 'No',\r\n Name: t(translations.No),\r\n Info: '',\r\n },\r\n {\r\n Id: 'Yes',\r\n Name: t(translations.Yes),\r\n Info: '',\r\n },\r\n ];\r\n\r\n return (\r\n \r\n reservationSwithProps,\r\n } as SwitchActionsProps)\r\n : undefined\r\n }\r\n closeSidePanel={handleCancelClick}\r\n leftTopActions={viewPermissions ? topActions : []}\r\n pageLink={buildURL(publicUrl + 'workorders/details', props.queryParams)}\r\n toPageLink={`workorders/details?${toQueryString(props.queryParams)}`}\r\n leftActions={isReadOnlyUser || !viewPermissions ? [] : leftActions}\r\n rightActions={isReadOnlyUser || !viewPermissions ? [] : rightActions}\r\n cover={cover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n isCover={isCover}\r\n coverClosed={coverClosed}\r\n children={\r\n baseModel !== undefined && !loading ? (\r\n \r\n {viewPermissions || isReadOnlyUser ? (\r\n \r\n openAsset(\r\n { Id: e.Id, useSidePanel: useSidePanel },\r\n openPanel,\r\n )\r\n }\r\n onLinkedClick={linked =>\r\n openPanel({\r\n renderPageType: RenderPageType.WorkOrderDetails,\r\n renderPageProps: {\r\n queryParams: {\r\n id: '' + linked.Id ?? -1,\r\n },\r\n },\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState)\r\n }\r\n user={User}\r\n canView={viewPermissions}\r\n readonlyDetails={readonlyDetails}\r\n commentsFormRef={submitCommentRef}\r\n expanded={!showShortView}\r\n setWorkOrderOfflineStartChangedValue={\r\n setWorkOrderOfflineStartChangedValue\r\n }\r\n setWorkOrderOfflineEndChangedValue={\r\n setWorkOrderOfflineEndChangedValue\r\n }\r\n />\r\n ) : (\r\n // \r\n \r\n \r\n

    \r\n {t(translations.WorkOrderRestrictedNotAllowed) as string}\r\n

    \r\n }\r\n onClick={() => {\r\n if (!!continueTo) {\r\n if (!!continueTo.pageProps && !!continueTo.pageType) {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: continueTo.pageType,\r\n props: continueTo.pageProps,\r\n }),\r\n );\r\n } else if (!!continueTo.continueToLink) {\r\n dispatch(\r\n routerActions.push(continueTo.continueToLink),\r\n );\r\n } else {\r\n handleCancelClick();\r\n }\r\n } else {\r\n handleCancelClick();\r\n }\r\n }}\r\n >\r\n {t(translations.Continue)}\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 confirm={\r\n requestCompleted && sendOfflineEmail ? (\r\n \r\n \r\n {edit\r\n ? t(translations.TheDowntimePeriodHasChangedNotifyUsers)\r\n : t(translations.NotifyUsers)}\r\n \r\n \r\n {isChangedDowntimeShorter() &&\r\n isCloseWorkOrderClicked === false && (\r\n \r\n \r\n {t(translations.CancelAffectedReservations)}\r\n \r\n \r\n \r\n )}\r\n
    \r\n }\r\n confirmButtonLabel={\r\n edit\r\n ? t(translations.UpdateDowntime)\r\n : t(translations.CreateDowntime)\r\n }\r\n cancelButtonLabel={t(translations.Cancel)}\r\n onConfirm={handleSendEmailClick}\r\n onCancel={handleCancelSend}\r\n maxWidth=\"md\"\r\n /* actions={[\r\n () => (\r\n \r\n ),\r\n ]} */\r\n />\r\n ) : showConfirmRecurring ? (\r\n {\r\n setShowConfirmRecurring(false);\r\n }}\r\n actions={[\r\n () => (\r\n \r\n ),\r\n ]}\r\n />\r\n ) : showDeleteRecurring ? (\r\n {\r\n setShowConfirmRecurring(false);\r\n }}\r\n actions={[\r\n () => (\r\n handleDeleteOrder(null)}\r\n />\r\n ),\r\n () => (\r\n \r\n ),\r\n ]}\r\n />\r\n ) : showCloseStatus ? (\r\n {\r\n if (!!closedStatus) {\r\n handleCloseOrder(e, closedStatus);\r\n }\r\n }}\r\n onCancel={() => {\r\n setClosedStatus(undefined);\r\n setShowCloseStatus(false);\r\n }}\r\n onClose={() => {\r\n setClosedStatus(undefined);\r\n setShowCloseStatus(false);\r\n }}\r\n maxWidth=\"md\"\r\n />\r\n ) : (\r\n <>\r\n )\r\n }\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n
    \r\n );\r\n}\r\n","/**\r\n *\r\n * ScreenToShowOnPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { ScreenToShowOn } from 'enums/ScreenToShowOn';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface ScreenToShowOnPickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const getSingleScreenToShowOn = (val: number): Entity => {\r\n return enumToEntityArray(ScreenToShowOn).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\n\r\nexport const initScreenToShowOnData = (\r\n initval: number | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([getSingleScreenToShowOn(initval)]);\r\n });\r\n }\r\n};\r\n\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(ScreenToShowOn);\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\n\r\nexport function ScreenToShowOnPicker(props: ScreenToShowOnPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * InvoiceStatusWithStaticOptionsPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { InvoiceStatuses } from 'enums/InvoiceStatuses';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface InvoiceStatusWithStaticOptionsPickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const getSingleInvoiceStatusWithStaticOptions = (\r\n val: number,\r\n): Entity => {\r\n return enumToEntityArray(InvoiceStatuses).filter(item => {\r\n return item.Id === val;\r\n })[0];\r\n};\r\n\r\nexport const initInvoiceStatusWithStaticOptionsData = (\r\n initval: number | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([getSingleInvoiceStatusWithStaticOptions(initval)]);\r\n });\r\n }\r\n};\r\n\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(InvoiceStatuses);\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\n\r\nexport function InvoiceStatusWithStaticOptionsPicker(\r\n props: InvoiceStatusWithStaticOptionsPickerProps,\r\n) {\r\n return (\r\n \r\n );\r\n}\r\n","import { getSingleScreenToShowOn } from 'app/components/pickers/StaticOptionsPickers/ScreenToShowOnPicker';\r\nimport { AsyncDataState, Entity } from 'types/common';\r\nimport { IBillingActionsDto } from '../../../BillingActionsPage/IBillingActionsDto';\r\nimport { getSingleInvoiceFundingType } from '../../../../../components/pickers/StaticOptionsPickers/FundingTypeIdPicker/index';\r\nimport { getSingleInvoiceStatusWithStaticOptions } from '../../../../../components/pickers/StaticOptionsPickers/InvoiceStatusWithStaticOptionsPicker/index';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { getSinglePaymentMethod } from 'app/components/pickers/StaticOptionsPickers/PaymentMethodEnumPicker';\r\nimport { IEmailRecipientTypesDto } from 'app/pages/BillingActions/BillingActionsPage/IEmailRecipientTypesDto';\r\nimport { IEmailAttachmentTypesDto } from 'app/pages/BillingActions/BillingActionsPage/IEmailAttachmentTypesDto';\r\nimport i18next from 'i18next';\r\n\r\n/* --- STATE --- */\r\nexport interface BillingActionsState {\r\n createState: AsyncDataState;\r\n updateState: AsyncDataState;\r\n processing: boolean;\r\n}\r\n\r\nexport interface BillingActionsDetailsState {\r\n Id: number;\r\n OperationName: string | null;\r\n ShowOn: Entity | null; //Enum\r\n FundingType: Entity | null; //Enum\r\n IsSendEmail: boolean;\r\n IsSftpUpload: boolean;\r\n EmailRecipientTypes: Entity[];\r\n SpecificEmailAddresses: string | null | undefined;\r\n Body: string | null | undefined;\r\n Subject: string | null | undefined;\r\n EmailAttachmentTypes: Entity[];\r\n ChangeStatusTo: Entity | null; //Enum\r\n GeneratePayment: Entity | null; //Enum\r\n}\r\n\r\nexport interface BillingActionsDetailsQStringParameters {\r\n id?: string; //Id\r\n opName?: string; //OperationName\r\n showOn?: string; //ShowOn\r\n fundingT?: string; //FundingType\r\n isSendEmail?: string; //IsSendEmail\r\n isSftpUpload?: string;\r\n //emailRecTypes?: string;\r\n specEmailAd?: string; //SpecificEmailAddresses\r\n body?: string; //Body\r\n sub?: string; //Subject\r\n //emailAttTypes?: string;\r\n chgStatTo?: string; //ChangeStatusTo\r\n genPay?: string; //Generate Payment\r\n}\r\n\r\nexport interface BillingActionsDetailsResponse extends IResponseType {\r\n Id?: number;\r\n}\r\n\r\nexport function ConvertModelToEntityBillingActionsDetails(\r\n entity: IBillingActionsDto,\r\n): BillingActionsDetailsState | undefined {\r\n if (!entity) {\r\n return undefined;\r\n } else {\r\n return {\r\n Id: entity.Id,\r\n OperationName: entity.OperationName,\r\n ShowOn: getSingleScreenToShowOn(entity.ShowOn),\r\n FundingType: getSingleInvoiceFundingType(entity.FundingType),\r\n IsSendEmail: entity.IsSendEmail ?? false,\r\n IsSftpUpload: entity.IsSftpUpload ?? false,\r\n SpecificEmailAddresses: entity.SpecificEmailAddresses,\r\n Body: entity.Body,\r\n Subject: entity.Subject,\r\n EmailRecipientTypes: entity.EmailRecipientTypes.map(i => {\r\n return {\r\n Id: i.Id,\r\n Name: i18next.t(i.Name) as string,\r\n } as IEmailRecipientTypesDto;\r\n }) as IEmailRecipientTypesDto[],\r\n EmailAttachmentTypes: entity.EmailAttachmentTypes.map(i => {\r\n return {\r\n Id: i.Id,\r\n Name: i18next.t(i.Name) as string,\r\n } as IEmailAttachmentTypesDto;\r\n }) as IEmailAttachmentTypesDto[],\r\n ChangeStatusTo: getSingleInvoiceStatusWithStaticOptions(\r\n entity.ChangeStatusTo,\r\n ),\r\n GeneratePayment: getSinglePaymentMethod(entity.GeneratePayment),\r\n } as BillingActionsDetailsState;\r\n }\r\n}\r\n\r\nexport function ConvertEntityToModelBillingActionsDetails(\r\n model: BillingActionsDetailsState,\r\n original: BillingActionsDetailsState | undefined,\r\n): IBillingActionsDto {\r\n let entity = {\r\n Id: original?.Id === undefined ? model.Id : original.Id,\r\n OperationName: model.OperationName,\r\n ShowOn: model.ShowOn?.Id,\r\n FundingType: model.FundingType?.Id,\r\n IsSendEmail: model.IsSendEmail ?? false,\r\n IsSftpUpload: model.IsSftpUpload ?? false,\r\n SpecificEmailAddresses: model.SpecificEmailAddresses,\r\n Body: model.Body,\r\n Subject: model.Subject,\r\n EmailRecipientTypes: model.EmailRecipientTypes.map(i => {\r\n return {\r\n Id: i.Id,\r\n Name: i18next.t(i.Name) as string,\r\n } as IEmailRecipientTypesDto;\r\n }) as IEmailRecipientTypesDto[],\r\n EmailAttachmentTypes: model.EmailAttachmentTypes.map(i => {\r\n return {\r\n Id: i.Id,\r\n Name: i18next.t(i.Name) as string,\r\n } as IEmailAttachmentTypesDto;\r\n }) as IEmailAttachmentTypesDto[],\r\n ChangeStatusTo: model.ChangeStatusTo?.Id,\r\n GeneratePayment: model.GeneratePayment?.Id,\r\n } as IBillingActionsDto;\r\n return entity;\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, takeLatest } from 'redux-saga/effects';\r\nimport {\r\n BillingActionsDetailsQStringParameters,\r\n BillingActionsDetailsResponse,\r\n BillingActionsDetailsState,\r\n ConvertEntityToModelBillingActionsDetails,\r\n //ConvertNewBillingActionsDetailsToModel,\r\n} from './types';\r\nimport { BillingActionsApi } from '../../../../../../api/BillingActionsApi';\r\nimport { billingActionsDetailsActions as actions } from '.';\r\nimport { IBillingActionsDto } from '../../../BillingActionsPage/IBillingActionsDto';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport { translations } from 'locales/translations';\r\nimport i18next from 'i18next';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { BillingActionsDetailsProps } from '..';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { AxiosError } from 'axios';\r\n\r\nfunction* doInitCreate(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n const data = yield call(BillingActionsApi.initCreateData, action.payload);\r\n yield put(actions.initBillingActionsDetails_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initBillingActionsDetails_Error(error));\r\n }\r\n}\r\n\r\nfunction* doInitUpdate(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n const data = yield call(BillingActionsApi.initUpdateData, action.payload);\r\n yield put(actions.initUpdateBillingActionsDetails_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initUpdateBillingActionsDetails_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doCreate(action: PayloadAction) {\r\n const httpPayloads: IBillingActionsDto = ConvertEntityToModelBillingActionsDetails(\r\n action.payload,\r\n undefined,\r\n );\r\n try {\r\n const result = yield call(\r\n BillingActionsApi.insertBillingActionsDetails,\r\n httpPayloads,\r\n );\r\n let response: BillingActionsDetailsResponse = result as BillingActionsDetailsResponse;\r\n\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: 'billingActionsInsert',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'billingActionsInsert',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n if (response.Id) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'billingActionsInsert',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: true,\r\n itemName: i18next.t(translations.WorkOrdersPageName),\r\n detailsType: RenderPageType.AddBillingAction,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + response.Id,\r\n } as BillingActionsDetailsQStringParameters,\r\n useSidePanel: true,\r\n } as BillingActionsDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'billingActionsInsertSuccess',\r\n message: response.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.createBillingActionsDetails_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'billingActionsInsert',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createBillingActionsDetails_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doUpdate(\r\n action: PayloadAction<{\r\n current: BillingActionsDetailsState;\r\n original: BillingActionsDetailsState | undefined;\r\n }>,\r\n) {\r\n const httpPayloads: IBillingActionsDto = ConvertEntityToModelBillingActionsDetails(\r\n action.payload.current,\r\n action.payload.original,\r\n );\r\n try {\r\n const results = yield call(\r\n BillingActionsApi.updateBillingActionsDetails,\r\n httpPayloads,\r\n );\r\n let response = results as BillingActionsDetailsResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: 'billingActionsUpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'billingActionsUpdateWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'billingActionsUpdate',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: false,\r\n itemName: i18next.t(translations.BillingActionsPageName),\r\n detailsType: RenderPageType.AddBillingAction,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + response.Id,\r\n } as BillingActionsDetailsQStringParameters,\r\n useSidePanel: true,\r\n } as BillingActionsDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.updateBillingActionsDetails_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'billingActionsUpdateErr',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateBillingActionsDetails_Error(Error));\r\n }\r\n}\r\n\r\nexport function* billingActionsDetailsSaga() {\r\n yield takeLatest(actions.initBillingActionsDetails.type, doInitCreate);\r\n yield takeLatest(actions.initUpdateBillingActionsDetails.type, doInitUpdate);\r\n yield takeLatest(actions.createBillingActionsDetails.type, doCreate);\r\n yield takeLatest(actions.updateBillingActionsDetails.type, doUpdate);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IBillingActionsDto } from 'app/pages/BillingActions/BillingActionsPage/IBillingActionsDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { billingActionsDetailsSaga } from './saga';\r\nimport {\r\n //BillingActionsDetailsGlobalState,\r\n BillingActionsDetailsState,\r\n BillingActionsDetailsQStringParameters,\r\n BillingActionsState,\r\n ConvertModelToEntityBillingActionsDetails,\r\n} from './types';\r\n\r\nexport const initialState: BillingActionsState = {\r\n processing: false,\r\n createState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n updateState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'billingActionsDetail',\r\n initialState,\r\n reducers: {\r\n initBillingActionsDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = true;\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initUpdateBillingActionsDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = true;\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initBillingActionsDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.createState.data = ConvertModelToEntityBillingActionsDetails(\r\n action.payload,\r\n );\r\n },\r\n initUpdateBillingActionsDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.updateState.data = ConvertModelToEntityBillingActionsDetails(\r\n action.payload,\r\n );\r\n },\r\n initBillingActionsDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n initUpdateBillingActionsDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n //====================================================================\r\n resetUpdateBillingActionsDetailsState(state, action: PayloadAction) {\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n resetCreateBillingActionsDetailsState(state, action: PayloadAction) {\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n //====================================================================\r\n updateBillingActionsDetails(\r\n state,\r\n action: PayloadAction<{\r\n current: BillingActionsDetailsState;\r\n original: BillingActionsDetailsState | undefined;\r\n }>,\r\n ) {\r\n state.updateState.processing = true;\r\n state.updateState.completed = undefined;\r\n state.updateState.hasErrors = undefined;\r\n },\r\n updateBillingActionsDetails_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.updateState.processing = false;\r\n state.updateState.hasErrors = action.payload.hasErrors;\r\n state.updateState.completed = true;\r\n },\r\n updateBillingActionsDetails_Error(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n state.updateState.hasErrors = true;\r\n },\r\n //====================================================================\r\n createBillingActionsDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.createState.processing = true;\r\n state.createState.completed = undefined;\r\n state.createState.hasErrors = undefined;\r\n },\r\n createBillingActionsDetails_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.createState.processing = false;\r\n state.createState.hasErrors = action.payload.hasErrors;\r\n state.createState.completed = true;\r\n },\r\n createBillingActionsDetails_Error(state, action: PayloadAction) {\r\n state.createState.processing = false;\r\n state.createState.completed = true;\r\n state.createState.hasErrors = true;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: billingActionsDetailsActions } = slice;\r\n\r\nexport const useBillingActionsDetailsSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: billingActionsDetailsSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.billingActionsDetail || initialState;\r\n\r\nexport const selectBillingActionsDetails = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n//====================================================================\r\nexport const selectCreateBillingActionsDetails = createSelector(\r\n [selectBillingActionsDetails],\r\n state => state.createState.data,\r\n);\r\n\r\nexport const selectCreateBillingActionsDetailsCompleted = createSelector(\r\n [selectBillingActionsDetails],\r\n state => state.createState.completed,\r\n);\r\n\r\nexport const selectCreateBillingActionsDetailsHasError = createSelector(\r\n [selectBillingActionsDetails],\r\n state => state.createState.hasErrors,\r\n);\r\n//====================================================================\r\nexport const selectUpdateBillingActionsDetails = createSelector(\r\n [selectBillingActionsDetails],\r\n state => state.updateState.data,\r\n);\r\n\r\nexport const selectUpdateBillingActionsDetailsCompleted = createSelector(\r\n [selectBillingActionsDetails],\r\n state => state.updateState.completed,\r\n);\r\nexport const selectUpdateBillingActionsDetailsHasError = createSelector(\r\n [selectBillingActionsDetails],\r\n state => state.updateState.hasErrors,\r\n);\r\n//====================================================================\r\nexport const selectBillingActionsDetailsProcessing = createSelector(\r\n [selectBillingActionsDetails],\r\n state => state.processing,\r\n);\r\n","/**\r\n *\r\n * MultiSelectBasicPicker for EmailAttachmentTypePicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n AutocompleteMultiPicker,\r\n AutocompleteMultiPickerProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPicker';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport i18next from 'i18next';\r\nimport { IEmailAttachmentTypesDto } from 'app/pages/BillingActions/BillingActionsPage/IEmailAttachmentTypesDto';\r\n\r\nexport interface EATBaseURLMultiPickerProps\r\n extends Omit, 'loadData'> {\r\n url: string;\r\n queryfilter?: string | undefined;\r\n}\r\n\r\nexport function EATBaseURLMultiPicker(props: EATBaseURLMultiPickerProps) {\r\n const { url, queryfilter, ...other } = props;\r\n const loadData = async (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n const predicates: string[] = [];\r\n if (queryfilter !== undefined && queryfilter !== '') {\r\n predicates.push(queryfilter);\r\n }\r\n\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm !== null ? searchTerm : undefined,\r\n }).toString();\r\n\r\n const response = await httpClient.get(url, params);\r\n return response.value.map(i => {\r\n return {\r\n Id: i.Id,\r\n Name: i18next.t(i.Name) as string,\r\n } as IEmailAttachmentTypesDto;\r\n });\r\n };\r\n return ;\r\n}\r\n","/**\r\n *\r\n * EmailAttachmentTypePicker(multi)\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity } from 'types/common';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport i18next from 'i18next';\r\nimport { IEmailAttachmentTypesDto } from 'app/pages/BillingActions/BillingActionsPage/IEmailAttachmentTypesDto';\r\nimport { EATBaseURLMultiPicker } from './EATBaseURLMultiPicker';\r\n\r\nexport interface EmailAttachmentTypePickerProps {\r\n value?: Entity[] | null;\r\n name?: string;\r\n error?: boolean;\r\n label?: string;\r\n className?: string | undefined;\r\n helperText?: string;\r\n placeholder?: string | undefined;\r\n // value: Entity[];\r\n defaultValue?: Entity[];\r\n onChange: (value: Entity[]) => void;\r\n onBlur?: React.FocusEventHandler;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n info?: string;\r\n id?: string;\r\n required?: boolean;\r\n fullWidth?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/EmailAttachmentTypesFilter';\r\n\r\nexport const initEmailAttachmentTypesData = (\r\n initval: string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: new Condition('Id', ODataOperators.Equals, id).toString(),\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient.get(url, params).then(\r\n response =>\r\n response.value.map(i => {\r\n return {\r\n Id: i.Id,\r\n Name: i18next.t(i.Name) as string,\r\n } as IEmailAttachmentTypesDto;\r\n }) as Entity[],\r\n );\r\n }\r\n};\r\n\r\nexport function EmailAttachmentTypePicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n ...props\r\n}: EmailAttachmentTypePickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FormEmailAttachmentTypePicker(multi) AsyncPicker\r\n *\r\n */\r\n\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { EmailAttachmentTypePicker } from '../pickers/MultiSelectPickers/EmailAttachmentTypePicker';\r\n\r\nexport const FormEmailAttachmentTypePicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig[] | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField[] | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * FormInvoiceStatusPicker AsyncPicker\r\n *\r\n */\r\n\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { InvoiceStatusWithStaticOptionsPicker } from '../pickers/StaticOptionsPickers/InvoiceStatusWithStaticOptionsPicker';\r\n\r\nexport const FormInvoiceStatusPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * FormScreenToShowOnPicker AsyncPicker\r\n *\r\n */\r\n\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { ScreenToShowOnPicker } from '../pickers/StaticOptionsPickers/ScreenToShowOnPicker';\r\n\r\nexport const FormScreenToShowOnPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * FormPaymentMethodEnumPicker AsyncPicker\r\n *\r\n */\r\n\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { PaymentMethodEnumPicker } from '../pickers/StaticOptionsPickers/PaymentMethodEnumPicker';\r\n\r\nexport const FormPaymentMethodEnumPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * MultiSelectBasicPicker for EmailRecipientTypePicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n AutocompleteMultiPicker,\r\n AutocompleteMultiPickerProps,\r\n} from 'app/components/BasicPickers/AutocompleteMultiPicker';\r\nimport { ODataFilterBuilder } from 'api/odata/ODataFilter';\r\nimport i18next from 'i18next';\r\nimport { IEmailRecipientTypesDto } from 'app/pages/BillingActions/BillingActionsPage/IEmailRecipientTypesDto';\r\n\r\nexport interface ERTBaseURLMultiPickerProps\r\n extends Omit, 'loadData'> {\r\n url: string;\r\n queryfilter?: string | undefined;\r\n}\r\n\r\nexport function ERTBaseURLMultiPicker(props: ERTBaseURLMultiPickerProps) {\r\n const { url, queryfilter, ...other } = props;\r\n const loadData = async (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n const predicates: string[] = [];\r\n if (queryfilter !== undefined && queryfilter !== '') {\r\n predicates.push(queryfilter);\r\n }\r\n\r\n params.$filter = new ODataFilterBuilder>({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm !== null ? searchTerm : undefined,\r\n }).toString();\r\n\r\n const response = await httpClient.get(url, params);\r\n return response.value.map(i => {\r\n return {\r\n Id: i.Id,\r\n Name: i18next.t(i.Name) as string,\r\n } as IEmailRecipientTypesDto;\r\n });\r\n };\r\n return ;\r\n}\r\n","/**\r\n *\r\n * EmailRecipientTypesPicker(multi)\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { Entity } from 'types/common';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { ERTBaseURLMultiPicker } from './ERTBaseURLMultiPicker';\r\n\r\nexport interface EmailRecipientTypesPickerProps {\r\n value?: Entity[] | null;\r\n name?: string;\r\n error?: boolean;\r\n label?: string;\r\n className?: string | undefined;\r\n helperText?: string;\r\n placeholder?: string | undefined;\r\n // value: Entity[];\r\n defaultValue?: Entity[];\r\n onChange: (value: Entity[]) => void;\r\n onBlur?: React.FocusEventHandler;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n info?: string;\r\n id?: string;\r\n required?: boolean;\r\n fullWidth?: boolean;\r\n}\r\n\r\nconst url = '/api/odata/v4/EmailRecipientTypesFilter';\r\n\r\nexport const initEmailRecipientTypesData = (\r\n initval: string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: new Condition('Id', ODataOperators.Equals, id).toString(),\r\n $select: 'Id,Name',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\n\r\nexport function EmailRecipientTypesPicker({\r\n label,\r\n defaultValue,\r\n placeholder,\r\n className,\r\n required,\r\n helperText,\r\n onChange,\r\n variant,\r\n info,\r\n id,\r\n value,\r\n ...props\r\n}: EmailRecipientTypesPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FormEmailRecipientTypes(multi) AsyncPicker\r\n *\r\n */\r\n\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { EmailRecipientTypesPicker } from '../pickers/MultiSelectPickers/EmailRecipientTypesPicker';\r\n\r\nexport const FormEmailRecipientTypesPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig[] | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField[] | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n />\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { FormHelperText } from '@material-ui/core';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { FormEmailAttachmentTypePicker } from 'app/components/Forms/FormEmailAttachmentTypePicker';\r\nimport { FormFundingTypePicker } from 'app/components/Forms/FormFundingTypePicker';\r\nimport { FormInvoiceStatusPicker } from 'app/components/Forms/FormInvoiceStatusPicker';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { FormScreenToShowOnPicker } from 'app/components/Forms/FormScreenToShowOnPicker';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRightSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { BillingActionsDetailsState } from '../slice/types';\r\nimport { FormSwitch } from 'app/components/Forms/Switch';\r\nimport { FormPaymentMethodEnumPicker } from '../../../../../components/Forms/FormPaymentMethodEnumPicker';\r\nimport { FormEmailRecipientTypesPicker } from 'app/components/Forms/FormEmailRecipientTypesPicker';\r\nimport { FormListener } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { selectAppSettings } from 'app/slice/selectors';\r\nimport { BudgetFields } from 'enums/BudgetFields';\r\nimport { useSelector } from 'react-redux';\r\nimport { IsBudgetFieldEnabled, IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport i18next from 'i18next';\r\nimport { EntityNumberSchema } from 'app/components/Forms/Schemas';\r\nimport * as Yup from 'yup';\r\n\r\nexport interface BillingActionsFormProps {\r\n initialValues: BillingActionsDetailsState;\r\n onSubmit: (item: BillingActionsDetailsState) => void;\r\n isEdit: boolean;\r\n isAdmin: boolean;\r\n bindSubmitForm: any;\r\n}\r\n\r\nexport const BillingActionsForm = React.memo(function BillingActionsForm({\r\n initialValues,\r\n onSubmit,\r\n isEdit,\r\n isAdmin,\r\n bindSubmitForm,\r\n}: BillingActionsFormProps): JSX.Element {\r\n //SETTINGS\r\n const { t } = useTranslation();\r\n const appSettings = useSelector(selectAppSettings);\r\n const isSftpEnabled = IsModuleEnabled(\r\n appSettings ?? null,\r\n KnownModules.SAP_SFTP,\r\n ) as boolean;\r\n const budgetFieldFundingTypeEnabled:\r\n | boolean\r\n | undefined = (IsBudgetFieldEnabled(\r\n appSettings ?? null,\r\n BudgetFields.FundingType,\r\n ) ||\r\n IsModuleEnabled(appSettings ?? null, KnownModules.CostObjects)) as boolean;\r\n\r\n //STATES\r\n const [IsSendEmailChanged, setIsSendEmailChanged] = React.useState(\r\n false,\r\n );\r\n const [IsSftpUploadChanged, setIsSftpUploadChanged] = React.useState(\r\n false,\r\n );\r\n //FUNCTIONS\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value);\r\n }\r\n };\r\n\r\n const handleFormChange = React.useCallback(\r\n (values: BillingActionsDetailsState, isValid, dirty, setValue) => {\r\n if (IsSendEmailChanged) {\r\n setValue('EmailRecipientTypes', [], false);\r\n setValue('EmailAttachmentTypes', [], false);\r\n setValue('SpecificEmailAddresses', '', false);\r\n setValue('Subject', '', false);\r\n setValue('Body', '', false);\r\n setIsSendEmailChanged(false);\r\n }\r\n if (IsSftpUploadChanged) {\r\n setValue('EmailRecipientTypes', [], false);\r\n setValue('EmailAttachmentTypes', [], false);\r\n setValue('SpecificEmailAddresses', '', false);\r\n setValue('Subject', '', false);\r\n setValue('Body', '', false);\r\n setIsSftpUploadChanged(false);\r\n }\r\n },\r\n [IsSendEmailChanged, IsSftpUploadChanged],\r\n );\r\n\r\n //VALIDATION SCHEMA for BillingActionsDetails Form\r\n const isMultipleEmails = {\r\n name: 'isMultipleEmails',\r\n // eslint-disable-next-line no-template-curly-in-string\r\n message: '${path} not all are a valid email',\r\n test: async value => {\r\n if (!value) return true;\r\n let values = value.split(',');\r\n //let values = value.replace(/\\s/g, '').split(',');\r\n let res = await Promise.all(\r\n values.map(\r\n async v => (await Yup.string().email().isValid(v)) && v !== '',\r\n ),\r\n );\r\n return res.every(v => !!v);\r\n },\r\n };\r\n\r\n const billingActionsDetailsSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().notRequired().default(-1),\r\n OperationName: Yup.string()\r\n .nullable()\r\n .default('')\r\n .required(i18next.t(translations.err_OperationNameRequired))\r\n .label(i18next.t(translations.OperationName)),\r\n ShowOn: Yup.mixed()\r\n .label(i18next.t(translations.ShowOn))\r\n .required(i18next.t(translations.err_ShowOn)),\r\n FundingType: Yup.mixed()\r\n .label(i18next.t(translations.FundingType))\r\n .when(['YupFundingType'], {\r\n is: () => budgetFieldFundingTypeEnabled === true,\r\n then: schema =>\r\n schema.required(i18next.t(translations.FundingTypeIsRequired)),\r\n otherwise: schema => schema.notRequired(),\r\n }),\r\n ChangeStatusTo: Yup.mixed().label(i18next.t(translations.ChangeStatusTo)),\r\n GeneratePayment: Yup.mixed().label(\r\n i18next.t(translations.GeneratePayment),\r\n ),\r\n IsSendEmail: Yup.boolean()\r\n .default(false)\r\n .label(i18next.t(translations.IsSendEmail)),\r\n IsSftpUpload: Yup.boolean()\r\n .default(false)\r\n .label(i18next.t(translations.IsSftpUpload)),\r\n EmailRecipientTypes: Yup.array()\r\n .of(EntityNumberSchema)\r\n .label(i18next.t(translations.EmailRecipientTypes)),\r\n SpecificEmailAddresses: Yup.string()\r\n .nullable()\r\n .test(isMultipleEmails)\r\n .default('')\r\n .label(i18next.t(translations.SpecificEmailAddresses))\r\n .when(['EmailRecipientTypes', 'IsSendEmail'], {\r\n is: (EmailRecipientTypes, IsSendEmail) =>\r\n EmailRecipientTypes.length <= 0 && IsSendEmail === true,\r\n then: schema => schema.required(i18next.t(translations.Required)),\r\n otherwise: schema => schema.notRequired(),\r\n }),\r\n Body: Yup.string()\r\n .nullable()\r\n .notRequired()\r\n .label(i18next.t(translations.Body)),\r\n Subject: Yup.string()\r\n .nullable()\r\n //.required(i18next.t(translations.EmailSubject_RequiredField))\r\n .label(i18next.t(translations.Subject)),\r\n EmailAttachmentTypes: Yup.array()\r\n .of(EntityNumberSchema)\r\n .when(['IsSftpUpload'], {\r\n is: IsSftpUpload => IsSftpUpload === true,\r\n then: schema => schema.required(i18next.t(translations.Required)),\r\n otherwise: schema => schema.notRequired(),\r\n })\r\n .label(i18next.t(translations.EmailAttachmentTypes)),\r\n },\r\n );\r\n\r\n //RENDER\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n console.debug('Submitting: ', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n //console.log('Billing Actions Details Errors: ', formik.errors);\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 \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 setIsSendEmailChanged(true)}\r\n />\r\n \r\n {isSftpEnabled && (\r\n \r\n setIsSftpUploadChanged(true)}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {/* to make it visible only if specific email is choosen */}\r\n \r\n {!!formik.errors.Id && (\r\n \r\n \r\n {formik.errors.Id}\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 );\r\n});\r\n","/**\r\n *\r\n * BillingActions_Actions\r\n *\r\n */\r\n\r\nimport { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\n\r\nexport interface SaveFormButtonProps extends ButtonProps {\r\n edit: boolean;\r\n text: string;\r\n onClick: (e: any) => void;\r\n}\r\n\r\nexport function SaveFormButton({\r\n edit,\r\n text,\r\n onClick,\r\n ...props\r\n}: SaveFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { useTranslation } from 'react-i18next';\r\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n BillingActionsDetailsState,\r\n BillingActionsDetailsQStringParameters,\r\n} from './slice/types';\r\nimport { useBillingActionsDetailsSlice } from './slice/index';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n selectBillingActionsDetailsProcessing,\r\n selectCreateBillingActionsDetails,\r\n selectCreateBillingActionsDetailsCompleted,\r\n selectUpdateBillingActionsDetails,\r\n selectUpdateBillingActionsDetailsCompleted,\r\n //selectCreateBillingActionsDetailsHasError,\r\n //selectUpdateBillingActionsDetailsHasError,\r\n} from './slice/selectors';\r\nimport { Fragment, useCallback, useEffect, useRef, useState } from 'react';\r\nimport {\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n selectContinueToLink,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { push } from 'connected-react-router';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { BillingActionsForm } from './BillingActionsForm/index';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { SaveFormButton } from './Actions/BillingActions_Actions';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\n\r\nexport interface BillingActionsDetailsProps extends SidePanelContentProps {\r\n queryParams: BillingActionsDetailsQStringParameters;\r\n}\r\n\r\nexport function BillingActionsDetails(\r\n props: BillingActionsDetailsProps,\r\n): JSX.Element {\r\n //PROPS\r\n const { queryParams, useSidePanel } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n\r\n //PERMISSIONS\r\n const User = useSelector(selectAuthenticatedUser);\r\n const IsAdmin =\r\n User !== undefined && User.Roles.includes(Roles.Administrators);\r\n\r\n //SLICES\r\n const { actions } = useBillingActionsDetailsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n\r\n //SELECTORS\r\n const publicUrl = useSelector(selectPublicUrl);\r\n //====================================================================\r\n const hasUnsavedChanges = useSelector(selectHasNotSavedChanges, shallowEqual);\r\n const continueLink = useSelector(selectContinueToLink);\r\n const loading = useSelector(selectBillingActionsDetailsProcessing);\r\n //====================================================================\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const continueToOther = useSelector(selectContinueState);\r\n //====================================================================\r\n const requestCreateCompleted = useSelector(\r\n selectCreateBillingActionsDetailsCompleted,\r\n );\r\n const requestUpdateCompleted = useSelector(\r\n selectUpdateBillingActionsDetailsCompleted,\r\n );\r\n //====================================================================\r\n //const hasCreateError = useSelector(selectCreateBillingActionsDetailsHasError);\r\n //const hasUpdateError = useSelector(selectUpdateBillingActionsDetailsHasError);\r\n //const hasError = hasCreateError || hasUpdateError;\r\n //====================================================================\r\n const createModel = useSelector(\r\n selectCreateBillingActionsDetails,\r\n shallowEqual,\r\n );\r\n const editModel = useSelector(\r\n selectUpdateBillingActionsDetails,\r\n shallowEqual,\r\n );\r\n const baseModel = createModel || editModel;\r\n //====================================================================\r\n\r\n //STATES\r\n const [edit, setEdit] = useState(false);\r\n const [busy, setBusy] = useState(false);\r\n const [requestCompleted, setRequestCompleted] = useState(\r\n undefined,\r\n );\r\n\r\n //REF\r\n const submitFormRef = useRef(null);\r\n\r\n //FUNCTIONS\r\n const bindSubmitForm = useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n\r\n const handleSaveClick = (e: any) => {\r\n handleSubmitForm(e);\r\n };\r\n\r\n const handleSubmit = useCallback(\r\n (values: BillingActionsDetailsState) => {\r\n setBusy(true);\r\n if (edit) {\r\n dispatch(\r\n actions.updateBillingActionsDetails({\r\n current: values,\r\n original: baseModel,\r\n }),\r\n );\r\n } else {\r\n let value = values as BillingActionsDetailsState;\r\n console.debug('Data: ', value);\r\n dispatch(actions.createBillingActionsDetails(values));\r\n }\r\n },\r\n [actions, baseModel, dispatch, edit],\r\n );\r\n\r\n const handleCancelClick = useCallback(() => {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/BillingActions'));\r\n }\r\n if (edit) {\r\n dispatch(actions.resetUpdateBillingActionsDetailsState());\r\n } else {\r\n dispatch(actions.resetCreateBillingActionsDetailsState());\r\n }\r\n }, [actions, dispatch, edit, layoutActions, useSidePanel]);\r\n\r\n const handleClose = () => {\r\n if (hasUnsavedChanges) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n } else {\r\n handleCancelClick();\r\n }\r\n };\r\n\r\n //USE EFFECT ON MOUNT\r\n useEffectOnMount(() => {\r\n if (\r\n queryParams.id !== undefined &&\r\n !isNaN(parseInt(queryParams.id || ''))\r\n ) {\r\n dispatch(actions.initUpdateBillingActionsDetails(queryParams));\r\n } else {\r\n dispatch(actions.initBillingActionsDetails(queryParams));\r\n }\r\n setBusy(false);\r\n setEdit(false);\r\n setRequestCompleted(undefined);\r\n return () => {};\r\n });\r\n\r\n //USE EFFECT\r\n useEffect(() => {\r\n let active = loading === false;\r\n if (active) {\r\n if (queryParams.id !== undefined && !isNaN(parseInt(queryParams.id))) {\r\n setEdit(true);\r\n }\r\n if (requestCreateCompleted === true || requestUpdateCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n } else if (\r\n requestCreateCompleted === false ||\r\n requestUpdateCompleted === false\r\n ) {\r\n setRequestCompleted(false);\r\n setBusy(false);\r\n }\r\n if (requestUpdateCompleted === true || requestCreateCompleted === true) {\r\n handleCancelClick();\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n handleCancelClick,\r\n loading,\r\n queryParams.id,\r\n requestCreateCompleted,\r\n requestUpdateCompleted,\r\n ]);\r\n\r\n //USE EFFECT 2\r\n useEffect(() => {\r\n if (confirmApproved) {\r\n if (edit) {\r\n dispatch(actions.resetUpdateBillingActionsDetailsState());\r\n } else {\r\n dispatch(actions.resetCreateBillingActionsDetailsState());\r\n }\r\n if (continueToOther.continueOnApprove) {\r\n dispatch(layoutActions.resetSidePanel());\r\n setTimeout(() => {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: continueToOther.pageType,\r\n props: continueToOther.pageProps,\r\n expanded: continueToOther.expanded,\r\n }),\r\n );\r\n dispatch(layoutActions.resetContinueState());\r\n }, 200);\r\n } else if (continueLink !== undefined) {\r\n dispatch(appSettingsActions.navigate(continueLink));\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n }\r\n if (confirmRejected) {\r\n dispatch(layoutActions.resetConfirmState());\r\n }\r\n return () => undefined;\r\n }, [\r\n actions,\r\n appSettingsActions,\r\n confirmApproved,\r\n confirmRejected,\r\n continueLink,\r\n continueToOther,\r\n dispatch,\r\n edit,\r\n layoutActions,\r\n ]);\r\n\r\n //LEFT ACTIONS\r\n const leftActions = [\r\n () => (\r\n \r\n }\r\n onClick={handleSaveClick}\r\n disabled={busy}\r\n processing={!requestCompleted && busy}\r\n edit={edit}\r\n text={t(translations.Save)}\r\n />\r\n \r\n ),\r\n ] as ActionRenderer[];\r\n\r\n //RIGHT ACTIONS\r\n const rightActions = [\r\n () => (\r\n \r\n }\r\n onClick={handleCancelClick}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n\r\n //RENDER\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 {hasUnsavedChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n}\r\n","import { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport BooleanPickerFilter from 'app/components/BasicTable/Filters/BooleanPickerFilter';\r\nimport { ServiceGroupsFilter } from 'app/components/BasicTable/Filters/ServiceGroupsFilter';\r\nimport { SuperGroupFilter } from 'app/components/BasicTable/Filters/SuperGroupFilter';\r\nimport {\r\n arrayToQueryString,\r\n GetBooleanEntity,\r\n GetBooleanOrUndefined,\r\n getNumberEntityArray,\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n initMultiExPickerValue,\r\n initPickerValue,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { initSuperGroupData } from 'app/components/pickers/AutocompletePickers/SuperGroupPicker';\r\nimport { initServiceGroupsMultiData } from 'app/components/pickers/MultiSelectPickers/ServiceGroupsPicker';\r\nimport { Roles } from 'app/slice/types';\r\nimport { translations } from 'locales/translations';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParams(search);\r\n const isAdmin =\r\n !!user &&\r\n (user.Roles.includes(Roles.Administrators) ||\r\n user.Roles.includes(Roles.GroupAdministrators));\r\n const hasOwnedGroups =\r\n !!user && user.AdminServiceGroups && user.AdminServiceGroups.length > 0;\r\n const res: IFilterSettings[] = [\r\n {\r\n fieldName: 'Id',\r\n displayName: t(translations.ServiceGroup),\r\n operator: ODataOperators.Includes,\r\n queryStringSerializer: arrayToQueryString('sgids'),\r\n value: getNumberEntityArray(params, 'sgids'),\r\n initData: initMultiExPickerValue(initServiceGroupsMultiData),\r\n component: ServiceGroupsFilter,\r\n urlKey: 'sgids',\r\n },\r\n {\r\n fieldName: 'DivisionId',\r\n displayName: t(translations.Division),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'divisionId',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'divisionId')),\r\n ),\r\n component: SuperGroupFilter,\r\n initData: initPickerValue(initSuperGroupData),\r\n },\r\n ];\r\n if (hasOwnedGroups) {\r\n res.push({\r\n fieldName: 'OwnedByMe',\r\n displayName: t(translations.OnlyMyCores),\r\n queryStringSerializer: 'ownedbyme',\r\n operator: ODataOperators.Equals,\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'ownedbyme')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n });\r\n }\r\n if (isAdmin) {\r\n res.push({\r\n fieldName: 'Active',\r\n displayName: t(translations.Active),\r\n queryStringSerializer: 'Active',\r\n operator: ODataOperators.Equals,\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'Active')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n });\r\n }\r\n return res;\r\n};\r\n","import { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\nimport { toQueryString } from 'utils/url-utils';\r\n\r\nexport const getDefaultFilter = (onlyMyCores: boolean) => {\r\n const result = (user: IAuthenticatedUser) =>\r\n toQueryString({\r\n ownedbyme: onlyMyCores === true ? true : undefined,\r\n });\r\n return result;\r\n};\r\nexport function getRequiredFilter(search: string) {\r\n const result = isEmptyOrWhitespace(search)\r\n ? new URLSearchParams()\r\n : new URLSearchParams(search);\r\n if (\r\n result.has('Active') === false ||\r\n result.get('Active') === null ||\r\n result.get('Active') === ''\r\n ) {\r\n result.set('Active', true.toString());\r\n }\r\n const res = result.toString();\r\n return isEmptyOrWhitespace(res) ? undefined : res;\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { IPermissionLevelDto } from 'api/odata/generated/entities/IPermissionLevelDto';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface PermissionLevelPickerProps\r\n extends Omit, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/PermissionLevelFilter';\r\nexport const initPermissionLevelData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition)[] | undefined,\r\n globalServiceGroupFilter: Entity[],\r\n) =>\r\n getAutoCompleteLoadDataFn({\r\n url: url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name', 'ServiceGroupId'],\r\n globalServiceGroupFilter:\r\n !!globalServiceGroupFilter && globalServiceGroupFilter.length > 0\r\n ? [\r\n new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n globalServiceGroupFilter.map(f => f.Id),\r\n ),\r\n ]\r\n : [],\r\n isOptionalServiceGroup: true,\r\n });\r\nexport const loadPermissionLevels = loadData;\r\nexport function PermissionLevelPicker(props: PermissionLevelPickerProps) {\r\n const innerLoadData = loadData(props.predicates, []);\r\n return (\r\n \r\n );\r\n}\r\n// export function TrainingLevelFilter(\r\n// equipments: IServiceFilterDto[],\r\n// trainingLevelPermissionsEnabled,\r\n// userPermissionsEnabled,\r\n// ): (string | Condition)[] {\r\n// const predicates: (string | Condition)[] = [];\r\n// if (!!equipments && equipments.length > 0) {\r\n// if (trainingLevelPermissionsEnabled) {\r\n// predicates.push(\r\n// equipments\r\n// .map(eq => {\r\n// if (eq.UseServiceGroupTrainingLevels) {\r\n// return `(ServiceGroupId eq null or ServiceGroupId eq ${quoteODataValue(\r\n// eq.ServiceGroupId,\r\n// )})`;\r\n// } else {\r\n// return `LevelEquipments/any(g: g eq ${quoteODataValue(eq.Id)})`;\r\n// }\r\n// })\r\n// .join(' or '),\r\n// );\r\n// } else if (userPermissionsEnabled) {\r\n// // noop - clients could not select training level that was not part of user or group permissions on selected equipment they needed on uchicago\r\n// // should be properly resolved in https://prog4biz.atlassian.net/browse/BKT-8190\r\n// }\r\n// if (predicates.length > 0) {\r\n// return predicates;\r\n// }\r\n// return [];\r\n// } else {\r\n// return [];\r\n// }\r\n// }\r\n","/**\r\n *\r\n * FormPermissionLevelPicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IPermissionLevelDto } from 'api/odata/generated/entities/IPermissionLevelDto';\r\nimport { PermissionLevelPicker } from 'app/components/pickers/AutocompletePickers/PermissionLevelPicker';\r\nimport { IFieldProps } from '../FormRender/IFormFieldSetting';\r\n\r\nexport const FormPermissionLevelPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n disabled={props.disabled}\r\n fullWidth={props.fullWidth}\r\n />\r\n \r\n );\r\n};\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface TimeSlotTypePickerProps\r\n extends Omit>, 'loadData'> {}\r\n\r\nconst url = '/api/odata/v4/TimeSlotTypeFilter';\r\nexport const initTimeSlotTypeData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(response => response.value as Entity[]);\r\n }\r\n};\r\nconst loadData = (\r\n predicates: (string | Condition>)[] | undefined,\r\n) =>\r\n getAutoCompleteLoadDataFn>({\r\n url: url,\r\n predicates: predicates,\r\n // all props of the IAssetDto are listed due to potential use of thes somewhere\r\n // TODO: narrow down used properties list\r\n select: ['Id', 'Name'],\r\n });\r\nexport const loadTimeSlotTypes = loadData;\r\nexport function TimeSlotTypePicker(props: TimeSlotTypePickerProps) {\r\n const innerLoadData = loadData(props.predicates);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FormTimeSlotTypePicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from '../FormRender/IFormFieldSetting';\r\nimport { Entity } from 'types/common';\r\nimport { TimeSlotTypePicker } from 'app/components/pickers/AutocompletePickers/TimeSlotTypePicker';\r\n\r\nexport const FormTimeSlotTypePicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n disabled={props.disabled}\r\n fullWidth={props.fullWidth}\r\n />\r\n \r\n );\r\n};\r\n","import { UserGroupMultiPicker } from 'app/components/pickers/AutocompletePickers/UserGroupMultiPicker';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport { IFieldProps } from '../FormRender/IFormFieldSetting';\r\n\r\nexport const FormUserGroupsPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig[] | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField[] | null>(props);\r\n return (\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onChipClick={props.onChipClick}\r\n onBlur={field?.onBlur}\r\n value={field.value ?? undefined}\r\n error={meta?.error !== undefined}\r\n variant=\"filled\"\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n info={props.info}\r\n queryfilter={\r\n !!props.predicates\r\n ? props.predicates.map(f => f.toString()).join(' and ')\r\n : undefined\r\n }\r\n disabled={props.disabled}\r\n />\r\n );\r\n};\r\n","import { FormPermissionLevelPicker } from 'app/components/Forms/FormPermissionLevelPicker';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormTimeSlotTypePicker } from 'app/components/Forms/FormTimeSlotTypePicker';\r\nimport { FormUserGroupsPicker } from 'app/components/Forms/FormUserGroupsPicker';\r\nimport { EntityStringSchema } from 'app/components/Forms/Schemas';\r\nimport { Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\nimport * as yup from 'yup';\r\nimport { GroupPermissionsModel } from '.';\r\n\r\nexport interface UpdateGroupPermissionsFormProps {\r\n groups: ICoresDirectoryRow[];\r\n handleSubmitForm: (submit: any) => void;\r\n onSubmit: (model: GroupPermissionsModel) => void;\r\n}\r\n\r\nexport function UpdateGroupPermissionsForm(\r\n props: UpdateGroupPermissionsFormProps,\r\n) {\r\n const { t } = useTranslation();\r\n const schema: yup.SchemaOf = yup.object({\r\n AdGroups: yup\r\n .array()\r\n .of(EntityStringSchema)\r\n .label(t(translations.UserGroup) as string)\r\n .min(1)\r\n .required(t(translations.err_UserGroupRequired) as string),\r\n PermissionLevel: yup\r\n .mixed()\r\n .label(t(translations.PermissionLevel) as string)\r\n .required(t(translations.err_SelectPermissionLevelException) as string),\r\n TimeSlotType: yup\r\n .mixed()\r\n .label(t(translations.TimeSlotType) as string)\r\n .required(t(translations.err_TimeSlotTypeRequired) as string),\r\n });\r\n return (\r\n \r\n {formik => {\r\n props.handleSubmitForm(formik.submitForm);\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 \r\n );\r\n }}\r\n \r\n );\r\n}\r\n","import { useTranslation } from 'react-i18next';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\nimport * as React from 'react';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { translations } from 'locales/translations';\r\nimport { UpdateGroupPermissionsForm } from './UpdateGroupPermissions';\r\nimport { Entity } from 'types/common';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { ActionButton } from 'app/components/BasicButtons/ActionButton';\r\n\r\nexport interface UpdateUserGroupPermissionsProps {\r\n rows: ICoresDirectoryRow[];\r\n user?: AuthenticatedUser;\r\n}\r\nexport interface GroupPermissionsModel {\r\n AdGroups: Entity[];\r\n PermissionLevel?: Entity;\r\n TimeSlotType?: Entity;\r\n}\r\nexport interface GroupPermissionsUpdate {\r\n ServiceGroups: string;\r\n AdGroups: string;\r\n PermissionLevelId: number;\r\n TimeSlotTypeId: number;\r\n}\r\nexport function UpdateUserGroupPermissions(\r\n props: UpdateUserGroupPermissionsProps,\r\n) {\r\n const { rows } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const [updtPermissionOpen, setUpdtPermissionOpen] = React.useState(false);\r\n const [submitted, setSubmitted] = React.useState(\r\n undefined,\r\n );\r\n const submitFormRef = React.useRef();\r\n const bindSubmitForm = React.useCallback(value => {\r\n submitFormRef.current = value;\r\n }, []);\r\n const updatePermission = React.useCallback(\r\n (model: GroupPermissionsModel, groups: ICoresDirectoryRow[]) => {\r\n setSubmitted(true);\r\n const params = {\r\n ServiceGroups: groups.map(f => f.Id).join(','),\r\n AdGroups: model.AdGroups.map(f => f.Id).join(','),\r\n PermissionLevelId: model.PermissionLevel?.Id ?? -1,\r\n TimeSlotTypeId: model.TimeSlotType?.Id ?? -1,\r\n } as GroupPermissionsUpdate;\r\n const url =\r\n '/api/odata/v4/RestrictedUserPermissions/UpdateGroupPermissions';\r\n httpClient\r\n .post(url, { params: params })\r\n .then(v => {\r\n setSubmitted(undefined);\r\n if (v.ErrorMessages.length > 0) {\r\n dispatch(\r\n actions.addNotifications(\r\n v.ErrorMessages.map(e => ({ message: e, variant: 'error' })),\r\n ),\r\n );\r\n }\r\n if (v.WarningMessages.length > 0) {\r\n dispatch(\r\n actions.addNotifications(\r\n v.WarningMessages.map(e => ({\r\n message: e,\r\n variant: 'warning',\r\n })),\r\n ),\r\n );\r\n }\r\n if (v.SuccessMessages.length > 0) {\r\n dispatch(\r\n actions.addNotifications(\r\n v.SuccessMessages.map(e => ({\r\n message: e,\r\n variant: 'success',\r\n })),\r\n ),\r\n );\r\n setUpdtPermissionOpen(false);\r\n }\r\n })\r\n .catch(e => {\r\n console.error(e);\r\n setSubmitted(undefined);\r\n })\r\n .finally(() => {\r\n setSubmitted(undefined);\r\n });\r\n },\r\n [actions, dispatch],\r\n );\r\n return (\r\n \r\n {updtPermissionOpen && (\r\n submitFormRef.current()}\r\n confirmButtonLabel={t(translations.CreateUpdateGroupPermissions)}\r\n processing={submitted}\r\n onCancel={() => {\r\n setUpdtPermissionOpen(false);\r\n }}\r\n onClose={() => {\r\n setUpdtPermissionOpen(false);\r\n }}\r\n body={\r\n
    \r\n {\r\n updatePermission(group, rows);\r\n }}\r\n />\r\n
    \r\n }\r\n />\r\n )}\r\n setUpdtPermissionOpen(true)}\r\n title={t(translations.SetPermissionsOnSelectedServiceGroups)}\r\n text={t(translations.SetPermissions) as string}\r\n processing={submitted}\r\n />\r\n
    \r\n );\r\n}\r\n","import { SelectedRowsActionIconButton } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { SelectedRowsActionRenderer } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { GetResponseMessages } from 'app/pages/UsersPage/PageActions/Actions';\r\nimport { useAdminPermissions } from 'app/permissions/Asset/assetPermissions';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useMemo } from 'react';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { UpdateUserGroupPermissions } from './UpdateUserGroupPermissions';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { ExportImportActions } from 'app/components/PopupImportExport/Actions';\r\nimport fileDownload from 'js-file-download';\r\n\r\nconst SelectedActions = {\r\n Delete: (rows: ICoresDirectoryRow[]): Promise => {\r\n const groupIds: number[] = rows.map(item => item.Id);\r\n const data = { groupIds };\r\n const url = '/api/odata/v4/ServiceGroups/DeleteGroups';\r\n return httpClient.post(url, data);\r\n },\r\n Deactivate: (rows: ICoresDirectoryRow[]): Promise => {\r\n const groupIds: number[] = rows.map(item => item.Id);\r\n const data = { groupIds };\r\n const url = '/api/odata/v4/ServiceGroups/DeactivateGroups';\r\n return httpClient.post(url, data);\r\n },\r\n};\r\nexport function GetSelectedActions(\r\n t: TFunction,\r\n user?: AuthenticatedUser,\r\n): SelectedRowsActionRenderer[] {\r\n const { allowedToEditGroup } = useAdminPermissions();\r\n const SelectedRowActions: SelectedRowsActionRenderer<\r\n ICoresDirectoryRow\r\n >[] = useMemo(\r\n () => [\r\n (rows, refresh) =>\r\n rows.length > 0 &&\r\n rows.every(allowedToEditGroup) && (\r\n \r\n new Promise(async (resolve, reject) => {\r\n const selectedRows = rows.map(item => item.Id);\r\n const res = await ExportImportActions.ExportForImport(\r\n ScreensId.CoresDirectory,\r\n selectedRows,\r\n );\r\n const cd = res.headers['content-disposition'];\r\n const filename =\r\n cd !== undefined\r\n ? cd.split('filename=')[1]\r\n : 'ExportForImport_serviceGroups.xlsx';\r\n fileDownload(res.data, filename);\r\n let messages: IResponseType = {\r\n SuccessMessages: [],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n resolve(messages);\r\n })\r\n }\r\n />\r\n ),\r\n (rows, onRefresh) =>\r\n rows.length > 0 &&\r\n rows.every(allowedToEditGroup) && (\r\n \r\n new Promise((resolve, reject) => {\r\n //here make request to DeleteOtherServices Action in Controller\r\n return SelectedActions.Delete(rows)\r\n .then(response => {\r\n //GetResponseMessages is from UsersPage\r\n const messages: IResponseType = GetResponseMessages(\r\n response,\r\n t(translations.Success) as string,\r\n );\r\n resolve(messages);\r\n })\r\n .catch(error => {\r\n console.log('status error', error);\r\n let err = t(\r\n translations.err_ServiceGroupCanNotBeDeleted,\r\n ) as string;\r\n reject(err);\r\n });\r\n })\r\n }\r\n />\r\n ),\r\n (rows, onRefresh) =>\r\n rows.length > 0 &&\r\n rows.every(allowedToEditGroup) && (\r\n \r\n new Promise((resolve, reject) => {\r\n return SelectedActions.Deactivate(rows)\r\n .then(response => {\r\n const messages: IResponseType = GetResponseMessages(\r\n response,\r\n t(translations.Success) as string,\r\n );\r\n resolve(messages);\r\n })\r\n .catch(error => {\r\n console.log('status error', error);\r\n let err = t(\r\n translations.err_ServiceGroupCanNotBeDeactivated,\r\n ) as string;\r\n reject(err);\r\n });\r\n })\r\n }\r\n />\r\n ),\r\n rows =>\r\n rows.length > 0 &&\r\n rows.every(allowedToEditGroup) && (\r\n \r\n ),\r\n ],\r\n [allowedToEditGroup, t],\r\n );\r\n return SelectedRowActions;\r\n}\r\n","import { BasicTable } from 'app/components/BasicTable';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { filterHandler } from 'app/components/BasicTable/UnconfigurableTable/FilterHandler';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\nimport { GetFilters } from './getFilters';\r\nimport * as React from 'react';\r\nimport { getColumns } from './Columns';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { CellRenderer } from 'app/components/BasicTable/BasicTableProps';\r\nimport { IBasicTableState } from 'app/components/BasicTable/UnconfigurableTable/UnconfigurableTable';\r\nimport { translations } from 'locales/translations';\r\nimport { IdType, Row } from 'react-table';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport {\r\n SelectedRowsActionExtRenderer,\r\n SelectedRowsActionRenderer,\r\n} from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectGlobalSettingBool,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { BookitChipWithInfo } from 'app/components/BasicChip';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { Entity } from 'types/common';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { TabsActionRenderer } from 'app/components/BasicTable/components/TabsToolbar/TabsActionRender';\r\nimport { Tab } from '@material-ui/core';\r\nimport { getDefaultFilter, getRequiredFilter } from './getDefaultFilters';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { selectHideNavigation } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { PageActionRenderer } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport { ServiceGroupRegistrationStatus } from 'enums/ServiceGroupRegistrationStatus';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { URLSearchParamsCI } from 'app/components/BasicTable/types/FilterParam';\r\nimport { routerActions } from 'connected-react-router';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { Check } from 'app/components/BasicInputs/Check';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport FormControlLabel from 'app/components/Forms/FormControls/FormControlLabel';\r\nimport { Roles } from 'app/slice/types';\r\nimport { AdminActions } from 'app/components/Admin/AdminActions';\r\nimport { GetSelectedActions } from '../SelectedBulkActions/GetSelectedActions';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { PopupImportExport } from 'app/components/PopupImportExport';\r\nimport { SidePanelOpenState } from 'app/hooks/useSidePanelOpen';\r\nimport { Body } from 'app/components/Typography';\r\nimport { useOpenAssetPopUp } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport htmlParse from 'html-react-parser';\r\nimport { useAdminPermissions } from 'app/permissions/Asset/assetPermissions';\r\n// import { RowsCountPicker } from 'app/components/Dashboard/TableViewEdit/RowsCountPicker';\r\n\r\nexport interface CoreSelectionTableProps {\r\n isSidePanel?: boolean;\r\n authenticatedUser?: AuthenticatedUser;\r\n closeSidePanel: () => void;\r\n setFilters?: (\r\n appliedFilters: IFilterSettings[] | undefined,\r\n ) => void;\r\n updtFirstLogin: (val: boolean) => void;\r\n updtOptOut: (val: boolean) => void;\r\n //primaryAction?: (row: Row) => void;\r\n isRowSelectable: (row: Row) => boolean;\r\n redirectToDash: boolean;\r\n isFirstLogin?: boolean;\r\n optOutCoreSelection?: boolean;\r\n openPanel: (state: SidePanelOpenState) => void;\r\n}\r\n\r\nexport function CoreSelectionTable(props: CoreSelectionTableProps) {\r\n const {\r\n isSidePanel,\r\n setFilters,\r\n authenticatedUser,\r\n closeSidePanel,\r\n updtFirstLogin,\r\n updtOptOut,\r\n //primaryAction,\r\n isRowSelectable,\r\n redirectToDash,\r\n optOutCoreSelection,\r\n openPanel,\r\n } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: serviceGroupActions } = useAppSettingsSlice();\r\n const hideNavigation = useSelector(selectHideNavigation);\r\n const settings = useSelector(selectglobalSettings);\r\n const history = useHistory();\r\n const location = useLocation();\r\n const isMobile = DetectIsMobile();\r\n //const publicUrl = useSelector(selectPublicUrl);\r\n const savedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const [onlyMyCores, setOnlyMyCores] = React.useState(false);\r\n const [tabNumber, setTubNumber] = React.useState(0);\r\n const [showImportConfirm, setShowImportConfirm] = React.useState(false);\r\n const { allowedToEditGroup } = useAdminPermissions();\r\n const userHelp = settings.GetNullableByKey(\r\n AllowedSettings.Help_ServiceGroupRegistration,\r\n );\r\n const [multiCoresSelectionMode, setMultiCoresselectionMode] = React.useState<\r\n boolean\r\n >(false);\r\n const skipCoreSelectionScreen = useSelector(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.SkipCoreSelectionScreen),\r\n );\r\n const [selectedRowIds, setSelectedRowIds] = React.useState<\r\n Record, boolean>\r\n >({});\r\n const [loacalServiceGroups, setLoacalServiceGroups] = useAsyncExtendedState<\r\n Entity[]\r\n >([]);\r\n useEffectOnMount(() => {\r\n dispatch(serviceGroupActions.loadGlobalServiceGroupFilter());\r\n });\r\n const openAsset = useOpenAssetPopUp();\r\n React.useEffect(() => {\r\n let obj = {};\r\n if (!!savedServiceGroups && savedServiceGroups.length > 0) {\r\n for (const key of savedServiceGroups) {\r\n obj[key.Id] = true;\r\n }\r\n setMultiCoresselectionMode(savedServiceGroups.length > 1);\r\n setLoacalServiceGroups(savedServiceGroups);\r\n }\r\n setSelectedRowIds(obj);\r\n }, [savedServiceGroups, setLoacalServiceGroups]);\r\n\r\n const showMyCoresOptions = React.useMemo(() => {\r\n return (\r\n !!authenticatedUser &&\r\n !!authenticatedUser.AdminServiceGroups &&\r\n authenticatedUser.AdminServiceGroups.length > 0\r\n );\r\n }, [authenticatedUser]);\r\n const handleRemoveGroup = React.useCallback(\r\n (value: Entity) => {\r\n setLoacalServiceGroups(oldGroups => {\r\n let newGroups = oldGroups.filter(group => group.Id !== value.Id);\r\n return newGroups;\r\n });\r\n // if (loacalServiceGroups) {\r\n // let newGroups = loacalServiceGroups.filter(\r\n // group => group.Id !== value.Id,\r\n // );\r\n\r\n // //dispatch(actions.saveGlobalServiceGroupFilter(newGroups || []));\r\n // }\r\n },\r\n [setLoacalServiceGroups],\r\n );\r\n const handleRowsServiceGroupsChange = React.useCallback(\r\n (rows: Row[], selected: boolean) => {\r\n let selectable = rows.map(f => {\r\n return {\r\n Id: f.original.Id,\r\n Name: f.original.Name,\r\n } as Entity;\r\n });\r\n if (selected) {\r\n setLoacalServiceGroups([\r\n ...loacalServiceGroups,\r\n ...selectable.filter(\r\n f => !loacalServiceGroups.some(s => s.Id === f.Id),\r\n ),\r\n ]);\r\n } else {\r\n setLoacalServiceGroups([\r\n ...loacalServiceGroups.filter(\r\n f => !selectable.some(s => s.Id === f.Id),\r\n ),\r\n ]);\r\n }\r\n\r\n //dispatch(actions.saveGlobalServiceGroupFilter(selectable || []));\r\n },\r\n [loacalServiceGroups, setLoacalServiceGroups],\r\n );\r\n const handleServiceGroupsChange = React.useCallback(\r\n (value: Entity[] | []) => {\r\n dispatch(actions.saveGlobalServiceGroupFilter(value || []));\r\n },\r\n [actions, dispatch],\r\n );\r\n\r\n const handleSingleGroupChange = React.useCallback(\r\n (value: Entity, added: boolean) => {\r\n if (added) {\r\n if (loacalServiceGroups.length + 1 > 1) {\r\n setMultiCoresselectionMode(true);\r\n }\r\n setLoacalServiceGroups(oldGroups => [...oldGroups, value]);\r\n // dispatch(\r\n // actions.saveGlobalServiceGroupFilter(\r\n // !!savedServiceGroups ? [...savedServiceGroups, value] : [value],\r\n // ),\r\n // );\r\n } else {\r\n if (loacalServiceGroups.length - 1 < 2) {\r\n setMultiCoresselectionMode(false);\r\n }\r\n handleRemoveGroup(value);\r\n }\r\n },\r\n [handleRemoveGroup, loacalServiceGroups.length, setLoacalServiceGroups],\r\n );\r\n const onSelectChange = React.useCallback(\r\n (row: ICoresDirectoryRow, checked: boolean) => {\r\n handleSingleGroupChange(\r\n {\r\n Id: row.Id,\r\n Name: row.Name,\r\n } as Entity,\r\n checked,\r\n );\r\n },\r\n [handleSingleGroupChange],\r\n );\r\n const primaryAction = React.useCallback(\r\n (row: Row) => {\r\n //dispatch(layoutActions.setUpSnackBarIndex(true));\r\n let canSwitch = isRowSelectable(row);\r\n if (!multiCoresSelectionMode) {\r\n if (canSwitch) {\r\n // handleRowsServiceGroupsChange([row]);\r\n if (hideNavigation) {\r\n handleServiceGroupsChange([\r\n {\r\n Id: row.original.Id,\r\n Name: row.original.Name,\r\n } as Entity,\r\n ]);\r\n updtFirstLogin(false);\r\n dispatch(layoutActions.setHideNavigation(false));\r\n history.push('/dashboards/core/' + row.original.Id);\r\n } else if (isSidePanel) {\r\n handleServiceGroupsChange([\r\n {\r\n Id: row.original.Id,\r\n Name: row.original.Name,\r\n } as Entity,\r\n ]);\r\n if (redirectToDash) {\r\n dispatch(layoutActions.resetSidePanel());\r\n history.push('/dashboards/core/' + row.original.Id);\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n } else {\r\n handleServiceGroupsChange([\r\n {\r\n Id: row.original.Id,\r\n Name: row.original.Name,\r\n } as Entity,\r\n ]);\r\n if (redirectToDash) {\r\n history.push('/dashboards/core/' + row.original.Id);\r\n }\r\n }\r\n } else {\r\n if (row.original.CanRequestAccess) {\r\n if (hideNavigation) {\r\n updtFirstLogin(false);\r\n setTimeout(() => {\r\n window.open(\r\n toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n ),\r\n '_blank',\r\n );\r\n dispatch(layoutActions.setHideNavigation(false));\r\n }, 20);\r\n } else if (isSidePanel) {\r\n window.open(\r\n toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n ),\r\n '_blank',\r\n );\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n window.open(\r\n toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n ),\r\n '_blank',\r\n );\r\n }\r\n } else {\r\n dispatch(\r\n actions.addNotification({\r\n key: 'coreSelection_error',\r\n message: (t(\r\n translations.OnSelectNotRegisteredCore_error,\r\n ) as string).replace('{0}', row.original.Name),\r\n variant: 'error',\r\n autoHideDuration: 10000,\r\n }),\r\n );\r\n }\r\n }\r\n } else {\r\n if (canSwitch) {\r\n handleSingleGroupChange(\r\n {\r\n Id: row.original.Id,\r\n Name: row.original.Name,\r\n } as Entity,\r\n !row.isSelected,\r\n );\r\n row.toggleRowSelected(!row.isSelected);\r\n } else {\r\n if (row.original.CanRequestAccess) {\r\n if (hideNavigation) {\r\n updtFirstLogin(false);\r\n dispatch(layoutActions.setHideNavigation(false));\r\n setTimeout(() => {\r\n window.open(\r\n toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n ),\r\n '_blank',\r\n );\r\n }, 20);\r\n } else if (isSidePanel) {\r\n window.open(\r\n toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n ),\r\n '_blank',\r\n );\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n window.open(\r\n toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n ),\r\n '_blank',\r\n );\r\n }\r\n } else {\r\n dispatch(\r\n actions.addNotification({\r\n key: 'coreSelection_error',\r\n message: (t(\r\n translations.OnSelectNotRegisteredCore_error,\r\n ) as string).replace('{0}', row.original.Name),\r\n variant: 'error',\r\n autoHideDuration: 10000,\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n },\r\n [\r\n actions,\r\n dispatch,\r\n handleServiceGroupsChange,\r\n handleSingleGroupChange,\r\n hideNavigation,\r\n history,\r\n isRowSelectable,\r\n isSidePanel,\r\n layoutActions,\r\n multiCoresSelectionMode,\r\n redirectToDash,\r\n t,\r\n updtFirstLogin,\r\n ],\r\n );\r\n const primaryMultipleAction = React.useCallback(() => {\r\n handleServiceGroupsChange(loacalServiceGroups);\r\n if (hideNavigation) {\r\n updtFirstLogin(false);\r\n dispatch(layoutActions.setHideNavigation(false));\r\n history.push('/systemdash');\r\n } else if (isSidePanel) {\r\n if (redirectToDash) {\r\n history.push('/systemdash');\r\n }\r\n updtFirstLogin(false);\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n // if (redirectToDash) {\r\n // history.push('/systemdash');\r\n // }\r\n updtFirstLogin(false);\r\n history.push('/systemdash');\r\n }\r\n }, [\r\n dispatch,\r\n handleServiceGroupsChange,\r\n hideNavigation,\r\n history,\r\n isSidePanel,\r\n layoutActions,\r\n loacalServiceGroups,\r\n redirectToDash,\r\n updtFirstLogin,\r\n ]);\r\n\r\n const TTable = React.useMemo(\r\n () =>\r\n filterHandler(BasicTable, GetFilters, {\r\n isSidePanel: isSidePanel,\r\n setFilters: setFilters,\r\n reservedQueryStringParameterNames: ['ownedbyme'],\r\n getDefaultFilter: getDefaultFilter(onlyMyCores),\r\n getRequiredFilter: getRequiredFilter,\r\n }),\r\n [isSidePanel, onlyMyCores, setFilters],\r\n );\r\n\r\n const columns = React.useMemo(() => {\r\n return getColumns(\r\n t,\r\n isRowSelectable,\r\n authenticatedUser,\r\n settings,\r\n isSidePanel,\r\n );\r\n }, [authenticatedUser, isRowSelectable, isSidePanel, settings, t]);\r\n\r\n const rowActions: CellRenderer[] = React.useMemo<\r\n CellRenderer[]\r\n >(() => {\r\n let actions: CellRenderer[] = [];\r\n\r\n actions.push(({ row }) => {\r\n // let canSwitch = isRowSelectable(row);\r\n let canRequestAccess = row.original.CanRequestAccess;\r\n if (canRequestAccess) {\r\n return (\r\n {\r\n primaryAction(row);\r\n }}\r\n >\r\n {t(translations.RequestAccess)}\r\n \r\n );\r\n } else if (isRowSelectable(row)) {\r\n return (\r\n {\r\n primaryAction(row);\r\n }}\r\n >\r\n {row.isSelected\r\n ? t(translations.DeSelectServiceGroup)\r\n : t(translations.SelectServiceGroup)}\r\n \r\n );\r\n } else if (\r\n row.original.ApprovalStatusId ===\r\n (ServiceGroupRegistrationStatus.Pending as number)\r\n ) {\r\n return (\r\n
    \r\n \r\n \r\n {t(\r\n translations[\r\n ServiceGroupRegistrationStatus[\r\n row.original.ApprovalStatusId ?? 0\r\n ]\r\n ],\r\n )}\r\n \r\n
    \r\n );\r\n } else {\r\n return ;\r\n }\r\n });\r\n actions.push(({ row }) => {\r\n let canSwitch = isRowSelectable(row);\r\n let canRequestAccess = row.original.CanRequestAccess;\r\n if (canRequestAccess || canSwitch) {\r\n return (\r\n {\r\n openAsset(\r\n {\r\n Id: row.original.AssetId ?? undefined,\r\n useSidePanel: isSidePanel,\r\n },\r\n openPanel,\r\n );\r\n }}\r\n >\r\n {t(translations.ViewServiceGroupDetails)}\r\n \r\n );\r\n } else {\r\n return ;\r\n }\r\n });\r\n return actions;\r\n }, [isRowSelectable, isSidePanel, openAsset, openPanel, primaryAction, t]);\r\n\r\n const selectedRowActions: SelectedRowsActionExtRenderer<\r\n ICoresDirectoryRow\r\n >[] = React.useMemo(() => {\r\n let actions: SelectedRowsActionExtRenderer[] =\r\n loacalServiceGroups.length > 0\r\n ? loacalServiceGroups.map(\r\n sg => (\r\n _selectedRows,\r\n _rows,\r\n _onRefresh,\r\n _toggleAll,\r\n toggleSingle,\r\n ) => (\r\n f.id === sg.Id.toString()).length > 0\r\n ? undefined\r\n : t(translations.DeleteSelectedCard_info)\r\n }\r\n onDelete={() => {\r\n handleRemoveGroup(sg);\r\n _rows\r\n .filter(f => f.id === sg.Id.toString())\r\n .forEach(f => {\r\n f.toggleRowSelected(false);\r\n });\r\n // toggleSingle(sg.Id.toString(), false);\r\n }}\r\n disabled={\r\n !(_rows.filter(f => f.id === sg.Id.toString()).length > 0)\r\n }\r\n variant=\"default\"\r\n customsize={isMobile ? 'small' : 'medium'}\r\n label={sg.Name}\r\n customwidth={isMobile ? 100 : 180}\r\n custombgcolor={bookitColors.primary.disabled}\r\n customcolor={bookitColors.grayscale.blackComponents}\r\n customiconcolor={bookitColors.grayscale.blackComponents}\r\n shape=\"circle\"\r\n key={`selected_${sg.Id}`}\r\n />\r\n ),\r\n )\r\n : [];\r\n return actions;\r\n }, [handleRemoveGroup, isMobile, loacalServiceGroups, t]);\r\n\r\n const tabLeftActions: TabsActionRenderer<\r\n ICoresDirectoryRow\r\n >[] = React.useMemo(() => {\r\n return [\r\n (count, _rows) => (\r\n {\r\n setOnlyMyCores(false);\r\n setTubNumber(0);\r\n if (!isSidePanel && location.search.indexOf('ownedbyme') !== -1) {\r\n const originalSearch = new URLSearchParamsCI(location.search);\r\n originalSearch.delete('ownedbyme');\r\n dispatch(\r\n routerActions.replace({\r\n pathname: location.pathname,\r\n search: originalSearch.toString(),\r\n }),\r\n );\r\n }\r\n }}\r\n />\r\n ),\r\n (_count, rows) => (\r\n f.original.OwnedByMe === true).length\r\n })`}\r\n onClick={() => {\r\n setOnlyMyCores(true);\r\n setTubNumber(1);\r\n }}\r\n />\r\n ),\r\n ];\r\n }, [dispatch, isSidePanel, location.pathname, location.search]);\r\n\r\n const tabRightActions: TabsActionRenderer<\r\n ICoresDirectoryRow\r\n >[] = React.useMemo(() => {\r\n return hideNavigation\r\n ? [\r\n (_count, _rows) => (\r\n {\r\n updtOptOut(checked);\r\n if (checked) {\r\n dispatch(\r\n actions.addNotification({\r\n key: 'coreSelection_optOut',\r\n message: t(\r\n translations.CoreSelectionOptOut_info,\r\n ) as string,\r\n variant: 'info',\r\n autoHideDuration: 3000,\r\n closable: true,\r\n }),\r\n );\r\n }\r\n }}\r\n checked={optOutCoreSelection}\r\n />\r\n }\r\n />\r\n ),\r\n ]\r\n : [];\r\n }, [actions, dispatch, hideNavigation, optOutCoreSelection, t, updtOptOut]);\r\n\r\n const selectedBulkActions: SelectedRowsActionRenderer<\r\n ICoresDirectoryRow\r\n >[] = GetSelectedActions(t, authenticatedUser);\r\n const allowedToUseBulkActions = React.useMemo(() => {\r\n return (\r\n !isSidePanel &&\r\n !!authenticatedUser &&\r\n authenticatedUser.Roles.includes(Roles.GroupAdministrators) &&\r\n loacalServiceGroups.every(allowedToEditGroup)\r\n );\r\n }, [allowedToEditGroup, authenticatedUser, isSidePanel, loacalServiceGroups]);\r\n const useFloatingActions = React.useMemo(() => {\r\n return multiCoresSelectionMode\r\n ? loacalServiceGroups.length > 0 || skipCoreSelectionScreen\r\n : loacalServiceGroups.length > 1;\r\n }, [\r\n loacalServiceGroups.length,\r\n multiCoresSelectionMode,\r\n skipCoreSelectionScreen,\r\n ]);\r\n const url = '/api/odata/v4/servicegroups';\r\n const initialState: IBasicTableState = React.useMemo(\r\n () => ({\r\n sortBy: [{ id: 'Name', desc: false }],\r\n selectedRowIds: selectedRowIds,\r\n pageIndex: 0,\r\n pageSize: 200,\r\n }),\r\n [selectedRowIds],\r\n );\r\n\r\n const pageActions: PageActionRenderer[] = React.useMemo(() => {\r\n let acts: PageActionRenderer[] = [];\r\n if (\r\n !isMobile &&\r\n !!authenticatedUser &&\r\n authenticatedUser.Roles.includes(Roles.Administrators)\r\n ) {\r\n acts.push(() => (\r\n \r\n ));\r\n }\r\n if (isSidePanel) {\r\n acts.push(() => (\r\n 0 || skipCoreSelectionScreen)\r\n }\r\n onClick={() => {\r\n handleServiceGroupsChange(loacalServiceGroups);\r\n if (hideNavigation) {\r\n updtFirstLogin(false);\r\n history.push('/systemdash');\r\n } else if (isSidePanel) {\r\n if (redirectToDash) {\r\n history.push('/systemdash');\r\n }\r\n closeSidePanel();\r\n } else {\r\n history.push('/systemdash');\r\n updtFirstLogin(false);\r\n }\r\n }}\r\n title={\r\n !(loacalServiceGroups.length > 0 || skipCoreSelectionScreen)\r\n ? t(translations.SelectDeffServiceGroups)\r\n : t(translations.CloseSidePanel)\r\n }\r\n >\r\n \r\n \r\n ));\r\n } else {\r\n if (\r\n !isMobile &&\r\n !!authenticatedUser &&\r\n (authenticatedUser.Roles.includes(Roles.Administrators) ||\r\n authenticatedUser.Roles.includes(Roles.GroupAdministrators))\r\n ) {\r\n acts.push(() => (\r\n \r\n ));\r\n }\r\n }\r\n return acts;\r\n }, [\r\n authenticatedUser,\r\n closeSidePanel,\r\n handleServiceGroupsChange,\r\n hideNavigation,\r\n history,\r\n isMobile,\r\n isSidePanel,\r\n loacalServiceGroups,\r\n redirectToDash,\r\n skipCoreSelectionScreen,\r\n t,\r\n updtFirstLogin,\r\n ]);\r\n // const detailsRowActions: CellRenderer<\r\n // ICoresDirectoryRow\r\n // >[] = GetDetailsRowActions(t, isRowSelectable, openPanel, isSidePanel);\r\n const addColumns = React.useMemo(() => {\r\n const adds: (keyof ICoresDirectoryRow)[] = [\r\n 'Id',\r\n 'AssetId',\r\n 'CanRequestAccess',\r\n 'UserRegistrationEnabled',\r\n 'ApprovalStatusId',\r\n 'Private',\r\n 'DivisionId',\r\n 'OwnedByMe',\r\n 'AdminsTotal',\r\n 'LabTechTotal',\r\n ];\r\n if (\r\n !!authenticatedUser &&\r\n (authenticatedUser.Roles.includes(Roles.Administrators) ||\r\n authenticatedUser.Roles.includes(Roles.GroupAdministrators))\r\n ) {\r\n adds.push('AdminsTotal');\r\n adds.push('LabTechTotal');\r\n }\r\n return adds;\r\n }, [authenticatedUser]);\r\n const ImportHandler = React.useCallback(() => {\r\n setShowImportConfirm(true);\r\n }, []);\r\n\r\n const handleImportClose = React.useCallback(() => {\r\n setShowImportConfirm(false);\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n 0 ? rowActions : undefined}\r\n //rowActions={detailsRowActions}\r\n selectedRowsActions={\r\n allowedToUseBulkActions ? selectedBulkActions : undefined\r\n }\r\n initialState={initialState}\r\n useImportLink={\r\n !isMobile &&\r\n !!authenticatedUser &&\r\n (authenticatedUser.Roles.includes(Roles.Administrators) ||\r\n authenticatedUser.Roles.includes(Roles.GroupAdministrators))\r\n }\r\n importHandler={ImportHandler}\r\n isRowSelectable={isRowSelectable}\r\n isContentEditable={row => {\r\n return (\r\n (row.original.CanRequestAccess &&\r\n (row.original.ApprovalStatusId === null ||\r\n row.original.ApprovalStatusId === undefined) &&\r\n row.original.ApprovalStatusId !==\r\n ServiceGroupRegistrationStatus.Rejected) ||\r\n row.original.ApprovalStatusId ===\r\n ServiceGroupRegistrationStatus.Pending\r\n );\r\n }}\r\n hideMenuOnMobile={isSidePanel}\r\n // viewCardsCheck={multiCoresSelectionMode || isMobile}\r\n viewCardsCheck={true}\r\n onSelectedChange={onSelectChange}\r\n // onSelectedRowsChange={rows => {\r\n // handleServiceGroupsChange(\r\n // rows.map(f => {\r\n // return {\r\n // Id: f.Id,\r\n // Name: f.Name,\r\n // } as Entity;\r\n // }),\r\n // );\r\n // }}\r\n imageSrcKey=\"ImageName\"\r\n titleKey=\"Name\"\r\n allowCards={true}\r\n primaryAction={(row, _toggleAllRowsSelected) => {\r\n primaryAction(row);\r\n }}\r\n useCardsByDefault={true}\r\n floatingTabSettings={{\r\n useFloatingActions: useFloatingActions,\r\n selectedFloatingActions: selectedRowActions,\r\n buttonFloatingActions: [\r\n _rows => (\r\n primaryMultipleAction()}\r\n >\r\n {isMobile ? 'Continue' : 'Continue with Selected'}\r\n \r\n ),\r\n ],\r\n useSidePanel: isSidePanel,\r\n }}\r\n pageActions={pageActions}\r\n additionalColumns={addColumns}\r\n useRowSelect={true}\r\n preventInnerClicks\r\n searchColumns={['Name', 'Description']}\r\n tabSectionSettings={{\r\n useTabsSection: true,\r\n leftTabs: showMyCoresOptions ? tabLeftActions : undefined,\r\n selectedTabValue: tabNumber,\r\n defaultMultiMode: multiCoresSelectionMode === true,\r\n getMultiMode: value => setMultiCoresselectionMode(value),\r\n showClear: !multiCoresSelectionMode && skipCoreSelectionScreen,\r\n onAllRowsSelected: handleRowsServiceGroupsChange,\r\n rightTabActions: tabRightActions,\r\n }}\r\n />\r\n \r\n );\r\n}\r\n","import { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column, Row } from 'react-table';\r\nimport { AssetLink } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\nimport { DescriptionCell } from 'app/components/BasicTable/components/DescriptionCell';\r\n\r\nimport ImageRenderer from 'app/components/BasicTable/CellRenderers/ImageRenderer';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { BooleanRender } from 'app/components/BasicTable/components/BooleanRender';\r\nimport { Roles } from 'app/slice/types';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { tryParseBool } from 'utils/string-utils';\r\n\r\nexport const getColumns = (\r\n t: TFunction,\r\n isRowSelectable: (row: Row) => boolean,\r\n user: AuthenticatedUser | undefined,\r\n settings: GlobalSettings | null,\r\n useSidePanel?: boolean,\r\n) => {\r\n const isAdmin = !!user && user.Roles.includes(Roles.Administrators);\r\n const isGroupAdmin = !!user && user.Roles.includes(Roles.GroupAdministrators);\r\n const cols: (Column & { invisible?: boolean })[] = [\r\n {\r\n Header: t(translations.Name) as string,\r\n accessor: 'Name',\r\n Cell: ({ value, row }) => (\r\n //isRowSelectable(row) ? (\r\n \r\n {value}\r\n \r\n ),\r\n /*) : (\r\n <>{value}\r\n )*/\r\n },\r\n {\r\n Header: t(translations.Image) as string,\r\n accessor: 'ImageName',\r\n Cell: ImageRenderer,\r\n },\r\n {\r\n Header: t(translations.Description) as string,\r\n accessor: 'Description',\r\n Cell: DescriptionCell({ width: 'long' }),\r\n },\r\n ];\r\n if (isAdmin || isGroupAdmin) {\r\n cols.push({\r\n Header: t(translations.HashSymbol) as string,\r\n accessor: 'Id',\r\n Cell: ({ value, row }) => {\r\n if (row.original.OwnedByMe) {\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n } else {\r\n return <>{value};\r\n }\r\n },\r\n });\r\n cols.push({\r\n Header: t(translations.Active) as string,\r\n accessor: 'Active',\r\n Cell: ({ value }) => ,\r\n });\r\n cols.push({\r\n Header: t(translations.AdminEmail) as string,\r\n accessor: 'AdminEmail',\r\n });\r\n cols.push({\r\n Header: t(translations.Division) as string,\r\n accessor: 'DivisionName',\r\n Cell: ({ value, row }) => {\r\n if (isAdmin) {\r\n if (!row.original.DivisionId || row.original.DivisionId === null) {\r\n return <>{t(translations.NA)};\r\n } else {\r\n return (\r\n <>\r\n \r\n {value}\r\n \r\n \r\n );\r\n }\r\n } else {\r\n return <>{value ?? t(translations.NA)};\r\n }\r\n },\r\n });\r\n cols.push({\r\n Header: t(translations.OnlineServicesCount) as string,\r\n accessor: 'OnlineServicesCount',\r\n Cell: ({ value }) =>\r\n !!value && value !== null ? <>{value} : <>{t(translations.NA)},\r\n });\r\n cols.push({\r\n Header: t(translations.OfflineServicesCount) as string,\r\n accessor: 'OfflineServicesCount',\r\n Cell: ({ value }) =>\r\n !!value && value !== null ? <>{value} : <>{t(translations.NA)},\r\n });\r\n cols.push({\r\n Header: t(translations.RequestTypesCount) as string,\r\n accessor: 'RequestTypesCount',\r\n Cell: ({ value }) =>\r\n !!value && value !== null ? <>{value} : <>{t(translations.NA)},\r\n });\r\n if (\r\n tryParseBool(\r\n settings?.GetString(AllowedSettings.LimitServiceGroupLicenses),\r\n ) === true\r\n ) {\r\n cols.push({\r\n Header: t(translations.ServiceGroupAdminsLimit) as string,\r\n accessor: 'AdminsLimit',\r\n Cell: ({ value, row }) => {\r\n return (\r\n \r\n {`${row.original.AdminsTotal} / `}\r\n {value === undefined || value === null || value === 0 ? (\r\n \r\n ) : (\r\n value\r\n )}\r\n \r\n );\r\n },\r\n });\r\n cols.push({\r\n Header: t(translations.LabTechsLimit) as string,\r\n accessor: 'LabTechLimit',\r\n Cell: ({ value, row }) => {\r\n return (\r\n \r\n {`${row.original.LabTechTotal} / `}\r\n {value === undefined || value === null || value === 0 ? (\r\n \r\n ) : (\r\n value\r\n )}\r\n \r\n );\r\n },\r\n });\r\n }\r\n }\r\n return cols.filter(v => !v.invisible) as Column[];\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer } from 'utils/redux-injectors';\r\n// import { coreSelectionSaga } from './saga';\r\nimport { CoreSelectionState } from './types';\r\n\r\nexport const initialState: CoreSelectionState = {\r\n filters: undefined,\r\n loading: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'coreSelection',\r\n initialState,\r\n reducers: {\r\n setFilters(state, action: PayloadAction | undefined>) {\r\n state.filters = action.payload;\r\n },\r\n setLoading(state, action: PayloadAction) {\r\n state.loading = action.payload;\r\n },\r\n reset(state, action: PayloadAction) {\r\n state.filters = undefined;\r\n state.loading = undefined;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: coreSelectionActions } = slice;\r\n\r\nexport const useCoreSelectionSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n // useInjectSaga({ key: slice.name, saga: coreSelectionSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useCoreSelectionSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.coreSelection || initialState;\r\n\r\nexport const selectCoreSelection = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n\r\nexport const selectCoreSelectionLoading = createSelector(\r\n [selectCoreSelection],\r\n state => state.loading,\r\n);\r\n\r\nexport const selectCoreSelectionFilters = createSelector(\r\n [selectCoreSelection],\r\n state => state.filters,\r\n);\r\n","import {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\n//import { selectPublicUrl } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\n////import { useSelector } from 'react-redux';\r\nimport * as React from 'react';\r\nimport { CoreSelectionTable } from './Table/CoreSelectionTable';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\nimport { toURLSearchParams } from 'app/components/BasicTable/withSavedHistory';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useCoreSelectionSlice } from './slice';\r\nimport { selectCoreSelectionFilters } from './slice/selectors';\r\nimport { buildURL } from 'utils/url-utils';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n selectPublicUrl,\r\n} from 'app/slice/selectors';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useProfileSetting } from 'app/components/BasicTable/useProfileSetting';\r\nimport { selectHideNavigation } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { Row } from 'react-table';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { ServiceGroupRegistrationStatus } from 'enums/ServiceGroupRegistrationStatus';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport interface CoreSelectionProps extends SidePanelContentProps, CoverProps {}\r\n\r\nexport function CoreSelection(props: CoreSelectionProps) {\r\n const { useSidePanel, isCover, closeCover } = props;\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const { t } = useTranslation();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const settings = useSelector(selectglobalSettings);\r\n const noDashboardRedirectByClick =\r\n settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.NoDashboardRedirectOnCoreSelection],\r\n ) === true;\r\n const redirectToDash = React.useMemo(() => {\r\n return (\r\n window.location.pathname.indexOf('/dashboards/core/') >= 0 ||\r\n window.location.pathname.indexOf('/systemdash') >= 0 ||\r\n !noDashboardRedirectByClick\r\n );\r\n }, [noDashboardRedirectByClick]);\r\n\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const filters = useSelector(selectCoreSelectionFilters);\r\n const hideNavigation = useSelector(selectHideNavigation);\r\n const dispatch = useDispatch();\r\n const { actions } = useCoreSelectionSlice();\r\n // const openAsset = useOpenAssetPopUp();\r\n // const history = useHistory();\r\n // const [cover, setCover] = React.useState();\r\n const {\r\n cover,\r\n closePanel,\r\n openPanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState();\r\n const {\r\n savedEnabled: isFirstLogin,\r\n updateEnabled: updateIsFirstLogin,\r\n } = useProfileSetting({\r\n profileSettingKey: 'IsFirstLoginUser',\r\n });\r\n const {\r\n savedEnabled: OptOutCoreSelection,\r\n updateEnabled: updateIsOptOut,\r\n } = useProfileSetting({\r\n profileSettingKey: 'CoreSelectionOptOut',\r\n });\r\n const pagelink = React.useMemo(\r\n () => buildURL(`${publicUrl}coreselection`, filters ?? {}),\r\n [filters, publicUrl],\r\n );\r\n useEffectOnMount(() => {\r\n dispatch(\r\n layoutActions.setHideNavigation(\r\n !!authenticatedUser &&\r\n !authenticatedUser.HasOptOutCoreSelection &&\r\n !useSidePanel &&\r\n isFirstLogin,\r\n ),\r\n );\r\n });\r\n // const closeCover = () => {\r\n // setCover(undefined);\r\n // };\r\n\r\n const closeSidePanel = React.useCallback(() => {\r\n if (isFirstLogin && hideNavigation) {\r\n updateIsFirstLogin(false);\r\n }\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n } as SidePanelCloseState);\r\n }, [\r\n closePanel,\r\n hideNavigation,\r\n isCover,\r\n isFirstLogin,\r\n updateIsFirstLogin,\r\n useSidePanel,\r\n ]);\r\n const isRowSelectable = (row: Row): boolean => {\r\n let isAdmin = authenticatedUser?.AdminServiceGroups?.some(\r\n sg => sg.Id === row.original.Id,\r\n );\r\n let canSwitch =\r\n row.original.Private === false ||\r\n isAdmin === true ||\r\n row.original.ApprovalStatusId === ServiceGroupRegistrationStatus.Approved;\r\n return canSwitch;\r\n };\r\n // const primaryAction = (row: Row) => {\r\n // if (useSidePanel) {\r\n // if (redirectToDash) {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // history.push('/dashboards/core/' + row.original.Id);\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // // setCover(\r\n // // ,\r\n // // );\r\n // }\r\n // } else {\r\n // if (hideNavigation || redirectToDash) {\r\n // history.push('/dashboards/core/' + row.original.Id);\r\n // } else {\r\n // if (!redirectToDash) {\r\n // openAsset({ Id: row.original.AssetId ?? undefined });\r\n // }\r\n // }\r\n // }\r\n // };\r\n const setfilterCallback = React.useCallback(\r\n (v: IFilterSettings[] | undefined) => {\r\n const res = {};\r\n if (!!v) {\r\n toURLSearchParams(v).forEach((val, name) => {\r\n res[name] = val;\r\n });\r\n }\r\n dispatch(actions.setFilters(!v || v.length === 0 ? undefined : res));\r\n },\r\n [actions, dispatch],\r\n );\r\n return (\r\n {t(translations.menu_CoreSelection)}}\r\n titlePage={t(translations.menu_CoreSelection)}\r\n closable={useSidePanel}\r\n //disableExpandToggle={true}\r\n //rightTopActions={topButtons}\r\n isCover={false}\r\n coverClosed={coverClosed}\r\n hideTitleBar={true}\r\n cover={cover}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n children={\r\n \r\n }\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * RadioGroup\r\n *\r\n */\r\nimport {\r\n FormControl,\r\n FormGroup,\r\n FormHelperText,\r\n FormLabel,\r\n} from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { Check } from '../BasicInputs/Check';\r\nimport FormControlLabel from '../Forms/FormControls/FormControlLabel';\r\n\r\nexport interface CheckEntity extends Entity {\r\n checked: boolean;\r\n disabled?: boolean;\r\n}\r\nexport interface ChipEntity extends Entity {\r\n info?: string;\r\n disabled?: boolean;\r\n}\r\nexport interface CheckBoxGroupProps {\r\n options: CheckEntity[];\r\n value?: CheckEntity[];\r\n className?: string;\r\n onChange?: (\r\n value: CheckEntity,\r\n event: React.ChangeEvent,\r\n ) => void;\r\n id: string;\r\n //formik\r\n name?: string;\r\n error?: boolean;\r\n label?: string;\r\n disabled?: boolean;\r\n required?: boolean;\r\n helperText?: string;\r\n info?: string;\r\n fullWidth?: boolean;\r\n size?: 'small' | 'medium';\r\n margin?: 'none' | 'dense' | 'normal';\r\n isRow?: boolean;\r\n}\r\n\r\nexport function CheckBoxGroup({\r\n name,\r\n id,\r\n value,\r\n options,\r\n onChange,\r\n label,\r\n required,\r\n helperText,\r\n disabled,\r\n fullWidth,\r\n margin,\r\n error,\r\n size,\r\n isRow,\r\n ...props\r\n}: CheckBoxGroupProps) {\r\n const handleChange = (event: React.ChangeEvent) => {\r\n const value = {\r\n Id: parseInt(event.target.id),\r\n Name: event.target.name,\r\n checked: event.target.checked,\r\n } as CheckEntity;\r\n if (onChange !== undefined) {\r\n onChange(value, event);\r\n }\r\n };\r\n return (\r\n \r\n {label}\r\n \r\n {options.map((item, index) => (\r\n \r\n }\r\n label={item.Name}\r\n />\r\n ))}\r\n \r\n {helperText}\r\n \r\n // \r\n // {options.map((option, index) => (\r\n // \r\n // }\r\n // label={option.Name}\r\n // disabled={props.disabled}\r\n // />\r\n // {(option as any).Info && (\r\n // \r\n // \r\n // \r\n // \r\n // \r\n // )}\r\n // \r\n // ))}\r\n // \r\n );\r\n}\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n CheckBoxGroup,\r\n CheckBoxGroupProps,\r\n CheckEntity,\r\n} from '../CheckBoxGroup';\r\n\r\n//export type FormCheckBoxGroupProps = FieldHookConfig & CheckBoxGroupProps;\r\n\r\nexport const FormCheckBoxGroup = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & CheckBoxGroupProps) => {\r\n const [field, meta, helpers] = useField(props);\r\n const handleChange = (value, event) => {\r\n const val = value as CheckEntity;\r\n helpers.setValue(\r\n field.value.map(f => {\r\n if (f.Id === val.Id) {\r\n f.checked = val.checked;\r\n }\r\n return f;\r\n }),\r\n true,\r\n );\r\n if (props.onChange !== undefined) {\r\n props.onChange(value, event);\r\n }\r\n field.onChange(event);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * EveryDaysPicker\r\n *\r\n */\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\n\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface EveryDaysPickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const initEveryDaysData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n Array.from(Array(100))\r\n .map((e, i) => {\r\n return { Id: i, Name: i.toString() };\r\n })\r\n .filter(item => {\r\n return item.Id.toString() === initval;\r\n }),\r\n );\r\n });\r\n }\r\n};\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = Array.from(Array(100))\r\n .map((e, i) => {\r\n return { Id: i, Name: i.toString() };\r\n })\r\n .filter(d => d.Id !== 0) as Entity[];\r\n\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\nexport function EveryDaysPicker(props: EveryDaysPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { EveryDaysPicker } from '../pickers/StaticOptionsPickers/EveryDaysPicker';\r\n\r\nexport const FormEveryDaysPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * RepeatMonthlyByPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { RepeatMonthlyBy } from 'enums/RepetitiveOptions';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface RepeatMonthlyByPickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const initRepeatMonthlyByData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n enumToEntityArray(RepeatMonthlyBy).filter(item => {\r\n return item.Id.toString() === initval;\r\n }),\r\n );\r\n });\r\n }\r\n};\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(RepeatMonthlyBy);\r\n\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\nexport function RepeatMonthlyByPicker(props: RepeatMonthlyByPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * RepeatMonthlyByPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { RepeatMonthlyByPicker } from '../pickers/StaticOptionsPickers/RepeatMonthlyBy';\r\n\r\nexport const FormRepeatMonthlyByPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * RepeatPeriodPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport { RepeatPeriod } from 'enums/RepetitiveOptions';\r\nimport { Entity } from 'types/common';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\n\r\nexport interface RepeatPeriodPickerProps\r\n extends Omit>, 'getOptions'> {}\r\n\r\nexport const initRemindBeforeData = (\r\n initval: number | string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n enumToEntityArray(RepeatPeriod).filter(item => {\r\n return item.Id.toString() === initval;\r\n }),\r\n );\r\n });\r\n }\r\n};\r\nconst getOptions = (searchTerm: string | null) => {\r\n let items = enumToEntityArray(RepeatPeriod);\r\n\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n};\r\nexport function RepeatPeriodPicker(props: RepeatPeriodPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * RepeatPeriodPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { RepeatPeriodPicker } from '../pickers/StaticOptionsPickers/RepeatPeriodPicker';\r\n\r\nexport const FormRepeatPeriodPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> & IFieldProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n disableClearable={props.disableClearable}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * RepetitiveOptionsPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\n// import { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { selectSystemFirstDayOfWeek } from 'app/slice/selectors';\r\nimport { GetRepetitiveOptions } from 'enums/RepetitiveOptions';\r\nimport { useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\nimport { dateUtils } from 'utils/date-utils';\r\nexport interface IRepetitiveOptionsParamsPicker {\r\n startDate: Date | null;\r\n}\r\nexport interface RepetitiveOptionsPickerProps\r\n extends Omit>, 'getOptions'>,\r\n IRepetitiveOptionsParamsPicker {}\r\n\r\n// export const initRepetitiveOptionsData = (\r\n// initval: number | string | undefined,\r\n// ): Promise[]> => {\r\n// if (initval === undefined) {\r\n// return new Promise[]>((resolve, reject) => {\r\n// resolve([] as Entity[]);\r\n// });\r\n// } else {\r\n// return new Promise[]>((resolve, reject) => {\r\n// resolve(\r\n// enumToEntityArray(RepetitiveOptions).filter(item => {\r\n// return item.Id.toString() === initval;\r\n// }),\r\n// );\r\n// });\r\n// }\r\n// };\r\n// const getOptions = (searchTerm: string | null) => {\r\n// let items = enumToEntityArray(RepetitiveOptions);\r\n\r\n// if (searchTerm !== null && searchTerm !== '') {\r\n// return items.filter(\r\n// f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n// );\r\n// }\r\n// return items;\r\n// };\r\nexport function withParamsFilter(\r\n startDate: Date | null,\r\n firstDayOfWeek: number,\r\n) {\r\n let date = startDate || new Date();\r\n let items = GetRepetitiveOptions(date, firstDayOfWeek);\r\n\r\n return (searchTerm: string | null) => {\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n };\r\n}\r\nexport function RepetitiveOptionsPicker(props: RepetitiveOptionsPickerProps) {\r\n const firstDayOfWeek = useSelector(selectSystemFirstDayOfWeek);\r\n // const { getOffsetDate } = useSystemDate();\r\n let getOptions = withParamsFilter(\r\n props.startDate === null\r\n ? null\r\n : dateUtils.dateOrStringToDate(props.startDate),\r\n firstDayOfWeek || 0,\r\n );\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport {\r\n IRepetitiveOptionsParamsPicker,\r\n RepetitiveOptionsPicker,\r\n} from '../pickers/StaticOptionsPickers/RepetitiveOptionsPicker';\r\n\r\nexport const FormRepetitiveOptionsPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps &\r\n IRepetitiveOptionsParamsPicker) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n />\r\n \r\n );\r\n};\r\n","import { RepetitiveOptions } from 'enums/RepetitiveOptions';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { every } from 'lodash';\r\nimport { IRepetitiveDto } from 'types/IRepetitiveDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport * as Yup from 'yup';\r\nimport { CheckEntityShema } from '.';\r\nimport { TransformDate } from './SchemaMethods';\r\n\r\nexport const RepetitiveSchema: Yup.SchemaOf = Yup.object({\r\n StartDate: Yup.date()\r\n .transform(TransformDate)\r\n .default(dateUtils.dateOrStringToDate(new Date())),\r\n RecurringEndDate: Yup.date()\r\n .label(i18next.t(translations.Until))\r\n .when('RecurringEvents', {\r\n is: val =>\r\n val !== null && val.Id !== (RepetitiveOptions.DoNotRepeat as number),\r\n then: Yup.date()\r\n .min(\r\n Yup.ref('StartDate'),\r\n i18next.t(translations.err_RepeatUntilDateLessThanStart) as string,\r\n )\r\n .required(i18next.t(translations.err_AlertInvalidRecurringUntilDate)),\r\n }),\r\n RecurringEvents: Yup.mixed(),\r\n RepeatsEveryDay: Yup.mixed(),\r\n RepeatsEveryPeriod: Yup.mixed(),\r\n RepeatsMonthlyBy: Yup.mixed(),\r\n RepeatsOnDays: Yup.array()\r\n .of(CheckEntityShema)\r\n .test({\r\n name: i18next.t(translations.RepeatsBy),\r\n message: i18next.t(translations.err_PepeatsOnDaysRequired),\r\n test: val => !every(val, ['checked', false]),\r\n }),\r\n});\r\n","import { CheckEntity } from 'app/components/CheckBoxGroup';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport {\r\n RepeatMonthlyBy,\r\n RepeatPeriod,\r\n RepetitiveOptions,\r\n} from 'enums/RepetitiveOptions';\r\nimport { Formik } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\nimport { IRepetitiveDto, ShortWeekDays } from 'types/IRepetitiveDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { FormBookitDatePicker } from '../FormBookitDatePicker';\r\nimport { FormCheckBoxGroup } from '../FormCheckBoxGroup';\r\nimport { FormEveryDaysPicker } from '../FormEveryDaysPicker';\r\nimport {\r\n FieldHandler,\r\n FormFieldProps,\r\n FormikSection,\r\n FormListener,\r\n IFieldSection,\r\n} from '../FormRender/FormRenderer';\r\nimport { FormRepeatMonthlyByPicker } from '../FormRepeatMonthlyByPicker';\r\nimport { FormRepeatPeriodPicker } from '../FormRepeatPeriodPicker';\r\nimport { FormRepetitiveOptionsPicker } from '../FormRepetitiveOptionsPicker';\r\nimport { RepetitiveSchema } from '../Schemas/RepititiveSchema';\r\nimport { useRepetitiveSlice } from './slice';\r\nimport { selectRepetitiveFieldHandler } from './slice/selectors';\r\nimport { RepetitiveFor } from './slice/types';\r\n\r\nexport interface FormRepetitiveProps {\r\n onSubmit: (item: IRepetitiveDto) => void;\r\n RepetitiveData?: IRepetitiveDto;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n StartDate?: Date;\r\n title: string | undefined;\r\n type: RepetitiveFor;\r\n disabled?: boolean;\r\n formIsValid?: (isValid: boolean) => void;\r\n withTopSeparator?: boolean;\r\n withBottomSeparator?: boolean;\r\n onFormChange?: (\r\n values: IRepetitiveDto,\r\n isValid: boolean,\r\n dirty: boolean,\r\n setValue?: (field: string, value: any, shouldValidate?: boolean) => void,\r\n ) => void;\r\n setTouched?: (dirty: boolean) => void;\r\n}\r\n\r\nexport function RepetitiveForm({\r\n onSubmit,\r\n processing,\r\n RepetitiveData,\r\n bindSubmitForm,\r\n StartDate,\r\n title,\r\n type,\r\n disabled,\r\n withTopSeparator,\r\n withBottomSeparator,\r\n formIsValid,\r\n setTouched,\r\n}: FormRepetitiveProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useRepetitiveSlice();\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value);\r\n }\r\n };\r\n const { newDate } = useSystemDate();\r\n const [recurringChanged, setRecurringChanged] = React.useState(\r\n false,\r\n );\r\n const [repeatPeriodChanged, setRepeatPeriodChanged] = React.useState(\r\n false,\r\n );\r\n const [repeatEndChanged, setRepeatEndChanged] = React.useState(\r\n false,\r\n );\r\n const fieldHandler = useSelector(selectRepetitiveFieldHandler);\r\n const reserFieldHandler = () => {\r\n dispatch(actions.resetRepetitiveHandler());\r\n };\r\n const handleFormChange = React.useCallback(\r\n (values: IRepetitiveDto, isValid, dirty, setValue) => {\r\n if (recurringChanged) {\r\n if (\r\n !!values.RecurringEvents &&\r\n values.RecurringEvents.Id ===\r\n (RepetitiveOptions.RepeatCustom as number)\r\n ) {\r\n setValue('RepeatsEveryDay', { Id: 1, Name: '1' }, false);\r\n setValue(\r\n 'RepeatsEveryPeriod',\r\n enumToEntityArray(RepeatPeriod, t).filter(f => f.Id === 2)[0],\r\n false,\r\n );\r\n setValue(\r\n 'RepeatsOnDays',\r\n ShortWeekDays().map(f => {\r\n if (f.Id === 1) f.checked = true;\r\n return f;\r\n }),\r\n false,\r\n );\r\n setValue('RepeatsMonthlyBy', null, false);\r\n }\r\n dispatch(\r\n actions.saveState({\r\n StartDate:\r\n values.StartDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.StartDate),\r\n ),\r\n RecurringEvents: values.RecurringEvents,\r\n RepeatsOnDays: values.RepeatsOnDays,\r\n RecurringEndDate:\r\n values.RecurringEndDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.RecurringEndDate),\r\n ),\r\n RepeatsEveryDay: values.RepeatsEveryDay,\r\n RepeatsEveryPeriod: values.RepeatsEveryPeriod,\r\n RepeatsMonthlyBy: values.RepeatsMonthlyBy,\r\n } as IRepetitiveDto),\r\n );\r\n setRecurringChanged(false);\r\n }\r\n if (repeatPeriodChanged) {\r\n let period = values.RepeatsEveryPeriod;\r\n if (period !== null && period !== undefined) {\r\n if (period.Id === (RepeatPeriod.Days as number)) {\r\n setValue('RepeatsMonthlyBy', null, false);\r\n setValue(\r\n 'RepeatsOnDays',\r\n ShortWeekDays().map(f => {\r\n if (f.Id === 1) f.checked = true;\r\n return f;\r\n }),\r\n false,\r\n );\r\n } else if (period.Id === (RepeatPeriod.Weeks as number)) {\r\n setValue('RepeatsMonthlyBy', null, false);\r\n setValue(\r\n 'RepeatsOnDays',\r\n ShortWeekDays().map(f => {\r\n if (f.Id === 1) f.checked = true;\r\n return f;\r\n }),\r\n false,\r\n );\r\n } else if (period.Id === (RepeatPeriod.Months as number)) {\r\n setValue(\r\n 'RepeatsMonthlyBy',\r\n enumToEntityArray(RepeatMonthlyBy, t)[0],\r\n false,\r\n );\r\n setValue(\r\n 'RepeatsOnDays',\r\n ShortWeekDays().map(f => {\r\n if (f.Id === 1) f.checked = true;\r\n return f;\r\n }),\r\n false,\r\n );\r\n }\r\n }\r\n dispatch(\r\n actions.saveState({\r\n StartDate:\r\n values.StartDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.StartDate),\r\n ),\r\n RecurringEvents: values.RecurringEvents,\r\n RepeatsOnDays: values.RepeatsOnDays,\r\n RecurringEndDate:\r\n values.RecurringEndDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.RecurringEndDate),\r\n ),\r\n RepeatsEveryDay: values.RepeatsEveryDay,\r\n RepeatsEveryPeriod: values.RepeatsEveryPeriod,\r\n RepeatsMonthlyBy: values.RepeatsMonthlyBy,\r\n } as IRepetitiveDto),\r\n );\r\n setRepeatPeriodChanged(false);\r\n }\r\n if (repeatEndChanged) {\r\n dispatch(\r\n actions.saveState({\r\n StartDate:\r\n values.StartDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.StartDate),\r\n ),\r\n RecurringEvents: values.RecurringEvents,\r\n RepeatsOnDays: values.RepeatsOnDays,\r\n RecurringEndDate:\r\n values.RecurringEndDate === undefined\r\n ? undefined\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(values.RecurringEndDate),\r\n ),\r\n RepeatsEveryDay: values.RepeatsEveryDay,\r\n RepeatsEveryPeriod: values.RepeatsEveryPeriod,\r\n RepeatsMonthlyBy: values.RepeatsMonthlyBy,\r\n } as IRepetitiveDto),\r\n );\r\n setRepeatEndChanged(false);\r\n }\r\n },\r\n [\r\n actions,\r\n dispatch,\r\n recurringChanged,\r\n repeatEndChanged,\r\n repeatPeriodChanged,\r\n t,\r\n ],\r\n );\r\n const leftSideSections = (\r\n values: IRepetitiveDto,\r\n isSubmitting: boolean,\r\n title: string | undefined,\r\n ): IFieldSection[] => {\r\n return [\r\n {\r\n title: title,\r\n order: 1,\r\n withBottomSeparator: withBottomSeparator,\r\n withTopSeparator: withTopSeparator,\r\n fields: [\r\n {\r\n id: 'RecurringEvents',\r\n name: 'RecurringEvents',\r\n startDate: dateUtils.dateOrStringToDate(\r\n values.StartDate || newDate(),\r\n ),\r\n label: undefined,\r\n ariaLabel:\r\n type === RepetitiveFor.WorkOrder\r\n ? t(translations.RecurringEvents)\r\n : type === RepetitiveFor.Reservations\r\n ? t(translations.RepetitiveReservation)\r\n : t(translations.Repeat),\r\n disabled: isSubmitting || disabled,\r\n disableClearable: true,\r\n onChange: () => setRecurringChanged(true),\r\n fullWidth: true,\r\n component: FormRepetitiveOptionsPicker,\r\n order: 1,\r\n } as FormFieldProps | null>,\r\n {\r\n minRow: true,\r\n hide:\r\n values.RecurringEvents?.Id ===\r\n (RepetitiveOptions.DoNotRepeat as number),\r\n id: 'RecurringEndDate',\r\n name: 'RecurringEndDate',\r\n label: t(translations.Until),\r\n disabled: isSubmitting || disabled,\r\n fullWidth: true,\r\n component: FormBookitDatePicker,\r\n onChange: () => setRepeatEndChanged(true),\r\n order: 2,\r\n } as FormFieldProps,\r\n {\r\n hide:\r\n values.RecurringEvents?.Id !==\r\n (RepetitiveOptions.RepeatCustom as number),\r\n id: 'RepeatsEveryDay',\r\n name: 'RepeatsEveryDay',\r\n label: t(translations.RepeatsEvery),\r\n disabled: isSubmitting || disabled,\r\n disableClearable: true,\r\n fullWidth: true,\r\n component: FormEveryDaysPicker,\r\n order: 3,\r\n } as FormFieldProps | null>,\r\n {\r\n hide:\r\n values.RecurringEvents?.Id !==\r\n (RepetitiveOptions.RepeatCustom as number),\r\n id: 'RepeatsEveryPeriod',\r\n name: 'RepeatsEveryPeriod',\r\n label: t(translations.RepeatsEveryPeriod),\r\n onChange: () => setRepeatPeriodChanged(true),\r\n disabled: isSubmitting || disabled,\r\n disableClearable: true,\r\n fullWidth: true,\r\n component: FormRepeatPeriodPicker,\r\n order: 4,\r\n } as FormFieldProps | null>,\r\n {\r\n hide:\r\n values.RecurringEvents?.Id !==\r\n (RepetitiveOptions.RepeatCustom as number) ||\r\n values.RepeatsEveryPeriod?.Id !== (RepeatPeriod.Months as number),\r\n id: 'RepeatsMonthlyBy',\r\n name: 'RepeatsMonthlyBy',\r\n label: t(translations.RepeatsBy),\r\n disabled: isSubmitting || disabled,\r\n disableClearable: true,\r\n fullWidth: true,\r\n component: FormRepeatMonthlyByPicker,\r\n order: 5,\r\n } as FormFieldProps | null>,\r\n {\r\n fullRow: true,\r\n hide:\r\n values.RecurringEvents?.Id !==\r\n (RepetitiveOptions.RepeatCustom as number) ||\r\n values.RepeatsEveryPeriod?.Id !== (RepeatPeriod.Weeks as number),\r\n id: 'RepeatsOnDays',\r\n name: 'RepeatsOnDays',\r\n label: t(translations.RepeatsOn),\r\n options: values.RepeatsOnDays,\r\n disabled: isSubmitting || disabled,\r\n fullWidth: true,\r\n component: FormCheckBoxGroup,\r\n order: 6,\r\n } as FormFieldProps,\r\n ],\r\n item: values,\r\n } as IFieldSection,\r\n ];\r\n };\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n // if (formik.errors) {\r\n // console.log('Repetitive errors', formik.errors);\r\n // }\r\n if (formIsValid) {\r\n formIsValid(formik.isValid);\r\n }\r\n setTouched?.(formik.dirty);\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n \r\n {leftSideSections(formik.values, formik.isSubmitting, title)\r\n .sort((a, b) => a.order - b.order)\r\n .map((section, index) => (\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\n // );\r\n}\r\n","import { httpClient } from './HttpClient';\r\nimport { IUserTrainingDto } from './odata/generated/entities/IUserTrainingDto';\r\n\r\nexport const UserTrainingApi = {\r\n initCreateData: (payload: {\r\n equId?: string | null;\r\n equIds?: string | null;\r\n fatherId?: string | null;\r\n user?: string | null;\r\n rid?: string | null;\r\n date?: string | null;\r\n }) => {\r\n const url = `/api/odata/v4/usertrainings/initNewTraining`;\r\n return httpClient.post(url, payload);\r\n },\r\n initUpdateData: (payload: { Id: number }) => {\r\n const url = '/api/odata/v4/usertrainings';\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Id asc',\r\n $filter: '(Id eq ' + payload.Id + ')',\r\n $select:\r\n 'Id,AttachmentExist,EquipmentId,UserGroupId,AllowBookingFromTrainingDate,MustOrderEveryDays,MustUseEveryDays,ReservationName,TrainerId' +\r\n ',AssetId,UserDisplayName,UserId,ServiceGroupId,ExpiredDate,UserGroupName,Active,Remarks,RequiresAdminApproval,ReservationId,TrainingLevelName,TrainingLevelId,TrainerName' +\r\n ',TrainingDate,EquipmentName,ServiceGroupName,ReservationStart,ReservationEnd',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient.get(url, params);\r\n },\r\n\r\n submitTrainings: (payload: IUserTrainingDto[]) => {\r\n const data = {\r\n trainings: payload,\r\n };\r\n const url = '/api/odata/v4/usertrainings/SubmitTrainings';\r\n return httpClient.post(url, data);\r\n },\r\n approveRejectReservations: (payload: {\r\n trainings: number[];\r\n approve: boolean;\r\n }) => {\r\n const data = {\r\n rows: payload.trainings,\r\n };\r\n const url = payload.approve\r\n ? `/api/odata/v4/usertrainings/ApproveReservations`\r\n : `/api/odata/v4/usertrainings/RejectReservations`;\r\n return httpClient.post(url, data);\r\n },\r\n hasUntrainedNotAllowed: (payload: { services: string; users: string }) => {\r\n const url = `/api/odata/v4/usertrainings/UntrainedNotAllowed`;\r\n return httpClient.post(url, payload);\r\n },\r\n activateTraining: (payload: { Id?: number; activate?: boolean }) => {\r\n const url = `/api/odata/v4/usertrainings/ActivateDeactivateTraining`;\r\n return httpClient.post(url, payload);\r\n },\r\n};\r\n","import { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { IUserTrainingDto } from 'api/odata/generated/entities/IUserTrainingDto';\r\nimport { AsyncDataState, Entity } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { toEntity } from 'utils/entity-utils';\r\nimport { toNumberOrNull } from 'utils/typeUtils';\r\n\r\n/* --- STATE --- */\r\nexport interface TrainingReservationsState {\r\n showApproveReservations: boolean;\r\n showRejectReservations: boolean;\r\n ApproveRejectRecords: number[];\r\n processing: boolean;\r\n completed?: boolean;\r\n}\r\nexport interface TrainingState {\r\n createState: AsyncDataState;\r\n updateState: AsyncDataState;\r\n reservationsUpdateState: TrainingReservationsState;\r\n processing: boolean;\r\n}\r\n\r\nexport interface TrainingDetailsState {\r\n Id: number | null | undefined;\r\n Users: Entity[];\r\n Equipments: Entity[];\r\n UnhideServiceGroup: boolean | null | undefined;\r\n TrainingDate: Date | string | null | undefined;\r\n ExpiredDate: Date | string | null | undefined;\r\n Trainer: Entity | null | undefined;\r\n MustOrderEveryDays: number | null | undefined;\r\n MustUseEveryDays: number | null | undefined;\r\n RequiresAdminApproval: boolean | null | undefined;\r\n AllowBookingFromTrainingDate: boolean | null | undefined;\r\n Reservations: Entity | null | undefined;\r\n TrainingLevel: Entity | null | undefined;\r\n Remarks?: string | null;\r\n Active: boolean | null | undefined;\r\n FatherId: number | null | undefined;\r\n ServiceGroupId: number | null | undefined;\r\n TrainingProgram: Entity | null | undefined;\r\n}\r\n\r\nexport interface TrainingsResponse extends IResponseType {\r\n ShowApproveReservationsMessage: boolean;\r\n ShowReviseToPendingMessage: boolean;\r\n ApproveRejectRecords: number[];\r\n Id?: number;\r\n}\r\nexport function ConvertEntityToModel(\r\n entity: IUserTrainingDto,\r\n): TrainingDetailsState | undefined {\r\n if (!entity) {\r\n return undefined;\r\n } else {\r\n return {\r\n Id: entity.Id,\r\n Active: entity.Active,\r\n AllowBookingFromTrainingDate: entity.AllowBookingFromTrainingDate,\r\n Equipments: [\r\n {\r\n Id: entity.EquipmentId,\r\n Name: entity.EquipmentName,\r\n ServiceGroupId: entity.ServiceGroupId,\r\n ServiceTypeId: 1,\r\n } as IServiceFilterDto,\r\n ] as Entity[],\r\n ExpiredDate:\r\n entity.ExpiredDate === null\r\n ? null\r\n : dateUtils.formatISO(dateUtils.parseISO(entity.ExpiredDate), {\r\n representation: 'date',\r\n }),\r\n FatherId: null,\r\n MustOrderEveryDays: entity.MustOrderEveryDays,\r\n MustUseEveryDays: entity.MustUseEveryDays,\r\n Remarks: entity.Remarks,\r\n RequiresAdminApproval: entity.RequiresAdminApproval,\r\n Reservations:\r\n entity.ReservationId == null\r\n ? null\r\n : toEntity(\r\n entity.ReservationId,\r\n dateUtils.shortDateTimeFormat(entity.ReservationStart) +\r\n ' - ' +\r\n dateUtils.shortDateTimeFormat(entity.ReservationEnd),\r\n ),\r\n Trainer: toEntity(entity.TrainerId, entity.TrainerName) as IUserFilterDto,\r\n TrainingDate: dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(entity.TrainingDate),\r\n {\r\n representation: 'date',\r\n },\r\n ),\r\n TrainingLevel: toEntity(entity.TrainingLevelId, entity.TrainingLevelName),\r\n Users: [{ Id: entity.UserId, Name: entity.UserDisplayName }],\r\n ServiceGroupId: entity.ServiceGroupId,\r\n UnhideServiceGroup: entity.UnhideServiceGroup,\r\n TrainingProgram: toEntity(\r\n entity.TrainingProgramId,\r\n entity.TrainingProgramName,\r\n ),\r\n } as TrainingDetailsState;\r\n }\r\n}\r\nexport function ConvertModelToEntity(\r\n model: TrainingDetailsState,\r\n original: TrainingDetailsState | undefined,\r\n): IUserTrainingDto[] {\r\n let entities = [] as IUserTrainingDto[];\r\n model.Equipments.forEach(eq => {\r\n model.Users.forEach(ur => {\r\n entities.push({\r\n Id:\r\n original === undefined\r\n ? -1\r\n : original?.Equipments[0].Id === eq.Id &&\r\n original.Users[0].Id === ur.Id\r\n ? model.Id ?? -1\r\n : -1,\r\n EquipmentId: eq.Id,\r\n EquipmentName: eq.Name,\r\n ServiceGroupId: (eq as IServiceFilterDto).ServiceGroupId ?? null,\r\n UserId: ur.Id,\r\n UserDisplayName: ur.Name,\r\n Active: model.Active ?? false,\r\n AllowBookingFromTrainingDate:\r\n model.AllowBookingFromTrainingDate ?? true,\r\n ExpiredDate:\r\n model.ExpiredDate === null || model.ExpiredDate === undefined\r\n ? null\r\n : dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.ExpiredDate),\r\n ),\r\n MustOrderEveryDays: toNumberOrNull(model.MustOrderEveryDays),\r\n MustUseEveryDays: toNumberOrNull(model.MustUseEveryDays),\r\n Remarks: model.Remarks ?? null,\r\n RequiresAdminApproval: model.RequiresAdminApproval ?? false,\r\n ReservationId: model.Reservations?.Id ?? null,\r\n TrainerId: model.Trainer?.Id ?? null,\r\n TrainingDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.TrainingDate || new Date()),\r\n ),\r\n TrainingLevelId: model.TrainingLevel?.Id ?? null,\r\n TrainingLevelName: model.TrainingLevel?.Name ?? null,\r\n FatherId: model.FatherId ?? null,\r\n UnhideServiceGroup: model.UnhideServiceGroup ?? false,\r\n TrainingProgramId: model.TrainingProgram?.Id ?? null,\r\n TrainingProgramName: model.TrainingProgram?.Name ?? null,\r\n } as IUserTrainingDto);\r\n });\r\n });\r\n return entities.filter(item => item !== undefined && item !== null);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, takeLatest } from 'redux-saga/effects';\r\nimport { trainingActions as actions } from '.';\r\nimport { UserTrainingApi as api } from 'api/UserTrainingApi';\r\nimport { IUserTrainingDto } from 'api/odata/generated/entities/IUserTrainingDto';\r\nimport {\r\n ConvertModelToEntity,\r\n TrainingDetailsState,\r\n TrainingsResponse,\r\n} from './types';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { AxiosError } from 'axios';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { TrainingDetailsProps } from '..';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\n\r\nfunction* doInitCreate(\r\n action: PayloadAction<{\r\n equId?: string | null;\r\n equIds?: string | null;\r\n fatherId?: string | null;\r\n rid?: string | null;\r\n date?: string | null;\r\n user?: string | null;\r\n }>,\r\n) {\r\n try {\r\n const data = yield call(api.initCreateData, action.payload);\r\n yield put(actions.initCreateTraining_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initCreateTraining_Error(Error));\r\n }\r\n}\r\nfunction* doInitUpdate(action: PayloadAction<{ Id: number }>) {\r\n try {\r\n const data = yield call(api.initUpdateData, action.payload);\r\n yield put(actions.initUpdateTraining_Success(data.value[0]));\r\n } catch (error: unknown) {\r\n yield put(actions.initUpdateTraining_Error(Error));\r\n }\r\n}\r\nfunction* doCreate(action: PayloadAction) {\r\n const httpPayloads: IUserTrainingDto[] = ConvertModelToEntity(\r\n action.payload,\r\n undefined,\r\n );\r\n try {\r\n const result = yield call(api.submitTrainings, httpPayloads);\r\n let trainingsResponse = result as TrainingsResponse;\r\n if (trainingsResponse.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n trainingsResponse.ErrorMessages.map(item => {\r\n return {\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (trainingsResponse.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n trainingsResponse.WarningMessages.map(item => {\r\n return {\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (trainingsResponse.SuccessMessages.length > 0) {\r\n if (trainingsResponse.Id) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'insertedSuccess',\r\n message: trainingsResponse.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: trainingsResponse.Id,\r\n created: true,\r\n itemName: i18next.t(translations.UserTraining),\r\n detailsType: RenderPageType.TrainingDetails,\r\n detailsTypeProps: {\r\n id: '' + trainingsResponse.Id,\r\n useSidePanel: true,\r\n } as TrainingDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'insertedSuccess',\r\n message: trainingsResponse.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n yield put(actions.createTraining_Success(trainingsResponse));\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'UserTrainingCreate',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createTraining_Error(Error));\r\n }\r\n}\r\nfunction* duUpdateTraining(\r\n action: PayloadAction<{\r\n current: TrainingDetailsState;\r\n original: TrainingDetailsState | undefined;\r\n }>,\r\n) {\r\n const httpPayloads: IUserTrainingDto[] = ConvertModelToEntity(\r\n action.payload.current,\r\n action.payload.original,\r\n );\r\n try {\r\n const result = yield call(api.submitTrainings, httpPayloads);\r\n let trainingsResponse = result as TrainingsResponse;\r\n if (trainingsResponse.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n trainingsResponse.ErrorMessages.map(item => {\r\n return {\r\n key: 'UpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (trainingsResponse.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'updateWarning',\r\n message: trainingsResponse.WarningMessages[0],\r\n variant: 'warning',\r\n }),\r\n );\r\n }\r\n if (trainingsResponse.SuccessMessages.length > 0) {\r\n if (trainingsResponse.Id) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'updatedSuccess',\r\n message: trainingsResponse.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: trainingsResponse.Id,\r\n created: false,\r\n itemName: i18next.t(translations.UserTraining),\r\n detailsType: RenderPageType.TrainingDetails,\r\n detailsTypeProps: {\r\n id: '' + trainingsResponse.Id,\r\n useSidePanel: true,\r\n } as TrainingDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'updatedSuccess',\r\n message: trainingsResponse.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n yield put(actions.updateTraining_Success(trainingsResponse));\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'UserTrainingUpdate',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateTraining_Error(Error));\r\n }\r\n}\r\nfunction* doApproveRejectReservations(\r\n action: PayloadAction<{\r\n trainings: number[];\r\n approve: boolean;\r\n }>,\r\n) {\r\n try {\r\n const result = yield call(api.approveRejectReservations, action.payload);\r\n let response = result as IResponseType;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(actions.approveRejectReservations_success());\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'UserTrainingResUpdate',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.approveRejectReservations_error(Error));\r\n }\r\n}\r\nfunction* doActivate(\r\n action: PayloadAction<{ Id?: number; activate?: boolean }>,\r\n) {\r\n try {\r\n const result = yield call(api.activateTraining, action.payload);\r\n let response = result as IResponseType;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(\r\n actions.activateDeactivateTraining_success(action.payload.activate),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'UserTrainingResUpdate',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.activateDeactivateTraining_error(Error));\r\n }\r\n}\r\nexport function* trainingSaga() {\r\n yield takeLatest(actions.initCreateTraining.type, doInitCreate);\r\n yield takeLatest(actions.initUpdateTraining.type, doInitUpdate);\r\n yield takeLatest(actions.createTraining.type, doCreate);\r\n yield takeLatest(actions.updateTraining.type, duUpdateTraining);\r\n yield takeLatest(\r\n actions.approveRejectReservations.type,\r\n doApproveRejectReservations,\r\n );\r\n yield takeLatest(actions.activateDeactivateTraining.type, doActivate);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IUserTrainingDto } from 'api/odata/generated/entities/IUserTrainingDto';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { trainingSaga } from './saga';\r\nimport {\r\n ConvertEntityToModel,\r\n TrainingDetailsState,\r\n TrainingReservationsState,\r\n TrainingsResponse,\r\n TrainingState,\r\n} from './types';\r\n\r\nexport const initialState: TrainingState = {\r\n createState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n updateState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n reservationsUpdateState: {\r\n showApproveReservations: false,\r\n showRejectReservations: false,\r\n ApproveRejectRecords: [],\r\n processing: false,\r\n completed: undefined,\r\n },\r\n processing: false,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'training',\r\n initialState,\r\n reducers: {\r\n initCreateTraining(\r\n state,\r\n action: PayloadAction<{\r\n equId?: string | null;\r\n equIds?: string | null;\r\n fatherId?: string | null;\r\n rid?: string | null;\r\n date?: string | null;\r\n user?: string | null;\r\n }>,\r\n ) {\r\n state.processing = true;\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initCreateTraining_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.createState.data = {\r\n Id: null,\r\n Active: action.payload.Active,\r\n AllowBookingFromTrainingDate: true,\r\n Equipments: action.payload.Equipments,\r\n RequiresAdminApproval: false,\r\n Reservations: action.payload.Reservations,\r\n UnhideServiceGroup: false,\r\n Users: action.payload.Users,\r\n TrainingDate: action.payload.TrainingDate,\r\n ExpiredDate: null,\r\n MustOrderEveryDays: undefined,\r\n MustUseEveryDays: undefined,\r\n Remarks: undefined,\r\n Trainer: action.payload.Trainer,\r\n TrainingLevel: undefined,\r\n FatherId: action.payload.FatherId ?? null,\r\n ServiceGroupId: null,\r\n TrainingProgram: undefined,\r\n };\r\n },\r\n initCreateTraining_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.createState.data = {\r\n Id: null,\r\n Active: true,\r\n AllowBookingFromTrainingDate: true,\r\n Equipments: [],\r\n RequiresAdminApproval: false,\r\n Reservations: undefined,\r\n UnhideServiceGroup: false,\r\n Users: [],\r\n TrainingDate: new Date(),\r\n ExpiredDate: null,\r\n MustOrderEveryDays: undefined,\r\n MustUseEveryDays: undefined,\r\n Remarks: undefined,\r\n Trainer: undefined,\r\n TrainingLevel: undefined,\r\n FatherId: null,\r\n ServiceGroupId: null,\r\n TrainingProgram: undefined,\r\n };\r\n },\r\n createTraining(state, action: PayloadAction) {\r\n state.createState.processing = true;\r\n state.createState.completed = undefined;\r\n state.createState.hasErrors = undefined;\r\n },\r\n createTraining_Success(state, action: PayloadAction) {\r\n state.createState.processing = false;\r\n state.reservationsUpdateState.ApproveRejectRecords =\r\n action.payload.ApproveRejectRecords;\r\n state.reservationsUpdateState.showApproveReservations =\r\n action.payload.ShowApproveReservationsMessage;\r\n state.reservationsUpdateState.showRejectReservations =\r\n action.payload.ShowReviseToPendingMessage;\r\n state.createState.hasErrors = action.payload.ErrorMessages.length > 0;\r\n state.createState.completed = true;\r\n },\r\n createTraining_Error(state, action: PayloadAction) {\r\n state.createState.processing = false;\r\n state.createState.completed = true;\r\n },\r\n resetCreateTrainingState(state, action: PayloadAction) {\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n resetReservationsState(state, action: PayloadAction) {\r\n state.reservationsUpdateState = {\r\n showApproveReservations: false,\r\n showRejectReservations: false,\r\n ApproveRejectRecords: [],\r\n processing: false,\r\n completed: undefined,\r\n };\r\n },\r\n resetUpdateTrainingState(state, action: PayloadAction) {\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initUpdateTraining(\r\n state,\r\n action: PayloadAction<{\r\n Id: number;\r\n }>,\r\n ) {\r\n state.processing = true;\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initUpdateTraining_Success(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.updateState.data = ConvertEntityToModel(action.payload);\r\n },\r\n initUpdateTraining_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n state.updateState.data = undefined;\r\n },\r\n updateTraining(\r\n state,\r\n action: PayloadAction<{\r\n current: TrainingDetailsState;\r\n original: TrainingDetailsState | undefined;\r\n }>,\r\n ) {\r\n state.updateState.processing = true;\r\n state.updateState.completed = undefined;\r\n state.updateState.hasErrors = undefined;\r\n },\r\n updateTraining_Success(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.reservationsUpdateState.ApproveRejectRecords =\r\n action.payload.ApproveRejectRecords;\r\n state.reservationsUpdateState.showApproveReservations =\r\n action.payload.ShowApproveReservationsMessage;\r\n state.reservationsUpdateState.showRejectReservations =\r\n action.payload.ShowReviseToPendingMessage;\r\n state.updateState.hasErrors = action.payload.ErrorMessages.length > 0;\r\n state.updateState.completed = true;\r\n },\r\n updateTraining_Error(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n },\r\n setReservationsUpdateState(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.reservationsUpdateState.ApproveRejectRecords =\r\n action.payload.ApproveRejectRecords;\r\n state.reservationsUpdateState.showApproveReservations =\r\n action.payload.showApproveReservations;\r\n state.reservationsUpdateState.showRejectReservations =\r\n action.payload.showRejectReservations;\r\n },\r\n approveRejectReservations(\r\n state,\r\n action: PayloadAction<{\r\n trainings: number[];\r\n approve: boolean;\r\n }>,\r\n ) {\r\n state.reservationsUpdateState.processing = true;\r\n state.reservationsUpdateState.completed = false;\r\n },\r\n approveRejectReservations_success(state, action: PayloadAction) {\r\n state.reservationsUpdateState.processing = false;\r\n state.reservationsUpdateState.completed = true;\r\n },\r\n approveRejectReservations_error(state, action: PayloadAction) {\r\n state.reservationsUpdateState.processing = false;\r\n state.reservationsUpdateState.completed = true;\r\n },\r\n activateDeactivateTraining(\r\n state,\r\n action: PayloadAction<{ Id?: number; activate?: boolean }>,\r\n ) {\r\n state.updateState.processing = true;\r\n state.updateState.completed = false;\r\n },\r\n activateDeactivateTraining_success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n if (state.updateState.data) {\r\n state.updateState.data.Active = action.payload;\r\n }\r\n },\r\n activateDeactivateTraining_error(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: trainingActions } = slice;\r\n\r\nexport const useTrainingSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: trainingSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useTrainingSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.training || initialState;\r\n\r\nexport const selectTraining = createSelector([selectSlice], state => state);\r\n\r\nexport const selectInitTrainingProcessing = createSelector(\r\n [selectTraining],\r\n state => state.processing,\r\n);\r\nexport const selectCreateTrainingProcessing = createSelector(\r\n [selectTraining],\r\n state => state.createState.processing,\r\n);\r\nexport const selectUpdateTrainingProcessing = createSelector(\r\n [selectTraining],\r\n state => state.updateState.processing,\r\n);\r\nexport const selectCreateTraining = createSelector(\r\n [selectTraining],\r\n state => state.createState.data,\r\n);\r\nexport const selectUpdateTraining = createSelector(\r\n [selectTraining],\r\n state => state.updateState.data,\r\n);\r\nexport const selectCreateTrainingCompleted = createSelector(\r\n [selectTraining],\r\n state => state.createState.completed,\r\n);\r\nexport const selectUpdateTrainingCompleted = createSelector(\r\n [selectTraining],\r\n state => state.updateState.completed,\r\n);\r\nexport const selectCreateTrainingHasError = createSelector(\r\n [selectTraining],\r\n state => state.createState.hasErrors,\r\n);\r\nexport const selectUpdateTrainingHasError = createSelector(\r\n [selectTraining],\r\n state => state.updateState.hasErrors,\r\n);\r\nexport const selectShowApproveReservatiions = createSelector(\r\n [selectTraining],\r\n state => state.reservationsUpdateState.showApproveReservations,\r\n);\r\nexport const selectShowRejectReservatiions = createSelector(\r\n [selectTraining],\r\n state => state.reservationsUpdateState.showRejectReservations,\r\n);\r\nexport const selectReservatiionsData = createSelector(\r\n [selectTraining],\r\n state => state.reservationsUpdateState.ApproveRejectRecords,\r\n);\r\nexport const selectReservatiionsProcessing = createSelector(\r\n [selectTraining],\r\n state => state.reservationsUpdateState.processing,\r\n);\r\nexport const selectReservatiionsUpdateCompleted = createSelector(\r\n [selectTraining],\r\n state => state.reservationsUpdateState.completed,\r\n);\r\n","/**\r\n *\r\n * RoomPicker\r\n *\r\n */\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IReservationFilterDto } from 'api/odata/generated/entities/IReservationFilterDto';\r\nimport {\r\n Condition,\r\n ODataFilterBuilder,\r\n ODataOperators,\r\n} from 'api/odata/ODataFilter';\r\nimport {\r\n AutocompletePicker,\r\n AutocompletePickerProps,\r\n} from 'app/components/BasicPickers/AutocompletePicker';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport interface ITrainingResFilterProps {\r\n equipment?: Entity;\r\n user?: Entity;\r\n trainingDate?: Date;\r\n}\r\n\r\nexport interface TrainingResevationsPickerProps\r\n extends Omit>, 'loadData'>,\r\n ITrainingResFilterProps {}\r\n\r\nconst url = '/api/odata/v4/ReservationFilter';\r\nconst formatName = (\r\n reservations: IReservationFilterDto[],\r\n): IReservationFilterDto[] => {\r\n reservations.forEach(item => {\r\n item.Name =\r\n dateUtils.shortDateTimeFormat(item.Start) +\r\n ' - ' +\r\n dateUtils.shortDateTimeFormat(item.End);\r\n });\r\n return reservations;\r\n};\r\nexport function withUserTrainingFilter(\r\n equipment: Entity | undefined,\r\n user: Entity | undefined,\r\n trainingDate: Date | undefined,\r\n) {\r\n return (searchTerm: string | null) => {\r\n const params: { $orderby: string; $filter?: string } = {\r\n $orderby: 'Name asc',\r\n };\r\n const predicates: Condition[] = [];\r\n if (equipment !== undefined) {\r\n predicates.push(\r\n new Condition('EquipmentId', ODataOperators.Equals, equipment.Id),\r\n );\r\n }\r\n if (user !== undefined) {\r\n predicates.push(\r\n new Condition('UserName', ODataOperators.Equals, user.Id),\r\n );\r\n }\r\n if (trainingDate !== undefined) {\r\n let tDate = dateUtils.parseISO(trainingDate);\r\n let strDate = new Date() > tDate ? new Date() : tDate;\r\n let endDate = new CustomDate(\r\n new Date(\r\n strDate.getFullYear(),\r\n strDate.getMonth(),\r\n strDate.getDate() + 1,\r\n ),\r\n 'date',\r\n );\r\n predicates.push(\r\n new Condition('Start', ODataOperators.GreaterThanEqual, strDate),\r\n );\r\n predicates.push(\r\n new Condition('End', ODataOperators.LessThanEqual, endDate),\r\n );\r\n }\r\n params.$filter = new ODataFilterBuilder({\r\n predicates: predicates,\r\n stringColumns: ['Name'],\r\n stringSearch: searchTerm === null ? undefined : searchTerm,\r\n globalServiceGroupFilter: [],\r\n }).toString();\r\n\r\n return httpClient\r\n .get(url, params)\r\n .then(\r\n response =>\r\n formatName(response.value as IReservationFilterDto[]) as Entity<\r\n number\r\n >[],\r\n );\r\n };\r\n}\r\nexport const initTrainingResevationsData = (initval: string | undefined) => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n const id = parseInt(initval);\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: '(Id eq ' + id + ')',\r\n $select: 'Id,Name,Start,End',\r\n $skip: 0,\r\n $top: 1,\r\n };\r\n return httpClient\r\n .get(url, params)\r\n .then(\r\n response =>\r\n formatName(response.value as IReservationFilterDto[]) as Entity<\r\n number\r\n >[],\r\n );\r\n }\r\n};\r\n\r\nexport function TrainingResevationsPicker(\r\n props: TrainingResevationsPickerProps,\r\n) {\r\n const loadData = withUserTrainingFilter(\r\n props.equipment,\r\n props.user,\r\n props.trainingDate,\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AsyncPicker\r\n *\r\n */\r\nimport { Entity } from 'types/common';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport {\r\n ITrainingResFilterProps,\r\n TrainingResevationsPicker,\r\n} from '../pickers/AutocompletePickers/TrainingReservationsPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport const FormTrainingReservationsPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n IFieldProps &\r\n ITrainingResFilterProps) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n fullWidth={props.fullWidth}\r\n />\r\n \r\n );\r\n};\r\n","/**\r\n *\r\n * FormTrainingLevelPicker\r\n *\r\n */\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { TrainingLevelPicker } from '../pickers/AutocompletePickers/TrainingLevelPicker';\r\nimport { ITrainingLevelFilterDto } from 'api/odata/generated/entities/ITrainingLevelFilterDto';\r\n\r\nexport const FormTrainingLevelPicker = ({\r\n label,\r\n ...props\r\n}: FieldHookConfig & IFieldProps) => {\r\n const [field, meta, helpers] = useField(\r\n props,\r\n );\r\n return (\r\n <>\r\n {\r\n helpers.setValue(value, true);\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n }}\r\n info={props.info}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n error={meta?.error !== undefined}\r\n helperText={meta.error}\r\n disabled={props.disabled}\r\n fullWidth={props.fullWidth}\r\n />\r\n \r\n );\r\n};\r\n","import { CommentsApi } from 'api/CommentsApi';\r\nimport { IComment } from 'app/components/CommentsContainer/IComment';\r\nimport { selectPublicUrl } from 'app/slice/selectors';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport * as React from 'react';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { CommentsContainer } from 'app/components/CommentsContainer';\r\nimport { translations } from 'locales/translations';\r\nimport { buildURL } from 'utils/url-utils';\r\nimport { Portal } from '@material-ui/core';\r\nimport { TrainingDetailsState } from '../../slice/types';\r\nimport { useUploadToNewComment } from 'app/components/LargeFilesUpload/Components/useUploadToNewComment';\r\nimport { useLargeFilesUploadSlice } from 'app/components/LargeFilesUpload/slice';\r\n\r\nexport interface UserTrainingCommentsProps {\r\n isAdmin?: boolean;\r\n training: TrainingDetailsState;\r\n disabled?: boolean;\r\n commentsFormRef: React.MutableRefObject;\r\n}\r\n\r\nexport const UserTrainingComments = (props: UserTrainingCommentsProps) => {\r\n const { training, isAdmin, disabled, commentsFormRef } = props;\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const { t } = useTranslation();\r\n const [changed, setchanged] = React.useState(false);\r\n const dispatch = useDispatch();\r\n const { actions: largeFileActions } = useLargeFilesUploadSlice();\r\n const comments = useAsyncGetWthEffect(\r\n () =>\r\n CommentsApi.GetComments(\r\n CommentReferenceTypes.UserTraining,\r\n training.Id ?? 0,\r\n ),\r\n [],\r\n [changed],\r\n );\r\n const bindSubmitComment = React.useCallback(\r\n submitForm => {\r\n commentsFormRef.current = submitForm;\r\n },\r\n [commentsFormRef],\r\n );\r\n const { onCommentAdded } = useUploadToNewComment();\r\n const portalRef = React.useRef(null);\r\n React.useEffect(() => {\r\n dispatch(\r\n largeFileActions.setCommentProperties({\r\n commentType: CommentReferenceTypes.UserTraining,\r\n referenceId: training.Id ?? 0,\r\n }),\r\n );\r\n }, [dispatch, largeFileActions, training.Id]);\r\n return (\r\n \r\n
    \r\n \r\n {\r\n CommentsApi.SendComment(\r\n CommentReferenceTypes.UserTraining,\r\n training.Id ?? 0,\r\n c,\r\n )\r\n .then(res => onCommentAdded?.(res))\r\n .finally(() => setchanged(prev => !prev));\r\n }}\r\n isAdmin={isAdmin}\r\n withMentions\r\n pageName={t(translations.menu_EditUserTraining)}\r\n referenceName={(training.Id ?? 0).toString()}\r\n linkUrl={buildURL(\r\n `${publicUrl}usertraining/details/${training.Id ?? 0}`,\r\n {},\r\n )}\r\n emailType={'Alert'}\r\n />\r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as Yup from 'yup';\r\nimport { Formik } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport { translations } from 'locales/translations';\r\nimport { FormUsersPicker } from 'app/components/Forms/FormUsersPicker';\r\nimport { FormCheckbox } from 'app/components/Forms/FormCheckbox';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { selectAppSettings, selectglobalSettings } from 'app/slice/selectors';\r\nimport { FormListener } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { UserTrainingApi as api } from 'api/UserTrainingApi';\r\nimport { FormTrainingReservationsPicker } from 'app/components/Forms/FormTrainingReservationsPicker';\r\nimport { FormTrainingLevelPicker } from 'app/components/Forms/FormTrainingLevelPicker';\r\nimport { ITrainingLevelFilterDto } from 'api/odata/generated/entities/ITrainingLevelFilterDto';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { TrainingDetailsState } from '../slice/types';\r\nimport {\r\n FormRightSection,\r\n FormLeftSection,\r\n StyledForm,\r\n FormFieldsSection,\r\n FormRow,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { UserTrainingComments } from './UserTrainingComments';\r\nimport { FormAdminSingleUsersPicker } from 'app/components/Forms/FormAdminUserPicker';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { FormOnlineServicesComboPicker } from 'app/components/Forms/FormEquipmentsPicker';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { RestrictedByAdminFilter } from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { TrainingLevelFilter } from 'app/components/pickers/AutocompletePickers/TrainingLevelPicker';\r\nimport { FormNumberField } from 'app/components/Forms/FormNumberField';\r\nimport { AdminServicesFilter } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { FormBookitDatePicker } from 'app/components/Forms/FormBookitDatePicker';\r\n\r\nexport interface UserTrainingFormProps {\r\n onSubmit: (item: TrainingDetailsState) => void;\r\n onCancel?: () => void;\r\n initialValues: TrainingDetailsState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isEdit: boolean;\r\n onEquipmentClicked?: (equipment: Entity) => void;\r\n commentsFormRef: React.MutableRefObject;\r\n isAdmin?: boolean;\r\n}\r\n\r\nexport const UserTrainingForm = React.memo(function UserTrainingForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n onCancel,\r\n bindSubmitForm,\r\n isEdit,\r\n onEquipmentClicked,\r\n commentsFormRef,\r\n isAdmin,\r\n}: UserTrainingFormProps) {\r\n const { t } = useTranslation();\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const trainingLevelPermissionsEnabled = React.useMemo(() => {\r\n return IsModuleEnabled(appSettings, KnownModules.TrainingLevelPermissions);\r\n }, [appSettings]);\r\n const userPermissionsEnabled = React.useMemo(() => {\r\n return (\r\n IsModuleEnabled(appSettings, KnownModules.UserPermission) ||\r\n IsModuleEnabled(appSettings, KnownModules.GroupPermissions)\r\n );\r\n }, [appSettings]);\r\n const usersShema: Yup.SchemaOf> = Yup.object({\r\n Id: Yup.string().ensure(),\r\n Name: Yup.string().ensure(),\r\n });\r\n const equipmentShema: Yup.SchemaOf> = Yup.object({\r\n Id: Yup.number().defined(),\r\n Name: Yup.string().ensure(),\r\n });\r\n const schema: Yup.SchemaOf = Yup.object({\r\n Id: Yup.number().notRequired().nullable(),\r\n Users: Yup.array()\r\n .of(usersShema)\r\n .required(t(translations.err_UserNameRequired))\r\n .label(t(translations.User))\r\n .min(1),\r\n Equipments: Yup.array()\r\n .of(equipmentShema)\r\n .min(1)\r\n .required(t(translations.err_OnlineServiceFieldRequired))\r\n .label(t(translations.ServiceType_Online)),\r\n UnhideServiceGroup: Yup.boolean(),\r\n TrainingDate: Yup.date()\r\n .required(t(translations.err_TrainingDateFieldRequired))\r\n .label(t(translations.TrainingDate)),\r\n ExpiredDate: Yup.date().nullable(true),\r\n Trainer: Yup.mixed()\r\n .required(t(translations.err_TrainerIsRequired))\r\n .label(t(translations.Trainer)),\r\n MustOrderEveryDays: Yup.number()\r\n .integer()\r\n .nullable()\r\n .notRequired()\r\n .label(t(translations.MustOrderEveryDays))\r\n .min(0)\r\n .max(365),\r\n MustUseEveryDays: Yup.number()\r\n .integer()\r\n .nullable()\r\n .notRequired()\r\n .label(t(translations.MustUseEveryDays))\r\n .min(0)\r\n .max(365),\r\n RequiresAdminApproval: Yup.boolean(),\r\n AllowBookingFromTrainingDate: Yup.boolean().default(true),\r\n Reservations: Yup.mixed(),\r\n TrainingLevel: Yup.mixed(),\r\n Remarks: Yup.string().nullable(),\r\n Active: Yup.boolean(),\r\n FatherId: Yup.number().notRequired().nullable(),\r\n ServiceGroupId: Yup.number().notRequired().nullable(),\r\n TrainingProgram: Yup.mixed(),\r\n });\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value);\r\n }\r\n };\r\n const activeDisabled =\r\n isEdit &&\r\n settings.GetBooleanByKey(\r\n AllowedSettings.TrainingActivationAllowedBySGAOnly,\r\n );\r\n const [resDisbaled, setResDisbaled] = React.useState(false);\r\n const [allowBookingDisbaled, setAllowBookingDisbaled] = React.useState<\r\n boolean | undefined\r\n >(false);\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [allowBookingVisible, setAllowBookingVisible] = React.useState<\r\n boolean | undefined\r\n >(true);\r\n const [equipmentChanged, setEquipmentChanged] = React.useState(\r\n false,\r\n );\r\n const [userChanged, setUserChanged] = React.useState(false);\r\n const [trDateChanged, setTrDateChanged] = React.useState(false);\r\n const [trLevelChanged, setTrLevelChanged] = React.useState(false);\r\n const handleEquipmentChange = value => {\r\n setEquipmentChanged(true);\r\n };\r\n const handleUserChange = value => {\r\n setUserChanged(true);\r\n };\r\n const handleTrDateChange = value => {\r\n setTrDateChanged(true);\r\n };\r\n const handleTrLevelChange = value => {\r\n setTrLevelChanged(true);\r\n };\r\n const { newDate } = useSystemDate();\r\n const handleFormChange = React.useCallback(\r\n (values, isValid, dirty, setValue) => {\r\n setResDisbaled(\r\n values.Equipments.length !== 1 ||\r\n values.Users.length !== 1 ||\r\n !values.TrainingDate,\r\n );\r\n if (equipmentChanged || userChanged || trDateChanged) {\r\n setValue('Reservations', undefined, false);\r\n if (values.Equipments.length > 0 && values.Users.length > 0) {\r\n const params: {\r\n services: string;\r\n users: string;\r\n } = {\r\n services: values.Equipments.map(item => item.Id).join(','),\r\n users: values.Users.map(item => item.Id).join(','),\r\n };\r\n api.hasUntrainedNotAllowed(params).then(data => {\r\n let value = data.value;\r\n if (value === 0) {\r\n setAllowBookingVisible(false);\r\n setValue('AllowBookingFromTrainingDate', true, false);\r\n } else {\r\n if (isEdit) {\r\n setAllowBookingDisbaled(true);\r\n } else {\r\n if (value === 1) {\r\n setAllowBookingDisbaled(false);\r\n } else {\r\n setAllowBookingDisbaled(true);\r\n setValue('AllowBookingFromTrainingDate', true, false);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (equipmentChanged) {\r\n setValue('TrainingLevel', null);\r\n setValue('Trainer', null);\r\n }\r\n setUserChanged(false);\r\n setEquipmentChanged(false);\r\n setTrDateChanged(false);\r\n }\r\n if (trLevelChanged) {\r\n let level = values.TrainingLevel as ITrainingLevelFilterDto;\r\n if (level) {\r\n if (level.MustOrderEveryDays !== undefined) {\r\n if (\r\n values.MustOrderEveryDays === undefined ||\r\n values.MustOrderEveryDays === null\r\n ) {\r\n setValue('MustOrderEveryDays', level.MustOrderEveryDays, false);\r\n }\r\n }\r\n if (level.MustUseEveryDays !== undefined) {\r\n if (\r\n values.MustUseEveryDays === undefined ||\r\n values.MustUseEveryDays === null\r\n ) {\r\n setValue('MustUseEveryDays', level.MustUseEveryDays, false);\r\n }\r\n }\r\n if (\r\n level.ExpiredDays !== undefined &&\r\n level.ExpiredDays != null &&\r\n level.ExpiredDays > 0\r\n ) {\r\n let date = newDate();\r\n let trainingDate = dateUtils.parseISO(values.TrainingDate);\r\n date.setDate(trainingDate.getDate() + level.ExpiredDays);\r\n setValue('ExpiredDate', date, false);\r\n }\r\n }\r\n setTrLevelChanged(false);\r\n }\r\n },\r\n [\r\n equipmentChanged,\r\n isEdit,\r\n newDate,\r\n trDateChanged,\r\n trLevelChanged,\r\n userChanged,\r\n ],\r\n );\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\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 \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 {IsModuleEnabled(\r\n appSettings,\r\n KnownModules.TrainingExpiration,\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 {IsModuleEnabled(\r\n appSettings,\r\n KnownModules.HideInstrumentsFromUntrainedUsers,\r\n ) && (\r\n \r\n \r\n \r\n )}\r\n {/* //!allowBookingVisible */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isEdit && (\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","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n selectContinueToLink,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n selectPublicUrl,\r\n} from 'app/slice/selectors';\r\n\r\nimport { push } from 'connected-react-router';\r\n//import { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport { omit } from 'lodash';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { useTrainingSlice } from './slice';\r\nimport {\r\n selectCreateTraining,\r\n selectCreateTrainingCompleted,\r\n selectCreateTrainingHasError,\r\n selectInitTrainingProcessing,\r\n selectReservatiionsData,\r\n selectReservatiionsProcessing,\r\n selectReservatiionsUpdateCompleted,\r\n selectShowApproveReservatiions,\r\n selectShowRejectReservatiions,\r\n selectUpdateTraining,\r\n selectUpdateTrainingCompleted,\r\n selectUpdateTrainingHasError,\r\n} from './slice/selectors';\r\nimport { TrainingDetailsState } from './slice/types';\r\nimport { UserTrainingForm } from './UserTrainingForm';\r\nimport { SaveFormButton, ActivateButton } from './Actions/TrainingActions';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { AssetPopUp } from 'app/pages/AssetPopUp';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { IServiceFilterDto } from 'api/odata/generated/entities/IServiceFilterDto';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\n\r\nexport interface TrainingDetailsProps\r\n extends CoverProps,\r\n SidePanelContentProps {\r\n id?: string;\r\n equId?: string;\r\n equIds?: string;\r\n fatherId?: string;\r\n rid?: string;\r\n date?: string;\r\n user?: string;\r\n onClose?: () => void;\r\n}\r\n\r\nexport function TrainingDetails(props: TrainingDetailsProps) {\r\n const {\r\n id,\r\n equId,\r\n equIds,\r\n fatherId,\r\n rid,\r\n date,\r\n user,\r\n useSidePanel,\r\n onClose,\r\n } = props;\r\n const { t } = useTranslation();\r\n const loading = useSelector(selectInitTrainingProcessing);\r\n const dispatch = useDispatch();\r\n const { actions } = useTrainingSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n\r\n const [busy, setBusy] = React.useState(false);\r\n const [edit, setEdit] = React.useState(false);\r\n const [showApprove, setShowApprove] = React.useState(false);\r\n const [showReject, setShowReject] = React.useState(false);\r\n const requestCreateCompleted = useSelector(selectCreateTrainingCompleted);\r\n const requestUpdateCompleted = useSelector(selectUpdateTrainingCompleted);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const continueLink = useSelector(selectContinueToLink);\r\n const approveReservations = useSelector(selectShowApproveReservatiions);\r\n const rejectReservations = useSelector(selectShowRejectReservatiions);\r\n const reservationProcessing = useSelector(selectReservatiionsProcessing);\r\n const relatedReservations = useSelector(selectReservatiionsData);\r\n const updateResCompleted = useSelector(selectReservatiionsUpdateCompleted);\r\n const hasCreateError = useSelector(selectCreateTrainingHasError);\r\n const hasUpdateError = useSelector(selectUpdateTrainingHasError);\r\n const hasError = hasCreateError || hasUpdateError;\r\n const createTraining = useSelector(selectCreateTraining, shallowEqual);\r\n const editTraining = useSelector(selectUpdateTraining, shallowEqual);\r\n const training = createTraining || editTraining;\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const hasChanges = useSelector(selectHasNotSavedChanges, shallowEqual);\r\n const continueToOther = useSelector(selectContinueState);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const settings = useSelector(selectglobalSettings);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const currenTrainingServiceGroupId = training?.ServiceGroupId ?? undefined;\r\n const activateAllowed = React.useMemo(() => {\r\n return User?.HasAdminGroupPermissions(currenTrainingServiceGroupId);\r\n }, [User, currenTrainingServiceGroupId]);\r\n const IsAdmin = React.useMemo(() => {\r\n return User?.IsAllGroupOrLabTechAdmin(\r\n (training?.Equipments || []).map(\r\n g => (g as IServiceFilterDto).ServiceGroupId,\r\n (training?.Equipments || []).map(f => {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n ServiceTypeId: ServiceType.Online,\r\n } as IServiceTypeFilterDto;\r\n }),\r\n ),\r\n );\r\n }, [User, training?.Equipments]);\r\n\r\n useEffectOnMount(() => {\r\n if (id !== undefined && !isNaN(parseInt(id))) {\r\n dispatch(actions.initUpdateTraining({ Id: parseInt(id) }));\r\n } else {\r\n dispatch(\r\n actions.initCreateTraining({\r\n equId,\r\n equIds,\r\n fatherId,\r\n rid,\r\n date,\r\n user,\r\n }),\r\n );\r\n }\r\n setBusy(false);\r\n setEdit(false);\r\n setShowApprove(false);\r\n setShowReject(false);\r\n setRequestCompleted(undefined);\r\n return () => {};\r\n });\r\n const handleCancelClick = React.useCallback(() => {\r\n if (!!onClose) {\r\n onClose();\r\n } else {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/usertraining'));\r\n }\r\n }\r\n if (edit) {\r\n dispatch(actions.resetUpdateTrainingState());\r\n } else {\r\n dispatch(actions.resetCreateTrainingState());\r\n }\r\n dispatch(actions.resetReservationsState());\r\n }, [actions, dispatch, edit, layoutActions, onClose, useSidePanel]);\r\n React.useEffect(() => {\r\n let active = loading === false;\r\n if (active) {\r\n if (id !== undefined && !isNaN(parseInt(id))) {\r\n setEdit(true);\r\n }\r\n if (requestCreateCompleted === true || requestUpdateCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n if (approveReservations || rejectReservations) {\r\n setShowApprove(approveReservations);\r\n setShowReject(rejectReservations);\r\n } else {\r\n handleCancelClick();\r\n }\r\n }\r\n } else if (\r\n requestCreateCompleted === false ||\r\n requestUpdateCompleted === false\r\n ) {\r\n setRequestCompleted(false);\r\n setBusy(false);\r\n }\r\n if (updateResCompleted) {\r\n handleCancelClick();\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n approveReservations,\r\n handleCancelClick,\r\n hasError,\r\n id,\r\n loading,\r\n rejectReservations,\r\n requestCompleted,\r\n requestCreateCompleted,\r\n requestUpdateCompleted,\r\n updateResCompleted,\r\n ]);\r\n React.useEffect(() => {\r\n if (confirmApproved) {\r\n if (edit) {\r\n dispatch(actions.resetUpdateTrainingState());\r\n } else {\r\n dispatch(actions.resetCreateTrainingState());\r\n }\r\n dispatch(actions.resetReservationsState());\r\n if (continueToOther.continueOnApprove) {\r\n dispatch(layoutActions.resetSidePanel());\r\n setTimeout(() => {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: continueToOther.pageType,\r\n props: continueToOther.pageProps,\r\n expanded: continueToOther.expanded,\r\n }),\r\n );\r\n dispatch(layoutActions.resetContinueState());\r\n }, 200);\r\n } else if (continueLink !== undefined) {\r\n dispatch(appSettingsActions.navigate(continueLink));\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n //dispatch(actions.setChangedState(false));\r\n }\r\n if (confirmRejected) {\r\n dispatch(layoutActions.resetConfirmState());\r\n }\r\n\r\n return () => undefined;\r\n }, [\r\n actions,\r\n appSettingsActions,\r\n confirmApproved,\r\n confirmRejected,\r\n continueLink,\r\n continueToOther,\r\n dispatch,\r\n edit,\r\n layoutActions,\r\n ]);\r\n const handleSubmit = React.useCallback(\r\n (values: TrainingDetailsState) => {\r\n setBusy(true);\r\n if (edit) {\r\n dispatch(\r\n actions.updateTraining({ current: values, original: training }),\r\n );\r\n } else {\r\n dispatch(actions.createTraining(values));\r\n }\r\n },\r\n [actions, dispatch, edit, training],\r\n );\r\n\r\n const submitFormRef = React.useRef(null);\r\n const submitCommentRef = React.useRef(null);\r\n const handleSubmitForm = e => {\r\n if (submitCommentRef.current) {\r\n submitCommentRef.current(e);\r\n }\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const handleClose = () => {\r\n if (hasChanges) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n } else {\r\n handleCancelClick();\r\n }\r\n };\r\n\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n const handleActivateTraining = React.useCallback(() => {\r\n dispatch(\r\n actions.activateDeactivateTraining({\r\n Id: training?.Id ?? undefined,\r\n activate: !(training?.Active ?? undefined),\r\n }),\r\n );\r\n }, [actions, dispatch, training]);\r\n const handleReject = React.useCallback(() => {\r\n dispatch(\r\n actions.approveRejectReservations({\r\n trainings: relatedReservations,\r\n approve: false,\r\n }),\r\n );\r\n }, [actions, dispatch, relatedReservations]);\r\n const handleApprove = React.useCallback(() => {\r\n dispatch(\r\n actions.approveRejectReservations({\r\n trainings: relatedReservations,\r\n approve: true,\r\n }),\r\n );\r\n }, [actions, dispatch, relatedReservations]);\r\n const handleResCancel = React.useCallback(() => {\r\n dispatch(actions.resetReservationsState());\r\n }, [actions, dispatch]);\r\n const [cover, setCover] = React.useState();\r\n const closeCover = () => {\r\n setCover(undefined);\r\n };\r\n\r\n const leftActions = [\r\n () => (\r\n \r\n }\r\n onClick={handleSubmitForm}\r\n disabled={busy}\r\n processing={!requestCompleted && busy}\r\n edit={edit}\r\n text={t(translations.Save)}\r\n />\r\n \r\n ),\r\n ] as ActionRenderer[];\r\n if (\r\n edit &&\r\n settings.GetBooleanByKey(\r\n AllowedSettings.TrainingActivationAllowedBySGAOnly,\r\n ) &&\r\n activateAllowed\r\n ) {\r\n leftActions.push(() => (\r\n \r\n ));\r\n }\r\n if (edit && IsAdmin) {\r\n leftActions.push(() => (\r\n \r\n ));\r\n }\r\n const rightActions = [\r\n () => (\r\n \r\n }\r\n onClick={handleCancelClick}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n return (\r\n <>\r\n \r\n setCover(\r\n ,\r\n )\r\n }\r\n commentsFormRef={submitCommentRef}\r\n isAdmin={IsAdmin}\r\n />\r\n ) : (\r\n \r\n )\r\n }\r\n pageLink={buildURL(\r\n publicUrl + 'usertraining/details',\r\n omit(props, ['useSidePanel']),\r\n )}\r\n toPageLink={`usertraining/details?${toQueryString(\r\n omit(props, ['useSidePanel']),\r\n )}`}\r\n leftActions={leftActions}\r\n rightActions={rightActions}\r\n confirm={\r\n requestCompleted && rejectReservations ? (\r\n \r\n ) : approveReservations ? (\r\n \r\n ) : (\r\n <>\r\n )\r\n }\r\n isCover={props.isCover}\r\n cover={cover}\r\n //closeCover={closeCover}\r\n closeCover={props.closeCover || closeCover}\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n}\r\n","import { getSinglePriceSheetMethod } from 'app/components/pickers/StaticOptionsPickers/PriceSheetMethodPicker';\r\nimport { AsyncDataState, Entity } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { toEntity } from 'utils/entity-utils';\r\n\r\n/* --- STATE --- */\r\nexport interface PricePeriodState {\r\n detailsState: AsyncDataState;\r\n processing: boolean;\r\n}\r\n\r\nexport interface IPriceSheetPeriodDto {\r\n Id: number;\r\n ServiceGroupId: number | null;\r\n ServiceGroupName: string | null;\r\n StartDate: Date | string;\r\n EndDate: Date | string | null;\r\n Method: number | null;\r\n PriceSheetLink: string | null;\r\n}\r\n\r\nexport interface PricePeriodQueryParams {\r\n id?: string;\r\n groupId?: string;\r\n start?: string;\r\n end?: string;\r\n method?: string;\r\n}\r\nexport interface PricePeriodsDetailsState {\r\n Id: number;\r\n ServiceGroup: Entity | null;\r\n StartDate: Date | string;\r\n EndDate: Date | string | null;\r\n Method: Entity | null;\r\n}\r\nexport interface PricePeriodsResponse extends IResponseType {\r\n Id: number | null;\r\n data: IPriceSheetPeriodDto | null;\r\n IsValid: boolean;\r\n}\r\nexport const ConvertDtoToModel = (\r\n entity: IPriceSheetPeriodDto,\r\n): PricePeriodsDetailsState => {\r\n let model = {\r\n Id: entity.Id,\r\n ServiceGroup:\r\n entity.ServiceGroupId !== null\r\n ? toEntity(entity.ServiceGroupId, entity.ServiceGroupName)\r\n : null,\r\n StartDate: dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(entity.StartDate),\r\n ),\r\n EndDate:\r\n entity.EndDate === null\r\n ? null\r\n : dateUtils.formatQueryStringDate(dateUtils.parseISO(entity.EndDate)),\r\n Method:\r\n entity.Method !== null\r\n ? getSinglePriceSheetMethod(entity.Method ?? 0)\r\n : null,\r\n } as PricePeriodsDetailsState;\r\n return model;\r\n};\r\n\r\nexport const ConvertModelToInsertEntity = (model: PricePeriodsDetailsState) => {\r\n let data = {\r\n Id: model.Id,\r\n ServiceGroupId: model.ServiceGroup?.Id || null,\r\n ServiceGroupName: model.ServiceGroup?.Name,\r\n StartDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.StartDate),\r\n ),\r\n EndDate:\r\n model.EndDate === null\r\n ? null\r\n : dateUtils.formatISO(dateUtils.dateOrStringToDate(model.EndDate)),\r\n Method: model.Method?.Id,\r\n } as IPriceSheetPeriodDto;\r\n return data;\r\n};\r\nexport const ConvertModelToUpdateEntity = (\r\n model: PricePeriodsDetailsState,\r\n original: PricePeriodsDetailsState,\r\n) => {\r\n let data = {\r\n Id: original.Id,\r\n ServiceGroupId: model.ServiceGroup?.Id || null,\r\n ServiceGroupName: model.ServiceGroup?.Name,\r\n StartDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(model.StartDate),\r\n ),\r\n EndDate:\r\n model.EndDate === null\r\n ? null\r\n : dateUtils.formatISO(dateUtils.dateOrStringToDate(model.EndDate)),\r\n Method: model.Method?.Id,\r\n } as IPriceSheetPeriodDto;\r\n return data;\r\n};\r\nexport const getDefaultPricePeriod = () => {\r\n return {\r\n Id: 0,\r\n ServiceGroupId: null,\r\n ServiceGroupName: null,\r\n StartDate: dateUtils.formatISO(new Date()),\r\n EndDate: null,\r\n Method: null,\r\n } as IPriceSheetPeriodDto;\r\n};\r\n","import {\r\n IPriceSheetPeriodDto,\r\n PricePeriodQueryParams,\r\n PricePeriodsResponse,\r\n} from 'app/pages/PriceSheetPeriodDetails/Details/slice/types';\r\nimport { httpClient } from './HttpClient';\r\n\r\nexport const PriceSheetApi = {\r\n initPeriodDetails: (payload: PricePeriodQueryParams) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = `/api/odata/v4/PriceSheetPeriod/InitPeriods`;\r\n return httpClient.post(url, data);\r\n },\r\n insertPricePeriod: (period: IPriceSheetPeriodDto) => {\r\n const url = '/api/odata/v4/PriceSheetPeriod';\r\n return httpClient.post(url, period);\r\n },\r\n updatePricePeriod: (period: IPriceSheetPeriodDto, rowId: number) => {\r\n const url = '/api/odata/v4/PriceSheetPeriod';\r\n return httpClient.put(\r\n url + '(' + rowId + ')',\r\n period,\r\n );\r\n },\r\n deletePricePeriod: (Id: number) => {\r\n const url = `/api/odata/v4/PriceSheetPeriod/${Id}`;\r\n return httpClient.deleteCustom(url);\r\n },\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, takeLatest } from 'redux-saga/effects';\r\nimport { pricePeriodActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { translations } from 'locales/translations';\r\nimport i18next from 'i18next';\r\nimport {\r\n ConvertModelToInsertEntity,\r\n ConvertModelToUpdateEntity,\r\n getDefaultPricePeriod,\r\n IPriceSheetPeriodDto,\r\n PricePeriodQueryParams,\r\n PricePeriodsDetailsState,\r\n PricePeriodsResponse,\r\n} from './types';\r\nimport { PriceSheetApi as api } from 'api/PriceSheetApi';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { PricePeriodDetailsProps } from '..';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { AxiosError } from 'axios';\r\n\r\nfunction* doInitDetails(\r\n action: PayloadAction<{\r\n query: PricePeriodQueryParams;\r\n model?: IPriceSheetPeriodDto;\r\n }>,\r\n) {\r\n try {\r\n let data: IPriceSheetPeriodDto | null = action.payload.model || null;\r\n let hasError: boolean = false;\r\n if (data === null) {\r\n const result = yield call(api.initPeriodDetails, action.payload.query);\r\n let response = result as PricePeriodsResponse;\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: 'initPeriodsErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'initPeriodWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.SuccessMessages.map(item => {\r\n return {\r\n key: 'initPeriodSucc',\r\n message: item,\r\n variant: 'success',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n data = response.data ?? getDefaultPricePeriod();\r\n hasError = !response.IsValid;\r\n }\r\n yield put(\r\n actions.initDetails_Success({\r\n hasErrors: hasError,\r\n data: data,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n yield put(actions.initDetails_Error(error));\r\n }\r\n}\r\nfunction* doCreatePeriod(action: PayloadAction) {\r\n const httpPayloads: IPriceSheetPeriodDto = ConvertModelToInsertEntity(\r\n action.payload,\r\n );\r\n try {\r\n const result = yield call(api.insertPricePeriod, httpPayloads);\r\n let response = result as PricePeriodsResponse;\r\n let responseErrors = response.ErrorMessages;\r\n let responseWarnings = response.WarningMessages;\r\n let responseSuccess = response.SuccessMessages;\r\n if (responseErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseErrors.map(item => {\r\n return {\r\n key: 'periodInsertError',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (responseSuccess.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'periodInsertSuccess',\r\n message: responseSuccess[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: true,\r\n itemName: i18next.t(translations.menu_PriceSheetPeriod),\r\n detailsType: RenderPageType.PricePeriodsDetails,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n initialPeriod: response.data,\r\n } as PricePeriodDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (responseWarnings.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n responseWarnings.map(item => {\r\n return {\r\n key: 'periodInsertWarning',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = responseErrors.length > 0;\r\n yield put(\r\n actions.createPeriod_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'periodInsert',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createPeriod_Error(Error));\r\n }\r\n}\r\nfunction* doUpdatePeriod(\r\n action: PayloadAction<{\r\n current: PricePeriodsDetailsState;\r\n original: PricePeriodsDetailsState;\r\n }>,\r\n) {\r\n let updatedPeriod = ConvertModelToUpdateEntity(\r\n action.payload.current,\r\n action.payload.original,\r\n );\r\n\r\n try {\r\n const results = yield call(\r\n api.updatePricePeriod,\r\n updatedPeriod,\r\n action.payload.current.Id,\r\n );\r\n let response = results as PricePeriodsResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: 'periodUpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n } else {\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'periodUpdateSuccess',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id ?? undefined,\r\n created: false,\r\n itemName: i18next.t(translations.menu_PriceSheetPeriod),\r\n detailsType: RenderPageType.PricePeriodsDetails,\r\n detailsTypeProps: {\r\n useSidePanel: true,\r\n queryParams: {\r\n id: '' + response.Id ?? -1,\r\n },\r\n initialPeriod: response.data,\r\n } as PricePeriodDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'periodUpdateWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.updatePeriod_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'periodUpdateErr',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updatePeriod_Error(Error));\r\n }\r\n}\r\n\r\nexport function* pricePeriodSaga() {\r\n yield takeLatest(actions.initDetails.type, doInitDetails);\r\n yield takeLatest(actions.createPeriod.type, doCreatePeriod);\r\n yield takeLatest(actions.updatePeriod.type, doUpdatePeriod);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { pricePeriodSaga } from './saga';\r\nimport {\r\n ConvertDtoToModel,\r\n IPriceSheetPeriodDto,\r\n PricePeriodQueryParams,\r\n PricePeriodsDetailsState,\r\n PricePeriodState,\r\n} from './types';\r\n\r\nexport const initialState: PricePeriodState = {\r\n detailsState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n error: undefined,\r\n },\r\n processing: false,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'pricePeriod',\r\n initialState,\r\n reducers: {\r\n initDetails(\r\n state,\r\n action: PayloadAction<{\r\n query: PricePeriodQueryParams;\r\n model?: IPriceSheetPeriodDto;\r\n }>,\r\n ) {\r\n state.processing = true;\r\n state.detailsState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initDetails_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n data: IPriceSheetPeriodDto;\r\n }>,\r\n ) {\r\n state.processing = false;\r\n state.detailsState.data = ConvertDtoToModel(action.payload.data);\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n },\r\n initDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n resetDetailsState(state, action: PayloadAction) {\r\n state.detailsState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n state.processing = false;\r\n },\r\n createPeriod(state, action: PayloadAction) {\r\n state.detailsState.processing = true;\r\n state.detailsState.completed = undefined;\r\n state.detailsState.hasErrors = undefined;\r\n },\r\n createPeriod_Success(state, action: PayloadAction<{ hasErrors: boolean }>) {\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n state.detailsState.completed = true;\r\n },\r\n createPeriod_Error(state, action: PayloadAction) {\r\n state.detailsState.processing = false;\r\n state.detailsState.completed = true;\r\n state.detailsState.hasErrors = true;\r\n },\r\n updatePeriod(\r\n state,\r\n action: PayloadAction<{\r\n current: PricePeriodsDetailsState;\r\n original: PricePeriodsDetailsState;\r\n }>,\r\n ) {\r\n state.detailsState.processing = true;\r\n state.detailsState.completed = undefined;\r\n state.detailsState.hasErrors = undefined;\r\n },\r\n updatePeriod_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.detailsState.processing = false;\r\n state.detailsState.hasErrors = action.payload.hasErrors;\r\n state.detailsState.completed = true;\r\n },\r\n updatePeriod_Error(state, action: PayloadAction) {\r\n state.detailsState.processing = false;\r\n state.detailsState.completed = true;\r\n state.detailsState.hasErrors = true;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: pricePeriodActions } = slice;\r\n\r\nexport const usePricePeriodSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: pricePeriodSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = usePricePeriodSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.pricePeriod || initialState;\r\n\r\nexport const selectPricePeriod = createSelector([selectSlice], state => state);\r\n\r\nexport const selectProcessing = createSelector(\r\n [selectPricePeriod],\r\n state => state.processing,\r\n);\r\nexport const selectDetails = createSelector(\r\n [selectPricePeriod],\r\n state => state.detailsState,\r\n);\r\nexport const selectDetailsProcessing = createSelector(\r\n [selectDetails],\r\n state => state.processing,\r\n);\r\nexport const selectDetailsError = createSelector(\r\n [selectDetails],\r\n state => state.error,\r\n);\r\nexport const selectDetailsHasError = createSelector(\r\n [selectDetails],\r\n state => state.hasErrors,\r\n);\r\nexport const selectDetailsCompleted = createSelector(\r\n [selectDetails],\r\n state => state.completed,\r\n);\r\nexport const selectDetailsData = createSelector(\r\n [selectDetails],\r\n state => state.data,\r\n);\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport { Entity } from 'types/common';\r\nimport {\r\n PriceSheetMethodPicker,\r\n PriceSheetMethodPickerProps,\r\n} from '../pickers/StaticOptionsPickers/PriceSheetMethodPicker';\r\n\r\nexport const FormPriceSheetMethodPicker = ({\r\n onChange,\r\n ...props\r\n}: FieldHookConfig | null> &\r\n Omit) => {\r\n const [field, meta, helpers] = useField | null>(props);\r\n return (\r\n <>\r\n helpers.setValue(value, true)}\r\n onBlur={field?.onBlur}\r\n value={field.value}\r\n variant=\"filled\"\r\n error={meta?.error !== undefined && meta?.touched}\r\n helperText={meta.error}\r\n {...props}\r\n />\r\n \r\n );\r\n};\r\n","import { Formik, FormikProps } from 'formik';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { useSelector } from 'react-redux';\r\nimport { isEmpty } from 'lodash';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport {\r\n FormListener,\r\n SubmittingHandler,\r\n} from 'app/components/Forms/FormRender/FormRenderer';\r\nimport * as Yup from 'yup';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { PricePeriodsDetailsState } from '../slice/types';\r\nimport { selectDetailsHasError } from '../slice/selectors';\r\n\r\nimport i18next from 'i18next';\r\nimport { FormServiceGroupPicker } from 'app/components/Forms/FormServiceGroupPicker';\r\nimport { FormPriceSheetMethodPicker } from 'app/components/Forms/FormPriceSheetMethodPicker';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { FormBookitDatePicker } from 'app/components/Forms/FormBookitDatePicker';\r\nexport interface PricePeriodsFormProps {\r\n onSubmit: (item: PricePeriodsDetailsState) => void;\r\n initialValues: PricePeriodsDetailsState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isEdit: boolean;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n innerFormRef: React.RefObject>;\r\n globalPriceSheetEnabled: boolean;\r\n priceEnabled: boolean;\r\n}\r\n\r\nexport const PricePeriodsForm = React.memo(function PricePeriodsForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isEdit,\r\n isAdmin,\r\n user,\r\n globalPriceSheetEnabled,\r\n innerFormRef,\r\n priceEnabled,\r\n}: PricePeriodsFormProps) {\r\n const { t } = useTranslation();\r\n const hasError = useSelector(selectDetailsHasError);\r\n const readonly = !isAdmin && isEdit;\r\n const [submitting, setSubmitting] = React.useState(\r\n undefined,\r\n );\r\n const resetSubmitting = () => {\r\n setSubmitting(true);\r\n };\r\n const handleSubmit = (values: PricePeriodsDetailsState) => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(values);\r\n }\r\n };\r\n const { newDate } = useSystemDate();\r\n /// Local State ///\r\n const [serviceGroupChanged, setServiceGroupChanged] = React.useState(false);\r\n const [startChanged, setStartChanged] = React.useState(false);\r\n const [endChanged, setEndChanged] = React.useState(false);\r\n\r\n const handleFormChange = React.useCallback(\r\n (values: PricePeriodsDetailsState) => {\r\n if (serviceGroupChanged) {\r\n setServiceGroupChanged(false);\r\n }\r\n if (endChanged) {\r\n setEndChanged(false);\r\n }\r\n if (startChanged) {\r\n setStartChanged(false);\r\n }\r\n },\r\n [serviceGroupChanged, endChanged, startChanged],\r\n );\r\n\r\n /// useEffects\r\n React.useEffect(() => {\r\n if (innerFormRef.current) {\r\n innerFormRef.current.validateForm();\r\n }\r\n }, [innerFormRef]);\r\n\r\n const computedSchema = React.useMemo(() => {\r\n const pricPeriodsSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().notRequired().default(-1),\r\n StartDate: Yup.date()\r\n .default(newDate())\r\n .label(i18next.t(translations.StartDate) as string)\r\n .required(i18next.t(translations._errStartTimeRequired) as string),\r\n EndDate: Yup.date()\r\n .nullable()\r\n .default(null)\r\n .label(i18next.t(translations.EndDate) as string)\r\n .notRequired()\r\n .min(\r\n Yup.ref('StartDate'),\r\n i18next.t(translations.err_EndTimeLowerThanStartTime) as string,\r\n ),\r\n ServiceGroup: Yup.mixed().nullable(),\r\n Method: Yup.mixed()\r\n .label(t(translations.PriceSheetMethod) as string)\r\n .nullable(),\r\n },\r\n );\r\n if (!globalPriceSheetEnabled) {\r\n pricPeriodsSchema.fields.ServiceGroup.withMutation(schema =>\r\n schema.required(t(translations.err_ServiceGroupRequired) as string),\r\n );\r\n }\r\n if (!priceEnabled) {\r\n pricPeriodsSchema.fields.Method.withMutation(schema =>\r\n schema.required(\r\n t(translations.err_PriceSheetMethod_isrequired) as string,\r\n ),\r\n );\r\n }\r\n return pricPeriodsSchema;\r\n }, [globalPriceSheetEnabled, newDate, priceEnabled, t]);\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n formikHelpers.validateForm(values).then(responseErrors => {\r\n if (!isEmpty(responseErrors)) {\r\n formikHelpers.setSubmitting(false);\r\n console.debug('errors', responseErrors);\r\n } else {\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }\r\n });\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!globalPriceSheetEnabled && (\r\n \r\n {\r\n setServiceGroupChanged(true);\r\n }}\r\n />\r\n \r\n )}\r\n\r\n \r\n setStartChanged(true)}\r\n disabled={formik.isSubmitting || readonly}\r\n />\r\n \r\n \r\n setEndChanged(true)}\r\n disabled={formik.isSubmitting || readonly}\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","import { Box } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n selectContinueToLink,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n selectPublicUrl,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { push } from 'connected-react-router';\r\nimport { FormikProps } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { buildURL, toQueryString, toRootedURL } from 'utils/url-utils';\r\nimport { PricePeriodsForm } from './PricePeriodsForm';\r\nimport { usePricePeriodSlice } from './slice';\r\nimport {\r\n selectDetails,\r\n selectDetailsCompleted,\r\n selectDetailsHasError,\r\n selectProcessing,\r\n} from './slice/selectors';\r\nimport {\r\n IPriceSheetPeriodDto,\r\n PricePeriodQueryParams,\r\n PricePeriodsDetailsState,\r\n} from './slice/types';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\n\r\nexport interface PricePeriodDetailsProps\r\n extends CoverProps,\r\n SidePanelContentProps {\r\n queryParams: PricePeriodQueryParams;\r\n initialPeriod?: IPriceSheetPeriodDto;\r\n onClose?: () => void;\r\n}\r\n\r\nexport const PricePeriodDetails = React.memo(function PricePeriodDetails(\r\n props: PricePeriodDetailsProps,\r\n) {\r\n const { useSidePanel, queryParams, initialPeriod, onClose } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = usePricePeriodSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n\r\n /// Selectors ///\r\n const processing = useSelector(selectProcessing);\r\n const pricePeriod = useSelector(selectDetails);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const continueLink = useSelector(selectContinueToLink);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const continueToOther = useSelector(selectContinueState);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const actionCompleted = useSelector(selectDetailsCompleted);\r\n const settings = useSelector(selectglobalSettings);\r\n const hasError = useSelector(selectDetailsHasError);\r\n /// Refs ///\r\n const submitFormRef = React.useRef(null);\r\n const innerFormRef = React.useRef>(\r\n null,\r\n );\r\n //cover\r\n const [cover, setCover] = React.useState();\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n const [busy, setBusy] = React.useState(false);\r\n const [edit, setEdit] = React.useState(false);\r\n\r\n const globalPriceSheetEnabled = settings?.GetBooleanByKey(\r\n AllowedSettings.GlobalPriceSheetPeriods,\r\n );\r\n const priceSheetByEnabled = React.useMemo(() => {\r\n const priceSheetBy =\r\n settings !== null && settings !== undefined\r\n ? settings?.GetString(AllowedSettings.PriceSheetBy)\r\n : '';\r\n\r\n return priceSheetBy !== '' && priceSheetBy !== '3';\r\n }, [settings]);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const fullAdmin = React.useMemo(() => {\r\n return User !== undefined && User.Roles.includes(Roles.Administrators);\r\n }, [User]);\r\n const IsAdmin = React.useMemo(() => {\r\n return (\r\n fullAdmin ||\r\n (!globalPriceSheetEnabled &&\r\n User?.HasAdminGroupPermissions(pricePeriod?.data?.ServiceGroup?.Id))\r\n );\r\n }, [\r\n fullAdmin,\r\n globalPriceSheetEnabled,\r\n User,\r\n pricePeriod?.data?.ServiceGroup?.Id,\r\n ]);\r\n\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n if (active) {\r\n setFirstLoad(false);\r\n dispatch(\r\n actions.initDetails({\r\n query: queryParams,\r\n model: initialPeriod,\r\n }),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [actions, dispatch, firstLoad, initialPeriod, queryParams]);\r\n /// functions, callbacks ///\r\n const closeCover = () => {\r\n setCover(undefined);\r\n };\r\n const handleClose = () => {\r\n if (hasChanges) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n } else {\r\n handleCloselClick();\r\n }\r\n };\r\n const handleCloselClick = React.useCallback(() => {\r\n if (!!onClose) {\r\n onClose();\r\n } else {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/PricePeriods'));\r\n }\r\n }\r\n dispatch(actions.resetDetailsState());\r\n }, [actions, dispatch, layoutActions, onClose, useSidePanel]);\r\n const handleSaveClick = React.useCallback((e: any) => {\r\n handleSubmitForm(e);\r\n }, []);\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: PricePeriodsDetailsState) => {\r\n setBusy(true);\r\n if (edit) {\r\n dispatch(\r\n actions.updatePeriod({\r\n current: values,\r\n original: pricePeriod.data || values,\r\n }),\r\n );\r\n } else {\r\n dispatch(actions.createPeriod(values));\r\n }\r\n },\r\n [actions, dispatch, edit, pricePeriod.data],\r\n );\r\n /// Use Effects ///\r\n React.useEffect(() => {\r\n let active = processing === false;\r\n if (active) {\r\n if (queryParams.id !== undefined && !isNaN(parseInt(queryParams.id))) {\r\n setEdit(true);\r\n } else {\r\n setEdit(false);\r\n }\r\n if (actionCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n handleCloselClick();\r\n }\r\n } else if (actionCompleted === false) {\r\n setRequestCompleted(undefined);\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actionCompleted,\r\n handleCloselClick,\r\n hasError,\r\n processing,\r\n queryParams.id,\r\n ]);\r\n React.useEffect(() => {\r\n if (confirmApproved) {\r\n dispatch(actions.resetDetailsState());\r\n if (continueToOther.continueOnApprove) {\r\n dispatch(layoutActions.resetSidePanel());\r\n setTimeout(() => {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: continueToOther.pageType,\r\n props: continueToOther.pageProps,\r\n expanded: continueToOther.expanded,\r\n }),\r\n );\r\n dispatch(layoutActions.resetContinueState());\r\n }, 200);\r\n } else if (continueLink !== undefined) {\r\n dispatch(appSettingsActions.navigate(continueLink));\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n //dispatch(actions.setChangedState(false));\r\n }\r\n if (confirmRejected) {\r\n dispatch(layoutActions.resetConfirmState());\r\n }\r\n\r\n return () => undefined;\r\n }, [\r\n actions,\r\n appSettingsActions,\r\n confirmApproved,\r\n confirmRejected,\r\n continueLink,\r\n continueToOther,\r\n dispatch,\r\n edit,\r\n layoutActions,\r\n ]);\r\n\r\n const leftActions = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n actions.push(() => (\r\n }\r\n onClick={handleSaveClick}\r\n disabled={busy}\r\n processing={!requestCompleted && busy}\r\n >\r\n {t(translations.Save)}\r\n \r\n ));\r\n return actions;\r\n }, [busy, handleSaveClick, requestCompleted, t]);\r\n const rightActions = React.useMemo(() => {\r\n return [\r\n () => (\r\n \r\n }\r\n onClick={handleCloselClick}\r\n >\r\n {t(translations.Close)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [handleCloselClick, t]);\r\n const topButtons: ActionRenderer[] = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n let data =\r\n pricePeriod.data ||\r\n innerFormRef.current?.values ||\r\n ({} as PricePeriodsDetailsState);\r\n if (edit && IsAdmin && data !== undefined) {\r\n actions.push(() => (\r\n \r\n window.open(\r\n toRootedURL(\r\n `/Admin/PriceSheet.aspx?${toQueryString({\r\n periodId: queryParams.id,\r\n start: dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(data.StartDate),\r\n ),\r\n end:\r\n data.EndDate === null\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(\r\n dateUtils.dateOrStringToDate(data.EndDate),\r\n ),\r\n groupId: globalPriceSheetEnabled\r\n ? undefined\r\n : data.ServiceGroup?.Id ?? undefined,\r\n gName: globalPriceSheetEnabled\r\n ? undefined\r\n : data.ServiceGroup?.Name ?? undefined,\r\n priceBy: data.Method?.Id ?? undefined,\r\n }).toString()}`,\r\n ),\r\n '_blank',\r\n )\r\n }\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n />\r\n ));\r\n }\r\n return actions;\r\n }, [\r\n IsAdmin,\r\n edit,\r\n globalPriceSheetEnabled,\r\n pricePeriod.data,\r\n queryParams.id,\r\n t,\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 pageLink={buildURL(publicUrl + 'pricePeriods/details', queryParams)}\r\n toPageLink={`pricePeriods/details?${toQueryString(queryParams)}`}\r\n rightActions={rightActions}\r\n isCover={props.isCover}\r\n cover={cover}\r\n closeCover={props.closeCover || closeCover}\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n});\r\n","/**\r\n *\r\n * CalendarMessagesActions\r\n *\r\n */\r\n\r\nimport { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\n\r\nexport interface SaveFormButtonProps extends ButtonProps {\r\n edit: boolean;\r\n text: string;\r\n onClick: (e: any) => void;\r\n}\r\n\r\nexport function SaveFormButton({\r\n edit,\r\n text,\r\n onClick,\r\n ...props\r\n}: SaveFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { ICalendarMessagesDto } from 'app/pages/CalendarMessages/CalendarMessagesPage/ICalendarMessagesDto';\r\nimport { AsyncDataState, Entity } from 'types/common';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { toEntity } from 'utils/entity-utils';\r\n\r\n/* --- STATE --- */\r\nexport interface CalendarMessagesState {\r\n createState: AsyncDataState;\r\n updateState: AsyncDataState;\r\n processing: boolean;\r\n}\r\n\r\nexport interface CalendarMessagesDetailsState {\r\n Id: number;\r\n ServiceGroup: Entity | null;\r\n Equipment: Entity | null;\r\n Title: string;\r\n StartDate?: Date | null;\r\n EndDate?: Date | null;\r\n PlantDate?: Date | null;\r\n Body?: string | null;\r\n Description: string | null;\r\n DisplaySeconds: number | null;\r\n ShowOn?: string | null;\r\n}\r\n\r\nexport interface CalendarMessagesDetailsQStringParameters {\r\n id?: string;\r\n servGrId?: string;\r\n servGr?: string;\r\n eqId?: string;\r\n eq?: string;\r\n title?: string;\r\n sDate?: string;\r\n eDate?: string;\r\n plantDate?: string;\r\n body?: string;\r\n desc?: string;\r\n dispSec?: string;\r\n}\r\n\r\nexport interface CalendarMessagesDetailsResponse extends IResponseType {\r\n Id?: number;\r\n}\r\n\r\nexport function ConvertModelToEntityCalendarMessagesDetails(\r\n entity: ICalendarMessagesDto,\r\n): CalendarMessagesDetailsState | undefined {\r\n if (!entity) {\r\n return undefined;\r\n } else {\r\n return {\r\n Id: entity.Id,\r\n ServiceGroup:\r\n entity.ServiceGroupId !== null\r\n ? toEntity(entity.ServiceGroupId, entity.ServiceGroup)\r\n : null,\r\n Equipment:\r\n entity.EquipmentId !== null\r\n ? toEntity(entity.EquipmentId, entity.Equipment)\r\n : null,\r\n Title: entity.Title,\r\n /* StartDate: entity.StartDate ?? new Date(),\r\n EndDate:\r\n entity.EndDate ??\r\n new Date(new Date().setHours(new Date().getHours() + 1)), */\r\n StartDate:\r\n entity.StartDate === null\r\n ? null\r\n : dateUtils.formatISO(\r\n dateUtils.parseISO(entity.StartDate ?? new Date()),\r\n {\r\n representation: 'complete',\r\n },\r\n ),\r\n EndDate:\r\n entity.EndDate === null\r\n ? null\r\n : dateUtils.formatISO(\r\n dateUtils.parseISO(\r\n entity.EndDate ??\r\n new Date(new Date().setHours(new Date().getHours() + 1)),\r\n ),\r\n {\r\n representation: 'complete',\r\n },\r\n ),\r\n PlantDate: entity.PlantDate,\r\n Body: entity.Body,\r\n Description: entity.Description,\r\n DisplaySeconds: entity.DisplaySeconds ?? 60,\r\n ShowOn: entity.ShowOn,\r\n } as CalendarMessagesDetailsState;\r\n }\r\n}\r\n\r\nexport function ConvertEntityToModelCalendarMessagesDetails(\r\n model: CalendarMessagesDetailsState,\r\n original: CalendarMessagesDetailsState | undefined,\r\n): ICalendarMessagesDto {\r\n let entity = {\r\n Id: original?.Id === undefined ? model.Id : original.Id,\r\n ServiceGroupId: model.ServiceGroup?.Id,\r\n ServiceGroup: model.ServiceGroup?.Name,\r\n EquipmentId: model.Equipment?.Id,\r\n Equipment: model.Equipment?.Name,\r\n Title: model.Title,\r\n StartDate:\r\n model.StartDate === null || model.StartDate === undefined\r\n ? null\r\n : dateUtils.formatISO(dateUtils.dateOrStringToDate(model.StartDate)),\r\n //model.StartDate,\r\n EndDate:\r\n model.EndDate === null || model.EndDate === undefined\r\n ? null\r\n : dateUtils.formatISO(dateUtils.dateOrStringToDate(model.EndDate)),\r\n //model.EndDate,\r\n PlantDate:\r\n model.PlantDate === null || model.PlantDate === undefined\r\n ? null\r\n : dateUtils.formatISO(dateUtils.dateOrStringToDate(model.PlantDate)),\r\n //model.PlantDate,\r\n Body: model.Body,\r\n Description: model.Description,\r\n DisplaySeconds: model.DisplaySeconds ?? 60,\r\n ShowOn: model.ShowOn,\r\n } as ICalendarMessagesDto;\r\n return entity;\r\n}\r\n","import { CalendarMessagesDetailsQStringParameters } from 'app/pages/CalendarMessages/CalendarMessagesDetails/Details/slice/types';\r\nimport { ICalendarMessagesDto } from 'app/pages/CalendarMessages/CalendarMessagesPage/ICalendarMessagesDto';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { httpClient } from './HttpClient';\r\n\r\nexport const CalendarMessagesApi = {\r\n initCreateData: (payload: CalendarMessagesDetailsQStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n const url = '/api/odata/v4/CalendarMessages/InitCalendarMessages';\r\n return httpClient.post(url, data);\r\n },\r\n initUpdateData: (payload: CalendarMessagesDetailsQStringParameters) => {\r\n const data = {\r\n params: payload,\r\n };\r\n console.log(data);\r\n const url = '/api/odata/v4/CalendarMessages/InitCalendarMessages';\r\n return httpClient.post(url, data);\r\n },\r\n insertCalendarMessagesDetails: (payload: ICalendarMessagesDto) => {\r\n const url = '/api/odata/v4/CalendarMessages'; //POST action in Controller\r\n return httpClient.post(url, payload);\r\n },\r\n updateCalendarMessagesDetails: (payload: ICalendarMessagesDto) => {\r\n const url = `/api/odata/v4/CalendarMessages(${payload.Id})`; //PUT action in Controller\r\n return httpClient.put(url, payload);\r\n },\r\n deleteCalendarMessagesDetails: (\r\n rows: ICalendarMessagesDto[],\r\n ): Promise => {\r\n const calendarMessagesIds: number[] = rows.map(item => item.Id);\r\n const data = { calendarMessagesIds };\r\n const url = '/api/odata/v4/CalendarMessages/DeleteCalendarMessages';\r\n return httpClient.post(url, data);\r\n },\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, takeLatest } from 'redux-saga/effects';\r\nimport {\r\n ConvertEntityToModelCalendarMessagesDetails,\r\n CalendarMessagesDetailsQStringParameters,\r\n CalendarMessagesDetailsResponse,\r\n CalendarMessagesDetailsState,\r\n} from './types';\r\nimport { calendarMessagesDetailsActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { AxiosError } from 'axios';\r\nimport { ICalendarMessagesDto } from 'app/pages/CalendarMessages/CalendarMessagesPage/ICalendarMessagesDto';\r\nimport { CalendarMessagesApi } from 'api/CalendarMessagesApi';\r\nimport { CalendarMessagesDetailsProps } from '..';\r\n\r\nfunction* doInitCreate(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n const data = yield call(CalendarMessagesApi.initCreateData, action.payload);\r\n yield put(actions.initCalendarMessagesDetails_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initCalendarMessagesDetails_Error(error));\r\n }\r\n}\r\n\r\nfunction* doInitUpdate(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n const data = yield call(CalendarMessagesApi.initUpdateData, action.payload);\r\n yield put(actions.initUpdateCalendarMessagesDetails_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.initUpdateCalendarMessagesDetails_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doCreate(action: PayloadAction) {\r\n const httpPayloads: ICalendarMessagesDto = ConvertEntityToModelCalendarMessagesDetails(\r\n action.payload,\r\n undefined,\r\n );\r\n try {\r\n const result = yield call(\r\n CalendarMessagesApi.insertCalendarMessagesDetails,\r\n httpPayloads,\r\n );\r\n let response: CalendarMessagesDetailsResponse = result as CalendarMessagesDetailsResponse;\r\n\r\n if (response.ErrorMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.ErrorMessages.map(item => {\r\n return {\r\n key: 'calendarMessagesInsert',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'calendarMessagesInsert',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n if (response.Id) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'calendarMessagesInsert',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: true,\r\n itemName: i18next.t(translations.menu_CalendarMessages),\r\n detailsType: RenderPageType.CalendarMessagesDetails,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + response.Id,\r\n } as CalendarMessagesDetailsQStringParameters,\r\n useSidePanel: true,\r\n } as CalendarMessagesDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n } else {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'calendarMessagesInsertSuccess',\r\n message: response.SuccessMessages[0],\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n }\r\n\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.createCalendarMessagesDetails_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'calendarMessagesInsert',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.createCalendarMessagesDetails_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doUpdate(\r\n action: PayloadAction<{\r\n current: CalendarMessagesDetailsState;\r\n original: CalendarMessagesDetailsState | undefined;\r\n }>,\r\n) {\r\n const httpPayloads: ICalendarMessagesDto = ConvertEntityToModelCalendarMessagesDetails(\r\n action.payload.current,\r\n action.payload.original,\r\n );\r\n try {\r\n const results = yield call(\r\n CalendarMessagesApi.updateCalendarMessagesDetails,\r\n httpPayloads,\r\n );\r\n let response = results as CalendarMessagesDetailsResponse;\r\n let respErrors = response.ErrorMessages;\r\n if (respErrors.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n respErrors.map(item => {\r\n return {\r\n key: 'calendarMessagesUpdateErr',\r\n message: item,\r\n variant: 'error',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.WarningMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotifications(\r\n response.WarningMessages.map(item => {\r\n return {\r\n key: 'calendarMessagesUpdateWarn',\r\n message: item,\r\n variant: 'warning',\r\n };\r\n }),\r\n ),\r\n );\r\n }\r\n if (response.SuccessMessages.length > 0) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'calendarMessagesUpdate',\r\n message: response.SuccessMessages[0],\r\n messageType: SnackBarMessageType.openSidepanelDetails,\r\n messageTypeProps: {\r\n Id: response.Id,\r\n created: false,\r\n itemName: i18next.t(translations.menu_CalendarMessages),\r\n detailsType: RenderPageType.CalendarMessagesDetails,\r\n detailsTypeProps: {\r\n queryParams: {\r\n id: '' + response.Id,\r\n } as CalendarMessagesDetailsQStringParameters,\r\n useSidePanel: true,\r\n } as CalendarMessagesDetailsProps,\r\n },\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n let hasErrors = response.ErrorMessages.length > 0;\r\n yield put(\r\n actions.updateCalendarMessagesDetails_Success({\r\n hasErrors: hasErrors,\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const message =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n ((error as AxiosError)?.response?.status === 403\r\n ? i18next.t(translations.Forbidden)\r\n : undefined) ??\r\n i18next.t(translations.errormessage);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'calendarMessagesUpdateErr',\r\n message: message,\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.updateCalendarMessagesDetails_Error(Error));\r\n }\r\n}\r\n\r\nexport function* calendarMessagesDetailsSaga() {\r\n yield takeLatest(actions.initCalendarMessagesDetails.type, doInitCreate);\r\n yield takeLatest(\r\n actions.initUpdateCalendarMessagesDetails.type,\r\n doInitUpdate,\r\n );\r\n yield takeLatest(actions.createCalendarMessagesDetails.type, doCreate);\r\n yield takeLatest(actions.updateCalendarMessagesDetails.type, doUpdate);\r\n}\r\n","import {\r\n CalendarMessagesDetailsQStringParameters,\r\n CalendarMessagesDetailsState,\r\n CalendarMessagesState,\r\n ConvertModelToEntityCalendarMessagesDetails,\r\n} from './types';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { PayloadAction } from '@reduxjs/toolkit';\r\nimport { calendarMessagesDetailsSaga } from './saga';\r\nimport { ICalendarMessagesDto } from 'app/pages/CalendarMessages/CalendarMessagesPage/ICalendarMessagesDto';\r\n\r\nexport const initialState: CalendarMessagesState = {\r\n processing: false,\r\n createState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n updateState: {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n },\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'calendarMessagesDetail',\r\n initialState,\r\n reducers: {\r\n initCalendarMessagesDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = true;\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initUpdateCalendarMessagesDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = true;\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n initCalendarMessagesDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.createState.data = ConvertModelToEntityCalendarMessagesDetails(\r\n action.payload,\r\n );\r\n },\r\n initUpdateCalendarMessagesDetails_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.processing = false;\r\n state.updateState.data = ConvertModelToEntityCalendarMessagesDetails(\r\n action.payload,\r\n );\r\n },\r\n initCalendarMessagesDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n initUpdateCalendarMessagesDetails_Error(state, action: PayloadAction) {\r\n state.processing = false;\r\n },\r\n //====================================================================\r\n resetUpdateCalendarMessagesDetailsState(state, action: PayloadAction) {\r\n state.updateState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n resetCreateCalendarMessagesDetailsState(state, action: PayloadAction) {\r\n state.createState = {\r\n data: undefined,\r\n processing: undefined,\r\n completed: undefined,\r\n hasErrors: undefined,\r\n };\r\n },\r\n //====================================================================\r\n updateCalendarMessagesDetails(\r\n state,\r\n action: PayloadAction<{\r\n current: CalendarMessagesDetailsState;\r\n original: CalendarMessagesDetailsState | undefined;\r\n }>,\r\n ) {\r\n state.updateState.processing = true;\r\n state.updateState.completed = undefined;\r\n state.updateState.hasErrors = undefined;\r\n },\r\n updateCalendarMessagesDetails_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.updateState.processing = false;\r\n state.updateState.hasErrors = action.payload.hasErrors;\r\n state.updateState.completed = true;\r\n },\r\n updateCalendarMessagesDetails_Error(state, action: PayloadAction) {\r\n state.updateState.processing = false;\r\n state.updateState.completed = true;\r\n state.updateState.hasErrors = true;\r\n },\r\n //====================================================================\r\n createCalendarMessagesDetails(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.createState.processing = true;\r\n state.createState.completed = undefined;\r\n state.createState.hasErrors = undefined;\r\n },\r\n createCalendarMessagesDetails_Success(\r\n state,\r\n action: PayloadAction<{\r\n hasErrors: boolean;\r\n }>,\r\n ) {\r\n state.createState.processing = false;\r\n state.createState.hasErrors = action.payload.hasErrors;\r\n state.createState.completed = true;\r\n },\r\n createCalendarMessagesDetails_Error(state, action: PayloadAction) {\r\n state.createState.processing = false;\r\n state.createState.completed = true;\r\n state.createState.hasErrors = true;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: calendarMessagesDetailsActions } = slice;\r\n\r\nexport const useCalendarMessagesDetailsSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: calendarMessagesDetailsSaga });\r\n return { actions: slice.actions };\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.calendarMessagesDetail || initialState;\r\n\r\nexport const selectCalendarMessagesDetails = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n//====================================================================\r\nexport const selectCreateCalendarMessagesDetails = createSelector(\r\n [selectCalendarMessagesDetails],\r\n state => state.createState.data,\r\n);\r\n\r\nexport const selectCreateCalendarMessagesDetailsCompleted = createSelector(\r\n [selectCalendarMessagesDetails],\r\n state => state.createState.completed,\r\n);\r\n\r\nexport const selectCreateCalendarMessagesDetailsHasError = createSelector(\r\n [selectCalendarMessagesDetails],\r\n state => state.createState.hasErrors,\r\n);\r\n//====================================================================\r\nexport const selectUpdateCalendarMessagesDetails = createSelector(\r\n [selectCalendarMessagesDetails],\r\n state => state.updateState.data,\r\n);\r\n\r\nexport const selectUpdateCalendarMessagesDetailsCompleted = createSelector(\r\n [selectCalendarMessagesDetails],\r\n state => state.updateState.completed,\r\n);\r\nexport const selectUpdateCalendarMessagesDetailsHasError = createSelector(\r\n [selectCalendarMessagesDetails],\r\n state => state.updateState.hasErrors,\r\n);\r\n//====================================================================\r\nexport const selectCalendarMessagesDetailsProcessing = createSelector(\r\n [selectCalendarMessagesDetails],\r\n state => state.processing,\r\n);\r\n","import * as React from 'react';\r\nimport { useCallback, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { CalendarMessagesDetailsState } from '../slice/types';\r\nimport * as Yup from 'yup';\r\nimport { translations } from 'locales/translations';\r\nimport i18next from 'i18next';\r\nimport { Formik } from 'formik';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { FormServiceGroupPicker } from 'app/components/Forms/FormServiceGroupPicker';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { FormOnlineServicesSinglePicker } from 'app/components/Forms/FormEquipmentsPicker';\r\nimport { ServiceGroupFilter } from 'app/components/pickers/MultiSelectPickers/OnlineServicesPicker';\r\nimport { FormListener } from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { BaseOptionsMultiPicker } from 'app/components/BasicPickers/BaseOptionsMultiPicker';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { undefinedIfIsEmpty } from 'app/components/BasicTable/useProfileSetting/parseProfileUrl';\r\nimport { Entity } from 'types/common';\r\nimport { FormBookitDateTimePicker } from 'app/components/Forms/FormBookitDateTimePicker';\r\n\r\nexport interface CalendarMessagesFormProps {\r\n initialValues: CalendarMessagesDetailsState;\r\n onSubmit: (item: CalendarMessagesDetailsState) => void;\r\n isEdit: boolean;\r\n isAdmin: boolean;\r\n bindSubmitForm: any;\r\n}\r\n\r\nexport const CalendarMessagesForm = React.memo(function CalendarMessagesForm({\r\n initialValues,\r\n onSubmit,\r\n isEdit,\r\n isAdmin,\r\n bindSubmitForm,\r\n}: CalendarMessagesFormProps): JSX.Element {\r\n //SETTINGS\r\n const { t } = useTranslation();\r\n const { newDate } = useSystemDate();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const initValues = React.useMemo(() => {\r\n if (isEdit) return initialValues;\r\n return { ...initialValues, StartDate: newDate(), EndDate: newDate() };\r\n }, [initialValues, isEdit, newDate]);\r\n\r\n //STATES\r\n const [IsServiceGroupChanged, setIsServiceGroupChanged] = useState(\r\n false,\r\n );\r\n const [IsEquipmentChanged, setIsEquipmentChanged] = useState(false);\r\n\r\n //FUNCTIONS\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value);\r\n }\r\n };\r\n\r\n const handleFormChange = useCallback(\r\n (values: CalendarMessagesDetailsState, isValid, dirty, setValue) => {\r\n if (IsServiceGroupChanged) {\r\n setValue('Equipment', null, false);\r\n }\r\n if (IsEquipmentChanged) {\r\n setValue('ServiceGroup', null, false);\r\n }\r\n setIsServiceGroupChanged(false);\r\n setIsEquipmentChanged(false);\r\n },\r\n [IsEquipmentChanged, IsServiceGroupChanged],\r\n );\r\n\r\n //SCHEMA\r\n const calendarMessagesDetailsSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().notRequired().default(-1),\r\n ServiceGroup: Yup.mixed()\r\n .nullable()\r\n .label(i18next.t(translations.Laboratory)),\r\n Equipment: Yup.mixed()\r\n .nullable()\r\n .label(i18next.t(translations.Equipment)),\r\n Title: Yup.string()\r\n .nullable()\r\n .default('')\r\n .required()\r\n //.required(i18next.t(translations.err_AttributeRequired))\r\n .label(i18next.t(translations.Title)),\r\n StartDate: Yup.date()\r\n .default(newDate())\r\n .nullable()\r\n .notRequired()\r\n .label(i18next.t(translations.StartDate)),\r\n EndDate: Yup.date()\r\n .default(newDate())\r\n .nullable()\r\n .notRequired()\r\n .label(i18next.t(translations.EndDate)),\r\n PlantDate: Yup.date()\r\n .nullable()\r\n .notRequired()\r\n .label(i18next.t(translations.PlantDate)),\r\n Body: Yup.string()\r\n .nullable()\r\n .default('')\r\n .label(i18next.t(translations.Body)),\r\n Description: Yup.string()\r\n .default('')\r\n .nullable()\r\n .notRequired()\r\n .label(i18next.t(translations.Description)),\r\n DisplaySeconds: Yup.number()\r\n .notRequired()\r\n .default(60)\r\n .label(i18next.t(translations.Group)),\r\n ShowOn: Yup.string()\r\n .default(null)\r\n .nullable()\r\n .required('Please select at least one option for Show On.')\r\n .label('Show on'),\r\n },\r\n );\r\n const getDisabledInfo = useCallback(\r\n (entity: Entity) => {\r\n const id = entity.Id;\r\n if (\r\n id === 'system' &&\r\n !authenticatedUser?.Roles.includes(Roles.Administrators)\r\n ) {\r\n return 'Disabled: You need to be a main admin';\r\n }\r\n if (\r\n id === 'core' &&\r\n !authenticatedUser?.Roles.includes(Roles.GroupAdministrators)\r\n ) {\r\n return 'Disabled: You need to be a core admin';\r\n }\r\n return undefined;\r\n },\r\n [authenticatedUser?.Roles],\r\n );\r\n\r\n //RENDER\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n console.debug('Submitting: ', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n //console.log('User Attributes Details Errors: ', formik.errors);\r\n }\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n return options.filter(o => {\r\n if (!!getDisabledInfo(o)) return false;\r\n if ((search ?? '') === '') return true;\r\n return o.Name.includes(search ?? '');\r\n });\r\n }}\r\n onChange={val => {\r\n formik.setFieldValue(\r\n 'ShowOn',\r\n undefinedIfIsEmpty(val?.map(o => o.Id).join(',')),\r\n );\r\n }}\r\n value={\r\n formik.values.ShowOn?.split(',')\r\n .map(o => options.find(f => f.Id === o))\r\n .filter(f => f !== undefined) as Entity[]\r\n }\r\n placeholder=\"Select where to show\"\r\n disabled={formik.isSubmitting}\r\n label=\"Show on\"\r\n fullWidth\r\n variant=\"filled\"\r\n error={!!formik.errors.ShowOn}\r\n helperText={formik.errors.ShowOn}\r\n />\r\n \r\n \r\n \r\n setIsServiceGroupChanged(true)}\r\n fullWidth\r\n />\r\n \r\n \r\n setIsEquipmentChanged(true)}\r\n disabled={formik.isSubmitting}\r\n predicates={ServiceGroupFilter(\r\n formik.values.ServiceGroup?.Id,\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 \r\n \r\n */}\r\n \r\n \r\n );\r\n }}\r\n \r\n \r\n );\r\n});\r\n\r\nconst options = [\r\n { Id: 'system', Name: 'System Dashboard' },\r\n { Id: 'core', Name: 'Core Dashboard' },\r\n { Id: 'calendar', Name: 'Schedule' },\r\n];\r\n","import Box from '@material-ui/core/Box';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectHasNotSavedChanges,\r\n selectContinueToLink,\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { push } from 'connected-react-router';\r\nimport { translations } from 'locales/translations';\r\nimport { Fragment, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { SaveFormButton } from './Actions/CalendarMessagesActions';\r\nimport { useCalendarMessagesDetailsSlice } from './slice';\r\nimport {\r\n selectCalendarMessagesDetailsProcessing,\r\n selectCreateCalendarMessagesDetailsCompleted,\r\n selectUpdateCalendarMessagesDetailsCompleted,\r\n selectCreateCalendarMessagesDetails,\r\n selectUpdateCalendarMessagesDetails,\r\n} from './slice/selectors';\r\nimport {\r\n CalendarMessagesDetailsQStringParameters,\r\n CalendarMessagesDetailsState,\r\n} from './slice/types';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { CalendarMessagesForm } from './CalendarMessagesForm';\r\n\r\nexport interface CalendarMessagesDetailsProps {\r\n useSidePanel: boolean;\r\n queryParams: CalendarMessagesDetailsQStringParameters;\r\n}\r\n\r\nexport function CalendarMessagesDetails(\r\n props: CalendarMessagesDetailsProps,\r\n): JSX.Element {\r\n //PROPS\r\n const { queryParams, useSidePanel } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n\r\n //PERMISSIONS\r\n const User = useSelector(selectAuthenticatedUser);\r\n const IsAdmin =\r\n User !== undefined && User.Roles.includes(Roles.Administrators);\r\n\r\n //SLICES\r\n const { actions } = useCalendarMessagesDetailsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n\r\n //SELECTORS\r\n const publicUrl = useSelector(selectPublicUrl);\r\n //====================================================================\r\n const hasUnsavedChanges = useSelector(selectHasNotSavedChanges, shallowEqual);\r\n const continueLink = useSelector(selectContinueToLink);\r\n const loading = useSelector(selectCalendarMessagesDetailsProcessing);\r\n //====================================================================\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const continueToOther = useSelector(selectContinueState);\r\n //====================================================================\r\n const requestCreateCompleted = useSelector(\r\n selectCreateCalendarMessagesDetailsCompleted,\r\n );\r\n const requestUpdateCompleted = useSelector(\r\n selectUpdateCalendarMessagesDetailsCompleted,\r\n );\r\n //====================================================================\r\n const createModel = useSelector(\r\n selectCreateCalendarMessagesDetails,\r\n shallowEqual,\r\n );\r\n const editModel = useSelector(\r\n selectUpdateCalendarMessagesDetails,\r\n shallowEqual,\r\n );\r\n const baseModel = createModel || editModel;\r\n //====================================================================\r\n\r\n //STATES\r\n const [edit, setEdit] = useState(false);\r\n const [busy, setBusy] = useState(false);\r\n const [requestCompleted, setRequestCompleted] = useState(\r\n undefined,\r\n );\r\n\r\n //REF\r\n const submitFormRef = useRef(null);\r\n\r\n //FUNCTIONS\r\n const bindSubmitForm = useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n\r\n const handleSaveClick = (e: any) => {\r\n handleSubmitForm(e);\r\n };\r\n\r\n const handleSubmit = useCallback(\r\n (values: CalendarMessagesDetailsState) => {\r\n setBusy(true);\r\n if (edit) {\r\n dispatch(\r\n actions.updateCalendarMessagesDetails({\r\n current: values,\r\n original: baseModel,\r\n }),\r\n );\r\n } else {\r\n let value = values as CalendarMessagesDetailsState;\r\n console.debug('Data: ', value);\r\n dispatch(actions.createCalendarMessagesDetails(values));\r\n }\r\n },\r\n [actions, baseModel, dispatch, edit],\r\n );\r\n\r\n const handleCancelClick = useCallback(() => {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/CalendarMessages'));\r\n }\r\n if (edit) {\r\n dispatch(actions.resetUpdateCalendarMessagesDetailsState());\r\n } else {\r\n dispatch(actions.resetCreateCalendarMessagesDetailsState());\r\n }\r\n }, [actions, dispatch, edit, layoutActions, useSidePanel]);\r\n\r\n const handleClose = () => {\r\n if (hasUnsavedChanges) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n } else {\r\n handleCancelClick();\r\n }\r\n };\r\n\r\n //USE EFFECT ON MOUNT\r\n useEffectOnMount(() => {\r\n if (\r\n queryParams.id !== undefined &&\r\n !isNaN(parseInt(queryParams.id || ''))\r\n ) {\r\n dispatch(actions.initUpdateCalendarMessagesDetails(queryParams));\r\n } else {\r\n dispatch(actions.initCalendarMessagesDetails(queryParams));\r\n }\r\n setBusy(false);\r\n setEdit(false);\r\n setRequestCompleted(undefined);\r\n return () => {};\r\n });\r\n\r\n //USE EFFECT\r\n useEffect(() => {\r\n let active = loading === false;\r\n if (active) {\r\n if (queryParams.id !== undefined && !isNaN(parseInt(queryParams.id))) {\r\n setEdit(true);\r\n }\r\n if (requestCreateCompleted === true || requestUpdateCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n } else if (\r\n requestCreateCompleted === false ||\r\n requestUpdateCompleted === false\r\n ) {\r\n setRequestCompleted(false);\r\n setBusy(false);\r\n }\r\n if (requestUpdateCompleted === true || requestCreateCompleted === true) {\r\n handleCancelClick();\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n handleCancelClick,\r\n loading,\r\n queryParams.id,\r\n requestCreateCompleted,\r\n requestUpdateCompleted,\r\n ]);\r\n\r\n //USE EFFECT 2\r\n useEffect(() => {\r\n if (confirmApproved) {\r\n if (edit) {\r\n dispatch(actions.resetUpdateCalendarMessagesDetailsState());\r\n } else {\r\n dispatch(actions.resetCreateCalendarMessagesDetailsState());\r\n }\r\n if (continueToOther.continueOnApprove) {\r\n dispatch(layoutActions.resetSidePanel());\r\n setTimeout(() => {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: continueToOther.pageType,\r\n props: continueToOther.pageProps,\r\n expanded: continueToOther.expanded,\r\n }),\r\n );\r\n dispatch(layoutActions.resetContinueState());\r\n }, 200);\r\n } else if (continueLink !== undefined) {\r\n dispatch(appSettingsActions.navigate(continueLink));\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n }\r\n if (confirmRejected) {\r\n dispatch(layoutActions.resetConfirmState());\r\n }\r\n return () => undefined;\r\n }, [\r\n actions,\r\n appSettingsActions,\r\n confirmApproved,\r\n confirmRejected,\r\n continueLink,\r\n continueToOther,\r\n dispatch,\r\n edit,\r\n layoutActions,\r\n ]);\r\n\r\n //LEFT ACTIONS\r\n const leftActions = [\r\n () => (\r\n \r\n }\r\n onClick={handleSaveClick}\r\n disabled={busy}\r\n processing={!requestCompleted && busy}\r\n edit={edit}\r\n text={t(translations.Save)}\r\n />\r\n \r\n ),\r\n ] as ActionRenderer[];\r\n\r\n //RIGHT ACTIONS\r\n const rightActions = [\r\n () => (\r\n \r\n }\r\n onClick={handleCancelClick}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n\r\n //RENDER\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 {hasUnsavedChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { IWithSavedHistoryComponentProps } from 'app/components/BasicTable/withSavedHistory';\r\nimport { FiltersButton } from 'app/components/BasicTable/BasicFilter/FiltersButton';\r\nimport { FilterContainer } from 'app/components/BasicTable/FilterContainer';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { BasicFilterGroup } from 'app/components/BasicTable/BasicFilter';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { CombinedSchedulerTRow } from './Filter';\r\n\r\nexport interface FiltersComponentProps\r\n extends IWithSavedHistoryComponentProps,\r\n Pick {\r\n filtersButtonAnchorEl: HTMLElement | null;\r\n onFilterOpen: React.MouseEventHandler;\r\n filterOpen: boolean;\r\n onFilterClose: () => void;\r\n filterRef?: React.RefObject;\r\n}\r\nexport function FiltersComponent({\r\n filterOpen,\r\n onFilterClose,\r\n onFilterOpen,\r\n filtersButtonAnchorEl,\r\n\r\n ...props\r\n}: FiltersComponentProps) {\r\n const isMobile = DetectIsMobile();\r\n\r\n const handleFilterChange = React.useCallback(\r\n (items: IFilterSettings[]) => {\r\n props.onFilterChange?.(items);\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n\r\n return (\r\n <>\r\n {!isMobile &&\r\n props.availableFilters &&\r\n props.availableFilters.length > 0 && (\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * MultiToggleProps\r\n *\r\n */\r\nimport { ValueChangeHandler } from 'types/ValueChangeHandler';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface MultiToggleProps {\r\n value?: boolean;\r\n onchange: ValueChangeHandler;\r\n}\r\n\r\nexport function MultiToggle(props: MultiToggleProps) {\r\n const { t } = useTranslation();\r\n\r\n const handleChange = (value: boolean) => {\r\n props?.onchange(value);\r\n };\r\n return (\r\n <>\r\n handleChange(!props.value)}\r\n >\r\n \r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FullScreenButton\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { selectIsFullScreen } from 'app/slice/selectors';\r\nimport { TopActionButton } from '../BasicButtons/TopActionButton';\r\nimport { IconProp } from 'app/AllIcons';\r\n\r\nexport interface FullScreenButtonProps {\r\n selector?: string;\r\n}\r\n\r\n/**\r\n * Icon button to switch elemnt/document into full screen mode in the browser\r\n * @param props.selector element selector to show in full screen mode. optionnal - documentElement is used if undefined\r\n * @returns\r\n */\r\nexport function FullScreenButton(props: FullScreenButtonProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const dispatch = useDispatch();\r\n const isFullScreen = useSelector(selectIsFullScreen);\r\n const handleClick = () => {\r\n if (isFullScreen) {\r\n dispatch(appSettingsActions.exitFullScreen());\r\n } else {\r\n dispatch(\r\n appSettingsActions.enterFullScreen({ selector: props.selector }),\r\n );\r\n }\r\n };\r\n const icon = isFullScreen\r\n ? (['fal', 'minimize'] as IconProp)\r\n : (['fal', 'maximize'] as IconProp);\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * FullScreenSchedulerButton\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectGlobalSetting,\r\n} from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { Roles } from 'app/slice/types';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { schedulerActions } from '../../slice';\r\nimport { FullScreenButton } from 'app/components/FullScreenButton';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\n\r\nexport interface FullScreenSchedulerButtonProps {}\r\n\r\nexport function FullScreenSchedulerButton(\r\n props: FullScreenSchedulerButtonProps,\r\n) {\r\n const dispatch = useDispatch();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const intervalRefreshingCalendar = useSelector(state =>\r\n selectGlobalSetting(state, AllowedSettings.IntervalRefreshingCalendar),\r\n );\r\n const calendarOnly = authenticatedUser?.Roles?.includes(Roles.CalendarOnly);\r\n const { newDate } = useSystemDate();\r\n React.useEffect(() => {\r\n let handle = 0;\r\n\r\n if (calendarOnly === true) {\r\n const DEFAULT_REFRESH_INTERVAL_MINUTES = 10;\r\n const configuredRefreshInterval =\r\n tryParseInt(intervalRefreshingCalendar) ??\r\n DEFAULT_REFRESH_INTERVAL_MINUTES;\r\n const refreshInterval =\r\n configuredRefreshInterval < 2 || configuredRefreshInterval > 120\r\n ? DEFAULT_REFRESH_INTERVAL_MINUTES\r\n : configuredRefreshInterval;\r\n\r\n handle = setInterval(() => {\r\n const date = dateUtils.formatISO(newDate());\r\n dispatch(schedulerActions.setDate(date));\r\n }, refreshInterval * 60000);\r\n }\r\n\r\n return () => clearInterval(handle);\r\n }, [calendarOnly, dispatch, intervalRefreshingCalendar, newDate]);\r\n\r\n // if (!calendarOnly) {\r\n // return null;\r\n // }\r\n\r\n return ;\r\n}\r\n","import React from 'react';\r\nimport { DatePicker } from '@material-ui/pickers';\r\nimport { Dialog, DialogActions } from '@material-ui/core';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { ViewLengths, ViewTypes } from '../../slice/types';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { getPeriodDisplayLabel } from '../../utils';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n\r\n/**\r\n * Internal componnent state interface\r\n */\r\ninterface ICalendarDatePickerState extends CalendarDateValue {\r\n open: boolean;\r\n}\r\n/**\r\n * Period value including the period length and the date\r\n */\r\nexport interface CalendarDateValue {\r\n date: Timestamp;\r\n viewLength: ViewLengths;\r\n customDays?: number;\r\n customStart?: boolean;\r\n}\r\nexport interface CalendarDateProps extends ICalendarDatePickerState {\r\n onChange: (value: CalendarDateValue) => void;\r\n size?: 'small' | 'large' | 'medium';\r\n compact?: boolean;\r\n customDays?: number;\r\n customStart?: boolean;\r\n viewType: ViewTypes;\r\n}\r\n// const makeJSDateObject = (date: Date | string): Date => {\r\n// return dateUtils.parseISO(date);\r\n// };\r\n\r\nexport function CalendarDatePicker(props: CalendarDateProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n //const firstDayOfWeek = useSelector(selectSystemFirstDayOfWeek);\r\n // set initial state\r\n const [state, , extendState] = useAsyncExtendedState<\r\n ICalendarDatePickerState\r\n >({\r\n date: props.date,\r\n open: props.open,\r\n viewLength: props.viewLength,\r\n customDays: props.customDays,\r\n customStart: props.customStart,\r\n });\r\n // handle date change based on the period length\r\n const handleDateChange = date => {\r\n switch (state.viewLength) {\r\n case 'day':\r\n case 'twodays':\r\n extendState({ date: date, customStart: true });\r\n break;\r\n case 'customdays':\r\n extendState({\r\n date: date,\r\n customDays: props.customDays,\r\n customStart: true,\r\n });\r\n break;\r\n case 'week':\r\n extendState({\r\n date: date,\r\n customStart: props.viewType === 'timeline' ? true : undefined,\r\n });\r\n break;\r\n case 'month':\r\n case 'quarter':\r\n case 'year':\r\n extendState({ date: date, customStart: true });\r\n break;\r\n\r\n default:\r\n extendState({ date: date, customStart: true });\r\n //assertExhaustive(state.viewLength);\r\n }\r\n };\r\n\r\n const handleAccept = () => {\r\n // close the dialog\r\n extendState({ open: false });\r\n // raise change event\r\n props.onChange({\r\n date: state.date,\r\n viewLength: props.viewLength,\r\n customStart: state.customStart,\r\n });\r\n };\r\n const handleReject = React.useCallback(() => {\r\n extendState({\r\n // close dialog\r\n open: false,\r\n // reset internal state\r\n viewLength: props.viewLength,\r\n date: state.date,\r\n customStart: state.customStart,\r\n });\r\n }, [extendState, props.viewLength, state.customStart, state.date]);\r\n return (\r\n <>\r\n \r\n extendState({ open: true })}\r\n onClose={() => extendState({ open: false })}\r\n onChange={handleDateChange}\r\n // renderDay={renderDay}\r\n />\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n }\r\n onClick={() => extendState({ open: true })}\r\n >\r\n {getPeriodDisplayLabel(\r\n props.viewLength,\r\n props.date,\r\n props.compact ?? false,\r\n props.customDays,\r\n state.customStart,\r\n )}\r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * TimelineGroupByPicker\r\n *\r\n */\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useSchedulerSlice } from '../../slice';\r\nimport { TimelineGroupByUnion } from 'api/odata/generated/enums/TimelineGroupBy';\r\nimport { selectTimelineGroupBy } from '../../slice/selectors';\r\nimport { EnumPicker } from 'app/components/BasicPickers/EnumPicker';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface TimelineGroupByPickerProps {\r\n EnumNamesArray: TimelineGroupByUnion[];\r\n}\r\n\r\nexport function TimelineGroupByPicker(props: TimelineGroupByPickerProps) {\r\n const dispatch = useDispatch();\r\n const { actions } = useSchedulerSlice();\r\n const value = useSelector(selectTimelineGroupBy);\r\n const { t } = useTranslation();\r\n\r\n const handleChange = (value: TimelineGroupByUnion | null) => {\r\n dispatch(actions.changeViewModePartial({ groupBy: value ?? undefined }));\r\n };\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * CalendarHeader\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { ViewLengths, ViewTypes } from '../../slice/types';\r\nimport { Timestamp } from 'types/Timestamp';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useSchedulerSlice } from '../../slice';\r\nimport { useLocation } from 'react-router';\r\nimport { ValueChangeHandler } from 'types/ValueChangeHandler';\r\nimport { getLogger } from 'utils/logLevel';\r\nimport { FiltersComponent } from 'app/pages/CalendarPage/FiltersComponent';\r\nimport { IWithSavedHistoryComponentProps } from 'app/components/BasicTable/withSavedHistory';\r\nimport { MultiToggle } from '../MultiToggle';\r\nimport {\r\n selectMultipleModeState,\r\n selectSchedulerViewCustomStart,\r\n selectSchedulerViewType,\r\n} from '../../slice/selectors';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { FiltersGroupDisplay } from 'app/components/BasicTable/BasicFilter/FiltersGroupDisplay';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { TableToolbar } from 'app/components/BasicTable/BasicFilter/TableToolbar';\r\nimport { FilterIconButton } from 'app/components/BasicButtons/FilterIconButton';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectGlobalSetting,\r\n selectIsFullScreen,\r\n selectKnownModule,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { FullScreenSchedulerButton } from '../FullScreenSchedulerButton';\r\nimport { CalendarActionRenderer } from '../CalendarToolbar/CalendarActionRenderer';\r\nimport { AddReservation } from 'app/pages/Actions/PageTopActions/AddReservation';\r\nimport { ViewTypeLengthDropDown } from '../ViewTypeLengthDropDown';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { getPeriodFromViewLength, viewStateFromFilter } from '../../utils';\r\nimport { CombinedSchedulerTRow } from 'app/pages/CalendarPage/Filter';\r\nimport { CalendarDatePicker, CalendarDateValue } from '../CalendarDatePicker';\r\nimport { IsReadOnlyUser } from 'app/permissions/WorkOrders/workOrdersPermissionUtils';\r\nimport { SchedulerDatePositionUnion } from 'app/components/BasicTable/Filters/DatesPeriodFilter';\r\nimport { tryParseBool } from 'utils/string-utils';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { TimelineGroupByUnion } from 'api/odata/generated/enums/TimelineGroupBy';\r\nimport { TimelineGroupByPicker } from '../TimelineGroupByPicker';\r\nimport { ExportToPDF } from '../ExportToPDF';\r\n\r\nexport interface CalendarHeaderProps\r\n extends IWithSavedHistoryComponentProps {\r\n viewType: ViewTypes;\r\n viewLength: ViewLengths;\r\n date: Timestamp;\r\n onMultipleModeChange: ValueChangeHandler;\r\n //range: Range;\r\n filtersButtonAnchorEl: HTMLElement | null;\r\n filterRef?: React.RefObject;\r\n onFilterOpen: () => void;\r\n filterOpen: boolean;\r\n onFilterClose: () => void;\r\n withoutHeader?: boolean;\r\n noChangeLocation?: boolean;\r\n noTypeChange?: boolean;\r\n haideCalendarViewType?: boolean;\r\n pageActions?: CalendarActionRenderer[];\r\n setFilterValue?: (id: string, value: FilterValueType) => void;\r\n showPeriodPicker?: boolean;\r\n customDays?: number;\r\n customDaysEnabled?: boolean;\r\n twoDaysEnabled?: boolean;\r\n handleSetPeriodFilter: (length: ViewLengths, value?: Date) => void;\r\n handleViewTypeLengthChange: (\r\n type: ViewTypes,\r\n length: ViewLengths,\r\n value?: Date,\r\n noChangeLocation?: boolean,\r\n ) => void;\r\n updateSearchPeriod: (\r\n preset: SchedulerDatePositionUnion | null,\r\n search?: string,\r\n ) => string | undefined;\r\n onRefresh?: () => void;\r\n loading: boolean;\r\n useSidePanel?: boolean;\r\n}\r\n\r\nexport function CalendarHeader({\r\n customDays,\r\n handleSetPeriodFilter,\r\n handleViewTypeLengthChange,\r\n updateSearchPeriod,\r\n showPeriodPicker = true,\r\n customDaysEnabled = false,\r\n twoDaysEnabled = false,\r\n useSidePanel,\r\n ...props\r\n}: CalendarHeaderProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const log = React.useMemo(() => getLogger('CalendarHeader'), []);\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const classes = useStyles({ isMobile: isMobile });\r\n const dispatch = useDispatch();\r\n const location = useLocation();\r\n const { actions } = useSchedulerSlice();\r\n const multipleMode = useSelector(selectMultipleModeState);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n\r\n const isFullScreen = useSelector(selectIsFullScreen);\r\n const hasCustomStart = useSelector(selectSchedulerViewCustomStart);\r\n const { newDate } = useSystemDate();\r\n useEffectOnMount(() => {\r\n dispatch(actions.setNotUseLocation(props.noChangeLocation));\r\n });\r\n const handleCalendarDateChange: ValueChangeHandler = value => {\r\n dispatch(\r\n actions.changeViewMode({\r\n current: {\r\n viewType: props.viewType,\r\n viewLength: value.viewLength,\r\n date: dateUtils.formatISO(dateUtils.dateOrStringToDate(value.date)),\r\n preset: null,\r\n search: location.search,\r\n customDays: customDaysEnabled ? customDays : undefined,\r\n customStart: value.customStart,\r\n },\r\n withNoChangeLocation: props.noChangeLocation,\r\n }),\r\n );\r\n };\r\n const moveToDate = React.useCallback(\r\n (value: Date, viewLength?: ViewLengths) => {\r\n let presetValue = getPeriodFromViewLength(\r\n viewLength ?? props.viewLength,\r\n value ?? dateUtils.parseISO(props.date),\r\n customDays,\r\n );\r\n handleSetPeriodFilter(viewLength ?? props.viewLength, value);\r\n dispatch(\r\n actions.changeViewMode({\r\n current: {\r\n viewType: props.viewType,\r\n viewLength: viewLength ?? props.viewLength,\r\n date: dateUtils.formatISO(value),\r\n preset: viewStateFromFilter(presetValue.type)?.preset ?? null,\r\n search:\r\n updateSearchPeriod(\r\n viewStateFromFilter(presetValue.type)?.preset ?? null,\r\n location.search,\r\n ) ?? location.search,\r\n customDays: customDays,\r\n customStart: hasCustomStart,\r\n },\r\n withNoChangeLocation: props.noChangeLocation,\r\n }),\r\n );\r\n },\r\n [\r\n actions,\r\n customDays,\r\n dispatch,\r\n handleSetPeriodFilter,\r\n hasCustomStart,\r\n location.search,\r\n props.date,\r\n props.noChangeLocation,\r\n props.viewLength,\r\n props.viewType,\r\n updateSearchPeriod,\r\n ],\r\n );\r\n const move = React.useCallback(\r\n (a: 'next' | 'prev') => {\r\n const diff = a === 'next' ? 1 : a === 'prev' ? -1 : undefined;\r\n if (diff === undefined) {\r\n return;\r\n }\r\n const customDiff =\r\n props.viewLength === 'day'\r\n ? diff\r\n : props.viewLength === 'twodays'\r\n ? a === 'next'\r\n ? 2\r\n : -2\r\n : props.viewLength === 'customdays'\r\n ? a === 'next'\r\n ? customDays ?? 2\r\n : -(customDays ?? 2)\r\n : props.viewLength === 'week'\r\n ? diff\r\n : props.viewLength === 'month'\r\n ? diff\r\n : props.viewLength === 'quarter'\r\n ? diff\r\n : props.viewLength === 'year'\r\n ? diff\r\n : undefined;\r\n\r\n const addDateFn =\r\n props.viewLength === 'day'\r\n ? dateUtils.addDays\r\n : props.viewLength === 'twodays'\r\n ? dateUtils.addDays\r\n : props.viewLength === 'customdays'\r\n ? dateUtils.addDays\r\n : props.viewLength === 'week'\r\n ? dateUtils.addWeeks\r\n : props.viewLength === 'month'\r\n ? dateUtils.addMonths\r\n : props.viewLength === 'quarter'\r\n ? dateUtils.addQuarters\r\n : props.viewLength === 'year'\r\n ? dateUtils.addYears\r\n : undefined;\r\n if (addDateFn === undefined) {\r\n return undefined;\r\n }\r\n const newDate = addDateFn(\r\n dateUtils.parseISO(props.date),\r\n customDiff || diff,\r\n );\r\n return moveToDate(newDate);\r\n },\r\n [customDays, moveToDate, props.date, props.viewLength],\r\n );\r\n const handleMultipleModeChange: ValueChangeHandler = value => {\r\n props.onMultipleModeChange(value);\r\n };\r\n const handlePreviousPeriodClick = () => {\r\n move('prev');\r\n };\r\n\r\n const handleNextPeriodClick = () => {\r\n move('next');\r\n };\r\n\r\n const handleTodayClick = value => {\r\n handleSetPeriodFilter('day');\r\n dispatch(\r\n actions.changeViewMode({\r\n current: {\r\n viewType: props.viewType,\r\n viewLength: 'day',\r\n date: dateUtils.formatISO(newDate()),\r\n preset: 'Today',\r\n search:\r\n updateSearchPeriod('Today', location.search) ?? location.search,\r\n customDays: undefined,\r\n customStart: undefined,\r\n },\r\n withNoChangeLocation: props.noChangeLocation,\r\n forceEvents: true,\r\n }),\r\n );\r\n };\r\n const handleFilterChange = (\r\n filters: IFilterSettings[],\r\n ) => {\r\n props.onFilterChange?.(filters);\r\n };\r\n\r\n const getTitle = (viewType: ViewTypes) => {\r\n switch (viewType) {\r\n case 'calendar':\r\n return t(translations.Calendar);\r\n case 'timeline':\r\n return t(translations.Timeline);\r\n default:\r\n assertExhaustive(viewType);\r\n }\r\n };\r\n\r\n const lengthOptions = React.useMemo(() => {\r\n let lengths: Array = ['day'];\r\n if (twoDaysEnabled) {\r\n lengths.push('twodays');\r\n }\r\n if (customDaysEnabled) {\r\n lengths.push('customdays');\r\n }\r\n lengths.push('week');\r\n lengths.push('month');\r\n if (!isMobile) {\r\n lengths.push('quarter');\r\n lengths.push('year');\r\n }\r\n return lengths;\r\n }, [customDaysEnabled, isMobile, twoDaysEnabled]);\r\n\r\n const viewType = useSelector(selectSchedulerViewType);\r\n const AssetCatEnabled = useSelector(\r\n state =>\r\n tryParseBool(\r\n selectGlobalSetting(state, AllowedSettings.AssetCatEnabled),\r\n ) === true,\r\n );\r\n const EquipmentAssembliesEnabled = useSelector(\r\n state =>\r\n selectKnownModule(state, KnownModules.EquipmentAssemblies) === true,\r\n );\r\n\r\n const TimelineGroupByEnumsArray = React.useMemo(() => {\r\n const result: TimelineGroupByUnion[] = [];\r\n if (EquipmentAssembliesEnabled) {\r\n result.push('GroupByAssemblyPart');\r\n }\r\n if (AssetCatEnabled) {\r\n result.push('GroupByAssetCat');\r\n }\r\n if (result.length === 0) {\r\n return undefined;\r\n } else {\r\n result.unshift('NoTimelineGrouped');\r\n }\r\n return result;\r\n }, [AssetCatEnabled, EquipmentAssembliesEnabled]);\r\n\r\n // page level actions shown behind kebab menu\r\n const secondaryPageActions: CalendarActionRenderer[] = React.useMemo(() => {\r\n const calendarActions: CalendarActionRenderer[] = [];\r\n // const hasCalendarAndOtherRoles =\r\n // authenticatedUser?.Roles?.includes(Roles.CalendarOnly) &&\r\n // authenticatedUser?.Roles?.length > 1;\r\n if (TimelineGroupByEnumsArray !== undefined && viewType === 'timeline') {\r\n calendarActions.push(() => (\r\n \r\n ));\r\n }\r\n\r\n if (!authenticatedUser?.Roles?.includes(Roles.CalendarOnly)) {\r\n calendarActions.push(() => );\r\n }\r\n if (!isMobile) {\r\n calendarActions.push(() => (\r\n {\r\n dispatch(actions.exportToPDF());\r\n }}\r\n />\r\n ));\r\n }\r\n\r\n return calendarActions.concat(props.pageActions ?? []);\r\n }, [\r\n TimelineGroupByEnumsArray,\r\n actions,\r\n authenticatedUser?.Roles,\r\n dispatch,\r\n isMobile,\r\n props.pageActions,\r\n viewType,\r\n ]);\r\n const primaryPageActions: CalendarActionRenderer[] = React.useMemo(() => {\r\n const actions: CalendarActionRenderer[] = [];\r\n if (isMobile && props.availableFilters !== undefined) {\r\n actions.push(() => (\r\n \r\n ));\r\n }\r\n if (!isFullScreen && isMobile && !IsReadOnlyUser(authenticatedUser)) {\r\n actions.push(() => (\r\n \r\n ));\r\n }\r\n\r\n return actions;\r\n }, [\r\n authenticatedUser,\r\n isFullScreen,\r\n isMobile,\r\n props.appliedFilters?.length,\r\n props.availableFilters,\r\n props.filterRef,\r\n props.onFilterOpen,\r\n t,\r\n useSidePanel,\r\n ]);\r\n const handleRefresh = () => {\r\n props.onRefresh?.();\r\n };\r\n return (\r\n <>\r\n {!props.withoutHeader && (\r\n \r\n {primaryPageActions.length > 0 &&\r\n primaryPageActions.map((item, index) => (\r\n {item()}\r\n ))}\r\n {authenticatedUser?.Roles?.includes(Roles.CalendarOnly) &&\r\n !isFullScreen && }\r\n {secondaryPageActions.length > 0 &&\r\n !(\r\n authenticatedUser?.Roles?.includes(Roles.CalendarOnly) &&\r\n isFullScreen\r\n ) && (\r\n (\r\n {item()}\r\n ))}\r\n />\r\n )}\r\n \r\n )}\r\n \r\n \r\n {/* hide the menu in fullscreen mode since it's not functional (autocompletes do not show up) */}\r\n {!isFullScreen && props.availableFilters !== undefined && (\r\n <>\r\n {isMobile ? (\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 {props.viewType === 'calendar' && !isMobile && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* todo: implement settings */}\r\n {false && (\r\n \r\n \r\n \r\n )}\r\n {/* todo: implement \"save selection\" */}\r\n {false && (\r\n \r\n {t(translations.SaveSelection)}\r\n \r\n )}\r\n \r\n {showPeriodPicker && (\r\n \r\n \r\n handleViewTypeLengthChange(\r\n type,\r\n length,\r\n value,\r\n props.noChangeLocation,\r\n )\r\n }\r\n customDays={customDays}\r\n customDaysEnabled={customDaysEnabled}\r\n twoDaysEnabled={twoDaysEnabled}\r\n lengthOptions={lengthOptions}\r\n />\r\n \r\n )}\r\n \r\n {!isMobile &&\r\n props.availableFilters !== undefined &&\r\n (props.appliedFilters ?? []).length > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: 8,\r\n gap: 8,\r\n },\r\n column: {\r\n display: 'flex',\r\n width: 'auto', //props => timelineColumnWidth(props.isMobile),\r\n alignItems: 'center',\r\n },\r\n toolbar: {\r\n flex: 1,\r\n display: 'flex',\r\n padding: props => (props.isMobile ? '8px 0px' : '0px'),\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n [theme.breakpoints.down('sm')]: {\r\n flexWrap: 'wrap',\r\n gap: 0,\r\n // flexDirection: 'column',\r\n // alignItems: 'flex-start',\r\n },\r\n },\r\n left: {\r\n // flex: 1,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n },\r\n right: {\r\n flex: 1,\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n alignItems: 'center',\r\n },\r\n periodControls: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexDirection: 'row',\r\n gap: props => (props.isMobile ? theme.spacing(0.5) : theme.spacing(1)),\r\n },\r\n viewTypeControls: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n },\r\n otherControls: {},\r\n search: {\r\n width: 150,\r\n },\r\n filterDisplayRoot: {\r\n gap: 8,\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n flexWrap: 'wrap',\r\n },\r\n }),\r\n);\r\n","import { translations } from 'locales/translations';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\n\r\nimport { CampusPickerFilter } from 'app/components/BasicTable/Filters/CampusPickerFilter';\r\nimport { BuildingPickerFilter } from 'app/components/BasicTable/Filters/BuildingPickerFilter';\r\nimport { RoomPickerFilter } from 'app/components/BasicTable/Filters/RoomPickerFilter';\r\n\r\nimport { TagsFilter } from 'app/components/BasicTable/Filters/TagsFilter';\r\nimport { LoanableFilter } from 'app/components/BasicTable/Filters/LoanableFilter';\r\nimport { StatusFilter } from 'app/components/BasicTable/Filters/StatusFilter';\r\nimport { LockersFilter } from 'app/components/BasicTable/Filters/LockersFilter';\r\nimport { AssetCatGroupFilter } from 'app/components/BasicTable/Filters/AssetCatGroupFilter';\r\nimport { AssetCatFilter } from 'app/components/BasicTable/Filters/AssetCatFilter';\r\nimport {\r\n arrayToQueryString,\r\n assetRangeSerializer,\r\n getAssetRange,\r\n GetBooleanEntity,\r\n GetBooleanOrUndefined,\r\n GetDateOrUndefined,\r\n getNumberEntityArray,\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n getStringEntityArray,\r\n GetStringOrUndefined,\r\n initExPickerValue,\r\n initMultiExPickerValue,\r\n initMultiPickerValue,\r\n initPickerValue,\r\n URLSearchParamsCI,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { initCampusData } from 'app/components/pickers/AutocompletePickers/CampusPicker';\r\nimport { initBuildingData } from 'app/components/pickers/AutocompletePickers/BuildingPicker';\r\nimport { initRoomData } from 'app/components/pickers/AutocompletePickers/RoomPicker';\r\nimport { initLockersData } from 'app/components/pickers/AutocompletePickers/LockersPicker';\r\nimport { initTagsData } from 'app/components/pickers/AutocompletePickers/TagsPicker';\r\nimport { initAssetCatData } from 'app/components/pickers/AutocompletePickers/AssetCatPicker';\r\nimport { initAssetCatGroupData } from 'app/components/pickers/AutocompletePickers/AssetCatGroupPicker';\r\nimport { initLoanableData } from 'app/components/pickers/AutocompletePickers/LoanablePicker';\r\nimport { IsAssetFieldEnabled, IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { initStatusData } from 'app/components/pickers/AutocompletePickers/StatusPicker';\r\nimport BooleanPickerFilter from 'app/components/BasicTable/Filters/BooleanPickerFilter';\r\nimport { CustomDate } from 'types/CustomDate';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport {\r\n DatePickerFilter,\r\n TextFieldFilter,\r\n} from 'app/components/BasicTable/Filters';\r\nimport { initAssetMultiData } from 'app/components/pickers/AutocompletePickers/AssetMultiPicker';\r\nimport { AssetMultiFilter } from 'app/components/BasicTable/Filters/AssetMultiFilter';\r\nimport { AssetTypesFilter } from 'app/components/BasicTable/Filters/AssemblyTypesFilter';\r\nimport { initAssemblyTypeData } from 'app/components/pickers/StaticOptionsPickers/AssemblyTypePicker';\r\nimport { AreasFilter } from 'app/components/BasicTable/Filters/AreasFilter';\r\nimport { initAreasData } from 'app/components/pickers/AutocompletePickers/AreassPicker';\r\nimport { initLocationData } from 'app/components/pickers/AutocompletePickers/LocationPicker';\r\nimport { LocationPickerFilter } from 'app/components/BasicTable/Filters/LocationPickerFilter';\r\nimport { SubLocationFilter } from 'app/components/BasicTable/Filters/SubLocationListFilter';\r\nimport { initSubLocationListData } from 'app/components/pickers/AutocompletePickers/SubLocationListPicker';\r\nimport {\r\n initInstrumentCatData,\r\n InstrumentCatFilter,\r\n} from 'app/components/BasicTable/Filters/InstrumentCatFilter';\r\nimport { OnlineServiceTypeFilter } from 'app/components/BasicTable/Filters/OnlineServiceTypeFilter';\r\nimport { initOnlineServiceTypeData } from 'app/components/pickers/StaticOptionsPickers/OnlineServiceTypePicker';\r\nimport { initUserMultiData } from 'app/components/pickers/AutocompletePickers/UserMultiPicker';\r\nimport UserAssetContactMultiFilter from 'app/components/BasicTable/Filters/UserAssetContactMultiFilter';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { initMyAssetAvailabilityTypeMultiData } from 'app/components/pickers/AutocompletePickers/MyAssetAvailabilityTypeMultiPicker';\r\nimport {\r\n assetRangeCustomFilter,\r\n assetRangeDisplay,\r\n AssetRangeFilter,\r\n initAssetRangeData,\r\n} from 'app/components/BasicTable/Filters/AssetRangeFilter';\r\nimport { AssetAttributes } from 'enums/AssetAttributes';\r\nimport { IMyAssetsRow } from '../IMyAssetsRow';\r\nimport { AvailabilityTypeAvailableMultiFilter } from 'app/components/BasicTable/Filters/MyAssetAvailabilityTypeMultiPickerFilter';\r\nimport ServiceTypeEnumFilter from 'app/components/BasicTable/Filters/ServiceTypeEnumFilter';\r\nimport { initServiceTypeEnumData } from 'app/components/pickers/StaticOptionsPickers/ServiceTypeEnumPicker';\r\nimport ExtraDDLFilter from 'app/components/BasicTable/Filters/ExtraDDLFilter';\r\nimport { initExtraDDLData } from 'app/components/pickers/AutocompletePickers/ExtraddlPicker';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const myAssetsDefaultFilters: string[] = [\r\n ...(settings as GlobalSettings)\r\n .GetString(AllowedSettings.AdvancedAssetSearchFilterAttributes)\r\n .split(','),\r\n ];\r\n\r\n const params = new URLSearchParamsCI(search);\r\n var result: IFilterSettings[] = [\r\n {\r\n fieldName: 'Id',\r\n queryStringSerializer: arrayToQueryString('aid'),\r\n displayName: t(translations.AssetName), //(displayed as Resource Name)\r\n operator: ODataOperators.Includes,\r\n value: getNumberEntityArray(params, 'aid'),\r\n initData: initMultiPickerValue(initAssetMultiData),\r\n component: AssetMultiFilter,\r\n urlKey: 'aid',\r\n },\r\n {\r\n fieldName: 'CampusId',\r\n displayName: t(translations.Campus),\r\n queryStringSerializer: 'CampusId',\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'CampusId')),\r\n ),\r\n initData: initPickerValue(initCampusData),\r\n component: CampusPickerFilter,\r\n },\r\n {\r\n fieldName: 'LocationId',\r\n queryStringSerializer: 'LocationId',\r\n displayName: t(translations.LocationsList),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'LocationId')),\r\n ),\r\n initData: initPickerValue(initLockersData),\r\n component: LockersFilter,\r\n },\r\n {\r\n fieldName: 'AssetRecordDate',\r\n queryStringSerializer: 'AssetRecordDate',\r\n displayName: t(translations.CreatedSince),\r\n operator: ODataOperators.GreaterThanEqual,\r\n defaultValue: new CustomDate(),\r\n value: GetDateOrUndefined(GetRawValue(params, 'AssetRecordDate'), 'date'),\r\n component: DatePickerFilter,\r\n },\r\n {\r\n fieldName: 'Active',\r\n queryStringSerializer: 'active',\r\n displayName: t(translations.ActiveAssets),\r\n operator: ODataOperators.Equals,\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'active')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n },\r\n {\r\n fieldName: 'InstrumentTypeId',\r\n queryStringSerializer: 'typeId',\r\n displayName: t(translations.InstrumentType),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'typeId')),\r\n ),\r\n initData: initPickerValue(initAssemblyTypeData),\r\n component: AssetTypesFilter,\r\n },\r\n {\r\n fieldName: 'OperationTypeID',\r\n queryStringSerializer: 'OperationTypeID',\r\n displayName: t(translations.OperationType),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'OperationTypeID')),\r\n ),\r\n customFilter: (value, setting) => {\r\n return `${new Condition(\r\n 'AutoMode',\r\n ODataOperators.Equals,\r\n 1,\r\n ).toString()} and ${new Condition(\r\n setting.fieldName,\r\n ODataOperators.Equals,\r\n value,\r\n ).toString()}`;\r\n },\r\n initData: initPickerValue(initOnlineServiceTypeData),\r\n component: OnlineServiceTypeFilter,\r\n },\r\n {\r\n fieldName: 'RoomAreaId',\r\n queryStringSerializer: 'areaId',\r\n displayName: t(translations.Areas),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'areaId')),\r\n ),\r\n initData: initPickerValue(initAreasData),\r\n component: AreasFilter,\r\n },\r\n {\r\n fieldName: 'LocationId',\r\n queryStringSerializer: 'locationid',\r\n displayName: t(translations.LocationList),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'locationid')),\r\n ),\r\n initData: initPickerValue(initLocationData),\r\n component: LocationPickerFilter,\r\n },\r\n {\r\n fieldName: 'SubLocationId',\r\n queryStringSerializer: 'sublocationid',\r\n displayName: t(translations.SubLocationsList),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'sublocationid')),\r\n ),\r\n initData: initPickerValue(initSubLocationListData),\r\n component: SubLocationFilter,\r\n },\r\n {\r\n fieldName: 'InstrumentCatId',\r\n displayName: t(translations.InstrumentCat),\r\n queryStringSerializer: 'instrumentCatId',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'instrumentCatId')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: InstrumentCatFilter,\r\n initData: initPickerValue(initInstrumentCatData),\r\n },\r\n {\r\n fieldName: 'StatusId',\r\n queryStringSerializer: 'StatusId',\r\n displayName: t(translations.Status),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'StatusId')),\r\n ),\r\n initData: initPickerValue(initStatusData),\r\n component: StatusFilter,\r\n },\r\n {\r\n fieldName: 'ApprovalRequired',\r\n queryStringSerializer: 'approval',\r\n displayName: t(translations.ApprovalRequired),\r\n operator: ODataOperators.Equals,\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'approval')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n },\r\n ];\r\n if (IsModuleEnabled(appSettings, KnownModules.LocationTracking)) {\r\n result.push({\r\n fieldName: 'LocationUpdatedAt',\r\n queryStringSerializer: 'locationNotUpdatedSince',\r\n displayName: t(translations.LocationNotUpdatedSince),\r\n operator: ODataOperators.LessThan,\r\n defaultValue: new CustomDate(),\r\n value: GetDateOrUndefined(\r\n GetRawValue(params, 'locationNotUpdatedSince'),\r\n 'date',\r\n ),\r\n component: DatePickerFilter,\r\n });\r\n }\r\n if (\r\n IsModuleEnabled(appSettings, KnownModules.LoanDesk) &&\r\n myAssetsDefaultFilters.includes('Loanable')\r\n ) {\r\n result.push({\r\n fieldName: 'LoanTypeId',\r\n queryStringSerializer: 'LoanTypeId',\r\n displayName: t(translations.Loanable),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'loantypeId')),\r\n ),\r\n initData: initPickerValue(initLoanableData),\r\n component: LoanableFilter,\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('Tags')) {\r\n result.push({\r\n fieldName: 'TagsText',\r\n queryStringSerializer: arrayToQueryString('TagsText'),\r\n displayName: t(translations.Tags),\r\n operator: ODataOperators.ContainsM,\r\n value: getNumberEntityArray(params, 'TagsText'),\r\n initData: initMultiPickerValue(initTagsData),\r\n component: TagsFilter,\r\n urlKey: 'TagsText',\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('AssetCatGroup')) {\r\n result.push({\r\n fieldName: 'AssetCatGroupId',\r\n queryStringSerializer: 'AssetCatGroupId',\r\n displayName: t(translations.AssetCatGroupName),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'AssetCatGroupId')),\r\n ),\r\n initData: initPickerValue(initAssetCatGroupData),\r\n component: AssetCatGroupFilter,\r\n urlType: 'assetBase',\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('AssetCat')) {\r\n result.push({\r\n fieldName: 'AssetCatId',\r\n queryStringSerializer: 'AssetCatId',\r\n displayName: t(translations.AssetCatName),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'AssetCatId')),\r\n ),\r\n initData: initPickerValue(initAssetCatData),\r\n component: AssetCatFilter,\r\n urlType: 'assetBase',\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('Building')) {\r\n result.push({\r\n fieldName: 'BuildingId',\r\n displayName: t(translations.Building),\r\n queryStringSerializer: 'BuildingId',\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'BuildingId')),\r\n ),\r\n initData: initPickerValue(initBuildingData),\r\n component: BuildingPickerFilter,\r\n urlType: 'assetBase',\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('Room')) {\r\n result.push({\r\n fieldName: 'RoomId',\r\n queryStringSerializer: 'RoomId',\r\n displayName: t(translations.Room),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'RoomId')),\r\n ),\r\n initData: initPickerValue(initRoomData),\r\n component: RoomPickerFilter,\r\n });\r\n }\r\n //if (myAssetsDefaultFilters.includes('Availability')) {\r\n result.push({\r\n fieldName: 'AvailabilityTypeId',\r\n queryStringSerializer: arrayToQueryString('AvailabilityTypeId'),\r\n displayName: t(translations.AvailabilityType),\r\n operator: ODataOperators.Includes,\r\n value: getNumberEntityArray(params, 'AvailabilityTypeId'),\r\n initData: initMultiPickerValue(initMyAssetAvailabilityTypeMultiData),\r\n component: AvailabilityTypeAvailableMultiFilter,\r\n urlKey: 'AvailabilityTypeId',\r\n });\r\n result.push({\r\n fieldName: 'ServiceTypeId',\r\n queryStringSerializer: 'stid',\r\n displayName: t(translations.ResourceServiceType),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(GetNumberOrUndefined(GetRawValue(params, 'stid'))),\r\n initData: initPickerValue(initServiceTypeEnumData),\r\n component: ServiceTypeEnumFilter,\r\n urlKey: 'stid',\r\n });\r\n\r\n //}\r\n if (myAssetsDefaultFilters.includes('ContactsPersonForEquipment')) {\r\n result.push({\r\n fieldName: 'Contacts',\r\n displayName: t(translations.ContactsPersonForEquipment),\r\n operator: ODataOperators.AnyIn,\r\n queryStringSerializer: arrayToQueryString('contacts'),\r\n value: getStringEntityArray(params, 'contacts'),\r\n component: UserAssetContactMultiFilter,\r\n initData: initMultiExPickerValue(initUserMultiData),\r\n urlKey: 'contacts',\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('Experts')) {\r\n result.push({\r\n fieldName: 'Experts',\r\n displayName: t(translations.EquipmentExperts),\r\n operator: ODataOperators.AnyIn,\r\n queryStringSerializer: arrayToQueryString('experts'),\r\n value: getStringEntityArray(params, 'experts'),\r\n component: UserAssetContactMultiFilter,\r\n initData: initMultiExPickerValue(initUserMultiData),\r\n urlKey: 'experts',\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('OtherNames')) {\r\n result.push({\r\n fieldName: 'OtherNames',\r\n displayName: t(translations.OtherNames),\r\n operator: ODataOperators.Contains,\r\n queryStringSerializer: 'otherNames',\r\n value: GetStringOrUndefined(GetRawValue(params, 'otherNames')),\r\n component: TextFieldFilter,\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('InternalCode')) {\r\n result.push({\r\n fieldName: 'InternalCode',\r\n displayName: t(translations.InternalEquipmentBarcodeNumber),\r\n operator: ODataOperators.Contains,\r\n queryStringSerializer: 'internalCode',\r\n value: GetStringOrUndefined(GetRawValue(params, 'internalCode')),\r\n component: TextFieldFilter,\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('ShowAssemblyParts')) {\r\n result.push({\r\n fieldName: 'HasAssemblyParts',\r\n displayName: t(translations.ShowAssemblyParts),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'showAssemblyParts',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'showAssemblyParts')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n });\r\n }\r\n if (myAssetsDefaultFilters.includes('IsUsageOpen')) {\r\n result.push({\r\n fieldName: 'HasActiveUsage',\r\n displayName: t(translations.UsageStatus),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'isUsageOpen',\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'isUsageOpen')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n });\r\n }\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Range)) {\r\n result.push({\r\n fieldName: 'Ranges',\r\n queryStringSerializer: assetRangeSerializer('RangeWeight'),\r\n value: getAssetRange(params, 'RangeWeight'),\r\n displayName: t(translations.RangeWeight),\r\n operator: ODataOperators.In,\r\n component: AssetRangeFilter,\r\n initData: initAssetRangeData,\r\n customData: 1,\r\n customFilter: assetRangeCustomFilter,\r\n getDisplay: assetRangeDisplay,\r\n urlKey: 'RangeWeight',\r\n });\r\n }\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Range)) {\r\n result.push({\r\n fieldName: 'Ranges',\r\n queryStringSerializer: assetRangeSerializer('RangekN'),\r\n value: getAssetRange(params, 'RangekN'),\r\n displayName: t(translations.RangekN),\r\n operator: ODataOperators.In,\r\n component: AssetRangeFilter,\r\n initData: initAssetRangeData,\r\n customData: 2,\r\n customFilter: assetRangeCustomFilter,\r\n getDisplay: assetRangeDisplay,\r\n urlKey: 'RangekN',\r\n });\r\n }\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Range)) {\r\n result.push({\r\n fieldName: 'Ranges',\r\n queryStringSerializer: assetRangeSerializer('RangeTemperature'),\r\n value: getAssetRange(params, 'RangeTemperature'),\r\n displayName: t(translations.RangeTemperature),\r\n operator: ODataOperators.In,\r\n component: AssetRangeFilter,\r\n initData: initAssetRangeData,\r\n customData: 3,\r\n customFilter: assetRangeCustomFilter,\r\n getDisplay: assetRangeDisplay,\r\n urlKey: 'RangeTemperature',\r\n });\r\n }\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Range)) {\r\n result.push({\r\n fieldName: 'Ranges',\r\n queryStringSerializer: assetRangeSerializer('RangeArea'),\r\n value: getAssetRange(params, 'RangeArea'),\r\n displayName: t(translations.RangeArea),\r\n operator: ODataOperators.In,\r\n component: AssetRangeFilter,\r\n initData: initAssetRangeData,\r\n customData: 4,\r\n customFilter: assetRangeCustomFilter,\r\n getDisplay: assetRangeDisplay,\r\n urlKey: 'RangeArea',\r\n });\r\n }\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Range)) {\r\n result.push({\r\n fieldName: 'Ranges',\r\n queryStringSerializer: assetRangeSerializer('RangeVolume'),\r\n value: getAssetRange(params, 'RangeVolume'),\r\n displayName: t(translations.RangeVolume),\r\n operator: ODataOperators.In,\r\n component: AssetRangeFilter,\r\n initData: initAssetRangeData,\r\n customData: 5,\r\n customFilter: assetRangeCustomFilter,\r\n getDisplay: assetRangeDisplay,\r\n urlKey: 'RangeVolume',\r\n });\r\n }\r\n if (IsAssetFieldEnabled(appSettings, AssetAttributes.Range)) {\r\n result.push({\r\n fieldName: 'Ranges',\r\n queryStringSerializer: assetRangeSerializer('RangeAmount'),\r\n value: getAssetRange(params, 'RangeAmount'),\r\n displayName: t(translations.RangeAmount),\r\n operator: ODataOperators.In,\r\n component: AssetRangeFilter,\r\n initData: initAssetRangeData,\r\n customData: 6,\r\n customFilter: assetRangeCustomFilter,\r\n getDisplay: assetRangeDisplay,\r\n urlKey: 'RangeAmount',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL0) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL0')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL0',\r\n displayName: t(translations.Asset_ExtraDDL0),\r\n queryStringSerializer: 'extddl0',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl0')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL0'),\r\n urlType: 'ExtraDDL0',\r\n urlKey: 'extddl0',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL1) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL1')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL1',\r\n displayName: t(translations.Asset_ExtraDDL1),\r\n queryStringSerializer: 'extddl1',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl1')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL1'),\r\n urlType: 'ExtraDDL1',\r\n urlKey: 'extddl1',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL2) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL2')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL2',\r\n displayName: t(translations.Asset_ExtraDDL2),\r\n queryStringSerializer: 'extddl2',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl2')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL2'),\r\n urlType: 'ExtraDDL2',\r\n urlKey: 'extddl2',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL3) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL3')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL3',\r\n displayName: t(translations.Asset_ExtraDDL3),\r\n queryStringSerializer: 'extddl3',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl3')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL3'),\r\n urlType: 'ExtraDDL3',\r\n urlKey: 'extddl3',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL4) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL4')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL4',\r\n displayName: t(translations.Asset_ExtraDDL4),\r\n queryStringSerializer: 'extddl4',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl4')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL4'),\r\n urlType: 'ExtraDDL4',\r\n urlKey: 'extddl4',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL5) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL5')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL5',\r\n displayName: t(translations.Asset_ExtraDDL5),\r\n queryStringSerializer: 'extddl5',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl5')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL5'),\r\n urlType: 'ExtraDDL5',\r\n urlKey: 'extddl5',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL6) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL6')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL6',\r\n displayName: t(translations.Asset_ExtraDDL6),\r\n queryStringSerializer: 'extddl6',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl6')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL6'),\r\n urlType: 'ExtraDDL6',\r\n urlKey: 'extddl6',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL7) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL7')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL7',\r\n displayName: t(translations.Asset_ExtraDDL7),\r\n queryStringSerializer: 'extddl7',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl7')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL7'),\r\n urlType: 'ExtraDDL7',\r\n urlKey: 'extddl7',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL8) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL8')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL8',\r\n displayName: t(translations.Asset_ExtraDDL8),\r\n queryStringSerializer: 'extddl8',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl8')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL8'),\r\n urlType: 'ExtraDDL8',\r\n urlKey: 'extddl8',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL9) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL9')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL9',\r\n displayName: t(translations.Asset_ExtraDDL9),\r\n queryStringSerializer: 'extddl9',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl9')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL9'),\r\n urlType: 'ExtraDDL9',\r\n urlKey: 'extddl9',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL10) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL10')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL10',\r\n displayName: t(translations.Asset_ExtraDDL10),\r\n queryStringSerializer: 'extddl10',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl10')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL10'),\r\n urlType: 'ExtraDDL10',\r\n urlKey: 'extddl10',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL11) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL11')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL11',\r\n displayName: t(translations.Asset_ExtraDDL11),\r\n queryStringSerializer: 'extddl11',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl11')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL11'),\r\n urlType: 'ExtraDDL11',\r\n urlKey: 'extddl11',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL12) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL12')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL12',\r\n displayName: t(translations.Asset_ExtraDDL12),\r\n queryStringSerializer: 'extddl12',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl12')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL12'),\r\n urlType: 'ExtraDDL12',\r\n urlKey: 'extddl12',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL13) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL13')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL13',\r\n displayName: t(translations.Asset_ExtraDDL13),\r\n queryStringSerializer: 'extddl13',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl13')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL13'),\r\n urlType: 'ExtraDDL13',\r\n urlKey: 'extddl13',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL14) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL14')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL14',\r\n displayName: t(translations.Asset_ExtraDDL14),\r\n queryStringSerializer: 'extddl14',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl14')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL14'),\r\n urlType: 'ExtraDDL14',\r\n urlKey: 'extddl14',\r\n });\r\n }\r\n if (\r\n IsAssetFieldEnabled(appSettings, AssetAttributes.ExtraDDL15) &&\r\n myAssetsDefaultFilters.includes('ExtraDDL15')\r\n ) {\r\n result.push({\r\n fieldName: 'ExtraDDL5',\r\n displayName: t(translations.Asset_ExtraDDL15),\r\n queryStringSerializer: 'extddl15',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'extddl15')),\r\n ),\r\n operator: ODataOperators.Equals,\r\n component: ExtraDDLFilter,\r\n initData: initExPickerValue(initExtraDDLData, undefined, 'ExtraDDL15'),\r\n urlType: 'ExtraDDL15',\r\n urlKey: 'extddl15',\r\n });\r\n }\r\n return result;\r\n};\r\n","import { BasicTable, IBasicTableState } from 'app/components/BasicTable';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { filterHandler } from 'app/components/BasicTable/UnconfigurableTable/FilterHandler';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport * as React from 'react';\r\nimport { Column, IdType, Row } from 'react-table';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { getColumns } from '../Columns';\r\nimport { DefaultFilter } from '../DefaultFilter';\r\nimport { IMyAssetsRow } from '../IMyAssetsRow';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectAppSettings,\r\n selectglobalSettings,\r\n selectIsAuthenticated,\r\n selectShowAllCores,\r\n} from 'app/slice/selectors';\r\nimport {\r\n SelectedRowsActionExtRenderer,\r\n SelectedRowsActionRenderer,\r\n} from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { useGlobalServiceGroupsFilter } from 'app/hooks/useGlobalServiceGroupsFilter';\r\nimport {\r\n AppSettings,\r\n IsAssetFieldEnabled,\r\n IsAssetFieldIsPublic,\r\n} from 'types/AppSettings';\r\nimport { Entity } from 'types/common';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { BookitChipWithInfo } from 'app/components/BasicChip';\r\nimport { SavedViewSelected } from 'app/pages/SavedViewsPage/SavedViewPage/slice/types';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\nimport { GetFilters } from './Filter';\r\nimport { AssetActionType } from './AssetsSelection';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport useState from 'react-usestateref';\r\nimport { TableMode } from 'app/components/BasicTable/ControlledTable';\r\nimport { CustomEmptyTableProps } from 'app/components/BasicTable/components/CustomEmptyTable';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { GetSelectedActions } from '../SelectedRowActions/GetSelectedActions';\r\nimport { AssetAttributes } from 'enums/AssetAttributes';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface AssetsSelectionTableProps {\r\n useSidePanel?: boolean;\r\n authenticatedUser?: AuthenticatedUser;\r\n closeSidePanel: () => void;\r\n setFilters?: (\r\n appliedFilters: IFilterSettings[] | undefined,\r\n ) => void;\r\n allowMultiToggle: boolean;\r\n primaryAction?: (row: Row) => void;\r\n primaryMultiAction: (rows: IMyAssetsRow[]) => void;\r\n isRowSelectable: (row: Row) => boolean;\r\n getRequiredFilter?: (\r\n search: string,\r\n appSettings?: AppSettings | null,\r\n ) => string | undefined;\r\n assets?: Entity[];\r\n screenName: string;\r\n multiModeDisabled?: boolean;\r\n openAsset: (id: number) => void;\r\n useRecentAssets?: boolean;\r\n RecentAssets?: React.ReactNode;\r\n actionType: AssetActionType;\r\n customPredicates?: (string | Condition)[];\r\n isShortView?: boolean;\r\n emptyTable?: CustomEmptyTableProps;\r\n searchTerm?: string;\r\n}\r\n\r\nexport function AssetsSelectionTable(props: AssetsSelectionTableProps) {\r\n const {\r\n useSidePanel,\r\n authenticatedUser,\r\n setFilters,\r\n isRowSelectable,\r\n getRequiredFilter,\r\n assets,\r\n primaryAction,\r\n primaryMultiAction,\r\n screenName,\r\n multiModeDisabled,\r\n // openAsset,\r\n useRecentAssets,\r\n RecentAssets,\r\n actionType,\r\n customPredicates,\r\n isShortView = false,\r\n emptyTable,\r\n searchTerm,\r\n } = props;\r\n const { t } = useTranslation();\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const showAllCores = useSelector(selectShowAllCores);\r\n const isMobile = DetectIsMobile();\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n\r\n const canExportAssetRanges = IsAssetFieldEnabled(\r\n appSettings,\r\n AssetAttributes.Range,\r\n );\r\n const assetFieldEnabled = React.useCallback(\r\n (AssetField: AssetAttributes): boolean => {\r\n if (isAuthenticated) {\r\n return IsAssetFieldEnabled(appSettings, AssetField);\r\n } else {\r\n return (\r\n IsAssetFieldEnabled(appSettings, AssetField) &&\r\n IsAssetFieldIsPublic(appSettings, AssetField)\r\n );\r\n }\r\n },\r\n [appSettings, isAuthenticated],\r\n );\r\n const searchColumns = React.useMemo(() => {\r\n let result: string[] = [\r\n 'Name',\r\n 'AvailabilityTypeName',\r\n 'DivisionName',\r\n 'ServiceGroupName',\r\n 'InstrumentType',\r\n //'RoomAreaName',\r\n //'InstrumentCatName',\r\n ];\r\n if (assetFieldEnabled(AssetAttributes.Building)) {\r\n result.push('Building');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Room)) {\r\n result.push('Room');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.AssetCat)) {\r\n result.push('AssetCatName');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.LocationsList)) {\r\n result.push('LocationName');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.SubLocationsList)) {\r\n result.push('SubLocationName');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.AssetCatGroup)) {\r\n result.push('AssetCatGroupName');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.POnumber)) {\r\n result.push('POnumber');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.AssetAccessories)) {\r\n result.push('AccessoriesText');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Contacts)) {\r\n result.push('ContactsText');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Experts)) {\r\n result.push('ExpertsText');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Suppliers)) {\r\n result.push('SuppliersText');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.OtherNames)) {\r\n result.push('OtherNames');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Brand)) {\r\n result.push('Brand');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Description)) {\r\n result.push('Description');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ShortDescription)) {\r\n result.push('ShortDescription');\r\n }\r\n\r\n if (assetFieldEnabled(AssetAttributes.ServiceContract)) {\r\n result.push('ServiceContract');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Campus)) {\r\n result.push('Campus');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Tags)) {\r\n result.push('TagsText');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.MainSpecRange)) {\r\n result.push('MainSpecRange');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.AccountingId)) {\r\n result.push('AccountingId');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ModelNumber)) {\r\n result.push('ModelNumber');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.FunctionalCharacteristics)) {\r\n result.push('FunctionalCharacteristics');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.WebLink)) {\r\n result.push('WebLink');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.Model)) {\r\n result.push('Model');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL0)) {\r\n result.push('ExtraDDL0Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL1)) {\r\n result.push('ExtraDDL1Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL2)) {\r\n result.push('ExtraDDL2Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL3)) {\r\n result.push('ExtraDDL3Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL4)) {\r\n result.push('ExtraDDL4Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL5)) {\r\n result.push('ExtraDDL5Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL6)) {\r\n result.push('ExtraDDL6Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL7)) {\r\n result.push('ExtraDDL7Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL8)) {\r\n result.push('ExtraDDL8Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL9)) {\r\n result.push('ExtraDDL9Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL10)) {\r\n result.push('ExtraDDL10Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL11)) {\r\n result.push('ExtraDDL11Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL12)) {\r\n result.push('ExtraDDL12Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL13)) {\r\n result.push('ExtraDDL13Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL14)) {\r\n result.push('ExtraDDL14Value');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL15)) {\r\n result.push('ExtraDDL15Value');\r\n }\r\n return result;\r\n }, [assetFieldEnabled]);\r\n\r\n const additionalColumns = React.useMemo(() => {\r\n let result: string[] = [\r\n 'Id',\r\n 'ServiceId',\r\n 'AvailabilityTypeId',\r\n 'ServiceGroupId',\r\n 'DivisionId',\r\n 'ServiceTypeId',\r\n 'AutoMode',\r\n 'AvailabilityTypeName',\r\n 'TrainingSessionsEnabled',\r\n 'HideProjects',\r\n 'AllowToUser',\r\n 'StaffOnly',\r\n 'AssetCatId',\r\n 'AssetCatGroupId',\r\n 'BuildingId',\r\n 'FloorName',\r\n 'RoomAreaId',\r\n ];\r\n\r\n if (assetFieldEnabled(AssetAttributes.AssetCat)) {\r\n result.push('AssetCatId');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.AssetCatGroup)) {\r\n result.push('AssetCatGroupId');\r\n }\r\n\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL0)) {\r\n result.push('ExtraDDL0');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL1)) {\r\n result.push('ExtraDDL1');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL2)) {\r\n result.push('ExtraDDL2');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL3)) {\r\n result.push('ExtraDDL3');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL4)) {\r\n result.push('ExtraDDL4');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL5)) {\r\n result.push('ExtraDDL5');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL6)) {\r\n result.push('ExtraDDL6');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL7)) {\r\n result.push('ExtraDDL7');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL8)) {\r\n result.push('ExtraDDL8');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL9)) {\r\n result.push('ExtraDDL9');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL10)) {\r\n result.push('ExtraDDL10');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL11)) {\r\n result.push('ExtraDDL11');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL12)) {\r\n result.push('ExtraDDL12');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL13)) {\r\n result.push('ExtraDDL13');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL14)) {\r\n result.push('ExtraDDL14');\r\n }\r\n if (assetFieldEnabled(AssetAttributes.ExtraDDL15)) {\r\n result.push('ExtraDDL15');\r\n }\r\n return result;\r\n }, [assetFieldEnabled]);\r\n const [multiAssetSelectionMode, setMultiAssetSelectionMode] = React.useState<\r\n boolean\r\n >(false);\r\n const [selectedRowIds, setSelectedRowIds] = React.useState<\r\n Record, boolean>\r\n >({});\r\n const [, setCurrentMode, currentModeRef] = useState('card');\r\n const [loacalAssets, setLoacalAssets, localAssetsRef] = useState<\r\n Entity[]\r\n >([]);\r\n React.useEffect(() => {\r\n let obj = {};\r\n if (!!assets && assets.length > 0) {\r\n for (const key of assets) {\r\n obj[key.Id] = true;\r\n }\r\n setMultiAssetSelectionMode(assets.length > 1);\r\n setLoacalAssets(assets);\r\n }\r\n setSelectedRowIds(obj);\r\n }, [assets, setLoacalAssets]);\r\n\r\n function getMyListFilter(search: string, selectedView: SavedViewSelected) {\r\n const result = isEmptyOrWhitespace(search)\r\n ? new URLSearchParams()\r\n : new URLSearchParams(search);\r\n result.set('aid', selectedView.assetIds || '');\r\n const res = result.toString();\r\n return isEmptyOrWhitespace(res) ? undefined : res;\r\n }\r\n\r\n const columns: Column[] = React.useMemo(\r\n () => getColumns(t, authenticatedUser, appSettings, settings),\r\n [t, authenticatedUser, appSettings, settings],\r\n );\r\n const initialState: IBasicTableState = React.useMemo(\r\n () => ({\r\n sortBy: [{ id: 'Name', desc: false }],\r\n selectedRowIds: selectedRowIds,\r\n globalFilter: searchTerm,\r\n }),\r\n [searchTerm, selectedRowIds],\r\n );\r\n // const selectedRowActions: SelectedRowsActionRenderer<\r\n // IMyAssetsRow\r\n // >[] = GetSelectedActions(t, {\r\n // enableSavedLists: false,\r\n // canExport: false,\r\n // canExportAssetRanges: false,\r\n // });\r\n const selectedRowActions: SelectedRowsActionExtRenderer<\r\n IMyAssetsRow\r\n >[] = React.useMemo(() => {\r\n let actions: SelectedRowsActionExtRenderer[] =\r\n loacalAssets.length > 0\r\n ? loacalAssets.map(\r\n sg => (selectedRws, rows, refresh, toggleAll, toggleSingle) => (\r\n f.id === sg.Id.toString()).length > 0\r\n ? undefined\r\n : t(translations.DeleteSelectedCard_info)\r\n }\r\n onDelete={() => {\r\n onSelectChange(\r\n selectedRws.filter(f => f.Id === sg.Id)[0],\r\n false,\r\n );\r\n rows\r\n .filter(f => f.id === sg.Id.toString())\r\n .forEach(f => {\r\n f.toggleRowSelected(false);\r\n });\r\n //toggleSingle(sg.Id.toString(), false);\r\n }}\r\n disabled={\r\n !(rows.filter(f => f.id === sg.Id.toString()).length > 0)\r\n }\r\n // onClick={() => {\r\n // openAsset(sg.Id);\r\n // }}\r\n variant=\"default\"\r\n customsize={isShortView ? 'small' : 'medium'}\r\n label={sg.Name}\r\n customwidth={isShortView ? 100 : 180}\r\n custombgcolor={bookitColors.primary.disabled}\r\n customcolor={bookitColors.grayscale.blackComponents}\r\n customiconcolor={bookitColors.grayscale.blackComponents}\r\n shape=\"circle\"\r\n key={sg.Id}\r\n />\r\n ),\r\n )\r\n : [];\r\n return actions;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isShortView, loacalAssets]);\r\n\r\n const selectedRowDefaultActions: SelectedRowsActionRenderer<\r\n IMyAssetsRow\r\n >[] = GetSelectedActions(t, {\r\n enableSavedLists: isAuthenticated,\r\n canExportAssetRanges: canExportAssetRanges,\r\n isShowAllCores: showAllCores,\r\n authenticatedUser: authenticatedUser,\r\n useSidePanel: useSidePanel,\r\n });\r\n const handleRowsChange = (rows: Row[]) => {\r\n let selectable = rows.map(f => {\r\n return {\r\n Id: f.original.Id,\r\n Name: f.original.Name,\r\n } as Entity;\r\n });\r\n setLoacalAssets(selectable);\r\n };\r\n const toggleAllRows = (rows: Row[], checked: boolean) => {\r\n if (checked) {\r\n handleRowsChange(rows);\r\n } else {\r\n handleRowsChange([]);\r\n }\r\n };\r\n const handleSingleChange = React.useCallback(\r\n (value: Entity, added: boolean) => {\r\n if (added) {\r\n if (\r\n !!localAssetsRef.current &&\r\n localAssetsRef.current.length + 1 >\r\n (currentModeRef.current === 'card' ? 0 : 0)\r\n ) {\r\n setMultiAssetSelectionMode(true);\r\n }\r\n setLoacalAssets(oldAssets => [\r\n ...oldAssets,\r\n {\r\n Id: value.Id,\r\n Name: value.Name,\r\n } as Entity,\r\n ]);\r\n } else {\r\n if (\r\n !!localAssetsRef.current &&\r\n localAssetsRef.current.length - 1 <\r\n (currentModeRef.current === 'card' ? 1 : 1)\r\n ) {\r\n setMultiAssetSelectionMode(false);\r\n }\r\n setLoacalAssets(oldAssets => {\r\n let newAsset = oldAssets.filter(ass => ass.Id !== value.Id);\r\n return newAsset;\r\n });\r\n }\r\n },\r\n [currentModeRef, localAssetsRef, setLoacalAssets],\r\n );\r\n const onSelectChange = React.useCallback(\r\n (row: IMyAssetsRow, checked: boolean) => {\r\n handleSingleChange(\r\n {\r\n Id: row.Id,\r\n Name: row.Name,\r\n } as Entity,\r\n checked,\r\n );\r\n },\r\n [handleSingleChange],\r\n );\r\n const customFilter = React.useMemo(() => {\r\n let filter: (string | Condition)[] = customPredicates ?? [];\r\n if (actionType === 'StartUsage') {\r\n filter.push(\r\n new Condition('AutoMode', ODataOperators.Equals, 1),\r\n );\r\n }\r\n if (actionType === 'TrainingSession') {\r\n filter.push(\r\n new Condition(\r\n 'TrainingSessionsEnabled',\r\n ODataOperators.Equals,\r\n true,\r\n ),\r\n );\r\n }\r\n return filter.length > 0 ? filter : undefined;\r\n }, [actionType, customPredicates]);\r\n const useFloatingActions = React.useMemo(() => {\r\n return multiAssetSelectionMode\r\n ? loacalAssets.length > 0\r\n : loacalAssets.length > 1;\r\n }, [loacalAssets.length, multiAssetSelectionMode]);\r\n\r\n const url = '/api/odata/v4/MyAssets';\r\n const { serviceGroups } = useGlobalServiceGroupsFilter(!showAllCores);\r\n const TTable = React.useMemo(\r\n () =>\r\n filterHandler(BasicTable, GetFilters, {\r\n isSidePanel: useSidePanel,\r\n setFilters: setFilters,\r\n reservedQueryStringParameterNames: ['active'],\r\n getDefaultFilter: DefaultFilter,\r\n getRequiredFilter: getRequiredFilter,\r\n getSelectedViewFilter: getMyListFilter,\r\n enableSavedLists: true,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [useSidePanel],\r\n );\r\n return (\r\n \r\n setCurrentMode(mode === true ? 'card' : 'table')}\r\n primaryAction={row => {\r\n let canSwitch = isRowSelectable(row);\r\n if (!multiAssetSelectionMode) {\r\n if (canSwitch) {\r\n primaryAction?.(row);\r\n }\r\n } else {\r\n if (canSwitch) {\r\n row.toggleRowSelected(!row.isSelected);\r\n onSelectChange(row.original, !row.isSelected);\r\n }\r\n }\r\n }}\r\n savedListSettings={{\r\n enableSavedLists: isAuthenticated,\r\n savedListRelatedPickerName: 'Id',\r\n savedListSerializedKey: 'aid',\r\n listViewbyAsset: true,\r\n }}\r\n useConfigurable={actionType === 'AssetSearch'}\r\n useCardsByDefault={true}\r\n selectedRowsActions={\r\n actionType === 'AssetSearch' ? selectedRowDefaultActions : undefined\r\n }\r\n floatingTabSettings={{\r\n useFloatingActions:\r\n useFloatingActions && actionType !== 'AssetSearch',\r\n selectedFloatingActions: selectedRowActions,\r\n buttonFloatingActions: [\r\n rows => (\r\n {\r\n primaryMultiAction(rows);\r\n }}\r\n >\r\n {isShortView ? 'Continue' : 'Continue with Selected'}\r\n \r\n ),\r\n ],\r\n useSidePanel: useSidePanel,\r\n }}\r\n //pageActions={pageActions}\r\n useRowSelect={true}\r\n withToolBar={false}\r\n customEmptyTableSettings={emptyTable}\r\n tabSectionSettings={{\r\n useTabsSection: isAuthenticated,\r\n getMultiMode: value => setMultiAssetSelectionMode(value),\r\n selectedTabValue: undefined,\r\n onAllRowsSelected: toggleAllRows,\r\n disableMultiMode: multiModeDisabled,\r\n defaultMultiMode: !multiModeDisabled,\r\n // defaultMultiMode:\r\n // multiAssetSelectionMode === true ||\r\n // (!!localAssetsRef.current && localAssetsRef.current.length > 0),\r\n }}\r\n customToolbarSettings={{\r\n useCustomToolbar: useRecentAssets,\r\n CustomToolbar: RecentAssets,\r\n }}\r\n predicates={customFilter}\r\n preventInnerClicks={isMobile}\r\n />\r\n \r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer } from 'utils/redux-injectors';\r\nimport { AssetsSelectionState } from './types';\r\n\r\nexport const initialState: AssetsSelectionState = {\r\n filters: undefined,\r\n loading: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'assetsSelection',\r\n initialState,\r\n reducers: {\r\n setFilters(state, action: PayloadAction | undefined>) {\r\n state.filters = action.payload;\r\n },\r\n setLoading(state, action: PayloadAction) {\r\n state.loading = action.payload;\r\n },\r\n reset(state, action: PayloadAction) {\r\n state.filters = undefined;\r\n state.loading = undefined;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: assetsSelectionActions } = slice;\r\n\r\nexport const useAssetsSelectionSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n // useInjectSaga({ key: slice.name, saga: assetsSelectionSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useAssetsSelectionSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.assetsSelection || initialState;\r\n\r\nexport const selectAssetsSelection = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n\r\nexport const selectAssetsSelectionLoading = createSelector(\r\n [selectAssetsSelection],\r\n state => state.loading,\r\n);\r\n\r\nexport const selectAssetsSelectionFilters = createSelector(\r\n [selectAssetsSelection],\r\n state => state.filters,\r\n);\r\n","import { Box, Collapse, useTheme } from '@material-ui/core';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { AssetQuickSearchDetails } from 'app/components/AssetQuickSearch/slice/types';\r\nimport { getAssetImageThumbSrc } from 'app/components/AssetThumbImage/getAssetImageSrc';\r\nimport { Body } from 'app/components/Typography';\r\nimport { BasicCard } from 'app/components/BasicCards';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { AssetActionType } from './AssetsSelection';\r\nimport * as React from 'react';\r\nimport { IsAssetImageExist } from 'types/AppSettings';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectAppSettings } from 'app/slice/selectors';\r\nimport styled from 'styled-components';\r\nimport clsx from 'clsx';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\n\r\nexport interface RecentAssetsProps {\r\n actionType: AssetActionType;\r\n primaryAction?: (row: AssetQuickSearchDetails) => void;\r\n useSidePanel?: boolean;\r\n shortView?: boolean;\r\n}\r\nconst RecentContent = styled('div')(({ theme }) => ({\r\n '&.recentRoot': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n gap: 16,\r\n '& .recentTitle': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n gap: 8,\r\n },\r\n '& .recentContainer': {\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: '32px',\r\n '&.recentShort': {\r\n flexDirection: 'column',\r\n alignItems: 'start',\r\n gap: '16px',\r\n '& .recentItem': {\r\n flex: '1 1 100%',\r\n maxWidth: '100%',\r\n width: '100%',\r\n '& .nameOverRule': {\r\n maxWidth: '25ch',\r\n },\r\n },\r\n },\r\n '& .recentItem': {\r\n flex: '1 1 10%',\r\n borderRadius: 8,\r\n width: 0,\r\n minWidth: '256px',\r\n maxWidth: '360px',\r\n '& .nameOverRule': {\r\n display: 'inline-block',\r\n whiteSpace: 'pre',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: '30ch',\r\n // [theme.breakpoints.down('sm')]: {\r\n // maxWidth: '25ch',\r\n // },\r\n },\r\n },\r\n },\r\n },\r\n}));\r\nexport function RecentAssets(props: RecentAssetsProps) {\r\n const { actionType, primaryAction, shortView } = props;\r\n const isMobile = DetectIsMobile();\r\n const appSettings = useSelector(selectAppSettings);\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n const [collapseOpen, setCollapseOpen] = React.useState(\r\n shortView ? false : true,\r\n );\r\n React.useEffect(() => {\r\n setCollapseOpen(shortView ? false : true);\r\n }, [shortView]);\r\n const fetchRecentAssets = async (\r\n type: AssetActionType,\r\n ): Promise => {\r\n let url =\r\n actionType === 'WorkOrder'\r\n ? '/api/assets/recentReported?top=5'\r\n : actionType === 'StartUsage'\r\n ? '/api/assets/recentUsed?top=5'\r\n : '/api/assets/recentBook?top=5';\r\n return new Promise(async resolve => {\r\n try {\r\n const data = await httpClient.get(url);\r\n let result = data as AssetQuickSearchDetails[];\r\n if (data.length > 0) {\r\n resolve(result);\r\n } else {\r\n resolve([] as AssetQuickSearchDetails[]);\r\n }\r\n } catch {\r\n resolve([] as AssetQuickSearchDetails[]);\r\n }\r\n });\r\n };\r\n const [recentAssets, setRecentAssets] = useAsyncExtendedState<\r\n AssetQuickSearchDetails[]\r\n >([]);\r\n const [fetchRecentAssetsState, fetchRecentAssetsPromise] = usePromise(\r\n fetchRecentAssets,\r\n );\r\n useEffectOnMount(() => {\r\n setRecentAssets(fetchRecentAssetsPromise(actionType));\r\n });\r\n return recentAssets.length > 0 &&\r\n fetchRecentAssetsState.status === 'resolved' ? (\r\n \r\n
    \r\n \r\n \r\n {t(translations.RecentAssets)}\r\n \r\n setCollapseOpen(previousState => !previousState)}\r\n >\r\n \r\n \r\n
    \r\n \r\n \r\n {recentAssets.map(item => {\r\n return (\r\n
    \r\n \r\n \r\n {item.Name}\r\n \r\n \r\n }\r\n imageSrc={getAssetImageThumbSrc(\r\n item.Image || null,\r\n 'thumb',\r\n IsAssetImageExist(appSettings, item.Image || null, 'thumb'),\r\n )}\r\n useImage={true}\r\n maxContentHeight={20}\r\n useButtons={false}\r\n primaryAction={() => !!primaryAction && primaryAction(item)}\r\n backStyle=\"white\"\r\n />\r\n
    \r\n );\r\n })}\r\n
    \r\n \r\n \r\n ) : (\r\n <>\r\n );\r\n}\r\n","import { AssetQuickSearchDetails } from 'app/components/AssetQuickSearch/slice/types';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { toURLSearchParams } from 'app/components/BasicTable/withSavedHistory';\r\nimport { initAssetsData } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { CreateNewRequest } from 'app/pages/ServiceRequestListPage/CreateNewRequest';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectIsAuthenticated,\r\n selectPublicUrl,\r\n selectShowAllCores,\r\n} from 'app/slice/selectors';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Row } from 'react-table';\r\nimport { Entity } from 'types/common';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\nimport { buildURL } from 'utils/url-utils';\r\nimport { getRequiredFilter } from '../DefaultFilter';\r\nimport { IMyAssetsRow } from '../IMyAssetsRow';\r\nimport { AssetsSelectionTable } from './AssetsSelectionTable';\r\nimport { useAssetsSelectionSlice } from './slice';\r\nimport { selectAssetsSelectionFilters } from './slice/selectors';\r\nimport { useAddNewActions } from './useAddNewActions';\r\nimport { RecentAssets } from './RecentAssets';\r\nimport { useSchedulerSlice } from 'app/pages/CalendarPage/Scheduler/slice';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { CustomEmptyTableProps } from 'app/components/BasicTable/components/CustomEmptyTable';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { BasicToggle } from 'app/components/BasicToggle';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { Roles } from 'app/slice/types';\r\nimport { AdminActions } from 'app/components/Admin/AdminActions';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\n\r\nexport type AssetActionType =\r\n | 'Reservation'\r\n | 'WorkOrder'\r\n | 'OfflineService'\r\n | 'Request'\r\n | 'StartUsage'\r\n | 'TrainingSession'\r\n | 'AssetSearch';\r\nexport interface AssetsSelectionProps\r\n extends CoverProps,\r\n SidePanelContentProps {\r\n assetIds?: number[];\r\n serviceIds?: number[];\r\n offTypeIds?: number[];\r\n requestTypeIds?: number[];\r\n actionType?: AssetActionType;\r\n customPredicates?: (string | Condition)[];\r\n pageLink?: string;\r\n onClose?: () => void;\r\n useCustomFilter?: boolean;\r\n customAppliedFilters?: IFilterSettings[];\r\n customAvailableFilters?: IFilterSettings[];\r\n customFilterChange?: (items: IFilterSettings[]) => void;\r\n serviceTypeId?: number;\r\n assetCatId?: number;\r\n assetCatGroupId?: number;\r\n searchTerm?: string;\r\n hideCoresToggle?: boolean;\r\n}\r\n\r\nexport function AssetsSelection(props: AssetsSelectionProps) {\r\n const {\r\n useSidePanel,\r\n actionType = 'AssetSearch',\r\n assetIds,\r\n serviceIds,\r\n offTypeIds,\r\n requestTypeIds,\r\n customPredicates,\r\n onClose,\r\n serviceTypeId,\r\n searchTerm,\r\n hideCoresToggle,\r\n assetCatId,\r\n assetCatGroupId,\r\n closeCover,\r\n // useCustomFilter,\r\n // customAppliedFilters,\r\n // customAvailableFilters,\r\n // customFilterChange\r\n } = props;\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n const filters = useSelector(selectAssetsSelectionFilters);\r\n const showAllCores = useSelector(selectShowAllCores);\r\n //const hideNavigation = useSelector(selectHideNavigation);\r\n const dispatch = useDispatch();\r\n const { actions } = useAssetsSelectionSlice();\r\n const { t } = useTranslation();\r\n const { actions: appSettingsAction } = useAppSettingsSlice();\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const isMobile = DetectIsMobile();\r\n // const [cover, setCover] = React.useState();\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState();\r\n const [openRequest, setOpenRequest] = React.useState(\r\n undefined,\r\n );\r\n const [requestId, setRequestId] = React.useState(\r\n undefined,\r\n );\r\n const [selectedAssets, setSelectedAssets] = React.useState[]>(\r\n [],\r\n );\r\n const showShortView =\r\n isMobile || (useSidePanel && !sidePanelExpanded) || props.isCover;\r\n const { actions: schedActions } = useSchedulerSlice();\r\n // const multipleMode = useSelector(selectMultipleModeState);\r\n const pagelink = React.useMemo(\r\n () =>\r\n !!props.pageLink\r\n ? props.pageLink\r\n : buildURL(\r\n `${publicUrl}AssetSearch`,\r\n Object.assign({}, filters, {\r\n serviceTypeId: serviceTypeId,\r\n searchTerm: searchTerm,\r\n actionType: actionType,\r\n AssetCatGroupId: assetCatGroupId,\r\n AssetCatId: assetCatId,\r\n }),\r\n ),\r\n [\r\n actionType,\r\n assetCatGroupId,\r\n assetCatId,\r\n filters,\r\n props.pageLink,\r\n publicUrl,\r\n searchTerm,\r\n serviceTypeId,\r\n ],\r\n );\r\n // const closeCover = () => {\r\n // setCover(undefined);\r\n // };\r\n\r\n const closeSidePanel = React.useCallback(() => {\r\n closePanel({\r\n isCover: props.isCover,\r\n useSidePanel: true,\r\n onClose: () => {\r\n if (hideCoresToggle) {\r\n dispatch(appSettingsAction.setShowAllCores(false));\r\n }\r\n },\r\n } as SidePanelCloseState);\r\n // if (props.isCover) {\r\n // if (!!onClose) {\r\n // onClose();\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // }\r\n // if (hideCoresToggle) {\r\n // dispatch(appSettingsAction.setShowAllCores(false));\r\n // }\r\n // } else {\r\n // dispatch(layoutActions.resetSidePanel());\r\n // if (hideCoresToggle) {\r\n // dispatch(appSettingsAction.setShowAllCores(false));\r\n // }\r\n // }\r\n }, [appSettingsAction, closePanel, dispatch, hideCoresToggle, props.isCover]);\r\n const openAsset = React.useCallback(\r\n (id: number) => {\r\n let assetProps = {\r\n Id: id,\r\n showAllCores: showAllCores,\r\n useSidePanel: true,\r\n };\r\n openPanel({\r\n renderPageType: RenderPageType.AssetDetails,\r\n renderPageProps: assetProps,\r\n expanded: false,\r\n useSidePanel: true,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [openPanel, showAllCores, useSidePanel],\r\n );\r\n // const saveCalendarMultiMode = React.useCallback((value: boolean) => {\r\n // dispatch(\r\n // appSettingsAction.updateUserProfileSettings({\r\n // key: 'BookMultipleInstruments',\r\n // model: {\r\n // UserName: authenticatedUser?.Id,\r\n // Key: 'BookMultipleInstruments',\r\n // IsMultiple: value,\r\n // } as UserProfileSettings,\r\n // }),\r\n // );\r\n // }, [appSettingsAction, authenticatedUser?.Id, dispatch]);\r\n const IsAdmin = React.useCallback(\r\n (asset: IMyAssetsRow) => {\r\n return isAuthenticated\r\n ? authenticatedUser?.IsAllGroupOrLabTechAdmin(\r\n [asset.ServiceGroupId ?? 0],\r\n [\r\n {\r\n Id: asset.ServiceId,\r\n Name: asset.Name,\r\n ServiceTypeId: asset.ServiceTypeId,\r\n } as IServiceTypeFilterDto,\r\n ],\r\n )\r\n : false;\r\n },\r\n [isAuthenticated, authenticatedUser],\r\n );\r\n const isRowSelectable = (row: Row): boolean => {\r\n if (actionType === 'OfflineService') {\r\n return (\r\n IsAdmin(row.original) ||\r\n (row.original.AllowToUser === true && row.original.StaffOnly !== true)\r\n );\r\n }\r\n return true;\r\n };\r\n const {\r\n createOffline,\r\n createReservation,\r\n createWorkOrder,\r\n startUsage,\r\n addTrainingSession,\r\n } = useAddNewActions();\r\n const allowMultiToggle = React.useMemo(() => {\r\n switch (actionType) {\r\n case 'Reservation':\r\n case 'WorkOrder':\r\n case 'OfflineService':\r\n return true;\r\n case 'Request':\r\n case 'StartUsage':\r\n case 'TrainingSession':\r\n case 'AssetSearch':\r\n default:\r\n return false;\r\n }\r\n }, [actionType]);\r\n const allowAllCoresToggle = React.useMemo(() => {\r\n switch (actionType) {\r\n case 'AssetSearch':\r\n return !hideCoresToggle;\r\n case 'Request':\r\n case 'StartUsage':\r\n case 'TrainingSession':\r\n case 'Reservation':\r\n case 'WorkOrder':\r\n case 'OfflineService':\r\n default:\r\n return false;\r\n }\r\n }, [actionType, hideCoresToggle]);\r\n const setfilterCallback = React.useCallback(\r\n (v: IFilterSettings[] | undefined) => {\r\n const res = {};\r\n if (!!v) {\r\n toURLSearchParams(v).forEach((val, name) => {\r\n res[name] = val;\r\n });\r\n }\r\n dispatch(actions.setFilters(!v || v.length === 0 ? undefined : res));\r\n },\r\n [actions, dispatch],\r\n );\r\n const availabilityTypesArray = React.useMemo(() => {\r\n switch (actionType) {\r\n case 'Reservation':\r\n case 'StartUsage':\r\n return [\r\n AvailabilityTypes.FreelyBookable as number,\r\n AvailabilityTypes.TrainingProgram as number,\r\n AvailabilityTypes.LoanableEquipment as number,\r\n AvailabilityTypes.LectureRoom as number,\r\n ];\r\n case 'OfflineService':\r\n return [AvailabilityTypes.ServiceRelated as number];\r\n case 'Request':\r\n return [AvailabilityTypes.RequestRelated as number];\r\n case 'WorkOrder':\r\n return [\r\n AvailabilityTypes.FreelyBookable as number,\r\n AvailabilityTypes.TrainingProgram as number,\r\n AvailabilityTypes.LoanableEquipment as number,\r\n AvailabilityTypes.LectureRoom as number,\r\n AvailabilityTypes.ServiceRelated as number,\r\n AvailabilityTypes.RequestRelated as number,\r\n ];\r\n case 'TrainingSession':\r\n return [\r\n AvailabilityTypes.FreelyBookable as number,\r\n AvailabilityTypes.TrainingProgram as number,\r\n AvailabilityTypes.LoanableEquipment as number,\r\n AvailabilityTypes.LectureRoom as number,\r\n ];\r\n // case 'AssetSearch':\r\n // if (!!serviceTypeId) {\r\n // switch (serviceTypeId) {\r\n // case ServiceType.Online:\r\n // return [\r\n // AvailabilityTypes.FreelyBookableBillable as number,\r\n // AvailabilityTypes.ApprovalRequiredBillable as number,\r\n // AvailabilityTypes.FreelyBookable as number,\r\n // AvailabilityTypes.BookableWApproval as number,\r\n // AvailabilityTypes.TrainingProgram as number,\r\n // AvailabilityTypes.LoanableEquipment as number,\r\n // AvailabilityTypes.LectureRoom as number,\r\n // ];\r\n // case ServiceType.Offline:\r\n // return [AvailabilityTypes.ServiceRelated as number];\r\n // case ServiceType.Sample:\r\n // return [AvailabilityTypes.RequestRelated as number];\r\n // default:\r\n // return [];\r\n // }\r\n // }\r\n // return [];\r\n default:\r\n return [];\r\n }\r\n }, [actionType]);\r\n const screenName = React.useMemo(() => {\r\n switch (actionType) {\r\n case 'Reservation':\r\n return t(translations.CreateReservation) as string;\r\n case 'StartUsage':\r\n return t(translations.StartUsage) as string;\r\n case 'OfflineService':\r\n return t(translations.SelectConsumables) as string;\r\n case 'Request':\r\n return t(translations.CreateRequest) as string;\r\n case 'WorkOrder':\r\n return t(translations.CreateAWorkOrder) as string;\r\n case 'TrainingSession':\r\n return t(translations.AddTrainingSession);\r\n case 'AssetSearch':\r\n return t(translations.InstrumentAssetSearch) as string;\r\n default:\r\n return t(translations.CreateReservation) as string;\r\n }\r\n }, [actionType, t]);\r\n const noTableData = React.useMemo(() => {\r\n switch (actionType) {\r\n case 'OfflineService':\r\n return {\r\n headTitle: t(translations.NoConsumablesHeadTitle) as string,\r\n title: t(translations.NoConsumablesTitle) as string,\r\n } as CustomEmptyTableProps;\r\n case 'Reservation':\r\n case 'StartUsage':\r\n case 'Request':\r\n case 'WorkOrder':\r\n case 'TrainingSession':\r\n default:\r\n return undefined;\r\n }\r\n }, [actionType, t]);\r\n const requiredFilter = (search: string) => {\r\n const result = new URLSearchParams(getRequiredFilter(search));\r\n if (availabilityTypesArray.length > 0) {\r\n if (\r\n result.has('AvailabilityTypeId') === false ||\r\n result.get('AvailabilityTypeId') === null ||\r\n result.get('AvailabilityTypeId') === ''\r\n ) {\r\n result.set('AvailabilityTypeId', availabilityTypesArray.join('|'));\r\n }\r\n }\r\n if (!!serviceTypeId) {\r\n if (\r\n result.has('stid') === false ||\r\n result.get('stid') === null ||\r\n result.get('stid') === ''\r\n ) {\r\n result.set('stid', serviceTypeId.toString());\r\n }\r\n }\r\n const res = result.toString();\r\n return isEmptyOrWhitespace(res) ? undefined : res;\r\n };\r\n const primaryRecentAction = React.useCallback(\r\n (row: AssetQuickSearchDetails) => {\r\n if (actionType === 'Reservation') {\r\n dispatch(schedActions.updateMultiMode(false));\r\n setTimeout(\r\n () =>\r\n createReservation(row.ServiceId !== null ? [row.ServiceId] : []),\r\n 10,\r\n );\r\n if (useSidePanel) {\r\n closeSidePanel();\r\n }\r\n } else if (actionType === 'WorkOrder') {\r\n createWorkOrder([row.Id], useSidePanel);\r\n if (useSidePanel) {\r\n closeSidePanel();\r\n }\r\n } else if (actionType === 'StartUsage') {\r\n startUsage(row.ServiceId ?? 0);\r\n if (useSidePanel) {\r\n closeSidePanel();\r\n }\r\n } else if (actionType === 'AssetSearch') {\r\n openAsset(row.Id);\r\n }\r\n },\r\n [\r\n actionType,\r\n closeSidePanel,\r\n createReservation,\r\n createWorkOrder,\r\n dispatch,\r\n openAsset,\r\n schedActions,\r\n startUsage,\r\n useSidePanel,\r\n ],\r\n );\r\n const primaryAction = React.useCallback(\r\n (row: Row) => {\r\n if (\r\n availabilityTypesArray.includes(row.original.AvailabilityTypeId) ||\r\n actionType === 'AssetSearch'\r\n ) {\r\n if (useSidePanel && !(actionType === 'AssetSearch')) {\r\n closeSidePanel();\r\n }\r\n switch (actionType) {\r\n case 'Reservation':\r\n dispatch(schedActions.updateMultiMode(false));\r\n setTimeout(\r\n () =>\r\n createReservation(\r\n row.original.ServiceId !== null\r\n ? [row.original.ServiceId]\r\n : [],\r\n ),\r\n 10,\r\n );\r\n break;\r\n case 'OfflineService':\r\n createOffline(\r\n row.original.ServiceId !== null ? [row.original.ServiceId] : [],\r\n false,\r\n );\r\n break;\r\n case 'StartUsage':\r\n startUsage(row.original.ServiceId ?? 0);\r\n break;\r\n case 'WorkOrder':\r\n createWorkOrder([row.original.Id], useSidePanel);\r\n break;\r\n case 'Request':\r\n setRequestId(row.original.ServiceId ?? undefined);\r\n setOpenRequest(true);\r\n break;\r\n case 'TrainingSession':\r\n addTrainingSession(row.original.ServiceId as number);\r\n break;\r\n case 'AssetSearch':\r\n openAsset(row.original.Id);\r\n break;\r\n }\r\n } else {\r\n dispatch(\r\n appSettingsAction.addNotification({\r\n key: 'availability_error',\r\n message: `Can not perform this action for resource with Availability Type ${row.original.AvailabilityTypeName}.\r\n Please change filters and try again.`,\r\n variant: 'error',\r\n persist: true,\r\n }),\r\n );\r\n }\r\n },\r\n [\r\n actionType,\r\n addTrainingSession,\r\n appSettingsAction,\r\n availabilityTypesArray,\r\n closeSidePanel,\r\n createOffline,\r\n createReservation,\r\n createWorkOrder,\r\n dispatch,\r\n openAsset,\r\n schedActions,\r\n startUsage,\r\n useSidePanel,\r\n ],\r\n );\r\n const primaryMultiAction = React.useCallback(\r\n (rows: IMyAssetsRow[]) => {\r\n if (\r\n !rows.some(f => availabilityTypesArray.includes(f.AvailabilityTypeId))\r\n ) {\r\n let notAvailable = rows\r\n .filter(f => !availabilityTypesArray.includes(f.AvailabilityTypeId))\r\n .map(f => f.AvailabilityTypeName);\r\n dispatch(\r\n appSettingsAction.addNotification({\r\n key: 'availability_error',\r\n message: `Can not perform this action for resources with Availability Type ${notAvailable.join(\r\n `, `,\r\n )}.\r\n Please change filters and try again.`,\r\n variant: 'error',\r\n persist: true,\r\n }),\r\n );\r\n } else {\r\n switch (actionType) {\r\n case 'Reservation':\r\n dispatch(schedActions.updateMultiMode(true));\r\n setTimeout(\r\n () =>\r\n createReservation(\r\n rows.map(f => f.ServiceId ?? 0).filter(f => f > 0),\r\n true,\r\n ),\r\n 10,\r\n );\r\n break;\r\n case 'OfflineService':\r\n //if (rows.length === 1) {\r\n createOffline(\r\n rows.map(f => f.ServiceId ?? 0).filter(f => f > 0),\r\n true,\r\n );\r\n // } else {\r\n // dispatch(\r\n // appSettingsAction.addNotification({\r\n // key: 'multiSelect_error',\r\n // message:\r\n // 'Can not perform this action for multiple services. Please select only one sevice and try again.',\r\n // variant: 'error',\r\n // }),\r\n // );\r\n // }\r\n break;\r\n case 'StartUsage':\r\n if (rows.length === 1) {\r\n startUsage(rows[0].ServiceId ?? 0);\r\n } else {\r\n dispatch(\r\n appSettingsAction.addNotification({\r\n key: 'multiSelect_error',\r\n message:\r\n 'Can not perform this action for multiple services. Please select only one sevice and try again.',\r\n variant: 'error',\r\n }),\r\n );\r\n }\r\n break;\r\n case 'TrainingSession':\r\n if (rows.length === 1) {\r\n addTrainingSession(rows[0].ServiceId ?? 0);\r\n } else {\r\n dispatch(\r\n appSettingsAction.addNotification({\r\n key: 'multiSelect_error',\r\n message:\r\n 'Can not perform this action for multiple services. Please select only one sevice and try again.',\r\n variant: 'error',\r\n }),\r\n );\r\n }\r\n break;\r\n case 'WorkOrder':\r\n createWorkOrder(\r\n rows.map(f => f.Id),\r\n useSidePanel,\r\n );\r\n break;\r\n case 'Request':\r\n if (rows.length === 1) {\r\n setRequestId(rows[0].ServiceId ?? undefined);\r\n setOpenRequest(true);\r\n } else {\r\n dispatch(\r\n appSettingsAction.addNotification({\r\n key: 'multiSelect_error',\r\n message:\r\n 'Can not perform this action for multiple services. Please select only one sevice and try again.',\r\n variant: 'error',\r\n }),\r\n );\r\n }\r\n break;\r\n }\r\n if (useSidePanel) {\r\n closeSidePanel();\r\n }\r\n }\r\n },\r\n [\r\n actionType,\r\n addTrainingSession,\r\n appSettingsAction,\r\n availabilityTypesArray,\r\n closeSidePanel,\r\n createOffline,\r\n createReservation,\r\n createWorkOrder,\r\n dispatch,\r\n schedActions,\r\n startUsage,\r\n useSidePanel,\r\n ],\r\n );\r\n const handleSearchAllCores = React.useCallback(\r\n (value: boolean) => {\r\n dispatch(appSettingsAction.setShowAllCores(value));\r\n //dispatch(layoutActions.setRefreshTable(true));\r\n },\r\n [appSettingsAction, dispatch],\r\n );\r\n const multiModeDisabled = React.useMemo(() => {\r\n switch (actionType) {\r\n case 'Reservation':\r\n case 'WorkOrder':\r\n case 'TrainingSession':\r\n case 'OfflineService':\r\n case 'AssetSearch':\r\n return false;\r\n\r\n case 'Request':\r\n case 'StartUsage':\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }, [actionType]);\r\n const useRecentAssets = React.useMemo(() => {\r\n switch (actionType) {\r\n case 'Reservation':\r\n case 'StartUsage':\r\n case 'WorkOrder':\r\n return !isMobile;\r\n case 'OfflineService':\r\n case 'Request':\r\n case 'TrainingSession':\r\n case 'AssetSearch':\r\n default:\r\n return false;\r\n }\r\n }, [actionType, isMobile]);\r\n const pageActions: ActionRenderer[] = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n if (allowAllCoresToggle) {\r\n actions.push(() => (\r\n handleSearchAllCores(value)}\r\n />\r\n ));\r\n }\r\n\r\n if (\r\n !isMobile &&\r\n actionType === 'AssetSearch' &&\r\n !!authenticatedUser &&\r\n (authenticatedUser.Roles.includes(Roles.Administrators) ||\r\n authenticatedUser.Roles.includes(Roles.GroupAdministrators))\r\n ) {\r\n actions.push(() => (\r\n \r\n ));\r\n }\r\n return actions;\r\n }, [\r\n actionType,\r\n allowAllCoresToggle,\r\n authenticatedUser,\r\n handleSearchAllCores,\r\n isMobile,\r\n showAllCores,\r\n t,\r\n ]);\r\n useEffectOnMount(() => {\r\n //dispatch(layoutActions.setUpSnackBarIndex(true));\r\n if (!!assetIds && assetIds.length > 0) {\r\n (async () => {\r\n try {\r\n const data = await initAssetsData(assetIds.join(','), false);\r\n setSelectedAssets(\r\n data.map(f => {\r\n return { Id: f.Id, Name: f.Name };\r\n }),\r\n );\r\n } catch {}\r\n })();\r\n } else if (!!serviceIds && serviceIds.length > 0) {\r\n (async () => {\r\n try {\r\n const data = await initAssetsData(serviceIds.join(','), true);\r\n setSelectedAssets(\r\n data.map(f => {\r\n return { Id: f.Id, Name: f.Name };\r\n }),\r\n );\r\n } catch {}\r\n })();\r\n } else if (!!offTypeIds && offTypeIds.length > 0) {\r\n (async () => {\r\n try {\r\n const data = await initAssetsData(offTypeIds.join(','), true, [\r\n { Id: 2 },\r\n ]);\r\n setSelectedAssets(\r\n data.map(f => {\r\n return { Id: f.Id, Name: f.Name };\r\n }),\r\n );\r\n } catch {}\r\n })();\r\n } else if (!!requestTypeIds && requestTypeIds.length > 0) {\r\n (async () => {\r\n try {\r\n const data = await initAssetsData(requestTypeIds.join(','), true, [\r\n { Id: 3 },\r\n ]);\r\n setSelectedAssets(\r\n data.map(f => {\r\n return { Id: f.Id, Name: f.Name };\r\n }),\r\n );\r\n } catch {}\r\n })();\r\n }\r\n return () => {\r\n //dispatch(layoutActions.setUpSnackBarIndex(false));\r\n };\r\n });\r\n return (\r\n {t(translations.menu_CoreSelection)}}\r\n titlePage={t(translations.menu_MyInstrumentsAssets)}\r\n closable={useSidePanel || props.isCover}\r\n //disableExpandToggle={true}\r\n //rightTopActions={topButtons}\r\n isCover={props.isCover}\r\n coverClosed={coverClosed}\r\n hideTitleBar={false}\r\n cover={cover}\r\n closeCover={!props.isCover ? onCloseCover : closeCover}\r\n closeSidePanel={props.isCover ? onClose : undefined}\r\n leftTopActions={pageActions}\r\n children={\r\n \r\n \r\n }\r\n actionType={actionType}\r\n />\r\n \r\n \r\n }\r\n />\r\n );\r\n}\r\n","import { useDispatch, useSelector } from 'react-redux';\r\nimport * as React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { toQueryString, toRootedURL } from 'utils/url-utils';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { WorkOrderQueryStringParameters } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/types';\r\nimport { WorkOrderDetailsProps } from 'app/pages/WorkOrders/WorkOrderDetailsPage/Details';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { selectGlobalDbSetting_EnableLegacyScheduler } from 'app/slice/globalDbSettingsSelectors';\r\nimport { useOfflineServiceStateSlice } from 'app/pages/OtherServiceDetails/Details/slice';\r\n\r\nexport function useAddNewActions() {\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const { newDate } = useSystemDate();\r\n const isMobile = DetectIsMobile();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: offActions } = useOfflineServiceStateSlice();\r\n const EnableLegacyScheduler = useSelector(\r\n selectGlobalDbSetting_EnableLegacyScheduler,\r\n );\r\n\r\n const createReservation = React.useCallback(\r\n (services: number[], multiple?: boolean) => {\r\n if (EnableLegacyScheduler) {\r\n window.open(\r\n toRootedURL('/Reservation.aspx', {\r\n id: services.join(','),\r\n }),\r\n '_blank',\r\n );\r\n return;\r\n }\r\n history.push(\r\n `/schedule/calendar?${toQueryString({\r\n eid: services.join(','),\r\n period: getPeriodTypesEntity(\r\n isMobile ? 'Today' : 'ThisWeek',\r\n ).Id.toString(),\r\n openToBook: true,\r\n defaultMulti: multiple,\r\n })}`,\r\n );\r\n },\r\n [EnableLegacyScheduler, history, isMobile],\r\n );\r\n const createWorkOrder = React.useCallback(\r\n (assetIds: number[], useSidePanel?: boolean) => {\r\n let p = {\r\n queryParams: {\r\n eqid: undefined,\r\n down: undefined,\r\n offH: undefined,\r\n eStart: dateUtils.formatQueryStringDate(newDate(), {\r\n representation: 'complete',\r\n }),\r\n offStart: undefined,\r\n offEnd: undefined,\r\n defaultMulti: undefined,\r\n source: undefined,\r\n id: undefined,\r\n aType: undefined,\r\n title: undefined,\r\n sympt: undefined,\r\n aStatus: undefined,\r\n aStart: undefined,\r\n desc: undefined,\r\n assetId: assetIds.join(','),\r\n reason: undefined,\r\n sid: undefined,\r\n Up: undefined,\r\n continueTo: 'edit',\r\n } as WorkOrderQueryStringParameters,\r\n useSidePanel: true,\r\n continueTo: 'edit',\r\n } as WorkOrderDetailsProps;\r\n if (useSidePanel) {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.WorkOrderDetails,\r\n props: p,\r\n }),\r\n );\r\n } else {\r\n history.push(`/workorders/details?${toQueryString(p.queryParams)}`);\r\n }\r\n },\r\n [dispatch, history, layoutActions, newDate],\r\n );\r\n // const createOffline = React.useCallback(\r\n // (serviceTypeId: number, useSidePanel?: boolean) => {\r\n // let params = {\r\n // useSidePanel: true,\r\n // queryParams: {\r\n // stid: serviceTypeId.toString(),\r\n // user: authuser?.Id,\r\n // },\r\n // } as OtherServiceDetailsProps;\r\n\r\n // if (useSidePanel) {\r\n // dispatch(\r\n // layoutActions.openSidePanel({\r\n // type: RenderPageType.OtherServiceDetails,\r\n // props: params,\r\n // }),\r\n // );\r\n // }\r\n // history.push(\r\n // `/otherServices/details?${toQueryString(params.queryParams)}`,\r\n // );\r\n // },\r\n // [authuser?.Id, dispatch, history, layoutActions],\r\n // );\r\n const createOffline = React.useCallback(\r\n (services: number[], multiple: boolean) => {\r\n dispatch(offActions.setSelectedServiceType(services));\r\n if (!multiple) {\r\n dispatch(offActions.setBarcodeScanned(true));\r\n }\r\n },\r\n [dispatch, offActions],\r\n );\r\n const addTrainingSession = React.useCallback((eqid: number) => {\r\n window.open(\r\n toRootedURL('/TrainingSession/AddNew.aspx', {\r\n eqid: eqid,\r\n }),\r\n '_blank',\r\n );\r\n }, []);\r\n const startUsage = React.useCallback((serviceId: number) => {\r\n window.open(\r\n toRootedURL('/Usage.aspx', {\r\n id: serviceId,\r\n }),\r\n '_blank',\r\n );\r\n }, []);\r\n return {\r\n createReservation,\r\n createWorkOrder,\r\n createOffline,\r\n startUsage,\r\n addTrainingSession,\r\n };\r\n}\r\n","/**\r\n *\r\n * BarcodeLogStatusPicker\r\n *\r\n */\r\n\r\nimport {\r\n BaseOptionsPicker,\r\n BaseOptionsPickerProps,\r\n} from 'app/components/BasicPickers/BaseOptionsPicker';\r\nimport i18next from 'i18next';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface BarcodeLogStatusPickerProps\r\n extends Omit>, 'getOptions'> {}\r\nconst Statuses = [\r\n 'Updated',\r\n 'Failed',\r\n 'RoomScanned',\r\n 'LocationScanned',\r\n 'SubLocationScanned',\r\n 'NoRoomAccess',\r\n];\r\nexport const initLogStatusesData = (\r\n initval: string | undefined,\r\n): Promise[]> => {\r\n if (initval === undefined) {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve([] as Entity[]);\r\n });\r\n } else {\r\n return new Promise[]>((resolve, reject) => {\r\n resolve(\r\n Statuses.filter(item => {\r\n return item === initval;\r\n }).map(f => {\r\n return {\r\n Id: f,\r\n Name: i18next.t(f) as string,\r\n } as Entity;\r\n }),\r\n );\r\n });\r\n }\r\n};\r\n\r\nexport function BarcodeLogStatusPicker(props: BarcodeLogStatusPickerProps) {\r\n const { t } = useTranslation();\r\n const getOptions = (searchTerm: string | null) => {\r\n let items = Statuses.map(f => {\r\n return {\r\n Id: f,\r\n Name: t(f) as string,\r\n } as Entity;\r\n });\r\n\r\n if (searchTerm !== null && searchTerm !== '') {\r\n return items.filter(\r\n f => f.Name.startsWith(searchTerm) || f.Name.indexOf(searchTerm) !== -1,\r\n );\r\n }\r\n return items;\r\n };\r\n return (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * BarcodeLogStatusFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { BarcodeLogStatusPicker } from 'app/components/pickers/StaticOptionsPickers/BarcodeLogStatusPicker';\r\n\r\nexport const BarcodeLogStatusFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: Entity | null) => {\r\n props.onChange(value);\r\n };\r\n\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default BarcodeLogStatusFilter;\r\n","import { translations } from 'locales/translations';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { BuildingPickerFilter } from 'app/components/BasicTable/Filters/BuildingPickerFilter';\r\nimport { RoomPickerFilter } from 'app/components/BasicTable/Filters/RoomPickerFilter';\r\n\r\nimport {\r\n arrayToQueryString,\r\n GetBooleanEntity,\r\n GetBooleanOrUndefined,\r\n getDefaultFilterDatePeriod,\r\n getNumberEntityArray,\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n GetStringOrUndefined,\r\n initExPickerValue,\r\n initMultiPickerValue,\r\n initPickerValue,\r\n presetDatesRangeToQueryString,\r\n URLSearchParamsCI,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { initBuildingData } from 'app/components/pickers/AutocompletePickers/BuildingPicker';\r\nimport { initRoomData } from 'app/components/pickers/AutocompletePickers/RoomPicker';\r\nimport BooleanPickerFilter from 'app/components/BasicTable/Filters/BooleanPickerFilter';\r\n\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { TextFieldFilter } from 'app/components/BasicTable/Filters';\r\nimport { initAssetMultiData } from 'app/components/pickers/AutocompletePickers/AssetMultiPicker';\r\nimport { AssetMultiFilter } from 'app/components/BasicTable/Filters/AssetMultiFilter';\r\nimport { initLocationData } from 'app/components/pickers/AutocompletePickers/LocationPicker';\r\nimport { LocationPickerFilter } from 'app/components/BasicTable/Filters/LocationPickerFilter';\r\nimport { SubLocationFilter } from 'app/components/BasicTable/Filters/SubLocationListFilter';\r\nimport { initSubLocationListData } from 'app/components/pickers/AutocompletePickers/SubLocationListPicker';\r\n\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { IBarcodeScanLogDto } from './IBarcodeScanLogDto';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport DatesRangeFilter from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { initLogStatusesData } from 'app/components/pickers/StaticOptionsPickers/BarcodeLogStatusPicker';\r\nimport BarcodeLogStatusFilter from 'app/components/BasicTable/Filters/BarcodeLogStatusFilter';\r\nimport { tryParseBool } from 'utils/string-utils';\r\nimport { Roles } from 'api/odata/generated/enums/Roles';\r\nimport { Identifiable } from 'types/common';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParamsCI(search);\r\n const hideRoomFloor =\r\n tryParseBool(\r\n settings?.GetString(AllowedSettings.HideRoomFloorTextBoxes),\r\n ) === true;\r\n const isAdmin =\r\n user !== undefined &&\r\n user !== null &&\r\n (user?.Roles?.includes(Roles.Administrators) ||\r\n user?.Roles?.includes(Roles.InventoryAdmin));\r\n var result: IFilterSettings[] = [\r\n {\r\n fieldName: 'AssetId',\r\n queryStringSerializer: arrayToQueryString('aid'),\r\n displayName: t(translations.AssetName), //(displayed as Resource Name)\r\n operator: ODataOperators.Includes,\r\n value: getNumberEntityArray(params, 'aid'),\r\n initData: initMultiPickerValue(initAssetMultiData),\r\n component: AssetMultiFilter,\r\n urlKey: 'aid',\r\n },\r\n {\r\n fieldName: 'Date',\r\n displayName: t(translations.EntryDate),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromInitPreset(\r\n getPeriodTypesEntity('CustomDate'),\r\n dateUtils.addMonths(new Date(), -1),\r\n new Date(),\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'st', 'et', params),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'period',\r\n 'st',\r\n 'et',\r\n ),\r\n dateTimeClear: true,\r\n component: DatesRangeFilter,\r\n inversionDisabled: true,\r\n urlKey: 'period',\r\n },\r\n {\r\n fieldName: 'BuildingId',\r\n displayName: t(translations.BuildingName),\r\n queryStringSerializer: 'BuildingId',\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'BuildingId')),\r\n ),\r\n initData: initExPickerValue(\r\n initBuildingData,\r\n undefined,\r\n 'locations',\r\n true,\r\n ),\r\n component: BuildingPickerFilter,\r\n urlType: 'locations',\r\n },\r\n {\r\n fieldName: 'RoomId',\r\n displayName: t(translations.Room),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'roomId',\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'roomId')),\r\n ),\r\n initData: initExPickerValue(initRoomData, undefined, 'base', true),\r\n urlType: 'base',\r\n withoutServiceGroups: true,\r\n component: RoomPickerFilter,\r\n urlKey: 'roomId',\r\n },\r\n {\r\n fieldName: 'StatusName',\r\n queryStringSerializer: 'status',\r\n displayName: t(translations.StatusName),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'status')),\r\n ),\r\n initData: initPickerValue(initLogStatusesData),\r\n component: BarcodeLogStatusFilter,\r\n urlKey: 'status',\r\n },\r\n {\r\n fieldName: 'LocationId',\r\n queryStringSerializer: 'locationid',\r\n displayName: t(translations.LocationList),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'locationid')),\r\n ),\r\n initData: initPickerValue(initLocationData),\r\n component: LocationPickerFilter,\r\n },\r\n {\r\n fieldName: 'SubLocationId',\r\n queryStringSerializer: 'sublocationid',\r\n displayName: t(translations.SubLocationsList),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(\r\n GetNumberOrUndefined(GetRawValue(params, 'sublocationid')),\r\n ),\r\n initData: initPickerValue(initSubLocationListData),\r\n component: SubLocationFilter,\r\n },\r\n ];\r\n if (!hideRoomFloor) {\r\n result.push({\r\n fieldName: 'FloorName',\r\n displayName: t(translations.FloorName),\r\n operator: ODataOperators.Contains,\r\n queryStringSerializer: 'floor',\r\n value: GetStringOrUndefined(GetRawValue(params, 'floor')),\r\n component: TextFieldFilter,\r\n urlKey: 'floor',\r\n });\r\n }\r\n if (isAdmin) {\r\n result.push({\r\n fieldName: 'Id',\r\n queryStringSerializer: 'empty',\r\n displayName: t(translations.ShowBarcodesWithoutAssetsOrRooms),\r\n operator: ODataOperators.Equals,\r\n value: GetBooleanEntity(\r\n GetBooleanOrUndefined(GetRawValue(params, 'empty')),\r\n t,\r\n ),\r\n component: BooleanPickerFilter,\r\n customFilter: (value, settings, filters) => {\r\n if ((value as Identifiable)?.Id === true) {\r\n return `${new Condition(\r\n 'AssetId',\r\n ODataOperators.Equals,\r\n null,\r\n ).toString()} and ${new Condition(\r\n 'RoomId',\r\n ODataOperators.Equals,\r\n null,\r\n ).toString()}`;\r\n } else {\r\n return undefined;\r\n }\r\n },\r\n inversionDisabled: true,\r\n });\r\n }\r\n return result;\r\n};\r\n","import { BasicTable, IBasicTableState } from 'app/components/BasicTable';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { filterHandler } from 'app/components/BasicTable/UnconfigurableTable/FilterHandler';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport * as React from 'react';\r\nimport { Column } from 'react-table';\r\nimport { AuthenticatedUser, IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectAppSettings, selectglobalSettings } from 'app/slice/selectors';\r\nimport { useGlobalServiceGroupsFilter } from 'app/hooks/useGlobalServiceGroupsFilter';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { CustomEmptyTableProps } from 'app/components/BasicTable/components/CustomEmptyTable';\r\nimport { translations } from 'locales/translations';\r\nimport { IBarcodeScanLogDto } from './IBarcodeScanLogDto';\r\nimport { getColumns } from './GetColumns';\r\nimport { GetFilters } from './GetFilters';\r\n\r\nexport interface InventoryLogTableProps {\r\n useSidePanel?: boolean;\r\n authenticatedUser?: AuthenticatedUser;\r\n closeSidePanel: () => void;\r\n setFilters?: (\r\n appliedFilters: IFilterSettings[] | undefined,\r\n ) => void;\r\n // primaryAction?: (row: Row) => void;\r\n // primaryMultiAction: (rows: IMyAssetsRow[]) => void;\r\n screenName?: string;\r\n openAsset: (id: number) => void;\r\n customPredicates?: (string | Condition)[];\r\n isShortView?: boolean;\r\n emptyTable?: CustomEmptyTableProps;\r\n searchTerm?: string;\r\n defaultFilter?: (user: IAuthenticatedUser) => URLSearchParams;\r\n}\r\n\r\nexport function InventoryLogTable(props: InventoryLogTableProps) {\r\n const {\r\n useSidePanel,\r\n authenticatedUser,\r\n setFilters,\r\n screenName,\r\n isShortView = false,\r\n emptyTable,\r\n searchTerm,\r\n defaultFilter,\r\n } = props;\r\n const { t } = useTranslation();\r\n const appSettings = useSelector(selectAppSettings);\r\n const settings = useSelector(selectglobalSettings);\r\n const isMobile = DetectIsMobile();\r\n // const admins =\r\n // authenticatedUser !== undefined &&\r\n // (authenticatedUser.Roles.includes(Roles.Administrators) ||\r\n // authenticatedUser.Roles.includes(Roles.GroupAdministrators) ||\r\n // authenticatedUser.Roles.includes(Roles.LabTech) ||\r\n // authenticatedUser.Roles.includes(Roles.InventoryAdmin));\r\n\r\n const searchColumns = React.useMemo(() => {\r\n let result: string[] = [\r\n 'Username',\r\n 'UserDisplayName',\r\n 'Barcode',\r\n 'ServiceGroupName',\r\n 'AssetName',\r\n 'RoomName',\r\n 'FloorName',\r\n 'BuildingName',\r\n 'LocationName',\r\n 'SubLocationName',\r\n 'StatusName',\r\n 'Remarks',\r\n ];\r\n return result;\r\n }, []);\r\n\r\n const additionalColumns = React.useMemo(() => {\r\n let result: string[] = [\r\n 'Id',\r\n 'ServiceId',\r\n 'AssetId',\r\n 'ServiceGroupId',\r\n 'RoomId',\r\n 'ServiceTypeId',\r\n 'BuildingId',\r\n 'LocationId',\r\n 'SubLocationId',\r\n 'Username',\r\n ];\r\n return result;\r\n }, []);\r\n // const [multiAssetSelectionMode, setMultiAssetSelectionMode] = React.useState<\r\n // boolean\r\n // >(false);\r\n // const [selectedRowIds, setSelectedRowIds] = React.useState<\r\n // Record, boolean>\r\n // >({});\r\n // const [, setCurrentMode, currentModeRef] = useState('card');\r\n // const [loacalAssets, setLoacalAssets, localAssetsRef] = useState<\r\n // Entity[]\r\n // >([]);\r\n // React.useEffect(() => {\r\n // let obj = {};\r\n // if (!!assets && assets.length > 0) {\r\n // for (const key of assets) {\r\n // obj[key.Id] = true;\r\n // }\r\n // setMultiAssetSelectionMode(assets.length > 1);\r\n // setLoacalAssets(assets);\r\n // }\r\n // setSelectedRowIds(obj);\r\n // }, [assets, setLoacalAssets]);\r\n\r\n const columns: Column[] = React.useMemo(\r\n () => getColumns(t, authenticatedUser, appSettings, settings),\r\n [t, authenticatedUser, appSettings, settings],\r\n );\r\n const initialState: IBasicTableState = React.useMemo(\r\n () => ({\r\n sortBy: [{ id: 'Date', desc: true }],\r\n //selectedRowIds: selectedRowIds,\r\n globalFilter: searchTerm,\r\n }),\r\n [searchTerm],\r\n );\r\n\r\n // const customFilter = React.useMemo(() => {\r\n // let filter: (string | Condition)[] = customPredicates ?? [];\r\n // if (actionType === 'StartUsage') {\r\n // filter.push(\r\n // new Condition('AutoMode', ODataOperators.Equals, 1),\r\n // );\r\n // }\r\n // if (actionType === 'TrainingSession') {\r\n // filter.push(\r\n // new Condition(\r\n // 'TrainingSessionsEnabled',\r\n // ODataOperators.Equals,\r\n // true,\r\n // ),\r\n // );\r\n // }\r\n // return filter.length > 0 ? filter : undefined;\r\n // }, [actionType, customPredicates]);\r\n\r\n const url = '/api/odata/v4/BarcodeScanLog';\r\n const { serviceGroups } = useGlobalServiceGroupsFilter(false);\r\n const TTable = React.useMemo(\r\n () =>\r\n filterHandler(BasicTable, GetFilters, {\r\n isSidePanel: useSidePanel,\r\n setFilters: setFilters,\r\n reservedQueryStringParameterNames: undefined,\r\n getDefaultFilter: defaultFilter,\r\n getRequiredFilter: undefined,\r\n getSelectedViewFilter: undefined,\r\n enableSavedLists: false,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [useSidePanel],\r\n );\r\n return (\r\n \r\n setMultiAssetSelectionMode(value),\r\n // selectedTabValue: undefined,\r\n // onAllRowsSelected: toggleAllRows,\r\n // disableMultiMode: multiModeDisabled,\r\n // defaultMultiMode: !multiModeDisabled,\r\n // // defaultMultiMode:\r\n // // multiAssetSelectionMode === true ||\r\n // // (!!localAssetsRef.current && localAssetsRef.current.length > 0),\r\n // }}\r\n //predicates={customFilter}\r\n preventInnerClicks={isMobile}\r\n />\r\n \r\n );\r\n}\r\n","import DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport { UserProfileLink } from 'app/components/BasicTable/components/UserProfileLink';\r\nimport { ColumnWithDep } from 'app/components/BasicTable/types/ColumnWithDeps';\r\nimport { AssetLink } from 'app/pages/AssetPopUp/OpenAssetDetails';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { tryParseBool } from 'utils/string-utils';\r\nimport { IBarcodeScanLogDto } from './IBarcodeScanLogDto';\r\n\r\nexport function getColumns(\r\n t: TFunction,\r\n user: AuthenticatedUser | undefined,\r\n appSettings: AppSettings | null,\r\n settings: GlobalSettings | null,\r\n) {\r\n const hideRoomFloor =\r\n tryParseBool(\r\n settings?.GetString(AllowedSettings.HideRoomFloorTextBoxes),\r\n ) === true;\r\n const res: ColumnWithDep[] = [\r\n {\r\n Header: t(translations.HashSymbol) as string,\r\n accessor: 'Id',\r\n },\r\n {\r\n Header: t(translations.UserName) as string,\r\n accessor: 'UserDisplayName',\r\n Cell: ({ value, row }) => (\r\n <>\r\n \r\n \r\n ),\r\n },\r\n {\r\n Header: t(translations.EntryDate) as string,\r\n accessor: 'Date',\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Header: t(translations.AssetName) as string,\r\n accessor: 'AssetName',\r\n Cell: ({ value, row }) => {\r\n return !!value && value !== null ? (\r\n {value}\r\n ) : (\r\n <>{'N/A'}\r\n );\r\n },\r\n },\r\n {\r\n Header: t(translations.BarCode) as string,\r\n accessor: 'Barcode',\r\n },\r\n {\r\n Header: t(translations.Room) as string,\r\n accessor: 'RoomName',\r\n },\r\n {\r\n Header: t(translations.Building) as string,\r\n accessor: 'BuildingName',\r\n },\r\n {\r\n Header: t(translations.LocationName) as string,\r\n accessor: 'LocationName',\r\n },\r\n {\r\n Header: t(translations.SubLocationName) as string,\r\n accessor: 'SubLocationName',\r\n },\r\n {\r\n Header: t(translations.StatusName) as string,\r\n accessor: 'StatusName',\r\n },\r\n {\r\n Header: t(translations.Remarks) as string,\r\n accessor: 'Remarks',\r\n },\r\n {\r\n Header: t(translations.ServiceGroupName) as string,\r\n accessor: 'ServiceGroupName',\r\n },\r\n ];\r\n\r\n if (!hideRoomFloor) {\r\n res.push({\r\n Header: t(translations.FloorName) as string,\r\n accessor: 'FloorName',\r\n });\r\n }\r\n return res;\r\n}\r\n","import { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { toURLSearchParams } from 'app/components/BasicTable/withSavedHistory';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { AssetPopUp } from 'app/pages/AssetPopUp';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { Condition } from 'api/odata/ODataFilter';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { selectInventoryLogFilters } from 'app/pages/AssetsInventory/Details/slice/selectors';\r\nimport { useAssetInventorySlice } from 'app/pages/AssetsInventory/Details/slice';\r\nimport { IBarcodeScanLogDto } from './IBarcodeScanLogDto';\r\nimport { InventoryLogTable } from './InventoryLogTable';\r\nimport { buildURL } from 'utils/url-utils';\r\nimport { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { presetDatesRangeToQueryString } from 'app/components/BasicTable/types/FilterParam';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport interface InventoryLogProps extends CoverProps, SidePanelContentProps {\r\n roomId?: number;\r\n customPredicates?: (string | Condition)[];\r\n pageLink?: string;\r\n onClose?: () => void;\r\n searchTerm?: string;\r\n}\r\n\r\nexport function InventoryLog(props: InventoryLogProps) {\r\n const { useSidePanel, roomId, customPredicates, onClose, searchTerm } = props;\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const filters = useSelector(selectInventoryLogFilters);\r\n const dispatch = useDispatch();\r\n const { actions } = useAssetInventorySlice();\r\n const { t } = useTranslation();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const isMobile = DetectIsMobile();\r\n const [cover, setCover] = React.useState();\r\n\r\n const showShortView =\r\n isMobile || (useSidePanel && !sidePanelExpanded) || props.isCover;\r\n const pagelink = React.useMemo(\r\n () =>\r\n !!props.pageLink\r\n ? props.pageLink\r\n : buildURL(\r\n `${publicUrl}Assets/Inventory/Log`,\r\n Object.assign({}, filters, {\r\n RoomId: roomId,\r\n searchTerm: searchTerm,\r\n }),\r\n ),\r\n [filters, props.pageLink, publicUrl, roomId, searchTerm],\r\n );\r\n const closeCover = () => {\r\n setCover(undefined);\r\n };\r\n\r\n const closeSidePanel = React.useCallback(() => {\r\n if (props.isCover) {\r\n if (!!onClose) {\r\n onClose();\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n } else {\r\n dispatch(layoutActions.resetSidePanel());\r\n }\r\n }, [dispatch, layoutActions, onClose, props.isCover]);\r\n const openAsset = React.useCallback((id: number) => {\r\n setCover(\r\n ,\r\n );\r\n }, []);\r\n\r\n // const IsAdmin = React.useCallback(\r\n // (log: IBarcodeScanLogDto) => {\r\n // return (\r\n // authenticatedUser?.IsAllGroupOrLabTechAdmin(\r\n // [log.ServiceGroupId ?? 0],\r\n // [\r\n // {\r\n // Id: log.ServiceId,\r\n // Name: log.AssetName,\r\n // ServiceTypeId: log.ServiceTypeId,\r\n // } as IServiceTypeFilterDto,\r\n // ],\r\n // ) ||\r\n // authenticatedUser?.Roles?.includes(Roles.Administrators) ||\r\n // authenticatedUser?.Roles?.includes(Roles.InventoryAdmin)\r\n // );\r\n // },\r\n // [authenticatedUser],\r\n // );\r\n\r\n const setfilterCallback = React.useCallback(\r\n (v: IFilterSettings[] | undefined) => {\r\n const res = {};\r\n if (!!v) {\r\n toURLSearchParams(v).forEach((val, name) => {\r\n res[name] = val;\r\n });\r\n }\r\n dispatch(actions.setLogFilters(!v || v.length === 0 ? undefined : res));\r\n },\r\n [actions, dispatch],\r\n );\r\n const defaultFilterSearch = React.useCallback(\r\n (user: IAuthenticatedUser) => {\r\n let dateFilter = presetDatesRangeToQueryString(\r\n 'period',\r\n 'st',\r\n 'et',\r\n )(\r\n PresetDatesRange.fromInitPreset(\r\n getPeriodTypesEntity('CustomDate'),\r\n dateUtils.addMonths(new Date(), -1),\r\n new Date(),\r\n ),\r\n );\r\n if (roomId !== undefined) {\r\n dateFilter.set('roomId', roomId.toString());\r\n }\r\n return dateFilter;\r\n },\r\n [roomId],\r\n );\r\n return (\r\n {t(translations.menu_CoreSelection)}}\r\n titlePage={t(translations.menu_AssetInventoryLog)}\r\n closable={useSidePanel || props.isCover}\r\n //disableExpandToggle={true}\r\n //rightTopActions={topButtons}\r\n isCover={props.isCover}\r\n hideTitleBar={false}\r\n cover={cover}\r\n closeCover={props.closeCover || closeCover}\r\n closeSidePanel={props.isCover ? onClose : undefined}\r\n //leftTopActions={pageActions}\r\n children={\r\n \r\n \r\n \r\n }\r\n />\r\n );\r\n}\r\n","import { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\n\r\nexport interface SaveFormButtonProps extends ButtonProps {\r\n edit: boolean;\r\n text: string;\r\n onClick: (e: any) => void;\r\n}\r\n\r\nexport function SaveFormButton({\r\n edit,\r\n text,\r\n onClick,\r\n ...props\r\n}: SaveFormButtonProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { useTranslation } from 'react-i18next';\r\nimport { SavedViewDetailsState } from '../slice/types';\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { FormAssetsPicker } from 'app/components/Forms/FormAssetsPicker';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { Formik } from 'formik';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRow,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { FormSwitch } from 'app/components/Forms/Switch';\r\nimport { getsavedViewSchema } from './validationSchema';\r\nimport { AssetsFilterForSavedView } from 'app/components/pickers/MultiSelectPickers/AssetsPicker';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalServiceGroupFilter } from 'app/slice/selectors';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport {\r\n IAssetDto,\r\n mapAssetsToServiceTypeFilterDto,\r\n} from 'api/odata/generated/entities/IAssetDto';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface SavedViewFormProps {\r\n onSubmit: (item: SavedViewDetailsState) => void;\r\n initialValues: SavedViewDetailsState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isEdit: boolean;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n onEquipmentClicked?: (equipment: Entity) => void;\r\n viewOnly: boolean;\r\n}\r\n\r\nexport const SavedViewForm = React.memo(function SavedViewForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isEdit,\r\n isAdmin,\r\n user,\r\n viewOnly,\r\n onEquipmentClicked,\r\n}: SavedViewFormProps) {\r\n const { t } = useTranslation();\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value);\r\n }\r\n };\r\n // const areTheSameServiceGroup = (assets: IAssetDto[]): boolean => {\r\n // let groupId = assets.filter(\r\n // f => f.ServiceGroupId != null && f.ServiceGroupId !== undefined,\r\n // )[0].ServiceGroupId;\r\n // return assets.every(\r\n // v =>\r\n // v.ServiceGroupId === null ||\r\n // v.ServiceGroupId === undefined ||\r\n // v.ServiceGroupId === groupId,\r\n // );\r\n // };\r\n const userIsServiceGroupAdmin = (assets: IAssetDto[]): boolean => {\r\n return (\r\n user?.IsAllGroupOrLabTechAdmin(\r\n assets.map(g => g.ServiceGroupId ?? 0),\r\n mapAssetsToServiceTypeFilterDto(assets),\r\n ) || false\r\n );\r\n };\r\n const savedViewSchema = React.useMemo(() => getsavedViewSchema(t), [t]);\r\n return (\r\n <>\r\n {\r\n if (viewOnly) return;\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\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 0 &&\r\n userIsServiceGroupAdmin(formik.values.Assets)\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 );\r\n }}\r\n \r\n \r\n );\r\n});\r\n","import { EntityNumberSchema } from 'app/components/Forms/Schemas';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport * as Yup from 'yup';\r\nimport { SavedViewDetailsState } from '../slice/types';\r\n\r\nexport const getsavedViewSchema: (\r\n t: TFunction,\r\n) => Yup.SchemaOf = t =>\r\n Yup.object({\r\n Id: Yup.number().notRequired().default(-1),\r\n Name: Yup.string()\r\n .required(t(translations.err_SavedViewNameRequired))\r\n .typeError(t(translations.err_SavedViewNameRequired))\r\n .label(t(translations.SavedViewName)),\r\n Assets: Yup.array()\r\n .of(EntityNumberSchema)\r\n .min(1)\r\n .required(t(translations.err_savedViewAssetRequired))\r\n .label(t(translations.SavedViewAssets))\r\n .typeError(t(translations.err_savedViewAssetRequired)),\r\n Shared: Yup.boolean().label(t(translations.SavedViewShared)),\r\n Multiple: Yup.boolean().label(t(translations.SavedViewBookMultiple)),\r\n // SharedTo: Yup.mixed().label(i18next.t(translations.SavedViewSharedTo)),\r\n // SharedCores: Yup.array()\r\n // .of(EntityNumberSchema)\r\n // .label(i18next.t(translations.SavedViewSharedCores)),\r\n // SharedUsers: Yup.array()\r\n // .of(EntityStringSchema)\r\n // .label(i18next.t(translations.SavedViewSharedUsers)),\r\n });\r\n","import { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux';\r\nimport { useSavedViewSlice } from '../slice';\r\nimport {\r\n selectCreateSavedView,\r\n selectCreateSavedViewCompleted,\r\n selectCreateSavedViewHasError,\r\n selectSavedViewProcessing,\r\n selectUpdateSavedView,\r\n selectUpdateSavedViewCompleted,\r\n selectUpdateSavedViewHasError,\r\n selectUpdateUserName,\r\n} from '../slice/selectors';\r\nimport { SavedViewDetailsState } from '../slice/types';\r\nimport * as React from 'react';\r\n//import { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { selectHasNotSavedChanges } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport {\r\n IAssetDto,\r\n mapAssetsToServiceTypeFilterDto,\r\n} from 'api/odata/generated/entities/IAssetDto';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { push } from 'connected-react-router';\r\nimport { SaveFormButton } from './Actions/SavedViewActions';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { SavedViewForm } from './SavedViewForm';\r\nimport { Box } from '@material-ui/core';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { useLeftTopActions } from './Actions/RightTopActions';\r\nimport { ISavedViewDto } from 'api/odata/generated/entities/ISavedViewDto';\r\nimport { AssetPopUp } from 'app/pages/AssetPopUp';\r\n\r\nexport interface SavedViewDetailsProps extends SidePanelContentProps {\r\n id?: string;\r\n eid?: string;\r\n}\r\n\r\nexport function SavedViewDetails(props: SavedViewDetailsProps) {\r\n const { id, useSidePanel, eid } = props;\r\n const dispatch = useDispatch();\r\n const { t } = useTranslation();\r\n const { actions } = useSavedViewSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const loading = useSelector(selectSavedViewProcessing);\r\n const [busy, setBusy] = React.useState(false);\r\n const [edit, setEdit] = React.useState(false);\r\n\r\n // const [currentScreen, setCurrentScreen] = React.useState<\r\n // ScreensId | undefined\r\n // >(undefined);\r\n // const hasCreateProcessing = useSelector(selectCreateSavedViewProcessing);\r\n // const hasUpdateUpdateProcessing = useSelector(\r\n // selectUpdateSavedViewProcessing,\r\n // );\r\n //const hasProcessing = hasCreateProcessing || hasUpdateUpdateProcessing;\r\n const hasCreateError = useSelector(selectCreateSavedViewHasError);\r\n const hasUpdateError = useSelector(selectUpdateSavedViewHasError);\r\n const hasError = hasCreateError || hasUpdateError;\r\n const requestCreateCompleted = useSelector(selectCreateSavedViewCompleted);\r\n const requestUpdateCompleted = useSelector(selectUpdateSavedViewCompleted);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const createModel = useSelector(selectCreateSavedView, shallowEqual);\r\n const editModel = useSelector(selectUpdateSavedView, shallowEqual);\r\n const baseModel = createModel || editModel;\r\n\r\n const hasChanges = useSelector(selectHasNotSavedChanges, shallowEqual);\r\n\r\n //const continueToOther = useSelector(selectContinueState);\r\n\r\n // const isMobile = DetectIsMobile();\r\n // const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n //const showShortView = isMobile || (useSidePanel && !sidePanelExpanded);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const fullAdmin =\r\n User !== undefined && User.Roles.includes(Roles.Administrators);\r\n const IsAdmin = React.useMemo(() => {\r\n return (\r\n fullAdmin ||\r\n User?.IsAllGroupOrLabTechAdmin(\r\n baseModel?.Assets.map(g => (g as IAssetDto).ServiceGroupId ?? 0),\r\n mapAssetsToServiceTypeFilterDto(\r\n (baseModel?.Assets === undefined\r\n ? []\r\n : baseModel?.Assets) as IAssetDto[],\r\n ),\r\n )\r\n );\r\n }, [fullAdmin, User, baseModel]);\r\n\r\n const savedViewUserName = useSelector(selectUpdateUserName);\r\n const viewOnly = React.useMemo(() => {\r\n return edit && !fullAdmin && User?.Id !== savedViewUserName;\r\n }, [User?.Id, edit, fullAdmin, savedViewUserName]);\r\n\r\n const publicUrl = useSelector(selectPublicUrl);\r\n useEffectOnMount(() => {\r\n if (id !== undefined && !isNaN(parseInt(id || ''))) {\r\n dispatch(actions.initDetails(parseInt(id || '')));\r\n } else {\r\n dispatch(actions.initNewDetails(eid));\r\n }\r\n setBusy(false);\r\n setEdit(false);\r\n setRequestCompleted(undefined);\r\n return () => {};\r\n });\r\n const submitFormRef = React.useRef(null);\r\n\r\n const handleSaveClick = React.useCallback((e: any) => {\r\n handleSubmitForm(e);\r\n }, []);\r\n const handleSubmitForm = (e: any) => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: SavedViewDetailsState) => {\r\n setBusy(true);\r\n if (edit) {\r\n dispatch(\r\n actions.updateView({\r\n current: values,\r\n original: baseModel,\r\n }),\r\n );\r\n } else {\r\n dispatch(actions.createView(values));\r\n }\r\n },\r\n [actions, baseModel, dispatch, edit],\r\n );\r\n const handleClose = () => {\r\n if (hasChanges) {\r\n dispatch(layoutActions.setConfirmOpen(true));\r\n } else {\r\n handleCancelClick();\r\n }\r\n };\r\n const handleCancelClick = React.useCallback(() => {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/SavedViews'));\r\n }\r\n if (edit) {\r\n dispatch(actions.resetUpdateSavedViewState());\r\n } else {\r\n dispatch(actions.resetCreateSavedViewState());\r\n }\r\n }, [actions, dispatch, edit, layoutActions, useSidePanel]);\r\n\r\n React.useEffect(() => {\r\n let active = loading === false;\r\n if (active) {\r\n if (id !== undefined && !isNaN(parseInt(id))) {\r\n setEdit(true);\r\n }\r\n if (requestCreateCompleted === true || requestUpdateCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n handleCancelClick();\r\n }\r\n } else if (\r\n requestCreateCompleted === false ||\r\n requestUpdateCompleted === false\r\n ) {\r\n setRequestCompleted(false);\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n baseModel,\r\n handleCancelClick,\r\n hasError,\r\n id,\r\n loading,\r\n requestCompleted,\r\n requestCreateCompleted,\r\n requestUpdateCompleted,\r\n ]);\r\n\r\n const leftActions = React.useMemo(() => {\r\n if (viewOnly) return [];\r\n return [\r\n () => (\r\n \r\n }\r\n onClick={handleSaveClick}\r\n disabled={busy}\r\n processing={!requestCompleted && busy}\r\n edit={edit}\r\n text={t(translations.Save)}\r\n />\r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [busy, edit, handleSaveClick, requestCompleted, t, viewOnly]);\r\n const rightActions = React.useMemo(() => {\r\n return [\r\n () => (\r\n \r\n }\r\n onClick={handleCancelClick}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [handleCancelClick, t]);\r\n const leftTopActions = useLeftTopActions({\r\n savedView: baseModel as ISavedViewDto,\r\n isNew: !edit,\r\n useSidePanel: useSidePanel,\r\n });\r\n const [cover, setCover] = React.useState();\r\n const closeCover = () => {\r\n setCover(undefined);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {\r\n console.log(e);\r\n setCover(\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 pageLink={buildURL(publicUrl + 'mylists/details', { id: id })}\r\n toPageLink={`mylists/details?${toQueryString({ id: id })}`}\r\n leftActions={leftActions}\r\n rightActions={rightActions}\r\n leftTopActions={leftTopActions}\r\n maxLeftTopButtonsLength={1}\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n}\r\n","import { ISavedViewDto } from 'api/odata/generated/entities/ISavedViewDto';\r\nimport { savedViewsApi } from 'api/savedViewsApi';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { SelectedRowsActionIconButton } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton';\r\nimport { ReservationCreateButton } from 'app/components/ReservationCreateButton';\r\nimport { AddWorkOrder } from 'app/pages/Actions/GlobalSelectedActions/AddWorkOrder';\r\nimport { BringBackUp } from 'app/pages/Actions/GlobalSelectedActions/BringBackUp';\r\nimport { DownWorkOrder } from 'app/pages/Actions/GlobalSelectedActions/DownWorkOrder';\r\nimport { OpenCalendar } from 'app/pages/Actions/GlobalSelectedActions/OpenCalendar';\r\nimport { OpenTimeline } from 'app/pages/Actions/GlobalSelectedActions/OpenTimeline';\r\nimport { OpenWorkOrders } from 'app/pages/Actions/GlobalSelectedActions/OpenWrokOrders';\r\nimport { RenderTypes } from 'app/pages/Actions/GlobalSelectedActions/ValidToRender/renderTypes';\r\nimport { useAssetsPermissions } from 'app/pages/Actions/GlobalSelectedActions/ValidToRender/useAssetsPermissionsUtils';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { translations } from 'locales/translations';\r\nimport { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { GetResponseMessages, IResponseType } from 'types/ResponseType';\r\n\r\nexport interface GetLeftTopActionsProps {\r\n savedView?: ISavedViewDto;\r\n isNew: boolean;\r\n useSidePanel?: boolean;\r\n}\r\n\r\ntype filterableArray = Array<{ notShown?: boolean; value: T }>;\r\n\r\nexport const useLeftTopActions: (\r\n props: GetLeftTopActionsProps,\r\n) => ActionRenderer[] = ({\r\n savedView,\r\n isNew,\r\n useSidePanel,\r\n}: GetLeftTopActionsProps) => {\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const isAdmin = useMemo(() => {\r\n return authenticatedUser?.Roles.includes(Roles.Administrators);\r\n }, [authenticatedUser]);\r\n const isServiceGroupAdmin = useMemo(() => {\r\n return authenticatedUser?.Roles.includes(Roles.GroupAdministrators);\r\n }, [authenticatedUser]);\r\n const { allowedToView } = useAssetsPermissions();\r\n const rows = useMemo(() => (savedView === undefined ? [] : [savedView]), [\r\n savedView,\r\n ]);\r\n\r\n const result = useMemo(() => {\r\n if (savedView === undefined || isNew) return [];\r\n const res: filterableArray = [\r\n {\r\n notShown:\r\n !allowedToView(savedView.Assets, RenderTypes.OpenCalendar) ||\r\n !savedView.Assets.some(a => a.BookableAsset),\r\n value: () => (\r\n \r\n rows.flatMap(r =>\r\n r.Assets.map(a => a.ServiceId ?? 0).filter(f => f > 0),\r\n ) || []\r\n }\r\n startIcon={}\r\n primary\r\n bookMultiple={savedView.Multiple}\r\n />\r\n ),\r\n },\r\n {\r\n notShown:\r\n !(isAdmin || isServiceGroupAdmin) ||\r\n !allowedToView(savedView.Assets, RenderTypes.AddWorkOrder),\r\n value: () => (\r\n \r\n new Promise((resolve, reject) => {\r\n resolve(rows.flatMap(a => a.Assets) || []);\r\n })\r\n }\r\n buttonName={t(translations.AddEvent)}\r\n primary={!savedView.Assets.some(a => a.BookableAsset)}\r\n useSidePanel={useSidePanel}\r\n />\r\n ),\r\n },\r\n {\r\n notShown: authenticatedUser?.Name !== savedView.UserName && !isAdmin,\r\n value: submit => (\r\n submit?.()}\r\n variantButton=\"button\"\r\n action={() =>\r\n new Promise((resolve, reject) => {\r\n return savedViewsApi\r\n .deleteSavedViews(rows)\r\n .then(response => {\r\n const messages: IResponseType = GetResponseMessages(\r\n response,\r\n t(translations.Success) as string,\r\n );\r\n resolve(messages);\r\n })\r\n .catch(error => {\r\n console.log('Error: ', error);\r\n let err = t(translations.Failed) as string;\r\n reject(err);\r\n });\r\n })\r\n }\r\n />\r\n ),\r\n },\r\n {\r\n notShown: !allowedToView(savedView.Assets, RenderTypes.OpenTimeline),\r\n value: () => (\r\n \r\n rows.flatMap(r =>\r\n r.Assets.map(a => a.ServiceId ?? 0).filter(f => f > 0),\r\n ) || []\r\n }\r\n />\r\n ),\r\n },\r\n {\r\n notShown: !allowedToView(savedView.Assets, RenderTypes.NewReservation),\r\n value: () => (\r\n a.ServiceId ?? 0).filter(f => f > 0) ||\r\n []\r\n }\r\n >\r\n {t(translations.AddReservation)}\r\n \r\n ),\r\n },\r\n {\r\n notShown:\r\n !(isAdmin || isServiceGroupAdmin) ||\r\n !allowedToView(savedView.Assets, RenderTypes.OpenWorkOrders),\r\n value: () => (\r\n r.flatMap(a => a.Assets).map(a => a.Id) || []}\r\n />\r\n ),\r\n },\r\n {\r\n notShown:\r\n !(isAdmin || isServiceGroupAdmin) ||\r\n !allowedToView(savedView.Assets, RenderTypes.DownWorkOrder),\r\n value: () => (\r\n \r\n new Promise((resolve, reject) => {\r\n resolve(rows.flatMap(a => a.Assets) || []);\r\n })\r\n }\r\n buttonName={t(translations.TakeDown)}\r\n useSidePanel={useSidePanel}\r\n />\r\n ),\r\n },\r\n {\r\n notShown:\r\n !(isAdmin || isServiceGroupAdmin) ||\r\n !allowedToView(savedView.Assets, RenderTypes.BringBackUp),\r\n value: () => (\r\n r.flatMap(a => a.Assets).map(a => a.Id) || []}\r\n getEquipmentIds={rows =>\r\n rows.flatMap(r =>\r\n r.Assets.map(a => a.ServiceId ?? 0).filter(f => f > 0),\r\n ) || []\r\n }\r\n />\r\n ),\r\n },\r\n ];\r\n return res.filter(f => !f.notShown).map(f => f.value);\r\n }, [\r\n allowedToView,\r\n authenticatedUser?.Name,\r\n isAdmin,\r\n isNew,\r\n isServiceGroupAdmin,\r\n rows,\r\n savedView,\r\n t,\r\n useSidePanel,\r\n ]);\r\n return result;\r\n};\r\n","/* eslint-disable prettier/prettier */\r\nimport {\r\n makeStyles,\r\n Theme,\r\n createStyles,\r\n Paper,\r\n List,\r\n ListItem,\r\n Grid,\r\n ListItemText,\r\n Divider,\r\n} from '@material-ui/core';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { toRootedURL } from 'utils/url-utils';\r\n\r\nexport const HtmlDefaultTemplate: string =\r\n '

    Company name, IL 60637

    Invoice ID: {@InvoiceLinkId}

    Dates: From {@InvoiceFromDate} To {@InvoiceToDate}

    Invoice DateProcessed ByUser GroupCoreTotal Cost

    {@InvoiceDate}

    {@InvoiceProcessedUser}

    {@InvoiceUserGroup}

    {@InvoiceCore}

    {@InvoiceTotalCost}

    Customer Misc
    Name{@InvoiceProcessedUser}
    Billing Adress{@BillingAddress1}
    City{@BillingAddress2}
    State{@BillingAddress3}
    Country{@BillingAddress4}

    {@InvoiceSummaryTable}

    Remarks: {@InvoiceRemarks}

    ';\r\n\r\n/* export const HtmlDefaultTemplate: string =\r\n '

    ' +\r\n 'Company name, IL 60637' +\r\n '

    ' +\r\n '

    Invoice ID: {@InvoiceLinkId}

    ' +\r\n '

    Dates: From {@InvoiceFromDate} To {@InvoiceToDate}

    ' +\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 '
    Invoice DateProcessed ByUser GroupCoreTotal Cost
    ' +\r\n '

    {@InvoiceDate}

    ' +\r\n '
    ' +\r\n '

    {@InvoiceProcessedUser}

    ' +\r\n '
    ' +\r\n '

    {@InvoiceUserGroup}

    ' +\r\n '
    ' +\r\n '

    {@InvoiceCore}

    ' +\r\n '
    {@InvoiceTotalCost}
    ' +\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 '' +\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 '
    Customer Misc
    Name{@InvoiceProcessedUser}
    Billing Adress{@BillingAddress1}
    City{@BillingAddress2}
    State{@BillingAddress3}
    Country{@BillingAddress4}
    ' +\r\n '

    ' +\r\n '

    {@InvoiceSummaryTable}

    ' +\r\n '

    {@InvoiceSummury_BudgetUserService}

    ' +\r\n '

    Remarks: {@InvoiceRemarks}

    ' +\r\n '

    More details can be obtained by clicking on the Invoice ID. The statement total will be charged to your budget accounts as detailed above 5 business days after the statement date. Please contact your facility management with any billing questions.

    ';\r\n */\r\nexport function PopUpListItems(): JSX.Element {\r\n //SETTINGS\r\n const { t } = useTranslation();\r\n\r\n //CSS\r\n const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n invoiceTemplateRightSection: {\r\n width: '100%',\r\n //maxWidth: 570,\r\n backgroundColor: theme.palette.background.default,\r\n position: 'relative',\r\n overflow: 'auto',\r\n maxHeight: '63vh',\r\n overflowY: 'auto',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n backgroundColor: theme.palette.background.default,\r\n border: '1px solid #E3E3E3',\r\n },\r\n }),\r\n );\r\n const classes = useStyles();\r\n\r\n //RENDER\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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n //DialogContentText,\r\n DialogActions,\r\n createStyles,\r\n makeStyles,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { TextField } from 'app/components/TextField';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { translations } from 'locales/translations';\r\nimport React, { Dispatch, SetStateAction, useCallback } from 'react';\r\nimport { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch } from 'react-redux';\r\nimport { IInvoiceTemplatePopUp } from '../IInvoiceTemplatePopUp';\r\n\r\nexport interface HtmlTextBoxProps extends ButtonProps {\r\n Id: number | undefined;\r\n className?: string | undefined;\r\n setInitialValue: Dispatch>;\r\n isEdit: boolean;\r\n setBusy: (value: SetStateAction) => void;\r\n formikValues: IInvoiceTemplatePopUp;\r\n}\r\n\r\nexport const HtmlTextBox = ({\r\n Id,\r\n className,\r\n setInitialValue,\r\n isEdit,\r\n setBusy,\r\n formikValues,\r\n}: HtmlTextBoxProps): JSX.Element => {\r\n //PROPS\r\n const { t } = useTranslation();\r\n\r\n //REDUX\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n\r\n //STATES\r\n const [open, setOpen] = useState(false);\r\n const [textBoxValue, setTextBoxValue] = useState(\r\n formikValues.Html,\r\n );\r\n\r\n //FUNCTIONS\r\n const OnUpdate = useCallback(\r\n (invoiceTemplate: IInvoiceTemplatePopUp) => {\r\n setBusy(true);\r\n setInitialValue(invoiceTemplate);\r\n dispatch(actions.resetSidePanel());\r\n //if Add mode\r\n if (!isEdit) {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.InvoiceTemplatePopUp,\r\n expanded: true,\r\n props: {},\r\n }),\r\n );\r\n } else {\r\n //if Edit mode\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.InvoiceTemplatePopUp,\r\n expanded: true,\r\n props: {\r\n Id: Id,\r\n },\r\n }),\r\n );\r\n }\r\n setBusy(false);\r\n },\r\n [Id, actions, dispatch, isEdit, setBusy, setInitialValue],\r\n );\r\n\r\n //CSS\r\n const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n invoiceTemplateHtmlTextBox: {\r\n width: '100%',\r\n minWidth: 500,\r\n backgroundColor: theme.palette.background.default,\r\n //position: 'relative',\r\n //overflow: 'auto',\r\n maxHeight: '63vh',\r\n overflowY: 'auto',\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n },\r\n }),\r\n );\r\n const classes = useStyles();\r\n\r\n //RENDER\r\n return (\r\n \r\n }\r\n onClick={() => {\r\n setOpen(true);\r\n }}\r\n >\r\n {}}\r\n aria-labelledby=\"form-dialog-title\"\r\n >\r\n \r\n {t(translations.InvoiceTemplateHtmlSource)}\r\n \r\n \r\n {/* \r\n {t(translations.InvoiceTemplateHtmlSource)}\r\n */}\r\n {\r\n setTextBoxValue(event.target.value);\r\n }}\r\n />\r\n \r\n \r\n {\r\n setOpen(false);\r\n }}\r\n variant=\"ghost\"\r\n >\r\n {t(translations.Cancel)}\r\n \r\n {\r\n setOpen(false);\r\n let values = { ...formikValues };\r\n values.Html = textBoxValue;\r\n OnUpdate(values);\r\n }}\r\n variant=\"main\"\r\n >\r\n {t(translations.Update)}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { FieldHookConfig, useField } from 'formik';\r\nimport { FormControl, FormGroup } from '@material-ui/core';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\nimport { HexColorPicker } from 'react-colorful';\r\nimport { InfoIcon } from '../BasicIcons/InfoIcon';\r\nimport { TextField, TextFieldProps } from '../TextField';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport const FormColorPicker = ({\r\n label,\r\n name,\r\n onBlur,\r\n onChange,\r\n value,\r\n ...props\r\n}: TextFieldProps & FieldHookConfig & IFieldProps) => {\r\n const { t } = useTranslation();\r\n const [field, meta, helpers] = useField({ name, ...props });\r\n\r\n const handleChange = e => {\r\n if (onChange !== undefined) {\r\n onChange(e);\r\n }\r\n field.onChange(e);\r\n };\r\n\r\n const handleColorPickerChange = (e: string) => {\r\n helpers.setValue(e);\r\n };\r\n\r\n //RENDER\r\n return (\r\n <>\r\n \r\n \r\n \r\n {props.info ? : null}\r\n {props.InputProps?.endAdornment}\r\n \r\n ),\r\n }}\r\n {...props}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { Box, Divider, Grid, Popover } from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Body } from 'app/components/Typography';\r\nimport { InvoiceIdMultiPicker } from 'app/components/pickers/AutocompletePickers/InvoiceIdMultiPicker';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n bindPopover,\r\n bindTrigger,\r\n usePopupState,\r\n} from 'material-ui-popup-state/hooks';\r\nimport { useCallback } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\nimport { buildURL, openExportLink } from 'utils/url-utils';\r\n\r\nexport interface PreviewButtonProps {}\r\n\r\nexport function PreviewButton() {\r\n //PROPS\r\n const { t } = useTranslation();\r\n\r\n const popupState = usePopupState({\r\n variant: 'popover',\r\n popupId: 'previewInvoiceSelection',\r\n });\r\n\r\n //STATES\r\n const [invoiceIds, setInvoiceIds] = useAsyncExtendedState<\r\n Entity[] | undefined\r\n >(undefined);\r\n\r\n //FUNCTIONS\r\n const handleInvoiceIdChange = useCallback(\r\n (value: Entity[] | undefined) => {\r\n setInvoiceIds(value);\r\n },\r\n [setInvoiceIds],\r\n );\r\n\r\n const handlePreview = () => {\r\n if (!!invoiceIds) {\r\n const ids: string = invoiceIds.map(item => item.Id).join(',');\r\n var params = {\r\n ids: ids,\r\n };\r\n //BillingController->InvoiceExportPDFs - [Route(\"api/Billing/Invoices/InvoiceExportPDFs\")]\r\n const url = buildURL('api/Billing/Invoices/InvoiceExportPDFs', params);\r\n openExportLink(url);\r\n popupState.close();\r\n setInvoiceIds([]);\r\n }\r\n };\r\n\r\n //RENDER\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.Invoice)}\r\n \r\n {\r\n popupState.close();\r\n setInvoiceIds([]);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n handleInvoiceIdChange(value);\r\n }}\r\n />\r\n \r\n \r\n \r\n handlePreview()}\r\n >\r\n {t(translations.Preview)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import Link from '@material-ui/core/Link';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { translations } from 'locales/translations';\r\nimport { ReactNode, useCallback, useRef, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Entity } from 'types/common';\r\nimport { Formik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { IInvoiceTemplatePopUp } from './IInvoiceTemplatePopUp';\r\nimport { InvoiceTemplatesApi } from 'api/InvoiceTemplatesApi';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport {\r\n StyledForm,\r\n FormLeftSection,\r\n FormFieldsSection,\r\n FormRow,\r\n FormRightSection,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { createStyles, makeStyles, Theme, Paper } from '@material-ui/core';\r\nimport { HtmlDefaultTemplate, PopUpListItems } from './PopUpListItems';\r\nimport { FormTextField } from 'app/components/Forms/FormTextField';\r\nimport { FormServiceGroupPicker } from 'app/components/Forms/FormServiceGroupPicker';\r\nimport { FormFundingTypePicker } from 'app/components/Forms/FormFundingTypePicker';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { EntityNumberSchema } from 'app/components/Forms/Schemas';\r\nimport { getSingleInvoiceFundingType } from 'app/components/pickers/StaticOptionsPickers/FundingTypeIdPicker';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { FormInputFile } from 'app/components/Forms/FormInputFile';\r\nimport { formFileSchema } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { HtmlTextBox } from './HtmlTextBox';\r\nimport { selectAppSettings } from 'app/slice/selectors';\r\nimport { BudgetFields } from 'enums/BudgetFields';\r\nimport { IsBudgetFieldEnabled, IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { FormColorPicker } from 'app/components/Forms/FormColorPicker';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { PreviewButton } from './PreviewButton';\r\n\r\nexport interface InvoiceTemplatePopUpProps extends CoverProps {\r\n Id?: number;\r\n serviceGroup?: Entity | null;\r\n isMainAdmin?: boolean | null;\r\n onClose?: () => void;\r\n}\r\n\r\nexport const InvoiceTemplatePopUpLink = ({\r\n children,\r\n ...props\r\n}: InvoiceTemplatePopUpProps & { children: ReactNode }) => {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const onClick = () => {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.InvoiceTemplatePopUp,\r\n expanded: true,\r\n props: {\r\n Id: props.Id,\r\n } as InvoiceTemplatePopUpProps,\r\n }),\r\n );\r\n };\r\n return {children};\r\n};\r\n\r\nexport const InvoiceTemplatePopUp = ({\r\n Id,\r\n serviceGroup,\r\n isMainAdmin,\r\n onClose,\r\n ...props\r\n}: InvoiceTemplatePopUpProps) => {\r\n //SETTINGS\r\n const { t } = useTranslation();\r\n const { newDate } = useSystemDate();\r\n const appSettings = useSelector(selectAppSettings);\r\n const budgetFieldFundingTypeEnabled:\r\n | boolean\r\n | undefined = (IsBudgetFieldEnabled(\r\n appSettings ?? null,\r\n BudgetFields.FundingType,\r\n ) ||\r\n IsModuleEnabled(appSettings ?? null, KnownModules.CostObjects)) as boolean;\r\n\r\n //PROPS\r\n const isEdit = !!Id;\r\n const submitRef = useRef();\r\n\r\n //REDUX\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const { actions: notifyActions } = useAppSettingsSlice();\r\n\r\n //STATES\r\n const [busy, setBusy] = useState(false);\r\n const [initialValues, setInitialValue] = useState({\r\n Id: -1,\r\n Name: null,\r\n CreatedAt: newDate(),\r\n LastUpdated: newDate(),\r\n FundingType: null,\r\n ServiceGroup: null,\r\n Html: HtmlDefaultTemplate,\r\n TableHeaderColor: '#8D8BC9',\r\n TableBodyColor: '#ffffff',\r\n HeaderFile: [],\r\n FooterFile: [],\r\n HeaderFileName: null,\r\n FooterFileName: null,\r\n });\r\n\r\n //SCHEMAS\r\n async function testHex(input: string | null | undefined) {\r\n let result = false;\r\n if (!!input) {\r\n const regHex = /^#([0-9a-f]{3}){1,2}$/i;\r\n result = regHex.test(input);\r\n }\r\n return result;\r\n }\r\n\r\n const InvoiceTemplatePopUpSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().notRequired().default(-1),\r\n Name: Yup.string().required(),\r\n CreatedAt: Yup.date().required().default(newDate()),\r\n LastUpdated: Yup.date().notRequired().nullable(),\r\n FundingType: Yup.array().of(EntityNumberSchema).notRequired().nullable(),\r\n ServiceGroup: Yup.array().of(EntityNumberSchema).notRequired().nullable(),\r\n Html: Yup.string().notRequired().nullable(),\r\n TableHeaderColor: Yup.string().notRequired().nullable().test({\r\n name: 'TableHeaderColor',\r\n test: testHex,\r\n }),\r\n TableBodyColor: Yup.string().notRequired().nullable().test({\r\n name: 'TableBodyColor',\r\n test: testHex,\r\n }),\r\n HeaderFile: Yup.array().of(formFileSchema).notRequired().nullable(),\r\n FooterFile: Yup.array().of(formFileSchema).notRequired().nullable(),\r\n HeaderFileName: Yup.string().notRequired().nullable(),\r\n FooterFileName: Yup.string().notRequired().nullable(),\r\n },\r\n );\r\n /* const InvoiceTemplatePopUpSGASchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Id: Yup.number().notRequired().default(-1),\r\n Name: Yup.string().required(),\r\n CreatedAt: Yup.date().required().default(new Date()),\r\n LastUpdated: Yup.date().notRequired().nullable(),\r\n FundingType: Yup.array().of(EntityNumberSchema).notRequired().nullable(),\r\n ServiceGroup: Yup.mixed().required(),\r\n Html: Yup.string().notRequired().nullable(),\r\n TableHeaderColor: Yup.string().notRequired().nullable(),\r\n TableBodyColor: Yup.string().notRequired().nullable(),\r\n HeaderFile: Yup.array().of(formFileSchema).notRequired().nullable(),\r\n FooterFile: Yup.array().of(formFileSchema).notRequired().nullable(),\r\n },\r\n ); */\r\n\r\n const close = useCallback(() => {\r\n if (props.isCover) {\r\n props.closeCover?.();\r\n } else {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n }, [props, dispatch, actions]);\r\n\r\n const refreshTable = useCallback(() => {\r\n dispatch(actions.setRefreshTable(true));\r\n }, [dispatch, actions]);\r\n\r\n function html_replace(html: string, valueToReplace: string) {\r\n const patrn = /background-color: #(?:[A-Fa-f0-9]{3}){1,2}\\b/;\r\n if (html.match(patrn)) {\r\n //console.log(html.match(patrn)?.toString());\r\n let originalValue: string = html.match(patrn)?.toString() as string;\r\n html = html.replaceAll(originalValue, valueToReplace);\r\n }\r\n return html;\r\n }\r\n\r\n const OnSubmit = useCallback(\r\n (invoiceTemplate: IInvoiceTemplatePopUp) => {\r\n setBusy(true);\r\n let invoiceTemplateHtml = html_replace(\r\n invoiceTemplate.Html as string,\r\n 'background-color: ' + invoiceTemplate.TableHeaderColor ??\r\n 'background-color: #FFFFFF',\r\n );\r\n //if Add mode\r\n if (!isEdit) {\r\n let formValues = {\r\n Id: invoiceTemplate.Id,\r\n Name: invoiceTemplate.Name,\r\n CreatedAt: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(invoiceTemplate.CreatedAt),\r\n ),\r\n LastUpdated: !!invoiceTemplate.LastUpdated\r\n ? dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(invoiceTemplate.LastUpdated),\r\n )\r\n : null,\r\n FundingType: invoiceTemplate.FundingType?.Id,\r\n ServiceGroupId: invoiceTemplate.ServiceGroup?.Id,\r\n ServiceGroup: invoiceTemplate.ServiceGroup?.Name ?? '',\r\n Html: invoiceTemplateHtml,\r\n TableHeaderColor: invoiceTemplate.TableHeaderColor,\r\n TableBodyColor: invoiceTemplate.TableBodyColor,\r\n HeaderFile: invoiceTemplate.HeaderFile,\r\n FooterFile: invoiceTemplate.FooterFile,\r\n HeaderFileName: invoiceTemplate.HeaderFileName,\r\n FooterFileName: invoiceTemplate.FooterFileName,\r\n };\r\n InvoiceTemplatesApi.insertInvoiceTemplate(formValues)\r\n .then(response => {\r\n if (response.ErrorMessages.length > 0) {\r\n response.ErrorMessages.forEach(errmsg =>\r\n dispatch(\r\n notifyActions.addNotification({\r\n variant: 'error',\r\n message: errmsg,\r\n }),\r\n ),\r\n );\r\n } else {\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: t(translations.InvoiceTemplateAddedSuccessfully),\r\n variant: 'success',\r\n }),\r\n );\r\n }\r\n })\r\n .catch(e => console.error(e))\r\n .finally(() => {\r\n close();\r\n refreshTable();\r\n });\r\n } else {\r\n //if Edit mode\r\n let formValues = {\r\n Id: invoiceTemplate.Id,\r\n Name: invoiceTemplate.Name,\r\n CreatedAt: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(invoiceTemplate.CreatedAt),\r\n ),\r\n LastUpdated: !!invoiceTemplate.LastUpdated\r\n ? dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(invoiceTemplate.LastUpdated),\r\n )\r\n : null,\r\n FundingType: invoiceTemplate.FundingType?.Id,\r\n ServiceGroupId: invoiceTemplate.ServiceGroup?.Id,\r\n ServiceGroup: invoiceTemplate.ServiceGroup?.Name ?? '',\r\n Html: invoiceTemplateHtml,\r\n TableHeaderColor: invoiceTemplate.TableHeaderColor,\r\n TableBodyColor: invoiceTemplate.TableBodyColor,\r\n HeaderFile: invoiceTemplate.HeaderFile,\r\n FooterFile: invoiceTemplate.FooterFile,\r\n HeaderFileName: invoiceTemplate.HeaderFileName,\r\n FooterFileName: invoiceTemplate.FooterFileName,\r\n };\r\n InvoiceTemplatesApi.updateInvoiceTemplate(Id, formValues)\r\n .then(response => {\r\n if (response.ErrorMessages.length > 0) {\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: response.ErrorMessages[0],\r\n variant: 'error',\r\n }),\r\n );\r\n setBusy(false);\r\n return;\r\n }\r\n dispatch(\r\n notifyActions.addNotification({\r\n message: t(translations.InvoiceTemplateUpdateSuccess),\r\n variant: 'success',\r\n }),\r\n );\r\n close();\r\n refreshTable();\r\n })\r\n .catch(e => console.error(e));\r\n }\r\n },\r\n [Id, close, dispatch, isEdit, notifyActions, refreshTable, t],\r\n );\r\n\r\n //USE EFFECT ON MOUNT\r\n useEffectOnMount(() => {\r\n //if Edit mode\r\n if (isEdit) {\r\n setBusy(true);\r\n let mounted = true;\r\n (async () => {\r\n try {\r\n const invoiceTemplate = await InvoiceTemplatesApi.getInvoiceTemplateById(\r\n Id,\r\n );\r\n if (mounted) {\r\n setInitialValue({\r\n Id: invoiceTemplate.value[0].Id ?? -1,\r\n Name: invoiceTemplate.value[0].Name ?? null,\r\n CreatedAt: invoiceTemplate.value[0].CreatedAt ?? null,\r\n LastUpdated: invoiceTemplate.value[0].LastUpdated ?? null,\r\n FundingType:\r\n getSingleInvoiceFundingType(\r\n invoiceTemplate.value[0].FundingType,\r\n ) ?? null,\r\n ServiceGroup: invoiceTemplate.value[0].ServiceGroup\r\n ? {\r\n Id: invoiceTemplate.value[0].ServiceGroupId,\r\n Name: invoiceTemplate.value[0].ServiceGroup,\r\n }\r\n : null,\r\n //\"split\"-\"join\" is to avoid breaking the RichTextEditor (path, offset problems)\r\n Html:\r\n invoiceTemplate.value[0].Html.split(/[\\r\\n]+/).join('') ?? null,\r\n //Html: invoiceTemplate.value[0].Html ?? null,\r\n TableHeaderColor:\r\n invoiceTemplate.value[0].TableHeaderColor ?? null,\r\n TableBodyColor: invoiceTemplate.value[0].TableBodyColor ?? null,\r\n HeaderFile: [],\r\n FooterFile: [],\r\n HeaderFileName: invoiceTemplate.value[0].HeaderFileName,\r\n FooterFileName: invoiceTemplate.value[0].FooterFileName,\r\n });\r\n setBusy(false);\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n })();\r\n return () => {\r\n mounted = false;\r\n };\r\n } else {\r\n //if Add mode\r\n //if (!!serviceGroup) {\r\n setBusy(true);\r\n let isMounted = true;\r\n if (isMounted) {\r\n const values = { ...initialValues };\r\n values.Name = t(translations.InvoiceTemplate) as string;\r\n if (!!serviceGroup && isMainAdmin === false) {\r\n //set first service group\r\n values.ServiceGroup = serviceGroup;\r\n }\r\n setInitialValue(values);\r\n setBusy(false);\r\n }\r\n return () => {\r\n isMounted = false;\r\n };\r\n //}\r\n //return;\r\n }\r\n });\r\n\r\n //CSS\r\n const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n leftSectionH6Image: {\r\n padding: theme.spacing(1),\r\n backgroundColor: '#026AA2',\r\n color: '#FFFFFF',\r\n marginRight: 10,\r\n },\r\n rightSectionH5Title: {\r\n padding: theme.spacing(2),\r\n backgroundColor: '#026AA2',\r\n },\r\n row: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n width: '100%',\r\n },\r\n }),\r\n );\r\n const classes = useStyles();\r\n\r\n //FORM\r\n const InvoiceTemplateForm = () => {\r\n return (\r\n \r\n {formik => {\r\n submitRef.current = formik.submitForm;\r\n const additionalButtons = [\r\n (classname, key) => {\r\n return (\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\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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(\r\n translations.ReservedWordsForInvoiceLetterTemplateMsg,\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 const leftActions = [\r\n () => (\r\n <>\r\n submitRef.current?.()}\r\n size=\"small\"\r\n disabled={busy}\r\n >\r\n {t(translations.Save)}\r\n \r\n \r\n ),\r\n ];\r\n\r\n const rightActions = [\r\n () => (\r\n <>\r\n }\r\n onClick={close}\r\n size=\"small\"\r\n disabled={busy}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n \r\n ),\r\n ];\r\n\r\n //RENDER\r\n return (\r\n }\r\n leftActions={leftActions}\r\n rightActions={rightActions}\r\n disableExpandToggle={true}\r\n /* closeSidePanel={() => {\r\n if (hasChanges) {\r\n dispatch(actions.setConfirmOpen(true));\r\n } else {\r\n dispatch(actions.resetSidePanel());\r\n }\r\n }} */\r\n isCover={props.isCover}\r\n closeCover={props.closeCover}\r\n />\r\n );\r\n};\r\n","/**\r\n *\r\n * EmailTypePicker\r\n *\r\n */\r\n\r\nimport {\r\n EmailTypeUnionArray,\r\n EmailTypeUnion,\r\n} from 'api/odata/generated/enums/EmailType';\r\nimport {\r\n EnumPicker,\r\n EnumPickerProps,\r\n withEnumOptions,\r\n} from 'app/components/BasicPickers/EnumPicker';\r\n\r\nexport type EmailTypePickerProps = Omit<\r\n EnumPickerProps,\r\n 'EnumNamesArray'\r\n>;\r\nexport const EmailTypePicker = withEnumOptions(\r\n EmailTypeUnionArray,\r\n)(EnumPicker);\r\n","/**\r\n *\r\n * EmailTypeFilter\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IFilterComponentProps } from '../IFilterComponentProps';\r\nimport { EmailTypePicker } from 'app/components/pickers/StaticOptionsPickers/EmailTypePicker';\r\nimport { EmailTypeUnion } from 'api/odata/generated/enums/EmailType';\r\n\r\nexport const EmailTypeFilter = (props: IFilterComponentProps) => {\r\n const handleOnChange = (value: EmailTypeUnion | null) => {\r\n props.onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n return (\r\n \r\n );\r\n};\r\nexport default EmailTypeFilter;\r\n","import { ODataOperators } from 'api/odata/ODataFilter';\r\nimport { GetPageFilters } from 'app/components/BasicTable/BasicFilter/GetPageFilters';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { AssetPickerFilter } from 'app/components/BasicTable/Filters/AssetFilter';\r\nimport { DatesRangeFilter } from 'app/components/BasicTable/Filters/DatesRangeFilter';\r\nimport { UserFilter } from 'app/components/BasicTable/Filters/UserFilter';\r\nimport {\r\n getDefaultFilterDatePeriod,\r\n GetNumberOrUndefined,\r\n GetPartialEntity,\r\n GetRawValue,\r\n GetStringOrUndefined,\r\n getStringUnionOrUndefined,\r\n initPickerValue,\r\n presetDatesRangeToQueryString,\r\n URLSearchParamsCI,\r\n} from 'app/components/BasicTable/types/FilterParam';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { initAssetData } from 'app/components/pickers/AutocompletePickers/AssetPicker';\r\nimport { initUserData } from 'app/components/pickers/AutocompletePickers/UserPicker';\r\nimport { translations } from 'locales/translations';\r\nimport { PresetDatesRange } from 'types/PresetDatesRange';\r\nimport { IEmailNotificationsRow } from './IEmailNotificationsRow';\r\nimport { EmailTypeUnionArray } from 'api/odata/generated/enums/EmailType';\r\nimport EmailTypeFilter from 'app/components/BasicTable/Filters/EmailTypeFilter';\r\nimport NumberFieldFilter from 'app/components/BasicTable/Filters/NumberFieldFilter';\r\n\r\nexport const GetFilters: GetPageFilters = (\r\n t,\r\n appSettings,\r\n user,\r\n settings,\r\n) => search => {\r\n const params = new URLSearchParamsCI(search);\r\n var result: IFilterSettings[] = [\r\n {\r\n fieldName: 'Recipient',\r\n displayName: t(translations.Recipient),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'recipient',\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'recipient')),\r\n ),\r\n component: UserFilter,\r\n initData: initPickerValue(initUserData),\r\n },\r\n {\r\n fieldName: 'AssetId',\r\n queryStringSerializer: 'aid',\r\n displayName: t(translations.Asset),\r\n operator: ODataOperators.Equals,\r\n value: GetPartialEntity(GetNumberOrUndefined(GetRawValue(params, 'aid'))),\r\n initData: initPickerValue(initAssetData),\r\n component: AssetPickerFilter,\r\n },\r\n {\r\n fieldName: 'CreatedBy',\r\n displayName: t(translations.CreatedBy),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'createdby',\r\n value: GetPartialEntity(\r\n GetStringOrUndefined(GetRawValue(params, 'createdby')),\r\n ),\r\n component: UserFilter,\r\n initData: initPickerValue(initUserData),\r\n },\r\n {\r\n fieldName: 'Timestamp',\r\n displayName: t(translations.Timestamp),\r\n operator: ODataOperators.Between,\r\n defaultValue: PresetDatesRange.fromPreset(\r\n getPeriodTypesEntity('ThisMonth'),\r\n ),\r\n queryStringSerializer: presetDatesRangeToQueryString(\r\n 'period',\r\n 'st',\r\n 'et',\r\n ),\r\n value: getDefaultFilterDatePeriod('period', 'st', 'et', params),\r\n component: DatesRangeFilter,\r\n urlKey: 'period',\r\n },\r\n {\r\n fieldName: 'NotificationTypeId',\r\n displayName: t(translations.NotificationType),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'NotificationTypeId',\r\n value: getStringUnionOrUndefined(\r\n GetRawValue(params, 'NotificationTypeId'),\r\n EmailTypeUnionArray,\r\n ),\r\n component: EmailTypeFilter,\r\n },\r\n {\r\n fieldName: 'ReferenceId',\r\n displayName: t(translations.Reference),\r\n operator: ODataOperators.Equals,\r\n queryStringSerializer: 'ReferenceId',\r\n value: GetNumberOrUndefined(GetRawValue(params, 'ReferenceId')),\r\n component: NumberFieldFilter,\r\n },\r\n ];\r\n return result;\r\n};\r\n","import { Skeleton } from '@material-ui/lab';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\n\r\nexport interface CustomFormSkeletonProps {\r\n formFields: IFormFieldDto[];\r\n}\r\nexport function CustomFormSkeleton(props: CustomFormSkeletonProps) {\r\n // TODO: add skeleton based on the formfields definition\r\n return ;\r\n}\r\n","/**\r\n *\r\n * QuizCustomForm\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { Formik } from 'formik';\r\nimport { Grid } from '@material-ui/core';\r\nimport { CustomFormField } from './CustomFormFields';\r\nimport { ValidationSchemaProvider } from '../Forms/ValidationSchemaProvider';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport {\r\n getCustomFormInitialValues,\r\n useCustomFormSchema,\r\n} from './CustomFormUtils';\r\nimport { CustomFormSkeleton } from './CustomFormSkeleton';\r\n\r\nexport interface QuizCustomFormProps {\r\n formFields: IFormFieldDto[];\r\n formValues?: IFormValueDto[];\r\n readonly?: boolean;\r\n onSubmit: (value: CustomFormValue) => void;\r\n bindSubmitForm: any;\r\n}\r\n\r\nexport interface CustomFormValue extends Record {}\r\n\r\nexport function QuizCustomForm({\r\n formFields,\r\n formValues,\r\n onSubmit,\r\n readonly,\r\n bindSubmitForm,\r\n}: QuizCustomFormProps) {\r\n const schema = useCustomFormSchema(formFields, false);\r\n const handleSubmit = value => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(value);\r\n }\r\n };\r\n const initialValues = getCustomFormInitialValues(\r\n formFields,\r\n formValues,\r\n true,\r\n );\r\n if (initialValues === undefined) {\r\n // show progress while form values are being fetched\r\n return ;\r\n }\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n return (\r\n \r\n <>\r\n
    \r\n \r\n {formFields.map((formField, index) => {\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 \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { IQuizDto } from 'api/odata/generated/entities/IQuizDto';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { IQuizSubmissionDto } from 'api/odata/generated/entities/IQuizSubmissionDto';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { push } from 'connected-react-router';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { Box } from '@material-ui/core';\r\nimport parse from 'html-react-parser';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { Body } from 'app/components/Typography';\r\nimport { selectExpandedSidePanel } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { QuizDetailsProps } from 'app/pages/QuizDetailsPage/QuizDetails';\r\nimport { QuizCustomForm } from 'app/components/CustomForm/QuizCustomForm';\r\nimport { ParseFormFieldEnums } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { IFormValueDto } from 'api/odata/generated/entities/IFormValueDto';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n StyledFormFieldsContainer,\r\n} from 'app/components/Forms/FormsLayout';\r\n\r\nexport interface StartQuizProps extends SidePanelContentProps {\r\n id: string;\r\n closable: boolean;\r\n}\r\nexport function StartQuiz(props: StartQuizProps) {\r\n const { id, useSidePanel } = props;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const User = useSelector(selectAuthenticatedUser);\r\n const fetchQuiz = async (quizId: number) =>\r\n httpClient\r\n .get(`/api/odata/v4/quizzes(${quizId})`, {\r\n $expand: ['Submissions', 'ServiceGroups'].join(','),\r\n })\r\n .then(value => {\r\n // Enums are serialized using string representations\r\n // parse enum values\r\n ParseFormFieldEnums(value.FormFields);\r\n // shuffle questions according to quiz settings\r\n if (value.ShuffleFields) {\r\n value.FormFields = value.FormFields.sort(() => 0.5 - Math.random());\r\n }\r\n // enumerate questions\r\n value.FormFields.forEach(\r\n (formField, index) =>\r\n (formField.Label = `${t(translations.Question)} ${index + 1}. ${\r\n formField.Label\r\n }`),\r\n );\r\n value.UsedAttempts = value.Submissions.filter(\r\n item =>\r\n item.SubmittedById === User?.Id &&\r\n (item.Score ?? 0) < (value.QuizTrainingPassingScore ?? 0),\r\n ).length;\r\n value.UserCanStartQuiz =\r\n value.UsedAttempts === 0 ||\r\n (value.QuizNumberOfAttempts ?? 0) === 0 ||\r\n value.UsedAttempts < (value.QuizNumberOfAttempts ?? 0);\r\n return value;\r\n });\r\n const [fetchQuizPromiseState, fetchQuizPromise] = usePromise(fetchQuiz);\r\n const [state, setState] = useAsyncExtendedState(\r\n undefined,\r\n );\r\n const [startQuiz, setStartQuiz] = React.useState(true);\r\n useEffectOnMount(() => {\r\n setState(fetchQuizPromise(+id));\r\n return () => {};\r\n });\r\n const isMobile = DetectIsMobile();\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n React.useEffect(() => {\r\n const messageKey = 'QuizLoad';\r\n if (fetchQuizPromiseState.error) {\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: 'Something went wrong.',\r\n key: messageKey,\r\n }),\r\n );\r\n }\r\n }, [fetchQuizPromiseState.error, actions, dispatch]);\r\n\r\n const [submitStatus, submitQuiz] = usePromise(\r\n async (values: Record) => {\r\n const formValues: IFormValueDto[] = Object.entries(values).map(\r\n ([formFieldId, value]) => ({\r\n Id: -1,\r\n FormFieldId: +formFieldId,\r\n Value: value,\r\n SourceValueId: null,\r\n AlertId: null,\r\n AlertTypeId: null,\r\n Readonly: false,\r\n CustomFormId: null,\r\n CustomFormName: null,\r\n DisplayValue: null,\r\n RequestId: null,\r\n ReservationId: null,\r\n ExperimentItemId: null,\r\n BudgetExperimentId: null,\r\n ServiceGroupUserId: null,\r\n ServiceGroupId: null,\r\n }),\r\n );\r\n const quizSubmission: Partial = {\r\n CustomFormId: +id,\r\n FormValues: formValues,\r\n };\r\n return httpClient.post>(\r\n `/api/odata/v4/quizsubmissions`,\r\n quizSubmission,\r\n );\r\n },\r\n );\r\n const [readonly] = React.useState(false);\r\n const [submission, setSubmission] = useAsyncExtendedState<\r\n Partial | undefined\r\n >(undefined);\r\n\r\n React.useEffect(() => {\r\n const messageKey = 'QuizSubmission';\r\n if (submitStatus.status === 'resolved') {\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'success',\r\n message: 'Submission success.',\r\n key: messageKey,\r\n }),\r\n );\r\n }\r\n if (submitStatus.status === 'rejected') {\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: 'Submission failed.',\r\n key: messageKey,\r\n }),\r\n );\r\n }\r\n }, [actions, dispatch, submitStatus.status]);\r\n\r\n const submissionId = submission?.Id;\r\n const resultQuiz = React.useCallback(() => {\r\n if (useSidePanel) {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.QuizzDetails,\r\n props: {\r\n id: '' + submissionId,\r\n useSidePanel: useSidePanel,\r\n } as QuizDetailsProps,\r\n }),\r\n );\r\n } else {\r\n dispatch(push(`/quizzes/details/${submissionId}`));\r\n }\r\n }, [dispatch, layoutActions, submissionId, useSidePanel]);\r\n React.useEffect(() => {\r\n if (submissionId !== undefined) {\r\n resultQuiz();\r\n }\r\n }, [resultQuiz, submissionId]);\r\n const handleSubmit = (values: Record) =>\r\n setSubmission(submitQuiz(values));\r\n const submitFormRef = React.useRef(null);\r\n const handleSubmitForm = e => {\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const leftActions = React.useMemo(\r\n () => [\r\n () =>\r\n readonly !== true && startQuiz ? (\r\n \r\n }\r\n onClick={() => setStartQuiz(false)}\r\n >\r\n {isMobile || !sidePanelExpanded\r\n ? t(translations.Continue)\r\n : t(translations.ContinueToQuiz)}\r\n \r\n \r\n ) : (\r\n \r\n }\r\n onClick={handleSubmitForm}\r\n >\r\n {t(translations.Submit)}\r\n \r\n \r\n ),\r\n ],\r\n [isMobile, readonly, sidePanelExpanded, startQuiz, t],\r\n );\r\n const rightActions = React.useMemo(() => {\r\n return [\r\n () =>\r\n readonly !== true && (\r\n \r\n }\r\n onClick={() => {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push(`/quizzes`));\r\n }\r\n }}\r\n >\r\n {state?.UserCanStartQuiz\r\n ? isMobile || !sidePanelExpanded\r\n ? t(translations.Cancel)\r\n : t(translations.CancelYourSubmission)\r\n : t(translations.BackToQuizzes)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [\r\n dispatch,\r\n isMobile,\r\n layoutActions,\r\n readonly,\r\n sidePanelExpanded,\r\n state?.UserCanStartQuiz,\r\n t,\r\n useSidePanel,\r\n ]);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {state.UserCanStartQuiz ? (\r\n \r\n \r\n {(t(translations.QuizDescription) as string)\r\n .replace(\r\n '{0}',\r\n state?.FormFields?.length.toString(),\r\n )\r\n .replace(\r\n '{1}',\r\n (state.QuizTrainingPassingScore ?? 0).toString(),\r\n )}\r\n \r\n\r\n \r\n {startQuiz ? (\r\n \r\n \r\n {parse(state?.QuizInstructions || '')}\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 {t(translations.QuizFiledAttemptsMessage).replace(\r\n '{0}',\r\n state.UsedAttempts.toString(),\r\n )}\r\n \r\n \r\n {state.EquipmentName && (\r\n \r\n \r\n \r\n {t(\r\n translations.QuizFiledAttemptsInstrumentMessage,\r\n )}\r\n \r\n \r\n {state.EquipmentName}\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 leftActions={state?.UserCanStartQuiz ? leftActions : undefined}\r\n rightActions={rightActions}\r\n closable={true}\r\n />\r\n );\r\n}\r\n","import { Chip, ChipProps, Theme, withStyles } from '@material-ui/core';\r\n\r\nexport interface StatusChipProps extends ChipProps {}\r\n\r\nconst StyledChip = withStyles((theme: Theme) => ({\r\n // root: {\r\n // borderRadius: 4,\r\n // backgroundColor: theme.palette.primary.main,\r\n // height: 24,\r\n // color: theme.palette.common.white,\r\n // gap: 4,\r\n // paddingBlock: '2px',\r\n // '&$disabled': {\r\n // opacity: 1,\r\n // backgroundColor: theme.palette.common.grayComponents,\r\n // color: theme.palette.common.white,\r\n // pointerEvents: 'none',\r\n // },\r\n // '&:hover, &:focus': {\r\n // backgroundColor: theme.palette.primary.dark,\r\n // color: theme.palette.common.white,\r\n // },\r\n // },\r\n // disabled: {\r\n // backgroundColor: theme.palette.common.grayComponents,\r\n // color: theme.palette.common.white,\r\n // },\r\n // label: {\r\n // fontFamily: `'Lato', sans-serif`,\r\n // fontStyle: 'normal',\r\n // fontWeight: 400,\r\n // fontSize: '14px',\r\n // lineHeight: '141%',\r\n // letterSpacing: '0.1px',\r\n // },\r\n // labelSmall: {\r\n // fontFamily: `'Lato', sans-serif`,\r\n // fontStyle: 'normal',\r\n // fontWeight: 400,\r\n // fontSize: '14px',\r\n // lineHeight: '141%',\r\n // letterSpacing: '0.1px',\r\n // },\r\n // clickable: {\r\n // backgroundColor: theme.palette.primary.main,\r\n // color: theme.palette.common.white,\r\n // },\r\n // sizeSmall: {\r\n // height: 20,\r\n // },\r\n // deleteIcon: {\r\n // color: theme.palette.primary.contrastText,\r\n // height: 18,\r\n // width: 18,\r\n // '&:hover': {\r\n // color: fade(theme.palette.primary.contrastText, 0.8),\r\n // },\r\n // },\r\n}))(Chip);\r\n\r\nexport const StatusChip = (props: StatusChipProps) => {\r\n return ;\r\n};\r\n","import { IWorkOrderDetailsDto } from 'api/odata/generated/entities/IWorkOrderDetailsDto';\r\nimport { StatusChip } from 'app/components/BasicChip/StatusChip';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { DescriptionCell } from 'app/components/BasicTable/components/DescriptionCell';\r\nimport { UserProfileLink } from 'app/components/BasicTable/components/UserProfileLink';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { GlobalSettings } from 'utils/globalSettings';\r\nimport { SidePanelOpenState } from 'app/hooks/useSidePanelOpen';\r\nimport { AssetLink } from '../AssetPopUp/OpenAssetDetails';\r\nimport {\r\n allowedToViewAlert,\r\n IAlertPermissionCheckRecord,\r\n} from 'app/permissions/WorkOrders/workOrdersPermissionUtils';\r\nimport { WorkOrderLink } from '../Actions/GlobalSelectedActions/OpenWorkOrder';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nexport const getColumns = (\r\n t: TFunction,\r\n appSettings?: AppSettings,\r\n globalSettings?: GlobalSettings,\r\n user?: AuthenticatedUser,\r\n useSidePanel?: boolean,\r\n openPanel?: (state: SidePanelOpenState) => void,\r\n): Column[] => {\r\n return [\r\n {\r\n Header: t(translations.Id) as string,\r\n accessor: 'Id',\r\n //for testing comments component\r\n //Cell: WorkOrderIdRenderer,\r\n Cell: ({ value, row }) => {\r\n return allowedToViewAlert(\r\n user,\r\n row.original as IAlertPermissionCheckRecord,\r\n ) && value !== null ? (\r\n \r\n {value}\r\n \r\n ) : (\r\n <>{value}\r\n );\r\n },\r\n },\r\n //Attachment of Comment\r\n {\r\n Header: () => (\r\n <>\r\n {t(translations.Attachment) as string} \r\n \r\n ),\r\n accessor: 'AttachmentExist',\r\n Cell: ({ value, row }) => (\r\n <>{value === true ? : <>}\r\n ),\r\n },\r\n {\r\n Header: t(translations.AssetName) as string,\r\n accessor: 'AssetName', // AssetName\r\n Cell: ({ value, row }) =>\r\n !!row.original.AssetId ? (\r\n \r\n {value}\r\n \r\n ) : (\r\n <>{value}\r\n ),\r\n },\r\n {\r\n Header: t(translations.ServiceGroup) as string,\r\n accessor: 'ServiceGroup', // Laboratory\r\n },\r\n {\r\n Header: t(translations.AlertDescription) as string,\r\n accessor: 'AlertDescription', // Description\r\n Cell: DescriptionCell({ width: 'short' }),\r\n },\r\n {\r\n Header: t(translations.AlertTitle) as string,\r\n accessor: 'AlertTitle', // Subject\r\n },\r\n {\r\n Header: t(translations.StatusName) as string,\r\n accessor: 'StatusName', // StatusName\r\n },\r\n {\r\n Header: t(translations.AlertType) as string,\r\n accessor: 'AlertType', // WorkOrderType\r\n },\r\n {\r\n Header: t(translations.EventDueDate) as string,\r\n accessor: 'EventStart', // WorkOrderStart\r\n Cell: ({ value }) => <>{dateUtils.shortDateTimeFormat(value)},\r\n },\r\n {\r\n Header: t(translations.EventEnd) as string,\r\n accessor: 'EventEnd', // WorkOrderEnd\r\n Cell: ({ value }) => {\r\n if (value !== null) {\r\n return <>{dateUtils.shortDateTimeFormat(value)};\r\n } else {\r\n return <>;\r\n }\r\n },\r\n },\r\n {\r\n Header: t(translations.ReportedBy) as string,\r\n accessor: 'ReportedBy',\r\n Cell: ({ value, row }) => (\r\n <>\r\n \r\n \r\n ),\r\n },\r\n {\r\n Header: t(translations.AssignedUsers) as string,\r\n accessor: 'AssignedUsers',\r\n Cell: ({ value, row }) => {\r\n if (value !== undefined) {\r\n let users = value.map((item, i) => {\r\n return (\r\n \r\n \r\n
    \r\n
    \r\n );\r\n });\r\n return <>{users};\r\n }\r\n return t(translations.NA) as string;\r\n },\r\n },\r\n {\r\n Header: t(translations.LastUpdated) as string,\r\n accessor: 'LastUpdated', // UpdatedAt\r\n Cell: ({ value }) => <>{dateUtils.shortDateTimeFormat(value)},\r\n },\r\n {\r\n Header: t(translations.Reservation) as string,\r\n accessor: 'Reservation', // ReservationId\r\n },\r\n {\r\n Header: t(translations.LastComment) as string,\r\n accessor: 'LastComment',\r\n Cell: DescriptionCell({ width: 'medium' }),\r\n },\r\n {\r\n Header: t(translations.LastCommentBy) as string,\r\n accessor: 'LastCommentBy',\r\n },\r\n {\r\n Header: t(translations.LastCommentAt) as string,\r\n accessor: 'LastCommentAt',\r\n Cell: ({ value }) => <>{dateUtils.shortDateTimeFormat(value)},\r\n },\r\n {\r\n Header: t(translations.AlertOfflineTime) as string,\r\n accessor: 'AlertOfflineTime', // OfflineTime (h)\r\n Cell: ({ value, row }) => {\r\n if (value) {\r\n if (value > 69000000) {\r\n return (\r\n }\r\n variant=\"outlined\"\r\n />\r\n );\r\n } else {\r\n return value;\r\n }\r\n } else {\r\n return <>{'N/A'};\r\n }\r\n // let startTime: Date | null = value;\r\n // let endTime: Date | null = row.original.OfflineEnd;\r\n // if (startTime !== null && endTime !== null) {\r\n // let newStartTime = new Date(startTime);\r\n // let newEndTime = new Date(endTime);\r\n // let timeDiff =\r\n // (newEndTime.getTime() - newStartTime.getTime()) / 36e5;\r\n // return <> {(Math.round(timeDiff * 100) / 100).toFixed(2)} ;\r\n // } else return <>;\r\n },\r\n },\r\n ];\r\n};\r\n","import fileDownload from 'js-file-download';\r\nimport * as Papa from 'papaparse';\r\n\r\nexport type CsvColumnsMapType = { [key in keyof T]: 'string' };\r\n\r\nexport async function writeCsvFile(\r\n fields: string[],\r\n data: string[][],\r\n): Promise {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const csv = Papa.unparse({ fields: fields, data: data });\r\n resolve(csv);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\nexport async function exportCsv({\r\n data,\r\n fields,\r\n fileName = 'file.csv',\r\n}: {\r\n data: unknown[][];\r\n fields: string[];\r\n fileName: string;\r\n}): Promise {\r\n const stringData = data.map(row =>\r\n row.map(value => (value as any)?.toString()),\r\n );\r\n const csvContent = await writeCsvFile(fields, stringData);\r\n fileDownload(csvContent, fileName);\r\n}\r\n","import {\r\n call,\r\n put,\r\n takeLatest,\r\n debounce,\r\n select,\r\n takeLeading,\r\n} from 'redux-saga/effects';\r\nimport { samplesListActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { PayloadAction } from '@reduxjs/toolkit';\r\nimport {\r\n IRunDetails,\r\n ISample,\r\n ISampleListTableState,\r\n ISampleRun,\r\n ISampleRunUpdate,\r\n ISampleTarget,\r\n} from './types';\r\nimport { push } from 'connected-react-router';\r\nimport { TableFilterBuilder } from 'app/components/BasicTable/TableFilterBuilder';\r\nimport { AxiosError } from 'axios';\r\nimport * as Papa from 'papaparse';\r\nimport { Identifiable } from 'types/common';\r\nimport { selectRunDetails, selectSamplesTableState } from './selectors';\r\nimport { RunTypesUnion } from '../../components/RunTypePicker';\r\n\r\nimport { getExportParameters, buildURL } from 'utils/url-utils';\r\nimport i18next from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { selectSamplePlatesTableState } from '../../SamplePlatesPage/slice/selectors';\r\nimport { deleteSamples, IDeleteSamplesResult } from 'api/SamplesApi';\r\nimport { exportCsv } from 'utils/export';\r\nimport { IFilterSettings } from 'app/components/BasicTable/BasicFilter/IFilterSettings';\r\nimport { ISampleCreateBase } from '../../SamplePlatesPage/slice/types';\r\nimport { ISamplePlateDto } from 'api/odata/generated/entities/ISamplePlateDto';\r\nimport { IRow } from 'app/components/BasicTable/IRow';\r\nimport { BasicTableRefreshEventHandler } from 'app/components/BasicTable/ControlledTable/ControlledTableProps';\r\nimport { openExportLink } from 'utils/url-utils';\r\n\r\ninterface ODataParams {\r\n $top: number | undefined;\r\n $skip: number | undefined;\r\n $count?: boolean;\r\n $orderby?: string;\r\n $filter?: string;\r\n $select?: string;\r\n}\r\nexport function getLoadDataParams(\r\n currentTableState: Partial,\r\n): ODataParams {\r\n const params = {\r\n $count: true,\r\n $top: currentTableState.pageSize,\r\n $skip:\r\n (currentTableState.pageIndex ?? 1) * (currentTableState.pageSize ?? 5),\r\n $orderby:\r\n currentTableState.sortBy\r\n ?.map(f => `${f.id} ${f.desc ?? false ? 'desc' : 'asc'}`)\r\n .join(',') || undefined,\r\n //$select: ,\r\n $filter: TableFilterBuilder(\r\n currentTableState.customFilters as Array>,\r\n currentTableState.globalFilter,\r\n currentTableState.serviceGroups,\r\n currentTableState.searchColumns,\r\n ),\r\n $select:\r\n currentTableState.visibleColumns === undefined\r\n ? undefined\r\n : currentTableState.visibleColumns.join(','),\r\n };\r\n return params;\r\n}\r\nasync function loadData(currentTableState) {\r\n const url = '/api/odata/v4/samples';\r\n const params = getLoadDataParams(currentTableState);\r\n const result = await httpClient.get(url, params);\r\n return result;\r\n}\r\nfunction* doExport(action: PayloadAction) {\r\n try {\r\n const tableState = yield select(selectSamplesTableState);\r\n const tableParams = getLoadDataParams({\r\n ...tableState,\r\n ...{ visibleColumns: action.payload.visibleColumns },\r\n });\r\n const entitySetURl = '/api/odata/v4/samples';\r\n var params = getExportParameters(tableParams);\r\n const url = buildURL(entitySetURl, params);\r\n yield call(openExportLink, url);\r\n } catch (error) {\r\n console.error('doExport failed', error);\r\n }\r\n}\r\nasync function loadIds(currentTableState) {\r\n const url = '/api/odata/v4/samples';\r\n const params = getLoadDataParams(currentTableState);\r\n params.$top = undefined;\r\n params.$skip = undefined;\r\n params.$count = undefined;\r\n params.$orderby = undefined;\r\n params.$select = 'Id';\r\n const result = await httpClient.get(url, params);\r\n return result;\r\n}\r\nfunction* doLoadData(\r\n action: PayloadAction<{\r\n tableState: ISampleListTableState;\r\n columns: (keyof ISample)[] | undefined;\r\n }>,\r\n) {\r\n try {\r\n const data = yield call(loadData, action.payload);\r\n yield put(actions.loadSamplesList_Success(data));\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n}\r\nfunction* doUpdateField(action: PayloadAction>) {\r\n const url = `/api/odata/v4/samples(${action.payload.Id})`;\r\n const payload: Partial = { ...action.payload };\r\n delete payload.Id;\r\n try {\r\n yield call(httpClient.patch, url, payload);\r\n yield put(actions.updateField_Success());\r\n } catch (error) {\r\n const msg = (error as AxiosError)?.response?.data?.error?.innererror\r\n ?.message;\r\n if (msg !== undefined) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'SamplesListPage.saga.updateField',\r\n variant: 'error',\r\n message: msg,\r\n }),\r\n );\r\n }\r\n yield put(actions.updateField_Error());\r\n }\r\n}\r\nfunction* doRunSelectedSamples(\r\n action: PayloadAction<{ runType?: string; samples: ISample[] | undefined }>,\r\n) {\r\n try {\r\n const httpUrl = '/api/odata/v4/sampleruns';\r\n let samples = action.payload.samples;\r\n if (samples === undefined) {\r\n const tableState = yield select(selectSamplesTableState);\r\n const allsamples = yield call(loadIds, tableState);\r\n samples = allsamples.value;\r\n }\r\n if (samples === undefined) {\r\n return;\r\n }\r\n const httpPayload = {\r\n RunType: action.payload.runType,\r\n Samples: samples.map(f => ({\r\n Id: f.Id,\r\n })),\r\n };\r\n const response = yield call(httpClient.post, httpUrl, httpPayload);\r\n yield put(push(`/samples/runs/details/${response.Id}`));\r\n } catch (error: unknown) {\r\n console.error(error);\r\n }\r\n}\r\nfunction* doCompleteRun(action: PayloadAction) {\r\n try {\r\n const url = `/api/odata/v4/sampleruns(${action.payload.Id})`;\r\n // note that api call does not return dto but rater a custom summary of the operation\r\n const completeRunResponse: {\r\n derivativesCount: number;\r\n skippedSamplesCount: number;\r\n } = yield call(httpClient.put, url, action.payload);\r\n yield put(actions.completeRun_Success);\r\n const msg = [\r\n i18next.t(translations.XSamplesWereProcessed, completeRunResponse),\r\n ];\r\n if (completeRunResponse.skippedSamplesCount > 0) {\r\n msg.push(\r\n i18next.t(translations.XSamplesWereSkipped, completeRunResponse),\r\n );\r\n }\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: msg.join(' '),\r\n variant:\r\n completeRunResponse.skippedSamplesCount === 0 &&\r\n completeRunResponse.derivativesCount > 0\r\n ? 'success'\r\n : completeRunResponse.skippedSamplesCount > 0 &&\r\n completeRunResponse.derivativesCount > 0\r\n ? 'warning'\r\n : 'error',\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const msg =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n 'Operation Failed';\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'SamplesListPage.saga.updateField',\r\n variant: 'error',\r\n message: msg,\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doUpdateRun(action: PayloadAction) {\r\n try {\r\n const url = '/api/odata/v4/SampleRuns/SampleRunUpdate';\r\n const data = {\r\n runupdate: action.payload,\r\n };\r\n const result = yield call(httpClient.post, url, data);\r\n yield put(actions.updateRun_Success(result));\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: 'success',\r\n variant: 'success',\r\n }),\r\n );\r\n } catch (error: unknown) {\r\n const msg =\r\n (error as AxiosError)?.response?.data?.error?.innererror?.message ??\r\n 'Operation Failed';\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'SamplesListPage.saga.updateField',\r\n variant: 'error',\r\n message: msg,\r\n }),\r\n );\r\n }\r\n}\r\nfunction* doLoadRunDetqails(\r\n action: PayloadAction<{ id: number; columns: Array | undefined }>,\r\n) {\r\n try {\r\n const url = `/api/odata/v4/sampleruns(${action.payload.id})`;\r\n const runDetails: IRunDetails = yield call(httpClient.get, url);\r\n\r\n const samples_url = `/api/odata/v4/sampleruns(${action.payload.id})/Samples`;\r\n const samples_response = yield call(httpClient.get, samples_url);\r\n runDetails.Samples = samples_response.value;\r\n yield put(actions.loadRunDetqails_Success(runDetails));\r\n } catch (error: unknown) {\r\n console.error(error);\r\n yield put(actions.completeRun_Success);\r\n }\r\n}\r\n/**\r\n * Reads a csv file and returns parse results\r\n * todo: move to shared utils location\r\n * @param file File\r\n * @returns parse results\r\n */\r\nfunction readCsvFile(file: File): Promise> {\r\n return new Promise((resolve, reject) => {\r\n Papa.parse(file, {\r\n header: true,\r\n dynamicTyping: true,\r\n\r\n complete: results => {\r\n resolve(results);\r\n },\r\n error: error => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n}\r\nconst platesUrl = `/api/odata/v4/SamplePlates`;\r\nasync function createPlate(samplePlateId: string, plate: ISampleCreateBase) {\r\n const httpPayload: Partial = {\r\n Id: samplePlateId,\r\n RoomId: plate.Room?.Id ?? null,\r\n LocationId: plate.Location?.Id ?? null,\r\n SamplePlateTypeId: plate.SamplePlateType?.Id,\r\n ServiceGroupId: plate.ServiceGroup?.Id ?? null,\r\n Active: plate.Active ?? true,\r\n IsRack: plate.IsRack ?? false,\r\n };\r\n try {\r\n return await httpClient.post(platesUrl, httpPayload);\r\n } catch (error: unknown) {}\r\n}\r\nfunction createPlates(\r\n runSamples: (Identifiable & ISampleTarget)[],\r\n plate: ISampleCreateBase,\r\n) {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n for (const record of runSamples) {\r\n const tpid = record.TargetPlateId;\r\n if (tpid !== undefined && tpid !== null && tpid !== '') {\r\n const params: {\r\n $filter: string;\r\n } = {\r\n // eslint-disable-next-line no-useless-concat\r\n $filter: '(Id eq ' + \"'\" + tpid + \"'\" + ')',\r\n };\r\n try {\r\n const count = await httpClient.get(`${platesUrl}/$count`, params);\r\n if (count === 0) {\r\n await createPlate(tpid, plate);\r\n }\r\n } catch {}\r\n }\r\n }\r\n resolve(true);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\nfunction* doImportRunDetails(\r\n action: PayloadAction<{ file: File; plate: ISampleCreateBase | null }>,\r\n) {\r\n try {\r\n const file = action.payload.file;\r\n const result: Papa.ParseResult> = yield call(\r\n readCsvFile,\r\n file,\r\n );\r\n type t = Identifiable & ISampleTarget;\r\n const records = result.data\r\n .filter(record => record['Id'] !== null)\r\n .map(\r\n record =>\r\n ({\r\n Id: record['Id'] as number,\r\n TargetPlateId: record['target sample plate id']?.toString()?.trim(),\r\n TargetPosition: record['target sample plate position']\r\n ?.toString()\r\n ?.trim(),\r\n TargetConcentration: record['target sample concentration (mg/mL)'],\r\n TargetVolume: record['target sample volume (ul)'],\r\n TargetTubeLabel: record['target tube id']?.toString()?.trim(),\r\n TargetSampleType: record['target sample type']?.toString()?.trim(),\r\n } as t),\r\n );\r\n const runDetails: IRunDetails = yield select(selectRunDetails);\r\n\r\n const runSamples = records\r\n .filter(record =>\r\n runDetails.Samples.find(sample => sample.Id === record.Id),\r\n )\r\n .map(record => {\r\n const result: Partial = { Id: record.Id };\r\n const runType = runDetails.RunType;\r\n const positionImport: RunTypesUnion[] = [\r\n 'Fractioning',\r\n 'Labeling',\r\n 'StandardRun',\r\n ];\r\n if (positionImport.includes(runType)) {\r\n result.TargetPlateId = record?.TargetPlateId;\r\n result.TargetPosition = record?.TargetPosition;\r\n result.TargetTubeLabel = record?.TargetTubeLabel;\r\n result.TargetSampleType = record?.TargetSampleType;\r\n }\r\n const volumeImport: RunTypesUnion[] = [\r\n 'Fractioning',\r\n 'Labeling',\r\n 'MassSpec',\r\n ];\r\n if (volumeImport.includes(runType)) {\r\n result.TargetVolume = record.TargetVolume;\r\n result.TargetConcentration = record.TargetConcentration;\r\n }\r\n return record;\r\n });\r\n\r\n // Checking and creating missing Plates\r\n if (action.payload.plate !== null) {\r\n yield call(createPlates, runSamples, action.payload.plate);\r\n }\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'runsamples_import',\r\n variant: records.length === runSamples.length ? 'success' : 'warning',\r\n message:\r\n 'Import finished: Matching sample IDs were updated with the related target plate ID and target plate positions as per the file. Violations for samples already existing in the target plate position will be done on clicking Complete',\r\n }),\r\n );\r\n yield put(actions.readImportFile_Success(runSamples));\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n}\r\n\r\nfunction* doLoadAllSelectedSamples(\r\n action: PayloadAction,\r\n) {\r\n try {\r\n const tablestate = yield select(selectSamplesTableState);\r\n const foo = yield call(loadIds, tablestate);\r\n yield put(actions.loadAllFilteredSamples_Success(foo));\r\n } catch {}\r\n}\r\n\r\nfunction* doExportRun(action: PayloadAction) {\r\n try {\r\n const fields = [\r\n 'Id',\r\n 'analytical sample id',\r\n 'TMT Label',\r\n 'TMT Run Set',\r\n 'source sample type',\r\n 'source sample plate id',\r\n 'source sample plate position',\r\n 'source tube id',\r\n 'source sample volume (ul)',\r\n 'source sample concentration (mg/mL)',\r\n 'target sample type',\r\n 'target sample plate id',\r\n 'target sample plate position',\r\n 'target tube id',\r\n 'target sample volume (ul)',\r\n 'target sample concentration (mg/mL)',\r\n ];\r\n const data = action.payload.map(item => [\r\n item.Id,\r\n item.AnalyticalSampleId,\r\n item.TMT_Label,\r\n item.TMT_Set,\r\n item.TMT_Type,\r\n item.SamplePlateId,\r\n item.Position,\r\n item.TubeLabel,\r\n item.Volume,\r\n item.Concentration,\r\n item.TargetSampleType,\r\n item.TargetPlateId,\r\n item.TargetPosition,\r\n item.TargetTubeLabel,\r\n item.TargetVolume,\r\n item.TargetConcentration,\r\n ]);\r\n\r\n yield call(() =>\r\n exportCsv({\r\n fields: fields,\r\n data: data,\r\n fileName: 'file.csv',\r\n }),\r\n );\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n}\r\n\r\nfunction* doDeleteSamples(\r\n action: PayloadAction<{\r\n selectedRows: ISample[];\r\n refresh: BasicTableRefreshEventHandler | undefined;\r\n }>,\r\n) {\r\n let r: IDeleteSamplesResult = yield call(\r\n deleteSamples,\r\n action.payload.selectedRows,\r\n );\r\n action.payload.refresh?.();\r\n for (const error of r.errors) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: error.message,\r\n }),\r\n );\r\n }\r\n if (r.successCount > 0) {\r\n // reload table data\r\n const tableState = yield select(selectSamplePlatesTableState);\r\n yield put(actions.loadSamplesList(tableState));\r\n\r\n // post success notification of deleted records\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.XRecordsWereBeDeleted, {\r\n x: r.successCount,\r\n }),\r\n }),\r\n );\r\n }\r\n}\r\n\r\nexport function* samplesListSaga() {\r\n yield debounce(500, actions.loadSamplesList.type, doLoadData);\r\n yield debounce(500, actions.updateField.type, doUpdateField);\r\n yield takeLatest(actions.runSelectedSamples.type, doRunSelectedSamples);\r\n yield takeLatest(actions.completeRun.type, doCompleteRun);\r\n yield takeLatest(actions.updateRun.type, doUpdateRun);\r\n yield takeLatest(actions.loadRunDetqails.type, doLoadRunDetqails);\r\n yield takeLatest(actions.readImportFile.type, doImportRunDetails);\r\n yield takeLatest(\r\n actions.loadAllFilteredSamples.type,\r\n doLoadAllSelectedSamples,\r\n );\r\n yield takeLatest(actions.exportRun.type, doExportRun);\r\n yield takeLeading(actions.deleteSamples.type, doDeleteSamples);\r\n yield takeLatest(actions.export.type, doExport);\r\n}\r\n","import { GlobalSettingsType } from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { Formik, FormikProps } from 'formik';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport {\r\n ErrorServices,\r\n ReportConsumablesState,\r\n ServiceChangeStateParameters,\r\n} from '../Details/slice/types';\r\nimport React from 'react';\r\nimport * as Yup from 'yup';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n StyledForm,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport {\r\n selectConnectedFiltersData,\r\n selectConnectedSettings,\r\n} from 'app/components/Forms/FormConnectedFilters/slice/selectors';\r\nimport {\r\n selectConnectedInitState,\r\n selectConsumablesHasErrors,\r\n selectConsumablesValueHandler,\r\n selectEditCreatableService,\r\n selectServiceChangeState,\r\n} from '../Details/slice/selectors';\r\nimport { useOfflineServiceStateSlice } from '../Details/slice';\r\nimport { useConnectedFiltersSlice } from 'app/components/Forms/FormConnectedFilters/slice';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { isEmpty } from 'lodash';\r\nimport { ConnectedFiltersControl } from 'app/components/Forms/FormConnectedFilters/ConnectedFiltersControl';\r\nimport {\r\n FieldHandler,\r\n FormListener,\r\n SubmittingHandler,\r\n} from 'app/components/Forms/FormRender/FormRenderer';\r\nimport { BookQuickServices } from '../Details/components/BookQuickServices';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { IConnectedFiltersDto } from 'types/IConnectedFiltersDto';\r\nimport { IOfflineServiceFilterDto } from 'types/IOfflineServiceFilterDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\nimport { IUserFilterDto } from 'api/odata/generated/entities/IUserFilterDto';\r\nimport { ErrorsSummury } from 'app/components/Forms/FormsLayout/FormErrorSummury';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { SnackBarMessageType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport {\r\n ListMessagesProps,\r\n SingleMessagesProps,\r\n} from 'app/Layout/FrontendLayout/components/Snackbar/Actions';\r\n\r\nexport interface ConsumablesFormProps {\r\n onSubmit: (item: ReportConsumablesState) => void;\r\n onAddServiceClick: (services: number[]) => void;\r\n initialValues: ReportConsumablesState;\r\n processing?: boolean;\r\n bindSubmitForm: any;\r\n isAdmin: boolean;\r\n user?: AuthenticatedUser;\r\n innerFormRef: React.RefObject>;\r\n connectedFiltersFormRef: React.MutableRefObject;\r\n globalSettings: GlobalSettingsType;\r\n onOfflineServiceClick?: (service: IOtherServices) => void;\r\n editCreatable?: boolean;\r\n onAddBatchClick: (\r\n batch: IInventoryBatchDto | null,\r\n serviceTypeId: number,\r\n ) => void;\r\n onRenewStockClick?: (service: IOtherServices) => void;\r\n setError?: (errors: ErrorServices) => void;\r\n offlineServicesErrors: ErrorServices[];\r\n}\r\n\r\nexport const ConsumablesForm = React.memo(function ConsumablesForm({\r\n onSubmit,\r\n processing,\r\n initialValues,\r\n bindSubmitForm,\r\n isAdmin,\r\n user,\r\n connectedFiltersFormRef,\r\n globalSettings,\r\n innerFormRef,\r\n onOfflineServiceClick,\r\n onAddServiceClick,\r\n editCreatable,\r\n onAddBatchClick,\r\n onRenewStockClick,\r\n offlineServicesErrors,\r\n setError,\r\n}: ConsumablesFormProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const { actions: connectedFiltersActions } = useConnectedFiltersSlice();\r\n const { actions: appActions } = useAppSettingsSlice();\r\n\r\n const fieldHandler = useSelector(selectConsumablesValueHandler);\r\n const hasError = useSelector(selectConsumablesHasErrors);\r\n const serviceSettings = useSelector(selectConnectedSettings);\r\n const connectedData = useSelector(selectConnectedFiltersData);\r\n const connectedInit = useSelector(selectConnectedInitState);\r\n const serviceChangeState = useSelector(selectServiceChangeState);\r\n const editCreatableService = useSelector(selectEditCreatableService);\r\n const { newDate, getOffsetDate } = useSystemDate();\r\n // const readonly = !isAdmin;\r\n const [submitting, setSubmitting] = React.useState(\r\n undefined,\r\n );\r\n const resetSubmitting = () => {\r\n setSubmitting(true);\r\n };\r\n const handleSubmit = (values: ReportConsumablesState) => {\r\n if (onSubmit !== undefined && onSubmit !== null) {\r\n onSubmit(values);\r\n }\r\n };\r\n const resetFieldHandler = () => {\r\n dispatch(actions.resetConsumableValueHandler());\r\n };\r\n /// Local State ///\r\n const [serviceChanged, setServiceChanged] = React.useState(false);\r\n const [allIsValid, setAllIsValid] = React.useState(true);\r\n const [servicesSelected, setServicesSelected] = useAsyncExtendedState<\r\n IOtherServices[]\r\n >(initialValues.Services ?? []);\r\n\r\n const handleFormChange = React.useCallback(\r\n (\r\n values: ReportConsumablesState,\r\n isValid,\r\n dirty,\r\n setValue,\r\n setTouched,\r\n validateField,\r\n setError,\r\n validate,\r\n ) => {\r\n if (serviceChanged) {\r\n dispatch(\r\n connectedFiltersActions.extendSettingsState({\r\n services:\r\n values.Services.length < 1\r\n ? []\r\n : values.Services.map(f => {\r\n return {\r\n Id: f.ServiceTypeId,\r\n Name: f.ServiceTypeName,\r\n ServiceGroupId: f.ServiceGroupId,\r\n ServiceTypeId: ServiceType.Offline,\r\n Active: true,\r\n BudgetsTurnedOn: f.BudgetsTurnedOn,\r\n HideProject: f.HideProjects,\r\n } as IServiceTypeFilterDto;\r\n }),\r\n globalSettings: globalSettings,\r\n settings: serviceSettings,\r\n isEdit: false,\r\n data: connectedData,\r\n }),\r\n );\r\n if (values.Services.length > 0 && connectedData?.User !== null) {\r\n const parameters = {\r\n ServiceTypes: values.Services.map(f => f.ServiceTypeID),\r\n ReservationId: null,\r\n UsageId: null,\r\n BookedBy: connectedData?.User?.Id || null,\r\n ADGroup: connectedData?.UserGroup?.Id || null,\r\n Start: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(\r\n connectedData?.StartTime || newDate(),\r\n ),\r\n ),\r\n BudgetId: connectedData?.Budget?.Id || null,\r\n FundingTypeId: connectedData?.FundingType?.Id || 0,\r\n } as ServiceChangeStateParameters;\r\n dispatch(actions.initServiceChangeStateData(parameters));\r\n // if (!!connectedData) {\r\n // dispatch(connectedFiltersActions.saveState(connectedData));\r\n // }\r\n }\r\n //setServiceTypesSelected(values.Services);\r\n setServiceChanged(false);\r\n }\r\n },\r\n [\r\n serviceChanged,\r\n dispatch,\r\n connectedFiltersActions,\r\n globalSettings,\r\n serviceSettings,\r\n connectedData,\r\n newDate,\r\n actions,\r\n ],\r\n );\r\n const validateForms = React.useCallback((isValid: boolean) => {\r\n setAllIsValid(isValid);\r\n }, []);\r\n\r\n /// useEffects\r\n React.useEffect(() => {\r\n if (innerFormRef.current) {\r\n innerFormRef.current.validateForm();\r\n }\r\n }, [innerFormRef]);\r\n React.useEffect(() => {\r\n if (!!serviceChangeState) {\r\n console.log('service settings: ', serviceSettings);\r\n if (!!serviceChangeState) {\r\n if (serviceSettings.budgetVisible) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'Budget',\r\n fieldValue: serviceChangeState.DefaultBudget,\r\n }),\r\n );\r\n if (serviceSettings.ReservationUserGroupGroupByBudgetUserGroup) {\r\n if (serviceChangeState.DefaultBudget !== null) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'UserGroup',\r\n fieldValue: {\r\n Id: serviceChangeState.DefaultBudget.UserGroupId,\r\n Name: serviceChangeState.DefaultBudget.UserGroupName,\r\n },\r\n }),\r\n );\r\n }\r\n } else {\r\n if (\r\n connectedData?.UserGroup === null ||\r\n connectedData?.UserGroup === undefined\r\n ) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'UserGroup',\r\n fieldValue: {\r\n Id:\r\n (connectedData?.User as IUserFilterDto).UserGroupId ??\r\n user?.ActiveUserGroup?.Id,\r\n Name:\r\n (connectedData?.User as IUserFilterDto).UserGroupName ??\r\n user?.ActiveUserGroup?.Name,\r\n },\r\n }),\r\n );\r\n }\r\n }\r\n if (\r\n serviceSettings.budgetExpirementVisible &&\r\n serviceChangeState.DefaultExperiment !== null\r\n ) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'BudgetExperiment',\r\n fieldValue: serviceChangeState.DefaultExperiment,\r\n }),\r\n );\r\n }\r\n } else {\r\n if (serviceSettings.isUserGroupCoordinator) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'UserGroup',\r\n fieldValue: {\r\n Id: user?.ActiveUserGroup?.Id,\r\n Name: user?.ActiveUserGroup?.Name,\r\n },\r\n }),\r\n );\r\n } else if (\r\n connectedData?.UserGroup === null ||\r\n connectedData?.UserGroup === undefined\r\n ) {\r\n dispatch(\r\n connectedFiltersActions.setConnectedValue({\r\n fieldKey: 'UserGroup',\r\n fieldValue: {\r\n Id:\r\n (connectedData?.User as IUserFilterDto).UserGroupId ??\r\n user?.ActiveUserGroup?.Id,\r\n Name:\r\n (connectedData?.User as IUserFilterDto).UserGroupName ??\r\n user?.ActiveUserGroup?.Name,\r\n },\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n dispatch(actions.resetServiceChangeState());\r\n }\r\n }, [\r\n actions,\r\n connectedData?.User,\r\n connectedData?.UserGroup,\r\n connectedFiltersActions,\r\n dispatch,\r\n serviceChangeState,\r\n serviceSettings,\r\n user?.ActiveUserGroup?.Id,\r\n user?.ActiveUserGroup?.Name,\r\n ]);\r\n React.useEffect(() => {\r\n dispatch(\r\n actions.setConsumableValue({\r\n fieldKey: 'Services',\r\n fieldValue: servicesSelected,\r\n }),\r\n );\r\n dispatch(actions.extendConsumablesData(servicesSelected));\r\n }, [actions, dispatch, servicesSelected]);\r\n\r\n const otherServicesSchema = Yup.array().of(\r\n Yup.mixed() as Yup.SchemaOf,\r\n );\r\n const reportConsumableSchema: Yup.SchemaOf = Yup.object(\r\n {\r\n Services: otherServicesSchema\r\n .min(1)\r\n .label(t(translations.Consumables) as string)\r\n .required(t(translations.err_OfflineServiceTypeRequired) as string),\r\n },\r\n );\r\n const changeOfflineServices = React.useCallback(\r\n (services: IOtherServices[], operation: 'add' | 'remove' | 'update') => {\r\n if (operation === 'add') {\r\n let addedServ = services.filter(\r\n f => !servicesSelected.some(s => s.ServiceTypeID === f.ServiceTypeID),\r\n );\r\n setServicesSelected([...servicesSelected, ...addedServ]);\r\n setServiceChanged(true);\r\n }\r\n if (operation === 'remove') {\r\n let otherServices = servicesSelected.filter(f => {\r\n return !services.some(a => a.ServiceTypeID === f.ServiceTypeID);\r\n });\r\n setServicesSelected(otherServices);\r\n setServiceChanged(true);\r\n }\r\n if (operation === 'update') {\r\n setServicesSelected(\r\n servicesSelected.map(f => {\r\n let service = services.find(\r\n s => s.ServiceTypeID === f.ServiceTypeID,\r\n );\r\n if (!!service && service !== null) {\r\n return Object.assign({}, f, service);\r\n } else {\r\n return f;\r\n }\r\n }),\r\n );\r\n }\r\n },\r\n [servicesSelected, setServicesSelected],\r\n );\r\n const initServices = async (): Promise => {\r\n return new Promise(async resolve => {\r\n resolve(servicesSelected);\r\n });\r\n };\r\n const sortFunc = (a: IInventoryBatchDto, b: IInventoryBatchDto) => {\r\n return b.Id - a.Id;\r\n };\r\n const prepareService = (\r\n serviceType: IOfflineServiceFilterDto,\r\n otherData?: IConnectedFiltersDto,\r\n ) => {\r\n let batch = serviceType.InventoryBatchesEnabled\r\n ? !!serviceType.InventoryBatches &&\r\n serviceType.InventoryBatches.length > 0\r\n ? serviceType.InventoryBatches.filter(\r\n f =>\r\n (f.ExpirationDate === null ||\r\n getOffsetDate(f.ExpirationDate) > newDate()) &&\r\n (serviceType.NotLessThanZero ? f.Inventory > 0 : true) &&\r\n f.StokRenewed,\r\n ).sort(sortFunc)[0]\r\n : null\r\n : null;\r\n let data = {\r\n Id: 0,\r\n BookedBy: otherData?.User?.Id,\r\n UserDisplayName: otherData?.User?.Name,\r\n BudgetID: otherData?.Budget?.Id,\r\n Budget: otherData?.Budget?.Name,\r\n BudgetExperimentId: otherData?.BudgetExperiment?.Id,\r\n BudgetExperimentName: otherData?.BudgetExperiment?.Name,\r\n Quantity: serviceType.DefaultQuantity,\r\n DefaultQuantity: serviceType.DefaultQuantity,\r\n ExternalCustomerId: otherData?.ExternalCustomer?.Id,\r\n ExternalCustomerName: otherData?.ExternalCustomer?.Name,\r\n FundingType: otherData?.FundingType?.Id,\r\n IntQuantityOnly: serviceType.IntQuantityOnly,\r\n DiscountFactor: 1,\r\n InstituteProjectId: otherData?.InstituteProject?.Id,\r\n InstituteProjectName: otherData?.InstituteProject?.Name,\r\n PurchaseOrder: otherData?.PurchaseOrder,\r\n Reference: otherData?.Reference,\r\n Mandatory: false,\r\n Remarks: null,\r\n ReservationId: null,\r\n ServiceDate: dateUtils.formatISO(\r\n dateUtils.dateOrStringToDate(otherData?.StartTime ?? newDate()),\r\n ),\r\n ServiceTypeID: serviceType.Id,\r\n ServiceType: serviceType.Name,\r\n ServiceGroupId: serviceType.ServiceGroupId,\r\n Units: serviceType.UnitTypeName,\r\n UserGroup: otherData?.UserGroup?.Id,\r\n UserGroupName: otherData?.UserGroup?.Name,\r\n AllowToUser: serviceType.AllowToUser,\r\n BudgetsTurnedOn: serviceType.BudgetsTurnedOn,\r\n StaffOnly: serviceType.StaffOnly,\r\n HideProjects: serviceType.HideProjects,\r\n InventoryBatchesEnabled: serviceType.InventoryBatchesEnabled,\r\n InventoryBatchId: batch === null ? null : batch.Id,\r\n InventoryBatchName: batch === null ? null : batch.Name,\r\n InventoryBatchAmount: batch === null ? null : batch.Inventory,\r\n } as IOtherServices;\r\n return data;\r\n };\r\n const createService = async (\r\n serviceType: IOfflineServiceFilterDto,\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n let staticService = prepareService(serviceType, connectedData);\r\n changeOfflineServices([staticService], 'add');\r\n resolve(staticService);\r\n });\r\n };\r\n const createServices = async (\r\n serviceTypes: IOfflineServiceFilterDto[],\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n let staticServices = serviceTypes.map(f =>\r\n prepareService(f, connectedData),\r\n );\r\n changeOfflineServices(staticServices, 'add');\r\n resolve(staticServices);\r\n });\r\n };\r\n const onRemoveService = async (service: IOtherServices) => {\r\n return new Promise(async (resolve, reject) => {\r\n changeOfflineServices([service], 'remove');\r\n resolve(service);\r\n });\r\n };\r\n const onRemoveServices = async (services: IOtherServices[]) => {\r\n return new Promise(async (resolve, reject) => {\r\n changeOfflineServices(services, 'remove');\r\n resolve(services);\r\n });\r\n };\r\n const onUpdateService = async (service: IOtherServices) => {\r\n return new Promise(async (resolve, reject) => {\r\n changeOfflineServices([service], 'update');\r\n resolve(service);\r\n });\r\n };\r\n const onAddAndRemoveServices = async (\r\n serviceTypes: IOfflineServiceFilterDto[],\r\n removed: IOtherServices[],\r\n ): Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n let staticServices = serviceTypes.map(f =>\r\n prepareService(f, connectedData),\r\n );\r\n let addedServ = staticServices.filter(\r\n f => !servicesSelected.some(s => s.ServiceTypeID === f.ServiceTypeID),\r\n );\r\n let otherServices = servicesSelected.filter(f => {\r\n return !removed.some(a => a.ServiceTypeID === f.ServiceTypeID);\r\n });\r\n setServicesSelected([...otherServices, ...addedServ]);\r\n setServiceChanged(true);\r\n resolve([...otherServices, ...addedServ]);\r\n });\r\n };\r\n React.useEffect(() => {\r\n let active =\r\n editCreatableService !== undefined &&\r\n servicesSelected.some(\r\n f => f.ServiceTypeID === editCreatableService.ServiceTypeID,\r\n );\r\n if (active && editCreatableService !== undefined) {\r\n changeOfflineServices([editCreatableService], 'update');\r\n dispatch(actions.setEditCreatableService(undefined));\r\n dispatch(actions.setRefreshConsumableOfflineServices(true));\r\n setServiceChanged(true);\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n changeOfflineServices,\r\n dispatch,\r\n editCreatableService,\r\n servicesSelected,\r\n ]);\r\n return (\r\n <>\r\n {\r\n // call setSubmit to finish submit cycle\r\n if (allIsValid) {\r\n formikHelpers.validateForm(values).then(responseErrors => {\r\n if (!isEmpty(responseErrors)) {\r\n formikHelpers.setSubmitting(false);\r\n console.debug('errors', responseErrors);\r\n } else if (values.Services.length < 1) {\r\n formikHelpers.setErrors({\r\n Services: t(\r\n translations.err_OfflineServiceTypeRequired,\r\n ) as string,\r\n });\r\n formikHelpers.setSubmitting(false);\r\n } else if (offlineServicesErrors.length > 0) {\r\n formikHelpers.setSubmitting(false);\r\n dispatch(\r\n appActions.addNotification({\r\n variant: 'error',\r\n message: '',\r\n messageType: SnackBarMessageType.messageList,\r\n messageTypeProps: {\r\n messages: offlineServicesErrors.map(f => {\r\n return {\r\n Id: f.id.toString(),\r\n message: f.error,\r\n } as SingleMessagesProps;\r\n }),\r\n } as ListMessagesProps,\r\n }),\r\n );\r\n } else {\r\n console.debug('submitting', values);\r\n formikHelpers.setSubmitting(true);\r\n handleSubmit(values);\r\n }\r\n });\r\n } else {\r\n formikHelpers.setSubmitting(false);\r\n }\r\n }}\r\n >\r\n {formik => {\r\n bindSubmitForm(formik.submitForm);\r\n if (formik.errors) {\r\n console.log('Consumables errors', formik.errors);\r\n }\r\n console.log('Consumables submitting', formik.isSubmitting);\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 return {\r\n Id: s.ServiceTypeID,\r\n Name: s.ServiceType,\r\n Active: true,\r\n BudgetsTurnedOn: s.BudgetsTurnedOn,\r\n HideProject: s.HideProjects,\r\n ServiceGroupId: s.ServiceGroupId,\r\n ServiceTypeId: ServiceType.Offline,\r\n } as IServiceTypeFilterDto;\r\n })\r\n }\r\n globalSettings={globalSettings}\r\n formIsValid={validateForms}\r\n startTimeLabel={\r\n t(translations.LogDateTimeLabel) as string\r\n }\r\n startLabelInline={true}\r\n //orderForConsumables={true}\r\n //forceDisabled={servicesSelected.length > 1}\r\n budgetPickerInfo={\r\n t(translations.ConsumableProject_info) as string\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","import { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useConnectedFiltersSlice } from 'app/components/Forms/FormConnectedFilters/slice';\r\nimport {\r\n CoverProps,\r\n PageWrapper,\r\n} from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { selectHasNotSavedChanges } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { IOtherServices } from 'app/pages/OtherServicesPage/IOtherServices';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { selectAuthenticatedUser, selectPublicUrl } from 'app/slice/selectors';\r\nimport { push } from 'connected-react-router';\r\nimport { FormikProps } from 'formik';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { useOfflineServiceStateSlice } from '../Details/slice';\r\nimport {\r\n selectConsumablesCompleted,\r\n selectConsumablesData,\r\n selectConsumablesHasErrors,\r\n selectCredit,\r\n selectCreditCompleted,\r\n selectCreditProcessing,\r\n selectInitConsumablesProcessing,\r\n} from '../Details/slice/selectors';\r\nimport {\r\n ErrorServices,\r\n OfflineServiceQueryStringParameters,\r\n ReportConsumablesState,\r\n} from '../Details/slice/types';\r\nimport useGlobalSettingsHook from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { ConsumablesForm } from './ConsumablesForm';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Progress } from 'app/components/LoadingIndicator';\r\nimport { buildURL, toQueryString } from 'utils/url-utils';\r\nimport { AssetsSelectionProps } from 'app/pages/MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { Roles, ScanTarget } from 'app/slice/types';\r\nimport {\r\n selectConnectedFiltersData,\r\n selectConnectedSettings,\r\n} from 'app/components/Forms/FormConnectedFilters/slice/selectors';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IMyAssetsRow } from 'app/pages/MyAssetsPage/IMyAssetsRow';\r\nimport { IBudgetFilterDto } from 'api/odata/generated/entities/IBudgetFilterDto';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { Body, ButtonLabel } from 'app/components/Typography';\r\nimport { LinearProgress } from '@material-ui/core';\r\nimport useSidePanelState, {\r\n SidePanelCloseState,\r\n SidePanelOpenState,\r\n} from 'app/hooks/useSidePanelOpen';\r\nimport { IInventoryBatchDto } from 'api/odata/generated/entities/IInventoryBatchDto';\r\n\r\nexport interface ReportConsumablesProps\r\n extends CoverProps,\r\n SidePanelContentProps {\r\n queryParams: OfflineServiceQueryStringParameters;\r\n initialServices: IOtherServices[];\r\n onClose?: () => void;\r\n}\r\nexport const ReportConsumables = React.memo(function ReportConsumables(\r\n props: ReportConsumablesProps,\r\n) {\r\n const {\r\n useSidePanel,\r\n queryParams,\r\n initialServices,\r\n closeCover,\r\n isCover,\r\n } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOfflineServiceStateSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const { actions: connectedFiltersActions } = useConnectedFiltersSlice();\r\n const { actions: appSettingsActions } = useAppSettingsSlice();\r\n const processing = useSelector(selectInitConsumablesProcessing);\r\n // const consumablesProcessing = useSelector(selectConsumablesProcessing);\r\n const actionCompleted = useSelector(selectConsumablesCompleted);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const hasError = useSelector(selectConsumablesHasErrors);\r\n const consumableServicesData = useSelector(selectConsumablesData);\r\n const connectedData = useSelector(selectConnectedFiltersData);\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const serviceSettings = useSelector(selectConnectedSettings);\r\n const credit = useSelector(selectCredit);\r\n const creditProccessing = useSelector(selectCreditProcessing);\r\n const creditCompleted = useSelector(selectCreditCompleted);\r\n // const { checkIsMobile } = useIsMobile();\r\n // const mobile = checkIsMobile();\r\n const globalSettings = useGlobalSettingsHook();\r\n //Local State\r\n const {\r\n cover,\r\n openPanel,\r\n closePanel,\r\n coverClosed,\r\n onCloseCover,\r\n } = useSidePanelState(\r\n () => {\r\n dispatch(actions.resetConsumablesState());\r\n dispatch(connectedFiltersActions.resetConnectedState());\r\n return true;\r\n },\r\n undefined,\r\n useSidePanel,\r\n isCover,\r\n );\r\n const [busy, setBusy] = React.useState(false);\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n const [showCalculateCredit, setShowCalculateCredit] = React.useState(false);\r\n const [requestCompleted, setRequestCompleted] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n\r\n //Refs\r\n const submitFormRef = React.useRef(null);\r\n const connectedFiltersFormRef = React.useRef(null);\r\n const innerFormRef = React.useRef>(null);\r\n\r\n const isReadOnlyUser = React.useMemo(() => {\r\n return (\r\n User !== undefined &&\r\n (User.Roles.includes(Roles.CalendarOnly) ||\r\n User.Roles.includes(Roles.Readonly) ||\r\n User.Roles.includes(Roles.RoomOnly))\r\n );\r\n }, [User]);\r\n\r\n //Methods\r\n const handleCloselClick = React.useCallback(() => {\r\n if (useSidePanel) {\r\n closePanel({\r\n isCover: isCover,\r\n useSidePanel: useSidePanel,\r\n showConfirm: hasChanges,\r\n onClose: () => {\r\n dispatch(actions.resetConsumablesState());\r\n dispatch(connectedFiltersActions.resetConnectedState());\r\n },\r\n } as SidePanelCloseState);\r\n } else {\r\n dispatch(push('/otherServices'));\r\n }\r\n }, [\r\n actions,\r\n closePanel,\r\n connectedFiltersActions,\r\n dispatch,\r\n hasChanges,\r\n isCover,\r\n useSidePanel,\r\n ]);\r\n const handleSaveClick = React.useCallback((e: any) => {\r\n handleSubmitForm(e);\r\n }, []);\r\n\r\n const handleSubmitForm = (e: any) => {\r\n if (connectedFiltersFormRef.current) {\r\n connectedFiltersFormRef.current(e);\r\n }\r\n if (submitFormRef.current) {\r\n submitFormRef.current(e);\r\n }\r\n };\r\n const bindSubmitForm = React.useCallback(submitForm => {\r\n submitFormRef.current = submitForm;\r\n }, []);\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: ReportConsumablesState) => {\r\n setBusy(true);\r\n dispatch(actions.createConsumables(values));\r\n },\r\n [actions, dispatch],\r\n );\r\n const handleCalculateCredit = React.useCallback(() => {\r\n if (!!innerFormRef?.current?.values?.Services) {\r\n setShowCalculateCredit(true);\r\n dispatch(actions.getTotalCredit(innerFormRef?.current?.values.Services));\r\n }\r\n }, [actions, dispatch]);\r\n const handleCalculateClose = React.useCallback(() => {\r\n setShowCalculateCredit(false);\r\n dispatch(actions.resetTotalCreditState());\r\n }, [actions, dispatch]);\r\n //effects\r\n useEffectOnMount(() => {\r\n dispatch(\r\n appSettingsActions.setBarcodeScannigTarget(ScanTarget.Consumables),\r\n );\r\n return () => {\r\n dispatch(appSettingsActions.setBarcodeScannigTarget(ScanTarget.All));\r\n };\r\n });\r\n React.useEffect(() => {\r\n let active = firstLoad;\r\n if (globalSettings.loadCompleted && active) {\r\n setFirstLoad(false);\r\n dispatch(\r\n actions.initConsumables({\r\n query: queryParams,\r\n globalSettings: globalSettings,\r\n services: initialServices,\r\n }),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actions,\r\n dispatch,\r\n firstLoad,\r\n globalSettings,\r\n initialServices,\r\n queryParams,\r\n ]);\r\n React.useEffect(() => {\r\n let active = processing === false;\r\n if (active) {\r\n if (actionCompleted === true) {\r\n setRequestCompleted(true);\r\n setBusy(false);\r\n if (!hasError) {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n handleCloselClick();\r\n }\r\n } else if (actionCompleted === false) {\r\n setRequestCompleted(undefined);\r\n setBusy(false);\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n actionCompleted,\r\n dispatch,\r\n handleCloselClick,\r\n hasError,\r\n layoutActions,\r\n processing,\r\n queryParams.id,\r\n ]);\r\n const assetsFilter = React.useMemo(() => {\r\n let filter: (string | Condition)[] | undefined = [];\r\n if (globalSettings.budgetModuleEnabled && serviceSettings.budgetVisible) {\r\n if (\r\n connectedData?.Budget === null ||\r\n connectedData?.Budget === undefined\r\n ) {\r\n filter.push(\r\n new Condition(\r\n 'HideProjects',\r\n ODataOperators.Equals,\r\n serviceSettings.hideProject ?? false,\r\n ),\r\n );\r\n } else {\r\n let budget = connectedData?.Budget as IBudgetFilterDto;\r\n let byService = '';\r\n let byGroup = '';\r\n if (!budget.ServiceGroupServicesAllowed) {\r\n if (!!budget.AllowedServices && budget.AllowedServices.length > 0) {\r\n byService = `(${new Condition(\r\n 'ServiceId',\r\n ODataOperators.Includes,\r\n budget.AllowedServices.map(f => f.Id),\r\n ).toString()} and ServiceTypeId eq 2)`;\r\n }\r\n if (!!budget.ServiceGroupIds && budget.ServiceGroupIds.length > 0) {\r\n byGroup = `(${new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n budget.ServiceGroupIds,\r\n ).toString()})`;\r\n }\r\n let res = `(${[byService, byGroup]\r\n .filter(f => f !== '')\r\n .join(' or ')})`;\r\n if (res !== '()') {\r\n filter.push(res);\r\n }\r\n } else {\r\n filter.push('ServiceTypeId eq 2');\r\n }\r\n }\r\n }\r\n return filter.length > 0 ? filter : undefined;\r\n }, [\r\n connectedData?.Budget,\r\n globalSettings.budgetModuleEnabled,\r\n serviceSettings.budgetVisible,\r\n serviceSettings.hideProject,\r\n ]);\r\n\r\n const onRenewStockClick = React.useCallback(\r\n (service: IOtherServices) => {\r\n let renewProps = {\r\n saveCreatable: true,\r\n preventRefreshTable: true,\r\n initialService: undefined,\r\n queryParams: {\r\n id: '-1',\r\n stid: '' + service.ServiceTypeID,\r\n batchId:\r\n !!service.InventoryBatchId && service.InventoryBatchId !== null\r\n ? '' + service.InventoryBatchId\r\n : undefined,\r\n },\r\n };\r\n if (!useSidePanel) {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n }\r\n openPanel({\r\n renderPageType: RenderPageType.RenewStock,\r\n renderPageProps: renewProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [dispatch, layoutActions, openPanel, useSidePanel],\r\n );\r\n const onAddBatchClick = React.useCallback(\r\n (batch: IInventoryBatchDto | null, serviceType: number) => {\r\n let batchProps = {\r\n initialBatch: batch ?? undefined,\r\n preventRefreshTable: true,\r\n queryParams: {\r\n id: '' + (batch?.Id ?? -1),\r\n stid: '' + serviceType,\r\n },\r\n saveCreatable: true,\r\n };\r\n if (!useSidePanel) {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n }\r\n openPanel({\r\n renderPageType: RenderPageType.InventoryBatch,\r\n renderPageProps: batchProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [dispatch, layoutActions, openPanel, useSidePanel],\r\n );\r\n const onOfflineServiceClick = React.useCallback(\r\n (service: IOtherServices) => {\r\n let otherProps = {\r\n initialService: Object.assign({}, service, {\r\n UserGroup: connectedData?.UserGroup?.Id ?? null,\r\n UserGroupName: connectedData?.UserGroup?.Name ?? null,\r\n Budget: connectedData?.Budget?.Name ?? null,\r\n BudgetID: connectedData?.Budget?.Id ?? null,\r\n UserDisplayName: connectedData?.User?.Name ?? null,\r\n BookedBy: connectedData?.User?.Id ?? null,\r\n }),\r\n editCreatable: true,\r\n queryParams: {\r\n id: '' + service.Id ?? -1,\r\n },\r\n };\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n openPanel({\r\n renderPageType: RenderPageType.OtherServiceDetails,\r\n renderPageProps: otherProps,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [\r\n connectedData?.Budget?.Id,\r\n connectedData?.Budget?.Name,\r\n connectedData?.User?.Id,\r\n connectedData?.User?.Name,\r\n connectedData?.UserGroup?.Id,\r\n connectedData?.UserGroup?.Name,\r\n dispatch,\r\n layoutActions,\r\n openPanel,\r\n useSidePanel,\r\n ],\r\n );\r\n const onAddServiceClick = React.useCallback(\r\n (services: number[]) => {\r\n let selParams = {\r\n actionType: 'OfflineService',\r\n offTypeIds: services,\r\n customPredicates: assetsFilter,\r\n } as AssetsSelectionProps;\r\n if (!useSidePanel) {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n }\r\n openPanel({\r\n renderPageType: RenderPageType.AssetsSelection,\r\n renderPageProps: selParams,\r\n expanded: false,\r\n useSidePanel: useSidePanel,\r\n isCover: useSidePanel,\r\n } as SidePanelOpenState);\r\n },\r\n [assetsFilter, dispatch, layoutActions, openPanel, useSidePanel],\r\n );\r\n\r\n const [offlineServicesErrors, setOfflineServicesErrors] = React.useState<\r\n ErrorServices[]\r\n >([]);\r\n const handleSetError = React.useCallback(\r\n (error: ErrorServices) => {\r\n if (error.error !== undefined) {\r\n setOfflineServicesErrors(prev => [...prev, error]);\r\n } else {\r\n setOfflineServicesErrors([\r\n ...offlineServicesErrors.filter(f => f.id !== error.id),\r\n ]);\r\n }\r\n },\r\n [offlineServicesErrors],\r\n );\r\n //memo\r\n const IsAdmin = React.useMemo(() => {\r\n return !!consumableServicesData &&\r\n consumableServicesData.Services.length > 0\r\n ? User?.IsAllGroupOrLabTechAdmin(\r\n consumableServicesData.Services.map(g => g.ServiceGroupId || 0),\r\n consumableServicesData.Services.map(f => {\r\n return {\r\n Id: f.ServiceTypeId,\r\n Name: f.ServiceTypeName,\r\n ServiceTypeId: ServiceType.Offline,\r\n } as IServiceTypeFilterDto;\r\n }),\r\n )\r\n : false;\r\n }, [User, consumableServicesData]);\r\n const leftActions = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n actions.push(() => (\r\n }\r\n onClick={handleSaveClick}\r\n disabled={\r\n busy ||\r\n !(\r\n !!consumableServicesData &&\r\n consumableServicesData.Services.length > 0\r\n )\r\n }\r\n processing={!requestCompleted && busy}\r\n >\r\n {t(translations.Save)}\r\n \r\n ));\r\n if (\r\n globalSettings.showCalcPriceOnOfflineService &&\r\n !!consumableServicesData &&\r\n consumableServicesData.Services.length > 0 &&\r\n offlineServicesErrors.length < 1\r\n ) {\r\n actions.push(() => (\r\n }\r\n title={t(translations.CalculatePricing_info) as string}\r\n onClick={handleCalculateCredit}\r\n disabled={creditProccessing}\r\n processing={creditProccessing}\r\n >\r\n {t(translations.CalculatePricing)}\r\n \r\n ));\r\n }\r\n return actions;\r\n }, [\r\n busy,\r\n consumableServicesData,\r\n creditProccessing,\r\n globalSettings.showCalcPriceOnOfflineService,\r\n handleCalculateCredit,\r\n handleSaveClick,\r\n offlineServicesErrors.length,\r\n requestCompleted,\r\n t,\r\n ]);\r\n const rightActions = React.useMemo(() => {\r\n let actions: ActionRenderer[] = [];\r\n\r\n actions.push(() => (\r\n }\r\n onClick={handleCloselClick}\r\n >\r\n {t(translations.Close)}\r\n \r\n ));\r\n\r\n return actions;\r\n }, [handleCloselClick, t]);\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 pageLink={buildURL(publicUrl + 'reportConsumables', queryParams)}\r\n toPageLink={`reportConsumables?${toQueryString(queryParams)}`}\r\n isCover={isCover}\r\n cover={cover}\r\n coverClosed={coverClosed}\r\n closeCover={!isCover ? onCloseCover : closeCover}\r\n confirm={\r\n showCalculateCredit ? (\r\n handleCalculateClose()}\r\n onClose={() => handleCalculateClose()}\r\n body={\r\n creditProccessing && !creditCompleted ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {t(translations.Pricing_EstimatedCost)}\r\n \r\n \r\n {(t(\r\n translations.PricingConfirmationOfflineText1,\r\n ) as string).replace(\r\n '{0}',\r\n (credit?.credit || 0).toFixed(2),\r\n )}\r\n \r\n \r\n {!!credit?.balance && credit?.balance !== null && (\r\n \r\n \r\n {t(translations.Pricing_Balance)}\r\n \r\n \r\n {(t(\r\n translations.Pricing_BalanceResult,\r\n ) as string).replace(\r\n '{0}',\r\n (credit?.balance || 0).toFixed(2),\r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n }\r\n maxWidth={'sm'}\r\n />\r\n ) : (\r\n <>\r\n )\r\n }\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\r\n \r\n );\r\n});\r\n","/**\r\n *\r\n * ArticeDatasetlLink\r\n *\r\n */\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\n\r\nexport interface ArticleLinkProps {\r\n dataset: string | undefined | null;\r\n externalId?: string | null;\r\n externalIdSource?: string | null;\r\n}\r\n\r\nexport function ArticleDatasetLink({\r\n dataset,\r\n externalIdSource,\r\n externalId,\r\n}: ArticleLinkProps) {\r\n if (dataset !== undefined && dataset !== null) {\r\n return (\r\n <>\r\n \r\n {dataset}\r\n \r\n \r\n );\r\n } else {\r\n return <>;\r\n }\r\n}\r\n","import { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { AuthenticatedUser } from 'types/AuthenticatedUser';\r\nimport { GlobalSettings } from 'utils/globalSettings';\r\nimport { IArticleDto } from 'api/odata/generated/entities/IArticleDto';\r\nimport { ListRenderer } from 'app/components/BasicTable/CellRenderers/ListRenderer';\r\nimport { AvailabilityTypes } from 'api/odata/generated/enums/AvailabilityTypes';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { ArticleSource } from './ArticlesSourcePicker';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport { ArticleDoiLink } from './ArticleDoiLink';\r\nimport { DateTimeLabel } from 'app/components/DateTimeLabel';\r\nimport { ArticleStatus } from 'enums/Article';\r\nimport { ColumnWithDep } from 'app/components/BasicTable/types/ColumnWithDeps';\r\nimport { ArticleDatasetLink } from './AricleDatasetLink';\r\nimport { SidePanelOpenState } from 'app/hooks/useSidePanelOpen';\r\nimport { AssetLink } from '../AssetPopUp/OpenAssetDetails';\r\nimport htmlParse from 'html-react-parser';\r\nimport {\r\n allowedToViewAlert,\r\n IAlertPermissionCheckRecord,\r\n} from 'app/permissions/WorkOrders/workOrdersPermissionUtils';\r\nimport { WorkOrderLink } from '../Actions/GlobalSelectedActions/OpenWorkOrder';\r\nimport { ArticleLink } from '../Actions/GlobalSelectedActions/OpenArticleDetails';\r\n\r\nexport const ArticleServiceGroupsColumnId /*: keyof IArticleDto*/ =\r\n 'FirstServiceGroupAssetName';\r\nexport const ArticleInstrumentsColumnId /*: keyof IArticleDto*/ =\r\n 'FirstInstrumentAssetName';\r\n\r\nexport function getColumns(\r\n t: TFunction,\r\n user: AuthenticatedUser | undefined,\r\n settings: GlobalSettings,\r\n useSidePanel?: boolean,\r\n openPanel?: (state: SidePanelOpenState) => void,\r\n) {\r\n if (user === undefined) {\r\n return [];\r\n }\r\n\r\n const result: ColumnWithDep[] = [\r\n {\r\n Header: t(translations.Id) as string,\r\n accessor: 'Id',\r\n },\r\n {\r\n Header: t(translations.Title) as string,\r\n accessor: 'Title',\r\n Cell: ({ value, row }) => {\r\n return (\r\n value !== null && (\r\n \r\n {htmlParse(value)}\r\n \r\n )\r\n );\r\n },\r\n },\r\n {\r\n Header: t(translations.Authors) as string,\r\n accessor: 'Authors',\r\n Cell: ListRenderer,\r\n },\r\n {\r\n Header: t(translations.Journal) as string,\r\n accessor: 'Journal',\r\n },\r\n {\r\n Header: t(translations.ArticlePageNumber) as string,\r\n accessor: 'PageNumber',\r\n },\r\n {\r\n id: ArticleServiceGroupsColumnId,\r\n accessor: ArticleServiceGroupsColumnId,\r\n Header: t(translations.ServiceGroups) as string,\r\n Cell: ({ row }) => {\r\n let groups =\r\n row.original.Assets?.filter(\r\n f => f.Availability?.Id === AvailabilityTypes.ServiceGroup,\r\n )?.map(item => item) ?? [];\r\n if (groups.length > 0) {\r\n const res = groups.map((v, index) => (\r\n <>\r\n \r\n {v.Name}\r\n \r\n {index < groups.length - 1 &&
    }\r\n \r\n ));\r\n return res;\r\n } else {\r\n return <>;\r\n }\r\n //return ListRenderer({ value: groups });\r\n },\r\n },\r\n {\r\n id: ArticleInstrumentsColumnId,\r\n accessor: ArticleInstrumentsColumnId,\r\n Header: t(translations.Instruments) as string,\r\n Cell: ({ row }) => {\r\n const groups =\r\n row.original.Assets?.filter(\r\n f => f.ServiceTypeId === ServiceType.Online,\r\n )?.map(item => item) ?? [];\r\n if (groups.length > 0) {\r\n const res = groups.map((v, index) => (\r\n <>\r\n \r\n {v.Name}\r\n \r\n\r\n {index < groups.length - 1 &&
    }\r\n \r\n ));\r\n return res;\r\n } else {\r\n return <>;\r\n }\r\n // return ListRenderer({ value: groups });\r\n },\r\n },\r\n {\r\n id: 'PubMedId',\r\n Header: t(translations.PubMedId) as string,\r\n accessor: 'ExternalId',\r\n Cell: ({ value, row }) => {\r\n const pubmedType: ArticleSource = 'PubMed';\r\n return (\r\n row.original.ExternalIdSource === pubmedType && (\r\n \r\n {value}\r\n \r\n )\r\n );\r\n },\r\n },\r\n {\r\n id: 'Doi',\r\n Header: t(translations.Doi) as string,\r\n accessor: 'Doi',\r\n Cell: ({ value, row }) => {\r\n return (\r\n value !== null && (\r\n \r\n )\r\n );\r\n },\r\n },\r\n {\r\n id: 'Dataset',\r\n Header: t(translations.ArticleDataset) as string,\r\n accessor: 'Dataset',\r\n Cell: ({ value, row }) => {\r\n return (\r\n value !== null && (\r\n \r\n )\r\n );\r\n },\r\n },\r\n {\r\n Header: t(translations.InsertedBy) as string,\r\n accessor: 'UserDisplayName',\r\n Cell: ({ value, row }) => {\r\n const res = value ?? '';\r\n return <> {res} ;\r\n },\r\n },\r\n {\r\n Header: t(translations.InsertedAt) as string,\r\n accessor: 'EnteredAt',\r\n Cell: ({ value, row }) => {\r\n return ;\r\n },\r\n },\r\n {\r\n Header: t(translations.RelatedUser) as string,\r\n accessor: 'RelatedUserDisplayName',\r\n Cell: ({ value, row }) => {\r\n const res = value ?? '';\r\n return <> {res} ;\r\n },\r\n },\r\n {\r\n Header: t(translations.UserGroup) as string,\r\n accessor: 'UserGroupName',\r\n Cell: ({ value, row }) => {\r\n const res = value ?? '';\r\n return <> {res} ;\r\n },\r\n },\r\n {\r\n Header: t(translations.Department) as string,\r\n accessor: 'DepartmentName',\r\n Cell: ({ value, row }) => {\r\n const res = value ?? '';\r\n return <> {res} ;\r\n },\r\n },\r\n {\r\n Header: t(translations.Institute) as string,\r\n accessor: 'InstituteName',\r\n Cell: ({ value, row }) => {\r\n const res = value ?? '';\r\n return <> {res} ;\r\n },\r\n },\r\n {\r\n Header: t(translations.InstituteType) as string,\r\n accessor: 'InstituteTypeName',\r\n Cell: ({ value, row }) => {\r\n const res = value ?? '';\r\n return <> {res} ;\r\n },\r\n },\r\n {\r\n Header: t(translations.ArticleStatus) as string,\r\n accessor: 'Status',\r\n Cell: ({ value, row }) => {\r\n const key = 'Article' + ArticleStatus[value];\r\n return <> {t(key)} ;\r\n },\r\n },\r\n {\r\n Header: t(translations.FileComment) as string,\r\n accessor: 'FileComment',\r\n // Cell: ArticleHTMLLinkRenderer,\r\n Cell: ({ value, row }) => {\r\n let v =\r\n value !== null && value !== undefined && value !== ''\r\n ? value[0] === '<'\r\n ? (htmlParse(value) as JSX.Element).props.children\r\n : value\r\n : '';\r\n return (\r\n \r\n {v}\r\n \r\n );\r\n },\r\n },\r\n {\r\n Header: t(translations.CalibrationRecord) as string,\r\n accessor: 'CalibrationRecord',\r\n Cell: ({ value, row }) => {\r\n const checkRow = {\r\n ServiceGroupId:\r\n row.original.Assets?.length > 0\r\n ? row.original.Assets[0].ServiceGroupId\r\n : null,\r\n ReportedBy: row.original.EnteredBy,\r\n } as IAlertPermissionCheckRecord;\r\n return allowedToViewAlert(user, checkRow) && value !== null ? (\r\n \r\n {value}\r\n \r\n ) : (\r\n <>{value}\r\n );\r\n },\r\n deps: ['CalibrationRecordName'],\r\n },\r\n ];\r\n return result;\r\n}\r\n","import { Select } from '@material-ui/core';\r\nimport styled from 'styled-components';\r\n\r\nexport const StyledSelect = styled(Select)`\r\n min-width: 9em;\r\n margin: 0;\r\n background: transparent;\r\n`;\r\n","/**\r\n *\r\n * TmtType\r\n *\r\n */\r\nimport { MenuItem } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport { RUN_TYPES } from '../RunTypePicker';\r\nimport { StyledSelect } from '../../EditableTable/Fields/StyledSelect';\r\nimport { BaseInputProps } from '../../EditableTable/EditableCell';\r\n\r\nexport interface TmtTypeProps extends BaseInputProps {}\r\nexport function TmtType({ value, onChange, onBlur }: TmtTypeProps) {\r\n const options = ['TMT Pro'];\r\n return (\r\n onChange(e.target.value as RUN_TYPES)}\r\n onBlur={onBlur}\r\n displayEmpty\r\n autoWidth\r\n inputProps={{ 'aria-label': 'Without label' }}\r\n >\r\n \r\n None\r\n \r\n {options.map((item, index) => (\r\n \r\n {item}\r\n \r\n ))}\r\n \r\n );\r\n}\r\n","import { Tab, TabProps } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport clsx from 'clsx';\r\nimport { capitalize } from 'lodash';\r\n\r\nexport interface BasicTabProps extends TabProps {\r\n mainIcon?: React.ReactElement;\r\n startIcon?: React.ReactElement;\r\n endIcon?: React.ReactElement;\r\n processing?: boolean;\r\n size?: 'small' | 'medium';\r\n}\r\n\r\nexport const BasicTab = React.forwardRef(function TabButton(\r\n {\r\n disabled,\r\n processing,\r\n size = 'medium',\r\n mainIcon,\r\n startIcon,\r\n endIcon,\r\n label,\r\n className,\r\n ...props\r\n },\r\n ref,\r\n) {\r\n const startIconComponent = startIcon && (\r\n \r\n {startIcon}\r\n \r\n );\r\n const endIconComponent = endIcon && (\r\n \r\n {endIcon}\r\n \r\n );\r\n return (\r\n \r\n {mainIcon}\r\n \r\n ) : undefined\r\n }\r\n disableRipple\r\n label={\r\n \r\n {!!startIcon || !!endIcon ? (\r\n \r\n {!!startIconComponent && startIconComponent}\r\n {label}\r\n {!!endIconComponent && endIconComponent}\r\n \r\n ) : (\r\n {label}\r\n )}\r\n \r\n }\r\n {...props}\r\n />\r\n );\r\n});\r\n","import { TabContent } from './TabContent';\r\nimport * as React from 'react';\r\nimport { Tabs, useTheme } from '@material-ui/core';\r\nimport { TabPanel, TabPanelProps } from './TabPanel';\r\nimport { BasicTab } from './BasicTab';\r\nimport clsx from 'clsx';\r\nimport { capitalize } from 'lodash';\r\nimport { TabsWrapper } from './TabsWrapper';\r\n\r\nexport interface BasicTabsProps {\r\n tabs: Array;\r\n selectedTabIndex?: number;\r\n tabsId: string;\r\n tabsPanelId: string;\r\n textColor?: 'secondary' | 'primary' | 'inherit';\r\n scrollButtons?: 'auto' | 'desktop' | 'on' | 'off';\r\n indicatorColor?: 'secondary' | 'primary';\r\n variant?: 'standard' | 'scrollable' | 'fullWidth';\r\n selectionFollowsFocus?: boolean;\r\n centered?: boolean;\r\n orientation?: 'horizontal' | 'vertical';\r\n ariaLabel?: string;\r\n size?: 'small' | 'medium';\r\n scrollableContent?: boolean;\r\n className?: string;\r\n handleTabChange?: (tab: TabContent) => void;\r\n tabPanels?: Array>;\r\n}\r\n\r\nexport function BasicTabs(props: BasicTabsProps) {\r\n const {\r\n selectedTabIndex,\r\n tabs,\r\n tabsId,\r\n tabsPanelId,\r\n textColor,\r\n scrollButtons,\r\n indicatorColor,\r\n variant,\r\n selectionFollowsFocus,\r\n centered,\r\n orientation,\r\n ariaLabel,\r\n size = 'medium',\r\n className,\r\n scrollableContent,\r\n handleTabChange,\r\n tabPanels,\r\n } = props;\r\n const theme = useTheme();\r\n const [tabIndex, setTabIndex] = React.useState(selectedTabIndex ?? 0);\r\n // used for case when state is managed otside this component\r\n React.useEffect(() => {\r\n if (!!handleTabChange) {\r\n setTabIndex(selectedTabIndex ?? 0);\r\n }\r\n }, [handleTabChange, selectedTabIndex]);\r\n\r\n const handleSelectedTabIndexChange = (\r\n event: React.ChangeEvent<{}>,\r\n newValue: number,\r\n ) => {\r\n //when state is managed outside the index is come from the parrent component\r\n if (!!handleTabChange) {\r\n handleTabChange(tabs[newValue]);\r\n } else {\r\n setTabIndex(newValue);\r\n }\r\n };\r\n const getTabProps = React.useCallback(\r\n (item: TabContent) => {\r\n return {\r\n id: `${tabsId}-${item.Id}`,\r\n 'aria-controls': `${tabsPanelId}-${item.Id}`,\r\n label: item.Name,\r\n };\r\n },\r\n [tabsId, tabsPanelId],\r\n );\r\n return (\r\n \r\n \r\n {tabs.map(item => (\r\n \r\n ))}\r\n \r\n {!!tabPanels && tabPanels.length > 0 ? (\r\n {tabPanels}\r\n ) : (\r\n \r\n {tabs.map((item, index) => (\r\n \r\n {item.Content}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { styled } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectEventsCount,\r\n selectEventsCountLoading,\r\n} from 'app/slice/selectors';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { Roles } from 'app/slice/types';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nexport interface EventsCountProps {}\r\n\r\nexport const EventsCount = React.memo(function EventsCount(\r\n props: EventsCountProps,\r\n) {\r\n const count = useSelector(selectEventsCount);\r\n const { t } = useTranslation();\r\n const { newDate } = useSystemDate();\r\n const user = useSelector(selectAuthenticatedUser);\r\n const eventsLoading = useSelector(selectEventsCountLoading);\r\n const isAdmin = React.useMemo(() => {\r\n return (\r\n user !== undefined &&\r\n (user.Roles.indexOf(Roles.Administrators) >= 0 ||\r\n user.Roles.indexOf(Roles.GroupAdministrators) >= 0 ||\r\n user.Roles.indexOf(Roles.LabTech) >= 0 ||\r\n user.Roles.indexOf(Roles.InstrumentEventsAdmin) >= 0)\r\n );\r\n }, [user]);\r\n\r\n const appSettings = useSelector(selectAppSettings);\r\n const isMaintenanceAssetsEnabled = IsModuleEnabled(\r\n appSettings,\r\n KnownModules.MaintenanceAssets,\r\n );\r\n\r\n const StyledSpanIcon = styled('span')(({ theme }) => ({\r\n fontSize: '20px',\r\n color: bookitColors.grayscale.graySubtitles,\r\n width: '20px',\r\n height: '20px',\r\n }));\r\n\r\n //RENDER\r\n return isAdmin && isMaintenanceAssetsEnabled && !eventsLoading ? (\r\n \r\n \r\n \r\n \r\n \r\n {count}\r\n \r\n \r\n \r\n \r\n ) : null;\r\n});\r\n","import {\r\n AssetQuickSearchDetails,\r\n IQuickAssetsSearchResult,\r\n} from 'app/components/AssetQuickSearch/slice/types';\r\nimport { Identifiable } from 'types/common';\r\nimport { httpClient } from './HttpClient';\r\nimport { Condition, ODataOperators } from './odata/ODataFilter';\r\n\r\nexport const AssetQuickSearchApi = {\r\n getAssetSearch: async (payload: {\r\n q: string;\r\n serviceGroups: Identifiable[];\r\n serviceTypeId?: number;\r\n }) => {\r\n const url = `/api/odata/v4/AssetQuickSearch`;\r\n let filters: Array = [];\r\n if (payload.serviceGroups.length > 0) {\r\n filters.push(\r\n `${new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n payload.serviceGroups,\r\n ).toString()}`,\r\n );\r\n }\r\n if (!!payload.serviceTypeId) {\r\n filters.push(\r\n `${new Condition(\r\n 'ServiceTypeId',\r\n ODataOperators.Equals,\r\n payload.serviceTypeId,\r\n ).toString()}`,\r\n );\r\n }\r\n const params: {\r\n q: string;\r\n $orderby: string;\r\n $filter?: string;\r\n $count: boolean;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n q: payload.q,\r\n $filter: filters.length > 0 ? filters.join(' and ') : undefined,\r\n $count: true,\r\n $select:\r\n 'Id,Name,Image,AvailabilityTypeId,AvailabilityTypeName,BookableAsset,ServiceId,ServiceGroupId,ApprovalRequired',\r\n $skip: 0,\r\n $top: 5,\r\n $orderby: 'Rank desc',\r\n };\r\n try {\r\n const response = await httpClient.get(url, params);\r\n return {\r\n Results: response.value,\r\n TotalResultsLength: response['@odata.count'],\r\n ServiceType: payload.serviceTypeId,\r\n } as IQuickAssetsSearchResult;\r\n } catch {\r\n return {\r\n Results: [],\r\n TotalResultsLength: 0,\r\n ServiceType: undefined,\r\n } as IQuickAssetsSearchResult;\r\n }\r\n },\r\n getRecentAssets: async (payload: {\r\n serviceGroups: Identifiable[];\r\n }) => {\r\n const url = `/api/odata/v4/AssetQuickSearch/RecentAssets`;\r\n let filters: Array = [];\r\n if (payload.serviceGroups.length > 0) {\r\n filters.push(\r\n `${new Condition(\r\n 'ServiceGroupId',\r\n ODataOperators.Includes,\r\n payload.serviceGroups,\r\n ).toString()}`,\r\n );\r\n }\r\n const params: {\r\n $orderby: string;\r\n $filter?: string;\r\n $count: boolean;\r\n $select: string;\r\n $top: number;\r\n $skip: number;\r\n } = {\r\n $orderby: 'Name asc',\r\n $filter: filters.length > 0 ? filters.join(' and ') : undefined,\r\n $count: true,\r\n $select:\r\n 'Id,Name,Image,AvailabilityTypeId,AvailabilityTypeName,BookableAsset,ServiceId,ServiceGroupId,ApprovalRequired',\r\n $skip: 0,\r\n $top: 10,\r\n };\r\n try {\r\n const response = await httpClient.get(url, params);\r\n return {\r\n Results: response.value,\r\n TotalResultsLength: response['@odata.count'],\r\n ServiceType: undefined,\r\n } as IQuickAssetsSearchResult;\r\n } catch {\r\n return {\r\n Results: [],\r\n TotalResultsLength: 0,\r\n ServiceType: undefined,\r\n } as IQuickAssetsSearchResult;\r\n }\r\n },\r\n};\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, takeLatest, debounce, select } from 'redux-saga/effects';\r\nimport { assetQuickSearchActions as actions } from '.';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectGlobalServiceGroupFilter,\r\n selectShowAllCores,\r\n selectSiteMapSettings,\r\n} from 'app/slice/selectors';\r\nimport { Identifiable } from 'types/common';\r\nimport { AssetQuickSearchApi } from 'api/assetQuickSearchApi';\r\nimport {\r\n IMenuItemsSearchResult,\r\n IQuickAssetsSearchResult,\r\n IQuickSearchResults,\r\n} from './types';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { SiteMapNode, SiteMapProvider } from 'types/SiteMapSettings';\r\nimport { IAuthenticatedUser, isInRole } from 'types/AuthenticatedUser';\r\nimport { Roles } from 'app/slice/types';\r\nimport { uniqBy } from 'lodash';\r\n\r\nfunction* doShowSearchInput(action: PayloadAction) {\r\n yield put(actions.setOpen(action.payload));\r\n}\r\nfunction* doSetOpen(action: PayloadAction) {\r\n if (action.payload) {\r\n yield put(actions.getRecentAssets());\r\n yield put(actions.getRecentSearchTerms());\r\n }\r\n}\r\nfunction* doSearchAssets(action: PayloadAction) {\r\n const topServiceGroups:\r\n | Array>\r\n | undefined = yield select(selectGlobalServiceGroupFilter);\r\n const payload = {\r\n q: action.payload,\r\n serviceGroups: topServiceGroups ?? [],\r\n };\r\n try {\r\n const data = yield call(AssetQuickSearchApi.getAssetSearch, payload);\r\n yield put(actions.searchAssets_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.searchAssets_Error({ error: error }));\r\n }\r\n}\r\nfunction* doSearchAllAssets(action: PayloadAction) {\r\n const topServiceGroups:\r\n | Array>\r\n | undefined = yield select(selectGlobalServiceGroupFilter);\r\n const allCores = yield select(selectShowAllCores);\r\n const sett = yield select(selectSiteMapSettings);\r\n const user = yield select(selectAuthenticatedUser);\r\n let siteMapProvider = new SiteMapProvider(sett);\r\n let searchMenus: SiteMapNode[] = searchMenu(\r\n action.payload,\r\n siteMapProvider,\r\n siteMapProvider.getUserNodes(),\r\n user,\r\n );\r\n\r\n let menuResult: IMenuItemsSearchResult = {\r\n Results: searchMenus,\r\n TotalResultsLength: searchMenus.length,\r\n };\r\n yield put(actions.setMenuSearchResults(menuResult));\r\n try {\r\n let responses: IQuickAssetsSearchResult[] = [];\r\n for (let idx = 1; idx <= 3; idx++) {\r\n let payload = {\r\n q: action.payload,\r\n serviceGroups: allCores ? [] : topServiceGroups ?? [],\r\n serviceTypeId: idx,\r\n };\r\n const result = yield call(AssetQuickSearchApi.getAssetSearch, payload);\r\n if (result.ServiceType === ServiceType.Online) {\r\n yield put(actions.setOnlineSearchResults(result));\r\n } else if (result.ServiceType === ServiceType.Offline) {\r\n yield put(actions.setOfflineSearchResults(result));\r\n } else if (result.ServiceType === ServiceType.Sample) {\r\n yield put(actions.setRequestSearchResults(result));\r\n }\r\n responses.push(result);\r\n }\r\n yield put(\r\n actions.setTotalSearchCount(\r\n responses.reduce((part, a) => part + a.TotalResultsLength, 0),\r\n ),\r\n );\r\n const data = {\r\n online: responses.filter(f => f.ServiceType === ServiceType.Online)[0],\r\n offline: responses.filter(f => f.ServiceType === ServiceType.Offline)[0],\r\n request: responses.filter(f => f.ServiceType === ServiceType.Sample)[0],\r\n totalRresults: responses.reduce(\r\n (part, a) => part + a.TotalResultsLength,\r\n 0,\r\n ),\r\n } as IQuickSearchResults;\r\n yield put(actions.searchAllAssets_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.searchAllAssets_Error({ error: error }));\r\n }\r\n}\r\nfunction* doGetRecentAssets(action: PayloadAction) {\r\n const topServiceGroups:\r\n | Array>\r\n | undefined = yield select(selectGlobalServiceGroupFilter);\r\n const allCores = yield select(selectShowAllCores);\r\n const payload = {\r\n serviceGroups: allCores ? [] : topServiceGroups ?? [],\r\n };\r\n try {\r\n const data = yield call(AssetQuickSearchApi.getRecentAssets, payload);\r\n yield put(actions.getRecentAssets_Success(data.Results));\r\n } catch (error: unknown) {\r\n yield put(actions.getRecentAssets_Error({ error: error }));\r\n }\r\n}\r\nfunction* doGetRecentSearchTerms(payload: PayloadAction) {\r\n try {\r\n const data = yield call(\r\n httpClient.get,\r\n '/api/assets/recenttextsearchterms',\r\n );\r\n yield put(actions.getRecentSearchTerms_Success(data));\r\n } catch (error: unknown) {\r\n yield put(actions.getRecentSearchTerms_Error({ error: error }));\r\n }\r\n}\r\nconst searchMenu = (\r\n searchTerm: string,\r\n siteMapProvider: SiteMapProvider,\r\n menuNodes: SiteMapNode[],\r\n user?: IAuthenticatedUser,\r\n): SiteMapNode[] => {\r\n let searchMenus: SiteMapNode[] = [];\r\n const isAdmin =\r\n isInRole(user, Roles.Administrators) ||\r\n isInRole(user, Roles.GroupAdministrators) ||\r\n isInRole(user, Roles.EquipmentAdministrator);\r\n if (searchTerm !== '') {\r\n menuNodes.forEach(item => {\r\n if (\r\n item.Hide === false &&\r\n (!item.isAdminNode ||\r\n (item.isAdminNode &&\r\n isAdmin &&\r\n siteMapProvider.nodeAccesibleByRole(item, user)))\r\n ) {\r\n let childItems = item.ChildNodes.filter(\r\n ch =>\r\n ch.HideReact === false &&\r\n ch.Hide === false &&\r\n (!ch.isAdminNode ||\r\n (ch.isAdminNode &&\r\n isAdmin &&\r\n siteMapProvider.nodeAccesibleByRole(ch, user))),\r\n );\r\n if (childItems.length > 0) {\r\n childItems.forEach(c => {\r\n if (c.Title.toLowerCase().indexOf(searchTerm.toLowerCase()) >= 0) {\r\n searchMenus.push(c);\r\n }\r\n });\r\n }\r\n if (item.Title.toLowerCase().indexOf(searchTerm.toLowerCase()) >= 0) {\r\n searchMenus.push(item);\r\n }\r\n }\r\n });\r\n }\r\n let results =\r\n searchMenus.length > 0 ? uniqBy(searchMenus, f => f.Title) : searchMenus;\r\n return results;\r\n};\r\nexport function* assetQuickSearchSaga() {\r\n yield takeLatest(actions.setOpen.type, doSetOpen);\r\n yield takeLatest(actions.showSearchInput.type, doShowSearchInput);\r\n yield takeLatest(actions.getRecentAssets.type, doGetRecentAssets);\r\n yield takeLatest(actions.getRecentSearchTerms.type, doGetRecentSearchTerms);\r\n yield debounce(500, actions.searchAssets.type, doSearchAssets);\r\n yield debounce(500, actions.searchAllAssets.type, doSearchAllAssets);\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { assetQuickSearchSaga } from './saga';\r\nimport {\r\n AssetQuickSearchDetails,\r\n AssetQuickSearchState,\r\n IMenuItemsSearchResult,\r\n IQuickAssetsSearchResult,\r\n IQuickSearchResults,\r\n} from './types';\r\n\r\nexport const initialState: AssetQuickSearchState = {\r\n open: false,\r\n showSearchInSidebar: false,\r\n showSearchResults: false,\r\n recentAssets: { status: undefined },\r\n recentSearchTerms: { status: undefined },\r\n searchResults: { status: undefined },\r\n allSearchResults: { status: undefined },\r\n onlineSearchResults: undefined,\r\n offlineSearchResults: undefined,\r\n requestSearchResults: undefined,\r\n totalSearchCount: undefined,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'assetQuickSearch',\r\n initialState,\r\n reducers: {\r\n showSearchInput(state, action: PayloadAction) {\r\n state.showSearchInSidebar = action.payload;\r\n state.searchTerm = undefined;\r\n },\r\n setOpen(state, action: PayloadAction) {\r\n state.open = action.payload;\r\n },\r\n searchAssets(state: AssetQuickSearchState, action: PayloadAction) {\r\n state.searchTerm = action.payload;\r\n state.showSearchResults = action.payload?.length > 0;\r\n state.searchResults.status = 'pending';\r\n state.searchResults.error = undefined;\r\n },\r\n searchAssets_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.searchResults.status = 'resolved';\r\n state.searchResults.error = undefined;\r\n state.searchResults.value = action.payload;\r\n },\r\n searchAssets_Error(state, action: PayloadAction<{ error: unknown }>) {\r\n state.searchResults.status = 'rejected';\r\n state.searchResults.error = action.payload;\r\n state.searchResults.value = undefined;\r\n },\r\n getRecentAssets(state, action: PayloadAction) {\r\n state.recentAssets.status = 'pending';\r\n state.recentAssets.error = undefined;\r\n },\r\n getRecentAssets_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.recentAssets.status = 'resolved';\r\n state.recentAssets.error = undefined;\r\n state.recentAssets.value = action.payload;\r\n },\r\n getRecentAssets_Error(state, action: PayloadAction<{ error: unknown }>) {\r\n state.recentAssets.status = 'rejected';\r\n state.recentAssets.error = action.payload;\r\n state.recentAssets.value = [];\r\n },\r\n getRecentSearchTerms(state, action: PayloadAction) {\r\n state.recentSearchTerms.status = 'pending';\r\n state.recentSearchTerms.error = undefined;\r\n },\r\n getRecentSearchTerms_Success(state, action: PayloadAction) {\r\n state.recentSearchTerms.status = 'resolved';\r\n state.recentSearchTerms.error = undefined;\r\n state.recentSearchTerms.value = action.payload;\r\n },\r\n getRecentSearchTerms_Error(\r\n state,\r\n action: PayloadAction<{ error: unknown }>,\r\n ) {\r\n state.recentSearchTerms.status = 'rejected';\r\n state.recentSearchTerms.error = action.payload;\r\n state.recentSearchTerms.value = [];\r\n },\r\n searchAllAssets(\r\n state: AssetQuickSearchState,\r\n action: PayloadAction,\r\n ) {\r\n state.searchTerm = action.payload;\r\n state.showSearchResults = action.payload?.length > 0;\r\n state.allSearchResults.status = 'pending';\r\n state.allSearchResults.error = undefined;\r\n },\r\n searchAllAssets_Success(state, action: PayloadAction) {\r\n state.allSearchResults.status = 'resolved';\r\n state.allSearchResults.error = undefined;\r\n state.allSearchResults.value = action.payload;\r\n },\r\n searchAllAssets_Error(state, action: PayloadAction<{ error: unknown }>) {\r\n state.allSearchResults.status = 'rejected';\r\n state.allSearchResults.error = action.payload;\r\n state.allSearchResults.value = undefined;\r\n },\r\n setOnlineSearchResults(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.onlineSearchResults = action.payload;\r\n },\r\n setOfflineSearchResults(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.offlineSearchResults = action.payload;\r\n },\r\n setRequestSearchResults(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.requestSearchResults = action.payload;\r\n },\r\n setTotalSearchCount(state, action: PayloadAction) {\r\n state.totalSearchCount = action.payload;\r\n },\r\n setMenuSearchResults(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.menuItemsSearchResult = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: assetQuickSearchActions } = slice;\r\n\r\nexport const useAssetQuickSearchSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: assetQuickSearchSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useAssetQuickSearchSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.someAction());\r\n * };\r\n * }\r\n */\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.assetQuickSearch || initialState;\r\n\r\nexport const selectAssetQuickSearch = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n\r\nexport const selectRecentAssets = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.recentAssets,\r\n);\r\nexport const selectRecentSearchTerms = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.recentSearchTerms,\r\n);\r\nexport const selectSearchResults = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.searchResults,\r\n);\r\nexport const selectAllSearchResults = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.allSearchResults,\r\n);\r\nexport const selectSearchTerm = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.searchTerm,\r\n);\r\nexport const selectOpen = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.open,\r\n);\r\nexport const selectShowSearchInSidebar = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.showSearchInSidebar,\r\n);\r\nexport const selectOnlineSearchResults = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.onlineSearchResults,\r\n);\r\nexport const selectOfflineSearchResults = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.offlineSearchResults,\r\n);\r\nexport const selectRequestSearchResults = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.requestSearchResults,\r\n);\r\nexport const selectTotalSearchCount = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.totalSearchCount,\r\n);\r\nexport const selectMenuSearchResults = createSelector(\r\n [selectAssetQuickSearch],\r\n state => state.menuItemsSearchResult,\r\n);\r\n","/**\r\n *\r\n * ListItemLink\r\n *\r\n */\r\nimport { ListItem, ListItemProps } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport * as React from 'react';\r\n\r\nexport interface ListItemLinkProps extends ListItemProps {\r\n info?: string;\r\n}\r\n\r\nexport function ListItemLink(props) {\r\n return !!props.info ? (\r\n {props.info}}>\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 * AssetListItem\r\n *\r\n */\r\nimport {\r\n Avatar,\r\n ListItemIcon,\r\n ListItemSecondaryAction,\r\n ListItemText,\r\n} from '@material-ui/core';\r\nimport { toQueryString, toRootedURL } from 'utils/url-utils';\r\nimport { AssetThumbImage } from 'app/components/AssetThumbImage';\r\nimport { AssetQuickSearchDetails } from '../slice/types';\r\nimport { ListItemLink } from 'app/components/ListItemLink';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalSetting, selectglobalSettings } from 'app/slice/selectors';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport { GetSchedulerPagePath } from 'app/pages/CalendarPage/GetCalendarPagePath';\r\nimport cliTruncate from 'cli-truncate';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Body, Tips } from 'app/components/Typography';\r\nimport React from 'react';\r\nimport { ActionIconButton } from 'app/components/BasicButtons/ActionIconButton';\r\nimport { tryParseBool } from 'utils/string-utils';\r\nimport { Entity } from 'types/common';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\n\r\nexport interface AssetListItemProps {\r\n item: AssetQuickSearchDetails;\r\n useAssetPopup?: boolean;\r\n isMobile?: boolean;\r\n selectedServiceGroups?: Entity[];\r\n}\r\n\r\nconst DefaultQuickAssetSearchAction = [\r\n 'AssetDetails',\r\n 'Calendar',\r\n 'Timeline',\r\n] as const;\r\n\r\nconst getAssetDetailsLink = (item: AssetQuickSearchDetails) =>\r\n `/assets/details?id=${item.Id}`;\r\nconst getCalendarLink = (\r\n item: AssetQuickSearchDetails,\r\n EnableLegacyScheduler: boolean,\r\n) => {\r\n if (EnableLegacyScheduler) {\r\n return toRootedURL('/Weekly.aspx', { id: `os${item.ServiceId}` });\r\n }\r\n\r\n return toRootedURL(\r\n `${GetSchedulerPagePath('calendar')}?${toQueryString({\r\n eid: item.ServiceId,\r\n openToBook: true,\r\n })}`,\r\n );\r\n};\r\n\r\nconst getTimelineLink = (\r\n item: AssetQuickSearchDetails,\r\n EnableLegacyScheduler: boolean,\r\n) => {\r\n if (EnableLegacyScheduler) {\r\n return toRootedURL('/Timeline.aspx', { services: item.ServiceId });\r\n }\r\n return toRootedURL(\r\n `${GetSchedulerPagePath('timeline')}?eid=${item.ServiceId}&openToBook=true`,\r\n );\r\n};\r\n\r\nfunction getSettingValue(\r\n g: GlobalSettings,\r\n selectedServiceGroups?: Entity[],\r\n): (item: AssetQuickSearchDetails) => { t: string; url: string } {\r\n const s = g.GetString(AllowedSettings.DefaultQuickAssetSearchAction);\r\n const t = g.GetBooleanByKey(AllowedSettings.EnableLegacyScheduler);\r\n var validKey =\r\n DefaultQuickAssetSearchAction.find(f => f === s) || 'AssetDetails';\r\n return (item: AssetQuickSearchDetails) => {\r\n if (\r\n !item.BookableAsset ||\r\n (item.BookableAsset &&\r\n !selectedServiceGroups?.some(f => f.Id === item.ServiceGroupId))\r\n ) {\r\n return { t: 'AssetDetails', url: getAssetDetailsLink(item) };\r\n }\r\n switch (validKey) {\r\n case 'AssetDetails':\r\n return { t: validKey, url: getAssetDetailsLink(item) };\r\n case 'Calendar':\r\n return { t: validKey, url: getCalendarLink(item, t) };\r\n case 'Timeline':\r\n return { t: validKey, url: getTimelineLink(item, t) };\r\n }\r\n };\r\n}\r\n\r\nexport function AssetListItem({\r\n item,\r\n useAssetPopup,\r\n isMobile,\r\n selectedServiceGroups,\r\n}: AssetListItemProps) {\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const truncateName = isMobile\r\n ? item.Name?.length > 25\r\n : item.Name?.length > 50;\r\n const app = useSelector(selectglobalSettings);\r\n const defaultLink = getSettingValue(app);\r\n const EnableLegacyScheduler = useSelector(\r\n state =>\r\n tryParseBool(\r\n selectGlobalSetting(state, AllowedSettings.EnableLegacyScheduler),\r\n ) === true,\r\n );\r\n const showCalendarLinks = React.useMemo(() => {\r\n return (\r\n (selectedServiceGroups === undefined && item.BookableAsset) ||\r\n (!!selectedServiceGroups &&\r\n selectedServiceGroups.some(f => f.Id === item.ServiceGroupId))\r\n );\r\n }, [item.BookableAsset, item.ServiceGroupId, selectedServiceGroups]);\r\n const href = React.useMemo(() => {\r\n return defaultLink(item);\r\n }, [defaultLink, item]);\r\n const handleAssetClick = React.useCallback(() => {\r\n history.push(href.url);\r\n }, [history, href.url]);\r\n return (\r\n \r\n \r\n {item.Image !== null ? (\r\n \r\n ) : (\r\n {'A'}\r\n )}\r\n \r\n {cliTruncate(item.Name, 25, { position: 'end' })}\r\n ) : (\r\n <>\r\n {truncateName ? (\r\n \r\n {item.Name?.substr(0, 50) + '...'}\r\n \r\n ) : (\r\n <>{item.Name}\r\n )}\r\n \r\n )\r\n }\r\n secondary={\r\n isMobile ? (\r\n cliTruncate(item.AvailabilityTypeName, 15, { position: 'middle' })\r\n ) : item.ApprovalRequired ? (\r\n \r\n {item.AvailabilityTypeName}\r\n {t(translations.ApprovalRequired) as string}\r\n \r\n ) : (\r\n item.AvailabilityTypeName\r\n )\r\n }\r\n />\r\n \r\n
    \r\n {item.BookableAsset && showCalendarLinks && (\r\n \r\n )}\r\n {/* {item.BookableAsset && showCalendarLinks && (\r\n \r\n )} */}\r\n {/* */}\r\n
    \r\n
    \r\n \r\n );\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const QuickSearchSection = styled('div')`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 8px;\r\n align-self: stretch;\r\n width: 100%;\r\n`;\r\nexport const QuickSearchSectionTitle = styled('div')`\r\n display: flex;\r\n padding: 0px 8px;\r\n align-items: center;\r\n gap: 10px;\r\n align-self: stretch;\r\n`;\r\nexport const QuickSearchSearchesItems = styled('div')`\r\n display: flex;\r\n flex-direction: row;\r\n align-items: flex-start;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n align-self: stretch;\r\n`;\r\nexport const QuickSearchRecentItems = styled('div')`\r\n display: flex;\r\n padding: 4px 0px;\r\n flex-direction: column;\r\n align-items: stretch;\r\n gap: 4px;\r\n align-self: stretch;\r\n width: 100%;\r\n`;\r\nexport const QuickSearchEmptySection = styled('div')`\r\n display: flex;\r\n width: 100%;\r\n height: 260px;\r\n padding: 0px 16px 16px 16px;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n flex-shrink: 0;\r\n`;\r\nexport const QuickSearchEmptyContent = styled('div')`\r\n display: flex;\r\n padding: 0px 8px;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 8px;\r\n align-self: stretch;\r\n`;\r\nexport const QuickSearchSeeAll = styled('div')`\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n align-self: stretch;\r\n`;\r\nexport const QuickSearchMainTitleSection = styled('div')`\r\n display: flex;\r\n padding: 0px 8px;\r\n align-items: center;\r\n gap: 10px;\r\n align-self: stretch;\r\n`;\r\nexport const QuickSearchAllInstrumentsSection = styled('div')`\r\n display: flex;\r\n padding: 0px 8px;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 10px;\r\n align-self: stretch;\r\n`;\r\nexport const MenuSearchEmptyContent = styled('div')`\r\n display: flex;\r\n width: 100%;\r\n padding: 0px 16px 16px 16px;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n flex-shrink: 0;\r\n`;\r\n","/**\r\n *\r\n * RecentAssetsList\r\n *\r\n */\r\nimport { LinearProgress, ListItem } from '@material-ui/core';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectRecentAssets } from '../slice/selectors';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { AssetListItem } from '../AssetListItem';\r\nimport {\r\n QuickSearchSection,\r\n QuickSearchRecentItems,\r\n QuickSearchSectionTitle,\r\n} from '../RecentWrappers/wrappers';\r\nimport { Body, Uppercase } from 'app/components/Typography';\r\nimport React from 'react';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface RecentAssetsListProps {\r\n useAssetPopup?: boolean;\r\n isMobile?: boolean;\r\n selectedServiceGroups?: Entity[];\r\n}\r\n\r\nexport function RecentAssetsList(props: RecentAssetsListProps) {\r\n const { t } = useTranslation();\r\n const data = useSelector(selectRecentAssets);\r\n const { useAssetPopup, isMobile, selectedServiceGroups } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {t(translations.RecentAssets)}\r\n \r\n \r\n \r\n {data.status === 'pending' ? (\r\n
    \r\n \r\n
    \r\n ) : data.status === 'rejected' ||\r\n (data.status === 'resolved' && data.value?.length === 0) ? (\r\n
    \r\n {'No recent data'}\r\n
    \r\n ) : (\r\n \r\n {data.value?.map((item, index) => (\r\n \r\n ))}\r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n","import Chip from '@material-ui/core/Chip';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport React from 'react';\r\nimport { IPathAndQuery, toRootedURL } from 'utils/url-utils';\r\n\r\nexport interface RecentItemProps {\r\n label: React.ReactNode;\r\n icon?: IconProp;\r\n link?: string | IPathAndQuery;\r\n searchTerm?: string;\r\n onClick?: (searchTerm?: string) => void;\r\n}\r\nexport function RecentItem(props: RecentItemProps) {\r\n const { label, icon, onClick, searchTerm, link } = props;\r\n const handleClick = React.useCallback(() => {\r\n !!onClick && onClick(searchTerm);\r\n }, [onClick, searchTerm]);\r\n const absolutePath =\r\n link === undefined\r\n ? undefined\r\n : typeof link === 'string'\r\n ? toRootedURL(link)\r\n : toRootedURL(\r\n (link as IPathAndQuery).path,\r\n (link as IPathAndQuery).search,\r\n );\r\n return (\r\n handleClick()}\r\n component={'a'}\r\n avatar={}\r\n href={absolutePath}\r\n clickable\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * RecentSearchTermsList\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { LinearProgress, ListItem } from '@material-ui/core';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectRecentSearchTerms } from '../slice/selectors';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { RecentItem } from '../RecentItem';\r\nimport { Body, Uppercase } from 'app/components/Typography';\r\nimport {\r\n QuickSearchSection,\r\n QuickSearchSearchesItems,\r\n QuickSearchSectionTitle,\r\n QuickSearchEmptyContent,\r\n} from '../RecentWrappers/wrappers';\r\n\r\nexport interface RecentSearchTermsListProps {\r\n onClick: (searchTerm?: string) => void;\r\n}\r\n\r\nexport function RecentSearchTermsList(props: RecentSearchTermsListProps) {\r\n const { t } = useTranslation();\r\n const recentSearchTermsState = useSelector(selectRecentSearchTerms);\r\n const { onClick } = props;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {t(translations.RecentSearches)}\r\n \r\n \r\n \r\n {recentSearchTermsState.status === 'pending' ? (\r\n
    \r\n \r\n
    \r\n ) : recentSearchTermsState.status === 'rejected' ||\r\n (recentSearchTermsState.status === 'resolved' &&\r\n recentSearchTermsState.value?.length === 0) ? (\r\n \r\n \r\n \r\n {t(translations.NoSearchTermFound)}\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {recentSearchTermsState.value?.map((item, index) => (\r\n onClick(search)}\r\n // link={toRootedURL(`/assets/`, { q: item })}\r\n />\r\n ))}\r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n","import { SiteMapNode } from 'types/SiteMapSettings';\r\nimport * as React from 'react';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { LinkBehavior } from 'app/components/ExternalLink';\r\n\r\nexport interface MenuSearchItemProps {\r\n item: SiteMapNode;\r\n}\r\n\r\nexport function MenuSearchItem(props: MenuSearchItemProps) {\r\n const { item } = props;\r\n const convertUrl = (url: string): string => {\r\n if (url !== null) {\r\n if (url.indexOf(process.env.PUBLIC_URL) !== -1) {\r\n return url.replace(process.env.PUBLIC_URL, '');\r\n }\r\n return url;\r\n }\r\n return url;\r\n };\r\n const link: string = React.useMemo(() => {\r\n return item.ChildNodes.filter(\r\n ch => ch.HideReact === false && ch.Hide === false,\r\n ).length > 0\r\n ? item.LinkWithChildren ?? item.reactUrl ?? convertUrl(item.Url)\r\n : item.reactUrl ?? convertUrl(item.Url);\r\n }, [item.ChildNodes, item.LinkWithChildren, item.Url, item.reactUrl]);\r\n\r\n const external = React.useMemo(() => {\r\n return (\r\n link.includes('aspx') ||\r\n (isNullOrUndefined(item.reactUrl) &&\r\n item.ChildNodes.filter(\r\n ch => ch.HideReact === false && ch.Hide === false,\r\n ).length === 0)\r\n );\r\n }, [item.ChildNodes, item.reactUrl, link]);\r\n return (\r\n \r\n {item.Title}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * MenuSearchResultList\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { ListItem } from '@material-ui/core';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectMenuSearchResults } from '../slice/selectors';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Body, Uppercase } from 'app/components/Typography';\r\nimport {\r\n QuickSearchSection,\r\n QuickSearchSearchesItems,\r\n QuickSearchSectionTitle,\r\n QuickSearchEmptyContent,\r\n MenuSearchEmptyContent,\r\n} from '../RecentWrappers/wrappers';\r\nimport { MenuSearchItem } from '../MenuSearchItem';\r\n\r\nexport interface MenuSearchResultListProps {}\r\n\r\nexport function MenuSearchResultList(props: MenuSearchResultListProps) {\r\n const { t } = useTranslation();\r\n const menuSearchState = useSelector(selectMenuSearchResults);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {t(translations.RelatedScreens)}\r\n \r\n \r\n \r\n {menuSearchState === undefined ||\r\n menuSearchState.Results.length === 0 ? (\r\n \r\n \r\n \r\n \r\n {t(translations.NoRelatedScreensFound)}\r\n \r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {menuSearchState.Results.map((item, index) => (\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 * AssetSearchResultsByType\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { LinearProgress, ListItem } from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n selectAllSearchResults,\r\n selectMenuSearchResults,\r\n selectOfflineSearchResults,\r\n selectOnlineSearchResults,\r\n selectRequestSearchResults,\r\n selectSearchTerm,\r\n selectTotalSearchCount,\r\n} from '../slice/selectors';\r\nimport { AssetListItem } from '../AssetListItem';\r\nimport {\r\n QuickSearchEmptyContent,\r\n QuickSearchEmptySection,\r\n QuickSearchRecentItems,\r\n QuickSearchSection,\r\n QuickSearchSectionTitle,\r\n QuickSearchSeeAll,\r\n} from '../RecentWrappers/wrappers';\r\nimport { Body, Uppercase } from 'app/components/Typography';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { Entity } from 'types/common';\r\nimport { MenuSearchResultList } from '../MenuSearchResultList';\r\n\r\nexport interface AssetSearchResultsByTypeProps {\r\n onAllAssetsClick: (serviceTypeId?: number, searchTerm?: string) => void;\r\n isMobile?: boolean;\r\n selectedServiceGroups?: Entity[];\r\n}\r\n\r\nexport function AssetSearchResultsByType(props: AssetSearchResultsByTypeProps) {\r\n const { t } = useTranslation();\r\n const { onAllAssetsClick, isMobile, selectedServiceGroups } = props;\r\n // const searchTerm = useSelector(selectSearchTerm);\r\n const state = useSelector(selectAllSearchResults);\r\n const onlineState = useSelector(selectOnlineSearchResults);\r\n const offlineState = useSelector(selectOfflineSearchResults);\r\n const requestState = useSelector(selectRequestSearchResults);\r\n const totalRresults = useSelector(selectTotalSearchCount);\r\n const searchTerm = useSelector(selectSearchTerm);\r\n const menuItemsState = useSelector(selectMenuSearchResults);\r\n // const resultsLength = React.useMemo(() => {\r\n // return state.value?.totalRresults;\r\n // }, [state.value?.totalRresults]);\r\n\r\n const OnlineServiceLabel = React.useMemo(() => {\r\n return (t(translations.InstrumentsFound) as string).replace(\r\n '{0}',\r\n `(${(onlineState?.TotalResultsLength ?? 0).toString()})`,\r\n );\r\n }, [onlineState?.TotalResultsLength, t]);\r\n const RequestServiceLabel = React.useMemo(() => {\r\n return (t(translations.RequestsFound) as string).replace(\r\n '{0}',\r\n `(${(requestState?.TotalResultsLength ?? 0).toString()})`,\r\n );\r\n }, [requestState?.TotalResultsLength, t]);\r\n const OfflineServiceLabel = React.useMemo(() => {\r\n return (t(translations.ConsumablesFound) as string).replace(\r\n '{0}',\r\n `(${(offlineState?.TotalResultsLength ?? 0).toString()})`,\r\n );\r\n }, [offlineState?.TotalResultsLength, t]);\r\n\r\n const showOnline = React.useMemo(() => {\r\n return (\r\n (state.status === 'pending' &&\r\n !!onlineState &&\r\n onlineState.Results.length > 0) ||\r\n (state.status === 'resolved' && (totalRresults ?? 0) > 0)\r\n );\r\n }, [onlineState, state.status, totalRresults]);\r\n\r\n const showOffline = React.useMemo(() => {\r\n return (\r\n (state.status === 'pending' &&\r\n !!offlineState &&\r\n offlineState.Results.length > 0) ||\r\n (state.status === 'resolved' && (totalRresults ?? 0) > 0)\r\n );\r\n }, [offlineState, state.status, totalRresults]);\r\n const showRequests = React.useMemo(() => {\r\n return (\r\n (state.status === 'pending' &&\r\n !!requestState &&\r\n requestState.Results.length > 0) ||\r\n (state.status === 'resolved' && (totalRresults ?? 0) > 0)\r\n );\r\n }, [requestState, state.status, totalRresults]);\r\n // const error = React.useMemo(() => {\r\n // return state.error !== undefined\r\n // ? typeof state.error === 'string'\r\n // ? state.error\r\n // : undefined\r\n // : undefined;\r\n // }, [state.error]);\r\n return (\r\n <>\r\n {!state.status ||\r\n (state.status === 'pending' && (\r\n
    \r\n \r\n
    \r\n ))}\r\n {state.status === 'resolved' && totalRresults === 0 && (\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.NothingFound)}\r\n \r\n \r\n \r\n \r\n {`Try to `}\r\n \r\n \r\n \r\n {` or change the query`}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n {showOnline && (\r\n \r\n \r\n {OnlineServiceLabel}\r\n \r\n }\r\n onClick={() =>\r\n onAllAssetsClick(ServiceType.Online, searchTerm)\r\n }\r\n >\r\n {t(translations.FullResults)}\r\n \r\n \r\n \r\n \r\n \r\n {onlineState?.Results?.map((item, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n )}\r\n\r\n {showOffline && (\r\n \r\n \r\n {OfflineServiceLabel}\r\n \r\n }\r\n onClick={() =>\r\n onAllAssetsClick(ServiceType.Offline, searchTerm)\r\n }\r\n >\r\n {t(translations.FullResults)}\r\n \r\n \r\n \r\n \r\n \r\n {offlineState?.Results?.map((item, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n )}\r\n\r\n {showRequests && (\r\n \r\n \r\n {RequestServiceLabel}\r\n \r\n }\r\n onClick={() =>\r\n onAllAssetsClick(ServiceType.Sample, searchTerm)\r\n }\r\n >\r\n {t(translations.FullResults)}\r\n \r\n \r\n \r\n \r\n \r\n {requestState?.Results?.map((item, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n )}\r\n {!!menuItemsState && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * AssetQuickSearch\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n ClickAwayListener,\r\n createStyles,\r\n Fade,\r\n List,\r\n makeStyles,\r\n Paper,\r\n Popper,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { useAssetQuickSearchSlice } from './slice';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectAssetQuickSearch,\r\n selectOpen,\r\n selectSearchTerm,\r\n} from './slice/selectors';\r\nimport { RecentAssetsList } from './RecentAssetsList';\r\nimport { RecentSearchTermsList } from './RecentSearchTermsList';\r\nimport { toQueryString, toRootedURL } from 'utils/url-utils';\r\nimport { TextControlField } from '../BasicInputs/TextControlField';\r\nimport { useRef } from 'react';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useEffect } from 'react';\r\nimport { IconButton } from '../BasicButtons/IconButton';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { Body } from '../Typography';\r\nimport useGlobalDOMEvents from 'app/hooks/useGlobalDomEvents';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { box_shadow_s } from 'styles/shadows/bookitShadow';\r\nimport { BasicToggle } from '../BasicToggle';\r\nimport { AssetSearchResultsByType } from './AssetSearchResultsByType';\r\nimport {\r\n QuickSearchAllInstrumentsSection,\r\n QuickSearchMainTitleSection,\r\n} from './RecentWrappers/wrappers';\r\nimport { Button } from '../BasicButtons/Button';\r\nimport { AssetsSelectionProps } from 'app/pages/MyAssetsPage/AssetsSelection/AssetsSelection';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectShowAllCores,\r\n} from 'app/slice/selectors';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport clsx from 'clsx';\r\n\r\nexport interface AssetQuickSearchProps {\r\n showInSideBar?: boolean;\r\n}\r\n\r\nexport const AssetQuickSearch = React.memo(function AssetQuickSearch(\r\n props: AssetQuickSearchProps,\r\n) {\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n const { actions } = useAssetQuickSearchSlice();\r\n const { actions: appSettingsAction } = useAppSettingsSlice();\r\n const open = useSelector(selectOpen);\r\n const isMobile = DetectIsMobile();\r\n const searchAllCores = useSelector(selectShowAllCores);\r\n const searchTerm = useSelector(selectSearchTerm);\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const handleInputChange = e => {\r\n if (!open) {\r\n dispatch(actions.setOpen(true));\r\n }\r\n dispatch(actions.searchAllAssets(e.target.value));\r\n };\r\n const state = useSelector(selectAssetQuickSearch);\r\n const elementRef = useRef(null);\r\n\r\n const handleClick = event => {\r\n dispatch(actions.setOpen(true));\r\n };\r\n\r\n const handleSearchAllCores = (value: boolean) => {\r\n dispatch(appSettingsAction.setShowAllCores(value));\r\n if (!!searchTerm && searchTerm !== '') {\r\n dispatch(actions.searchAllAssets(searchTerm));\r\n } else {\r\n dispatch(actions.getRecentSearchTerms());\r\n dispatch(actions.getRecentAssets());\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n if (open) {\r\n dispatch(actions.setOpen(false));\r\n }\r\n };\r\n const handleHideAssetQuickSearchClick = () => {\r\n dispatch(actions.showSearchInput(false));\r\n };\r\n const handleOpenAssets = (serviceTypeId?: number, searchTerm?: string) => {\r\n let selParams = {\r\n useSidePanel: true,\r\n actionType: 'AssetSearch',\r\n serviceTypeId: serviceTypeId,\r\n searchTerm: searchTerm,\r\n //offTypeIds: services,\r\n } as AssetsSelectionProps;\r\n if (isMobile) {\r\n dispatch(\r\n appSettingsAction.navigate(\r\n `/AssetSearch?${toQueryString({\r\n actionType: 'AssetSearch',\r\n serviceTypeId: serviceTypeId,\r\n searchTerm: searchTerm,\r\n })}`,\r\n ),\r\n );\r\n } else {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.AssetsSelection,\r\n props: selParams,\r\n expanded: true,\r\n }),\r\n );\r\n }\r\n };\r\n // manually trigger rerender using a useless usState hook\r\n // this ensures that the popper is rendered only after the div is rendered and have provided the elementRef value to ancor the popper\r\n const countState = React.useState(0);\r\n useEffect(() => {\r\n countState[1](c => c + 1);\r\n // setCount (rerender) needs to occur after element elementRef.current value is bound\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementRef.current]);\r\n useGlobalDOMEvents({\r\n keyup(ev) {\r\n if ((ev as KeyboardEvent).key === 'Escape') {\r\n dispatch(actions.setOpen(false));\r\n }\r\n },\r\n });\r\n\r\n return (\r\n handleClose()}>\r\n \r\n
    \r\n {isMobile && (\r\n handleHideAssetQuickSearchClick()}\r\n title={t(translations.Close)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n size=\"small\"\r\n >\r\n \r\n \r\n )}\r\n handleInputChange(e)}\r\n onFocus={e => handleClick(e)}\r\n onClick={e => handleClick(e)}\r\n autoFocus={false}\r\n size=\"small\"\r\n value={state.searchTerm || ''}\r\n classes={{\r\n root: props.showInSideBar\r\n ? classes.inputRootMobile\r\n : classes.inputRoot,\r\n }}\r\n autoComplete=\"off\"\r\n aria-label=\"search\"\r\n inputProps={{ 'aria-label': 'search' }}\r\n endIcon={}\r\n fullWidth\r\n />\r\n {elementRef.current !== null && (\r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n \r\n \r\n {isMobile\r\n ? t(translations.AssetsSearch)\r\n : t(translations.InstrumentAssetSearch)}\r\n \r\n handleSearchAllCores(value)}\r\n />\r\n \r\n {state.searchTerm !== undefined &&\r\n state.searchTerm?.length > 0 ? (\r\n \r\n {\r\n handleOpenAssets(serviceType, searchTerm);\r\n handleClose();\r\n }}\r\n selectedServiceGroups={selectedServiceGroups}\r\n isMobile={isMobile}\r\n />\r\n \r\n ) : (\r\n \r\n {\r\n handleOpenAssets(undefined, searchTerm);\r\n handleClose();\r\n }}\r\n />\r\n {/* \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.AdvancedAssetSearch)}\r\n \r\n \r\n \r\n handleClose()}\r\n title={t(translations.Close)}\r\n variant=\"ghost\"\r\n shape=\"square\"\r\n aria-label=\"close\"\r\n size=\"small\"\r\n >\r\n \r\n \r\n \r\n */}\r\n {/* */}\r\n \r\n \r\n {\r\n handleOpenAssets();\r\n handleClose();\r\n }}\r\n >\r\n {t(translations.SeeAllInstruments)}\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\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n // root css\r\n },\r\n menuButton: {\r\n marginRight: theme.spacing(2),\r\n },\r\n title: {\r\n flexGrow: 1,\r\n display: 'none',\r\n [theme.breakpoints.up('sm')]: {\r\n display: 'block',\r\n },\r\n },\r\n search: {\r\n position: 'relative',\r\n display: 'flex',\r\n alignItems: 'center',\r\n borderRadius: theme.shape.borderRadius,\r\n // backgroundColor: alpha(theme.palette.common.white, 0.15),\r\n // '&:hover': {\r\n // backgroundColor: alpha(theme.palette.common.white, 0.25),\r\n // },\r\n marginLeft: 0,\r\n [theme.breakpoints.up('sm')]: {\r\n width: 355,\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n width: 463,\r\n },\r\n paddingTop: 2,\r\n paddingBottom: 2,\r\n gap: 8,\r\n // [theme.breakpoints.up('sm')]: {\r\n // marginLeft: theme.spacing(1),\r\n // width: 'auto',\r\n // },\r\n },\r\n searchIcon: {\r\n padding: theme.spacing(0, 2),\r\n height: '100%',\r\n position: 'absolute',\r\n pointerEvents: 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n inputRoot: {\r\n color: 'inherit',\r\n flexGrow: 1,\r\n },\r\n inputRootMobile: {\r\n color: 'inherit',\r\n flexGrow: 1,\r\n flexShrink: 1,\r\n },\r\n inputInput: {\r\n padding: theme.spacing(1, 1, 1, 0),\r\n // vertical padding + font size from searchIcon\r\n paddingLeft: `calc(1em + ${theme.spacing(4)}px)`,\r\n transition: theme.transitions.create('width'),\r\n width: '100%',\r\n [theme.breakpoints.up('sm')]: {\r\n width: '30ch',\r\n '&:focus': {\r\n width: '50ch',\r\n },\r\n },\r\n },\r\n popper: {\r\n // +1 from the appBar (zIndex: theme.zIndex.drawer + 1)\r\n zIndex: theme.zIndex.drawer + 2,\r\n '&.isMobile': {\r\n zIndex: theme.zIndex.modal + 2,\r\n height: 'calc(100% - 92px)',\r\n },\r\n\r\n [theme.breakpoints.up('lg')]: {\r\n width: 700,\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n width: 600,\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n width: '100%',\r\n },\r\n },\r\n paper: {\r\n display: 'flex',\r\n width: '672px',\r\n padding: '16px 12px',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: '24px',\r\n\r\n borderRadius: '12px',\r\n border: `1px solid ${bookitColors.grayscale.graySelection}`,\r\n background: bookitColors.base.white,\r\n /* Shadow/box-shadow-s */\r\n boxShadow: box_shadow_s,\r\n '&.isMobile': {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n },\r\n paperTitleSection: {},\r\n }),\r\n);\r\n","/**\r\n * This file is only need if you want to extract messages into JSON files in locales folder\r\n * AND if you are also using the object syntax instead of string syntax. \\\r\n * Check the documentation section i18n for details\r\n */\r\nimport { translations } from 'locales/translations';\r\nimport { _t } from 'utils/messages';\r\n\r\nexport const messages = {\r\n userDetails: () => _t(translations.UserDetails),\r\n changePassword: () => _t(translations.reg_ChangePassword),\r\n changeUserGroup: () => _t(translations.changeUserGroup),\r\n logout: () => _t(translations.main_master_LogOutLinkText),\r\n help: () => _t(translations.Help),\r\n optOutNotifications: () => _t(translations.OptOutNotifications),\r\n optOutNotificationsTitle: () => _t(translations.OptOutNotifications_info),\r\n coreRegistration: () => _t(translations.ServiceGroupRegistration),\r\n googleCalendar: () => _t(translations.menu_GoogleCalendar),\r\n outlookCalendar: () => _t(translations.menu_OutlookCalendar),\r\n notifications: () => _t(translations.Notifications),\r\n};\r\n","import { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport * as React from 'react';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport interface UserMenuButtonProps extends ButtonProps {\r\n children: React.ReactNode;\r\n open: boolean;\r\n isMobile?: boolean;\r\n}\r\n\r\nexport default function UserMenuButton(props: UserMenuButtonProps) {\r\n const { children, isMobile, open, ...other } = props;\r\n return isMobile ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n }\r\n startIcon={\r\n \r\n }\r\n {...other}\r\n >\r\n {children}\r\n \r\n );\r\n}\r\n","import {\r\n MenuItem,\r\n Divider,\r\n ListItemIcon,\r\n ListItemText,\r\n} from '@material-ui/core';\r\n\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport {\r\n selectAppSettings,\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Body } from 'app/components/Typography';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { messages } from '../messages';\r\nimport UserMenuButton from './UserMenuButton';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { translations } from 'locales/translations';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport { StyledUserMenu } from '../../styled';\r\nimport { BasicToggle } from 'app/components/BasicToggle';\r\nimport { isInRole } from 'types/AuthenticatedUser';\r\nimport { Roles } from 'app/slice/types';\r\n\r\nexport interface UserMenuProps {}\r\n\r\nexport function UserMenu(props: UserMenuProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const [open, setOpen] = React.useState(false);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const settings = useSelector(selectglobalSettings);\r\n const appSettings = useSelector(selectAppSettings);\r\n const googleCalendarModuleEnabled = IsModuleEnabled(\r\n appSettings,\r\n KnownModules.GoogleCalendar,\r\n );\r\n const multipleAdGroupsModuleEnabled = IsModuleEnabled(\r\n appSettings,\r\n KnownModules.MultipleAdGroups,\r\n );\r\n const serviceGroupRegistrationModuleEnabled = IsModuleEnabled(\r\n appSettings,\r\n KnownModules.ServiceGroupRegistration,\r\n );\r\n const isAdmin =\r\n isInRole(authenticatedUser, Roles.Administrators) ||\r\n isInRole(authenticatedUser, Roles.GroupAdministrators);\r\n const googleCalendar = googleCalendarModuleEnabled; // && authenticatedUser?.CalendarType === 0;\r\n const outlookCalendar = googleCalendarModuleEnabled; // && authenticatedUser?.CalendarType === 1;\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const handleClick = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n setOpen(true);\r\n };\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n setOpen(false);\r\n };\r\n const Opt_Out = settings.GetBooleanByKey(AllowedSettings.AllowUsersToOpt_Out);\r\n const theme = useTheme();\r\n return (\r\n \r\n handleClick(event)}\r\n open={open}\r\n isMobile={isMobile}\r\n >\r\n {isMobile && (\r\n \r\n )}\r\n {!isMobile && authenticatedUser?.DisplayName}\r\n \r\n handleClose()}\r\n >\r\n {isMobile && (\r\n handleClose()}>\r\n \r\n \r\n \r\n \r\n {authenticatedUser?.DisplayName}\r\n \r\n \r\n )}\r\n {isMobile && }\r\n handleClose()}\r\n >\r\n \r\n \r\n \r\n {t(messages.userDetails())}\r\n \r\n {googleCalendar && (\r\n handleClose()}\r\n >\r\n \r\n \r\n \r\n {t(messages.googleCalendar())}\r\n \r\n )}\r\n {outlookCalendar && (\r\n handleClose()}\r\n >\r\n \r\n \r\n \r\n {t(messages.outlookCalendar())}\r\n \r\n )}\r\n handleClose()}\r\n >\r\n \r\n \r\n \r\n {t(messages.changePassword())}\r\n \r\n handleClose()}\r\n component={'a'}\r\n href={toRootedURL('/ActiveUserGroup/shrink')}\r\n disabled={\r\n !(\r\n (authenticatedUser?.UserGroups?.length || 1) > 1 &&\r\n multipleAdGroupsModuleEnabled\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n 1 &&\r\n multipleAdGroupsModuleEnabled\r\n ? //t(messages.changeUserGroup()) +\r\n t(translations.SwitchFromToAnotherUserGroup).replace(\r\n '{0}',\r\n (authenticatedUser?.ActiveUserGroup?.Name as string) ??\r\n (authenticatedUser?.ActiveUserGroup?.Id as string),\r\n )\r\n : authenticatedUser?.ActiveUserGroup?.Name ??\r\n authenticatedUser?.ActiveUserGroup?.Id\r\n }\r\n >\r\n \r\n {(authenticatedUser?.UserGroups?.length || 1) > 1 &&\r\n multipleAdGroupsModuleEnabled\r\n ? //t(messages.changeUserGroup()) +\r\n t(translations.SwitchFrom).replace(\r\n '{0}',\r\n (authenticatedUser?.ActiveUserGroup?.Name as string) ??\r\n (authenticatedUser?.ActiveUserGroup?.Id as string),\r\n )\r\n : authenticatedUser?.ActiveUserGroup?.Name ??\r\n authenticatedUser?.ActiveUserGroup?.Id}\r\n \r\n \r\n }\r\n >
    \r\n \r\n {Opt_Out && (\r\n handleClose()}>\r\n t(messages.optOutNotificationsTitle())}\r\n />\r\n \r\n )}\r\n {(authenticatedUser?.HasRegisterableServiceGroups || false) &&\r\n serviceGroupRegistrationModuleEnabled && (\r\n handleClose()}\r\n component={'a'}\r\n href={toRootedURL('/ServiceGroupRegistrations.aspx')}\r\n target={'_blank'}\r\n >\r\n \r\n \r\n \r\n {t(messages.coreRegistration())}\r\n \r\n )}\r\n handleClose()}\r\n component={'a'}\r\n href={toRootedURL('/NotificationSettings.aspx')}\r\n target={'_blank'}\r\n >\r\n \r\n \r\n \r\n {t(messages.notifications())}\r\n \r\n\r\n handleClose()}\r\n component={'a'}\r\n href={\r\n isAdmin\r\n ? toRootedURL('/Admin/default.aspx')\r\n : toRootedURL('/help.aspx')\r\n }\r\n target={'_blank'}\r\n >\r\n \r\n \r\n \r\n {t(messages.help())}\r\n \r\n handleClose()}\r\n component={'a'}\r\n href={toRootedURL('/account/signout')}\r\n >\r\n \r\n \r\n \r\n {t(messages.logout())}\r\n \r\n \r\n \r\n );\r\n}\r\n","import {\r\n selectAuthenticatedUser,\r\n selectglobalSettings,\r\n} from 'app/slice/selectors';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport * as React from 'react';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { MenuItem } from '@material-ui/core';\r\nimport { isEmptyOrWhitespace } from 'utils/typeUtils';\r\nimport { translations } from 'locales/translations';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n\r\nexport interface SwitchSitesProps {}\r\n\r\nexport function SwitchSites(props: SwitchSitesProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const settings = useSelector(selectglobalSettings);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n\r\n const allowToSwitchToOtherSites = settings.GetBooleanByKey(\r\n AllowedSettings.AllowToSwitchToOtherSites,\r\n );\r\n const externalTitleOne = settings.GetNullableByKey(\r\n AllowedSettings.ExternalSwitchTitle1,\r\n );\r\n const externalUrlOne = settings.GetNullableByKey(\r\n AllowedSettings.ExternalSwitchUrl1,\r\n );\r\n const externalTitleTwo = settings.GetNullableByKey(\r\n AllowedSettings.ExternalSwitchTitle2,\r\n );\r\n const externalUrlTwo = settings.GetNullableByKey(\r\n AllowedSettings.ExternalSwitchUrl2,\r\n );\r\n const externalSitesIcon = settings.GetNullableByKey(\r\n AllowedSettings.ExternalSitesIcon,\r\n );\r\n const buttonIcon = React.useMemo(() => {\r\n if (externalSitesIcon !== null) {\r\n if (externalSitesIcon.indexOf('globe-europe') !== -1) {\r\n return 'earth-europe' as IconProp;\r\n } else if (externalSitesIcon.indexOf(' fa-') !== -1) {\r\n let tmpIcon = externalSitesIcon.substring(\r\n externalSitesIcon.indexOf(' fa-') + 4,\r\n externalSitesIcon.length,\r\n );\r\n return tmpIcon as IconProp;\r\n } else {\r\n return 'earth-europe' as IconProp;\r\n }\r\n } else {\r\n return 'earth-europe' as IconProp;\r\n }\r\n }, [externalSitesIcon]);\r\n const hasExternalOne = React.useMemo(() => {\r\n return !(\r\n isEmptyOrWhitespace(externalTitleOne) ||\r\n isEmptyOrWhitespace(externalUrlOne)\r\n );\r\n }, [externalTitleOne, externalUrlOne]);\r\n const hasExternalTwo = React.useMemo(() => {\r\n return !(\r\n isEmptyOrWhitespace(externalTitleTwo) ||\r\n isEmptyOrWhitespace(externalUrlTwo)\r\n );\r\n }, [externalTitleTwo, externalUrlTwo]);\r\n const useExternalLinks = React.useMemo(() => {\r\n return (\r\n allowToSwitchToOtherSites &&\r\n (hasExternalOne || hasExternalTwo) &&\r\n authenticatedUser?.IsActiveDirectory\r\n );\r\n }, [\r\n allowToSwitchToOtherSites,\r\n authenticatedUser?.IsActiveDirectory,\r\n hasExternalOne,\r\n hasExternalTwo,\r\n ]);\r\n const items: React.ReactNode[] = React.useMemo(() => {\r\n let actions: React.ReactNode[] = [];\r\n if (hasExternalOne && externalUrlOne !== null) {\r\n actions.push(\r\n \r\n {externalTitleOne}\r\n ,\r\n );\r\n }\r\n if (hasExternalTwo && externalUrlTwo !== null) {\r\n actions.push(\r\n \r\n {externalTitleTwo}\r\n ,\r\n );\r\n }\r\n return actions;\r\n }, [\r\n externalTitleOne,\r\n externalTitleTwo,\r\n externalUrlOne,\r\n externalUrlTwo,\r\n hasExternalOne,\r\n hasExternalTwo,\r\n ]);\r\n return useExternalLinks ? (\r\n items}\r\n iconButton={isMobile}\r\n menuProps={{\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n },\r\n transformOrigin: {\r\n vertical: 'top',\r\n horizontal: 'left',\r\n },\r\n getContentAnchorEl: null,\r\n }}\r\n >\r\n \r\n \r\n ) : null;\r\n}\r\n","/**\r\n *\r\n * ProfileMenu\r\n *\r\n */\r\nimport React from 'react';\r\nimport { EventsCount } from './EventsCount';\r\nimport { AssetQuickSearch } from 'app/components/AssetQuickSearch';\r\nimport { UserMenu } from './UserMenu';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport { ProfileSection } from '../styled';\r\nimport { SwitchSites } from './SwitchSites';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectShowGlobalServiceGroupFilter } from 'app/slice/selectors';\r\n\r\nexport const ProfileMenu = React.memo(function ProfileMenu() {\r\n const theme = useTheme();\r\n const showGroups = useSelector(selectShowGlobalServiceGroupFilter);\r\n return (\r\n \r\n {!showGroups && }\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
    */}\r\n
    \r\n );\r\n});\r\n","import { IconProp } from 'app/AllIcons';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport useExpandedSideBarState from 'app/hooks/useExpandedSideBarState';\r\n\r\nexport interface ToggleSideMenuButtonProps {\r\n icon?: IconProp;\r\n}\r\nexport function ToggleSideMenuButton(props: ToggleSideMenuButtonProps) {\r\n const { toggle } = useExpandedSideBarState();\r\n const { icon } = props;\r\n return (\r\n {\r\n toggle();\r\n }}\r\n >\r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * TopToolbar\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { ToolbarProps } from '@material-ui/core/Toolbar';\r\nimport { CustomerLogo } from '../../CustomerLogo';\r\nimport { ProfileMenu } from '../ProfileMenu';\r\nimport styled from 'styled-components';\r\nimport { StyledToolbar } from 'app/components/BasicTable/BasicFilter/TableToolbar/styled';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport { ToggleSideMenuButton } from '../components/ToggleSideMenuButton';\r\nimport clsx from 'clsx';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectIsExpandedSideBar } from 'app/slice/selectors';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n\r\nexport interface TopToolbarProps extends ToolbarProps {}\r\nconst Separator = styled('div')`\r\n flex-grow: 1;\r\n`;\r\nexport const TopToolbar = React.memo(function TopToolbar(\r\n props: TopToolbarProps,\r\n) {\r\n const isMobile = DetectIsMobile();\r\n\r\n const expanded = useSelector(state =>\r\n selectIsExpandedSideBar(state, isMobile),\r\n );\r\n\r\n const theme = useTheme();\r\n return (\r\n \r\n \r\n
    \r\n {/* \r\n \r\n */}\r\n {!expanded && }\r\n \r\n
    \r\n {/* acts as a separator between visually left and right components of the side bar */}\r\n \r\n \r\n \r\n
    \r\n );\r\n});\r\n","import { Badge, styled } from '@material-ui/core';\r\nimport { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Entity } from 'types/common';\r\n\r\nexport interface TopGroupButtonProps extends ButtonProps {\r\n savedServiceGroups: Entity[] | undefined;\r\n firstServiceGroupName: string | undefined;\r\n fullWidth?: boolean;\r\n}\r\n\r\nexport default function TopGroupButton(props: TopGroupButtonProps) {\r\n const {\r\n children,\r\n savedServiceGroups,\r\n firstServiceGroupName,\r\n fullWidth,\r\n ...other\r\n } = props;\r\n const { t } = useTranslation();\r\n return (\r\n \r\n {savedServiceGroups === undefined || savedServiceGroups.length === 0 ? (\r\n {t(translations.AllServiceGroups)}\r\n ) : savedServiceGroups.length === 1 ? (\r\n {firstServiceGroupName}\r\n ) : (\r\n 1\r\n ? `+${savedServiceGroups?.length - 1}`\r\n : undefined\r\n }\r\n >\r\n {firstServiceGroupName}\r\n \r\n )}\r\n \r\n );\r\n}\r\nconst TruncatedLabel = styled('span')({\r\n width: '10ch',\r\n display: 'inline-block',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n});\r\n","/**\r\n *\r\n * CoreDashboardMenu\r\n *\r\n */\r\nimport {\r\n Avatar,\r\n Box,\r\n LinearProgress,\r\n List,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemSecondaryAction,\r\n ListItemText,\r\n Paper,\r\n Popover,\r\n} from '@material-ui/core';\r\nimport { IServiceGroupDto } from 'api/odata/generated/entities/IServiceGroupDto';\r\nimport { AssetThumbImage } from 'app/components/AssetThumbImage';\r\nimport { Body } from 'app/components/Typography';\r\nimport { RouterLink } from 'app/components/BasicLinks/RouterLink';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { initFiltersServiceGroupsData } from 'app/components/pickers/MultiSelectPickers/ServiceGroupsPicker';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectShowGlobalServiceGroupsAsList,\r\n} from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Entity } from 'types/common';\r\nimport { useListStyles, useStyles } from '../styles';\r\nimport TopGroupButton from '../TopGroupButton';\r\nimport cliTruncate from 'cli-truncate';\r\nexport interface CoreDashboardMenuProps {}\r\n\r\nexport function CoreDashboardMenu(props: CoreDashboardMenuProps) {\r\n const [open, setOpen] = React.useState(false);\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const savedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const showGroups = useSelector(selectShowGlobalServiceGroupsAsList);\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const { checkIsMobile } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const history = useHistory();\r\n const classes = useStyles({\r\n isMobile,\r\n })();\r\n const ddlClasses = useListStyles({ isMobile })();\r\n const [selectedServiceGroups, setSelectedServiceGroups] = React.useState<\r\n Entity[]\r\n >(savedServiceGroups || []);\r\n const [\r\n availableServiceGroups,\r\n setAvailableServiceGroups,\r\n ] = useAsyncExtendedState[]>([]);\r\n const [availableLoading, setAvailableLoading] = React.useState<\r\n boolean | undefined\r\n >(undefined);\r\n const [show, setShow] = React.useState(false);\r\n React.useEffect(() => {\r\n setOpen(false);\r\n setSelectedServiceGroups(savedServiceGroups || []);\r\n }, [savedServiceGroups]);\r\n React.useEffect(() => {\r\n setShow(showGroups);\r\n }, [showGroups]);\r\n React.useEffect(() => {\r\n let active = availableLoading === undefined && open;\r\n if (active) {\r\n setAvailableLoading(true);\r\n initFiltersServiceGroupsData(`(CanRequestAccess eq false)`).then(data => {\r\n setAvailableServiceGroups(data);\r\n setAvailableLoading(false);\r\n });\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [availableLoading, open, setAvailableServiceGroups]);\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n setOpen(prev => !prev);\r\n };\r\n const handleSaveItemClick = (item: Entity) => {\r\n dispatch(actions.saveGlobalServiceGroupFilter([item]));\r\n setOpen(false);\r\n setAvailableServiceGroups([]);\r\n setAvailableLoading(undefined);\r\n history.push('/dashboards/core/' + item.Id);\r\n };\r\n\r\n const handleItemClick = (item: Entity) => {\r\n setSelectedServiceGroups([item]);\r\n //history.push('/dashboards/core/' + item.Id);\r\n // dispatch(actions.navigate({\r\n // search: '/dashboards/core/' + item.Id,\r\n // }));\r\n dispatch(actions.saveGlobalServiceGroupFilter_Success([item]));\r\n setOpen(false);\r\n setAvailableServiceGroups([]);\r\n setAvailableLoading(undefined);\r\n };\r\n\r\n const firstServiceGroupName = React.useMemo(() => {\r\n return selectedServiceGroups.length > 0\r\n ? selectedServiceGroups[0]?.Name\r\n : undefined;\r\n }, [selectedServiceGroups]);\r\n return show ? (\r\n \r\n 0\r\n ? 'primary'\r\n : 'black'\r\n }\r\n />\r\n }\r\n endIcon={}\r\n onClick={handleClick}\r\n />\r\n\r\n \r\n \r\n {\r\n setOpen(false);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(translations.Dashboard_ServiceGroupSelection) as string}\r\n \r\n \r\n\r\n \r\n {availableLoading && (\r\n \r\n \r\n \r\n )}\r\n \r\n {availableServiceGroups.length > 0 &&\r\n availableServiceGroups.map(item => (\r\n f.Id === item.Id) !==\r\n undefined\r\n }\r\n className={ddlClasses.root}\r\n // component={'a'}\r\n // href={buildURL(`${publicUrl}dashboards/core/${item.Id}`, {})}\r\n button\r\n onClick={() => handleItemClick(item)}\r\n >\r\n \r\n {(item as IServiceGroupDto).ImageName !== null ? (\r\n \r\n ) : (\r\n \r\n {'C'}\r\n \r\n )}\r\n \r\n \r\n {cliTruncate(item.Name, 16, { position: 'end' })}\r\n \r\n \r\n handleSaveItemClick(item)}\r\n >\r\n {\r\n t(\r\n translations.Dashboard_ServiceGroupSwith,\r\n ) as string\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 ) : null;\r\n}\r\n","import { makeStyles, Theme, createStyles } from '@material-ui/core';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport const useStyles = props =>\r\n makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n '&::-webkit-scrollbar': {\r\n width: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n },\r\n paper: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: theme.spacing(2),\r\n background: theme.palette.common.white,\r\n boxShadow: 'unset', //'0px 4px 20px rgba(39, 51, 65, 0.2)',\r\n borderRadius: theme.spacing(1),\r\n width: props.isMobile ? 'auto' : '360px',\r\n maxHeight: props.isMobile ? '100%' : '400px',\r\n },\r\n popoverPaper: {\r\n width: '100%',\r\n height: '100%',\r\n maxHeight: 'calc(100% - 32px)',\r\n maxWidth: 'calc(100% - 0px)',\r\n },\r\n mainContentAndScroll: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: theme.spacing(2.5),\r\n //borderRadius: theme.spacing(1),\r\n width: '100%',\r\n },\r\n mainContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: theme.spacing(1),\r\n gap: theme.spacing(1),\r\n width: '100%',\r\n },\r\n searchAndHeader: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(1),\r\n width: '100%',\r\n padding: '4px 8px',\r\n },\r\n controlButtons: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(2),\r\n width: '100%',\r\n },\r\n coresAndServices: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: theme.spacing(2, 1, 0),\r\n gap: theme.spacing(6),\r\n width: '100%',\r\n },\r\n coreCheks: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n flexWrap: 'wrap',\r\n boxSizing: 'border-box',\r\n // paddingBottom: '36px',\r\n width: '100%',\r\n },\r\n check: {\r\n flex: '1 1 49%',\r\n display: 'flex',\r\n gap: theme.spacing(2),\r\n },\r\n scrollPaddings: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: theme.spacing(1, 0),\r\n gap: theme.spacing(1.25),\r\n width: '13px',\r\n },\r\n scroll: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: '7px 3px 100px',\r\n gap: theme.spacing(1.25),\r\n background: theme.palette.common.white,\r\n boxShadow: 'inset 1px 0px 0px #E3E8EF',\r\n borderRadius: theme.spacing(0, 1, 1, 0),\r\n },\r\n }),\r\n );\r\nexport const useListStyles = props =>\r\n makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n fontSize: '14px',\r\n gap: 8,\r\n },\r\n listItemText: {\r\n [theme.breakpoints.up('sm')]: {\r\n display: 'flex',\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n overflow: 'hidden',\r\n },\r\n },\r\n primary: {\r\n [theme.breakpoints.up('sm')]: {\r\n flexGrow: 1,\r\n },\r\n display: 'inline-block',\r\n maxWidth: '100%',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n },\r\n avatar: {\r\n color: theme.palette.getContrastText(\r\n bookitColors.grayscale.grayBorders,\r\n ),\r\n backgroundColor: theme.palette.common.grayDividers,\r\n },\r\n secondary: {},\r\n }),\r\n );\r\n","import { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectShowGlobalServiceGroupFilter,\r\n selectShowGlobalServiceGroupsAsList,\r\n} from 'app/slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport * as React from 'react';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { CoreSelectionProps } from 'app/pages/CoreSelectionPage/CoreSelection';\r\nimport TopGroupButton from '../TopGroupButton';\r\nimport { Icon } from '../../BasicIcons/FontAwesome';\r\nimport { CoreDashboardMenu } from '../CoreDashboardButton';\r\nimport useExpandedSideBarState from 'app/hooks/useExpandedSideBarState';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n\r\nexport interface CoreSelectionButtonProps {}\r\nexport function CoreSelectionButton(props) {\r\n const dispatch = useDispatch();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const savedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const showGroups = useSelector(selectShowGlobalServiceGroupFilter);\r\n const showInlineGroups = useSelector(selectShowGlobalServiceGroupsAsList);\r\n\r\n const { expandLocal } = useExpandedSideBarState();\r\n const isMobile = DetectIsMobile();\r\n const [show, setShow] = React.useState(false);\r\n React.useEffect(() => {\r\n setShow(showGroups);\r\n }, [showGroups]);\r\n\r\n const handleClick = event => {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.CoreSelection,\r\n props: { useSidePanel: true } as CoreSelectionProps,\r\n expanded: !isMobile,\r\n }),\r\n );\r\n expandLocal(false);\r\n };\r\n\r\n const firstServiceGroupName = React.useMemo(() => {\r\n return savedServiceGroups !== undefined && savedServiceGroups?.length > 0\r\n ? savedServiceGroups[0]?.Name\r\n : undefined;\r\n }, [savedServiceGroups]);\r\n\r\n return show ? (\r\n 0\r\n ? 'primary'\r\n : 'black'\r\n }\r\n />\r\n }\r\n endIcon={}\r\n onClick={handleClick}\r\n />\r\n ) : showInlineGroups ? (\r\n \r\n ) : null;\r\n}\r\n","import { useTheme } from '@material-ui/core';\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { CoreSelectionButton } from 'app/components/GlobalServiceGroupFilter/CoreSelectionButton';\r\nimport { AssetQuickSearch } from 'app/components/AssetQuickSearch';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectGlobalServiceGroupFilter,\r\n selectIsSubBarCollapsed,\r\n selectShowGlobalServiceGroupFilter,\r\n} from 'app/slice/selectors';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { SubTopBar } from '../styled';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\n\r\nexport interface SubTopToolbarProps {}\r\n\r\nexport function SubTopToolbar(props: SubTopToolbarProps) {\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const { t } = useTranslation();\r\n const savedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const showGroups = useSelector(selectShowGlobalServiceGroupFilter);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const collapsedBar = useSelector(selectIsSubBarCollapsed);\r\n const serviceGroupsCount = React.useMemo(() => {\r\n return savedServiceGroups !== undefined && savedServiceGroups?.length > 1\r\n ? `+${savedServiceGroups?.length - 1}`\r\n : undefined;\r\n }, [savedServiceGroups]);\r\n const firstServiceGroupName = React.useMemo(() => {\r\n return savedServiceGroups !== undefined && savedServiceGroups?.length > 0\r\n ? savedServiceGroups[0]?.Name\r\n : undefined;\r\n }, [savedServiceGroups]);\r\n const singleCore = React.useMemo(() => {\r\n return savedServiceGroups !== undefined && savedServiceGroups?.length === 1;\r\n }, [savedServiceGroups]);\r\n\r\n const isAdminOfSingle = React.useMemo(() => {\r\n return (\r\n singleCore &&\r\n !!savedServiceGroups &&\r\n authenticatedUser?.HasAdminGroupPermissions(savedServiceGroups[0].Id)\r\n );\r\n }, [authenticatedUser, savedServiceGroups, singleCore]);\r\n\r\n const handleCollapse = React.useCallback(() => {\r\n dispatch(actions.collapseSubBar(!collapsedBar));\r\n }, [actions, collapsedBar, dispatch]);\r\n const theme = useTheme();\r\n\r\n return showGroups ? (\r\n \r\n {\r\n handleCollapse();\r\n }}\r\n shape=\"circle\"\r\n >\r\n \r\n {collapsedBar && !!firstServiceGroupName && (\r\n \r\n \r\n {`${firstServiceGroupName} ${serviceGroupsCount ?? ''}`}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n {isAdminOfSingle && !!savedServiceGroups && (\r\n }\r\n href={{\r\n search: { Edit: savedServiceGroups[0].Id },\r\n path: '/newGroup.aspx',\r\n }}\r\n target=\"_blank\"\r\n >\r\n {t(translations.OpenCore)}\r\n \r\n )}\r\n
    \r\n \r\n
    \r\n ) : null;\r\n}\r\n","/**\r\n *\r\n * TopBar\r\n *\r\n */\r\nimport { AppBarProps, useTheme } from '@material-ui/core';\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { TopToolbar } from './TopToolbar';\r\nimport { StyledTopBar } from './styled';\r\nimport { SIDE_PANEL_WIDTH } from 'styles/constantVariables';\r\n\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { SubTopToolbar } from './SubTopToolbar';\r\nexport interface StyleTopBarProps {\r\n isOpen: boolean;\r\n drawerWidth: number;\r\n sidePanelCollapsed?: boolean;\r\n}\r\nexport interface TopBarProps extends AppBarProps {\r\n isOpen: boolean;\r\n drawerWidth: number;\r\n sidePanelCollapsed?: boolean;\r\n}\r\n\r\nexport function TopBar(props: TopBarProps) {\r\n const { children, isOpen, drawerWidth, sidePanelCollapsed, ...rest } = props;\r\n const isMobile = DetectIsMobile();\r\n const theme = useTheme();\r\n return (\r\n <>\r\n \r\n \r\n {!isMobile && }\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { ListItem, ListItemProps } from '@material-ui/core';\r\nimport { LinkBehavior } from 'app/components/ExternalLink';\r\nimport { Link } from 'react-router-dom';\r\n\r\nexport interface MenuItemComponentProps\r\n extends Pick {\r\n link?: string | null; // because the InferProps props allows alows null value\r\n onClick: (event: React.MouseEvent, index: number) => void;\r\n external: boolean;\r\n selected: boolean;\r\n currentIndex: number;\r\n onKeyDown?: (event: React.KeyboardEvent, index: number) => void;\r\n onExternalClick?: (link: string) => void;\r\n}\r\nconst MenuItemComponent: React.FC = props => {\r\n const {\r\n className,\r\n link,\r\n onClick,\r\n children,\r\n external,\r\n selected,\r\n currentIndex: currentindex,\r\n onKeyDown,\r\n onExternalClick,\r\n ...other\r\n } = props;\r\n // If link is not set return the orinary ListItem\r\n if (!link || typeof link !== 'string') {\r\n return (\r\n onClick(event, currentindex)}\r\n onKeyDown={event => onKeyDown && onKeyDown(event, currentindex)}\r\n selected={selected}\r\n disableTouchRipple\r\n {...other}\r\n />\r\n );\r\n } else {\r\n if (external) {\r\n return (\r\n {\r\n if (!!onExternalClick) {\r\n onExternalClick(link);\r\n }\r\n onClick(event, currentindex);\r\n }}\r\n onKeyDown={event => onKeyDown && onKeyDown(event, currentindex)}\r\n component={!!onExternalClick ? 'button' : LinkBehavior}\r\n href={!!onExternalClick ? undefined : link}\r\n target={'_blank'}\r\n selected={selected}\r\n disableTouchRipple\r\n {...other}\r\n />\r\n );\r\n }\r\n return (\r\n onClick(event, currentindex)}\r\n onKeyDown={event => onKeyDown && onKeyDown(event, currentindex)}\r\n selected={selected}\r\n disableTouchRipple\r\n {...other}\r\n />\r\n );\r\n }\r\n\r\n // Return a LitItem with a link component\r\n};\r\n\r\nexport default MenuItemComponent;\r\n","import * as React from 'react';\r\nimport { SidebarMenuItemProps } from './MenuItem';\r\nimport { bindHover, bindMenu } from 'material-ui-popup-state';\r\nimport { Fade, ListItemIcon, makeStyles, MenuItem } from '@material-ui/core';\r\nimport PropTypes from 'prop-types';\r\nimport MenuItemComponent from './MenuItemComponent';\r\nimport {\r\n anchorRef,\r\n bindFocus,\r\n usePopupState,\r\n} from 'material-ui-popup-state/hooks';\r\nimport HoverMenu from 'material-ui-popup-state/HoverMenu';\r\nimport { LinkBehavior } from 'app/components/ExternalLink';\r\nimport { NavLink, NavLinkProps } from 'react-router-dom';\r\nimport { setTimeout } from 'timers';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { Icon as AwesomeIcon } from 'app/components/BasicIcons/FontAwesome';\r\n\r\nexport interface HoverSideMenuProps {\r\n items: SidebarMenuItemProps[];\r\n handleChildClick: (event, index) => void;\r\n handleClick: (event, index) => void;\r\n selected: boolean;\r\n id: string;\r\n name: string;\r\n Icon?: PropTypes.ReactElementLike | null;\r\n link?: string | null;\r\n external: boolean;\r\n onExternalClick?: (link: string) => void;\r\n index: number;\r\n}\r\nconst styles = makeStyles(theme => ({\r\n paper: {\r\n backgroundColor: theme.palette.primary.bgHover,\r\n borderRadius: 0,\r\n },\r\n list: {\r\n padding: 0,\r\n },\r\n childRoot: {\r\n '& > .menuItem': {\r\n minWidth: '200px',\r\n boxShadow: '0px 1px 0px 0px #e0e5ec',\r\n color: theme.palette.common.blackRegular,\r\n '&.active': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.common.white,\r\n },\r\n '&:focus': {\r\n textDecoration: 'underline',\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.common.white,\r\n },\r\n '&:hover': {\r\n textDecoration: 'underline',\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.common.white,\r\n },\r\n '& > .menuItemTextInset': {\r\n paddingLeft: theme.spacing(2),\r\n marginTop: 0,\r\n marginBottom: 0,\r\n '& > *': {\r\n fontSize: '13px',\r\n fontWeight: 700,\r\n },\r\n },\r\n },\r\n },\r\n focusVisible: {\r\n backgroundColor: theme.palette.common.grayDividers,\r\n '&::focus': {\r\n textDecoration: 'underline',\r\n },\r\n },\r\n menuItem: {\r\n '&::focus': {\r\n textDecoration: 'underline',\r\n },\r\n },\r\n}));\r\nexport const createMenuItemRefs = (items, rowInd) => {\r\n // obj\r\n let menuItemRefs = {};\r\n // loop each\r\n for (let i = 0; i < Object.keys(items).length; i++) {\r\n // When assign createRef, no current\r\n menuItemRefs[rowInd + i] = React.createRef();\r\n }\r\n return menuItemRefs;\r\n};\r\nexport const HoverSideMenu = React.forwardRef(\r\n function HoverSideMenu(props, ref) {\r\n const {\r\n items,\r\n selected,\r\n handleChildClick,\r\n id,\r\n name,\r\n Icon,\r\n link,\r\n handleClick,\r\n external,\r\n index,\r\n onExternalClick,\r\n } = props;\r\n const popupState = usePopupState({\r\n variant: 'popper',\r\n popupId: id,\r\n });\r\n const classes = styles();\r\n const [childActiveIndex, setChildActiveIndex] = React.useState(-1);\r\n const menuItemRefs = React.useRef(createMenuItemRefs(items, index));\r\n React.useEffect(() => {\r\n if (selected && childActiveIndex >= 0) {\r\n setTimeout(() => {\r\n menuItemRefs.current[index + childActiveIndex]?.focus();\r\n }, 0);\r\n }\r\n }, [childActiveIndex, selected, index]);\r\n const buttonIconKeyDown = (event, parentRowIndex) => {\r\n if (event.keyCode === 13) {\r\n // Enter pressed\r\n console.log('enter is pressed');\r\n setChildActiveIndex(0);\r\n } else if (event.keyCode === 9) {\r\n // tab away\r\n console.log('tab away');\r\n\r\n //handleClick(event, parentRowIndex + 1);\r\n setChildActiveIndex(-1);\r\n //setCurrRowInd('');\r\n } else if (event.keyCode === 40) {\r\n //test\r\n console.log('down arrow');\r\n\r\n // 38 is up arrow\r\n if (selected) {\r\n // No scrolling\r\n event.preventDefault();\r\n\r\n // set to 1st item in 0 index\r\n setChildActiveIndex(prev => {\r\n return prev !== items.length - 1 ? prev + 1 : 0;\r\n });\r\n }\r\n } else if (event.keyCode === 38) {\r\n //test\r\n console.log('up arrow');\r\n\r\n // 38 is up arrow\r\n if (selected) {\r\n // No scrolling\r\n event.preventDefault();\r\n\r\n // set to 1st item in 0 index\r\n setChildActiveIndex(prev => {\r\n return prev > 0 ? prev - 1 : items.length - 1;\r\n });\r\n }\r\n }\r\n };\r\n return (\r\n \r\n
    \r\n \r\n {/* Display an icon if any */}\r\n
    \r\n {!!Icon && (\r\n {Icon}\r\n )}\r\n {/* */}\r\n
    \r\n \r\n\r\n {items && items.length > 0 && (\r\n \r\n {/* */}\r\n \r\n \r\n {name}\r\n \r\n \r\n {items.map(\r\n (item, cindex) => {\r\n if (!item.link || typeof item.link !== 'string') {\r\n return (\r\n {\r\n console.log('child-div-click', event);\r\n handleChildClick(event, cindex);\r\n }}\r\n ref={element =>\r\n (menuItemRefs.current[index + cindex] = element)\r\n }\r\n >\r\n
    \r\n \r\n \r\n \r\n \r\n {item.name}\r\n \r\n
    \r\n {/* */}\r\n \r\n );\r\n } else {\r\n if (item.external) {\r\n return (\r\n {\r\n console.log('child-external-click', event);\r\n if (\r\n !!onExternalClick &&\r\n item.link !== null &&\r\n item.link !== undefined\r\n ) {\r\n onExternalClick(item.link);\r\n }\r\n handleChildClick(event, cindex);\r\n }}\r\n selected={selected && item.selected}\r\n component={!!onExternalClick ? 'li' : LinkBehavior}\r\n href={!!onExternalClick ? undefined : item.link}\r\n target={'_blank'}\r\n ref={element =>\r\n (menuItemRefs.current[index + cindex] = element)\r\n }\r\n >\r\n
    \r\n \r\n \r\n \r\n \r\n {item.name}\r\n \r\n
    \r\n {/* */}\r\n \r\n );\r\n } else {\r\n return (\r\n {\r\n console.log('child-react-click', event);\r\n handleChildClick(event, cindex);\r\n }}\r\n component={React.forwardRef(\r\n (props: NavLinkProps, ref: any) => (\r\n \r\n (menuItemRefs.current[\r\n index + cindex\r\n ] = element)\r\n }\r\n />\r\n ),\r\n )}\r\n focusVisibleClassName={classes.focusVisible}\r\n to={item.link}\r\n ref={element =>\r\n (menuItemRefs.current[index + cindex] = element)\r\n }\r\n >\r\n
    \r\n \r\n \r\n \r\n \r\n {item.name}\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","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport MenuItemComponent from './MenuItemComponent';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport List from '@material-ui/core/List';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport {\r\n selectAuthenticatedUser,\r\n selectIsExpandedSideBar,\r\n selectSiteMapProvider,\r\n selectSiteMapSettings,\r\n} from 'app/slice/selectors';\r\nimport { HoverSideMenu } from './HoverMenu';\r\nimport {\r\n AssetsSubTabUnionArray,\r\n MainTabsUnion,\r\n SiteMapProvider,\r\n} from 'types/SiteMapSettings';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { useLocation } from 'react-router-dom';\r\nimport useExpandedSideBarState from 'app/hooks/useExpandedSideBarState';\r\nimport { selectHasNotSavedChanges } from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n RowActionsMenu,\r\n RowActionsProps,\r\n} from 'app/components/BasicTable/RowActions';\r\nimport clsx from 'clsx';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { Icon as AwesomeIcon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Roles } from 'app/slice/types';\r\nimport { isInRole } from 'types/AuthenticatedUser';\r\n\r\nexport const MenuItemPropTypes = {\r\n name: PropTypes.string.isRequired,\r\n link: PropTypes.string,\r\n external: PropTypes.bool.isRequired,\r\n Icon: PropTypes.element,\r\n items: PropTypes.array,\r\n selected: PropTypes.bool.isRequired,\r\n indexChanged: PropTypes.func,\r\n index: PropTypes.number.isRequired,\r\n chIndex: PropTypes.number,\r\n onChange: PropTypes.func,\r\n closeOnClick: PropTypes.bool,\r\n};\r\ntype MenuItemPropTypesItems = PropTypes.InferProps;\r\ntype MenuItemPropTypesNoItems = Omit;\r\n\r\nexport type SidebarMenuItemProps = MenuItemPropTypesNoItems & {\r\n items?: SidebarMenuItemProps[];\r\n mainTab?: MainTabsUnion;\r\n groupTab?: number;\r\n hasAdminSettings?: boolean;\r\n};\r\nconst SidbarMenuItem = React.forwardRef(\r\n function SidbarMenuItem(props, ref) {\r\n const {\r\n name,\r\n link,\r\n external,\r\n Icon,\r\n items = [],\r\n selected,\r\n indexChanged,\r\n index,\r\n chIndex,\r\n mainTab,\r\n hasAdminSettings,\r\n closeOnClick,\r\n } = props;\r\n //const classes = useStyles();\r\n const isExpandable = items && items.length > 0;\r\n const isMobile = DetectIsMobile();\r\n const [open, setOpen] = React.useState(selected);\r\n const [isSelected, setSelected] = React.useState(selected);\r\n const [, setChildIndex] = React.useState(chIndex);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const siteMapProvider = useSelector(selectSiteMapProvider);\r\n const user = useSelector(selectAuthenticatedUser);\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const sidebarExpanded = useSelector(state =>\r\n selectIsExpandedSideBar(state, isMobile),\r\n );\r\n const { expandLocal } = useExpandedSideBarState();\r\n const siteMapSettings = useSelector(selectSiteMapSettings);\r\n const location = useLocation();\r\n const isAdmin =\r\n isInRole(user, Roles.Administrators) ||\r\n isInRole(user, Roles.GroupAdministrators);\r\n const [urlLink, setUrlLink] = React.useState(\r\n link,\r\n );\r\n // const handleSettingClick = React.useCallback(\r\n // (link: string) => {\r\n // dispatch(\r\n // actions.openAdminPanel({\r\n // url: link,\r\n // }),\r\n // );\r\n // },\r\n // [actions, dispatch],\r\n // );\r\n const adminSettings = React.useMemo(() => {\r\n let actions: RowActionsProps[] = [];\r\n if (!!mainTab && isAdmin && hasAdminSettings) {\r\n if (mainTab === 'Assets') {\r\n AssetsSubTabUnionArray.forEach(ar => {\r\n actions = [\r\n ...actions,\r\n ...siteMapProvider.adminSettingsActions(\r\n mainTab,\r\n user,\r\n ar,\r\n undefined, // handleSettingClick,\r\n ),\r\n ];\r\n });\r\n } else {\r\n if (mainTab === 'Budgets') {\r\n return siteMapProvider.adminSettingsActions(\r\n mainTab,\r\n user,\r\n 'BudgetTabSetting',\r\n undefined, // handleSettingClick,\r\n );\r\n }\r\n return siteMapProvider.adminSettingsActions(\r\n mainTab,\r\n user,\r\n undefined,\r\n undefined, // handleSettingClick,\r\n );\r\n }\r\n }\r\n return actions;\r\n }, [hasAdminSettings, isAdmin, mainTab, siteMapProvider, user]);\r\n React.useEffect(() => {\r\n let active =\r\n !isNullOrUndefined(siteMapSettings) && link === location?.pathname;\r\n if (active) {\r\n let siteMapProvider = new SiteMapProvider(siteMapSettings);\r\n let node = siteMapProvider.findNode(\r\n location?.pathname || window.location.pathname,\r\n );\r\n\r\n setUrlLink(() => {\r\n if (node !== undefined) {\r\n const reactUrl = node.reactUrl;\r\n if (reactUrl !== undefined && reactUrl !== null) {\r\n const elementPath = reactUrl.split('?')[0] ?? reactUrl;\r\n if (elementPath === location.pathname) {\r\n return reactUrl;\r\n } else {\r\n return link;\r\n }\r\n } else {\r\n return link;\r\n }\r\n } else {\r\n return link;\r\n }\r\n });\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [link, location.pathname, siteMapSettings]);\r\n function handleClick(event, index) {\r\n if (\r\n !!event.target &&\r\n !!event.target.parentNode &&\r\n 'className' in event.target.parentNode &&\r\n event.target.parentNode.className !== undefined &&\r\n event.target.parentNode.className !== null &&\r\n event.target.parentNode.className !== '' &&\r\n typeof event.target.parentNode.className === 'string' &&\r\n event.target.parentNode.className.indexOf('MuiPopover') > -1\r\n ) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n } else {\r\n if (\r\n hasChanges &&\r\n (props.items === undefined || props.items.length < 1)\r\n ) {\r\n dispatch(\r\n actions.setContinueToLink(\r\n props.link === null || props.link === undefined\r\n ? location.pathname\r\n : props.link,\r\n ),\r\n );\r\n dispatch(actions.setConfirmOpen(true));\r\n event.preventDefault();\r\n } else {\r\n setOpen(!open);\r\n if (props.index !== index) {\r\n setSelected(!isSelected);\r\n } else {\r\n if (props.items !== undefined && props.items?.length > 0) {\r\n setSelected(!selected);\r\n }\r\n }\r\n if (indexChanged !== undefined && indexChanged !== null) {\r\n indexChanged(event, index);\r\n }\r\n }\r\n if (isMobile && closeOnClick) {\r\n expandLocal(false);\r\n }\r\n }\r\n }\r\n const handleChildClick = (event, index) => {\r\n if (hasChanges) {\r\n dispatch(\r\n actions.setContinueToLink(\r\n props.link === null || props.link === undefined\r\n ? location.pathname\r\n : props.link,\r\n ),\r\n );\r\n dispatch(actions.setConfirmOpen(true));\r\n event.preventDefault();\r\n } else {\r\n if (isMobile) {\r\n expandLocal(false);\r\n }\r\n setChildIndex(prev => {\r\n if (props.chIndex !== index) {\r\n return index;\r\n }\r\n });\r\n setChildIndex(index);\r\n }\r\n };\r\n\r\n const parentId = `menuitem-${index}`;\r\n return !sidebarExpanded ? ( //isExpandable &&\r\n \r\n ) : (\r\n <>\r\n \r\n {/* Display an icon if any */}\r\n
    \r\n {!!Icon && (\r\n {Icon}\r\n )}\r\n {/* */}\r\n \r\n {name}\r\n \r\n
    \r\n {!!mainTab &&\r\n hasAdminSettings &&\r\n !isMobile &&\r\n adminSettings.length > 0 && (\r\n // \r\n\r\n // \r\n {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }}\r\n items={adminSettings}\r\n // items={settingItems.map(row => {\r\n // return {\r\n // //href: row.link,\r\n // text: row.name,\r\n // icon: 'circle-small',\r\n // onClick: () => handleSettingClick(row.link ?? ''),\r\n // } as RowActionsProps;\r\n // })}\r\n />\r\n )}\r\n {isExpandable && (\r\n \r\n )}\r\n \r\n\r\n {/* Display the expand menu if the item has children */}\r\n {isExpandable && (open || isSelected) && selected && (\r\n \r\n {items.map((item, chIndex) => (\r\n \r\n ))}\r\n \r\n )}\r\n \r\n );\r\n },\r\n);\r\n\r\nexport default SidbarMenuItem;\r\n","import { css } from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\n\r\nexport const verticalScrolling = css`\r\n &::-webkit-scrollbar {\r\n width: 4px;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n box-shadow: inset 0 0 2px ${bookitColors.grayscale.grayBorders};\r\n border-radius: 16px;\r\n background-color: ${bookitColors.grayscale.grayBorders};\r\n }\r\n`;\r\n","import { List } from '@material-ui/core';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Roles } from 'app/slice/types';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useLocation } from 'react-router-dom';\r\n// import styled from 'styled-components';\r\n// import { verticalScrolling } from 'styles/CssVariables/styledVariables';\r\nimport { AuthenticatedUser, isInRole } from 'types/AuthenticatedUser';\r\nimport {\r\n MainTabsUnion,\r\n SiteMapNode,\r\n SiteMapProvider,\r\n} from 'types/SiteMapSettings';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { createMenuItemRefs } from './HoverMenu';\r\nimport SidbarMenuItem, { SidebarMenuItemProps } from './MenuItem';\r\nimport clsx from 'clsx';\r\nimport { groupBy, values } from 'lodash';\r\nimport styled from 'styled-components';\r\nimport { verticalScrolling } from 'styles/CssVariables/styledVariables';\r\nimport { selectRouterPathname } from 'app/slice/router-selectors';\r\n\r\nexport interface SideBarMenuItemProps {\r\n menuItems: SiteMapNode[];\r\n currentIndex?: number;\r\n currentNode?: SiteMapNode | undefined;\r\n isOpen: boolean;\r\n loading: boolean;\r\n isMobile?: boolean;\r\n}\r\nconst NavWrapper = styled('div')`\r\n height: calc(100% - 50px);\r\n overflow-y: auto;\r\n width: 100%;\r\n overflow-x: hidden;\r\n ${verticalScrolling}\r\n`;\r\nconst MainMenuItem = styled('div')`\r\n &.mainMenuItem {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n &.mainMenuItemExpanded {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n }\r\n &.mainMenuItemCollapsed {\r\n align-items: center;\r\n }\r\n }\r\n`;\r\nconst replaceIcon = (icon: string): IconProp => {\r\n if (icon.indexOf(' fa-') !== -1) {\r\n let tmpIcon = icon.substring(icon.indexOf(' fa-') + 4, icon.length);\r\n return tmpIcon as IconProp;\r\n }\r\n return icon as IconProp;\r\n};\r\nconst convertUrl = (url: string): string => {\r\n if (url !== null) {\r\n if (url.indexOf(process.env.PUBLIC_URL) !== -1) {\r\n return url.replace(process.env.PUBLIC_URL, '');\r\n }\r\n return url;\r\n }\r\n return url;\r\n};\r\nexport const getAdminNodeSettings = (\r\n item: SiteMapNode,\r\n siteMapProvider: SiteMapProvider,\r\n user?: AuthenticatedUser,\r\n): SidebarMenuItemProps[] => {\r\n let result: SidebarMenuItemProps[] = [];\r\n const isAdmin =\r\n isInRole(user, Roles.Administrators) ||\r\n isInRole(user, Roles.GroupAdministrators) ||\r\n isInRole(user, Roles.EquipmentAdministrator);\r\n if (\r\n isAdmin &&\r\n item.ChildNodes.length > 0 &&\r\n !!item.MainTab &&\r\n item.ChildNodes.some(f => f.IsAdminSettings)\r\n ) {\r\n let filtered = item.ChildNodes.filter(\r\n f => f.IsAdminSettings && siteMapProvider.nodeAccesibleByRole(f, user),\r\n ).map((it, index) => {\r\n return {\r\n name: it.Title,\r\n link: it.reactUrl ?? convertUrl(it.Url),\r\n Icon: isNullOrUndefined(it.icon) ? undefined : (\r\n \r\n ),\r\n items: [] as SidebarMenuItemProps[],\r\n external: isNullOrUndefined(it.reactUrl),\r\n index: index,\r\n selected: false,\r\n } as SidebarMenuItemProps;\r\n });\r\n return filtered;\r\n }\r\n return result;\r\n};\r\n\r\nexport function SideBarMenu(props: SideBarMenuItemProps) {\r\n // const classes = useStyles({ isOpen: props.isOpen });\r\n const location = useLocation();\r\n const routerPathName = useSelector(selectRouterPathname);\r\n const { menuItems, currentIndex, currentNode, isOpen, isMobile } = props;\r\n const [selectedIndex, setSelectedIndex] = React.useState(currentIndex || -1);\r\n // const [mapItems, setMapItems] = React.useState([]);\r\n const mapItems = React.useMemo(() => {\r\n return menuItems.map((item, index) => {\r\n const link: string | null | undefined =\r\n item.ChildNodes.filter(\r\n ch => ch.HideReact === false && ch.Hide === false,\r\n ).length > 0\r\n ? item.LinkWithChildren ?? null\r\n : item.reactUrl ?? convertUrl(item.Url);\r\n return {\r\n name: item.Title,\r\n link: link,\r\n Icon: isNullOrUndefined(item.icon) ? undefined : (\r\n \r\n ),\r\n items:\r\n item.ChildNodes.filter(\r\n ch => ch.HideReact === false && ch.Hide === false,\r\n ).length > 0\r\n ? item.ChildNodes.filter(citem => {\r\n // filter to exclude '/usertraininghistory' url from sidebar\r\n return citem.HideReact === false && citem.Hide === false;\r\n }).map((chItem, chIndex) => {\r\n return {\r\n name: chItem.Title,\r\n link: chItem.reactUrl ?? convertUrl(chItem.Url),\r\n Icon: isNullOrUndefined(chItem.icon) ? undefined : (\r\n \r\n ),\r\n items: [] as SidebarMenuItemProps[],\r\n external: isNullOrUndefined(chItem.reactUrl),\r\n index: chIndex,\r\n selected:\r\n location.pathname\r\n .toLowerCase()\r\n .indexOf(\r\n (chItem.reactUrl ?? chItem.Url).toLowerCase(),\r\n ) !== -1 ||\r\n (!!routerPathName &&\r\n routerPathName\r\n .toLowerCase()\r\n .indexOf(\r\n (chItem.reactUrl ?? chItem.Url).toLowerCase(),\r\n ) !== -1),\r\n };\r\n })\r\n : ([] as SidebarMenuItemProps[]),\r\n hasAdminSettings: item.ChildNodes.some(f => f.IsAdminSettings === true),\r\n mainTab: !!item.MainTab ? (item.MainTab as MainTabsUnion) : undefined,\r\n groupTab: item.GroupTab,\r\n external:\r\n link?.includes('aspx') ||\r\n (isNullOrUndefined(item.reactUrl) &&\r\n item.ChildNodes.filter(\r\n ch => ch.HideReact === false && ch.Hide === false,\r\n ).length === 0),\r\n index: index,\r\n selected:\r\n currentNode === undefined\r\n ? false\r\n : selectedIndex === -1\r\n ? currentNode.Key === item.Key\r\n : selectedIndex === index,\r\n closeOnClick:\r\n !isNullOrUndefined(item.LinkWithChildren) ||\r\n item.ChildNodes.filter(\r\n ch => ch.HideReact === false && ch.Hide === false,\r\n ).length < 1,\r\n };\r\n });\r\n }, [\r\n currentNode,\r\n location.pathname,\r\n menuItems,\r\n routerPathName,\r\n selectedIndex,\r\n ]);\r\n // const isAdmin =\r\n // isInRole(authenticatedUser, Roles.Administrators) ||\r\n // isInRole(authenticatedUser, Roles.GroupAdministrators) ||\r\n // isInRole(authenticatedUser, Roles.EquipmentAdministrator);\r\n const handleListItemClick = (event, index) => {\r\n setSelectedIndex(index);\r\n };\r\n React.useEffect(() => {\r\n if (!!currentNode) {\r\n const idx = menuItems.findIndex(f => f.Key === currentNode.Key);\r\n if (idx !== -1) {\r\n setSelectedIndex(idx);\r\n }\r\n }\r\n }, [currentNode, menuItems]);\r\n // React.useEffect(() => {\r\n // setMapItems(\r\n // menuItems.map((item, index) => {\r\n // const link: string | null | undefined =\r\n // item.ChildNodes.filter(\r\n // ch => ch.HideReact === false && ch.Hide === false,\r\n // ).length > 0\r\n // ? item.LinkWithChildren ?? null\r\n // : item.reactUrl ?? convertUrl(item.Url);\r\n // return {\r\n // name: item.Title,\r\n // link: link,\r\n // Icon: isNullOrUndefined(item.icon) ? undefined : (\r\n // \r\n // ),\r\n // items:\r\n // item.ChildNodes.filter(\r\n // ch => ch.HideReact === false && ch.Hide === false,\r\n // ).length > 0\r\n // ? item.ChildNodes.filter(citem => {\r\n // // filter to exclude '/usertraininghistory' url from sidebar\r\n // return citem.HideReact === false && citem.Hide === false;\r\n // }).map((chItem, chIndex) => {\r\n // return {\r\n // name: chItem.Title,\r\n // link: chItem.reactUrl ?? convertUrl(chItem.Url),\r\n // Icon: isNullOrUndefined(chItem.icon) ? undefined : (\r\n // \r\n // ),\r\n // items: [] as SidebarMenuItemProps[],\r\n // external: isNullOrUndefined(chItem.reactUrl),\r\n // index: chIndex,\r\n // selected:\r\n // location.pathname\r\n // .toLowerCase()\r\n // .indexOf(\r\n // (chItem.reactUrl ?? chItem.Url).toLowerCase(),\r\n // ) !== -1 ||\r\n // (!!routerPathName &&\r\n // routerPathName\r\n // .toLowerCase()\r\n // .indexOf(\r\n // (chItem.reactUrl ?? chItem.Url).toLowerCase(),\r\n // ) !== -1),\r\n // };\r\n // })\r\n // : ([] as SidebarMenuItemProps[]),\r\n // hasAdminSettings: item.ChildNodes.some(\r\n // f => f.IsAdminSettings === true,\r\n // ),\r\n // mainTab: !!item.MainTab ? (item.MainTab as MainTabsUnion) : undefined,\r\n // groupTab: item.GroupTab,\r\n // external:\r\n // link?.includes('aspx') ||\r\n // (isNullOrUndefined(item.reactUrl) &&\r\n // item.ChildNodes.filter(\r\n // ch => ch.HideReact === false && ch.Hide === false,\r\n // ).length === 0),\r\n // index: index,\r\n // selected:\r\n // currentNode === undefined\r\n // ? false\r\n // : selectedIndex === -1\r\n // ? currentNode.Key === item.Key\r\n // : selectedIndex === index,\r\n // closeOnClick:\r\n // !isNullOrUndefined(item.LinkWithChildren) ||\r\n // item.ChildNodes.filter(\r\n // ch => ch.HideReact === false && ch.Hide === false,\r\n // ).length < 1,\r\n // };\r\n // }),\r\n // );\r\n // }, [\r\n // authenticatedUser,\r\n // location.pathname,\r\n // menuItems,\r\n // currentNode,\r\n // selectedIndex,\r\n // siteMapProvider,\r\n // routerPathName,\r\n // ]);\r\n const menuItemRefs = React.useRef(\r\n createMenuItemRefs(menuItems, currentIndex ?? 0),\r\n );\r\n return (\r\n \r\n \r\n {values(groupBy(mapItems, f => f.groupTab)).map((f, key) => {\r\n return (\r\n
    \r\n {f.map((item, index) => (\r\n \r\n \r\n (menuItemRefs.current[item.index] = element)\r\n }\r\n indexChanged={handleListItemClick}\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 * BookitlabLogo\r\n *\r\n */\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { messages } from './messages';\r\n\r\nexport interface BookitlabShortLogoProps {}\r\n\r\nexport const BookitlabShortLogo = React.memo(function BookitlabShortLogo(\r\n props: BookitlabShortLogoProps,\r\n) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n\r\n return (\r\n \r\n {t(messages.bookitlab())}\r\n \r\n \r\n );\r\n});\r\n","import { useAssetQuickSearchSlice } from 'app/components/AssetQuickSearch/slice';\r\nimport { selectShowSearchInSidebar } from 'app/components/AssetQuickSearch/slice/selectors';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { EventsCount } from '../../TopBar/ProfileMenu/EventsCount';\r\nimport { SwitchSites } from '../../TopBar/ProfileMenu/SwitchSites';\r\nimport { UserMenu } from '../../TopBar/ProfileMenu/UserMenu';\r\nimport React from 'react';\r\n\r\nexport interface UserProfileMobileProps {}\r\nexport function UserProfileMobile(props: UserProfileMobileProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions: assetSearchActions } = useAssetQuickSearchSlice();\r\n const showSearchInSidebar = useSelector(selectShowSearchInSidebar);\r\n return (\r\n \r\n {\r\n dispatch(assetSearchActions.showSearchInput(!showSearchInSidebar));\r\n }}\r\n title={t(translations.SearchAssets)}\r\n shape=\"square\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { BookitlabLogo } from 'app/components/BookitlabLogo';\r\nimport { BookitlabShortLogo } from 'app/components/BookitlabLogo/BookitlabShortLogo';\r\nimport { selectMinimizedBookitlabLogo } from 'app/slice/selectors';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { CustomerLogo } from '../../CustomerLogo';\r\nimport clsx from 'clsx';\r\nimport { ToggleSideMenuButton } from '../../TopBar/components/ToggleSideMenuButton';\r\nimport { UserProfileMobile } from '../UserProfileMobile';\r\n\r\nexport interface SideBarHeaderProps {\r\n children?: React.ReactNode;\r\n isOpen: boolean;\r\n}\r\n\r\nexport const SideBarHeader = React.memo(function SideBarHeader(\r\n props: SideBarHeaderProps,\r\n) {\r\n const { children, isOpen } = props;\r\n const isMobile = DetectIsMobile();\r\n const logoMinimized = useSelector(selectMinimizedBookitlabLogo);\r\n return (\r\n \r\n \r\n {isMobile ? (\r\n \r\n ) : isOpen && !logoMinimized ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {isMobile && isOpen && }\r\n\r\n {/* {isMobile && isOpen && showSearchInSidebar && (\r\n \r\n \r\n \r\n )} */}\r\n {/* {isMobile && isOpen && (\r\n \r\n \r\n \r\n )} */}\r\n {isOpen && !isMobile && }\r\n \r\n {children}\r\n \r\n \r\n );\r\n});\r\n","import { makeStyles, Theme } from '@material-ui/core/styles';\r\n\r\nexport const useStyles = makeStyles(\r\n (theme: Theme) => ({\r\n root: {\r\n backgroundColor: theme.palette.background.default,\r\n padding: 0,\r\n marginTop: 40,\r\n '& .Mui-selected': {\r\n backgroundColor: theme.palette.primary.bgHover,\r\n '& > .menuItemContent': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.background.paper,\r\n '& svg': {\r\n color: theme.palette.background.paper,\r\n },\r\n },\r\n },\r\n '& .Mui-selected:hover': {\r\n backgroundColor: theme.palette.primary.bgHover,\r\n '& > .menuItemContent': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.background.paper,\r\n '& svg': {\r\n color: theme.palette.background.paper,\r\n },\r\n },\r\n },\r\n '& > .menuItem': {\r\n padding: 0,\r\n '& > .menuItemContent': {\r\n display: 'flex',\r\n width: '100%',\r\n position: 'relative',\r\n boxSizing: 'border-box',\r\n textAlign: 'left',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n textDecoration: 'none',\r\n padding: '6px 8px 6px 26px',\r\n fontWeight: '900', //theme.typography.fontWeightBold,\r\n color: theme.palette.common.graySubtitle,\r\n textTransform: 'uppercase',\r\n backgroundColor: theme.palette.background.default,\r\n gap: 16,\r\n marginBottom: '8px',\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.common.white,\r\n '& > .menuItemIcon': {\r\n color: theme.palette.common.white,\r\n },\r\n },\r\n '& *': {\r\n fontWeight: '900', //theme.typography.fontWeightBold,\r\n whiteSpace: props => (props.isOpen ? 'initial' : 'inherit'),\r\n },\r\n '& > .menuItemIcon': {\r\n color: theme.palette.common.grayComponents,\r\n minWidth: props => (props.isOpen ? 'initial' : '48px'),\r\n '& > svg': {\r\n width: '19px',\r\n },\r\n },\r\n '& > .menuItemText': {\r\n margin: 0,\r\n '& > *': {\r\n fontSize: '13px',\r\n },\r\n },\r\n '& > .menuItemTextInset': {\r\n paddingLeft: 0,\r\n },\r\n },\r\n },\r\n '& > .hoverItem': {\r\n marginBottom: '8px',\r\n '& .Mui-selected': {\r\n backgroundColor: theme.palette.primary.bgHover,\r\n '& > .menuItemHoverContent': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.background.paper,\r\n '& svg': {\r\n color: theme.palette.background.paper,\r\n },\r\n },\r\n },\r\n '& .Mui-selected:hover': {\r\n backgroundColor: theme.palette.primary.bgHover,\r\n '& > .menuItemHoverContent': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.background.paper,\r\n '& svg': {\r\n color: theme.palette.background.paper,\r\n },\r\n },\r\n },\r\n '& > .menuItem': {\r\n padding: 0,\r\n '& > .menuItemHoverContent': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontWeight: '900', //theme.typography.fontWeightBold,\r\n color: theme.palette.common.graySubtitle,\r\n textTransform: 'uppercase',\r\n paddingLeft: 16,\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.common.white,\r\n '& > .menuItemIcon': {\r\n color: theme.palette.common.white,\r\n },\r\n },\r\n '&:focus': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.common.white,\r\n '& > .menuItemIcon': {\r\n color: theme.palette.common.white,\r\n },\r\n },\r\n '& *': {\r\n fontWeight: '900', //theme.typography.fontWeightBold,\r\n whiteSpace: props => (props.isOpen ? 'initial' : 'inherit'),\r\n },\r\n '& > .menuItemIcon': {\r\n color: theme.palette.common.grayComponents,\r\n minWidth: props => (props.isOpen ? '32px' : '48px'),\r\n '& > svg': {\r\n width: '1.5em',\r\n },\r\n },\r\n '& > .menuItemText': {\r\n '& > *': {\r\n fontSize: '13px',\r\n },\r\n },\r\n '& > .menuItemTextInset': {\r\n paddingLeft: 0,\r\n },\r\n },\r\n },\r\n },\r\n '& .childRoot': {\r\n padding: '12px 0px 12px 0',\r\n backgroundColor: theme.palette.primary.bgHover,\r\n '& .Mui-selected': {\r\n '& > .menuItemContent': {\r\n backgroundColor: theme.palette.primary.bgHover,\r\n color: theme.palette.primary.main,\r\n },\r\n },\r\n '& .Mui-selected:hover': {\r\n '& > .menuItemContent': {\r\n color: theme.palette.primary.main,\r\n backgroundColor: theme.palette.primary.bgHover,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.bgHover,\r\n color: theme.palette.primary.main,\r\n },\r\n '&>.active': {\r\n '& > .menuItemContent': {\r\n color: theme.palette.primary.main,\r\n backgroundColor: theme.palette.primary.bgHover,\r\n },\r\n },\r\n '& > .menuItem': {\r\n padding: 0,\r\n paddingLeft: '26px',\r\n '& > .menuItemContent': {\r\n display: 'flex',\r\n width: '100%',\r\n position: 'relative',\r\n boxSizing: 'border-box',\r\n textAlign: 'left',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n textDecoration: 'none',\r\n color: theme.palette.common.blackRegular,\r\n '&.active': {\r\n color: theme.palette.primary.main,\r\n },\r\n '& > .menuItemTextInset': {\r\n paddingLeft: props => (props.isOpen ? '0px' : '40px'),\r\n paddingBlock: '6px',\r\n margin: 0,\r\n },\r\n '& *': {\r\n fontWeight: '900', //theme.typography.fontWeightBold,\r\n fontSize: '13px',\r\n },\r\n '&:hover': {\r\n color: theme.palette.primary.main,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n selected: {},\r\n sideBarHeader: {\r\n minHeight: '48px',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: props => (props.isOpen ? '0px 16px' : '0px 8px'),\r\n gap: 16,\r\n },\r\n sideBarFooter: {\r\n minHeight: '48px',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '0px 16px',\r\n fontSize: '12px',\r\n gap: 16,\r\n },\r\n }),\r\n);\r\n","import { Box, Divider } from '@material-ui/core';\r\nimport { BookitlabShortLogo } from 'app/components/BookitlabLogo/BookitlabShortLogo';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { selectWebVersion } from 'app/slice/selectors';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { useStyles } from '../styles';\r\n\r\nexport interface SideBarFooterProps {\r\n isOpen?: boolean;\r\n}\r\n\r\nexport const SideBarFooter = React.memo(function SideBarFooter(\r\n props: SideBarFooterProps,\r\n) {\r\n const classes = useStyles({ isOpen: props.isOpen ?? false });\r\n const { t } = useTranslation();\r\n const webVersion = useSelector(selectWebVersion);\r\n return (\r\n \r\n \r\n
    \r\n \r\n {`V: ${webVersion} `}\r\n \r\n \r\n {t(translations.TermsOfUse)}\r\n \r\n \r\n
    \r\n
    \r\n );\r\n});\r\n","import { AddReservation } from 'app/pages/Actions/PageTopActions/AddReservation';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { CoreSelectionButton } from 'app/components/GlobalServiceGroupFilter/CoreSelectionButton';\r\nimport clsx from 'clsx';\r\nimport { AssetQuickSearch } from 'app/components/AssetQuickSearch';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectShowSearchInSidebar } from 'app/components/AssetQuickSearch/slice/selectors';\r\nimport * as React from 'react';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectGlobalSetting,\r\n selectShowGlobalServiceGroupFilter,\r\n} from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { toEntityEnumArray } from 'utils/enumKeys';\r\nimport { SideBarQuickActionsEnum } from 'enums/enums';\r\nimport { NewWorkOrderButton } from 'app/pages/WorkOrdersPage/Actions/NewWorkOrder';\r\nimport { useAsyncGetWthEffect } from 'app/hooks/useAsyncGetOnMount';\r\nimport { IServiceGroupDto } from 'api/odata/generated/entities/IServiceGroupDto';\r\nimport { quoteODataValue } from 'api/odata/ODataFilter';\r\nimport { httpClient } from 'api/HttpClient';\r\n\r\nexport interface SideBarQuickActionProps {\r\n isOpen?: boolean;\r\n isMobile?: boolean;\r\n}\r\n\r\nexport function SideBarQuickAction(props: SideBarQuickActionProps) {\r\n const { isOpen, isMobile } = props;\r\n const { t } = useTranslation();\r\n const showSearchInSidebar = useSelector(selectShowSearchInSidebar);\r\n const savedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const showGroups = useSelector(selectShowGlobalServiceGroupFilter);\r\n const actionOptions = toEntityEnumArray(SideBarQuickActionsEnum, t);\r\n const fetchCoreQuickAction = (\r\n serviceGroupId: number | undefined,\r\n ): Promise => {\r\n return new Promise((resolve, reject) => {\r\n if (!serviceGroupId) {\r\n resolve(undefined);\r\n } else {\r\n (async () => {\r\n try {\r\n const url =\r\n '/api/odata/v4/servicegroups/GetGlobalServiceGroupsFilter';\r\n const params = {\r\n $select: 'Id,Name,SidebarQuickAction',\r\n $filter: `Id eq ${quoteODataValue(serviceGroupId)}`,\r\n };\r\n\r\n let groups = await httpClient\r\n .get(url, params)\r\n .then(response => response.value as IServiceGroupDto[]);\r\n resolve(groups[0]);\r\n } catch {\r\n resolve(undefined);\r\n }\r\n })();\r\n }\r\n });\r\n };\r\n const defaultSystemAction = useSelector(state =>\r\n selectGlobalSetting(state, AllowedSettings.SideBarQuickActions),\r\n );\r\n const systemAction = React.useMemo(() => {\r\n if (defaultSystemAction === 'NA') {\r\n return undefined;\r\n }\r\n return actionOptions.some(f => f.OriginalName === defaultSystemAction)\r\n ? actionOptions.filter(f => f.OriginalName === defaultSystemAction)[0].Id\r\n : 1;\r\n }, [actionOptions, defaultSystemAction]);\r\n\r\n const serviceGroup = React.useMemo(() => {\r\n return showGroups && !!savedServiceGroups && savedServiceGroups.length === 1\r\n ? savedServiceGroups[0]\r\n : undefined;\r\n }, [savedServiceGroups, showGroups]);\r\n\r\n const coreSelected = useAsyncGetWthEffect(\r\n () => fetchCoreQuickAction(serviceGroup?.Id),\r\n undefined,\r\n [serviceGroup],\r\n );\r\n\r\n const baseAction = React.useMemo(() => {\r\n return !!coreSelected &&\r\n coreSelected.SidebarQuickAction !== null &&\r\n coreSelected.SidebarQuickAction !== undefined &&\r\n coreSelected.SidebarQuickAction > 0\r\n ? coreSelected.SidebarQuickAction\r\n : !!systemAction\r\n ? systemAction\r\n : undefined;\r\n }, [coreSelected, systemAction]);\r\n return (\r\n \r\n {isMobile && isOpen && showSearchInSidebar && (\r\n \r\n )}\r\n {isMobile && }\r\n {!!baseAction && (\r\n \r\n {baseAction === 1 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * SideBar\r\n *\r\n */\r\nimport * as React from 'react';\r\n\r\nimport { useSelector } from 'react-redux';\r\nimport { selectSiteMapSettings } from 'app/slice/selectors';\r\nimport { SideBarMenu } from './SideBarMenu';\r\nimport { SideBarHeader } from './SideBarHeader';\r\nimport { SiteMapNode, SiteMapProvider } from 'types/SiteMapSettings';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { SideBarFooter } from './SideBarFooter';\r\nimport { SideBarQuickAction } from './SideBarQuickAction';\r\nimport { selectRouterPathname } from 'app/slice/router-selectors';\r\ninterface Props {\r\n isOpen: boolean;\r\n isMobile?: boolean;\r\n}\r\n\r\nconst SideBarComponent = (props: Props) => {\r\n const { isOpen, isMobile } = props;\r\n const siteMapSettings = useSelector(selectSiteMapSettings);\r\n const [currentNode, setCurrentNode] = React.useState(\r\n undefined,\r\n );\r\n const routerPathName = useSelector(selectRouterPathname);\r\n const location = useLocation();\r\n const [currentNodes, setCurrentNodes] = React.useState([]);\r\n const loading = isNullOrUndefined(siteMapSettings);\r\n React.useEffect(() => {\r\n setCurrentNode(() =>\r\n new SiteMapProvider(siteMapSettings).getCurrentMainNode(\r\n location?.pathname || routerPathName || window.location.pathname,\r\n ),\r\n );\r\n }, [location?.pathname, routerPathName, siteMapSettings]);\r\n React.useEffect(() => {\r\n let active = !isNullOrUndefined(siteMapSettings);\r\n if (currentNodes.length > 0) {\r\n return undefined;\r\n }\r\n if (active) {\r\n let siteMapProvider = new SiteMapProvider(siteMapSettings);\r\n setCurrentNode(() =>\r\n siteMapProvider.getCurrentMainNode(\r\n location?.pathname || routerPathName || window.location.pathname,\r\n ),\r\n );\r\n setCurrentNodes(\r\n siteMapProvider.getCurrentNodes(\r\n location?.pathname || routerPathName || window.location.pathname,\r\n ),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [currentNodes, loading, location, routerPathName, siteMapSettings]);\r\n return (\r\n \r\n \r\n \r\n \r\n {isMobile && }\r\n \r\n );\r\n};\r\nexport const SideBar = React.memo(SideBarComponent);\r\n","import * as React from 'react';\r\nimport Drawer from '@material-ui/core/Drawer';\r\nimport { SideBar } from 'app/Layout/FrontendLayout/components/SideBar';\r\nimport clsx from 'clsx';\r\nimport { ClickAwayListener } from '@material-ui/core';\r\nimport useExpandedSideBarState from 'app/hooks/useExpandedSideBarState';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectIsExpandedSideBar } from 'app/slice/selectors';\r\n\r\nexport interface SideBarDrawerProps {\r\n hideNavigation: boolean | undefined;\r\n isMobile: boolean;\r\n isLandscape?: boolean;\r\n handleDrawerClose: (event: any, reason: any) => void;\r\n}\r\nexport const SideBarDrawer = React.memo(function SideBarDrawer(\r\n props: SideBarDrawerProps,\r\n) {\r\n const { isMobile, handleDrawerClose, isLandscape } = props;\r\n const expanded = useSelector(state =>\r\n selectIsExpandedSideBar(state, isMobile),\r\n );\r\n const { toggle } = useExpandedSideBarState();\r\n return !props.hideNavigation ? (\r\n {\r\n console.log('menu target: ', (event.target as any).nodeName);\r\n if (\r\n ((event.target as any).nodeName === 'path' ||\r\n (event.target as any).nodeName === 'svg' ||\r\n (event.target as any).nodeName === 'BODY') &&\r\n event.type === 'click'\r\n ) {\r\n return;\r\n }\r\n if (isMobile) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n if (expanded) {\r\n toggle();\r\n }\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n ) : null;\r\n});\r\n","import { Theme } from '@material-ui/core';\r\nimport transitions from '@material-ui/core/styles/transitions';\r\nimport styled from 'styled-components';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { SIDE_PANEL_WIDTH } from 'styles/constantVariables';\r\nimport { verticalScrolling } from 'styles/CssVariables/styledVariables';\r\n// width: 370px;\r\n// left: calc(100vw - 370px);\r\n// transition: ${transitions.create('width', {\r\n// easing: transitions.easing.sharp,\r\n// duration: 500,\r\n// })};\r\nexport const LayoutRoot = styled.div.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n}>`\r\n &.layoutroot {\r\n direction: ltr;\r\n @media (min-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n display: flex;\r\n }\r\n &.layoutRootMobile {\r\n display: inline-flex;\r\n justify-content: flex-end;\r\n align-items: flex-start;\r\n width: 100%;\r\n }\r\n & .sidePanelRoot {\r\n height: 0;\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n }\r\n & .sidePanelMobileRoot {\r\n height: 0;\r\n position: absolute;\r\n top: 50px;\r\n left: 0;\r\n max-height: calc(100vh - 50px);\r\n width: 100%;\r\n }\r\n & .backdropOpen {\r\n height: 50px;\r\n position: absolute;\r\n top: -50px;\r\n left: 0;\r\n width: 100%;\r\n background: ${bookitColors.overlays.overlayBlack};\r\n }\r\n & .sidePanelRootExpanded {\r\n width: 100%;\r\n transition: ${transitions.create('width', {\r\n easing: transitions.easing.easeInOut,\r\n duration: 500,\r\n })};\r\n }\r\n & .sidePanelRootCollapsed {\r\n }\r\n }\r\n`;\r\nexport const Main = styled.main.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n}>`\r\n direction: ltr;\r\n @media (min-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n display: flex;\r\n }\r\n\r\n flex-grow: 1;\r\n min-height: 100vh;\r\n background: ${bookitColors.grayscale.grayBackground};\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n margin-right: 0;\r\n overflow: hidden;\r\n height: 100vh;\r\n ${verticalScrolling}\r\n &.shiftLeft {\r\n margin-right: ${SIDE_PANEL_WIDTH}px;\r\n }\r\n & .appBarSpacer {\r\n min-height: 60px;\r\n &.subBarExpanded {\r\n min-height: 118px;\r\n }\r\n }\r\n & .container {\r\n padding: 0px;\r\n position: relative;\r\n background-color: ${bookitColors.grayscale.grayBackground};\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n margin-right: auto;\r\n margin-left: auto;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n &.mobileOpen {\r\n position: relative;\r\n margin-left: calc(100% - 44px);\r\n }\r\n &.useselectable {\r\n overflow-y: hidden;\r\n }\r\n }\r\n & .footer {\r\n margin-top: auto;\r\n & .copyRight {\r\n padding-top: 8px;\r\n margin-top: auto;\r\n margin-inline: '8px';\r\n }\r\n }\r\n`;\r\nexport const AssetWrapperRoot = styled.div.attrs(props => ({ props }))<{\r\n theme: Theme;\r\n}>`\r\n &.publicLayoutroot {\r\n display: inline-flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n width: 100%;\r\n gap: 24px;\r\n padding: 32px;\r\n background-color: ${bookitColors.grayscale.graybgComponents};\r\n overflow-y: hidden;\r\n direction: ltr;\r\n @media (min-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n display: flex;\r\n }\r\n &.isAuthPanel {\r\n padding: 24px;\r\n }\r\n &.publicLayoutRootMobile {\r\n display: inline-flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n width: 100%;\r\n padding: 0;\r\n overflow: hidden;\r\n background-color: ${bookitColors.grayscale.graybgComponents};\r\n\r\n justify-content: flex-end;\r\n align-items: flex-start;\r\n width: 100%;\r\n }\r\n & .sidePanelRoot {\r\n height: 0;\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n }\r\n & .sidePanelMobileRoot {\r\n height: 0;\r\n position: absolute;\r\n top: 50px;\r\n left: 0;\r\n max-height: calc(100vh - 50px);\r\n width: 100%;\r\n }\r\n & .backdropOpen {\r\n height: 50px;\r\n position: absolute;\r\n top: -50px;\r\n left: 0;\r\n width: 100%;\r\n background: ${bookitColors.overlays.overlayBlack};\r\n }\r\n & .sidePanelRootExpanded {\r\n width: 100%;\r\n transition: ${transitions.create('width', {\r\n easing: transitions.easing.easeInOut,\r\n duration: 500,\r\n })};\r\n }\r\n & .sidePanelRootCollapsed {\r\n }\r\n }\r\n`;\r\n","import {\r\n LinearProgress,\r\n Popper,\r\n PopperProps,\r\n Theme,\r\n useTheme,\r\n} from '@material-ui/core';\r\nimport styled from 'styled-components';\r\nimport { IPathAndQuery, toRootedURL } from 'utils/url-utils';\r\nimport * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectAdminPanelOpen,\r\n selectAdminPanelUrl,\r\n} from '../../slice/selectors';\r\nimport { DRAWER_WIDTH } from 'styles/constantVariables';\r\nimport { useLayoutSlice } from '../../slice';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { selectIsExpandedSideBar } from 'app/slice/selectors';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n// import Frame from 'react-frame-component';\r\n\r\nexport interface AdminPanelProps {}\r\nexport const AdminPanelPopper = styled(\r\n ({\r\n sideBarOpen,\r\n theme,\r\n children,\r\n ...other\r\n }: {\r\n sideBarOpen: boolean;\r\n theme: Theme;\r\n children: React.ReactNode;\r\n } & PopperProps) => {children},\r\n)`\r\n &.admin-panel {\r\n z-index: ${props => props.theme.zIndex.modal};\r\n height: 100vh;\r\n width: 100%;\r\n margin-left: ${props => (props.sideBarOpen ? DRAWER_WIDTH : 56)}px;\r\n & .admin-panel-paper {\r\n background: ${props => props.theme.palette.common.white};\r\n border-radius: 0;\r\n height: 100%;\r\n width: calc(100% - ${props => (props.sideBarOpen ? DRAWER_WIDTH : 56)}px);\r\n margin: 0;\r\n box-shadow: unset;\r\n & .admin-panel-header {\r\n display: flex;\r\n justify-content: flex-end;\r\n padding: 8px;\r\n }\r\n }\r\n }\r\n`;\r\nexport function AdminPanel(props: AdminPanelProps) {\r\n const adminPanelOpen = useSelector(selectAdminPanelOpen);\r\n const adminUrl = useSelector(selectAdminPanelUrl);\r\n const dispatch = useDispatch();\r\n const { t } = useTranslation();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const isMobile = DetectIsMobile();\r\n const sideBarOpen = useSelector(state =>\r\n selectIsExpandedSideBar(state, isMobile),\r\n );\r\n const [iframeLoaded, setIframeLoaded] = React.useState(false);\r\n const elementRef = React.useRef(null);\r\n\r\n const iframeRef = React.useRef(null);\r\n const absolutePath = React.useMemo(() => {\r\n return adminUrl !== undefined\r\n ? typeof adminUrl === 'string'\r\n ? toRootedURL(adminUrl)\r\n : toRootedURL(\r\n (adminUrl as IPathAndQuery).path,\r\n (adminUrl as IPathAndQuery).search,\r\n )\r\n : undefined;\r\n }, [adminUrl]);\r\n const theme = useTheme();\r\n const countState = React.useState(0);\r\n React.useEffect(() => {\r\n countState[1](c => c + 1);\r\n // setCount (rerender) needs to occur after element elementRef.current value is bound\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementRef.current]);\r\n const closeAdminPanel = React.useCallback(() => {\r\n dispatch(layoutActions.resetAdminPanel());\r\n }, [dispatch, layoutActions]);\r\n const handleIfarameLoad = () => {\r\n setIframeLoaded(true);\r\n };\r\n // React.useEffect(() => {\r\n // if (!!iframeRef.current) {\r\n // let doc = iframeRef.current.contentWindow;\r\n // }\r\n // return () => {};\r\n // }, []);\r\n return (\r\n \r\n
    \r\n \r\n {adminPanelOpen && !!absolutePath ? (\r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n {!iframeLoaded && (\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 * Layout\r\n *\r\n */\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { Copyright } from 'app/components/Copyright';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { SidePanel } from './components/SidePanel';\r\nimport {\r\n selectConfirmOpen,\r\n selectExpandedSidePanel,\r\n selectHideNavigation,\r\n selectSidePanelOpen,\r\n} from './slice/selectors';\r\nimport { TopBar } from './components/TopBar';\r\nimport useExpandedSideBarState from 'app/hooks/useExpandedSideBarState';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useLayoutSlice } from './slice';\r\nimport { translations } from 'locales/translations';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport { useRequiredRedirect } from 'app/hooks/useRequiredRedirectToCoreSelection';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { SideBarDrawer } from './SideBarDrawer';\r\nimport { LayoutRoot, Main } from './styled';\r\nimport { useTheme } from '@material-ui/core';\r\nimport { DRAWER_MOBILE_WIDTH, DRAWER_WIDTH } from 'styles/constantVariables';\r\nimport {\r\n selectAppSettings,\r\n selectIsExpandedSideBar,\r\n selectIsSubBarCollapsed,\r\n selectShowGlobalServiceGroupFilter,\r\n} from 'app/slice/selectors';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { AdminPanel } from './components/AdminPanel';\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const FrontendLayout_MainContent_ID = 'main_div_content';\r\nexport function FrontendLayout({ children }: Props) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const { actions: appActions } = useAppSettingsSlice();\r\n const { checkIsMobile, isLandscape } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const expanded = useSelector(state =>\r\n selectIsExpandedSideBar(state, isMobile),\r\n );\r\n const { expand } = useExpandedSideBarState();\r\n\r\n const sidePanelExpanded = useSelector(selectExpandedSidePanel);\r\n const sidePanelOpen = useSelector(selectSidePanelOpen);\r\n const appSettings = useSelector(selectAppSettings);\r\n const isBudgets = IsModuleEnabled(appSettings, KnownModules.Budgets);\r\n const collapsedBar = useSelector(selectIsSubBarCollapsed);\r\n const showGroups = useSelector(selectShowGlobalServiceGroupFilter);\r\n\r\n const confirmOpen = useSelector(selectConfirmOpen);\r\n const hideNavigation = useSelector(selectHideNavigation);\r\n const {\r\n redirectToCoreSelection,\r\n redirectToTermsOfUseAgreement,\r\n redirectToActiveUserGroup,\r\n redirectToUsageKiosk,\r\n redirectToUsageRoom,\r\n redirectToConsumableKiosk,\r\n } = useRequiredRedirect();\r\n const drawerWidth = React.useMemo(() => {\r\n return isMobile ? DRAWER_MOBILE_WIDTH : DRAWER_WIDTH;\r\n }, [isMobile]);\r\n const marginRight = React.useMemo(() => {\r\n return sidePanelOpen && !sidePanelExpanded && !isMobile;\r\n }, [isMobile, sidePanelExpanded, sidePanelOpen]);\r\n React.useEffect(() => {\r\n let isRedirectToTermsOfUseAgreement =\r\n redirectToTermsOfUseAgreement === true;\r\n let isRedirectToActiveUserGroup = redirectToActiveUserGroup === true;\r\n let isRedirectToCoreSelection = redirectToCoreSelection === true;\r\n let isRedirectToUsageKiosk = redirectToUsageKiosk === true;\r\n let isRedirectToUsageRoom = redirectToUsageRoom === true;\r\n let isRedirectToConsumableKiosk = redirectToConsumableKiosk === true;\r\n if (isRedirectToTermsOfUseAgreement === true) {\r\n dispatch(appActions.navigate('/TermsOfUseAgreement/exp'));\r\n } else {\r\n if (isRedirectToActiveUserGroup === true) {\r\n dispatch(appActions.navigate('/ActiveUserGroup'));\r\n }\r\n }\r\n if (isRedirectToUsageKiosk) {\r\n window.open(toRootedURL('/UsageKiosk.aspx'));\r\n }\r\n if (isRedirectToUsageRoom) {\r\n window.open(toRootedURL('/InstrumentRoom.aspx'));\r\n }\r\n if (isRedirectToConsumableKiosk) {\r\n dispatch(\r\n appActions.navigate(\r\n isBudgets ? '/kiosk/projects' : '/kiosk/projects/consumables',\r\n ),\r\n );\r\n }\r\n if (isRedirectToCoreSelection) {\r\n dispatch(appActions.navigate('/coreselection'));\r\n dispatch(\r\n appActions.addNotification({\r\n key: 'coreSelection_error',\r\n message: 'Please select core/s',\r\n variant: 'error',\r\n }),\r\n );\r\n }\r\n\r\n return () => {\r\n isRedirectToCoreSelection = false;\r\n isRedirectToTermsOfUseAgreement = false;\r\n isRedirectToActiveUserGroup = false;\r\n isRedirectToUsageKiosk = false;\r\n isRedirectToUsageRoom = false;\r\n isRedirectToConsumableKiosk = false;\r\n };\r\n }, [\r\n actions,\r\n appActions,\r\n dispatch,\r\n redirectToCoreSelection,\r\n redirectToTermsOfUseAgreement,\r\n redirectToActiveUserGroup,\r\n redirectToUsageKiosk,\r\n redirectToUsageRoom,\r\n redirectToConsumableKiosk,\r\n isBudgets,\r\n ]);\r\n\r\n const handleDrawerClose = React.useCallback(\r\n (event, reason) => {\r\n expand(!expanded);\r\n },\r\n [expand, expanded],\r\n );\r\n\r\n React.useEffect(() => {\r\n dispatch(actions.setIsMobileView(isMobile));\r\n }, [actions, dispatch, isMobile]);\r\n const handleRejectConfirm = React.useCallback(() => {\r\n dispatch(actions.setConfirmRejected(true));\r\n }, [actions, dispatch]);\r\n const handleApproveConfirm = React.useCallback(() => {\r\n dispatch(actions.setConfirmApproved(true));\r\n }, [actions, dispatch]);\r\n const theme = useTheme();\r\n return (\r\n \r\n {!isMobile && !hideNavigation && (\r\n \r\n )}\r\n\r\n \r\n {/* id is required on main in order for infinite scroll to work according to main's scrollbar*/}\r\n \r\n {!isMobile && (\r\n \r\n )}\r\n \r\n {children}\r\n {!isMobile && (\r\n
    \r\n \r\n
    \r\n )}\r\n \r\n \r\n\r\n \r\n \r\n {\r\n handleApproveConfirm();\r\n }}\r\n onCancel={() => {\r\n handleRejectConfirm();\r\n }}\r\n id=\"confirm_sidepanel\"\r\n aria-labelledby=\"side-panel-confirm\"\r\n />\r\n \r\n );\r\n}\r\n","import { useProfileSetting } from 'app/components/BasicTable/useProfileSetting';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectIsAuthenticated,\r\n selectLoading,\r\n selectGlobalSettingBool,\r\n selectShowGlobalServiceGroupFilter,\r\n selectAuthenticatedUser,\r\n selectAppSettings,\r\n} from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { useLocationChange } from './useLocationChange';\r\n\r\nexport const useRequiredRedirect = () => {\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const globalCoreVisible = useSelector(selectShowGlobalServiceGroupFilter);\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n const loading = useSelector(selectLoading);\r\n const topServiceGroupsIsHidden = useSelector(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.HideTopServiceGroupFilter),\r\n );\r\n const appSettings = useSelector(selectAppSettings);\r\n const termsOfUseAgreementEnabled = IsModuleEnabled(\r\n appSettings,\r\n KnownModules.TermsOfUseAgreement,\r\n );\r\n const multipleAdGroupsModuleEnabled = IsModuleEnabled(\r\n appSettings,\r\n KnownModules.MultipleAdGroups,\r\n );\r\n const { savedEnabled: isFirstLogin } = useProfileSetting({\r\n profileSettingKey: 'IsFirstLoginUser',\r\n });\r\n const { savedEnabled: OptOutCoreSelection } = useProfileSetting({\r\n profileSettingKey: 'CoreSelectionOptOut',\r\n });\r\n const { savedEnabled: isFirstActiveUserGroupSelected } = useProfileSetting({\r\n profileSettingKey: 'IsFirstActiveUserGroupSelected',\r\n });\r\n const skipCoreSelectionScreen = useSelector(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.SkipCoreSelectionScreen),\r\n );\r\n const usageKioskRoleEnabled = useSelector(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.UsageKioskRoleEnabled),\r\n );\r\n const roomUserRoleEnabled = useSelector(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.RoomUserRoleEnabled),\r\n );\r\n const [\r\n redirectToTermsOfUseAgreement,\r\n setRedirectToTermsOfUseAgreement,\r\n ] = React.useState(false);\r\n const [\r\n redirectToActiveUserGroup,\r\n setRedirectToActiveUserGroup,\r\n ] = React.useState(false);\r\n const [redirectToCoreSelection, setRedirectToCoreSelection] = React.useState<\r\n boolean\r\n >(false);\r\n const [redirectToUsageKiosk, setRedirectToUsageKiosk] = React.useState<\r\n boolean\r\n >(false);\r\n const [redirectToUsageRoom, setRedirectToUsageRoom] = React.useState(\r\n false,\r\n );\r\n const [\r\n redirectToConsumableKiosk,\r\n setRedirectToConsumableKiosk,\r\n ] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n if (!loading && isAuthenticated) {\r\n if (\r\n !topServiceGroupsIsHidden &&\r\n !skipCoreSelectionScreen &&\r\n globalCoreVisible\r\n ) {\r\n if (\r\n !selectedServiceGroups ||\r\n selectedServiceGroups.length < 1 ||\r\n (!OptOutCoreSelection && isFirstLogin)\r\n ) {\r\n if (window.location.pathname.indexOf('/coreselection') === -1) {\r\n setRedirectToCoreSelection(true);\r\n } else {\r\n setRedirectToCoreSelection(false);\r\n }\r\n } else {\r\n setRedirectToCoreSelection(false);\r\n }\r\n } else {\r\n setRedirectToCoreSelection(false);\r\n }\r\n } else {\r\n setRedirectToCoreSelection(false);\r\n }\r\n return () => {\r\n setRedirectToCoreSelection(false);\r\n };\r\n }, [\r\n OptOutCoreSelection,\r\n globalCoreVisible,\r\n isAuthenticated,\r\n isFirstLogin,\r\n loading,\r\n selectedServiceGroups,\r\n skipCoreSelectionScreen,\r\n topServiceGroupsIsHidden,\r\n ]);\r\n\r\n useLocationChange((current: Location, previus: Location) => {\r\n if (!previus || current.pathname !== previus.pathname) {\r\n if (!loading && isAuthenticated) {\r\n if (\r\n termsOfUseAgreementEnabled &&\r\n authenticatedUser !== undefined &&\r\n authenticatedUser?.HasSignedTermsOfUse === true\r\n ) {\r\n setRedirectToTermsOfUseAgreement(false);\r\n } else {\r\n setRedirectToTermsOfUseAgreement(true);\r\n }\r\n\r\n if (\r\n (isFirstActiveUserGroupSelected === false ||\r\n isFirstActiveUserGroupSelected === undefined) &&\r\n multipleAdGroupsModuleEnabled &&\r\n (authenticatedUser?.UserGroups?.length || 1) > 1\r\n ) {\r\n setRedirectToActiveUserGroup(true);\r\n } else {\r\n setRedirectToActiveUserGroup(false);\r\n }\r\n if (\r\n usageKioskRoleEnabled &&\r\n authenticatedUser?.Roles.includes(Roles.KioskAdmin)\r\n ) {\r\n setRedirectToUsageKiosk(true);\r\n } else {\r\n setRedirectToUsageKiosk(false);\r\n }\r\n if (\r\n roomUserRoleEnabled &&\r\n authenticatedUser?.Roles.includes(Roles.RoomOnly)\r\n ) {\r\n setRedirectToUsageRoom(true);\r\n } else {\r\n setRedirectToUsageRoom(false);\r\n }\r\n if (authenticatedUser?.Roles.includes(Roles.ConsumableKiosk)) {\r\n setRedirectToConsumableKiosk(true);\r\n } else {\r\n setRedirectToConsumableKiosk(false);\r\n }\r\n if (\r\n !topServiceGroupsIsHidden &&\r\n !skipCoreSelectionScreen &&\r\n globalCoreVisible\r\n ) {\r\n if (\r\n !selectedServiceGroups ||\r\n selectedServiceGroups.length < 1 ||\r\n (!OptOutCoreSelection && isFirstLogin)\r\n ) {\r\n if (\r\n current.pathname.indexOf('/coreselection') === -1 &&\r\n !redirectToUsageKiosk &&\r\n !redirectToUsageRoom &&\r\n !redirectToConsumableKiosk\r\n ) {\r\n setRedirectToCoreSelection(true);\r\n } else {\r\n setRedirectToCoreSelection(false);\r\n }\r\n } else {\r\n setRedirectToCoreSelection(false);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n return {\r\n redirectToCoreSelection,\r\n redirectToTermsOfUseAgreement,\r\n redirectToActiveUserGroup,\r\n redirectToUsageKiosk,\r\n redirectToUsageRoom,\r\n redirectToConsumableKiosk,\r\n };\r\n};\r\n","/**\r\n *\r\n * SamplesTable\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { EditableCell } from '../../EditableTable/EditableCell';\r\nimport { TmtType } from 'app/pages/Samples/components/TmtType';\r\nimport { DateField as CellDateField } from '../../EditableTable/Fields/DateField';\r\nimport { NumberField as CellNumberField } from '../../EditableTable/Fields/NumberField';\r\nimport { TextField as CellTextField } from '../../EditableTable/Fields/TextField';\r\n\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ISample } from '../../SamplesListPage/slice/types';\r\nimport { MouseEventHandler } from 'react';\r\nimport { ControlledTable } from 'app/components/BasicTable/ControlledTable';\r\nimport { useRequestSamplesSlice } from 'app/pages/Samples/RequestSamplesPage/slice';\r\nimport { SamplePlatePicker } from 'app/components/pickers/AutocompletePickers/SamplePlatePicker';\r\nimport { SourceSamplePlatePositionPicker } from 'app/components/pickers/AutocompletePickers/SamplePlatePositionPicker';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { ButtonConfirm } from 'app/components/ButtonConfirm';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { DateLabel } from 'app/components/DateLabel.tsx';\r\nimport {\r\n selectSamplesData,\r\n selectSamplesTableState,\r\n selectSelectedSamples,\r\n} from '../../RequestSamplesPage/slice/selectors';\r\nimport { useConfigurableColumnsAdvanced } from 'app/components/BasicTable/useConfigurableColumnsAdvanced';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\n\r\nimport { PageActionRenderer } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport { DropDown } from 'app/components/DropDown';\r\nimport { openExportLink } from 'utils/url-utils';\r\nimport { Printing } from 'app/components/PrintToPDF';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { ImportButton as SamplesImportButton } from '../../SamplesListPage/ImportButton';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { selectAppSettings } from 'app/slice/selectors';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { FormSectionTitle } from 'app/components/Forms/FormsLayout/FormSectionTitle';\r\nimport { Column } from 'react-table';\r\n\r\nexport interface SamplesTableProps {\r\n serviceRequestId?: number;\r\n processing: boolean;\r\n isEditable: boolean;\r\n isAdmin: boolean;\r\n pageSize?: number;\r\n printing?: Printing;\r\n sectionStyles?: React.CSSProperties;\r\n}\r\n\r\nconst READONLY_COLUMNS = ['Status'];\r\n\r\nexport const SamplesTable = React.memo(function SamplesTable({\r\n serviceRequestId,\r\n isAdmin,\r\n isEditable,\r\n pageSize,\r\n printing,\r\n sectionStyles,\r\n ...props\r\n}: SamplesTableProps) {\r\n const samplesTableState = useSelector(selectSamplesTableState);\r\n const samples = useSelector(selectSamplesData);\r\n const selectedSamples = useSelector(selectSelectedSamples);\r\n const appSettings = useSelector(selectAppSettings);\r\n const { actions: requestactions } = useRequestSamplesSlice();\r\n const history = useHistory();\r\n const { actions } = useRequestSamplesSlice();\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n\r\n const columns: Column[] = React.useMemo(() => {\r\n var result = [\r\n {\r\n Header: t(translations.SampleId),\r\n accessor: 'Id', // accessor is the \"key\" in the data\r\n },\r\n {\r\n Header: 'Request ID',\r\n accessor: 'ServiceRequestId',\r\n },\r\n {\r\n Header: 'Status',\r\n accessor: 'StatusName',\r\n Cell: ({ row, value }) => {\r\n /*switch (value) {\r\n case 0:\r\n return 'New';\r\n case 1:\r\n return 'In Work';\r\n case 2:\r\n return 'Done';\r\n default:\r\n return 'N/A';\r\n }*/\r\n return row.original.StatusName;\r\n },\r\n },\r\n {\r\n Header: t(translations.AnalyticalSampleId),\r\n accessor: 'AnalyticalSampleId',\r\n Cell: !isEditable ? undefined : EditableCell(CellTextField),\r\n },\r\n {\r\n Header: t(translations.BiologicalSampleId),\r\n accessor: 'BiologicalSampleId',\r\n Cell: !isEditable ? undefined : EditableCell(CellTextField),\r\n },\r\n {\r\n Header: t(translations.SubjectId),\r\n accessor: 'SubjectId',\r\n Cell: !isEditable ? undefined : EditableCell(CellTextField),\r\n },\r\n {\r\n Header: t(translations.SampleType),\r\n accessor: 'SampleType',\r\n Cell: !isEditable ? undefined : EditableCell(CellTextField),\r\n },\r\n {\r\n Header: t(translations.TaxaId),\r\n accessor: 'TaxaId',\r\n Cell: !isEditable ? undefined : EditableCell(CellTextField),\r\n },\r\n {\r\n Header: t(translations.Grouping),\r\n accessor: 'Grouping',\r\n Cell: !isEditable ? undefined : EditableCell(CellTextField),\r\n },\r\n {\r\n Header: 'Date Received',\r\n accessor: 'DateReceived',\r\n Cell: !isEditable ? DateLabel : EditableCell(CellDateField),\r\n },\r\n {\r\n Header: 'Tube label',\r\n accessor: 'TubeLabel',\r\n Cell: !isEditable ? undefined : EditableCell(CellTextField),\r\n },\r\n {\r\n Header: t(translations.TMT_Type),\r\n accessor: 'TMT_Type',\r\n Cell: !isEditable ? undefined : EditableCell(TmtType),\r\n },\r\n {\r\n Header: t(translations.TMT_Label),\r\n accessor: 'TMT_Label',\r\n Cell: !isEditable ? undefined : React.memo(EditableCell(CellTextField)),\r\n },\r\n {\r\n Header: t(translations.TMT_Set),\r\n accessor: 'TMT_Set',\r\n Cell: !isEditable ? undefined : React.memo(EditableCell(CellTextField)),\r\n },\r\n {\r\n Header: t(translations.SamplePlateId),\r\n accessor: 'SamplePlateId',\r\n Cell: !isEditable\r\n ? undefined\r\n : React.memo(EditableCell(SamplePlatePicker)),\r\n },\r\n {\r\n Header: t(translations.PlatePosition),\r\n accessor: 'Position',\r\n Cell: !isEditable\r\n ? undefined\r\n : React.memo(EditableCell(SourceSamplePlatePositionPicker)),\r\n },\r\n {\r\n Header: t(translations.Volume),\r\n accessor: 'Volume',\r\n Cell: !isEditable\r\n ? undefined\r\n : React.memo(EditableCell(CellNumberField)),\r\n },\r\n {\r\n Header: t(translations.Concentration),\r\n accessor: 'Concentration',\r\n Cell: !isEditable\r\n ? undefined\r\n : React.memo(EditableCell(CellNumberField)),\r\n },\r\n {\r\n Header: t(translations.ServiceGroup),\r\n accessor: 'ServiceGroup',\r\n },\r\n ];\r\n /**\r\n * { Cell: undefined } causes \"Renderer Error\"\r\n */\r\n result\r\n .filter(column => column.Cell === undefined)\r\n .forEach(column => delete column.Cell);\r\n return result;\r\n }, [isEditable, t]);\r\n\r\n const {\r\n configurableColumns,\r\n columnAccessors,\r\n exportConfigurableColumns,\r\n handleConfigurableColumns,\r\n configCompleted,\r\n } = useConfigurableColumnsAdvanced(\r\n ScreensId.SampleRequests,\r\n columns,\r\n READONLY_COLUMNS,\r\n );\r\n const pageCount = React.useMemo(() => {\r\n return Math.ceil(\r\n (samples.value?.dataLength ?? 0) / (samplesTableState.pageSize ?? 10),\r\n );\r\n }, [samples.value?.dataLength, samplesTableState.pageSize]);\r\n const customPageSize = React.useMemo(() => {\r\n return printing !== undefined && printing.printing === true\r\n ? 10000\r\n : pageSize ?? 10;\r\n }, [pageSize, printing]);\r\n // const dispatch = useDispatch();\r\n // const { actions } = useSamplesListSlice();\r\n const updateMyData = item => {\r\n // We also turn on the flag to not reset the page\r\n // setSkipPageReset(true);\r\n dispatch(actions.updateServiceRequestSampleField(item));\r\n };\r\n\r\n const handleCreateButtonClick: MouseEventHandler = e => {\r\n if (serviceRequestId === undefined) {\r\n return;\r\n }\r\n const data: ISample = {\r\n Id: 0,\r\n ServiceRequestId: serviceRequestId,\r\n BudgetId: null,\r\n BudgetName: null,\r\n SourceRunIds: [],\r\n TargetRunIds: [],\r\n Status: 0,\r\n StatusName: null,\r\n AnalyticalSampleId: null,\r\n BiologicalSampleId: null,\r\n TMT_Type: null,\r\n TMT_Label: null,\r\n TMT_Set: null,\r\n SubjectId: null,\r\n Concentration: null,\r\n Volume: null,\r\n SamplePlateId: null,\r\n Position: null,\r\n SampleType: null,\r\n TaxaId: null,\r\n };\r\n dispatch(actions.createSample(data));\r\n };\r\n\r\n const handleChangeState = React.useCallback(\r\n state => {\r\n if (!!columnAccessors) {\r\n dispatch(\r\n actions.loadSamples({ ...state, ...{ columns: columnAccessors } }),\r\n );\r\n }\r\n },\r\n [actions, columnAccessors, dispatch],\r\n );\r\n\r\n const openExportUrl = React.useCallback(\r\n (readWriteOnly: boolean): Promise => {\r\n if (\r\n exportConfigurableColumns !== undefined &&\r\n exportConfigurableColumns.length > 0\r\n ) {\r\n const exportColumns = exportConfigurableColumns;\r\n if (readWriteOnly) exportColumns.concat(READONLY_COLUMNS);\r\n const downloadTemplateUrl = toRootedURL('/api/odata/v4/samples', {\r\n $format: 'application/xlsx',\r\n $filter:\r\n '(not SourceRunIds/any()) and ' +\r\n (selectedSamples?.length > 0\r\n ? `Id in (${selectedSamples.map(f => f.Id).join(',')})`\r\n : `ServiceRequestId eq ${serviceRequestId}`),\r\n $select: exportColumns.join(','),\r\n });\r\n return openExportLink(downloadTemplateUrl);\r\n } else\r\n return new Promise((resolve, reject) => {\r\n resolve();\r\n });\r\n },\r\n [exportConfigurableColumns, selectedSamples, serviceRequestId],\r\n );\r\n const handleExportClick = (): Promise => openExportUrl(false);\r\n /*const handleExportForImportClick = React.useCallback(\r\n () => openExportUrl(true),\r\n [openExportUrl],\r\n );*/\r\n const handleDownloadTemplateClick = React.useCallback((): Promise => {\r\n if (\r\n exportConfigurableColumns !== undefined &&\r\n exportConfigurableColumns.length > 0\r\n ) {\r\n if (serviceRequestId === undefined) {\r\n return new Promise((resolve, reject) => {\r\n resolve();\r\n });\r\n }\r\n const downloadTemplateUrl = toRootedURL('/api/odata/v4/samples', {\r\n $format: 'application/xlsx',\r\n $filter: `ServiceRequestId eq ${serviceRequestId}`,\r\n $top: 0,\r\n $select: exportConfigurableColumns.join(','),\r\n });\r\n return openExportLink(downloadTemplateUrl);\r\n } else\r\n return new Promise((resolve, reject) => {\r\n resolve();\r\n });\r\n }, [exportConfigurableColumns, serviceRequestId]);\r\n const goToSamplesList = React.useCallback(() => {\r\n history.push(`/samples?ServiceRequestId=${serviceRequestId}`);\r\n }, [history, serviceRequestId]);\r\n const handelDeleteSamplesClick = (\r\n selectedRows: ISample[],\r\n toggleAllRowsSelected,\r\n ) => {\r\n dispatch(actions.deleteSamples(selectedRows));\r\n toggleAllRowsSelected(false);\r\n };\r\n const handleSelectedRowsChange = React.useCallback(\r\n rows => {\r\n dispatch(actions.setSelected(rows));\r\n },\r\n [actions, dispatch],\r\n );\r\n const menuItems: React.ReactNode[] = React.useMemo(() => {\r\n let items: React.ReactNode[] = [];\r\n\r\n /*items.push(\r\n \r\n \r\n ,\r\n );\r\n /*items.push(\r\n \r\n {t(translations.ExportForImport)}\r\n ,\r\n );*/\r\n return items;\r\n }, []);\r\n\r\n const getActions = (): PageActionRenderer[] => {\r\n const result: PageActionRenderer[] = [\r\n /*() => (\r\n \r\n ),*/\r\n () => (\r\n \r\n ),\r\n ];\r\n if (isAdmin && menuItems.length > 0) {\r\n result.push(() => (\r\n [...menuItems]}\r\n >\r\n \r\n \r\n ));\r\n }\r\n return result;\r\n };\r\n const importHandler = () => {\r\n dispatch(requestactions.toggleImport(true));\r\n };\r\n const customScreenName: React.ReactNode = React.useMemo(() => {\r\n const result = (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n );\r\n return result;\r\n }, [goToSamplesList, t]);\r\n return (\r\n <>\r\n \r\n | null;\r\n // TargetRunIds: Array | null;\r\n //\"cast(Status , 'Edm.String')\",\r\n 'AnalyticalSampleId',\r\n 'BiologicalSampleId',\r\n 'TMT_Type',\r\n 'TMT_Label',\r\n 'TMT_Set',\r\n 'SubjectId',\r\n \"cast(Concentration , 'Edm.String')\",\r\n \"cast(Volume , 'Edm.String')\",\r\n 'SamplePlateId',\r\n 'Position',\r\n ]}\r\n compact={false}\r\n // updateMyData={updateMyData}\r\n selectedRowsActions={[\r\n (rows: ISample[], _refresh, toggleAllRowsSelected) => (\r\n <>\r\n \r\n handelDeleteSamplesClick(rows, toggleAllRowsSelected)\r\n }\r\n confirmationDialogBody={t(\r\n translations.ThisCannotBeUndoneAreYouSure,\r\n )}\r\n >\r\n {t(translations.Delete)} ({rows.length})\r\n \r\n \r\n ),\r\n ]}\r\n pageActions={getActions()}\r\n printing={printing}\r\n tableContainerSyles={sectionStyles}\r\n />\r\n \r\n );\r\n});\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { FormikProps } from 'formik';\r\nimport {\r\n getFieldsVisibilities,\r\n isRequired,\r\n SerializeValue,\r\n} from 'app/components/CustomForm/CustomFormUtils';\r\nimport { useRequestSamplesSlice } from '../../slice';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport { Box } from '@material-ui/core';\r\nimport { getLogger } from 'utils/logLevel';\r\nimport { IServiceRequestDetailsFormModel } from '../../slice/types';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { selectServiceRequestCustomFormFields } from '../../slice/selectors';\r\nimport { FormFieldsSection, FormRow } from 'app/components/Forms/FormsLayout';\r\nimport { CustomFormField } from 'app/components/CustomForm/CustomFormFields';\r\nimport { sortBy } from 'lodash';\r\nimport { ICustomFormDto } from 'api/odata/generated/entities/ICustomFormDto';\r\n\r\nexport interface ServiceRequestCustomFormProps\r\n extends FormikProps {\r\n serviceRequestId?: number;\r\n customForm: ICustomFormDto;\r\n isAdmin: boolean;\r\n disabled: boolean;\r\n sectionStyles?: React.CSSProperties;\r\n}\r\nconst log = getLogger('ServiceRequestCustomForm');\r\nexport const ServiceRequestCustomForm = React.memo(\r\n function ServiceRequestCustomForm({\r\n isAdmin,\r\n disabled,\r\n sectionStyles,\r\n ...props\r\n }: ServiceRequestCustomFormProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n const formFields = useSelector(selectServiceRequestCustomFormFields);\r\n\r\n const handleChange = React.useCallback(\r\n (value, formField: IFormFieldDto) => {\r\n const serviceRequestId = props.serviceRequestId;\r\n if (serviceRequestId === undefined) {\r\n log.info('handleSubmit - serviceRequestId is is empty');\r\n return;\r\n }\r\n\r\n dispatch(\r\n actions.saveFormValues({\r\n RequestId: serviceRequestId,\r\n FormFieldId: formField.Id,\r\n Value:\r\n formField.Type === 'File'\r\n ? value\r\n : SerializeValue(formField, value?.target?.value ?? value),\r\n DisplayValue: null,\r\n Type: formField.Type,\r\n }),\r\n );\r\n },\r\n [actions, dispatch, props.serviceRequestId],\r\n );\r\n\r\n const isVisibleField = (\r\n field: IFormFieldDto,\r\n isAdmin: boolean,\r\n values: Record | undefined,\r\n visibleOnCompletion?: () => boolean,\r\n ): boolean => {\r\n let visibilities = getFieldsVisibilities(\r\n formFields,\r\n isAdmin,\r\n values,\r\n visibleOnCompletion,\r\n );\r\n if (visibilities) {\r\n return visibilities[field.Id];\r\n }\r\n return true;\r\n };\r\n const sortedActiveFormFields = React.useMemo(\r\n () =>\r\n sortBy(\r\n formFields.filter(f => f.Active === true),\r\n f => f.Index,\r\n ),\r\n [formFields],\r\n );\r\n\r\n return props.values.FormValues === undefined ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n {sortedActiveFormFields.map((formField, index) => {\r\n // paragraphs & form sections deserve to start from the new line in 2 column layout (full screen)\r\n const fullRow =\r\n formField.Type !== null &&\r\n ['Paragraph', 'FormSection'].includes(formField.Type);\r\n const name = `FormValues.${String(formField.Id)}`;\r\n return (\r\n \r\n handleChange(value, formField)}\r\n />\r\n \r\n );\r\n })}\r\n \r\n );\r\n },\r\n);\r\n","import { useEffect, useRef } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectPrintPDFSections } from './slice/selectors';\r\nimport { ServiceRequestSectionTypes } from './ServiceRequestSectionTypes';\r\n\r\nexport interface PrintPDFSectionProps {\r\n print: boolean;\r\n id: ServiceRequestSectionTypes;\r\n}\r\nexport function PrintPDFSection(\r\n props: React.PropsWithChildren,\r\n) {\r\n const printPDFSections = useSelector(selectPrintPDFSections);\r\n const componentRef = useRef(null);\r\n useEffect(() => {\r\n if (componentRef.current !== null) {\r\n if (props.print) {\r\n const checked = printPDFSections?.some(\r\n f => f.id === props.id && f.checked === true,\r\n );\r\n if (checked) {\r\n componentRef.current.style.display = 'block';\r\n } else {\r\n componentRef.current.style.display = 'none';\r\n }\r\n } else {\r\n componentRef.current.style.display = 'initial';\r\n }\r\n }\r\n }, [printPDFSections, props.id, props.print]);\r\n return (\r\n <>\r\n
    {props.children}
    \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * BudgetPicker\r\n *\r\n */\r\nimport { IServiceBaseDto } from 'api/odata/generated/entities/IServiceBaseDto';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport {\r\n BudgetPicker,\r\n BudgetPickerProps,\r\n restrictedBudgetFilter,\r\n} from 'app/components/pickers/AutocompletePickers/BudgetPicker';\r\nimport useGlobalSettingsHook from 'app/pages/ReservationDetails/Details/components/useGlobalSettingsHook';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport * as React from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nexport interface EventBudgetPickerProps extends BudgetPickerProps {\r\n service: IServiceBaseDto;\r\n userGroupId: string;\r\n userId: string;\r\n isAdmin: boolean;\r\n}\r\n\r\n/**\r\n * Budget picker that can be used to select a budget applicable to bookable events like reservations, offline services, requests, etc.\r\n * @param param0\r\n * @returns\r\n */\r\nexport function EventBudgetPicker({\r\n predicates,\r\n ...props\r\n}: EventBudgetPickerProps) {\r\n const globalSettings = useGlobalSettingsHook();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const ReservationUserGroupGroupByBudgetUserGroup = React.useMemo(() => {\r\n return (\r\n globalSettings.reservationUserGroupGroupByBudgetUserGroup &&\r\n !props.service.HideProjects\r\n );\r\n }, [\r\n props.service,\r\n globalSettings.reservationUserGroupGroupByBudgetUserGroup,\r\n ]);\r\n const eventPredicates = React.useMemo(() => {\r\n const result = restrictedBudgetFilter({\r\n budgetLimitedByUsers: globalSettings.budgetLimitedByUsers,\r\n isBudgetsWithoutUserGroup: globalSettings.isBudgetsWithoutUserGroup,\r\n userGroupId: ReservationUserGroupGroupByBudgetUserGroup\r\n ? undefined\r\n : props.userGroupId,\r\n serviceGroupId: undefined,\r\n services: [props.service].map(f => {\r\n return {\r\n Id: f.Id,\r\n Name: f.Name,\r\n ServiceTypeId: ServiceType[f.ServiceType],\r\n ServiceGroupId: f.ServiceGroup.Id,\r\n HideProject: f.HideProjects,\r\n } as IServiceTypeFilterDto;\r\n }),\r\n startTime: undefined,\r\n endTime: undefined,\r\n user: props.isAdmin\r\n ? props.userId === null\r\n ? undefined\r\n : props.userId\r\n : authenticatedUser?.Id,\r\n });\r\n return result.concat(predicates ?? []);\r\n }, [\r\n ReservationUserGroupGroupByBudgetUserGroup,\r\n authenticatedUser?.Id,\r\n globalSettings.budgetLimitedByUsers,\r\n globalSettings.isBudgetsWithoutUserGroup,\r\n props.isAdmin,\r\n predicates,\r\n props.service,\r\n props.userGroupId,\r\n props.userId,\r\n ]);\r\n return ;\r\n}\r\n","import { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { InputLabel, InputValue } from 'app/components/Typography';\r\n\r\nexport function ReadonlyField(props: {\r\n title: string;\r\n value: string | undefined | null;\r\n}) {\r\n const { t } = useTranslation();\r\n return (\r\n <>\r\n \r\n \r\n {props.title}\r\n \r\n \r\n {props.value ?? t(translations.NA)}\r\n \r\n \r\n \r\n );\r\n}\r\n","import { useDispatch, useSelector } from 'react-redux';\r\nimport { useRequestSamplesSlice } from '../../RequestSamplesPage/slice';\r\nimport { selectServiceRequestDetailsFieldState } from '../../RequestSamplesPage/slice/selectors';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\n\r\nexport interface IUseServiceRequestStatusUpdateProps {\r\n serviceRequestStatusId: number;\r\n}\r\nexport function useServiceRequestStatusUpdate(\r\n props: IUseServiceRequestStatusUpdateProps,\r\n) {\r\n const { actions } = useRequestSamplesSlice();\r\n const dispatch = useDispatch();\r\n const changeStatus = (value: {\r\n status: IServiceRequestStatusDto;\r\n reason?: string;\r\n }) => {\r\n value !== null &&\r\n dispatch(\r\n actions.updateStatus({\r\n Id: props.serviceRequestStatusId,\r\n Status: value.status,\r\n Reason: value.reason,\r\n }),\r\n );\r\n };\r\n const fieldState = useSelector(state =>\r\n selectServiceRequestDetailsFieldState(state, 'Status'),\r\n );\r\n return { changeStatus, fieldState };\r\n}\r\n","/**\r\n *\r\n * ServiceRequestSubmissionDetails\r\n *\r\n */\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { ServiceRequestStatusPicker } from 'app/components/pickers/AutocompletePickers/ServiceRequestStatusPicker';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectRequestDetailsFieldsState } from '../../RequestSamplesPage/slice/selectors';\r\nimport { useRequestSamplesSlice } from '../../RequestSamplesPage/slice';\r\nimport { EventBudgetPicker } from '../EventBudgetPicker';\r\nimport {\r\n FormFieldsSection,\r\n FormLeftSection,\r\n FormRightSection,\r\n FormRow,\r\n StyledFormFieldsContainer,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { ReadonlyField } from '../ReadonlyField';\r\nimport { useServiceRequestStatusUpdate } from '../Utils';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { IRequestDetailsModel } from '../../RequestSamplesPage/slice/types';\r\n\r\nexport interface ServiceRequestSubmissionDetailsProps {\r\n requestDetails: IRequestDetailsModel;\r\n isAdmin: boolean;\r\n isOwner: boolean;\r\n sectionStyles?: React.CSSProperties;\r\n}\r\n\r\nexport function ServiceRequestSubmissionDetails({\r\n requestDetails,\r\n ...props\r\n}: ServiceRequestSubmissionDetailsProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const fieldsState = useSelector(selectRequestDetailsFieldsState);\r\n const { actions } = useRequestSamplesSlice();\r\n const dispatch = useDispatch();\r\n const authUser = useSelector(selectAuthenticatedUser);\r\n useEffectOnMount(() => {\r\n dispatch(actions.init());\r\n });\r\n const {\r\n changeStatus,\r\n fieldState: statusFieldState,\r\n } = useServiceRequestStatusUpdate({\r\n serviceRequestStatusId: requestDetails.Id,\r\n });\r\n const handleBudgetChange = value => {\r\n value !== null &&\r\n dispatch(\r\n actions.updateBudget({\r\n Id: requestDetails.Id,\r\n Budget: value,\r\n }),\r\n );\r\n };\r\n const handleStatusChange = value => {\r\n changeStatus({\r\n status: value,\r\n });\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 \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 {props.isAdmin ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n \r\n {props.isAdmin ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { IRequestDetailsModel } from '../../slice/types';\r\nimport { useFormikContext } from 'formik';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\n\r\nexport interface ISubmitServiceRequestButtonProps {\r\n serviceRequest?: IRequestDetailsModel;\r\n getRowsErrors?: (hasRowErrors: boolean) => void;\r\n disabled?: boolean;\r\n}\r\nexport function SubmitServiceRequestButton(\r\n props: ISubmitServiceRequestButtonProps,\r\n) {\r\n const { t } = useTranslation();\r\n const { serviceRequest, getRowsErrors } = props;\r\n const formik = useFormikContext();\r\n const submitEnabled = React.useMemo(() => {\r\n return (\r\n serviceRequest?.Status.InternalStatusId === 'Draft' ||\r\n serviceRequest?.Status.InternalStatusId === 'ReturnedToUser'\r\n );\r\n }, [serviceRequest?.Status.InternalStatusId]);\r\n\r\n const handleSubmit = React.useCallback(async () => {\r\n if (!formik.isValid) {\r\n return;\r\n }\r\n if (serviceRequest !== undefined) {\r\n await formik.submitForm();\r\n setOpen(false);\r\n }\r\n }, [formik, serviceRequest]);\r\n\r\n const [open, setOpen] = React.useState(false);\r\n\r\n const title = React.useMemo(() => {\r\n return submitEnabled\r\n ? t(translations.ServiceRequestSubmitButtonTooltip_Enabled)\r\n : t(translations.ServiceRequestSubmitButtonTooltip_Disabled);\r\n }, [submitEnabled, t]);\r\n const handleClick = React.useCallback(async () => {\r\n // TODO: move to the page level into formik submit handler\r\n const x = await formik.validateForm();\r\n const isValid = Object.keys(x).length === 0;\r\n if (isValid) {\r\n setOpen(true);\r\n } else {\r\n if (!!getRowsErrors) {\r\n getRowsErrors(Object.entries(x).some(f => f[0] === 'Rows'));\r\n }\r\n }\r\n }, [formik, getRowsErrors]);\r\n return (\r\n <>\r\n }\r\n disabled={!submitEnabled || props.disabled}\r\n aria-label={t(translations.Submit)}\r\n >\r\n {t(translations.Submit)}\r\n \r\n setOpen(false)}\r\n onConfirm={handleSubmit}\r\n />\r\n \r\n );\r\n}\r\n","import { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRequestSamplesSlice } from '../../slice';\r\nimport { useDispatch } from 'react-redux';\r\nimport { ButtonConfirm } from 'app/components/ButtonConfirm';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\n\r\nexport interface ICancelServiceRequestButtonProps {\r\n serviceRequestId?: number;\r\n}\r\nexport function CancelServiceRequestButton(\r\n props: ICancelServiceRequestButtonProps,\r\n) {\r\n const { t } = useTranslation();\r\n const { actions } = useRequestSamplesSlice();\r\n const dispatch = useDispatch();\r\n const handleClick = () => {\r\n if (props.serviceRequestId !== undefined) {\r\n dispatch(\r\n actions.cancelServiceRequest({\r\n serviceRequestId: props.serviceRequestId,\r\n }),\r\n );\r\n }\r\n };\r\n return (\r\n }\r\n aria-label=\"history\"\r\n onClick={handleClick}\r\n variant=\"white\"\r\n title={t(translations.CancelRequest)}\r\n confirmationDialogBody={t(translations.AreYouSure)}\r\n >\r\n {t(translations.CancelRequest)}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ServiceRequestAddons\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Column } from 'react-table';\r\nimport { IServiceRequestMilestoneChargeDto } from 'api/odata/generated/entities/IServiceRequestMilestoneChargeDto';\r\nimport DateRenderer from 'app/components/BasicTable/CellRenderers/DateRenderer';\r\nimport { IConsumableServiceDto } from 'api/odata/generated/entities/IConsumableServiceDto';\r\nimport { ControlledTable } from 'app/components/BasicTable/ControlledTable';\r\nimport { useDispatch } from 'react-redux';\r\nimport { CellProps } from 'react-table';\r\nimport { IUserBaseDto } from 'api/odata/generated/entities/IUserBaseDto';\r\nimport { useRequestSamplesSlice } from '../../RequestSamplesPage/slice';\r\nimport { IServiceRequestMilestoneDto } from 'api/odata/generated/entities/IServiceRequestMilestoneDto';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { AddonTypesUnion } from 'api/odata/generated/enums/AddonTypes';\r\nimport { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\r\nimport {\r\n ServiceRequestMilestoneChargeDetailsProps,\r\n ServiceRequestMilestoneChargeType,\r\n} from '../ServiceRequestMilestoneChargeDetails';\r\nimport { showAddonCharge, showManualCharge } from './utils';\r\nimport { RowActionsMenu } from 'app/components/BasicTable/RowActions';\r\nimport { DescriptionCell } from 'app/components/BasicTable/components/DescriptionCell';\r\nimport { ColumnWithStrictAccessor } from 'react-table';\r\nimport { IUnitTypeDto } from 'api/odata/generated/entities/IUnitTypeDto';\r\nimport { PageActionRenderer } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { Printing } from 'app/components/PrintToPDF';\r\nimport { InvoiceDetailsSidePanelLink } from 'app/pages/InvoiceDetails/InvoiceDetailsSidePanel';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n\r\nexport interface ServiceRequestAddonsProps {\r\n charges: IServiceRequestMilestoneChargeDto[];\r\n milestone?: IServiceRequestMilestoneDto;\r\n isAdmin: boolean;\r\n AddonType: AddonTypesUnion;\r\n InternalStatus: InternalServiceRequestStatusesUnion;\r\n pageName?: string;\r\n tableContainerSyles?: React.CSSProperties;\r\n // indicates if this component is opened through side panel\r\n printing?: Printing;\r\n useSidePanel: boolean;\r\n}\r\n\r\nexport function ServiceRequestAddons(props: ServiceRequestAddonsProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const columns: Array> = React.useMemo(\r\n () => [\r\n { Header: 'Id', accessor: 'Id' },\r\n {\r\n Header: t(translations.Date) as string,\r\n accessor: 'Date',\r\n\r\n Cell: DateRenderer,\r\n },\r\n {\r\n Header: t(translations.ServiceOrCharge) as string,\r\n accessor: 'Service',\r\n Cell: ({\r\n value,\r\n row,\r\n }: CellProps<\r\n IServiceRequestMilestoneChargeDto,\r\n IConsumableServiceDto\r\n >) => value?.Name ?? row.original.Name ?? t(translations.NA),\r\n },\r\n { Header: t(translations.Quantity) as string, accessor: 'Quantity' },\r\n {\r\n Header: t(translations.Unit) as string,\r\n accessor: 'UnitType',\r\n Cell: ({\r\n value,\r\n row,\r\n }: CellProps) =>\r\n (value ?? row.original.Service?.UnitType)?.Name ?? t(translations.NA),\r\n },\r\n {\r\n Header: t(translations.Rate) as string,\r\n accessor: 'Rate',\r\n Cell: ({ value, row }) => value ?? row.original.Service?.Rate,\r\n },\r\n {\r\n Header: t(translations.Amount) as string,\r\n accessor: 'Amount',\r\n },\r\n {\r\n Header: t(translations.InvoiceId) as string,\r\n accessor: 'InvoiceId',\r\n Cell: ({ value, row }) =>\r\n value !== null && value !== undefined && typeof value === 'number' ? (\r\n \r\n {value}\r\n \r\n ) : (\r\n <>{value}\r\n ),\r\n },\r\n {\r\n Header: t(translations.Remarks) as string,\r\n accessor: 'Remarks',\r\n Cell: DescriptionCell({ width: 'medium' }),\r\n },\r\n {\r\n Header: t(translations.UpdatedBy) as string,\r\n accessor: 'UpdatedBy',\r\n Cell: ({\r\n value,\r\n }: CellProps) =>\r\n value?.Name ?? t(translations.NA),\r\n },\r\n ],\r\n [props.useSidePanel, t],\r\n );\r\n\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n\r\n const show_newAddonCharge = React.useMemo(() => {\r\n const result = showAddonCharge({\r\n Charged: props.milestone?.Charged,\r\n isAdmin: props.isAdmin,\r\n ServiceRequestAddonTypes: props.AddonType,\r\n ServiceRequestInternalStatus: props.InternalStatus,\r\n });\r\n return result;\r\n }, [\r\n props.AddonType,\r\n props.InternalStatus,\r\n props.isAdmin,\r\n props.milestone?.Charged,\r\n ]);\r\n\r\n const show_newManualCharge = React.useMemo(() => {\r\n const result = showManualCharge({\r\n Charged: props.milestone?.Charged,\r\n isAdmin: props.isAdmin,\r\n ServiceRequestAddonTypes: props.AddonType,\r\n ServiceRequestInternalStatus: props.InternalStatus,\r\n });\r\n return result;\r\n }, [\r\n props.AddonType,\r\n props.InternalStatus,\r\n props.isAdmin,\r\n props.milestone?.Charged,\r\n ]);\r\n const handleAddServiceClick = React.useCallback(() => {\r\n if (props.milestone === undefined) {\r\n return;\r\n }\r\n const payload: ServiceRequestMilestoneChargeDetailsProps = {\r\n serviceRequestId: props.milestone?.ServiceRequestId,\r\n serviceRequestMilestoneId: props.milestone.Id,\r\n type: 'service',\r\n enableAddonCharge: show_newAddonCharge,\r\n enableManualCharge: show_newManualCharge,\r\n };\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.ServiceRequestMilestoneCharge,\r\n props: payload,\r\n }),\r\n );\r\n }, [\r\n actions,\r\n dispatch,\r\n props.milestone,\r\n show_newAddonCharge,\r\n show_newManualCharge,\r\n ]);\r\n const handleAddChargeClick = React.useCallback(() => {\r\n if (props.milestone === undefined) {\r\n return;\r\n }\r\n const payload: ServiceRequestMilestoneChargeDetailsProps = {\r\n serviceRequestId: props.milestone?.ServiceRequestId,\r\n serviceRequestMilestoneId: props.milestone.Id,\r\n type: 'charge',\r\n enableAddonCharge: show_newAddonCharge,\r\n enableManualCharge: show_newManualCharge,\r\n };\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.ServiceRequestMilestoneCharge,\r\n props: payload,\r\n }),\r\n );\r\n }, [\r\n actions,\r\n dispatch,\r\n props.milestone,\r\n show_newAddonCharge,\r\n show_newManualCharge,\r\n ]);\r\n const handleEditClick = React.useCallback(\r\n (value: IServiceRequestMilestoneChargeDto) => {\r\n if (props.milestone === undefined) {\r\n return;\r\n }\r\n const type: ServiceRequestMilestoneChargeType =\r\n value.OfflineServiceTypeId === null ? 'charge' : 'service';\r\n const payload: ServiceRequestMilestoneChargeDetailsProps = {\r\n serviceRequestId: props.milestone?.ServiceRequestId,\r\n serviceRequestMilestoneId: props.milestone.Id,\r\n type: type,\r\n enableAddonCharge: show_newAddonCharge,\r\n enableManualCharge: show_newManualCharge,\r\n value: value,\r\n };\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.ServiceRequestMilestoneCharge,\r\n props: payload,\r\n }),\r\n );\r\n },\r\n [\r\n actions,\r\n dispatch,\r\n props.milestone,\r\n show_newAddonCharge,\r\n show_newManualCharge,\r\n ],\r\n );\r\n\r\n const handleDeleteClick = React.useCallback(\r\n (value: IServiceRequestMilestoneChargeDto) => {\r\n dispatch(actions.deleteMilestoneCharge(value));\r\n },\r\n [actions, dispatch],\r\n );\r\n const rowActions = React.useMemo(() => {\r\n if (show_newAddonCharge) {\r\n return [\r\n ({ value, row, updateMyData }) =>\r\n show_newAddonCharge && (\r\n Promise.resolve(handleEditClick(row.original)),\r\n },\r\n {\r\n icon: 'times',\r\n text: t(translations.Delete),\r\n title: t(translations.Delete),\r\n onClick: () =>\r\n Promise.resolve(handleDeleteClick(row.original)),\r\n },\r\n ]}\r\n />\r\n ),\r\n ];\r\n }\r\n }, [handleDeleteClick, handleEditClick, show_newAddonCharge, t]);\r\n const pageActions: PageActionRenderer[] = React.useMemo(() => {\r\n const result: PageActionRenderer[] = [];\r\n if (show_newManualCharge) {\r\n result.push(() => (\r\n \r\n ));\r\n }\r\n if (show_newAddonCharge) {\r\n result.push(() => (\r\n \r\n ));\r\n }\r\n return result;\r\n }, [\r\n handleAddChargeClick,\r\n handleAddServiceClick,\r\n show_newAddonCharge,\r\n show_newManualCharge,\r\n t,\r\n ]);\r\n return (\r\n <>\r\n \r\n columns={columns as Array>}\r\n //withToolBar={false}\r\n data={props.charges ?? []}\r\n useRowSelect={false}\r\n hideMenuOnMobile={true}\r\n screenName={props.pageName ?? t(translations.AddOnServices)}\r\n useGlobalFilter={false}\r\n api={'foo'}\r\n customEmptyTableSettings={{\r\n headTitle: t(translations.dash_EmptyWidgetTitle),\r\n title:\r\n show_newAddonCharge || show_newManualCharge\r\n ? t(translations.AddonCharges_Empty_AddEnabled)\r\n : undefined,\r\n }}\r\n manualPagination={false}\r\n manualSorting={false}\r\n compactTable={false}\r\n enablePagination={false}\r\n compact={isMobile}\r\n screenNameVariant=\"section\"\r\n dataLength={props.charges?.length ?? 0}\r\n loading={props.charges === undefined}\r\n onChangeState={() => void 0}\r\n onExport={() => Promise.resolve()}\r\n useExport={false}\r\n pageCount={123}\r\n initialPageSize={1000}\r\n serviceGroups={[]}\r\n rowActions={rowActions}\r\n pageActions={pageActions}\r\n tableContainerSyles={props.tableContainerSyles}\r\n printing={props.printing}\r\n />\r\n \r\n );\r\n}\r\n// const Container = styled(Box)(({ theme }) => ({\r\n// // margin is needed here to replace the containing cell padding because of a disappearing border there\r\n// margin: theme.spacing(2),\r\n// }));\r\n// const ButtonsContainer = styled(Box)(({ theme }) => ({\r\n// display: 'flex',\r\n// gap: theme.spacing(1),\r\n// marginTop: theme.spacing(1),\r\n// }));\r\n","import { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\r\nimport { AddonTypesUnion } from 'api/odata/generated/enums/AddonTypes';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\n\r\nexport interface showAddonChargeProps {\r\n ServiceRequestInternalStatus: InternalServiceRequestStatusesUnion;\r\n Charged?: boolean;\r\n ServiceRequestAddonTypes: AddonTypesUnion;\r\n isAdmin: boolean;\r\n}\r\nexport function showAddonCharge(props: showAddonChargeProps) {\r\n if (props.Charged === true) {\r\n return false;\r\n }\r\n if (props.ServiceRequestInternalStatus === 'Completed') {\r\n return false;\r\n }\r\n\r\n if (!props.isAdmin) {\r\n const userEditableStatuses: Array = [\r\n 'Draft',\r\n 'ReturnedToUser',\r\n ];\r\n if (!userEditableStatuses.includes(props.ServiceRequestInternalStatus)) {\r\n return false;\r\n }\r\n }\r\n\r\n switch (props.ServiceRequestAddonTypes) {\r\n case 'Addons':\r\n case 'Milestones':\r\n return props.isAdmin;\r\n case 'UserAddons':\r\n return true;\r\n case 'NA':\r\n return false;\r\n default:\r\n assertExhaustive(props.ServiceRequestAddonTypes);\r\n }\r\n}\r\n\r\nexport function showManualCharge(props: showAddonChargeProps) {\r\n if (props.ServiceRequestAddonTypes === 'Milestones') {\r\n return !props.Charged && props.isAdmin;\r\n } else {\r\n return false;\r\n }\r\n}\r\n","/**\r\n *\r\n * PriorityPicker\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n Chip,\r\n ChipProps,\r\n Menu,\r\n MenuItem,\r\n Theme,\r\n makeStyles,\r\n} from '@material-ui/core';\r\nimport {\r\n ServiceRequestMilestoneStatusesUnionArray,\r\n ServiceRequestMilestoneStatusesUnion,\r\n} from 'api/odata/generated/enums/ServiceRequestMilestoneStatuses';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { TypeColor, getColor } from 'styles/colors/types';\r\n\r\nexport interface ServiceRequestMilestoneStatusMenuPickerProps {\r\n name?: string;\r\n value: ServiceRequestMilestoneStatusesUnion;\r\n onChange: (value: ServiceRequestMilestoneStatusesUnion) => void;\r\n}\r\nexport function ServiceRequestMilestoneStatusMenuPicker({\r\n onChange,\r\n ...props\r\n}: ServiceRequestMilestoneStatusMenuPickerProps) {\r\n const { t } = useTranslation();\r\n\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const handleChipClick = event => {\r\n console.debug(event);\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n const getChipColor = (\r\n status: ServiceRequestMilestoneStatusesUnion,\r\n ): TypeColor => {\r\n switch (status) {\r\n case 'Completed':\r\n return 'success';\r\n case 'NotStarted':\r\n return 'default';\r\n case 'Started':\r\n return 'info';\r\n }\r\n };\r\n const handleMenuItemClick = (\r\n status: ServiceRequestMilestoneStatusesUnion,\r\n ) => {\r\n onChange(status);\r\n handleClose();\r\n };\r\n return (\r\n <>\r\n \r\n \r\n {ServiceRequestMilestoneStatusesUnionArray.map(status => (\r\n handleMenuItemClick(status)}>\r\n {t(status) ?? status}\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\nconst StyledChip = ({\r\n color,\r\n ...props\r\n}: Omit & { color: TypeColor }) => {\r\n const classes = useStyles({ color: color });\r\n return ;\r\n};\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n backgroundColor: props => getColor(theme, props.color, 'light'),\r\n color: props => getColor(theme, props.color, 'dark'),\r\n '&:hover, &:focus': {\r\n backgroundColor: props => getColor(theme, props.color, 'bgHover'),\r\n color: props => getColor(theme, props.color, 'textHover'),\r\n },\r\n },\r\n}));\r\n","/**\r\n *\r\n * ServiceRequestMilestones\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { AddonTypesUnion } from 'api/odata/generated/enums/AddonTypes';\r\nimport { IServiceRequestMilestoneDto } from 'api/odata/generated/entities/IServiceRequestMilestoneDto';\r\nimport { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableRow,\r\n makeStyles,\r\n styled,\r\n TableContainer,\r\n} from '@material-ui/core';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport produce from 'immer';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useRequestSamplesSlice } from '../../RequestSamplesPage/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { ServiceRequestMilestoneDetailsProps } from '../ServiceRequestMilestoneDetails';\r\nimport { RowActionsMenu } from 'app/components/BasicTable/RowActions';\r\nimport { InvoiceDetailsSidePanelLink } from 'app/pages/InvoiceDetails/InvoiceDetailsSidePanel';\r\nimport { sum } from 'lodash';\r\nimport { ServiceRequestAddons } from '../ServiceRequestAddons';\r\nimport { ServiceRequestMilestoneStatusesUnion } from 'api/odata/generated/enums/ServiceRequestMilestoneStatuses';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { TruncatedDescriptionText } from 'app/components/Description';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { ServiceRequestMilestoneStatusMenuPicker } from 'app/components/pickers/StaticOptionsPickers/ServiceRequestMilestoneStatusMenuPicker';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { TableToolbar } from 'app/components/BasicTable/BasicFilter/TableToolbar';\r\nimport clsx from 'clsx';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport { Body } from 'app/components/Typography';\r\nimport { Printing } from 'app/components/PrintToPDF';\r\n\r\nexport interface ServiceRequestMilestonesProps {\r\n milestones?: Array;\r\n isAdmin: boolean;\r\n AddonType: AddonTypesUnion;\r\n InternalStatus: InternalServiceRequestStatusesUnion;\r\n ServiceRequestId: number;\r\n pageName?: string;\r\n tableContainerSyles?: React.CSSProperties;\r\n // indicates if this component is opened through side panel\r\n printing?: Printing;\r\n useSidePanel: boolean;\r\n}\r\n\r\ninterface IState {\r\n expanded: Record;\r\n}\r\n\r\nexport function ServiceRequestMilestones({\r\n milestones,\r\n pageName,\r\n tableContainerSyles,\r\n useSidePanel,\r\n ...props\r\n}: ServiceRequestMilestonesProps) {\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const [state, , extendState] = useAsyncExtendedState({\r\n expanded: {},\r\n });\r\n const { checkIsMobile } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n const handleToggleClick = (id: number, expand: boolean) => {\r\n extendState(state => {\r\n const n = produce(expanded => {\r\n expanded[id] = expand;\r\n })(state.expanded);\r\n\r\n return { expanded: n };\r\n });\r\n };\r\n const handleAddMilestoneClick = React.useCallback(() => {\r\n const sidePanelProps: ServiceRequestMilestoneDetailsProps = {\r\n serviceRequestId: props.ServiceRequestId,\r\n type: 'Insert',\r\n };\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.ServiceRequestMilestone,\r\n props: sidePanelProps,\r\n }),\r\n );\r\n }, [actions, dispatch, props.ServiceRequestId]);\r\n\r\n const handleEditClick = React.useCallback(\r\n (milestone: IServiceRequestMilestoneDto) => {\r\n const sidePanelProps: ServiceRequestMilestoneDetailsProps = {\r\n serviceRequestId: props.ServiceRequestId,\r\n type: 'Update',\r\n value: milestone,\r\n };\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.ServiceRequestMilestone,\r\n props: sidePanelProps,\r\n }),\r\n );\r\n },\r\n [actions, dispatch, props.ServiceRequestId],\r\n );\r\n const handleDeleteClick = React.useCallback(\r\n (milestone: IServiceRequestMilestoneDto) => {\r\n dispatch(actions.deleteMilestone(milestone));\r\n },\r\n [actions, dispatch],\r\n );\r\n const columnsCount = 9;\r\n const showActionsColumn =\r\n props.isAdmin &&\r\n milestones?.some(milestone => (milestone.InvoiceId ?? 0) === 0);\r\n const colSpan = columnsCount + (showActionsColumn ? 1 : 0);\r\n const handleStatusChange = (\r\n milestone: IServiceRequestMilestoneDto,\r\n value: ServiceRequestMilestoneStatusesUnion | null,\r\n ) => {\r\n if (value !== null) {\r\n dispatch(\r\n actions.updateMilestone({\r\n ...milestone,\r\n ...{ Status: value },\r\n }),\r\n );\r\n }\r\n };\r\n const print = React.useMemo(() => {\r\n return props.printing !== undefined && props.printing.printing === true;\r\n }, [props.printing]);\r\n return (\r\n \r\n \r\n {milestones?.length} {t(translations.Records)}\r\n \r\n }\r\n >\r\n {print === false ? (\r\n <>\r\n {props.isAdmin && (\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 {t(translations.Milestone)}\r\n \r\n \r\n {t(translations.TargetDate)}\r\n \r\n {t(translations.Total)}\r\n \r\n {t(translations.AssignedTo)}\r\n \r\n \r\n {t(translations.CompletionDate)}\r\n \r\n \r\n {t(translations.Description)}\r\n \r\n \r\n {t(translations.InvoiceId)}\r\n \r\n {t(translations.Status)}\r\n {showActionsColumn && }\r\n \r\n \r\n \r\n {milestones?.map(milestone => {\r\n const isExpanded = state.expanded[milestone.Id] === true;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n handleToggleClick(milestone.Id, !isExpanded)\r\n }\r\n >\r\n \r\n \r\n \r\n {milestone.Name}\r\n \r\n {dateUtils.shortDateFormat(milestone.TargetDate)}\r\n \r\n \r\n {sum(\r\n milestone.ServiceRequestMilestoneCharges.map(\r\n f => f.Amount ?? 0,\r\n ),\r\n )}\r\n \r\n \r\n {milestone.Assignees?.map(f => f.Name)?.join(', ')}\r\n \r\n \r\n {dateUtils.shortDateFormat(milestone.CompletionDate)}\r\n \r\n \r\n \r\n \r\n \r\n {milestone.InvoiceId !== null && (\r\n \r\n {milestone.InvoiceId}\r\n \r\n )}\r\n \r\n \r\n {milestone.Status !== null &&\r\n (props.isAdmin && milestone.InvoiceId === null ? (\r\n \r\n handleStatusChange(milestone, value)\r\n }\r\n />\r\n ) : (\r\n t(milestone.Status)\r\n ))}\r\n \r\n\r\n {showActionsColumn && (\r\n \r\n {milestone.InvoiceId === null && (\r\n \r\n Promise.resolve(handleEditClick(milestone)),\r\n },\r\n {\r\n icon: 'times',\r\n text: t(translations.Delete),\r\n title: t(translations.Delete),\r\n onClick: () =>\r\n Promise.resolve(\r\n handleDeleteClick(milestone),\r\n ),\r\n },\r\n ]}\r\n />\r\n )}\r\n \r\n )}\r\n \r\n {isExpanded && (\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\nconst ServicesRow = styled(TableCell)(({ theme }) => ({\r\n // setting the background color on the cell causes it's borders to disappear\r\n backgroundColor: theme.palette.background.default,\r\n backgroundClip: 'content-box',\r\n // unsets 56px cell height set on TableCell\r\n height: 'unset',\r\n padding: '1px',\r\n}));\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n table: {\r\n backgroundColor: theme.palette.background.paper,\r\n width: '100%',\r\n whiteSpace: 'pre',\r\n },\r\n tableContent: {\r\n padding: theme.spacing(0, 4, 4),\r\n },\r\n tableContentShort: {\r\n padding: theme.spacing(0, 2),\r\n },\r\n tableScrolling: {\r\n width: '100%',\r\n overflow: 'auto',\r\n '&::-webkit-scrollbar': {\r\n height: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n boxShadow: `inset 0 0 2px ${theme.palette.common.grayBorders}`,\r\n borderRadius: '6px',\r\n backgroundColor: theme.palette.common.grayBorders,\r\n },\r\n },\r\n}));\r\n\r\n// interface ToolbarProps {\r\n// left?: React.ReactNode;\r\n// right?: React.ReactNode;\r\n// }\r\n\r\n// function Toolbar(props: ToolbarProps) {\r\n// return (\r\n// \r\n// {props.left}\r\n// {props.right}\r\n// \r\n// );\r\n// }\r\n// const Container = styled(Box)(({ theme }) => ({\r\n// margin: theme.spacing(1),\r\n// display: 'flex',\r\n// justifyContent: 'space-between',\r\n// alignItems: 'center',\r\n// }));\r\n","import * as React from 'react';\r\nimport { AddonTypesUnion } from 'api/odata/generated/enums/AddonTypes';\r\nimport { ServiceRequestMilestones } from '../ServiceRequestMilestones';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectServiceRequestMilestones } from '../../RequestSamplesPage/slice/selectors';\r\nimport { ServiceRequestAddons } from '../ServiceRequestAddons';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { IServiceRequestMilestoneDto } from 'api/odata/generated/entities/IServiceRequestMilestoneDto';\r\nimport { IServiceRequestMilestoneChargeDto } from 'api/odata/generated/entities/IServiceRequestMilestoneChargeDto';\r\nimport { useRequestSamplesSlice } from '../../RequestSamplesPage/slice';\r\nimport { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\r\nimport { TableRowsSkeleton } from 'app/components/BasicTable/components/TableSkeleton';\r\nimport { Printing } from 'app/components/PrintToPDF';\r\n\r\nexport interface ServiceRequestMilestonesSectionProps {\r\n AddonType: AddonTypesUnion;\r\n ServiceRequestId: number;\r\n isAdmin: boolean;\r\n InternalStatus: InternalServiceRequestStatusesUnion;\r\n pageName?: string;\r\n tableContainerStyles?: React.CSSProperties;\r\n // indicates if this component is opened through side panel\r\n printing?: Printing;\r\n useSidePanel: boolean;\r\n}\r\n\r\nexport function ServiceRequestMilestonesSection(\r\n props: ServiceRequestMilestonesSectionProps,\r\n) {\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n React.useEffect(() => {\r\n dispatch(actions.loadMilestones({ Id: props.ServiceRequestId }));\r\n }, [actions, dispatch, props.ServiceRequestId]);\r\n const milestones = useSelector(selectServiceRequestMilestones);\r\n const data = React.useMemo(() => {\r\n switch (props.AddonType) {\r\n case 'Milestones':\r\n return milestones;\r\n case 'Addons':\r\n case 'UserAddons':\r\n return milestones?.flatMap(f => f.ServiceRequestMilestoneCharges);\r\n case 'NA':\r\n return undefined;\r\n default:\r\n assertExhaustive(props.AddonType);\r\n }\r\n }, [milestones, props.AddonType]);\r\n\r\n const print = React.useMemo(() => {\r\n return props.printing !== undefined && props.printing.printing === true;\r\n }, [props.printing]);\r\n React.useEffect(() => {\r\n if (\r\n props.printing !== undefined &&\r\n print &&\r\n props.printing.onLoading !== undefined\r\n ) {\r\n props.printing.onLoading(props.printing.id, milestones === undefined);\r\n }\r\n }, [milestones, print, props.printing]);\r\n\r\n if (milestones === undefined) {\r\n return ;\r\n }\r\n\r\n switch (props.AddonType) {\r\n case 'Milestones':\r\n return (\r\n \r\n );\r\n case 'Addons':\r\n case 'UserAddons':\r\n return (\r\n \r\n );\r\n case 'NA':\r\n return <>Milestones are disabled for this service;\r\n default:\r\n assertExhaustive(props.AddonType);\r\n }\r\n}\r\n","import { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useRequestSamplesSlice } from '../../slice';\r\nimport { Identifiable } from 'types/common';\r\n\r\nexport interface CloneServiceRequestButtonProps {\r\n item?: Identifiable;\r\n}\r\nexport function CloneServiceRequestButton(\r\n props: CloneServiceRequestButtonProps,\r\n) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n\r\n const handleCloneButtonClick = React.useCallback(() => {\r\n if (props.item !== undefined) {\r\n dispatch(actions.cloneServiceRequest(props.item.Id));\r\n }\r\n }, [actions, dispatch, props.item]);\r\n\r\n if (props.item === undefined) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n selectServiceRequestCustomFormColumns,\r\n selectServiceRequestRowInsertStatus,\r\n} from 'app/pages/Samples/RequestSamplesPage/slice/selectors';\r\nimport {\r\n IServiceRequestRelated,\r\n IServiceRequestTableFormComponent,\r\n} from '../..';\r\nimport {\r\n prepareServiceRequestRowModel,\r\n serviceRequestModelToDto,\r\n} from 'app/pages/Samples/RequestSamplesPage/slice/prepareServiceRequestRowModel';\r\nimport { IServiceRequestRowDto } from 'api/odata/generated/entities/IServiceRequestRowDto';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IServiceRequestTableRowModel } from 'app/pages/Samples/RequestSamplesPage/slice/types';\r\nimport { ArrayHelpers } from 'formik';\r\nimport { omit } from 'lodash';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { ServiceRequestTableColumnsCollection } from 'app/pages/Samples/RequestSamplesPage/slice/utils/ServiceRequestTableColumn';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\n\r\nexport interface AddServiceRequestRowButtonProps\r\n extends IServiceRequestTableFormComponent,\r\n IServiceRequestRelated {\r\n /**\r\n * Should be connected to service request's edit-ability state\r\n */\r\n disabled: boolean;\r\n}\r\nexport function AddServiceRequestRowButton({\r\n serviceRequestId,\r\n ...props\r\n}: AddServiceRequestRowButtonProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const processing = useSelector(selectServiceRequestRowInsertStatus);\r\n const columns = useSelector(selectServiceRequestCustomFormColumns);\r\n const handleCreateButtonClick: React.MouseEventHandler = React.useCallback(\r\n async e => {\r\n if (serviceRequestId === undefined) {\r\n return;\r\n }\r\n if (columns === null) {\r\n return;\r\n }\r\n try {\r\n await AddNewCustomTableRow({\r\n index: 0,\r\n serviceRequestId,\r\n columns,\r\n model: {\r\n ServiceRequestId: serviceRequestId,\r\n },\r\n arrayHelpers: props.arrayHelpers,\r\n });\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: t(translations.ServiceRequestRow_InsertSuccess),\r\n }),\r\n );\r\n } catch (error) {\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: t(translations.ServiceRequestRow_InsertError),\r\n }),\r\n );\r\n }\r\n },\r\n [columns, dispatch, props.arrayHelpers, serviceRequestId, t],\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\nexport async function AddNewCustomTableRow(props: {\r\n serviceRequestId: number;\r\n columns: ServiceRequestTableColumnsCollection;\r\n arrayHelpers: ArrayHelpers;\r\n model: Partial;\r\n index: number | undefined;\r\n}) {\r\n const url = `api/odata/v4/ServiceRequests(${props.serviceRequestId})/Rows`;\r\n const dto = serviceRequestModelToDto(props.model, props.columns);\r\n const response: IServiceRequestRowDto = await httpClient.post(\r\n url,\r\n omit(dto, '@odata.context'),\r\n {\r\n params: { $expand: 'Status' },\r\n },\r\n );\r\n const models = prepareServiceRequestRowModel([response], props.columns);\r\n models.forEach(item => {\r\n props.arrayHelpers.insert(props.index ?? 0, item);\r\n });\r\n}\r\n","import { IServiceRequestRowValueDto } from 'api/odata/generated/entities/IServiceRequestRowValueDto';\r\nimport { IServiceRequestRowDto } from 'api/odata/generated/entities/IServiceRequestRowDto';\r\nimport * as React from 'react';\r\nimport {\r\n EditorProps,\r\n EditableCellProps,\r\n} from '../../EditableTable/EditableCell/index';\r\nimport { FastFieldProps, getIn } from 'formik';\r\nimport {\r\n CustomFormColumnTypes,\r\n IServiceRequestTableRowModel,\r\n} from '../../RequestSamplesPage/slice/types';\r\nimport { Column } from 'react-table';\r\nimport { ServiceRequestTableColumn } from '../../RequestSamplesPage/slice/utils/ServiceRequestTableColumn';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\n\r\n/**\r\n * Custom function passed through react-table for updating row values\r\n */\r\nexport type UpdateServiceRequestRowValue = (props: {\r\n serviceRequestRowId: number;\r\n columnId: number;\r\n value: TValue;\r\n}) => void;\r\n\r\nexport interface IServiceRequestRowEditableCellProps\r\n extends EditableCellProps<\r\n IServiceRequestRowValueDto,\r\n Column,\r\n IServiceRequestRowDto\r\n > {\r\n fieldProps: FastFieldProps;\r\n}\r\nexport function ServiceRequestRowEditableCell(\r\n WrappedComponent: React.FunctionComponent>,\r\n props: {\r\n column: ServiceRequestTableColumn;\r\n focused?: boolean;\r\n },\r\n) {\r\n return React.memo(function Comp({\r\n value: initialValue,\r\n row,\r\n column,\r\n updateMyData, // This is a custom function that we supplied to our table instance\r\n fieldProps,\r\n }: IServiceRequestRowEditableCellProps) {\r\n const name = fieldProps?.field.name;\r\n const handleBlur = event => {\r\n event.target.name = name;\r\n fieldProps?.field.onBlur(event);\r\n };\r\n\r\n /**\r\n * debounced handleChange intended to reduce the number of rerenders & http requests in text based fields.\r\n */\r\n const { value, handleChange } = useDebounce({\r\n value: fieldProps.field.value,\r\n timeout: getDebounceValue(props.column.ColumnType),\r\n handleChange: value => {\r\n try {\r\n // updates form value\r\n fieldProps?.field.onChange({\r\n target: { value: value, name },\r\n });\r\n\r\n // clear child columns values (connected dropdowns)\r\n props.column.Children?.forEach(childColumn => {\r\n fieldProps?.form.setFieldValue(\r\n getServiceRequestRowFieldName(\r\n row.index,\r\n childColumn.getFieldName(),\r\n ),\r\n null,\r\n );\r\n });\r\n\r\n // persists data on the server\r\n updateMyData({\r\n columnId: props.column.Id,\r\n value: value,\r\n serviceRequestRowId: row.original.Id,\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n },\r\n });\r\n\r\n /**\r\n * after arrayHelpers.insert, the new row gets inserted with null as the validation error on the whole row\r\n * e.g. formik.errors become (notice null as the first element in the array)\r\n * {\r\n \"friends\": [\r\n null,\r\n {\r\n \"Values\": {\r\n \"column_1006\": \"Positive Decimal must be greater than or equal to 0\",\r\n \"column_1008\": \"Email must be a valid email\"\r\n }\r\n }\r\n ]\r\n }\r\n */\r\n const hasError = !isNullOrUndefined(fieldProps?.meta?.error);\r\n\r\n /**\r\n * parent value - extracted from the current row according to column configuration. used for connected drop downs.\r\n */\r\n const parentValue =\r\n props.column.Parent === null\r\n ? undefined\r\n : getIn(\r\n fieldProps?.form.values,\r\n getServiceRequestRowFieldName(\r\n row.index,\r\n props.column.Parent.getFieldName(),\r\n ),\r\n ) ?? undefined;\r\n return (\r\n <>\r\n \r\n \r\n );\r\n });\r\n}\r\nexport function getServiceRequestRowName(\r\n rowIndex: number,\r\n key: keyof IServiceRequestTableRowModel,\r\n) {\r\n return `Rows[${rowIndex}]${key}`;\r\n}\r\nexport function getServiceRequestRowFieldName(\r\n rowIndex: number,\r\n columnFieldName: string,\r\n) {\r\n return `${getServiceRequestRowName(rowIndex, 'Values')}[${columnFieldName}]`;\r\n}\r\n\r\nfunction getDebounceValue(columnType: CustomFormColumnTypes) {\r\n switch (columnType) {\r\n case 'CheckBox':\r\n case 'Date':\r\n case 'DropDownList':\r\n case 'UserSelection':\r\n case 'Serial':\r\n return;\r\n case 'Email':\r\n case 'Number':\r\n case 'PositiveDecimal':\r\n case 'PositiveInteger':\r\n case 'ShortText':\r\n return 100;\r\n default:\r\n assertExhaustive(columnType);\r\n }\r\n}\r\n\r\ninterface useDebounceProps {\r\n value: any;\r\n handleChange: (value: any) => void;\r\n timeout?: number;\r\n}\r\nfunction useDebounce(props: useDebounceProps) {\r\n // tracks inner state in between the debounced updates\r\n const [innerValue, setInnerValue] = React.useState(props.value);\r\n\r\n // sync value changes from the outside of current field\r\n React.useEffect(() => {\r\n setInnerValue(props.value);\r\n }, [props.value]);\r\n\r\n // active timeout tracker\r\n const timeout = React.useRef();\r\n\r\n if (props.timeout === undefined || props.timeout <= 0) {\r\n return props;\r\n }\r\n\r\n return {\r\n value: innerValue,\r\n handleChange: value => {\r\n setInnerValue(value);\r\n if (timeout.current !== undefined) {\r\n clearTimeout(timeout.current);\r\n }\r\n\r\n timeout.current = setTimeout(() => {\r\n props.handleChange(value);\r\n timeout.current = undefined;\r\n }, props.timeout);\r\n },\r\n };\r\n}\r\n","import * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { EditorProps } from '../../EditableCell';\r\nimport { Autocomplete, AutocompleteProps, Value } from '@material-ui/lab';\r\nimport { TextField } from 'app/components/TextField';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { InputAdornment } from '@material-ui/core';\r\nimport { omit } from 'lodash';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\n\r\n// 'DropDownList':\r\nexport interface IWithOptions> {\r\n options: TEntity[];\r\n}\r\nexport interface DropDownListProps>\r\n extends Omit, 'value'>,\r\n IWithOptions {\r\n value: EditorProps['value'] | null;\r\n}\r\n\r\n/**\r\n * Injects options into options prop of a component e.g DropDownList above\r\n * @param Component component that accepts options array\r\n * @param options options\r\n * @returns\r\n */\r\nexport function withOptions, TProps>(\r\n Component: React.FC>,\r\n options: IWithOptions['options'],\r\n): React.FC {\r\n const WithOptionsComponent = (props: TProps) => {\r\n return ;\r\n };\r\n\r\n return WithOptionsComponent;\r\n}\r\n\r\nexport interface SRSelectProps<\r\n TKey,\r\n T extends Entity,\r\n Multiple extends boolean | undefined\r\n> extends Omit<\r\n AutocompleteProps,\r\n | 'onChange'\r\n | 'getOptionLabel'\r\n | 'getOptionSelected'\r\n | 'filterOptions'\r\n | 'renderInput'\r\n | 'options'\r\n >,\r\n IWithOptions {\r\n onChange: (value: Value) => void;\r\n parentValue?: any;\r\n error?: boolean;\r\n helperText?: string;\r\n info?: string;\r\n autoFocus?: boolean;\r\n}\r\n\r\nexport function SRSelect<\r\n TKey,\r\n T extends Entity,\r\n Multiple extends boolean | undefined\r\n>({\r\n parentValue,\r\n onChange,\r\n error,\r\n helperText,\r\n info,\r\n autoFocus,\r\n ...props\r\n}: SRSelectProps) {\r\n return (\r\n <>\r\n {\r\n onChange?.(value);\r\n }}\r\n value={props.value ?? undefined}\r\n getOptionLabel={option => option.Name}\r\n className=\"atable\"\r\n getOptionSelected={(a, b) => a?.Id === b?.Id}\r\n size=\"small\"\r\n renderInput={params => (\r\n \r\n {params.InputProps.startAdornment}\r\n {!!info && info !== '' && (\r\n \r\n )}\r\n {error && (\r\n \r\n )}\r\n \r\n ) : (\r\n params.InputProps.startAdornment\r\n ),\r\n\r\n ...omit(params.InputProps, 'startAdornment'),\r\n }}\r\n variant=\"standard\"\r\n error={error}\r\n />\r\n )}\r\n {...props}\r\n />\r\n \r\n );\r\n}\r\n","import { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { getGetUserSelectionsAutocompleteFn } from 'app/components/CustomForm/CustomFormFields/CustomFormUserSelection';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { IWithOptions, SRSelectProps } from './index';\r\nimport { useAsyncOptions } from './useAsyncOptions';\r\n\r\n/**\r\n * Injects async options into options prop of a component e.g DropDownList above\r\n * @param Component component that accepts options array\r\n * @param options options\r\n * @returns\r\n */\r\nexport function withAsyncOptions<\r\n TKey,\r\n TEntity extends Entity,\r\n TMultiple extends boolean | undefined,\r\n TProps extends SRSelectProps\r\n>(\r\n Component: React.FC>,\r\n hocProps: {\r\n multiple: TMultiple;\r\n } & Pick,\r\n): React.FC {\r\n const WithOptionsComponent = ({ ...props }: TProps) => {\r\n const fetchOptionsCallback = React.useCallback(async search => {\r\n const fn = getGetUserSelectionsAutocompleteFn({\r\n CustomRoles: hocProps.CustomRoles,\r\n FixedRoles: hocProps.FixedRoles,\r\n UserSelectionType: hocProps.UserSelectionType,\r\n });\r\n const options = await fn(search);\r\n return options;\r\n }, []);\r\n const asyncOptionProps = useAsyncOptions>({\r\n fetchOptions: fetchOptionsCallback,\r\n });\r\n return (\r\n \r\n );\r\n };\r\n\r\n return WithOptionsComponent;\r\n}\r\n","import * as React from 'react';\r\nimport { usePromise } from 'app/hooks/usePromise';\r\nimport { useAsyncExtendedState } from 'app/hooks/useAsyncAwaitedState';\r\nimport { debounce } from 'lodash';\r\n\r\nexport interface useAsyncOptionsProps {\r\n fetchOptions: (search: string) => Promise>;\r\n}\r\n\r\nexport interface IState {\r\n async: boolean;\r\n options: TOption[];\r\n open: boolean;\r\n search: string | null;\r\n}\r\n\r\nexport function useAsyncOptions(\r\n options: useAsyncOptionsProps,\r\n) {\r\n const [state, , extendState] = useAsyncExtendedState>({\r\n search: null,\r\n async: !Array.isArray(options),\r\n options: Array.isArray(options) ? options : [],\r\n open: false,\r\n });\r\n\r\n const optionsPromise = React.useCallback(\r\n async search => {\r\n if (Array.isArray(options)) {\r\n return { options: options };\r\n } else {\r\n const response = await options.fetchOptions(search);\r\n return { options: response };\r\n }\r\n },\r\n [options],\r\n );\r\n const [promiseState, fetch] = usePromise(optionsPromise);\r\n\r\n const debounced = React.useMemo(() => {\r\n //debounced?.cancel();\r\n return debounce(\r\n e => {\r\n console.debug('foo zz');\r\n extendState(fetch(e.target.value));\r\n },\r\n 250,\r\n {\r\n trailing: true,\r\n maxWait: 2500,\r\n },\r\n );\r\n }, [extendState, fetch]);\r\n\r\n const handleInputChange = e => {\r\n console.debug('handleInputChange', e);\r\n if (e === null) {\r\n return;\r\n }\r\n extendState({ search: e.target.value });\r\n promiseState.reset();\r\n debounced(e);\r\n };\r\n\r\n const handleOpen = () => {\r\n extendState({ open: true });\r\n extendState(fetch(null));\r\n };\r\n\r\n return {\r\n onOpen: handleOpen,\r\n onInputChange: handleInputChange,\r\n options: state.options,\r\n loading: promiseState.status !== 'resolved',\r\n };\r\n}\r\n","import * as React from 'react';\r\nimport { EditorProps } from '../EditableCell';\r\nimport { IServiceRequestTableColumnModel } from '../../RequestSamplesPage/slice/types';\r\nimport { DateField } from './DateField';\r\nimport { NumberField, withMinMax } from './NumberField';\r\nimport { TextField } from './TextField';\r\nimport { SRSelect, withOptions } from './DropDownList';\r\nimport { IFormFieldOptionDto } from 'api/odata/generated/entities/IFormFieldOptionDto';\r\nimport { withAsyncOptions } from './DropDownList/IWithAsyncOptions';\r\n\r\nexport function getCellComponent(\r\n props: IServiceRequestTableColumnModel,\r\n): React.FC & any> | null {\r\n switch (props.ColumnType) {\r\n case 'ShortText':\r\n return TextField;\r\n /* Drop Down List */\r\n case 'DropDownList':\r\n return withOptions<\r\n string,\r\n IFormFieldOptionDto,\r\n EditorProps | null>\r\n >(SRSelect, props.Options ?? []);\r\n case 'UserSelection':\r\n return withAsyncOptions(SRSelect, {\r\n CustomRoles: props.CustomRoles,\r\n FixedRoles: props.FixedRoles,\r\n UserSelectionType: props.UserSelectionType,\r\n multiple: props.IsMultiple,\r\n });\r\n //return CustomFormDropDown\r\n /* User Selection */\r\n // case 'UserSelection':\r\n // return UserPickerField;\r\n /* Project Name */\r\n case 'Number':\r\n return withMinMax(NumberField, {\r\n min: -props.SizeLimit,\r\n max: props.SizeLimit,\r\n step: 0.01,\r\n });\r\n /* Positive Integer */\r\n case 'PositiveInteger':\r\n return withMinMax(NumberField, {\r\n min: 0,\r\n max: props.SizeLimit,\r\n step: 1,\r\n });\r\n /* Positive Decimal */\r\n case 'PositiveDecimal':\r\n return withMinMax(NumberField, {\r\n min: 0,\r\n max: props.SizeLimit,\r\n step: 0.01,\r\n });\r\n /* Date */\r\n case 'Date':\r\n return DateField;\r\n /* Email */\r\n case 'Email':\r\n return TextField;\r\n /* Serial */\r\n case 'Serial':\r\n return null;\r\n default:\r\n return null;\r\n }\r\n}\r\n","import { CustomFormColumnTypes } from '../../RequestSamplesPage/slice/types';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { Entity } from 'types/common';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\n\r\nexport function getValueRenderer(props: { columnType: CustomFormColumnTypes }) {\r\n switch (props.columnType) {\r\n case 'CheckBox':\r\n return (value: boolean | null) => String(value?.toString());\r\n case 'Date':\r\n return (value: Date | null) => String(dateUtils.shortDateFormat(value));\r\n case 'DropDownList':\r\n case 'UserSelection':\r\n return (value: Entity | null) => String(value?.Name);\r\n case 'ShortText':\r\n return (value: string | null) => String(value);\r\n case 'Serial':\r\n return (value: any) => {\r\n return String(value);\r\n };\r\n case 'Email':\r\n return (value: string | null) => String(value);\r\n case 'PositiveInteger':\r\n case 'Number':\r\n case 'PositiveDecimal':\r\n return (value: number | null) => String(value);\r\n default:\r\n assertExhaustive(props.columnType);\r\n }\r\n}\r\n\r\nexport function getReadonlyCell(props: { columnType: CustomFormColumnTypes }) {\r\n return ({ value }) =>\r\n value === null || value === undefined ? '' : getValueRenderer(props)(value);\r\n}\r\n","import { Accessor, Column, Renderer, CellProps, Row } from 'react-table';\r\nimport { IServiceRequestRowValueDto } from 'api/odata/generated/entities/IServiceRequestRowValueDto';\r\nimport {\r\n getServiceRequestRowFieldName,\r\n ServiceRequestRowEditableCell,\r\n} from '../ServiceRequestRowEditableCell';\r\nimport { IServiceRequestTableRowModel } from '../../RequestSamplesPage/slice/types';\r\nimport { getCellComponent } from '../../EditableTable/Fields/getCellComponent';\r\nimport { getReadonlyCell } from '../../EditableTable/Fields/getReadonlyCell';\r\nimport { ColumnType } from './getTableColumns';\r\nimport {\r\n ServiceRequestTableColumn,\r\n ServiceRequestTableColumnsCollection,\r\n} from '../../RequestSamplesPage/slice/utils/ServiceRequestTableColumn';\r\n\r\nexport function getCustomFormTableColumns(props: {\r\n columns: ServiceRequestTableColumnsCollection;\r\n isEditable: boolean;\r\n}): Column[] {\r\n return props.columns.getArray().map((column, index) => {\r\n const accessor: Accessor = originalRow => {\r\n const result = originalRow.Values[column.getFieldName()];\r\n return result;\r\n };\r\n const cell = getCell({\r\n column: column,\r\n isEditable: props.isEditable,\r\n isFocused: index === 0 && props.isEditable,\r\n });\r\n\r\n const result: ColumnType = {\r\n id: column.getFieldName(),\r\n Header: column.Label,\r\n accessor: accessor,\r\n Cell: cell,\r\n enableHide: true,\r\n // TODO: add min/max/width based on the column type\r\n // minWidth:\r\n // maxWidth:\r\n // width:\r\n name: (row: Row) =>\r\n getServiceRequestRowFieldName(row.index, column.getFieldName()),\r\n column: column,\r\n };\r\n return result;\r\n });\r\n}\r\n\r\nfunction getCell(props: {\r\n isEditable: boolean;\r\n column: ServiceRequestTableColumn;\r\n isFocused?: boolean;\r\n}):\r\n | Renderer<\r\n CellProps\r\n >\r\n | undefined {\r\n if (props.isEditable) {\r\n const fieldComponent = getCellComponent(props.column);\r\n if (fieldComponent !== null) {\r\n return ServiceRequestRowEditableCell(fieldComponent, {\r\n column: props.column,\r\n focused: props.isFocused,\r\n });\r\n }\r\n }\r\n return getReadonlyCell({ columnType: props.column.ColumnType });\r\n}\r\n","import * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectServiceRequestRowStatues } from 'app/pages/Samples/RequestSamplesPage/slice/selectors';\r\nimport { SRSelect } from '../../EditableTable/Fields/DropDownList';\r\nimport { IServiceRequestRowStatusDto } from 'api/odata/generated/entities/IServiceRequestRowStatusDto';\r\nimport { useRequestSamplesSlice } from '../../RequestSamplesPage/slice';\r\nimport { CellProps } from 'react-table';\r\nimport { IServiceRequestTableRowModel } from '../../RequestSamplesPage/slice/types';\r\nimport { FastFieldProps } from 'formik';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\n\r\nexport interface ServiceRequestRowStatusPickerProps {\r\n value: IServiceRequestRowStatusDto | null;\r\n serviceRequestId: number;\r\n serviceRequestRowId: number;\r\n onChange: (value: IServiceRequestRowStatusDto | null) => void;\r\n error?: boolean;\r\n helperText?: string;\r\n}\r\n\r\nexport function ServiceRequestRowStatusPicker(\r\n props: ServiceRequestRowStatusPickerProps,\r\n) {\r\n const statuses = useSelector(selectServiceRequestRowStatues);\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n const handleChange = React.useCallback(\r\n (value: IServiceRequestRowStatusDto | null) => {\r\n props.onChange?.(value);\r\n dispatch(\r\n actions.updateServiceRequestRowStatus({\r\n serviceRequestId: props.serviceRequestId,\r\n serviceRequestRowId: props.serviceRequestRowId,\r\n status: value,\r\n }),\r\n );\r\n },\r\n [actions, dispatch, props],\r\n );\r\n const handleBlur = React.useCallback(e => {}, []);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport const ServiceREquestRowStatusCell = React.memo(\r\n function ServiceREquestRowStatusCell(\r\n props: Pick<\r\n CellProps,\r\n 'value'\r\n > & {\r\n isEditable: boolean;\r\n serviceRequestId: number;\r\n serviceRequestRowId: number;\r\n } & {\r\n fieldProps: FastFieldProps;\r\n onChange?: (value: IServiceRequestRowStatusDto | null) => void;\r\n },\r\n ) {\r\n const handleChange = React.useCallback(\r\n value => {\r\n props.fieldProps?.field?.onChange({\r\n target: { value: value, name: props.fieldProps?.field?.name },\r\n });\r\n props.onChange?.(value);\r\n },\r\n [props],\r\n );\r\n\r\n if (props.isEditable) {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n } else {\r\n return <>{props.value.Name};\r\n }\r\n },\r\n);\r\n","import * as React from 'react';\r\nimport { translations } from 'locales/translations';\r\nimport { CellProps, Column, Row } from 'react-table';\r\nimport { getCustomFormTableColumns } from './getCustomFormTableColumns';\r\nimport {\r\n IServiceRequestTableColumnModel,\r\n IServiceRequestTableRowModel,\r\n} from '../../RequestSamplesPage/slice/types';\r\nimport { ServiceREquestRowStatusCell as ServiceRequestRowStatusCell } from '../ServiceRequestRowStatusPicker';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ServiceRequestTableColumnsCollection } from '../../RequestSamplesPage/slice/utils/ServiceRequestTableColumn';\r\nimport { IServiceRequestTableFormComponent } from '.';\r\nimport { AddNewCustomTableRow } from './components/AddServiceRequestRowButton';\r\nimport { selectServiceRequestCustomFormColumns } from '../../RequestSamplesPage/slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { getServiceRequestRowName } from '../ServiceRequestRowEditableCell';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport styled from 'styled-components';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\n\r\nexport interface ColumnTypeExtension {\r\n name?: (row: Row) => string;\r\n column?: IServiceRequestTableColumnModel;\r\n /**\r\n * Enables show / hide column through columns selection\r\n */\r\n enableHide?: boolean;\r\n}\r\nconst RowGap = styled('div')`\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n`;\r\nexport type ColumnType = Column &\r\n ColumnTypeExtension;\r\nexport function getTableColumns(\r\n customFormColumns: ServiceRequestTableColumnsCollection,\r\n isEditable: boolean,\r\n t,\r\n serviceRequestId: number,\r\n) {\r\n const dynamicColumns: Array = getCustomFormTableColumns({\r\n columns: customFormColumns,\r\n isEditable,\r\n });\r\n var staticColumns: Array = [\r\n {\r\n id: 'Id',\r\n Header: t(translations.RowId) as string,\r\n accessor: 'Id',\r\n },\r\n {\r\n Header: t(translations.Status) as string,\r\n accessor: 'Status',\r\n name: (row: Row) =>\r\n getServiceRequestRowName(row.index, 'Status'),\r\n Cell: ({ row, value, fieldProps }) => (\r\n <>\r\n \r\n \r\n ),\r\n },\r\n ];\r\n var result: Array = [...staticColumns, ...dynamicColumns];\r\n result.push({\r\n Header: t(translations.Comments),\r\n id: 'comments',\r\n accessor: 'CommentsCount',\r\n disableSortBy: true,\r\n Cell: (props: CellProps) => (\r\n \r\n {props.value}\r\n \r\n \r\n ),\r\n });\r\n if (isEditable) {\r\n result.push(\r\n ...[\r\n {\r\n id: 'actions',\r\n Cell: (cellProps: CellProps) => (\r\n \r\n ),\r\n },\r\n ],\r\n );\r\n }\r\n return result;\r\n}\r\n\r\ninterface ActionsCellProps extends IServiceRequestTableFormComponent {\r\n rowIndex: number;\r\n original: IServiceRequestTableRowModel;\r\n pageSize: number;\r\n setPageSize;\r\n}\r\nconst ActionsCell = React.memo(function ActionsCell(props: ActionsCellProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n});\r\ninterface DeleteButtonProps\r\n extends Pick {\r\n rowId: number;\r\n}\r\nfunction DeleteButton(props: DeleteButtonProps) {\r\n const handleClick = React.useCallback(() => {\r\n httpClient.delete(`/api/ServiceRequestRows/${props.rowId}`).then(() => {\r\n props.arrayHelpers.remove(props.rowIndex);\r\n });\r\n }, [props.rowId, props.arrayHelpers, props.rowIndex]);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction CloneButton(props: ActionsCellProps) {\r\n const { t } = useTranslation();\r\n const columns = useSelector(selectServiceRequestCustomFormColumns);\r\n const dispatch = useDispatch();\r\n const [processing, setProcessing] = React.useState(false);\r\n const handleCloneClick = React.useCallback(async () => {\r\n if (columns === null) {\r\n console.warn('no columns accessible for current user');\r\n return;\r\n }\r\n setProcessing(true);\r\n try {\r\n await AddNewCustomTableRow({\r\n serviceRequestId: props.original.ServiceRequestId,\r\n columns,\r\n model: props.original,\r\n arrayHelpers: props.arrayHelpers,\r\n index: props.rowIndex + 1,\r\n });\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: t(translations.ServiceRequestRow_InsertSuccess),\r\n }),\r\n );\r\n props.setPageSize(props.pageSize + 1);\r\n setProcessing(false);\r\n } catch (error) {\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: t(translations.ServiceRequestRow_InsertError),\r\n }),\r\n );\r\n setProcessing(false);\r\n }\r\n }, [columns, dispatch, props, t]);\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * auto generated interface for Bookit.Data.InternalServiceRequestRowStatus\r\n *\r\n */\r\n\r\nexport enum InternalServiceRequestRowStatus {\r\n New = 0,\r\n InWork = 1,\r\n Done = 2,\r\n Skip = 3,\r\n}\r\nexport type InternalServiceRequestRowStatusUnion = keyof typeof InternalServiceRequestRowStatus;\r\nexport const InternalServiceRequestRowStatusUnionArray: Array = [\r\n 'New',\r\n 'InWork',\r\n 'Done',\r\n 'Skip',\r\n];\r\n","import { Comments, CommentsProps } from 'app/components/Comments';\r\nimport {\r\n selectCommentIsInternal,\r\n selectIsServiceRequestAdmin,\r\n} from 'app/pages/Samples/RequestSamplesPage/slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { GetServiceRequestDetailsPath } from 'app/pages/Samples/RequestSamplesPage/slice/path';\r\nimport { IServiceRequestRelated } from '../..';\r\nimport styled from 'styled-components';\r\nimport { useFormikContext } from 'formik';\r\nimport { IServiceRequestTableRowModel } from 'app/pages/Samples/RequestSamplesPage/slice/types';\r\nimport { getServiceRequestRowName } from '../../../ServiceRequestRowEditableCell';\r\nimport { Row } from 'react-table';\r\nimport { useRequestSamplesSlice } from 'app/pages/Samples/RequestSamplesPage/slice';\r\nimport { useUploadToNewComment } from 'app/components/LargeFilesUpload/Components/useUploadToNewComment';\r\n\r\nexport interface ServiceRequestRowCommentsProps\r\n extends Pick,\r\n IServiceRequestRelated {\r\n row?: Row;\r\n canUserEdit?: Boolean;\r\n}\r\nconst CommentsWrap = styled('div')`\r\n padding: 16px;\r\n`;\r\nexport function ServiceRequestRowComments({\r\n serviceRequestId,\r\n canUserEdit,\r\n ...props\r\n}: ServiceRequestRowCommentsProps) {\r\n const { isAdmin } = useSelector(selectIsServiceRequestAdmin);\r\n const CommentIsInternal = useSelector(selectCommentIsInternal);\r\n const formik = useFormikContext();\r\n const dispatch = useDispatch();\r\n const { actions } = useRequestSamplesSlice();\r\n const { onCommentAdded } = useUploadToNewComment();\r\n const handleCommentAdded = newComment => {\r\n if (props.row !== undefined) {\r\n formik.setFieldValue(\r\n getServiceRequestRowName(props.row.index, 'CommentsCount'),\r\n props.row.original.CommentsCount + 1,\r\n false,\r\n );\r\n }\r\n dispatch(actions.setHasFiles(true));\r\n onCommentAdded(newComment);\r\n };\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import { httpClient } from 'api/HttpClient';\r\nimport { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { InternalServiceRequestRowStatus } from 'api/odata/generated/enums/InternalServiceRequestRowStatus';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\n\r\nimport {\r\n IServiceRequestTableRowModel,\r\n IServiceRequestTableRowValueModel,\r\n} from 'app/pages/Samples/RequestSamplesPage/slice/types';\r\nimport { ImportComponent } from 'app/pages/Samples/RunDetailsPage/ImportComponents/ImportComponent';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { useFormikContext } from 'formik';\r\nimport { StatusCodes } from 'http-status-codes';\r\nimport { translations } from 'locales/translations';\r\nimport { chain, Dictionary } from 'lodash';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { openExportLink } from 'utils/url-utils';\r\nimport {\r\n IServiceRequestRelated,\r\n IServiceRequestTableFormComponent,\r\n} from '../..';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { selectServiceRequestCustomFormColumns } from 'app/pages/Samples/RequestSamplesPage/slice/selectors';\r\nimport { ServiceRequestTableColumnsCollection } from 'app/pages/Samples/RequestSamplesPage/slice/utils/ServiceRequestTableColumn';\r\n\r\nexport interface ServiceRequestRowsImportProps\r\n extends IServiceRequestRelated,\r\n IServiceRequestTableFormComponent {}\r\nexport function ServiceRequestRowsImport(props: ServiceRequestRowsImportProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const formik = useFormikContext();\r\n const columns = useSelector(selectServiceRequestCustomFormColumns);\r\n const { serviceRequestId } = props;\r\n const handleFileChange = async (file: File) => {\r\n const url = `/api/Requests/${serviceRequestId}/tabledata`;\r\n try {\r\n const response = await httpClient.uploadFile(url, file, {\r\n responseType: 'json',\r\n });\r\n switch (response.status) {\r\n case StatusCodes.OK:\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: t(translations.ImportSuccessMessage),\r\n }),\r\n );\r\n const model = convertImportResponse(\r\n response.data,\r\n\r\n columns,\r\n serviceRequestId,\r\n );\r\n model.forEach(item => {\r\n const index = formik.values.Rows.findIndex(\r\n row => row.Id === item.Id,\r\n );\r\n if (index === -1) {\r\n props.arrayHelpers.push(item);\r\n } else {\r\n props.arrayHelpers.replace(index, item);\r\n }\r\n });\r\n setOpen(false);\r\n break;\r\n default:\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message:\r\n response.data.ExceptionMessage ??\r\n t(translations.ImportErrorMessage),\r\n }),\r\n );\r\n break;\r\n }\r\n } catch (error) {\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: t(translations.ImportErrorMessage),\r\n }),\r\n );\r\n }\r\n };\r\n const [open, setOpen] = React.useState(false);\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n return (\r\n
    \r\n }\r\n variant=\"white\"\r\n size=\"small\"\r\n onClick={() => setOpen(true)}\r\n >\r\n {t(translations.Import)}\r\n \r\n \r\n \r\n {t(translations.ImportTemplate)}\r\n \r\n
    \r\n \r\n \r\n }\r\n cancelButtonLabel={t(translations.Close)}\r\n onCancel={handleClose}\r\n onClose={handleClose}\r\n />\r\n
    \r\n );\r\n}\r\n\r\ninterface DownloadFileButtonProps extends ButtonProps {\r\n url: string;\r\n}\r\nfunction DownloadImportTemplate({\r\n url,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const handleClick = async () => {\r\n try {\r\n await openExportLink(url);\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n };\r\n return ;\r\n}\r\nexport function ExportRows({\r\n url,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const handleClick = async () => {\r\n try {\r\n await openExportLink(url);\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n };\r\n return (\r\n }\r\n {...props}\r\n >\r\n );\r\n}\r\n/**\r\n * Response example:\r\n * [\r\n {\r\n Id: 0,\r\n CommentsCount: 0,\r\n FilesCount: 0,\r\n Status: { Id: 0, InternalStatusId: 0, Name: 'New' },\r\n ReservationId: null,\r\n '1001': null,\r\n '1002': { id: 'a1', text: 'a1', isValid: true, SourceValueId: null },\r\n '1011': null,\r\n '1003': null,\r\n '1004': '1',\r\n '1005': null,\r\n '1006': null,\r\n '1007': null,\r\n '1008': null,\r\n '1010': '1',\r\n }\r\n ...\r\n]\r\n * @param importResponse \r\n * @param arrayHelpers \r\n * @param values \r\n * @param serviceRequestId \r\n * @returns \r\n */\r\nfunction convertImportResponse(\r\n importResponse: Array<\r\n {\r\n Id: number;\r\n Status: any;\r\n ReservationId: any;\r\n CommentsCount: any;\r\n FilesCount: any;\r\n } & Record\r\n >,\r\n columns: ServiceRequestTableColumnsCollection | null,\r\n serviceRequestId: number,\r\n): Array {\r\n const result = importResponse.map(item => {\r\n const values =\r\n columns === null\r\n ? {}\r\n : (chain(columns.columnsObj)\r\n .mapValues(column => {\r\n const value = item[column.Id.toString()];\r\n if (value === null) {\r\n return null;\r\n } else if (typeof value === 'string') {\r\n return value;\r\n } else if (\r\n typeof value === 'object' &&\r\n typeof value.id === 'string' &&\r\n typeof value.text === 'string'\r\n ) {\r\n return {\r\n Id: value.id,\r\n Name: value.text,\r\n };\r\n } else {\r\n return null;\r\n }\r\n })\r\n .value() as Dictionary);\r\n const model: IServiceRequestTableRowModel = {\r\n Id: item.Id,\r\n Status: {\r\n Id: item.Status.Id,\r\n Name: item.Status.Name,\r\n InternalStatus:\r\n InternalServiceRequestRowStatus[item.Status.InternalStatusId],\r\n },\r\n Values: values,\r\n Charged: false,\r\n CommentsCount: item.CommentsCount,\r\n Completed: false,\r\n InsertDate: '',\r\n ReservationId: null,\r\n Serial: 0,\r\n ServiceRequestId: serviceRequestId,\r\n SourceLinkId: null,\r\n SourceRowId: null,\r\n StatusId: item.Status.Id,\r\n UpdateDate: '',\r\n };\r\n return model;\r\n });\r\n\r\n return result;\r\n}\r\n","import * as Yup from 'yup';\r\nimport { SRSelect } from 'app/pages/Samples/EditableTable/Fields/DropDownList';\r\nimport { selectServiceRequestCustomFormColumns } from 'app/pages/Samples/RequestSamplesPage/slice/selectors';\r\nimport { useFormikContext, Field, FieldProps } from 'formik';\r\nimport * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { getCustomFormColumnSchema } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IServiceRequestRelated, IServiceRequestSelectedRows } from '../..';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { getServiceRequestRowFieldName } from '../../../ServiceRequestRowEditableCell';\r\nimport { FormRow } from 'app/components/Forms/FormsLayout';\r\nimport { DialogForm } from 'app/components/DialogForm';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { getCellComponent } from 'app/pages/Samples/EditableTable/Fields/getCellComponent';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\n\r\nexport interface BulkUpdateProps\r\n extends IServiceRequestRelated,\r\n IServiceRequestSelectedRows {}\r\n\r\nexport function BulkUpdate(props: BulkUpdateProps) {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n\r\n const columns = useSelector(selectServiceRequestCustomFormColumns);\r\n const options = React.useMemo(\r\n () =>\r\n columns === null\r\n ? []\r\n : columns\r\n .getArray()\r\n .filter(column => column.ColumnType !== 'Serial')\r\n .map(column => ({\r\n Id: column.Id,\r\n Name: column.Label,\r\n Column: column,\r\n })),\r\n [columns],\r\n );\r\n\r\n const schema = React.useMemo(\r\n () =>\r\n Yup.object({\r\n column: Yup.mixed().required(),\r\n value: Yup.mixed().when(['column'], (column, schema) =>\r\n column === null || column === undefined\r\n ? schema\r\n : getCustomFormColumnSchema(column).required().nullable(),\r\n ),\r\n }),\r\n [],\r\n );\r\n const formikContext = useFormikContext();\r\n\r\n const handleSubmit = React.useCallback(\r\n async values => {\r\n const column = values.column;\r\n if (column === null) {\r\n return;\r\n }\r\n try {\r\n const rowIdentifiers = props.selectedFlatRows.map(\r\n row => row.original.Id,\r\n );\r\n await httpClient.put(\r\n `/api/requests/${props.serviceRequestId}/column/${column?.Id}`,\r\n {\r\n value: postValue(values.value),\r\n rowids: rowIdentifiers,\r\n },\r\n );\r\n props.selectedFlatRows.forEach(row =>\r\n formikContext.setFieldValue(\r\n getServiceRequestRowFieldName(row.index, column.getFieldName()),\r\n values.value,\r\n ),\r\n );\r\n setOpen(false);\r\n } catch (error) {\r\n dispatch(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: t(translations.GenericUpdateErrorMessage),\r\n }),\r\n );\r\n }\r\n },\r\n [\r\n dispatch,\r\n formikContext,\r\n props.selectedFlatRows,\r\n props.serviceRequestId,\r\n t,\r\n ],\r\n );\r\n const [open, setOpen] = React.useState(false);\r\n return (\r\n <>\r\n setOpen(x => !x)}\r\n text={t(translations.Update)}\r\n />\r\n setOpen(false)}\r\n open={open}\r\n title={t(translations.UpdateColumnValueAcrossMultipleRows)}\r\n >\r\n \r\n \r\n {({\r\n field, // { name, value, onChange, onBlur }\r\n meta,\r\n form,\r\n }: FieldProps) => (\r\n {\r\n field.onChange({\r\n target: {\r\n value: value?.Column,\r\n name: 'column',\r\n },\r\n });\r\n form.setFieldValue('value', null, false);\r\n }}\r\n />\r\n )}\r\n \r\n \r\n\r\n \r\n \r\n {({\r\n field, // { name, value, onChange, onBlur }\r\n form,\r\n meta,\r\n }: FieldProps) => {\r\n if (\r\n form.values.column !== null &&\r\n form.values.column !== undefined\r\n ) {\r\n const component = getCellComponent(form.values.column);\r\n if (component !== null) {\r\n return component({\r\n name: field.name,\r\n //error: meta.error !== undefined,\r\n onBlur: field.onBlur,\r\n onChange: event => {\r\n field.onChange({\r\n target: {\r\n name: field.name,\r\n value: event?.target?.value ?? event ?? null,\r\n },\r\n });\r\n },\r\n value: field.value,\r\n helperText: meta.error,\r\n });\r\n }\r\n }\r\n return null;\r\n }}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\n/**\r\n * Formats custom form value in the format expected by the v3 api:\r\n * * ddl values are expected to be in {id:\"xxx\", text:\"yyy\"} format,\r\n * * dates - yyyy-MM-dd\r\n * * other primitive values - string\r\n * @param value custom form value\r\n * @returns\r\n */\r\nfunction postValue(value: any) {\r\n if (value instanceof Date) {\r\n return dateUtils.formatISO(value, {\r\n representation: 'date',\r\n format: 'basic',\r\n });\r\n }\r\n if (value?.Id !== undefined && value?.Name !== undefined) {\r\n return { id: value.Id, text: value.text };\r\n } else {\r\n return value;\r\n }\r\n}\r\n","import {\r\n Checkbox,\r\n List,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n} from '@material-ui/core';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { IRow } from 'app/components/BasicTable';\r\nimport { Popover } from 'app/components/Popover';\r\nimport { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Column, TableState, UseTableInstanceProps } from 'react-table';\r\nimport { ColumnTypeExtension } from '../../getTableColumns';\r\n\r\nexport interface ColumnsSelectProps\r\n extends Pick, 'allColumns' | 'toggleHideColumn'>,\r\n Pick, 'hiddenColumns'> {}\r\n\r\nexport function ColumnsSelect(props: ColumnsSelectProps) {\r\n const { t } = useTranslation();\r\n\r\n const [anchorEl, setAnchorEl] = React.useState(undefined);\r\n\r\n const handleOpen = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(undefined);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n const id = open ? 'simple-popover' : undefined;\r\n const handleToggle = (column: Column) => {\r\n if (column.id !== undefined) {\r\n props.toggleHideColumn(column.id);\r\n }\r\n };\r\n const columns = React.useMemo(() => getHidableColumns(props.allColumns), [\r\n props.allColumns,\r\n ]);\r\n return (\r\n <>\r\n \r\n \r\n \r\n {columns.map(column => {\r\n const labelId = `checkbox-list-label-${column.id}`;\r\n return (\r\n column.id !== undefined && (\r\n handleToggle(column)}\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\nfunction getHidableColumns(columns: Array>) {\r\n return columns\r\n .filter(column => column.id !== undefined)\r\n .filter(column => (column as ColumnTypeExtension)?.enableHide === true);\r\n}\r\nfunction getHiddenColumnsKey(serviceId: number) {\r\n return `hidden_columns_${serviceId}`;\r\n}\r\nexport function getHiddenColumns(\r\n serviceId: number,\r\n allColumns: Array & ColumnTypeExtension>,\r\n) {\r\n try {\r\n const s = localStorage.getItem(getHiddenColumnsKey(serviceId));\r\n if (s === null) {\r\n return [];\r\n }\r\n const x = JSON.parse(s);\r\n if (Array.isArray(x) && x.every(item => typeof item === 'string')) {\r\n const columnIds = getHidableColumns(allColumns).map(column => column.id);\r\n\r\n return x.filter(id => columnIds.includes(id));\r\n }\r\n return [];\r\n } catch (error) {\r\n return [];\r\n }\r\n}\r\nexport function setHiddenColumns(serviceId: number, value?: Array) {\r\n try {\r\n const key = getHiddenColumnsKey(serviceId);\r\n if (value === undefined) {\r\n localStorage.removeItem(key);\r\n } else {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n }\r\n } catch (error) {\r\n //noop\r\n }\r\n}\r\n","/**\r\n *\r\n * ServiceRequestRowsTable\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useRequestSamplesSlice } from 'app/pages/Samples/RequestSamplesPage/slice';\r\n\r\nimport {\r\n Column,\r\n Row,\r\n useExpanded,\r\n UsePaginationInstanceProps,\r\n UsePaginationState,\r\n useTable,\r\n} from 'react-table';\r\nimport { AddServiceRequestRowButton } from './components/AddServiceRequestRowButton';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport {\r\n FieldArray,\r\n FormikProps,\r\n ArrayHelpers,\r\n FastFieldProps,\r\n FastField,\r\n} from 'formik';\r\nimport {\r\n IServiceRequestDetailsFormModel,\r\n IServiceRequestTableRowModel,\r\n IServiceRequestTableRowValueModel,\r\n} from '../../RequestSamplesPage/slice/types';\r\nimport { ColumnTypeExtension, getTableColumns } from './getTableColumns';\r\nimport { TableToolbar } from 'app/components/BasicTable/BasicFilter/TableToolbar';\r\nimport { UpdateServiceRequestRowValue } from '../ServiceRequestRowEditableCell';\r\nimport { serializeCustomFormRowValue } from 'app/components/CustomForm/CustomFormUtils';\r\nimport styled from 'styled-components';\r\nimport {\r\n TableBody,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableContainer,\r\n Table,\r\n} from '@material-ui/core/index';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport { usePagination, PluginHook } from 'react-table';\r\nimport { useStyles } from 'app/components/BasicTable/styles';\r\nimport TablePaginationActions from 'app/components/BasicTable/TablePaginationActions';\r\nimport { tableSectionStyles } from '../../RequestSamplesPage';\r\nimport clsx from 'clsx';\r\nimport { ServiceRequestRowComments } from './components/ServiceRequestComments';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { ServiceRequestTableColumnsCollection } from '../../RequestSamplesPage/slice/utils/ServiceRequestTableColumn';\r\nimport {\r\n ExportRows,\r\n ServiceRequestRowsImport,\r\n} from './components/ServiceRequestRowsImport';\r\nimport { BulkUpdate } from './components/BulkUpdate';\r\nimport { addRowSelect } from 'app/components/BasicTable/ControlledTable/addRowSelect';\r\nimport {\r\n ColumnsSelect,\r\n getHiddenColumns,\r\n setHiddenColumns,\r\n} from './components/ColumnsSelect';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { Body } from 'app/components/Typography';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { AlertContentType } from 'app/components/BasicAlert';\r\nimport { Printing } from 'app/components/PrintToPDF';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n\r\nexport interface IServiceRequestRelated {\r\n serviceRequestId: number;\r\n}\r\nexport interface IServiceRequestTableFormComponent {\r\n arrayHelpers: ArrayHelpers;\r\n updateMyData: UpdateServiceRequestRowValue;\r\n}\r\n\r\nexport interface IServiceRequestSelectedRows {\r\n selectedFlatRows: Array>;\r\n}\r\nexport interface ServiceRequestRowsTableProps\r\n extends IServiceRequestRelated,\r\n FormikProps {\r\n processing: boolean;\r\n isEditable: boolean;\r\n isAdmin: boolean;\r\n pageSize?: number;\r\n formFields: ServiceRequestTableColumnsCollection;\r\n serviceRequestTypeId: number;\r\n hasErrors?: boolean;\r\n printing?: Printing;\r\n}\r\n/**\r\n * \"Custom Form\" based table section\r\n */\r\nexport const ServiceRequestRowsTable = React.memo(\r\n function ServiceRequestRowsTable({\r\n serviceRequestId,\r\n isAdmin,\r\n isEditable,\r\n formFields: customFormColumns,\r\n hasErrors,\r\n //pageSize,\r\n ...props\r\n }: ServiceRequestRowsTableProps) {\r\n const { actions } = useRequestSamplesSlice();\r\n\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n\r\n // TODO: server side pagination\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const handleChangeState = React.useCallback(\r\n state => {\r\n dispatch(actions.loadServiceRequestRows({ ...state }));\r\n },\r\n [actions, dispatch],\r\n );\r\n\r\n // TODO: server side pagination\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const handleSelectedRowsChange = React.useCallback(\r\n rows => {\r\n dispatch(actions.setSelected(rows));\r\n },\r\n [actions, dispatch],\r\n );\r\n\r\n useEffectOnMount(() => {\r\n dispatch(\r\n actions.loadServiceRequestRows({\r\n pageIndex: 0,\r\n pageSize: 10,\r\n }),\r\n );\r\n });\r\n\r\n const tableColumns = React.useMemo<\r\n Array>\r\n >(() => {\r\n return getTableColumns(\r\n customFormColumns,\r\n isEditable,\r\n t,\r\n serviceRequestId,\r\n );\r\n }, [customFormColumns, isEditable, serviceRequestId, t]);\r\n\r\n const updateMyData = React.useCallback<\r\n UpdateServiceRequestRowValue\r\n >(\r\n args => {\r\n const column = customFormColumns.get(args.columnId);\r\n\r\n // dispatch(\r\n // actions.updateServiceRequestRowValue({\r\n // serviceRequestId: serviceRequestId,\r\n // serviceRequestValue: {\r\n // RowId: args.serviceRequestRowId,\r\n // ColumnId: column.Id,\r\n // ...serializeCustomFormRowValue(args.value),\r\n // },\r\n // }),\r\n // );\r\n\r\n const value = serializeCustomFormRowValue(args.value);\r\n\r\n // TODO: migrate value updates to the new api\r\n // const url = `/api/odata/v4/ServiceRequests(${action.payload.serviceRequestId})/Rows(${action.payload.serviceRequestValue.RowId})/Values`;\r\n const url = `/api/requests/${serviceRequestId}/tabledata/${args.serviceRequestRowId}/${column.Id}`;\r\n const payload =\r\n value.DisplayValue === null\r\n ? value.Value\r\n : {\r\n id: value.Value,\r\n text: value.DisplayValue,\r\n };\r\n\r\n try {\r\n httpClient.post(url, JSON.stringify(payload), {\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n } catch (error) {}\r\n },\r\n [customFormColumns, serviceRequestId],\r\n );\r\n\r\n const print = React.useMemo(() => {\r\n return props.printing !== undefined && props.printing.printing === true;\r\n }, [props.printing]);\r\n React.useEffect(() => {\r\n if (\r\n props.printing !== undefined &&\r\n print &&\r\n props.printing.onLoading !== undefined\r\n ) {\r\n props.printing.onLoading(\r\n props.printing.id,\r\n props.values.Rows === undefined || props.values.Rows === null,\r\n );\r\n }\r\n }, [print, props.printing, props.values.Rows]);\r\n\r\n if (props.values.Rows === undefined || props.values.Rows === null) {\r\n return <>;\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\ninterface SRFormContentProps\r\n extends FormikProps,\r\n IServiceRequestRelated {\r\n tableColumns: Array>;\r\n updateMyData: UpdateServiceRequestRowValue;\r\n isEditable: boolean;\r\n isAdmin: boolean;\r\n serviceRequestTypeId: number;\r\n hasError?: boolean;\r\n}\r\nconst SRFormContent = React.memo(function SRFormContent({\r\n tableColumns,\r\n updateMyData,\r\n ...props\r\n}: SRFormContentProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n const tablePlugins = React.useMemo(() => {\r\n const plugins: PluginHook[] = [\r\n // useSortBy,\r\n useExpanded,\r\n usePagination,\r\n ];\r\n if (props.isEditable) {\r\n addRowSelect(plugins);\r\n }\r\n return plugins;\r\n }, [props.isEditable]);\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n page, // Instead of using 'rows', we'll use page,\r\n prepareRow,\r\n //pagination\r\n gotoPage,\r\n setPageSize,\r\n allColumns,\r\n toggleHideColumn,\r\n state: { pageIndex, pageSize, hiddenColumns },\r\n selectedFlatRows,\r\n } = useTable(\r\n {\r\n columns: tableColumns,\r\n data: props.values.Rows ?? [],\r\n updateMyData: updateMyData,\r\n autoResetPage: false,\r\n autoResetExpanded: false,\r\n initialState: {\r\n // sortBy: [{ id: 'Id' }],\r\n hiddenColumns: getHiddenColumns(\r\n props.serviceRequestTypeId,\r\n tableColumns,\r\n ),\r\n },\r\n },\r\n ...tablePlugins,\r\n );\r\n React.useEffect(() => {\r\n setHiddenColumns(props.serviceRequestTypeId, hiddenColumns);\r\n }, [hiddenColumns, props.serviceRequestTypeId]);\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n {arrayHelpers => {\r\n return (\r\n <>\r\n \r\n {props.values.Rows !== undefined && (\r\n <>\r\n {props.values.Rows.length} {t(translations.Records)}\r\n \r\n )}\r\n \r\n }\r\n alertContent={\r\n props.hasError\r\n ? ({\r\n type: 'error',\r\n message: t(translations.RequestRows_error) as string,\r\n closable: true,\r\n } as AlertContentType)\r\n : undefined\r\n }\r\n showAlert={props.hasError}\r\n >\r\n {props.isEditable && selectedFlatRows.length > 0 && (\r\n \r\n )}\r\n {props.isEditable && !isMobile && (\r\n \r\n )}\r\n {props.isEditable && !isMobile && (\r\n \r\n {t(translations.Export)}\r\n \r\n )}\r\n {props.isAdmin && (\r\n \r\n )}\r\n {props.isEditable && (\r\n \r\n )}\r\n \r\n
    \r\n
    \r\n \r\n \r\n {\r\n // Loop over the header rows\r\n headerGroups.map(headerGroup => (\r\n // Apply the header row props\r\n \r\n {\r\n // Loop over the headers in each row\r\n headerGroup.headers.map(column => (\r\n // Apply the header cell props\r\n\r\n \r\n {\r\n // Render the header\r\n \r\n {column.render('Header')}\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 {props.values.Rows !== undefined && (\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\ninterface SRTableBodyProps\r\n extends IServiceRequestRelated,\r\n IServiceRequestTableFormComponent {\r\n page: Array>;\r\n prepareRow: (row: Row) => void;\r\n}\r\nconst SRTableBody = React.memo(function SRTableBody({\r\n page,\r\n prepareRow,\r\n arrayHelpers,\r\n\r\n updateMyData,\r\n}: SRTableBodyProps) {\r\n return (\r\n <>\r\n {page.map(row => {\r\n prepareRow(row);\r\n\r\n const rowProps = row.getRowProps();\r\n return (\r\n \r\n \r\n {row.cells.map((cell, index) => (\r\n \r\n {(fieldProps?: FastFieldProps) => {\r\n const hasError = !isNullOrUndefined(\r\n fieldProps?.meta?.error,\r\n );\r\n return (\r\n \r\n {cell.render('Cell', {\r\n arrayHelpers,\r\n updateMyData,\r\n fieldProps,\r\n })}\r\n \r\n );\r\n }}\r\n \r\n ))}\r\n \r\n {row.isExpanded && (\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\ninterface SRTableCellProps {\r\n error?: boolean;\r\n title?: string;\r\n key?: string;\r\n className?: string;\r\n children: React.ReactNode;\r\n}\r\nfunction SRTableCell({\r\n error,\r\n children,\r\n title,\r\n key,\r\n className,\r\n ...other\r\n}: React.PropsWithChildren) {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n}\r\nconst StyledTableCell = styled(SRTableCell)`\r\n background: ${props =>\r\n props.error ? bookitColors.danger.background : 'transparent'};\r\n\r\n border-bottom: ${props => (props.error ? '1px solid #F78F8B' : 'unset')};\r\n &.editcell:hover {\r\n background: ${props =>\r\n props.error\r\n ? bookitColors.danger.bgHover\r\n : bookitColors.grayscale.grayBackground};\r\n cursor: pointer;\r\n & > * {\r\n cursor: pointer;\r\n & > * {\r\n cursor: pointer;\r\n & > * {\r\n cursor: pointer;\r\n & > * {\r\n cursor: pointer;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n > .Mui-focused & {\r\n border: 1px solid ${bookitColors.primary.regular};\r\n background: ${bookitColors.grayscale.grayBackground};\r\n }\r\n &:focus-within {\r\n border: 1px solid ${bookitColors.primary.regular};\r\n background: ${bookitColors.grayscale.grayBackground};\r\n }\r\n`;\r\n// box-shadow: ${props =>\r\n// props.error\r\n// ? '-1px 0px 0px #e0e5ec, 0px 1px 0px #C42E52'\r\n// : '-1px 1px 0px #e0e5ec'};\r\nconst TableHeaderCellLabel = styled('span')`\r\n white-space: break-spaces;\r\n word-break: normal;\r\n`;\r\ninterface SRTablePaginationProps\r\n extends Pick<\r\n UsePaginationState,\r\n 'pageSize' | 'pageIndex'\r\n >,\r\n Pick<\r\n UsePaginationInstanceProps,\r\n 'gotoPage' | 'setPageSize'\r\n > {\r\n isEditable: boolean;\r\n dataLength: number;\r\n}\r\nconst SRTablePagination = React.memo(function SRTablePagination(\r\n props: SRTablePaginationProps,\r\n) {\r\n return (\r\n props.gotoPage(newPage)}\r\n onChangeRowsPerPage={event =>\r\n props.setPageSize(Number(event.target.value))\r\n }\r\n ActionsComponent={TablePaginationActions}\r\n />\r\n );\r\n});\r\n\r\ninterface EditableCellProps {\r\n name?: string;\r\n children: (fieldProps?: FastFieldProps) => React.ReactElement;\r\n}\r\nfunction EditableCellField({\r\n name,\r\n ...props\r\n}: EditableCellProps): React.ReactElement {\r\n if (name === undefined) {\r\n return props.children(undefined);\r\n } else {\r\n return ;\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { Alert } from '@material-ui/lab';\r\nimport * as Yup from 'yup';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { useServiceRequestStatusUpdate } from 'app/pages/Samples/components/Utils';\r\nimport { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectServiceRequestStatusesByInternalId } from '../../slice/selectors';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport {\r\n FormRow,\r\n StyledFormFieldsContainer,\r\n} from 'app/components/Forms/FormsLayout';\r\nimport { DialogForm, DialogFormProps } from 'app/components/DialogForm';\r\nimport { FormRichTextField } from 'app/components/Forms/FormRichTextField';\r\nimport { IReason } from '../../slice/types';\r\n\r\nexport interface QuoteSentToUserAlertProps {\r\n ServiceRequestId: number;\r\n ServiceRequestInternalStatus: InternalServiceRequestStatusesUnion;\r\n}\r\nexport function QuoteSentToUserAlert(props: QuoteSentToUserAlertProps) {\r\n const { t } = useTranslation();\r\n\r\n const { changeStatus } = useServiceRequestStatusUpdate({\r\n serviceRequestStatusId: props.ServiceRequestId,\r\n });\r\n const approvedStatus = useSelector(\r\n state =>\r\n selectServiceRequestStatusesByInternalId(state, 'QuoteApproved')?.[0],\r\n );\r\n const cancelledStatuses = useSelector(state =>\r\n selectServiceRequestStatusesByInternalId(state, 'Cancelled'),\r\n );\r\n const handleApproveQuoteClick = (value: IServiceRequestStatusDto) =>\r\n changeStatus({\r\n status: value,\r\n });\r\n const handleRejectClick = (values: IReason) => {\r\n const firstCancelledStatus = cancelledStatuses?.[0];\r\n if (firstCancelledStatus !== undefined) {\r\n changeStatus({\r\n status: firstCancelledStatus,\r\n reason: values.Reason,\r\n });\r\n }\r\n };\r\n if (props.ServiceRequestInternalStatus !== 'QuoteSendToUser') {\r\n return null;\r\n }\r\n return (\r\n \r\n \r\n \r\n {t(translations.Request_SendQuoteToUser_PendingMessage)}\r\n  \r\n {approvedStatus !== undefined && (\r\n handleApproveQuoteClick(approvedStatus)}\r\n >\r\n {t(translations.Request_SendQuoteToUser_ApproveQuote)}\r\n \r\n )}\r\n  \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\ninterface RejectProps extends Pick {}\r\nfunction Reject(props: RejectProps) {\r\n const [dialogOpen, setDialogOpen] = React.useState(false);\r\n const { t } = useTranslation();\r\n return (\r\n <>\r\n \r\n setDialogOpen(false)}\r\n onSubmit={props.onSubmit}\r\n open={dialogOpen}\r\n />\r\n \r\n );\r\n}\r\n\r\ninterface DialogConfirmWithReasonProps\r\n extends Pick, 'onSubmit' | 'onClose' | 'open'> {}\r\nfunction ConfirmRejectDialog(props: DialogConfirmWithReasonProps) {\r\n const { t } = useTranslation();\r\n const validationSchema: Yup.SchemaOf = Yup.object({\r\n Reason: Yup.string().required(t(translations.RejectReasonEmpty_err)),\r\n });\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { translations } from 'locales/translations';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectServiceRequestStatusesByInternalId } from '../../slice/selectors';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useServiceRequestStatusUpdate } from 'app/pages/Samples/components/Utils';\r\nimport { IRequestDetailsModel } from '../../slice/types';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\n\r\nexport function canSendQuote(\r\n isAdmin: boolean,\r\n serviceRequest?: IRequestDetailsModel,\r\n) {\r\n return (\r\n serviceRequest?.Service.SendQuoteToUser === true &&\r\n isAdmin === true &&\r\n ['InProcess', 'Draft'].includes(serviceRequest?.Status.InternalStatusId)\r\n );\r\n}\r\nexport interface ISendQuoteButtonButtonProps {\r\n serviceRequest: IRequestDetailsModel;\r\n}\r\nexport function SendQuoteButtonButton(props: ISendQuoteButtonButtonProps) {\r\n const { t } = useTranslation();\r\n const statuses = useSelector(state =>\r\n selectServiceRequestStatusesByInternalId(state, 'QuoteSendToUser'),\r\n );\r\n\r\n const { changeStatus } = useServiceRequestStatusUpdate({\r\n serviceRequestStatusId: props.serviceRequest?.Id,\r\n });\r\n\r\n // const submitEnabled = React.useMemo(() => canSendQuote(props), [props]);\r\n\r\n const handleClick = () => {\r\n const status = statuses?.[0];\r\n if (status !== undefined) {\r\n changeStatus({\r\n status: status,\r\n });\r\n }\r\n };\r\n\r\n return (\r\n }\r\n variant=\"ghost\"\r\n aria-label={t(translations.SendQuote)}\r\n disabled={statuses === undefined || statuses.length === 0}\r\n onClick={handleClick}\r\n title={t(translations.SendQuote)}\r\n >\r\n {t(translations.SendQuote)}\r\n \r\n );\r\n}\r\n","import { getCustomFormColumnSchema } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { transform } from 'lodash';\r\nimport * as Yup from 'yup';\r\nimport { ServiceRequestTableColumnsCollection } from '../../RequestSamplesPage/slice/utils/ServiceRequestTableColumn';\r\n\r\nexport const getSchema = (props: {\r\n columns: ServiceRequestTableColumnsCollection;\r\n isAdmin: boolean;\r\n}) =>\r\n // TODO: fix custom form schema typings starting from the getFieldSchema. In the end this : Yup.SchemaOf>\r\n {\r\n const columnSchema = (result, column, key) =>\r\n (result[column.getFieldName()] = getCustomFormColumnSchema({\r\n ColumnType: column.ColumnType,\r\n Label: column.Label,\r\n SizeLimit: column.SizeLimit,\r\n isRequired: column.isRequired,\r\n Options: column.Options,\r\n }).nullable());\r\n\r\n const x = transform(props.columns.columnsObj, columnSchema);\r\n\r\n const dynamicValuesSchema = Yup.object(x);\r\n\r\n return Yup.array(\r\n Yup.object({\r\n Values: dynamicValuesSchema,\r\n }),\r\n );\r\n };\r\n","/**\r\n *\r\n * auto generated interface for Bookit.Data.InternalServiceRequestStatus\r\n *\r\n */\r\n\r\nexport enum InternalServiceRequestStatus {\r\n Draft = 0,\r\n WaitingForQuote = 1,\r\n QuoteSendToUser = 2,\r\n QuoteApproved = 3,\r\n Completed = 5,\r\n Cancelled = 6,\r\n InProcess = 7,\r\n ReturnedToUser = 8,\r\n Pending = 9,\r\n Started = 10,\r\n Skipped = 11,\r\n}\r\nexport type InternalServiceRequestStatusUnion = keyof typeof InternalServiceRequestStatus;\r\nexport const InternalServiceRequestStatusUnionArray: Array = [\r\n 'Draft',\r\n 'WaitingForQuote',\r\n 'QuoteSendToUser',\r\n 'QuoteApproved',\r\n 'Completed',\r\n 'Cancelled',\r\n 'InProcess',\r\n 'ReturnedToUser',\r\n 'Pending',\r\n 'Started',\r\n 'Skipped',\r\n];\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { downloadFile } from 'utils/url-utils';\r\n\r\ninterface DownloadAllFilesProps {\r\n serviceRequestId: number;\r\n}\r\n\r\nexport function DownloadAllFiles(props: DownloadAllFilesProps) {\r\n const { t } = useTranslation();\r\n const url = `/api/odata/v4/ServiceRequests(${props.serviceRequestId})/Files`;\r\n const [busy, setBusy] = React.useState(false);\r\n const handleClick = React.useCallback(\r\n async event => {\r\n event.preventDefault();\r\n if (busy) {\r\n return;\r\n }\r\n setBusy(true);\r\n try {\r\n await downloadFile({ path: url });\r\n setBusy(false);\r\n } catch (error) {\r\n setBusy(false);\r\n }\r\n\r\n return false;\r\n },\r\n [busy, url],\r\n );\r\n return (\r\n \r\n {t(translations.DownloadAllFiles)}\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * RequestSamplesPage\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Redirect, RouteComponentProps, useLocation } from 'react-router-dom';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useRequestSamplesSlice } from './slice';\r\nimport {\r\n selectIsServiceRequestAdmin,\r\n selectRequestDetails,\r\n selectRequestDetailsData,\r\n selectServiceRequestCustomFormColumns,\r\n selectServiceRequestCustomFormFields,\r\n selectServiceRequestFormData,\r\n selectServiceRequestSidePanel,\r\n selectSubmitting,\r\n} from './slice/selectors';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SamplesTable } from '../components/SamplesTable';\r\nimport { translations } from 'locales/translations';\r\nimport { ServiceRequestCustomForm } from './components/ServiceRequestCustomForm';\r\nimport { PrintToPDF } from 'app/components/PrintToPDF';\r\nimport { PrintPDFSection } from 'app/components/PrintToPDF/PrintPDFSection';\r\nimport { usePrintPDFSlice } from 'app/components/PrintToPDF/slice';\r\nimport { AxiosError } from 'axios';\r\nimport { StatusCodes } from 'http-status-codes';\r\nimport { NotFoundPage } from 'app/pages/NotFoundPage';\r\nimport { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} from 'app/Layout/FrontendLayout/slice/type';\r\nimport { ActionRenderer } from 'app/Layout/FrontendLayout/components/PageWrapper/PageActions/ActionRender';\r\nimport { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { GetServiceRequestDetailsPath } from './slice/path';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { push } from 'connected-react-router';\r\nimport { CommentReferenceTypes } from 'enums/commentReferenceTypes';\r\nimport { ServiceRequestSubmissionDetails } from '../components/ServiceRequestSubmissionDetails';\r\nimport { SubmitServiceRequestButton } from './components/SubmitServiceRequestButton';\r\nimport { CancelServiceRequestButton } from './components/CancelServiceRequestButton';\r\nimport { getServiceRequestTitle } from './getServiceRequestTitle';\r\nimport { getPrintPDFSections } from 'app/components/PrintToPDF/getPrintPDFSections';\r\nimport { ServiceRequestMilestonesSection } from '../components/ServiceRequestMilestonesSection';\r\nimport { AddonTypesUnion } from 'api/odata/generated/enums/AddonTypes';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { ServiceRequestMilestoneDetailsProps } from '../components/ServiceRequestMilestoneDetails';\r\nimport { ServiceRequestMilestoneDetails } from '../components/ServiceRequestMilestoneDetails';\r\nimport {\r\n ServiceRequestMilestoneChargeDetails,\r\n ServiceRequestMilestoneChargeDetailsProps,\r\n} from '../components/ServiceRequestMilestoneChargeDetails';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { buildURL } from 'utils/url-utils';\r\nimport { CloneServiceRequestButton } from './components/CloneServiceRequestButton';\r\nimport {\r\n selectAppSettings,\r\n selectForbiddenFileExtensions,\r\n selectKnownModule,\r\n selectUploadFileSizeLimit,\r\n selectUserProfileSettings,\r\n} from 'app/slice/selectors';\r\nimport { getNotificationsLogPageLocation } from 'app/pages/EmailNotificationsPage/getNotificationsLogPageLocation';\r\nimport { Box } from '@material-ui/core';\r\nimport { ServiceRequestRowsTable } from '../components/ServiceRequestRowsTable';\r\nimport { QuoteSentToUserAlert } from './components/QuoteSentToUserAlert';\r\nimport { SendQuoteButtonButton } from './components/SendQuoteButton';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { StyledFormFieldsContainer } from 'app/components/Forms/FormsLayout';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { ServiceRequestRowComments as ServiceRequestComments } from '../components/ServiceRequestRowsTable/components/ServiceRequestComments';\r\nimport { getRequestDetailsSchema } from './utils/validationSchema';\r\nimport { Formik } from 'formik';\r\nimport { IServiceRequestDetailsFormModel } from './slice/types';\r\nimport { InternalServiceRequestStatus } from 'api/odata/generated/enums/InternalServiceRequestStatus';\r\nimport { DownloadAllFiles } from './components/DownloadAllFiles';\r\nimport { Body, H4 } from 'app/components/Typography';\r\n\r\nexport interface RequestSamplesPageProps\r\n extends RouteComponentProps<{ id: string }> {}\r\nexport interface ServiceRequestDetailsProps extends SidePanelContentProps {\r\n id: number;\r\n}\r\n\r\nexport function RequestSamplesPage(props: RequestSamplesPageProps) {\r\n const serviceRequestId = parseInt(props.match.params.id);\r\n if (isNaN(serviceRequestId)) {\r\n return null;\r\n }\r\n return ;\r\n}\r\nexport function RequestDetailsPage() {\r\n const location = useLocation();\r\n const id = React.useMemo(\r\n () => new URLSearchParams(location.search).get('id') ?? '',\r\n [location.search],\r\n );\r\n const serviceRequestId = parseInt(id);\r\n if (isNaN(serviceRequestId)) {\r\n return ;\r\n }\r\n return ;\r\n}\r\nexport function ServiceRequestDetails({\r\n id,\r\n useSidePanel,\r\n}: ServiceRequestDetailsProps) {\r\n const requestDetails = useSelector(selectRequestDetails);\r\n const requestDetailsData = useSelector(selectRequestDetailsData);\r\n const serviceRequestFormData = useSelector(selectServiceRequestFormData);\r\n const userProfileSettings = useSelector(selectUserProfileSettings);\r\n const appSettings = useSelector(selectAppSettings);\r\n const samplesAutomationEnabled = appSettings?.Modules.includes(\r\n KnownModules.SamplesAutomation,\r\n );\r\n const submittingRequest = useSelector(selectSubmitting);\r\n /**\r\n * custom form table section enabled/disabled\r\n */\r\n const SampleManagementTablesEnabled = useSelector(state =>\r\n selectKnownModule(state, KnownModules.SampleManagementTables),\r\n );\r\n const { actions } = useRequestSamplesSlice();\r\n const { actions: printActions } = usePrintPDFSlice();\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n //todo\r\n const { isAdmin, isOwner, isEditable } = useSelector(\r\n selectIsServiceRequestAdmin,\r\n );\r\n const sidePanel = useSelector(selectServiceRequestSidePanel);\r\n\r\n React.useEffect(() => {\r\n dispatch(actions.loadRequestDetails(id));\r\n }, [actions, dispatch, id]);\r\n\r\n const [print, setPrint] = React.useState(false);\r\n React.useEffect(() => {\r\n if (!print) {\r\n const printSections = getPrintPDFSections(\r\n t,\r\n userProfileSettings.GetSettingByKey('/RequestSamples.pdf')?.Value ?? '',\r\n );\r\n dispatch(printActions.setUseSections(true));\r\n dispatch(printActions.updateSections(printSections));\r\n }\r\n }, [dispatch, print, printActions, t, userProfileSettings]);\r\n\r\n const customFormFields = useSelector(selectServiceRequestCustomFormFields);\r\n const customFormColumns = useSelector(selectServiceRequestCustomFormColumns);\r\n const handlePrintToPDF = React.useCallback(() => {\r\n setPrint(true);\r\n }, []);\r\n\r\n const ForbiddenFileExtensions = useSelector(selectForbiddenFileExtensions);\r\n const UploadFileSizeLimit = useSelector(selectUploadFileSizeLimit);\r\n const schema = React.useMemo(\r\n () =>\r\n getRequestDetailsSchema({\r\n columns: customFormColumns,\r\n fields: customFormFields,\r\n isAdmin,\r\n SampleManagementTablesEnabled,\r\n ForbiddenFileExtensions,\r\n UploadFileSizeLimit,\r\n }),\r\n [\r\n ForbiddenFileExtensions,\r\n SampleManagementTablesEnabled,\r\n UploadFileSizeLimit,\r\n customFormColumns,\r\n customFormFields,\r\n isAdmin,\r\n ],\r\n );\r\n const [hasRowsErrors, setHasRowsErrors] = React.useState(\r\n undefined,\r\n );\r\n\r\n // const submitAction = React.useMemo(() => {\r\n // const x = () => (\r\n // ) =>\r\n // setErrors(errors)\r\n // }\r\n // />\r\n // );\r\n // return x;\r\n // }, [isEditable, requestDetails?.value]);\r\n // const cancelAction = React.useMemo(\r\n // () => () => (\r\n // \r\n // ),\r\n // [isAdmin, requestDetailsData?.Id],\r\n // );\r\n // const sendQuoteAction = React.useMemo(() => {\r\n // const serviceRequest = requestDetailsData;\r\n // if (serviceRequest === undefined) {\r\n // return undefined;\r\n // } else if (\r\n // !canSendQuote({ isAdmin: isAdmin, serviceRequest: serviceRequest })\r\n // ) {\r\n // return undefined;\r\n // } else {\r\n // return () => (\r\n // \r\n // );\r\n // }\r\n // }, [isAdmin, requestDetailsData]);\r\n\r\n const rightTopActions: ActionRenderer[] = React.useMemo(\r\n () => [\r\n () => (\r\n \r\n ),\r\n () => (\r\n \r\n ),\r\n () =>\r\n requestDetailsData?.Id !== undefined && (\r\n \r\n ),\r\n () => ,\r\n ],\r\n [handlePrintToPDF, requestDetailsData, t],\r\n );\r\n const leftActions = React.useMemo(() => {\r\n let actions = [] as ActionRenderer[];\r\n if (!!requestDetailsData) {\r\n if (isEditable) {\r\n actions.push(() => (\r\n \r\n \r\n setHasRowsErrors(hasErrors)\r\n }\r\n disabled={\r\n requestDetails.status === 'pending' || submittingRequest\r\n }\r\n />\r\n \r\n ));\r\n }\r\n if (isAdmin) {\r\n actions.push(() => (\r\n \r\n \r\n \r\n ));\r\n }\r\n if (\r\n requestDetailsData.Service.SendQuoteToUser === true &&\r\n isAdmin === true &&\r\n ['InProcess', 'Draft'].includes(\r\n requestDetailsData.Status.InternalStatusId,\r\n )\r\n ) {\r\n actions.push(() => (\r\n \r\n \r\n \r\n ));\r\n }\r\n if (\r\n isAdmin &&\r\n requestDetailsData !== undefined &&\r\n requestDetailsData?.HasFiles === true\r\n ) {\r\n actions.push(() => (\r\n \r\n ));\r\n }\r\n }\r\n return [...actions, ...rightTopActions];\r\n }, [\r\n isAdmin,\r\n isEditable,\r\n requestDetails.status,\r\n requestDetailsData,\r\n rightTopActions,\r\n submittingRequest,\r\n ]);\r\n const handleClosePrintToPDF = React.useCallback(() => {\r\n setPrint(false);\r\n }, []);\r\n\r\n const handleCloseClick = React.useCallback(() => {\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/ServiceRequests'));\r\n }\r\n //dispatch(actions.resetDetailsState());\r\n }, [dispatch, useSidePanel]);\r\n\r\n const handleSubmit = React.useCallback(\r\n async (values: IServiceRequestDetailsFormModel) => {\r\n if (requestDetailsData === undefined) {\r\n return;\r\n }\r\n dispatch(actions.submitStep({ ...requestDetailsData, ...values }));\r\n },\r\n [actions, dispatch, requestDetailsData],\r\n );\r\n\r\n const closeCover = () => dispatch(actions.setCover());\r\n const rightActions = React.useMemo(() => {\r\n return [\r\n () => (\r\n \r\n }\r\n onClick={handleCloseClick}\r\n >\r\n {t(translations.Close)}\r\n \r\n \r\n ),\r\n ] as ActionRenderer[];\r\n }, [handleCloseClick, t]);\r\n\r\n if (requestDetails.status !== 'pending') {\r\n if (requestDetails.error !== undefined) {\r\n const statusCode = (requestDetails.error as AxiosError)?.response?.status;\r\n switch (statusCode) {\r\n case StatusCodes.NOT_FOUND:\r\n return ;\r\n }\r\n }\r\n }\r\n const getTitle = (addonType?: AddonTypesUnion) => {\r\n if (addonType === undefined) {\r\n return undefined;\r\n }\r\n switch (addonType) {\r\n case 'Milestones':\r\n return t(translations.Milestones);\r\n case 'Addons':\r\n case 'UserAddons':\r\n return t(translations.AddonCharges);\r\n case 'NA':\r\n return undefined;\r\n\r\n default:\r\n assertExhaustive(addonType);\r\n }\r\n };\r\n const sectionStyles = {\r\n background: bookitColors.base.white,\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: 12,\r\n padding: '20px 24px 24px 24px',\r\n width: '100%',\r\n };\r\n\r\n if (requestDetailsData === undefined) {\r\n // nothing to show if the request details are empty but it's neither processing nor errored but the data for whatever reason is still not there\r\n return null;\r\n }\r\n const title = getServiceRequestTitle(requestDetailsData);\r\n const loading = requestDetails.status === 'pending';\r\n const cover =\r\n useSidePanel === false ? undefined : sidePanel?.type ===\r\n RenderPageType.ServiceRequestMilestone ? (\r\n \r\n ) : sidePanel?.type === RenderPageType.ServiceRequestMilestoneCharge ? (\r\n \r\n ) : undefined;\r\n\r\n return (\r\n <>\r\n \r\n {formik => (\r\n \r\n \r\n \r\n {print ? (\r\n \r\n \r\n {t(translations.ServiceRequest)}\r\n \r\n

    {title}

    \r\n
    \r\n ) : (\r\n <>\r\n )}\r\n \r\n {/* */}\r\n {requestDetailsData !== undefined && (\r\n \r\n \r\n \r\n )}\r\n\r\n {customFormFields.length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {requestDetailsData?.Id !== undefined &&\r\n customFormColumns?.getArray()?.length > 0 &&\r\n (requestDetailsData.Service?.CustomForm\r\n ?.VisibleToAdminOnly !== true ||\r\n isAdmin === true) && (\r\n \r\n \r\n {\r\n dispatch(\r\n printActions.setLoading({\r\n id: id,\r\n loading: loading,\r\n }),\r\n );\r\n },\r\n printing: print,\r\n }}\r\n />\r\n \r\n \r\n )}\r\n\r\n {samplesAutomationEnabled && (\r\n \r\n {\r\n dispatch(\r\n printActions.setLoading({\r\n id: id,\r\n loading: loading,\r\n }),\r\n );\r\n },\r\n printing: print,\r\n }}\r\n sectionStyles={tableSectionStyles}\r\n />\r\n \r\n )}\r\n\r\n {requestDetailsData !== undefined && (\r\n \r\n \r\n {\r\n dispatch(\r\n printActions.setLoading({\r\n id: id,\r\n loading: loading,\r\n }),\r\n );\r\n },\r\n printing: print,\r\n }}\r\n useSidePanel={useSidePanel}\r\n />\r\n \r\n \r\n )}\r\n {requestDetailsData?.Id !== undefined && (\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\nexport const tableSectionStyles = {\r\n background: bookitColors.base.white,\r\n border: `1px solid ${bookitColors.grayscale.grayBorders}`,\r\n borderRadius: 12,\r\n paddingBottom: 24,\r\n};\r\n","import { translations } from 'locales/translations';\r\nimport { TFunction } from 'i18next';\r\nimport { PrintPDFItem } from './slice/types';\r\n\r\nexport function getPrintPDFSections(\r\n t: TFunction,\r\n userProfileSettingsSections: string,\r\n): PrintPDFItem[] {\r\n let sections = [\r\n {\r\n id: 'SubmissionsDetails',\r\n label: t(translations.ExportPDF_SubmissionsDetails),\r\n checked: true,\r\n },\r\n {\r\n id: 'RequestForm_Table',\r\n label: t(translations.ExportPDF_RequestForm_Table),\r\n checked: true,\r\n },\r\n {\r\n id: 'Comments',\r\n label: t(translations.ExportPDF_Comments),\r\n checked: true,\r\n },\r\n {\r\n id: 'RequestRows_Table',\r\n label: t(translations.ExportPDF_RequestRows_Table),\r\n checked: true,\r\n },\r\n {\r\n id: 'Milestones_Services',\r\n label: t(translations.ExportPDF_Milestones_Services),\r\n checked: true,\r\n },\r\n {\r\n id: 'ModificationHistory',\r\n label: t(translations.ExportPDF_ModificationHistory),\r\n checked: false,\r\n },\r\n ];\r\n if (userProfileSettingsSections.trim() !== '') {\r\n const selected = userProfileSettingsSections.split(',');\r\n if (selected.length > 0) {\r\n for (const s of sections) {\r\n const found = selected.find(f => f === s.id);\r\n s.checked = found !== undefined;\r\n }\r\n }\r\n }\r\n return sections;\r\n}\r\n","import * as Yup from 'yup';\r\nimport { ServiceRequestTableColumnsCollection } from '../slice/utils/ServiceRequestTableColumn';\r\nimport { getSchema } from 'app/pages/Samples/components/ServiceRequestRowsTable/getServiceRequestRowSchema';\r\nimport { IFormFieldDto } from 'api/odata/generated/entities/IFormFieldDto';\r\nimport { getFieldSchema } from 'app/components/CustomForm/CustomFormUtils';\r\nimport { chain } from 'lodash';\r\n\r\nexport const getRequestDetailsSchema = (props: {\r\n columns: ServiceRequestTableColumnsCollection | null;\r\n fields: IFormFieldDto[];\r\n isAdmin: boolean;\r\n SampleManagementTablesEnabled: boolean;\r\n ForbiddenFileExtensions: string[];\r\n UploadFileSizeLimit: number;\r\n}) => {\r\n const customFormSchema = Yup.object(\r\n chain(props.fields.filter(f => f.Active))\r\n .keyBy(f => f.Id)\r\n .mapValues(field =>\r\n getFieldSchema(\r\n field,\r\n props.isAdmin,\r\n props.UploadFileSizeLimit,\r\n props.ForbiddenFileExtensions,\r\n ),\r\n )\r\n .value(),\r\n );\r\n let result = Yup.object({\r\n Rows:\r\n props.columns === null\r\n ? Yup.mixed()\r\n : getSchema({\r\n columns: props.columns,\r\n isAdmin: props.isAdmin,\r\n }).nullable(),\r\n FormValues: customFormSchema,\r\n });\r\n\r\n return result;\r\n};\r\n","import { EmailTypeUnion } from 'api/odata/generated/enums/EmailType';\r\nimport { buildURL } from 'utils/url-utils';\r\nimport { NOTIFICATIONS_LOG_PAGE_PATH } from '.';\r\n\r\nexport const getNotificationsLogPageLocation = (props: {\r\n NotificationTypeId: EmailTypeUnion;\r\n ReferenceId: number;\r\n}): string => {\r\n return buildURL(NOTIFICATIONS_LOG_PAGE_PATH, {\r\n NotificationTypeId: props.NotificationTypeId,\r\n ReferenceId: props.ReferenceId,\r\n });\r\n};\r\n","import { IRequestDetailsModel } from './slice/types';\r\n\r\nexport function getServiceRequestTitle(\r\n requestDetails: Partial,\r\n) {\r\n return `#${requestDetails.Id} - ${requestDetails.Service?.Name}`;\r\n}\r\n","import {\r\n Card,\r\n CardActions,\r\n CardContent,\r\n CardHeader,\r\n Grid,\r\n styled,\r\n} from '@material-ui/core';\r\nimport { DraggableProvidedDragHandleProps } from 'react-beautiful-dnd';\r\nimport { ServiceRequestKanbanItemType } from '../..';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { PrioritiesUnion } from 'api/odata/generated/enums/Priorities';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { assertExhaustive } from 'utils/assertExhaustive';\r\nimport { TypeColor } from 'styles/colors/types';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { Avatar } from 'app/components/Avatar';\r\nimport { useServiceRequestsKanbanSlice } from '../../slice';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { getServiceRequestTicketTitle } from '../getServiceRequestTicketTitle';\r\nimport { ParentTicketDetailsButton } from '../ParentTicketDetailsButton';\r\nimport { selectKnownModule } from 'app/slice/selectors';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { IconName } from 'app/AllIcons';\r\n\r\nexport interface IServiceRequestCardProps {\r\n item: ServiceRequestKanbanItemType;\r\n dragHandleProps?: DraggableProvidedDragHandleProps;\r\n}\r\nexport function ServiceRequestCard({\r\n item,\r\n ...props\r\n}: IServiceRequestCardProps) {\r\n const { t } = useTranslation();\r\n const title = getServiceRequestTicketTitle(item);\r\n const dispatch = useDispatch();\r\n const { actions } = useServiceRequestsKanbanSlice();\r\n const handleDetailsClick = () => {\r\n dispatch(actions.showEdit(item));\r\n };\r\n const samplesAutomationEnabled = useSelector(state =>\r\n selectKnownModule(state, KnownModules.SamplesAutomation),\r\n );\r\n\r\n return (\r\n \r\n \r\n {item.ParentTicketId !== null && (\r\n <>\r\n \r\n  \r\n \r\n )}\r\n {title}\r\n \r\n }\r\n {...props.dragHandleProps}\r\n />\r\n \r\n \r\n \r\n \r\n {item.ServiceRequest.Service?.Name}\r\n \r\n \r\n {item.ServiceRequest.Budget?.Name}\r\n \r\n {samplesAutomationEnabled && (\r\n \r\n {item.SamplesCount}\r\n {' / '}\r\n {item.TotalSamplesCount}\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\nfunction PriorityIcon({ priority = 'Medium' }: { priority?: PrioritiesUnion }) {\r\n const getIcon = (priority: PrioritiesUnion): IconName => {\r\n switch (priority) {\r\n case 'Highest':\r\n return 'chevrons-up';\r\n case 'High':\r\n return 'chevron-up';\r\n case 'Low':\r\n return 'chevron-down';\r\n case 'Lowest':\r\n return 'chevrons-down';\r\n case 'Medium':\r\n return 'equals';\r\n default:\r\n assertExhaustive(priority);\r\n }\r\n };\r\n const getIconColor = (priority: PrioritiesUnion): TypeColor => {\r\n switch (priority) {\r\n case 'Highest':\r\n case 'High':\r\n return 'danger';\r\n\r\n case 'Low':\r\n case 'Lowest':\r\n return 'primary';\r\n case 'Medium':\r\n return 'primary';\r\n default:\r\n assertExhaustive(priority);\r\n }\r\n };\r\n return ;\r\n}\r\n\r\nconst StyledCardContentRow = styled('div')(({ theme }) => ({\r\n width: '100%',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n}));\r\n\r\nconst StyledFoo = styled(Grid)(({ theme }) => ({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n gap: theme.spacing(1),\r\n alignItems: 'center',\r\n}));\r\n","import { Box, Paper, styled } from '@material-ui/core';\r\nimport {\r\n DragDropContext,\r\n Draggable,\r\n DraggableProvidedDragHandleProps,\r\n DropResult,\r\n Droppable,\r\n ResponderProvided,\r\n} from 'react-beautiful-dnd';\r\nimport { Identifiable } from 'types/common';\r\nimport { ISection } from '../../slice/types';\r\nimport { ValueChangeHandler } from 'types/ValueChangeHandler';\r\nimport { tryParseInt } from 'utils/string-utils';\r\nimport { InfiniteScroll } from 'app/components/InfiniteScroll';\r\n\r\nexport type KanbanChangeEvent = {\r\n Id: number;\r\n sourceIndex: number;\r\n destinationIndex: number;\r\n sourceSectionId: number;\r\n destinationSectionId: number;\r\n};\r\n\r\nexport interface IKanbanProps<\r\n TSection extends Identifiable,\r\n TItem extends Identifiable\r\n> {\r\n data: Array>;\r\n renderTitle: (section: ISection) => React.ReactNode;\r\n renderItem: (\r\n item: TItem,\r\n section: ISection,\r\n\r\n dragHandleProps?: DraggableProvidedDragHandleProps,\r\n ) => React.ReactNode;\r\n onChange: ValueChangeHandler;\r\n onLoadMore: (sectionId: number) => void;\r\n}\r\nexport function Kanban<\r\n TSection extends Identifiable,\r\n TItem extends Identifiable\r\n>(props: IKanbanProps) {\r\n const handleDragEnd = (result: DropResult, provided: ResponderProvided) => {\r\n console.debug(result, provided);\r\n if (result.destination === undefined) {\r\n return;\r\n }\r\n const itemId = tryParseInt(result.draggableId);\r\n if (itemId === undefined) {\r\n return;\r\n }\r\n const sourceSectionId = tryParseInt(result.source.droppableId);\r\n if (sourceSectionId === undefined) {\r\n return;\r\n }\r\n const destinationSectionId = tryParseInt(result.destination.droppableId);\r\n if (destinationSectionId === undefined) {\r\n return;\r\n }\r\n const sourceIndex = result.source.index;\r\n if (sourceIndex === undefined) {\r\n return;\r\n }\r\n const destinationIndex = result.destination.index;\r\n if (destinationIndex === undefined) {\r\n return;\r\n }\r\n\r\n props.onChange({\r\n Id: itemId,\r\n sourceIndex,\r\n destinationIndex: destinationIndex,\r\n sourceSectionId,\r\n destinationSectionId: destinationSectionId,\r\n });\r\n };\r\n\r\n const next = (sectionId: number) => {\r\n props.onLoadMore(sectionId);\r\n };\r\n return (\r\n \r\n \r\n {props.data.map(section => (\r\n \r\n \r\n {(droppableProvided, droppableSnapshot) => (\r\n next(section.id)}\r\n >\r\n \r\n {props.renderTitle(section)}\r\n {section.data !== undefined &&\r\n section.data.items.map((item, index) => {\r\n return (\r\n \r\n {(\r\n draggableProvided,\r\n draggableSnapshot,\r\n draggableRubric,\r\n ) => (\r\n \r\n {props.renderItem(\r\n item,\r\n section,\r\n draggableProvided.dragHandleProps,\r\n )}\r\n \r\n )}\r\n \r\n );\r\n })}\r\n {droppableProvided.placeholder}\r\n \r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\nconst StyledGridContainer = styled(Box)(({ theme }) => ({\r\n marginTop: theme.spacing(2),\r\n display: 'flex',\r\n flexDirection: 'row',\r\n gap: theme.spacing(2),\r\n width: '100%',\r\n overflowX: 'scroll',\r\n}));\r\nconst StyledColumn = styled(Box)(({ theme }) => ({\r\n width: 323,\r\n}));\r\nconst CardsContainer = styled(Paper)(({ theme }) => ({\r\n backgroundColor: theme.palette.background.default,\r\n padding: theme.spacing(2),\r\n display: 'flex',\r\n gap: theme.spacing(2),\r\n flexDirection: 'column',\r\n margin: '3px',\r\n}));\r\n","/**\r\n *\r\n * ContentBox\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n createStyles,\r\n makeStyles,\r\n Theme,\r\n Box,\r\n BoxProps,\r\n} from '@material-ui/core';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport clsx from 'clsx';\r\nimport { isMobile } from 'react-device-detect';\r\n\r\n/**\r\n * Provides standard spacing for direct children of FrontendLayout\r\n */\r\nexport function FrontendLayoutContentBox({ className, ...props }: BoxProps) {\r\n const isMobile = DetectIsMobile();\r\n const classes = useStyles({ isMobile: isMobile });\r\n return ;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n margin: isMobile ? theme.spacing(2, 2, 0) : theme.spacing(4, 4, 0),\r\n },\r\n }),\r\n);\r\n","/**\r\n *\r\n * ServiceRequestsKanbanPage\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport {\r\n Box,\r\n Chip,\r\n createStyles,\r\n Grid,\r\n makeStyles,\r\n styled,\r\n Theme,\r\n} from '@material-ui/core';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport {\r\n DragDropContext,\r\n DropResult,\r\n ResponderProvided,\r\n} from 'react-beautiful-dnd';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport { ServiceRequestStatusMultiPicker } from 'app/components/pickers/AutocompletePickers/ServiceRequestStatusMultiPicker';\r\nimport { ServiceRequestCard } from './components/ServiceRequestCard';\r\nimport { TitlePage } from 'app/Layout/FrontendLayout/components/PageWrapper/components/TitlePage';\r\nimport { IBasePageProps } from '../IBasePageProps';\r\nimport { useFilters } from 'app/components/BasicTable/withSavedHistory';\r\nimport { GetFilters, StatusFilterId } from './Filter';\r\nimport { FilterValueType } from 'app/components/BasicTable/BasicFilter/FilterValueType';\r\nimport { IServiceRequestTicketDto } from 'api/odata/generated/entities/IServiceRequestTicketDto';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useServiceRequestsKanbanSlice } from './slice';\r\nimport { selectServiceRequestsKanbanData } from './slice/selectors';\r\nimport { Kanban, KanbanChangeEvent } from './components/Kanban';\r\nimport { FrontendLayoutContentBox } from 'app/Layout/FrontendLayout/components/ContentBox';\r\nimport { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\r\n\r\nexport interface ServiceRequestsKanbanPageProps extends IBasePageProps {}\r\n\r\nexport type ServiceRequestKanbanItemType = IServiceRequestTicketDto;\r\n\r\ninterface IState {\r\n statuses?: IServiceRequestStatusDto[];\r\n selectedStatuses: IServiceRequestStatusDto[];\r\n tickets: Array;\r\n}\r\nexport const ServiceRequestsKanbanPagePath = '/serviceRequests/kanban';\r\nexport interface ServiceRequestsKanbanProps extends IState {\r\n onDragEnd: (result: DropResult, provided: ResponderProvided) => void;\r\n}\r\nexport function ServiceRequestsKanban(props: ServiceRequestsKanbanProps) {\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\nconst SERVICE_REQUEST_KANBAN_IGNORED_STATUSES: Array = [\r\n 'Draft',\r\n 'Pending',\r\n 'ReturnedToUser',\r\n 'Cancelled',\r\n 'Completed',\r\n];\r\nexport function ServiceRequestsKanbanPage(\r\n props: ServiceRequestsKanbanPageProps,\r\n) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const classes = useStyles({ isMobile: isMobile });\r\n const dispatch = useDispatch();\r\n const { actions } = useServiceRequestsKanbanSlice();\r\n // const [state, , extendState] = useAsyncExtendedState({\r\n // selectedStatuses: [],\r\n // tickets: [],\r\n // });\r\n\r\n useEffectOnMount(() => {\r\n //todo\r\n });\r\n\r\n const { appliedFilters, setFilterValue } = useFilters(\r\n ServiceRequestsKanbanPagePath,\r\n GetFilters,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n true,\r\n );\r\n\r\n const handleSelectedStatusesChange = (value: FilterValueType) => {\r\n setFilterValue(StatusFilterId, value as FilterValueType);\r\n };\r\n\r\n const selectedStatuses = (appliedFilters?.find(f => f.id === StatusFilterId)\r\n ?.value as IServiceRequestStatusDto[] | undefined)?.filter(\r\n status =>\r\n !SERVICE_REQUEST_KANBAN_IGNORED_STATUSES.includes(\r\n status.InternalStatusId,\r\n ),\r\n );\r\n\r\n React.useEffect(() => {\r\n const selectedStatuses = appliedFilters?.find(f => f.id === StatusFilterId)\r\n ?.value as IServiceRequestStatusDto[] | undefined;\r\n dispatch(actions.setSelectedStatuses(selectedStatuses));\r\n }, [actions, appliedFilters, dispatch]);\r\n\r\n const kanban = useSelector(selectServiceRequestsKanbanData);\r\n const handleChange = React.useCallback(\r\n (value: KanbanChangeEvent) => {\r\n dispatch(actions.reorder(value));\r\n },\r\n [actions, dispatch],\r\n );\r\n const handleMore = (sectionId: number) => {\r\n dispatch(actions.getMoreItems(sectionId));\r\n };\r\n\r\n return (\r\n
    \r\n \r\n \r\n\r\n \r\n\r\n {kanban !== undefined && (\r\n (\r\n \r\n )}\r\n renderTitle={section => (\r\n \r\n \r\n \r\n )}\r\n onChange={handleChange}\r\n onLoadMore={handleMore}\r\n />\r\n )}\r\n \r\n
    \r\n );\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n // root css\r\n },\r\n }),\r\n);\r\n\r\nconst StyledServiceRequestStatusMultiPicker = styled(\r\n ServiceRequestStatusMultiPicker,\r\n)(({ theme }) => ({\r\n marginTop: theme.spacing(2),\r\n}));\r\n","import { createGlobalStyle } from 'styled-components';\r\n\r\nexport const GlobalStyle = createGlobalStyle`\r\n \r\n/* heebo-300 - latin_hebrew */\r\n@font-face {\r\n font-family: 'Heebo';\r\n font-style: normal;\r\n font-weight: 300;\r\n src: local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/heebo-v10-latin_hebrew-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */\r\n url('${process.env.PUBLIC_URL}/fonts/heebo-v10-latin_hebrew-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */\r\n}\r\n\r\n/* heebo-regular - latin_hebrew */\r\n@font-face {\r\n font-family: 'Heebo';\r\n font-style: normal;\r\n font-weight: 400;\r\n src: local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/heebo-v10-latin_hebrew-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */\r\n url('${process.env.PUBLIC_URL}/fonts/heebo-v10-latin_hebrew-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */\r\n}\r\n\r\n/* heebo-500 - latin_hebrew */\r\n@font-face {\r\n font-family: 'Heebo';\r\n font-style: normal;\r\n font-weight: 500;\r\n src: local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/heebo-v10-latin_hebrew-500.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */\r\n url('${process.env.PUBLIC_URL}/fonts/heebo-v10-latin_hebrew-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */\r\n}\r\n\r\n/* heebo-700 - latin_hebrew */\r\n@font-face {\r\n font-family: 'Heebo';\r\n font-style: normal;\r\n font-weight: 700;\r\n src: local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/heebo-v10-latin_hebrew-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */\r\n url('${process.env.PUBLIC_URL}/fonts/heebo-v10-latin_hebrew-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */\r\n}\r\n\r\n /* open-sans-regular - latin */\r\n @font-face {\r\n font-family: 'Open Sans';\r\n font-style: normal;\r\n font-weight: 400;\r\n src: local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/open-sans-v20-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */\r\n url('${process.env.PUBLIC_URL}/fonts/open-sans-v20-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */\r\n }\r\n/* open-sans-hebrew */\r\n @font-face {\r\n font-family: 'Open Sans Hebrew', serif;\r\n font-style: normal;\r\n font-weight: 400;\r\n src: local(''),\r\n url('${process.env.PUBLIC_URL}/fonts/OpenSansHebrew-Regular.woff') format('woff'),\r\n url('${process.env.PUBLIC_URL}/fonts/OpenSansHebrew-Regular-1.woff') format('woff'), \r\n url('${process.env.PUBLIC_URL}/fonts/OpenSansHebrew-Bold.woff') format('woff'),\r\n url('${process.env.PUBLIC_URL}/fonts/OpenSansHebrew-ExtraBold.woff') format('woff'),\r\n url('${process.env.PUBLIC_URL}/fonts/OpenSansHebrew-Light.woff') format('woff');\r\n }\r\n`;\r\nexport const LatoStyle = createGlobalStyle`\r\n@font-face {\r\n font-family: 'Lato', sans-serif;\r\n src: url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-BoldItalic.woff2') format('woff2'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-BoldItalic.woff') format('woff');\r\n font-weight: bold;\r\n font-style: italic;\r\n font-display: swap;\r\n}\r\n\r\n@font-face {\r\n font-family: 'Lato', sans-serif;\r\n src: url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-BlackItalic.woff2') format('woff2'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-BlackItalic.woff') format('woff');\r\n font-weight: 900;\r\n font-style: italic;\r\n font-display: swap;\r\n}\r\n\r\n@font-face {\r\n font-family: 'Lato', sans-serif;\r\n src: url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Black.woff2') format('woff2'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Black.woff') format('woff');\r\n font-weight: 900;\r\n font-style: normal;\r\n font-display: swap;\r\n}\r\n\r\n@font-face {\r\n font-family: 'Lato', sans-serif;\r\n src: url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Bold.woff2') format('woff2'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Bold.woff') format('woff');\r\n font-weight: bold;\r\n font-style: normal;\r\n font-display: swap;\r\n}\r\n\r\n@font-face {\r\n font-family: 'Lato', sans-serif;\r\n src: url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Light.woff2') format('woff2'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Light.woff') format('woff');\r\n font-weight: 300;\r\n font-style: normal;\r\n font-display: swap;\r\n}\r\n\r\n@font-face {\r\n font-family: 'Lato', sans-serif;\r\n src: url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Regular.woff2') format('woff2'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Regular.woff') format('woff');\r\n font-weight: normal;\r\n font-style: normal;\r\n font-display: swap;\r\n}\r\n\r\n@font-face {\r\n font-family: 'Lato', sans-serif;\r\n src: url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-LightItalic.woff2') format('woff2'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-LightItalic.woff') format('woff');\r\n font-weight: 300;\r\n font-style: italic;\r\n font-display: swap;\r\n}\r\n\r\n@font-face {\r\n font-family: 'Lato', sans-serif;\r\n src: url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Italic.woff2') format('woff2'),\r\n url('${process.env.PUBLIC_URL}/fonts/Lato/Lato-Italic.woff') format('woff');\r\n font-weight: normal;\r\n font-style: italic;\r\n font-display: swap;\r\n}\r\n`;\r\n","/**\r\n * Asynchronously loads the component for NotFoundPage\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const NotFoundPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.NotFoundPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const FrontendLayout = lazyLoad(\r\n () => import('./index'),\r\n module => module.FrontendLayout,\r\n);\r\n","import i18next from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\n// import LanguageDetector from 'i18next-browser-languagedetector';\r\nimport Backend from 'i18next-http-backend';\r\n\r\nimport en from './en/GRes.json';\r\nimport { convertLanguageJsonToObject } from './translations';\r\n\r\nexport const translationsJson = {\r\n en: {\r\n translation: en,\r\n },\r\n};\r\n\r\n// Create the 'translations' object to provide full intellisense support for the static json files.\r\nconvertLanguageJsonToObject(en);\r\n\r\n// https://github.com/i18next/i18next-http-backend\r\nconst backendOptions = {\r\n // path where resources get loaded from, or a function\r\n // '/api/locales/{{lng}}/{{ns}}.json',\r\n // returning a path:\r\n // function(lngs, namespaces) { return customPath; }\r\n // the returned path will interpolate lng, ns if provided like giving a static path\r\n //\r\n // If allowMultiLoading is false, lngs and namespaces will have only one element each,\r\n // If allowMultiLoading is true, lngs and namespaces can have multiple elements\r\n loadPath: function (lngs, namespaces) {\r\n console.log('i18next-httpBackend', lngs, namespaces);\r\n return process.env.PUBLIC_URL + '/api/locales?lng={{lng}}&ns={{ns}}';\r\n },\r\n};\r\n\r\nexport const i18n = i18next\r\n // use i18next-http-backend to fetch localization files from the server\r\n .use(Backend)\r\n // pass the i18n instance to react-i18next.\r\n .use(initReactI18next)\r\n // detect user language\r\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\r\n // .use(LanguageDetector)\r\n // init i18next\r\n // for all options read: https://www.i18next.com/overview/configuration-options\r\n .init({\r\n // The whole Animals Kiosk must be localized to he\r\n // TODO: use the system/app setting to set initial locale here\r\n lng: 'en',\r\n fallbackLng: 'en',\r\n // defaultNS: 'GRes',\r\n // fallbackNS: 'GRes',\r\n debug:\r\n process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test',\r\n\r\n // defaultNS: 'tran',\r\n appendNamespaceToMissingKey: true,\r\n interpolation: {\r\n escapeValue: false, // not needed for react as it escapes by default\r\n },\r\n backend: backendOptions,\r\n });\r\n","/**\r\n *\r\n * Asynchronously loads the component for AnimalTypes\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AnimalTypesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AnimalTypesPage,\r\n);\r\n","/**\r\n * This file is only need if you want to extract messages into JSON files in locales folder\r\n * AND if you are also using the object syntax instead of string syntax. \\\r\n * Check the documentation section i18n for details\r\n */\r\nimport { translations } from 'locales/translations';\r\nimport { _t } from 'utils/messages';\r\n\r\nexport const messages = {\r\n alert: () => _t(translations.Alert, 'Alert'),\r\n ok: () => _t(translations.OK, 'OK'),\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) => state.dialogAlert || initialState;\r\n\r\nexport const selectDialogAlert = createSelector([selectSlice], state => state);\r\n","/**\r\n *\r\n * Alert\r\n *\r\n */\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogContentText,\r\n DialogActions,\r\n useTheme,\r\n useMediaQuery,\r\n} from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { messages } from './messages';\r\nimport { useDialogAlertSlice } from './slice';\r\nimport { selectDialogAlert } from './slice/selectors';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nexport const DialogAlert = () => {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useDialogAlertSlice();\r\n const { open, content } = useSelector(selectDialogAlert);\r\n const handleClose = () => {\r\n dispatch(actions.hideAlert());\r\n };\r\n const theme = useTheme();\r\n const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\r\n\r\n return (\r\n \r\n {t(messages.alert())}\r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SnackbarManager = lazyLoad(\r\n () => import('./index'),\r\n module => module.default,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for InternalIdLoginPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const InternalIdLoginPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.InternalIdLoginPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for AnimalsListPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AnimalsListPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AnimalsListPage,\r\n);\r\n","import { makeStyles } from '@material-ui/core/styles';\r\n\r\nexport const useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n },\r\n content: {\r\n flexGrow: 1,\r\n height: '100vh',\r\n overflow: 'auto',\r\n },\r\n container: {\r\n paddingTop: theme.spacing(4),\r\n paddingBottom: theme.spacing(4),\r\n },\r\n}));\r\n","/**\r\n *\r\n * PosLayout\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport { useStyles } from './styles';\r\n\r\nexport interface PosLayoutProps {\r\n children: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Empty Layout optimized for touch enabled devices - medium screen size\r\n * Originally developed for a POS (large anminals - technion anm)\r\n */\r\nexport function PosLayout({ children }: PosLayoutProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n\r\n const classes = useStyles();\r\n return (\r\n
    \r\n
    {children}
    \r\n
    \r\n );\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for AnimalCaseConsumablesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AnimalCaseConsumablesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AnimalCaseConsumablesPage,\r\n);\r\n","import styled from 'styled-components/macro';\r\n\r\nexport const FlexColumnDiv = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n`;\r\n","/**\r\n *\r\n * LoginLayout\r\n *\r\n */\r\nimport { Copyright } from 'app/components/Copyright';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { makeStyles, Theme, useTheme } from '@material-ui/core/styles';\r\nimport Container from '@material-ui/core/Container';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport {\r\n AppBar,\r\n Box,\r\n ListItemIcon,\r\n ListItemText,\r\n MenuItem,\r\n Toolbar,\r\n} from '@material-ui/core';\r\nimport { BookitlabLogo } from 'app/components/BookitlabLogo';\r\nimport { FlexColumnDiv } from '../../components/basic/Wrappers/FlexWrappers/flexColumn';\r\nimport { StyledUserMenu } from '../FrontendLayout/components/TopBar/styled';\r\nimport { toRootedURL } from 'utils/url-utils';\r\nimport { translations } from 'locales/translations';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\n\r\nexport interface LoginLayoutProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minHeight: '100vh',\r\n },\r\n main: {\r\n //marginTop: theme.spacing(3),\r\n flexGrow: 1,\r\n },\r\n mainWrapper: {\r\n height: '80vh',\r\n },\r\n footer: {},\r\n paper: {\r\n //marginTop: theme.spacing(8),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n minWidth: '40%',\r\n '& p,h1': {\r\n padding: theme.spacing(1),\r\n },\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n form: {\r\n width: '100%', // Fix IE 11 issue.\r\n marginTop: theme.spacing(1),\r\n },\r\n submit: {\r\n margin: theme.spacing(3, 0, 2),\r\n },\r\n}));\r\n\r\nexport function LoginLayout({ children }: LoginLayoutProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const theme = useTheme();\r\n const handleClick = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n const classes = useStyles();\r\n return (\r\n
    \r\n \r\n \r\n handleClick(event)}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {children}\r\n {/* */}\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport interface LogoMenuProps {\r\n anchorEl: HTMLElement | null;\r\n handleClose: () => void;\r\n theme: Theme;\r\n}\r\nconst LogoMenu = React.memo(function LogoMenuFunc(props: LogoMenuProps) {\r\n const { t } = useTranslation();\r\n const isMobile = DetectIsMobile();\r\n return (\r\n <>\r\n props.handleClose()}\r\n >\r\n props.handleClose()}\r\n component={'a'}\r\n href={toRootedURL('/account/signout')}\r\n >\r\n \r\n \r\n \r\n \r\n {t(translations.main_master_LogOutLinkText)}\r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","/**\r\n *\r\n * Asynchronously loads the component for AnimalsHomePage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AnimalsHomePage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AnimalsHomePage,\r\n);\r\n","/**\r\n *\r\n * PrivateAnimalRoute\r\n *\r\n */\r\nimport { selectInternalIdLogin } from 'app/pages/Animals/InternalIdLoginPage/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Redirect, Route, RouteProps, useLocation } from 'react-router';\r\nimport { useInternalIdLoginSlice } from '../InternalIdLoginPage/slice';\r\n\r\nexport interface PrivateAnimalRouteProps extends RouteProps {}\r\n\r\nexport function PrivateAnimalRoute(props: PrivateAnimalRouteProps) {\r\n const login = useSelector(selectInternalIdLogin);\r\n const location = useLocation();\r\n const isAuthenticated = login.identity?.Id !== undefined;\r\n const isInitialized = login.initialized;\r\n const dispatch = useDispatch();\r\n const { actions } = useInternalIdLoginSlice();\r\n React.useEffect(() => {\r\n if (!isInitialized) {\r\n dispatch(actions.init({ isLargeAnimals: true }));\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n if (!isInitialized) {\r\n return <>Inintializing...;\r\n }\r\n if (isAuthenticated) {\r\n return ;\r\n } else {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for CreateNewCasePage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CreateNewCasePage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CreateNewCasePage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for SamplesListPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SamplesListPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SamplesListPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for RunPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const RunDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.RunDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for RequestSamplesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const RequestSamplesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.RequestSamplesPage,\r\n);\r\n\r\nexport const RequestDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.RequestDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for TrainingSessionsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const TrainingSessionsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.TrainingSessionsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Buildings Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const BuildingsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.BuildingsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Reservations History Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const History = lazyLoad(\r\n () => import('./index'),\r\n module => module.HistoryPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AddNewReportPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AddNewReportPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for WaitingListPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const TrainingWaitingListPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.TrainingWaitingListPage,\r\n);\r\n","import { createBrowserHistory } from 'history';\r\n\r\nexport const history = createBrowserHistory({\r\n basename: process.env.PUBLIC_URL,\r\n});\r\n","/**\r\n *\r\n * Asynchronously loads the component for EmailNotifications\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const EmailNotificationsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.EmailNotificationsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for ExperimentTemplates\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ExperimentTemplatesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ExperimentTemplatesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for UsersHistory\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const UsersHistoryPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.UsersHistory,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for UserTrainingPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const UserTrainingPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.UserTrainingPage,\r\n);\r\n","/*\r\n * Asynchronously loads the component for NotAvailable\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const NotAvailable = lazyLoad(\r\n () => import('./index'),\r\n module => module.NotAvailable,\r\n);\r\n","/**\r\n *\r\n * RestrictedRoute\r\n *\r\n */\r\nimport {\r\n selectAuthenticatedUser,\r\n selectSiteMapProvider,\r\n} from 'app/slice/selectors';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useLocation } from 'react-router';\r\nimport { RouteProps, Redirect, Route } from 'react-router-dom';\r\n\r\nexport function RestrictedRoute(props: RouteProps): React.ReactElement {\r\n const User = useSelector(selectAuthenticatedUser);\r\n const { pathname } = useLocation();\r\n const siteMapProvider = useSelector(selectSiteMapProvider);\r\n\r\n const { component: Component, ...rest } = props;\r\n\r\n const render = propss => {\r\n let allowedNode = siteMapProvider.accesibleByRole(pathname, User);\r\n if (allowedNode === false) {\r\n return ;\r\n } else if (allowedNode === true) {\r\n return ;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n return ;\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for Users Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const Users = lazyLoad(\r\n () => import('./index'),\r\n module => module.UsersPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for AnimalExtendedBillingReportPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AnimalExtendedBillingReportPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AnimalExtendedBillingReportPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for User Training (Modification) History Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const UserTrainingHistoryPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.UserTrainingHistory,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for OtherService Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const OtherServicesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.OtherServicesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for BudgetsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const BudgetsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.BudgetsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Reservations History Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ServiceRequestPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ServiceRequestListPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for WorkOrders Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const WorkOrdersPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.WorkOrders,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const DocumentsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.DocumentsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for QuizPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const QuizPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.QuizPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for QuizDetailsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const QuizDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.QuizDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for CreateUserTrainingPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const UserTrainingDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.TrainingDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for SampleModificationsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SampleModificationsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SampleModificationsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for UsageHistory Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const UsageHistory = lazyLoad(\r\n () => import('./index'),\r\n module => module.UsageHistoryPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for RunsListPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const RunsListPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.RunsListPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for AnimalCasesHistoryPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AnimalCasesHistoryPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AnimalCasesHistoryPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SendEmailToUsersPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SendEmailToUsers,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Charges Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const Charges = lazyLoad(\r\n () => import('./index'),\r\n module => module.ChargesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for MyAssetsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const MyAssetsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.MyAssetsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Locations Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const Locations = lazyLoad(\r\n () => import('./index'),\r\n module => module.LocationsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Building Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const BuildingPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.BuildingPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Campuses Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CampusesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CampusesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Areas Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AreasPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AreasPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for LocationList Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const LocationListPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.LocationListPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for LocationList Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SubLocationListPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SubLocationListPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for InvoiceBatches Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const InvoiceBatches = lazyLoad(\r\n () => import('./index'),\r\n module => module.InvoiceBatchesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for CategoriesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CategoriesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CategoriesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for CategoryGroupsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CategoryGroupsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CategoryGroupsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for BillingPreviewPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const BillingPreviewPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.BillingPreviewPage,\r\n);\r\n","import { createSelector } from '@reduxjs/toolkit';\r\n\r\nimport { RootState } from 'types';\r\nimport { initialState } from '.';\r\n\r\nconst selectSlice = (state: RootState) =>\r\n state.onlineBudgetsStatus || initialState;\r\n\r\nexport const selectOnlineBudgetsStatus = createSelector(\r\n [selectSlice],\r\n state => state,\r\n);\r\n\r\nexport const selectOnlineBudgetsStatusTableState = createSelector(\r\n [selectOnlineBudgetsStatus],\r\n state => state.tableState,\r\n);\r\nexport const selectOnlineBudgetsStatusSelected = createSelector(\r\n [selectOnlineBudgetsStatus],\r\n state => state.selected,\r\n);\r\nexport const selectPayState = createSelector(\r\n [selectOnlineBudgetsStatus],\r\n state => state.pay,\r\n);\r\n\r\nexport const selectGenerateInvoicesState = createSelector(\r\n [selectOnlineBudgetsStatus],\r\n state => state.generateInvoicesState,\r\n);\r\nexport const selectChargeOnlineBudgetsState = createSelector(\r\n [selectOnlineBudgetsStatus],\r\n state => state.charge,\r\n);\r\nexport const selectEndDate = createSelector(\r\n [selectOnlineBudgetsStatus],\r\n state => state.endDate,\r\n);\r\n\r\nexport const selectIGenerateInvoicesAndSendToSapState = createSelector(\r\n [selectOnlineBudgetsStatus],\r\n state => state.generateInvoicesAndSendToSap,\r\n);\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { call, put, select, takeLatest, takeLeading } from 'redux-saga/effects';\r\nimport { onlineBudgetsStatusActions as actions } from '.';\r\nimport { appSettingsActions } from 'app/slice';\r\nimport { translations } from 'locales/translations';\r\nimport i18next from 'i18next';\r\nimport { httpClient } from 'api/HttpClient';\r\nimport { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { IODataQueryResponse } from 'api/odata/IODataQueryResponse';\r\nimport { AxiosError } from 'axios';\r\nimport { selectEndDate } from './selectors';\r\nimport { SnackBarActionType } from 'app/Layout/FrontendLayout/components/Snackbar/types';\r\nimport { IPaymentPayload, PaymentApi } from 'api/PaymentApi';\r\nimport {\r\n ChargeOnlineBudgetResponse,\r\n IPayActionPayload,\r\n PaymentMethods,\r\n} from './types';\r\nimport { toEntity } from 'utils/entity-utils';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport {\r\n BillingPreviewApi,\r\n UpdateModel,\r\n} from 'app/pages/BillingPreviewPage/Actions/Apis';\r\nimport { getPeriodTypesEntity } from 'app/components/DatePeriods';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { ExportToExcel } from 'utils/ExportToExcel';\r\n\r\nfunction* doGetTableData(action: PayloadAction<{ endDate: Date }>) {\r\n try {\r\n const response: IODataQueryResponse = yield call(\r\n httpClient.get,\r\n '/api/odata/v4/InvoiceBudgetBalances',\r\n {\r\n endDate: action.payload.endDate,\r\n },\r\n );\r\n yield put(actions.getTableData_Success(response.value));\r\n } catch (error: unknown) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n message: i18next.t(translations.errormessage),\r\n variant: 'error',\r\n }),\r\n );\r\n yield put(actions.getTableData_Error(Error));\r\n }\r\n}\r\n\r\nfunction* doGenerateInvoices(action: PayloadAction<{ endDate: Date }>) {\r\n try {\r\n const api = new BillingPreviewApi();\r\n const payload: UpdateModel = {\r\n Item: {\r\n ServiceGroupsCsv: '',\r\n UserGroupsCsv: '',\r\n PeriodType: getPeriodTypesEntity('CustomDate')?.Id,\r\n Start: new Date(\r\n dateUtils.addYears(action.payload.endDate, -2),\r\n ).toISOString(),\r\n End: new Date(action.payload.endDate).toISOString(),\r\n Remarks: '',\r\n BudgetIds: [],\r\n BudgetIncluded: true,\r\n invoiceBy: undefined,\r\n CoreInvoiceBy: '',\r\n InvoiceCreatedBy: '',\r\n InvoiceVat: '',\r\n FundingTypeId: undefined,\r\n CoreBy: 0,\r\n ShowZeroAmountInvoices: false,\r\n ShowInvoicePartialEvents: false,\r\n },\r\n Async: false,\r\n Recalculate: false,\r\n };\r\n\r\n const result: IResponseType = yield call(api.FormView1_UpdateItem, payload);\r\n for (const message of result.SuccessMessages) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: message,\r\n }),\r\n );\r\n }\r\n for (const message of result.WarningMessages) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'warning',\r\n message: message,\r\n }),\r\n );\r\n }\r\n for (const message of result.ErrorMessages) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: message,\r\n }),\r\n );\r\n }\r\n\r\n yield put(actions.generateInvoices_Success());\r\n yield put(actions.getTableData({ endDate: action.payload.endDate }));\r\n } catch {\r\n yield put(actions.generateInvoices_Error());\r\n }\r\n}\r\n\r\nfunction* doChargeOnlineBudgets(\r\n action: PayloadAction,\r\n) {\r\n const endDate = yield select(selectEndDate);\r\n if (endDate == null) {\r\n return;\r\n }\r\n const url = '/api/odata/v4/InvoiceBudgetBalances';\r\n const processed: IInvoiceBudgetBalanceDto[] = [];\r\n const errorMessages: string[] = [];\r\n const messageKey = 'chargeOnlineBudgets';\r\n for (let index = 0; index < action.payload.length; index++) {\r\n const charge = action.payload[index];\r\n yield put(actions.chargeOnlineBudgets_SetCurrentRecord(charge));\r\n yield put(\r\n actions.chargeOnlineBudgets_SetStatus(\r\n (100 * (index + 1)) / action.payload.length,\r\n ),\r\n );\r\n try {\r\n const response: ChargeOnlineBudgetResponse = yield call(\r\n httpClient.post,\r\n url,\r\n charge,\r\n { params: { endDate: endDate } },\r\n );\r\n let success = response.SuccessTransactionsCount === 1;\r\n if (success) {\r\n processed.push(charge);\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n key: messageKey,\r\n //todo: add to gres\r\n\r\n message: `Successfully processed ${charge.HostBudgetNumber} ${charge.ServiceGroup}`,\r\n }),\r\n );\r\n }\r\n\r\n for (const message of response.Messages) {\r\n errorMessages.push(\r\n `${charge.UserGroup} ${charge.Budget} ${charge.ServiceGroup}: ${message}`,\r\n );\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n key: messageKey,\r\n message: message,\r\n }),\r\n );\r\n }\r\n } catch (error) {\r\n //todo: extract error message from error response\r\n const errorMessage = (error as AxiosError)?.response?.data?.error.message;\r\n yield put(actions.chargeOnlineBudgets_Error([errorMessage]));\r\n return;\r\n }\r\n }\r\n yield put(actions.chargeOnlineBudgets_SetCurrentRecord(undefined));\r\n yield put(actions.chargeOnlineBudgets_Success(processed));\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: messageKey,\r\n variant:\r\n processed.length === action.payload.length\r\n ? 'success'\r\n : processed.length === 0\r\n ? 'error'\r\n : 'warning',\r\n message: `Processed successfully ${processed.length} out of ${action.payload.length}`,\r\n }),\r\n );\r\n if (errorMessages.length === 0) {\r\n yield put(actions.chargeOnlineBudgets_SetDialogOpen(false));\r\n }\r\n if (errorMessages.length > 0) {\r\n yield put(actions.chargeOnlineBudgets_Error(errorMessages));\r\n }\r\n // refresh table only if any of the rows were processed successfully\r\n if (processed.length > 0) {\r\n // yield put(actions.getTableData({ endDate: endDate }));\r\n\r\n yield put(\r\n appSettingsActions.addNotification({\r\n key: 'updatedSuccess',\r\n message: i18next.t(translations.ProcessingFinished),\r\n variant: 'success',\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n}\r\nfunction* doDownloadChargeOnlineBudgetsErrors(\r\n action: PayloadAction,\r\n) {\r\n if (action.payload !== undefined) {\r\n var fields = ['Errors'];\r\n const x = new ExportToExcel('Errors');\r\n x.AddWorkSheetHeader(fields);\r\n x.AddWorkSheetData(action.payload.map(err => ({ errors: err })));\r\n yield call(x.ExportToExcel, 'errors', x.book);\r\n }\r\n}\r\nfunction* doPay(action: PayloadAction) {\r\n const paymentDate = new Date();\r\n const payments = action.payload.Rows.map(balanceRow =>\r\n JSON.parse(balanceRow.Invoices ?? '[]').map(invoice => {\r\n const payment: IPaymentPayload = {\r\n InvoiceId: invoice.Id ?? undefined,\r\n Method: {\r\n Id: action.payload.PaymentMethod,\r\n Name: PaymentMethods[action.payload.PaymentMethod],\r\n },\r\n Amount: invoice.Charges - invoice.Payments,\r\n Budget: toEntity(balanceRow.BudgetId, balanceRow.Budget),\r\n Date: paymentDate,\r\n ServiceGroup: toEntity(\r\n balanceRow.ServiceGroupId,\r\n balanceRow.ServiceGroup,\r\n ),\r\n ShouldCloseInvoice: true,\r\n };\r\n return payment;\r\n }),\r\n )\r\n .reduce((accumulator, value) => accumulator?.concat(value ?? []), [])\r\n ?.filter(payment => payment.Amount !== undefined && payment.Amount > 0);\r\n if (payments === undefined) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: i18next.t(translations.AnErrorOccurred),\r\n actionType: SnackBarActionType.refreshTable,\r\n }),\r\n );\r\n return;\r\n }\r\n\r\n const messages: IResponseType[] = [];\r\n for (const [index, payment] of payments.entries()) {\r\n try {\r\n const result: IResponseType = yield call(PaymentApi.AddPayment, payment);\r\n yield put(actions.pay_setStatus((100 * (index + 1)) / payments.length));\r\n messages.push(result);\r\n } catch (error) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: (error as AxiosError).response?.data?.error?.message,\r\n actionType: SnackBarActionType.refreshTable,\r\n }),\r\n );\r\n yield put(actions.pay_Finish([]));\r\n return;\r\n }\r\n }\r\n yield put(actions.pay_Finish(messages));\r\n const success =\r\n messages.filter(\r\n message =>\r\n message.SuccessMessages.length > 0 &&\r\n message.ErrorMessages.length === 0,\r\n ).length === payments.length;\r\n if (success) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'success',\r\n message: i18next.t(translations.PaymentCreatedSuccess),\r\n }),\r\n );\r\n yield put(layoutActions.setRefreshTable(true));\r\n }\r\n}\r\n\r\nfunction* doGenerateSelectedInvoices(\r\n action: PayloadAction<{\r\n endDate: Date;\r\n selected: IInvoiceBudgetBalanceDto[];\r\n chargeOnlineBudgets: boolean;\r\n }>,\r\n) {\r\n const result: IResponseType = {\r\n SuccessMessages: [],\r\n ErrorMessages: [],\r\n WarningMessages: [],\r\n };\r\n try {\r\n for (const [index, item] of action.payload.selected.entries()) {\r\n yield put(\r\n actions.GenerateInvoicesAndChargeOnlineBudgets_SetCurrentRecord(item),\r\n );\r\n yield put(\r\n actions.GenerateInvoicesAndChargeOnlineBudgets_SetProgress(\r\n Math.floor((100 * index) / action.payload.selected.length),\r\n ),\r\n );\r\n const api = new BillingPreviewApi();\r\n const payload: UpdateModel = {\r\n Item: {\r\n ServiceGroupsCsv: item.ServiceGroupId.toString(),\r\n PeriodType: getPeriodTypesEntity('CustomDate')?.Id,\r\n Start: new Date(\r\n dateUtils.addYears(action.payload.endDate, -2),\r\n ).toISOString(),\r\n End: new Date(action.payload.endDate).toISOString(),\r\n Remarks: '',\r\n BudgetIds: [item.BudgetId],\r\n BudgetIncluded: true,\r\n invoiceBy: undefined,\r\n CoreInvoiceBy: '',\r\n InvoiceCreatedBy: '',\r\n InvoiceVat: '',\r\n FundingTypeId: undefined,\r\n CoreBy: 0,\r\n ShowZeroAmountInvoices: false,\r\n ShowInvoicePartialEvents: false,\r\n },\r\n Async: false,\r\n Recalculate: false,\r\n };\r\n\r\n const response: IResponseType = yield call(\r\n api.FormView1_UpdateItem,\r\n payload,\r\n );\r\n Object.keys(result).forEach(key =>\r\n response[key].forEach(message => result[key].push(message)),\r\n );\r\n }\r\n } catch {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: 'An error occurred',\r\n }),\r\n );\r\n yield put(actions.GenerateSelectedInvoices_Error());\r\n return;\r\n }\r\n yield put(actions.GenerateSelectedInvoices_Success());\r\n if (action.payload.chargeOnlineBudgets) {\r\n yield put(actions.chargeOnlineBudgets(action.payload.selected));\r\n }\r\n}\r\n\r\nexport function* onlineBudgetsStatusSaga() {\r\n yield takeLatest(actions.getTableData.type, doGetTableData);\r\n yield takeLeading(actions.generateInvoices.type, doGenerateInvoices);\r\n yield takeLeading(actions.chargeOnlineBudgets.type, doChargeOnlineBudgets);\r\n yield takeLeading(actions.pay.type, doPay);\r\n yield takeLeading(\r\n actions.chargeOnlineBudgets_DownloadErrors,\r\n doDownloadChargeOnlineBudgetsErrors,\r\n );\r\n yield takeLeading(\r\n actions.GenerateInvoicesAndChargeOnlineBudgets.type,\r\n doGenerateSelectedInvoices,\r\n );\r\n}\r\n","import { PayloadAction } from '@reduxjs/toolkit';\r\nimport { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { IResponseType } from 'types/ResponseType';\r\nimport { createSlice } from 'utils/@reduxjs/toolkit';\r\nimport { useInjectReducer, useInjectSaga } from 'utils/redux-injectors';\r\nimport { onlineBudgetsStatusSaga } from './saga';\r\nimport { IPayActionPayload, OnlineBudgetsStatusState } from './types';\r\n\r\nexport const initialState: OnlineBudgetsStatusState = {\r\n endDate: null,\r\n needTableRefresh: false,\r\n tableState: {\r\n processing: false,\r\n },\r\n selected: [],\r\n generateInvoicesState: {\r\n processing: false,\r\n },\r\n charge: {\r\n processing: false,\r\n },\r\n pay: {},\r\n generateInvoicesAndSendToSap: {},\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'onlineBudgetsStatus',\r\n initialState,\r\n reducers: {\r\n setEndDate(state, action: PayloadAction) {\r\n state.endDate = action.payload;\r\n },\r\n setneedTableRefresh(state, action: PayloadAction) {\r\n state.needTableRefresh = action.payload;\r\n },\r\n getTableData(state, action: PayloadAction<{ endDate: Date }>) {\r\n state.tableState.processing = true;\r\n state.tableState.error = undefined;\r\n },\r\n getTableData_Success(\r\n state,\r\n action: PayloadAction>,\r\n ) {\r\n state.tableState.processing = false;\r\n state.tableState.error = undefined;\r\n state.tableState.data = action.payload;\r\n },\r\n getTableData_Error(state, action: PayloadAction) {\r\n state.tableState.processing = false;\r\n state.tableState.error = 'ERROR';\r\n },\r\n\r\n setSelected(state, action: PayloadAction>) {\r\n state.selected = action.payload;\r\n },\r\n\r\n generateInvoices(\r\n state,\r\n action: PayloadAction<{\r\n endDate: Date;\r\n }>,\r\n ) {\r\n state.generateInvoicesState.processing = true;\r\n },\r\n generateInvoices_Success(state, action: PayloadAction) {\r\n state.generateInvoicesState.processing = false;\r\n },\r\n generateInvoices_Error(state, action: PayloadAction) {\r\n state.generateInvoicesState.processing = false;\r\n },\r\n\r\n chargeOnlineBudgets(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.charge = {\r\n data: action.payload,\r\n processing: true,\r\n dialogOpen: true,\r\n };\r\n },\r\n\r\n chargeOnlineBudgets_SetCurrentRecord(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.charge.currentRecord = action.payload;\r\n },\r\n chargeOnlineBudgets_SetStatus(state, action: PayloadAction) {\r\n state.charge.progress = action.payload;\r\n },\r\n chargeOnlineBudgets_SetDialogOpen(state, action: PayloadAction) {\r\n state.charge.dialogOpen = action.payload;\r\n },\r\n\r\n chargeOnlineBudgets_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.charge.processing = false;\r\n },\r\n chargeOnlineBudgets_Error(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.charge.processing = false;\r\n state.charge.errors = action.payload;\r\n },\r\n chargeOnlineBudgets_DownloadErrors(\r\n state,\r\n action: PayloadAction,\r\n ) {},\r\n\r\n pay(state, action: PayloadAction) {\r\n state.pay.data = action.payload;\r\n state.pay.dialogOpen = true;\r\n state.pay.status = 'pending';\r\n },\r\n pay_setStatus(state, action: PayloadAction) {\r\n state.pay.progress = action.payload;\r\n },\r\n pay_Open(state, action: PayloadAction) {\r\n state.pay = {\r\n dialogOpen: true,\r\n selected: action.payload,\r\n };\r\n },\r\n pay_SetSelected(state, action: PayloadAction) {\r\n state.pay.selected = action.payload;\r\n },\r\n\r\n pay_Finish(state, action: PayloadAction) {\r\n state.pay.status = 'resolved';\r\n state.pay.messages = action.payload;\r\n // action.payload.reduce((acc, val) => ({\r\n // SuccessMessages: acc.SuccessMessages.concat(val.SuccessMessages),\r\n // ErrorMessages: acc.ErrorMessages.concat(val.ErrorMessages),\r\n // WarningMessages: acc.WarningMessages.concat(val.WarningMessages),\r\n // }));\r\n },\r\n pay_Close(state, action: PayloadAction) {\r\n state.pay = {\r\n dialogOpen: false,\r\n };\r\n },\r\n\r\n GenerateInvoicesAndChargeOnlineBudgets(\r\n state,\r\n action: PayloadAction<{\r\n endDate: Date;\r\n selected: IInvoiceBudgetBalanceDto[];\r\n chargeOnlineBudgets: boolean;\r\n }>,\r\n ) {\r\n state.generateInvoicesAndSendToSap = {\r\n dialogOpen: true,\r\n progress: 0,\r\n processing: true,\r\n selected: action.payload.selected,\r\n endDate: action.payload.endDate,\r\n };\r\n },\r\n GenerateSelectedInvoices_Success(state, action: PayloadAction) {\r\n state.generateInvoicesAndSendToSap = {};\r\n state.charge = {};\r\n },\r\n GenerateSelectedInvoices_Error(state, action: PayloadAction) {\r\n state.generateInvoicesAndSendToSap = {};\r\n state.charge = {};\r\n },\r\n GenerateInvoicesAndChargeOnlineBudgets_SetCurrentRecord(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.generateInvoicesAndSendToSap.currentRecord = action.payload;\r\n },\r\n GenerateInvoicesAndChargeOnlineBudgets_SetProgress(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.generateInvoicesAndSendToSap.progress = action.payload;\r\n },\r\n GenerateSelectedInvoices_SetDialogOpen(\r\n state,\r\n action: PayloadAction,\r\n ) {\r\n state.generateInvoicesAndSendToSap.dialogOpen = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { actions: onlineBudgetsStatusActions } = slice;\r\n\r\nexport const useOnlineBudgetsStatusSlice = () => {\r\n useInjectReducer({ key: slice.name, reducer: slice.reducer });\r\n useInjectSaga({ key: slice.name, saga: onlineBudgetsStatusSaga });\r\n return { actions: slice.actions };\r\n};\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * export function MyComponentNeedingThisSlice() {\r\n * const { actions } = useOnlineBudgetsStatusSlice();\r\n *\r\n * const onButtonClick = (evt) => {\r\n * dispatch(actions.getTableData());\r\n * };\r\n * }\r\n */\r\n","import * as React from 'react';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useOnlineBudgetsStatusSlice } from '../slice';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport {\r\n selectChargeOnlineBudgetsState,\r\n selectOnlineBudgetsStatusSelected,\r\n} from '../slice/selectors';\r\nimport {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n LinearProgress,\r\n List,\r\n ListItem,\r\n} from '@material-ui/core';\r\nimport { ButtonConfirm } from 'app/components/ButtonConfirm';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nconst maxErrorsToShow = 5;\r\nexport interface ChargeOnlineBudgetsButtonProps {\r\n disabled?: boolean;\r\n disabledTitle?: string;\r\n}\r\nexport const ChargeOnlineBudgetsButton = ({\r\n disabled,\r\n disabledTitle,\r\n ...props\r\n}: ChargeOnlineBudgetsButtonProps) => {\r\n const { t } = useTranslation();\r\n const selected = useSelector(selectOnlineBudgetsStatusSelected);\r\n const state = useSelector(selectChargeOnlineBudgetsState);\r\n const dispatch = useDispatch();\r\n const { actions } = useOnlineBudgetsStatusSlice();\r\n\r\n const handleChargeOnlineBudgetsButtonClick = () => {\r\n dispatch(actions.chargeOnlineBudgets(selected));\r\n };\r\n const handleDialogClose = () => {\r\n if (state.processing) {\r\n return;\r\n }\r\n dispatch(actions.chargeOnlineBudgets_SetDialogOpen(false));\r\n };\r\n const confirmationMessage = `${\r\n selected.length\r\n } records will be processed. ${t(translations.AreYouSure)}`;\r\n return (\r\n <>\r\n \r\n \r\n \r\n {t(translations.ChargeBalanceOnline)}\r\n {selected.length > 0 && <> - {selected.length}}\r\n \r\n \r\n \r\n \r\n {state.processing && (\r\n \r\n )}\r\n {t(translations.ChargeBalanceOnline)}\r\n \r\n {state.currentRecord !== undefined && (\r\n {`Processing ${state.currentRecord?.ServiceGroup} ${state.currentRecord?.Budget}`}\r\n )}\r\n <>\r\n {state.errors !== undefined && (\r\n \r\n {state?.errors\r\n ?.slice(0, maxErrorsToShow)\r\n ?.map((message, index) => (\r\n {message}\r\n ))}\r\n \r\n )}\r\n {(state?.errors?.length ?? 0) > maxErrorsToShow && (\r\n \r\n dispatch(\r\n actions.chargeOnlineBudgets_DownloadErrors(state.errors),\r\n )\r\n }\r\n >\r\n {t(translations.DownloadErrors)}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {t(translations.Close)}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useOnlineBudgetsStatusSlice } from '../slice';\r\nimport { selectGenerateInvoicesState } from '../slice/selectors';\r\nimport { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\n\r\nexport interface GenerateInvoicesButtonProps {\r\n endDate: Date;\r\n selected: IInvoiceBudgetBalanceDto[];\r\n disabled?: boolean;\r\n disabledTitle?: string;\r\n}\r\nexport const GenerateInvoicesButton = ({\r\n endDate,\r\n selected,\r\n disabled,\r\n disabledTitle,\r\n}: GenerateInvoicesButtonProps) => {\r\n const { t } = useTranslation();\r\n const generateInvoicesState = useSelector(selectGenerateInvoicesState);\r\n const dispatch = useDispatch();\r\n const { actions } = useOnlineBudgetsStatusSlice();\r\n return (\r\n <>\r\n \r\n \r\n \r\n dispatch(\r\n selected.length > 0\r\n ? actions.GenerateInvoicesAndChargeOnlineBudgets({\r\n endDate: endDate,\r\n selected: selected,\r\n chargeOnlineBudgets: false,\r\n })\r\n : actions.generateInvoices({ endDate: endDate }),\r\n )\r\n }\r\n processing={generateInvoicesState.processing}\r\n disabled={disabled === true || selected.length === 0}\r\n >\r\n {t(translations.GenerateInvoiceForEstimatedCharges)}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useOnlineBudgetsStatusSlice } from '../slice';\r\nimport * as Yup from 'yup';\r\nimport { selectPayState } from '../slice/selectors';\r\nimport {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n LinearProgress,\r\n} from '@material-ui/core';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { PaymentMethodEntitySchema } from 'app/components/Forms/Schemas';\r\nimport { Form, Formik } from 'formik';\r\nimport { FormPaymentMethodPicker } from 'app/components/Forms/FormPaymentMethodPicker';\r\nimport { FormRow } from 'app/components/Forms/FormsLayout';\r\nimport { Entity } from 'types/common';\r\nimport { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { sum } from 'lodash';\r\nimport { Alert } from '@material-ui/lab';\r\n\r\nexport interface PayButtonProps {\r\n endDate: Date;\r\n selected: IInvoiceBudgetBalanceDto[];\r\n disabled?: boolean;\r\n disabledTitle?: string;\r\n}\r\nexport const PayButton = ({\r\n selected,\r\n disabled,\r\n disabledTitle,\r\n ...props\r\n}: PayButtonProps) => {\r\n const { t } = useTranslation();\r\n const state = useSelector(selectPayState);\r\n const dispatch = useDispatch();\r\n const { actions } = useOnlineBudgetsStatusSlice();\r\n\r\n const handlePayButtonClick = () => {\r\n if (selected.length > 0) {\r\n dispatch(actions.pay_Open(selected));\r\n }\r\n };\r\n const handleDialogClose = () => {\r\n if (state.status === 'pending') {\r\n return;\r\n }\r\n dispatch(actions.pay_Close());\r\n };\r\n const totalUpaidBalance = sum(state.selected?.map(row => row.UnpaidBalance));\r\n\r\n const confirmationMessage = `${state.selected?.length} records will be processed.`;\r\n\r\n const handleSubmit = (values: IValues, formikHelpers) => {\r\n const paymentMethod = values?.PaymentMethod?.Id;\r\n if (paymentMethod !== undefined && state.selected !== undefined) {\r\n dispatch(\r\n actions.pay({\r\n EndDate: props.endDate,\r\n PaymentMethod: paymentMethod,\r\n Rows: state.selected,\r\n }),\r\n );\r\n }\r\n };\r\n const initialValues: IValues = {\r\n PaymentMethod: null,\r\n };\r\n const title = disabled ? disabledTitle : t(translations.PayDescription);\r\n return (\r\n <>\r\n \r\n \r\n \r\n {t(translations.Pay)}\r\n \r\n \r\n \r\n\r\n \r\n {state.status === 'pending' && (\r\n \r\n )}\r\n \r\n initialValues={initialValues}\r\n validationSchema={validationSchema}\r\n onSubmit={handleSubmit}\r\n >\r\n {formik => (\r\n
    \r\n {t(translations.ChargeBalanceOnline)}\r\n \r\n {confirmationMessage}\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 {t(translations.TotalPayments)}:{' '}\r\n {totalUpaidBalance.toFixed(2)}\r\n ,\r\n ]}\r\n \r\n \r\n {state.messages?.map((responseType, index) => (\r\n <>\r\n {responseType.SuccessMessages.map(message => (\r\n \r\n {message}\r\n \r\n ))}\r\n {responseType.ErrorMessages.map(message => (\r\n \r\n {message}\r\n \r\n ))}\r\n {responseType.WarningMessages.map(message => (\r\n \r\n {message}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n \r\n \r\n {t(translations.PaySelected)}\r\n \r\n {state.status === 'resolved' ? (\r\n dispatch(actions.pay_Close())}\r\n >\r\n {t(translations.Close)}\r\n \r\n ) : (\r\n dispatch(actions.pay_Close())}\r\n disabled={state.status === 'pending'}\r\n >\r\n {t(translations.Cancel)}\r\n \r\n )}\r\n \r\n
    \r\n )}\r\n \r\n
    \r\n \r\n );\r\n};\r\ninterface IValues {\r\n PaymentMethod?: Entity | null;\r\n}\r\nconst validationSchema: Yup.SchemaOf = Yup.object({\r\n PaymentMethod: PaymentMethodEntitySchema.required(),\r\n});\r\n","/**\r\n *\r\n * GenerateInvoicesAndSendToSap\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n LinearProgress,\r\n} from '@material-ui/core';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\n\r\nimport { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\nimport { ButtonConfirm } from 'app/components/ButtonConfirm';\r\nimport { useOnlineBudgetsStatusSlice } from '../slice';\r\nimport { selectIGenerateInvoicesAndSendToSapState } from '../slice/selectors';\r\n\r\nexport interface GenerateInvoicesAndSendToSapProps {\r\n selected: IInvoiceBudgetBalanceDto[];\r\n endDate: Date;\r\n disabled?: boolean;\r\n disabledTitle?: string;\r\n}\r\n\r\nexport function GenerateInvoicesAndSendToSap({\r\n disabled,\r\n disabledTitle,\r\n ...props\r\n}: GenerateInvoicesAndSendToSapProps) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const state = useSelector(selectIGenerateInvoicesAndSendToSapState);\r\n const { actions } = useOnlineBudgetsStatusSlice();\r\n const dispatch = useDispatch();\r\n const handleButtonClick = () => {\r\n dispatch(\r\n actions.GenerateInvoicesAndChargeOnlineBudgets({\r\n endDate: props.endDate,\r\n selected: props.selected,\r\n chargeOnlineBudgets: true,\r\n }),\r\n );\r\n };\r\n const handleDialogClose = () => {\r\n //todo\r\n };\r\n const title = disabled ? disabledTitle : t(translations.PayDescription);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {t(translations.GenerateInvoicesAndSendToSap)}\r\n \r\n \r\n \r\n \r\n {state.progress !== undefined && (\r\n \r\n )}\r\n {t(translations.GenerateInvoices)}\r\n \r\n {state.currentRecord !== undefined && (\r\n {`Processing ${state.currentRecord?.ServiceGroup} ${state.currentRecord?.Budget}`}\r\n )}\r\n \r\n \r\n \r\n dispatch(actions.GenerateSelectedInvoices_SetDialogOpen(false))\r\n }\r\n >\r\n {t(translations.Close)}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { Link } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { Roles } from 'app/slice/types';\r\nimport { translations } from 'locales/translations';\r\nimport React, { ReactNode } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { PaymentProps } from './index';\r\n\r\nexport const AddPaymentButton = ({\r\n children,\r\n ...props\r\n}: { children?: ReactNode } & PaymentProps) => {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const singleAdminServiceGroup =\r\n authenticatedUser?.Roles?.includes(Roles.ServiceGroupBudgetsAdmin) &&\r\n authenticatedUser.AdminServiceGroups.length === 1\r\n ? authenticatedUser.AdminServiceGroups[0]\r\n : null;\r\n props.serviceGroup = props.serviceGroup ?? singleAdminServiceGroup ?? null;\r\n return (\r\n \r\n {\r\n dispatch(actions.toggleSidePanel(true));\r\n dispatch(actions.setPageType(RenderPageType.AddPayment));\r\n dispatch(actions.setPageProps(props));\r\n }}\r\n >\r\n {children ?? t(translations.AddPaymentInvoice)}\r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { CellRenderer } from 'app/components/BasicTable/BasicTableProps';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { uniqueId } from 'lodash';\r\nimport { InvoiceDetailsSidePanelLink } from '../InvoiceDetails/InvoiceDetailsSidePanel';\r\nimport { toEntity } from 'utils/entity-utils';\r\nimport { AddChargeButton } from '../AddChargePage/AddChargeButton';\r\nimport { AddPaymentButton } from '../AddPaymentPage/AddPaymentButton';\r\nimport { IInvoiceBalanceDto } from 'api/odata/generated/complexTypes/IInvoiceBalanceDto';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectglobalSettings } from 'app/slice/selectors';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { Box } from '@material-ui/core';\r\n\r\nconst tryParseInvoicesData = (s: string | null): IInvoiceBalanceDto[] => {\r\n try {\r\n const invoices = JSON.parse(s ?? '[]') as IInvoiceBalanceDto[];\r\n return invoices;\r\n } catch {\r\n return [] as IInvoiceBalanceDto[];\r\n }\r\n};\r\nexport const useRowActions = () => {\r\n const { t } = useTranslation();\r\n const settings = useSelector(selectglobalSettings);\r\n const allowedFees = settings.GetString(AllowedSettings.AllowedFeeTypes);\r\n const accumulateInvoices = settings.GetBoolean(\r\n AllowedSettings[AllowedSettings.AccumulateNewChargesToExistingInvoice],\r\n );\r\n const isChargesAllowed = allowedFees && allowedFees.trim() !== '';\r\n const rowActions = React.useMemo[]>(\r\n () => [\r\n ({ row }) => {\r\n const invoices = tryParseInvoicesData(row.original.Invoices);\r\n const actions: JSX.Element[] = [];\r\n if (invoices.length === 0) {\r\n // add charge/payment by service group & budget\r\n if (isChargesAllowed && accumulateInvoices) {\r\n actions.push(\r\n \r\n \r\n \r\n {t(translations.AddACharge)}\r\n \r\n ,\r\n );\r\n }\r\n if (accumulateInvoices) {\r\n actions.push(\r\n \r\n \r\n \r\n {t(translations.AddPayment)}\r\n \r\n ,\r\n );\r\n }\r\n } else if (invoices.length === 1) {\r\n // combine all differnet actions into single list for single invoice row\r\n actions.push();\r\n if (isChargesAllowed && accumulateInvoices) {\r\n actions.push(\r\n \r\n \r\n \r\n {t(translations.AddACharge)}\r\n \r\n ,\r\n );\r\n }\r\n if (accumulateInvoices) {\r\n actions.push(\r\n \r\n \r\n \r\n {t(translations.AddPayment)}\r\n \r\n ,\r\n );\r\n }\r\n } else if (invoices?.length ?? 0 > 1) {\r\n // show nested actions per each invoice row:\r\n // invoice label + all actions behind the \"ReactActions\"\r\n\r\n invoices.forEach(invoice => {\r\n let subActions: JSX.Element[] = [];\r\n subActions.push();\r\n if (isChargesAllowed && accumulateInvoices) {\r\n subActions.push(\r\n \r\n \r\n \r\n {t(translations.AddACharge)}\r\n \r\n ,\r\n );\r\n }\r\n if (accumulateInvoices) {\r\n subActions.push(\r\n \r\n \r\n \r\n {t(translations.AddPayment)}\r\n \r\n ,\r\n );\r\n }\r\n actions.push(\r\n <>\r\n \r\n {`#${invoice.Id} ${dateUtils.shortDateFormat(\r\n invoice.InvoiceStart,\r\n )} - ${dateUtils.shortDateFormat(invoice.InvoiceEnd)}`}\r\n \r\n \r\n ,\r\n );\r\n });\r\n }\r\n if (actions.length === 0) return <>;\r\n return ;\r\n },\r\n ],\r\n [accumulateInvoices, isChargesAllowed, t],\r\n );\r\n return rowActions;\r\n};\r\n\r\ninterface InvoiceDetailsLinkProps {\r\n invoiceId: number | null;\r\n}\r\nconst InvoiceDetailsLink = ({ invoiceId }: InvoiceDetailsLinkProps) => {\r\n const { t } = useTranslation();\r\n if (invoiceId == null) {\r\n return invoiceId;\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n {t(translations.BudgetDetailsBudgetTransfer)}\r\n \r\n \r\n \r\n // \r\n );\r\n};\r\nfunction getPaymentAmount(invoice: IInvoiceBalanceDto) {\r\n const balance = invoice.Charges - invoice.Payments;\r\n if (balance > 0) {\r\n return balance;\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\ninterface IRowWithFlatBudget {\r\n BudgetId: number | null;\r\n Budget: string | null;\r\n}\r\nconst getBudget = (row: IRowWithFlatBudget) => {\r\n return toEntity(row.BudgetId, row.Budget);\r\n};\r\ninterface IRowWithFlatServiceGroup {\r\n ServiceGroupId: number | null;\r\n ServiceGroup: string | null;\r\n}\r\nconst getServiceGroup = (row: IRowWithFlatServiceGroup) => {\r\n return toEntity(row.ServiceGroupId, row.ServiceGroup);\r\n};\r\n","/**\r\n *\r\n * OnlineBudgetsStatusPage\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useOnlineBudgetsStatusSlice } from './slice';\r\nimport { useLocation } from 'react-router';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { useColumns } from './columns';\r\nimport { usePageActions } from './pageActions';\r\nimport { InfoIcon } from 'app/components/BasicIcons/InfoIcon';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport { useRowActions } from './useRowActions';\r\nimport { BasicTable } from 'app/components/BasicTable';\r\nimport { ScreensId } from 'enums/ConfigurableTypes';\r\nimport { withSavedHistoryT } from 'app/components/BasicTable/withSavedHistory';\r\nimport { GetFilters } from './Filter';\r\nimport { IBasePageProps } from '../IBasePageProps';\r\nimport { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { getDefaultFilter } from './getDefaultFitlers';\r\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\r\n\r\nimport { push } from 'connected-react-router';\r\nimport { defaults } from 'lodash';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport BasicTypography from 'app/components/Typography/BasicTypography';\r\nimport { BookitDatePicker } from 'app/components/BookitDatePicker';\r\n\r\nexport interface OnlineBudgetsStatusPageParams {\r\n endDate: string;\r\n}\r\nexport interface OnlineBudgetsStatusPageProps\r\n extends IBasePageProps {}\r\n\r\nexport const InvoiceBudgetBalanceKeyAccessor = (\r\n row: IInvoiceBudgetBalanceDto,\r\n) => {\r\n return JSON.stringify({\r\n serviceGroupId: row.ServiceGroupId,\r\n budgetId: row.BudgetId,\r\n });\r\n};\r\nexport function OnlineBudgetsStatusPage(props: OnlineBudgetsStatusPageProps) {\r\n const { t } = useTranslation();\r\n const params = defaults(props.match.params, {\r\n endDate: dateUtils.formatISO(new Date(), {\r\n format: 'basic',\r\n representation: 'date',\r\n }),\r\n });\r\n const location = useLocation();\r\n const dispatch = useDispatch();\r\n const { actions } = useOnlineBudgetsStatusSlice();\r\n\r\n const endDate = React.useMemo(() => dateUtils.parseISO(params.endDate), [\r\n params.endDate,\r\n ]);\r\n const columns = useColumns(endDate);\r\n const rowActions = useRowActions();\r\n const endDateString =\r\n endDate == null\r\n ? null\r\n : dateUtils.formatISO(endDate, {\r\n format: 'basic',\r\n representation: 'date',\r\n });\r\n const memoedColumns = React.useMemo(() => columns, [columns]);\r\n const isMobile = DetectIsMobile();\r\n const pageActions = usePageActions({\r\n endDate: endDate as Date | null,\r\n isMobile,\r\n });\r\n\r\n React.useEffect(() => {\r\n dispatch(actions.setEndDate(endDateString));\r\n }, [actions, dispatch, endDateString]);\r\n\r\n const handleEndDateChange = React.useCallback(\r\n (value: MaterialUiPickersDate) => {\r\n if (value != null) {\r\n dispatch(\r\n push({\r\n pathname:\r\n '/OnlineBudgetsStatus/' +\r\n dateUtils.formatISO(value, {\r\n format: 'basic',\r\n representation: 'date',\r\n }),\r\n search: location.search,\r\n }),\r\n );\r\n }\r\n },\r\n [dispatch, location.search],\r\n );\r\n const subHeader = (\r\n <>\r\n \r\n \r\n {t(translations.OnlineBudgetsBillingUnfinishedUsagesRemark0)}\r\n \r\n \r\n {t(translations.OnlineBudgetsBillingUnfinishedUsagesRemark1)}\r\n \r\n \r\n {t(translations.OnlineBudgetsBillingUnfinishedUsagesRemark2)}\r\n \r\n \r\n \r\n {t(translations.OnlineBudgetsBillingUnfinishedUsagesRemark3)}\r\n \r\n \r\n );\r\n const rowAccessor = React.useCallback(InvoiceBudgetBalanceKeyAccessor, []);\r\n if (endDate == null) {\r\n return null;\r\n }\r\n const apiURL = '/api/odata/v4/InvoiceBudgetBalances';\r\n return (\r\n <>\r\n \r\n dispatch(actions.setSelected(selected))\r\n }\r\n additionalColumns={[\r\n 'UserGroupId',\r\n 'ServiceGroupId',\r\n 'BudgetId',\r\n 'Invoices',\r\n ]}\r\n searchColumns={[\r\n 'ServiceGroup',\r\n 'UserGroup',\r\n 'UserGroupId',\r\n 'UsergroupIDNO',\r\n 'Budget',\r\n 'HostBudgetNumber',\r\n 'Department',\r\n 'Institute',\r\n 'InstituteType',\r\n ]}\r\n />\r\n \r\n );\r\n}\r\n\r\nconst OnlineBudgetsStatusTable = withSavedHistoryT(\r\n BasicTable,\r\n '/OnlineBudgetStatus',\r\n GetFilters,\r\n getDefaultFilter,\r\n ['endDate'],\r\n);\r\n","import { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Column } from 'react-table';\r\nimport htmlParse from 'html-react-parser';\r\nimport { Link } from 'react-router-dom';\r\nimport { toQueryString } from 'utils/url-utils';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport { AlignRight } from '../../components/BasicTable/CellRenderers/AlignRight';\r\nimport PercentageRenderer from 'app/components/BasicTable/CellRenderers/PercentageRenderer';\r\n\r\nexport const useColumns = (endDate: Date) => {\r\n const { t } = useTranslation();\r\n const columns: Column[] = [\r\n {\r\n accessor: 'ServiceGroup',\r\n Header: t(translations.ServiceGroup),\r\n },\r\n {\r\n accessor: 'HostBudgetNumber',\r\n Header: t(translations.HostBudgetNumber),\r\n },\r\n {\r\n accessor: 'UserGroup',\r\n Header: t(translations.UserGroup),\r\n },\r\n // Institute- tool tip “By Project User Group”\r\n {\r\n accessor: 'Institute',\r\n Header: (\r\n \r\n {t(translations.Institute)}\r\n \r\n ),\r\n Cell: ({ row, value }) => (\r\n \r\n \r\n {value}\r\n \r\n \r\n ),\r\n },\r\n // Department- tool tip “By Project User Group”\r\n {\r\n accessor: 'Department',\r\n Header: (\r\n \r\n {t(translations.Department)}\r\n \r\n ),\r\n Cell: ({ row, value }) => (\r\n \r\n \r\n {value}\r\n \r\n \r\n ),\r\n },\r\n // User Group- tool tip “Project User Group”\r\n {\r\n accessor: 'UsergroupIDNO',\r\n Header: t(translations.IDNo),\r\n },\r\n {\r\n accessor: 'Budget',\r\n Header: t(translations.BudgetNumber),\r\n Cell: ({ value, row }) => (\r\n \r\n {value}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'BudgetAmount',\r\n Header: t(translations.BudgetAmount),\r\n Cell: ({ value }) => (\r\n \r\n {value?.toFixed(2)}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'BudgetAmount',\r\n Header: t(translations.BudgetAmount),\r\n Cell: ({ value }) => (\r\n \r\n {value?.toFixed(2)}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'BudgetHardLimit',\r\n Header: t(translations.BudgetHardLimit),\r\n Cell: PercentageRenderer,\r\n },\r\n {\r\n accessor: 'BudgetSoftLimit',\r\n Header: t(translations.BudgetSoftLimit),\r\n Cell: PercentageRenderer,\r\n },\r\n {\r\n accessor: 'InvoicedAmount',\r\n Header: t(translations.TotalInvoiced),\r\n Cell: ({ value, row }) => (\r\n \r\n \r\n {value?.toFixed(2)}\r\n \r\n \r\n ),\r\n },\r\n {\r\n accessor: 'PaidAmount',\r\n Header: t(translations.TotlaPaid),\r\n Cell: ({ value }) => (\r\n \r\n {value?.toFixed(2)}\r\n \r\n ),\r\n },\r\n {\r\n accessor: 'UnpaidBalance',\r\n Header: (\r\n <>\r\n \r\n {t(translations.UnpaidBalance)}\r\n \r\n \r\n ),\r\n Cell: ({ row, value }) => (\r\n \r\n \r\n {value?.toFixed(2)}\r\n \r\n \r\n ),\r\n },\r\n {\r\n accessor: 'OverallEstimatedBalance',\r\n Header: (\r\n \r\n {t(translations.OverallEstimatedBalance)}\r\n \r\n ),\r\n Cell: ({ value }) => (\r\n \r\n \r\n {String(value.toFixed(2))}\r\n \r\n \r\n ),\r\n },\r\n {\r\n accessor: 'EstimatedCharges',\r\n Header: (\r\n \r\n {t(translations.EstimatedCharges)}\r\n \r\n ),\r\n Cell: ({ value, row }) => (\r\n \r\n \r\n \r\n \r\n {value?.toFixed(2)}\r\n \r\n \r\n \r\n \r\n ),\r\n },\r\n ];\r\n return columns;\r\n};\r\n","import * as React from 'react';\r\nimport { selectAppSettings, selectglobalSettings } from 'app/slice/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\r\nimport { ChargeOnlineBudgetsButton } from './ChargeOnlineBudgetsButton';\r\nimport { GenerateInvoicesButton } from './GenerateInvoicesButton';\r\nimport { PayButton } from './PayButton';\r\nimport { GenerateInvoicesAndSendToSap } from './GenerateInvoicesAndSendToSap';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { ReactActions } from 'app/components/ReactActions';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { useSystemDate } from 'app/hooks/useSystemDate';\r\nimport { PageActionRenderer2 } from 'app/components/BasicTable/PageActions/PageActionsRenderer';\r\nimport { IInvoiceBudgetBalanceDto } from 'api/odata/generated/entities/IInvoiceBudgetBalanceDto';\r\n\r\nexport interface usePageActionsProps {\r\n endDate: Date | null;\r\n isMobile: boolean;\r\n}\r\nexport const usePageActions = ({ endDate, isMobile }: usePageActionsProps) => {\r\n const { t } = useTranslation();\r\n const appSettings = useSelector(selectAppSettings);\r\n const globalSettings = useSelector(selectglobalSettings);\r\n const { newDate } = useSystemDate();\r\n const disableActionButtons =\r\n endDate === null ||\r\n dateUtils.truncateTime(endDate) > dateUtils.truncateTime(newDate())\r\n ? true\r\n : undefined;\r\n const disabledTitle = disableActionButtons\r\n ? t(translations.EndDateMustBeSetToTodayOrEarlier)\r\n : undefined;\r\n const pageActions = React.useMemo(() => {\r\n if (endDate == null) {\r\n return [];\r\n }\r\n const accumulateInvoices = globalSettings.GetBoolean(\r\n AllowedSettings[AllowedSettings.AccumulateNewChargesToExistingInvoice],\r\n );\r\n // TODO: provide properly typed actions: PageActionRenderer\r\n const actions: PageActionRenderer2[] = [];\r\n\r\n if (accumulateInvoices) {\r\n actions.unshift((dataCount, onRefresh, appliedFilters, selectedRows) => (\r\n \r\n ));\r\n }\r\n if (IsModuleEnabled(appSettings, KnownModules.WS_Billing)) {\r\n actions.unshift(() => (\r\n \r\n ));\r\n actions.unshift((dataCount, onRefresh, appliedFilters, selectedRows) => (\r\n \r\n ));\r\n }\r\n if (accumulateInvoices) {\r\n actions.push((dataCount, onRefresh, appliedFilters, selectedRows) => (\r\n \r\n ));\r\n }\r\n if (isMobile) {\r\n return [\r\n (dataCount, onRefresh, appliedFilters, selectedRows) => (\r\n (\r\n \r\n {item(dataCount, onRefresh, appliedFilters, selectedRows)}\r\n \r\n ))}\r\n />\r\n ),\r\n ];\r\n }\r\n return actions;\r\n }, [\r\n appSettings,\r\n disableActionButtons,\r\n disabledTitle,\r\n endDate,\r\n globalSettings,\r\n isMobile,\r\n ]);\r\n return pageActions;\r\n};\r\n","import { IAuthenticatedUser } from 'types/AuthenticatedUser';\r\n\r\nimport { toQueryString } from 'utils/url-utils';\r\n\r\nexport function getDefaultFilter(user: IAuthenticatedUser) {\r\n const result = toQueryString({\r\n HasBalanceOrEstimatedCharges: true,\r\n BudgetIsOnline: true,\r\n });\r\n return result;\r\n}\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const InvoiceDetailsPage = lazyLoad(\r\n () => import('./InvoiceDetailsPage/index'),\r\n module => module.InvoiceDetailsPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const WorkOrderDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.WorkOrderDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Billing Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const Billing = lazyLoad(\r\n () => import('./index'),\r\n module => module.BillingPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for BillingActions Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const BillingActions = lazyLoad(\r\n () => import('./index'),\r\n module => module.BillingActionsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for BillingActionsDetails Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const BillingActionsDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.BillingActionsDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for LocationTypesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const LocationTypesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.LocationTypesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for LocationTypesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SubLocationTypesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SubLocationTypesPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\nimport { withoutGlobalServiceGroupFilter } from 'app/components/BasicTable/withoutGlobalServiceGroupFilter';\r\n\r\nexport const SavedViewDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => withoutGlobalServiceGroupFilter(module.SavedViewDetailsPage),\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for BillingActions Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\nimport { withoutGlobalServiceGroupFilter } from 'app/components/BasicTable/withoutGlobalServiceGroupFilter';\r\n\r\nexport const SavedViews = lazyLoad(\r\n () => import('./index'),\r\n module => withoutGlobalServiceGroupFilter(module.SavedViewsPage),\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for LabelTypesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const LabelTypesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.LabelTypesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for AssetDetailsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AssetDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AssetDetailsPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const LabelPrintDialog = lazyLoad(\r\n () => import('./index'),\r\n module => module.LabelPrintDialog,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for KioskProjectsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const KioskProjectsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.KioskProjectsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for KioskProjectConsumablesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const KioskProjectConsumablesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.KioskProjectConsumablesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for KioskProjectsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const PrivateKioskProjectsRoute = lazyLoad(\r\n () => import('./index'),\r\n module => module.PrivateKioskProjectsRoute,\r\n);\r\n","import { httpClient } from 'api/HttpClient';\r\n\r\nconst SESSIONTIMEOUT_ASHX_CACHE_BUST = new Date().getTime();\r\n\r\nfunction GetData(\r\n url: string,\r\n Fulfilled: (value: string) => void,\r\n Rejected: () => null,\r\n) {\r\n httpClient\r\n .get(url, { _: SESSIONTIMEOUT_ASHX_CACHE_BUST })\r\n .then(response => Fulfilled(response as string), Rejected);\r\n}\r\n\r\nvar checkFailCount: number = 0;\r\nexport const CheckSessionTimeout = function (\r\n loginUrl: string,\r\n appRoot: string,\r\n showWarning: () => void,\r\n /*, hideWarning*/\r\n) {\r\n var checkInterval: number = 60000;\r\n var redirectAction = function () {\r\n window.onbeforeunload = null;\r\n var currentUrl = window.location.pathname + window.location.search;\r\n var redirUrl = loginUrl + '?ReturnUrl=' + encodeURIComponent(currentUrl);\r\n console.log('redirecting to login page');\r\n window.location.href = redirUrl;\r\n };\r\n var check = function () {\r\n GetData(\r\n appRoot,\r\n (data: string) => {\r\n checkFailCount = 0;\r\n switch (data) {\r\n case 'ok':\r\n //showWarning(); //for test\r\n break;\r\n case 'logout':\r\n redirectAction();\r\n break;\r\n case 'alert':\r\n showWarning();\r\n break;\r\n default:\r\n redirectAction();\r\n break;\r\n }\r\n setTimeout(check, checkInterval);\r\n },\r\n () => {\r\n checkFailCount++;\r\n console.error(\r\n 'Failed to check active session on the server x' + checkFailCount,\r\n );\r\n if (checkFailCount > 2) {\r\n redirectAction();\r\n }\r\n return null;\r\n },\r\n );\r\n };\r\n setTimeout(check, checkInterval);\r\n};\r\n\r\nexport function ExtendSessionTimeout(Fulfilled: (value: string) => void) {\r\n httpClient\r\n .post('/svc/Script/AjaxService.svc/ExtendSessionTimeout', {\r\n dataType: 'json',\r\n contentType: 'application/json; charset=utf-8',\r\n })\r\n .then(response => Fulfilled(response as string));\r\n}\r\n","/**\r\n *\r\n * DialogAlert\r\n *\r\n */\r\nimport React from 'react';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogContentText,\r\n DialogActions,\r\n useTheme,\r\n useMediaQuery,\r\n} from '@material-ui/core';\r\nimport { Button } from 'app/components/BasicButtons/Button';\r\n\r\nexport interface DialogAlertProps {\r\n title: string;\r\n value: string | undefined;\r\n buttonText: string;\r\n show: boolean;\r\n onButtonClick: () => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport const DialogAlert = ({\r\n title,\r\n value,\r\n buttonText,\r\n show,\r\n onButtonClick,\r\n onClose,\r\n}: DialogAlertProps) => {\r\n const handleClose = () => {\r\n onClose();\r\n };\r\n const handleButtonClick = () => {\r\n onButtonClick();\r\n };\r\n const theme = useTheme();\r\n const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\r\n\r\n if (show) {\r\n return (\r\n \r\n {title}\r\n \r\n \r\n {value}\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","/**\r\n *\r\n * SessionTimeout\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { useState } from 'react';\r\nimport { CheckSessionTimeout, ExtendSessionTimeout } from './SessionTimeout';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectAuthenticatedUser } from 'app/slice/selectors';\r\nimport { DialogAlert } from './DialogAlert';\r\nimport { Roles } from 'app/slice/types';\r\nimport { toRootedURL } from 'utils/url-utils';\r\n\r\nexport interface SessionTimeoutProps {}\r\n\r\nexport function SessionTimeout() {\r\n const { t } = useTranslation();\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n var loginUrl = toRootedURL('/login.aspx');\r\n // math.random is needed to bust the cache for clients with cached result\r\n var checkUrl = `/sessionTimeout.ashx`;\r\n var ignoreSession = React.useMemo(() => {\r\n return (\r\n authenticatedUser !== undefined &&\r\n (authenticatedUser.Roles.indexOf(Roles.CalendarOnly) >= 0 ||\r\n authenticatedUser.Roles.indexOf(Roles.RoomOnly) >= 0 ||\r\n authenticatedUser.Roles.indexOf(Roles.KioskAdmin) >= 0)\r\n );\r\n }, [authenticatedUser]);\r\n const [show, setShow] = useState(false);\r\n React.useEffect(() => {\r\n CheckSessionTimeout(loginUrl, checkUrl, () => {\r\n setShow(true);\r\n });\r\n if (ignoreSession) {\r\n ExtendSessionTimeout((value: string) => {});\r\n }\r\n }, [checkUrl, ignoreSession, loginUrl]);\r\n\r\n function onClose() {\r\n setShow(false);\r\n }\r\n\r\n function onButtonClick() {\r\n ExtendSessionTimeout((value: string) => {});\r\n setShow(false);\r\n }\r\n return ignoreSession ? (\r\n \r\n ) : (\r\n onButtonClick()}\r\n onClose={() => onClose()}\r\n />\r\n );\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for SubmissionsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SubmissionsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SubmissionsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for QuizzesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const QuizzesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.QuizzesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for AdHocReportListPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AdHocReportListPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AdHocReportListPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Rooms Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const Rooms = lazyLoad(\r\n () => import('./index'),\r\n module => module.Rooms,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for CalendarMessages Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CalendarMessages = lazyLoad(\r\n () => import('./index'),\r\n module => module.CalendarMessagesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for CoresDirectoryPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CoresDirectoryPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CoresDirectoryPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for SamplePlatesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SamplePlatesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SamplePlatesPage,\r\n);\r\n","import {\r\n //selectAppSettings,\r\n selectglobalSettings,\r\n selectIsAuthenticated,\r\n selectLoading,\r\n selectSiteMapProvider,\r\n selectSiteMapSettings,\r\n} from 'app/slice/selectors';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { useLocation } from 'react-router-dom';\r\n//import { AppSettings } from 'types/AppSettings';\r\nimport { NoAuthNodes } from 'types/SiteMapSettings';\r\nimport { AllowedSettings } from 'utils/globalSettings';\r\nimport { toLowerCaseSafely } from 'utils/typeUtils';\r\nimport { toRootedURL } from 'utils/url-utils';\r\n\r\nexport interface TabTitleProps {\r\n isDispatcherLoading: boolean;\r\n i18Language: string;\r\n}\r\n\r\nexport const useTabTitle = (): [\r\n string | undefined, //pageTitle:\r\n string | undefined, //pageIcon:\r\n (string) => void, //setPageTitle:\r\n (string) => void, //setPageIcon:\r\n boolean,\r\n] => {\r\n const location = useLocation();\r\n const [loaded, setLoaded] = React.useState(false);\r\n const selectorLoading = useSelector(selectLoading);\r\n const { t } = useTranslation();\r\n //const appSettings: AppSettings | null = useSelector(selectAppSettings);\r\n const siteMapSettings = useSelector(selectSiteMapSettings);\r\n const siteMapProvider = useSelector(selectSiteMapProvider);\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n const [title, setTitle] = React.useState(undefined);\r\n //const favIconImg: string | undefined = appSettings?.FavIconImg;\r\n //const favIconTitle: string | undefined = appSettings?.FavIconTitle;\r\n const globalSettings = useSelector(selectglobalSettings);\r\n const favIconImg: string | undefined = globalSettings.GetString(\r\n AllowedSettings.FavIconImg,\r\n );\r\n const favIconTitle: string | undefined = globalSettings.GetString(\r\n AllowedSettings.FavIconTitle,\r\n );\r\n const getFavIconLink = () =>\r\n document.getElementById('tabFavIcon') as HTMLLinkElement;\r\n\r\n const handleFavIconChange = (favIcon: string | undefined) => {\r\n let favLink = getFavIconLink();\r\n if (favLink !== null) {\r\n if (favIcon !== undefined && favIcon !== '') {\r\n favLink.href = toRootedURL('/uploads/Branding/' + favIcon);\r\n } else {\r\n favLink.href = process.env.PUBLIC_URL + '/favicon.png';\r\n }\r\n }\r\n };\r\n const handleTitleChange = (title: string | undefined) => {\r\n if (title !== undefined && title !== '') {\r\n document.title = title;\r\n } else {\r\n document.title = 'BookitLab!';\r\n }\r\n };\r\n React.useEffect(() => {\r\n let active = !selectorLoading && !loaded;\r\n if (active) {\r\n if (isAuthenticated === true) {\r\n if (!!siteMapSettings && siteMapSettings !== null) {\r\n let node = siteMapProvider.findNode(location.pathname);\r\n if (node !== undefined && !!favIconImg && !!favIconTitle) {\r\n setTitle(\r\n () => `${favIconTitle} - ${node === undefined ? '' : node.Title}`,\r\n );\r\n setLoaded(true);\r\n }\r\n }\r\n } else {\r\n let node = NoAuthNodes(t).find(element => {\r\n if (element !== undefined) {\r\n const reactUrl = toLowerCaseSafely(element.reactUrl);\r\n if (reactUrl !== null) {\r\n let rpath = reactUrl.split('?')[0] ?? reactUrl;\r\n return location.pathname.toLowerCase().indexOf(rpath) > -1;\r\n } else {\r\n return (\r\n element.Url.toLowerCase().indexOf(\r\n location.pathname.toLowerCase(),\r\n ) > -1\r\n );\r\n }\r\n }\r\n return undefined;\r\n });\r\n if (node !== undefined && !!favIconImg && !!favIconTitle) {\r\n setTitle(\r\n () => `${favIconTitle} - ${node === undefined ? '' : node.Title}`,\r\n );\r\n setLoaded(true);\r\n }\r\n }\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n favIconImg,\r\n favIconTitle,\r\n isAuthenticated,\r\n loaded,\r\n location.pathname,\r\n selectorLoading,\r\n siteMapProvider,\r\n siteMapSettings,\r\n t,\r\n ]);\r\n return [favIconImg, title, handleFavIconChange, handleTitleChange, loaded];\r\n};\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { selectLoading } from 'app/slice/selectors';\r\n\r\nimport { Helmet } from 'react-helmet-async';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useTabTitle } from './useTabTitle';\r\n\r\nexport interface HeadTitleProps {\r\n isDispatcherLoading: boolean;\r\n i18Language: string;\r\n}\r\n\r\nexport function HeadTitle() {\r\n const { i18n } = useTranslation();\r\n const isDispatcherLoading = useSelector(selectLoading);\r\n\r\n const [\r\n favIcon,\r\n title,\r\n handleFavIconChange,\r\n handleTitleChange,\r\n loaded,\r\n ] = useTabTitle();\r\n useEffect(() => {\r\n let active = !isDispatcherLoading && loaded;\r\n\r\n if (active) {\r\n handleFavIconChange(favIcon);\r\n handleTitleChange(title);\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [\r\n favIcon,\r\n handleFavIconChange,\r\n handleTitleChange,\r\n isDispatcherLoading,\r\n loaded,\r\n title,\r\n ]);\r\n\r\n // const globalSettings = useSelector(selectglobalSettings);\r\n // const siteMapProvider = useSelector(selectSiteMapProvider);\r\n // const [currentNode, setCurrentNode] = React.useState(\r\n // undefined,\r\n // );\r\n // const [favIcon, setFavIcon] = React.useState(undefined);\r\n // const [favIconTitle, setFavIconTitle] = React.useState(\r\n // undefined,\r\n // );\r\n // const [, setLink] = React.useState(null);\r\n // const createLink = React.useMemo(() => {\r\n // let link: HTMLLinkElement | null = document.querySelector(\r\n // \"link[rel~='icon']\",\r\n // );\r\n // if (link === null) {\r\n // link = document.createElement('link');\r\n // link.rel = 'icon';\r\n // document.getElementsByTagName('head')[0].appendChild(link);\r\n // }\r\n // if (favIcon !== undefined && favIcon !== '') {\r\n // link.href = toRootedURL('/uploads/Branding/' + favIcon);\r\n // } else {\r\n // link.href = process.env.PUBLIC_URL + '/favicon.png';\r\n // }\r\n // return link;\r\n // }, [favIcon]);\r\n // React.useMemo(() => {\r\n // return siteMapProvider.findNode(location.pathname);\r\n // }, [siteMapProvider, location.pathname]);\r\n // const [pageTitle, setPageTitle] = useState(undefined);\r\n // useEffect(() => {\r\n // let active = !isDispatcherLoading;\r\n // if (active) {\r\n // setCurrentNode(() => siteMapProvider.findNode(location.pathname));\r\n // setFavIcon(() => globalSettings.GetString(AllowedSettings.FavIconImg));\r\n // setFavIconTitle(() =>\r\n // globalSettings.GetString(AllowedSettings.FavIconTitle),\r\n // );\r\n // setPageTitle(\r\n // () =>\r\n // `${favIconTitle} - ${\r\n // currentNode === undefined ? '' : currentNode?.Title\r\n // }`,\r\n // );\r\n // setLink(() => createLink);\r\n // }\r\n // return () => {\r\n // active = false;\r\n // };\r\n // // eslint-disable-next-line react-hooks/exhaustive-deps\r\n // }, [\r\n // currentNode,\r\n // favIcon,\r\n // favIconTitle,\r\n // globalSettings,\r\n // isDispatcherLoading,\r\n // location.pathname,\r\n // ]);\r\n //RENDER\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for AssetDetailsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const InstrumentRestrictionsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.InstrumentRestrictionsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for LabelTypeDetailsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const LabelTypeDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.LabelTypeDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for ConfigurableColumnExportImport Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ConfigurableColumnExportImportPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ConfigurableColumnExportImportPage,\r\n);\r\n","/**\r\n *\r\n * ShortURLRoute\r\n *\r\n */\r\nimport React from 'react';\r\nimport { RouteComponentProps, useHistory, useLocation } from 'react-router';\r\nimport { RouteProps, Route } from 'react-router-dom';\r\nimport { toRootedURL } from 'utils/url-utils';\r\n\r\nexport interface ShortURLRouteProps extends Omit {}\r\n/**\r\n * Forces url reload for external pages after navigation from react router (push/Redirect/etc.) and the page needs server side reload\r\n * @param props route props\r\n * @returns redirect\r\n */\r\nexport function ShortURLRoute(props: ShortURLRouteProps): React.ReactElement {\r\n const location = useLocation();\r\n const render = (propss: RouteComponentProps) => {\r\n const path =\r\n propss.location.pathname + propss.location.search + propss.location.hash;\r\n const rooted = toRootedURL(path);\r\n console.info(`Reloading external url ${path}`);\r\n if (\r\n propss.location.pathname.toLowerCase() === location.pathname.toLowerCase()\r\n ) {\r\n return null;\r\n }\r\n window.location.href = rooted;\r\n return null;\r\n };\r\n\r\n return ;\r\n}\r\n\r\nexport const DebugRouter = ({ children }: { children: any }) => {\r\n const { location } = useHistory();\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log(\r\n `Route: ${location.pathname}${location.search}, State: ${JSON.stringify(\r\n location.state,\r\n )}`,\r\n );\r\n }\r\n\r\n return children;\r\n};\r\n","/**\r\n *\r\n * ServerBarcodeRoute\r\n *\r\n */\r\nimport React from 'react';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { ShortURLRoute } from '../ShortURLRoute';\r\n\r\nexport interface ServerBarcodeRouteProps {\r\n appSettings: AppSettings | null;\r\n}\r\n\r\n/**\r\n * Forces url reload for external pages after navigation from react router (push/Redirect/etc.) and the page needs server side reload\r\n * @param props route props\r\n * @returns redirect\r\n */\r\nexport function ServerBarcodeRoute({\r\n appSettings,\r\n}: ServerBarcodeRouteProps): React.ReactElement {\r\n // collect short url templates from system settings\r\n const templates: Array = [\r\n appSettings?.AssetBarcodeRelativeUrlTemplate,\r\n appSettings?.RoomBarcodeRelativeUrlTemplate,\r\n appSettings?.LocationBarcodeRelativeUrlTemplate,\r\n appSettings?.SubLocationBarcodeRelativeUrlTemplate,\r\n ]\r\n .map(p => p ?? '')\r\n .filter(p => p !== '');\r\n\r\n // replace handlebars based templates to react format\r\n // e.g. /location/{{RoomId}}/{{LocationId}} => /location/:param1?/:param2?\r\n const replaceHandlebarTokens = function (s) {\r\n let index = 0;\r\n const result = s.replace(/({{[^}]+}})/g, function () {\r\n return `:param${index++}?`;\r\n });\r\n return result;\r\n };\r\n if (appSettings == null) {\r\n return <>;\r\n }\r\n\r\n const paths = templates\r\n .map(p =>\r\n // react router path should start with /\r\n replaceHandlebarTokens(p),\r\n )\r\n .map(p => (p.startsWith('/') ? p : '/' + p));\r\n\r\n // use the paths matching the shorturltemplates and use the dedicated route for all\r\n return ;\r\n}\r\n","/**\r\n * Asynchronously loads the component for NewMessagePage\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const NewMessagePage = lazyLoad(\r\n () => import('./index'),\r\n module => module.NewMessagePage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for OtherServiceDetailsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const OtherServiceDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.OtherServiceDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for InvoiceTemplates Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const InvoiceTemplates = lazyLoad(\r\n () => import('./index'),\r\n module => module.InvoiceTemplatesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Expenses Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const Expenses = lazyLoad(\r\n () => import('./index'),\r\n module => module.ExpensesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for PricePeriods Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const PricePeriodsPagePage = lazyLoad(\r\n () => import('./index'),\r\n module => module.PricePeriods,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for PriceSheetPeriodDetailsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const PriceSheetPeriodDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.PriceSheetPeriodDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for ArticlesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ArticlesPagePath = '/articles';\r\nexport const ArticlesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ArticlesPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AccountLayout = lazyLoad(\r\n () => import('./index'),\r\n module => module.AccountLayout,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const RegisterPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.RegisterPage,\r\n);\r\n","/**\r\n * Asynchronously loads the component for CalendarPage\r\n */\r\nimport { withGlobalServiceGroupFilter } from 'app/components/BasicTable/withGlobalServiceGroupFilter';\r\nimport { lazyLoad } from 'utils/loadable';\r\nimport { withSaveAsLastVisitedPage } from '../../hocs/withSaveAsLastVisitedPage';\r\n\r\nexport const CalendarPage = lazyLoad(\r\n () => import('./index'),\r\n module =>\r\n withSaveAsLastVisitedPage(\r\n withGlobalServiceGroupFilter(module.CalendarPage, true),\r\n ),\r\n);\r\n\r\nexport const CalendarPageDefaultRedir = lazyLoad(\r\n () => import('./index'),\r\n module => module.CalendarPageDefaultRedir,\r\n);\r\n","import * as React from 'react';\r\nimport { useProfileSetting } from 'app/components/BasicTable/useProfileSetting';\r\nimport { IBasePageProps } from '../pages/IBasePageProps';\r\nimport { getLogger } from 'utils/logLevel';\r\n\r\n/**\r\n * Enables wrapped page to be saved as the Last Visited Page. This is used to redirect users after login to the last visited page\r\n * @param Component Page component\r\n * @returns\r\n */\r\n\r\nexport function withSaveAsLastVisitedPage(\r\n Component: React.FC,\r\n) {\r\n const log = getLogger('withSaveAsLastVisitedPage');\r\n return (props: TProps) => {\r\n const LAST_SAVED_PAGE_PROFILE_KEY = 'LastVisitedPage';\r\n // reconstruct back the location in the aspnet compatible relative path e.g. ~/schedule/calendar?id=1#foobar\r\n const location = [\r\n '~',\r\n props.location.pathname,\r\n props.location.search,\r\n props.location.hash,\r\n ].join('');\r\n\r\n // warning: updateY might mutate after the \"savedValue\" change inside the useProfileSetting\r\n // this might lead to useEffect firing 2 times for each location change -\r\n // first time when location changes, and then once again on update function change\r\n const { updateValue: updateY } = useProfileSetting({\r\n profileSettingKey: LAST_SAVED_PAGE_PROFILE_KEY,\r\n });\r\n\r\n // update the profile setting on each location change on current page\r\n React.useEffect(() => {\r\n updateY(location);\r\n log.info('LastVisitedPage', location);\r\n }, [location, updateY]);\r\n\r\n // wrapped component render\r\n return ;\r\n };\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for ReservationDetailsPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ReservationDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ReservationDetailsPage,\r\n);\r\n","/**\r\n * Asynchronously loads the component for HomePage\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const HomePage = lazyLoad(\r\n () => import('./index'),\r\n module => module.HomePage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SystemPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SystemPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const DashboardPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.DefaultDashboardPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for CoreSelectionPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CoreSelectionPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CoreSelectionPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CoreHomePage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CoreHomeByRoutePage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CoreStatsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CoreStatsPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ReportingPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ReportingPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const BookitLabDashboadPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.BookitLabDashboadPage,\r\n);\r\n","/**\r\n *\r\n * RedirectWithSearch\r\n *\r\n */\r\nimport * as React from 'react';\r\nimport { Redirect, RedirectProps, useLocation } from 'react-router';\r\n\r\nexport interface RedirectWithSearchProps extends RedirectProps {\r\n preserveSearch?: boolean;\r\n}\r\n\r\nexport function RedirectWithSearch({\r\n preserveSearch = true,\r\n\r\n to,\r\n ...props\r\n}: RedirectWithSearchProps) {\r\n const location = useLocation();\r\n to.search = location.search;\r\n return ;\r\n}\r\n","/**\r\n *\r\n * Asynchronously loads the component for AssetSelectionPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AssetSelectionPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AssetSelectionPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const TermsOfUseAgreementPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.TermsOfUseAgreementPage,\r\n);\r\n","import { makeStyles, Theme } from '@material-ui/core';\r\nimport Box, { BoxProps } from '@material-ui/core/Box';\r\nimport { createStyles } from '@material-ui/styles';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectSnackBarIndex } from '../../slice/selectors';\r\nimport clsx from 'clsx';\r\n\r\nexport interface SnackWrapperProps extends BoxProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function SnackWrapper(props: SnackWrapperProps) {\r\n const upSnackbarIndex = useSelector(selectSnackBarIndex);\r\n const classes = useStyles();\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n zindex301: {\r\n '& > div': {\r\n zIndex: 1301,\r\n },\r\n },\r\n }),\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ActiveUserGroupPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ActiveUserGroupPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CannedReportsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CannedReports,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for UserAttributes Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const UserAttributes = lazyLoad(\r\n () => import('./index'),\r\n module => module.UserAttributesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for ReportConsumablesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ReportConsumablesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ReportConsumablesPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const LoginPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.LoginPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for CalendarMessagesDetails\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const CalendarMessagesDetailsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.CalendarMessagesDetailsPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for ServiceRequestsKanbanPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ServiceRequestsKanbanPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ServiceRequestsKanbanPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for OfflineServiceTypes Page\r\n *\r\n */\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const OfflineServiceTypesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.OfflineServiceTypesPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for AnimalCasePage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AnimalCaseEditPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AnimalCaseEditPage,\r\n);\r\n","import {\r\n IconLookup,\r\n IconPrefix,\r\n library,\r\n} from '@fortawesome/fontawesome-svg-core';\r\n/*\r\nIt is important to declare icons in the following way:\r\nimport { faName } from '@fortawesome/pro-solid-svg-icons/faName';\r\nThis prevents the entire icon pack from loading and only loads one specific icon.\r\n*/\r\nimport { faUserCircle } from '@fortawesome/pro-solid-svg-icons/faUserCircle';\r\nimport { faChevronUp } from '@fortawesome/pro-solid-svg-icons/faChevronUp';\r\nimport { faPencil } from '@fortawesome/pro-solid-svg-icons/faPencil';\r\nimport { faLock } from '@fortawesome/pro-solid-svg-icons/faLock';\r\nimport { faUsers } from '@fortawesome/pro-solid-svg-icons/faUsers';\r\nimport { faBell } from '@fortawesome/pro-solid-svg-icons/faBell';\r\nimport { faQuestionCircle } from '@fortawesome/pro-solid-svg-icons/faQuestionCircle';\r\nimport { faSignOutAlt } from '@fortawesome/pro-solid-svg-icons/faSignOutAlt';\r\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\r\nimport { faLayerGroup } from '@fortawesome/pro-solid-svg-icons/faLayerGroup';\r\nimport { faBookmark } from '@fortawesome/pro-solid-svg-icons/faBookmark';\r\nimport { faCalendarAlt } from '@fortawesome/pro-solid-svg-icons/faCalendarAlt';\r\nimport { faDumbbell } from '@fortawesome/pro-solid-svg-icons/faDumbbell';\r\nimport { faCommentAltDots } from '@fortawesome/pro-solid-svg-icons/faCommentAltDots';\r\nimport { faBolt } from '@fortawesome/pro-solid-svg-icons/faBolt';\r\nimport { faListUl } from '@fortawesome/pro-solid-svg-icons/faListUl';\r\nimport { faChartBar } from '@fortawesome/pro-solid-svg-icons/faChartBar';\r\nimport { faChartColumn } from '@fortawesome/pro-solid-svg-icons/faChartColumn';\r\nimport { faChartLine } from '@fortawesome/pro-solid-svg-icons/faChartLine';\r\nimport { faChartPie } from '@fortawesome/pro-solid-svg-icons/faChartPie';\r\nimport { faChartPieAlt } from '@fortawesome/pro-solid-svg-icons/faChartPieAlt';\r\nimport { faMegaphone } from '@fortawesome/pro-solid-svg-icons/faMegaphone';\r\nimport { faFileInvoiceDollar } from '@fortawesome/pro-solid-svg-icons/faFileInvoiceDollar';\r\nimport { faCog } from '@fortawesome/pro-solid-svg-icons/faCog';\r\nimport { faTimes } from '@fortawesome/pro-solid-svg-icons/faTimes';\r\nimport { faCircle } from '@fortawesome/pro-solid-svg-icons/faCircle';\r\nimport { faCircleSmall } from '@fortawesome/pro-solid-svg-icons/faCircleSmall';\r\nimport { faCircleCheck } from '@fortawesome/pro-solid-svg-icons/faCircleCheck';\r\nimport { faPrint } from '@fortawesome/pro-solid-svg-icons/faPrint';\r\nimport { faSearch } from '@fortawesome/pro-solid-svg-icons/faSearch';\r\nimport { faChevronDoubleUp } from '@fortawesome/pro-solid-svg-icons/faChevronDoubleUp';\r\nimport { faChevronDoubleDown } from '@fortawesome/pro-solid-svg-icons/faChevronDoubleDown';\r\nimport { faCheck } from '@fortawesome/pro-solid-svg-icons/faCheck';\r\nimport { faCheckDouble } from '@fortawesome/pro-solid-svg-icons/faCheckDouble';\r\nimport { faInfo } from '@fortawesome/pro-solid-svg-icons/faInfo';\r\nimport { faTriangleExclamation } from '@fortawesome/pro-solid-svg-icons/faTriangleExclamation';\r\nimport { faXmark } from '@fortawesome/pro-solid-svg-icons/faXmark';\r\nimport { faChevronDown } from '@fortawesome/pro-solid-svg-icons/faChevronDown';\r\nimport { faCircleXmark } from '@fortawesome/pro-solid-svg-icons/faCircleXmark';\r\nimport { faEllipsisV } from '@fortawesome/pro-solid-svg-icons/faEllipsisV';\r\nimport { faPlus } from '@fortawesome/pro-solid-svg-icons/faPlus';\r\nimport { faFilter } from '@fortawesome/pro-solid-svg-icons/faFilter';\r\nimport { faTable } from '@fortawesome/pro-solid-svg-icons/faTable';\r\nimport { faMinus } from '@fortawesome/pro-solid-svg-icons/faMinus';\r\nimport { faFileImport } from '@fortawesome/pro-solid-svg-icons/faFileImport';\r\nimport { faGlobe } from '@fortawesome/pro-solid-svg-icons/faGlobe';\r\nimport { faLockOpen } from '@fortawesome/pro-solid-svg-icons/faLockOpen';\r\nimport { faEdit } from '@fortawesome/pro-solid-svg-icons/faEdit';\r\nimport { faTrash } from '@fortawesome/pro-solid-svg-icons/faTrash';\r\nimport { faInfoCircle } from '@fortawesome/pro-solid-svg-icons/faInfoCircle';\r\nimport { faGripVertical } from '@fortawesome/pro-solid-svg-icons/faGripVertical';\r\nimport { faBellSlash } from '@fortawesome/pro-solid-svg-icons/faBellSlash';\r\nimport { faExclamationCircle } from '@fortawesome/pro-solid-svg-icons/faExclamationCircle';\r\nimport { faTimesCircle } from '@fortawesome/pro-solid-svg-icons/faTimesCircle';\r\nimport { faArrowLeft } from '@fortawesome/pro-solid-svg-icons/faArrowLeft';\r\nimport { faTools } from '@fortawesome/pro-solid-svg-icons/faTools';\r\nimport { faPlay } from '@fortawesome/pro-solid-svg-icons/faPlay';\r\nimport { faHistory } from '@fortawesome/pro-solid-svg-icons/faHistory';\r\nimport { faAdd } from '@fortawesome/pro-solid-svg-icons/faAdd';\r\nimport { faStream } from '@fortawesome/pro-solid-svg-icons/faStream';\r\nimport { faRulerTriangle } from '@fortawesome/pro-solid-svg-icons/faRulerTriangle';\r\nimport { faThList } from '@fortawesome/pro-solid-svg-icons/faThList';\r\nimport { faPencilAlt } from '@fortawesome/pro-solid-svg-icons/faPencilAlt';\r\nimport { faCalendarPlus } from '@fortawesome/pro-solid-svg-icons/faCalendarPlus';\r\nimport { faPause } from '@fortawesome/pro-solid-svg-icons/faPause';\r\nimport { faSave } from '@fortawesome/pro-solid-svg-icons/faSave';\r\nimport { faCalendars } from '@fortawesome/pro-solid-svg-icons/faCalendars';\r\nimport { faListTimeline } from '@fortawesome/pro-solid-svg-icons/faListTimeline';\r\nimport { faCode } from '@fortawesome/pro-solid-svg-icons/faCode';\r\nimport { faBan } from '@fortawesome/pro-solid-svg-icons/faBan';\r\nimport { faFloppyDiskCircleArrowRight } from '@fortawesome/pro-solid-svg-icons/faFloppyDiskCircleArrowRight';\r\nimport { faCalculator } from '@fortawesome/pro-solid-svg-icons/faCalculator';\r\nimport { faRefresh } from '@fortawesome/pro-solid-svg-icons/faRefresh';\r\nimport { faSquare } from '@fortawesome/pro-solid-svg-icons/faSquare';\r\nimport { faClone } from '@fortawesome/pro-solid-svg-icons/faClone';\r\nimport { faClock } from '@fortawesome/pro-solid-svg-icons/faClock';\r\nimport { faChevronRight } from '@fortawesome/pro-solid-svg-icons/faChevronRight';\r\nimport { faClipboardList } from '@fortawesome/pro-solid-svg-icons/faClipboardList';\r\nimport { faEnvelope } from '@fortawesome/pro-solid-svg-icons/faEnvelope';\r\nimport { faCalendar } from '@fortawesome/pro-solid-svg-icons/faCalendar';\r\nimport { faCheckCircle } from '@fortawesome/pro-solid-svg-icons/faCheckCircle';\r\nimport { faLink } from '@fortawesome/pro-solid-svg-icons/faLink';\r\nimport { faChevronDoubleRight } from '@fortawesome/pro-solid-svg-icons/faChevronDoubleRight';\r\nimport { faChevronDoubleLeft } from '@fortawesome/pro-solid-svg-icons/faChevronDoubleLeft';\r\nimport { faChevronLeft } from '@fortawesome/pro-solid-svg-icons/faChevronLeft';\r\nimport { faChevronsLeft } from '@fortawesome/pro-solid-svg-icons/faChevronsLeft';\r\nimport { faChevronsRight } from '@fortawesome/pro-solid-svg-icons/faChevronsRight';\r\nimport { faList } from '@fortawesome/pro-solid-svg-icons/faList';\r\nimport { faUser } from '@fortawesome/pro-solid-svg-icons/faUser';\r\nimport { faGripHorizontal } from '@fortawesome/pro-solid-svg-icons/faGripHorizontal';\r\nimport { faArrowFromLeft } from '@fortawesome/pro-solid-svg-icons/faArrowFromLeft';\r\nimport { faVial } from '@fortawesome/pro-solid-svg-icons/faVial';\r\nimport { faStopwatch } from '@fortawesome/pro-solid-svg-icons/faStopwatch';\r\nimport { faWrench } from '@fortawesome/pro-solid-svg-icons/faWrench';\r\nimport { faArrowUpRightFromSquare } from '@fortawesome/pro-solid-svg-icons/faArrowUpRightFromSquare';\r\nimport { faExternalLink } from '@fortawesome/pro-solid-svg-icons/faExternalLink';\r\nimport { faExternalLinkAlt } from '@fortawesome/pro-solid-svg-icons/faExternalLinkAlt';\r\nimport { faClose } from '@fortawesome/pro-solid-svg-icons/faClose';\r\nimport { faDownload } from '@fortawesome/pro-solid-svg-icons/faDownload';\r\nimport { faBold } from '@fortawesome/pro-solid-svg-icons/faBold';\r\nimport { faItalic } from '@fortawesome/pro-solid-svg-icons/faItalic';\r\nimport { faUnderline } from '@fortawesome/pro-solid-svg-icons/faUnderline';\r\nimport { faH1 } from '@fortawesome/pro-solid-svg-icons/faH1';\r\nimport { faH2 } from '@fortawesome/pro-solid-svg-icons/faH2';\r\nimport { faQuoteRight } from '@fortawesome/pro-solid-svg-icons/faQuoteRight';\r\nimport { faListOl } from '@fortawesome/pro-solid-svg-icons/faListOl';\r\nimport { faFileAlt } from '@fortawesome/pro-solid-svg-icons/faFileAlt';\r\nimport { faAt } from '@fortawesome/pro-solid-svg-icons/faAt';\r\nimport { faBarcode } from '@fortawesome/pro-solid-svg-icons/faBarcode';\r\nimport { faChain } from '@fortawesome/pro-solid-svg-icons/faChain';\r\nimport { faPowerOff } from '@fortawesome/pro-solid-svg-icons/faPowerOff';\r\nimport { faPlug } from '@fortawesome/pro-solid-svg-icons/faPlug';\r\nimport { faMicroscope } from '@fortawesome/pro-solid-svg-icons/faMicroscope';\r\nimport { faCalendarCheck } from '@fortawesome/pro-solid-svg-icons/faCalendarCheck';\r\nimport { faCalendarExclamation } from '@fortawesome/pro-solid-svg-icons/faCalendarExclamation';\r\nimport { faCalendarTimes } from '@fortawesome/pro-solid-svg-icons/faCalendarTimes';\r\nimport { faFileUpload } from '@fortawesome/pro-solid-svg-icons/faFileUpload';\r\nimport { faSpinner } from '@fortawesome/pro-solid-svg-icons/faSpinner';\r\nimport { faMoneyCheckEdit } from '@fortawesome/pro-solid-svg-icons/faMoneyCheckEdit';\r\nimport { faLevelUpAlt } from '@fortawesome/pro-solid-svg-icons/faLevelUpAlt';\r\nimport { faPaperclip } from '@fortawesome/pro-solid-svg-icons/faPaperclip';\r\nimport { faAbacus } from '@fortawesome/pro-solid-svg-icons/faAbacus';\r\nimport { faAlbum } from '@fortawesome/pro-solid-svg-icons/faAlbum';\r\nimport { faFile } from '@fortawesome/pro-solid-svg-icons/faFile';\r\nimport { faSync } from '@fortawesome/pro-solid-svg-icons/faSync';\r\nimport { faRectangleVerticalHistory } from '@fortawesome/pro-solid-svg-icons/faRectangleVerticalHistory';\r\nimport { faUniversity } from '@fortawesome/pro-solid-svg-icons/faUniversity';\r\nimport { faShopSlash } from '@fortawesome/pro-solid-svg-icons/faShopSlash';\r\nimport { faDollarSign } from '@fortawesome/pro-solid-svg-icons/faDollarSign';\r\nimport { faExchange } from '@fortawesome/pro-solid-svg-icons/faExchange';\r\nimport { faClipboardListCheck } from '@fortawesome/pro-solid-svg-icons/faClipboardListCheck';\r\nimport { faSms } from '@fortawesome/pro-solid-svg-icons/faSms';\r\nimport { faUserPlus } from '@fortawesome/pro-solid-svg-icons/faUserPlus';\r\nimport { faUserShield } from '@fortawesome/pro-solid-svg-icons/faUserShield';\r\nimport { faWarning } from '@fortawesome/pro-solid-svg-icons/faWarning';\r\nimport { faLocationCrosshairs } from '@fortawesome/pro-solid-svg-icons/faLocationCrosshairs';\r\nimport { faCircleDollarToSlot } from '@fortawesome/pro-solid-svg-icons/faCircleDollarToSlot';\r\nimport { faCopy } from '@fortawesome/pro-solid-svg-icons/faCopy';\r\nimport { faCodeBranch } from '@fortawesome/pro-solid-svg-icons/faCodeBranch';\r\nimport { faChevronsUp } from '@fortawesome/pro-solid-svg-icons/faChevronsUp';\r\nimport { faChevronsDown } from '@fortawesome/pro-solid-svg-icons/faChevronsDown';\r\nimport { faEquals } from '@fortawesome/pro-solid-svg-icons/faEquals';\r\nimport { faFileSpreadsheet } from '@fortawesome/pro-solid-svg-icons/faFileSpreadsheet';\r\nimport { faFilePdf } from '@fortawesome/pro-solid-svg-icons/faFilePdf';\r\nimport { faFileImage } from '@fortawesome/pro-solid-svg-icons/faFileImage';\r\n\r\nimport { faCircleCheck as falCircleCheck } from '@fortawesome/pro-light-svg-icons/faCircleCheck';\r\nimport { faTriangleExclamation as falTriangleExclamation } from '@fortawesome/pro-light-svg-icons/faTriangleExclamation';\r\nimport { faCircleQuarters as falCircleQuarters } from '@fortawesome/pro-light-svg-icons/faCircleQuarters';\r\nimport { faCircleExclamation as falCircleExclamation } from '@fortawesome/pro-light-svg-icons/faCircleExclamation';\r\nimport { faMinimize as falMinimize } from '@fortawesome/pro-light-svg-icons/faMinimize';\r\nimport { faMaximize as falMaximize } from '@fortawesome/pro-light-svg-icons/faMaximize';\r\nimport { faTable as falTable } from '@fortawesome/pro-light-svg-icons/faTable';\r\nimport { faCalendars as falCalendars } from '@fortawesome/pro-light-svg-icons/faCalendars';\r\n\r\nimport { faTelescope as fadTelescope } from '@fortawesome/pro-duotone-svg-icons/faTelescope';\r\nimport { faInfinity as fadInfinity } from '@fortawesome/pro-duotone-svg-icons/faInfinity';\r\n\r\nimport { faCalendarCheck as fadCalendarCheck } from '@fortawesome/pro-duotone-svg-icons/faCalendarCheck';\r\nimport { faCalendarExclamation as fadCalendarExclamation } from '@fortawesome/pro-duotone-svg-icons/faCalendarExclamation';\r\nimport { faCalendarTimes as fadCalendarTimes } from '@fortawesome/pro-duotone-svg-icons/faCalendarTimes';\r\nimport { faCalendarPlus as fadCalendarPlus } from '@fortawesome/pro-duotone-svg-icons/faCalendarPlus';\r\n\r\nimport { faMaximize as farMaximize } from '@fortawesome/pro-regular-svg-icons/faMaximize';\r\nimport { faCommentQuestion as farCommentQuestion } from '@fortawesome/pro-regular-svg-icons/faCommentQuestion';\r\nimport { faCircleExclamation as farcircleExclamation } from '@fortawesome/pro-regular-svg-icons/faCircleExclamation';\r\nimport { faCircleCheck as farCircleCheck } from '@fortawesome/pro-regular-svg-icons/faCircleCheck';\r\n\r\nimport { faGoogle as fabGoogle } from '@fortawesome/free-brands-svg-icons/faGoogle';\r\nimport { faWindows as fabWindows } from '@fortawesome/free-brands-svg-icons/faWindows';\r\nimport { faNewspaper } from '@fortawesome/pro-solid-svg-icons/faNewspaper';\r\nimport { faFlag } from '@fortawesome/pro-solid-svg-icons/faFlag';\r\nimport { faBarcodeScan } from '@fortawesome/pro-solid-svg-icons/faBarcodeScan';\r\nimport { faMap } from '@fortawesome/pro-solid-svg-icons/faMap';\r\nimport { faBars } from '@fortawesome/pro-solid-svg-icons/faBars';\r\nimport { faMagnifyingGlass } from '@fortawesome/pro-solid-svg-icons/faMagnifyingGlass';\r\nimport { faGrid2 } from '@fortawesome/pro-solid-svg-icons/faGrid2';\r\nimport { faScrewdriver } from '@fortawesome/pro-solid-svg-icons/faScrewdriver';\r\nimport { faBullhorn } from '@fortawesome/pro-solid-svg-icons/faBullhorn';\r\nimport { faMoneyBill } from '@fortawesome/pro-solid-svg-icons/faMoneyBill';\r\nimport { faFileArrowUp } from '@fortawesome/pro-solid-svg-icons/faFileArrowUp';\r\nimport { faEarthEurope } from '@fortawesome/pro-solid-svg-icons/faEarthEurope';\r\nimport { faShare } from '@fortawesome/pro-solid-svg-icons/faShare';\r\nimport { faScannerKeyboard } from '@fortawesome/pro-solid-svg-icons/faScannerKeyboard';\r\nimport { faCircleNotch } from '@fortawesome/pro-solid-svg-icons/faCircleNotch';\r\nimport { faMapLocation } from '@fortawesome/pro-solid-svg-icons/faMapLocation';\r\nimport { faScrewdriverWrench } from '@fortawesome/pro-solid-svg-icons/faScrewdriverWrench';\r\nimport { faBandage } from '@fortawesome/pro-solid-svg-icons/faBandage';\r\nimport { faHourglassHalf } from '@fortawesome/pro-solid-svg-icons/faHourglassHalf';\r\nimport { faInfinity as fasInfinity } from '@fortawesome/pro-solid-svg-icons/faInfinity';\r\n\r\nimport { Entity } from 'types/common';\r\n\r\nexport type IconName =\r\n | 'circle-user'\r\n | 'user-circle'\r\n | 'chevron-up'\r\n | 'pencil'\r\n | 'lock'\r\n | 'users'\r\n | 'bell'\r\n | 'question-circle'\r\n | 'sign-out-alt'\r\n | 'home'\r\n | 'layer-group'\r\n | 'bookmark'\r\n | 'calendar-alt'\r\n | 'dumbbell'\r\n | 'comment-alt-dots'\r\n | 'bolt'\r\n | 'list-ul'\r\n | 'chart-bar'\r\n | 'chart-column'\r\n | 'chart-line'\r\n | 'chart-pie'\r\n | 'chart-pie-alt'\r\n | 'megaphone'\r\n | 'file-invoice-dollar'\r\n | 'cog'\r\n | 'times'\r\n | 'circle'\r\n | 'circle-small'\r\n | 'circle-check'\r\n | 'print'\r\n | 'search'\r\n | 'chevron-double-up'\r\n | 'chevron-double-down'\r\n | 'check'\r\n | 'check-double'\r\n | 'info'\r\n | 'triangle-exclamation'\r\n | 'xmark'\r\n | 'chevron-down'\r\n | 'circle-xmark'\r\n | 'ellipsis-v'\r\n | 'plus'\r\n | 'filter'\r\n | 'table'\r\n | 'minus'\r\n | 'file-import'\r\n | 'globe'\r\n | 'lock-open'\r\n | 'edit'\r\n | 'trash'\r\n | 'info-circle'\r\n | 'grip-vertical'\r\n | 'bell-slash'\r\n | 'exclamation-circle'\r\n | 'times-circle'\r\n | 'arrow-left'\r\n | 'tools'\r\n | 'play'\r\n | 'history'\r\n | 'add'\r\n | 'stream'\r\n | 'ruler-triangle'\r\n | 'th-list'\r\n | 'clipboard-list-check'\r\n | 'pencil-alt'\r\n | 'calendar-plus'\r\n | 'pause'\r\n | 'save'\r\n | 'calendars'\r\n | 'list-timeline'\r\n | 'code'\r\n | 'ban'\r\n | 'floppy-disk-circle-arrow-right'\r\n | 'calculator'\r\n | 'refresh'\r\n | 'square'\r\n | 'clone'\r\n | 'clock'\r\n | 'chevron-right'\r\n | 'clipboard-list'\r\n | 'envelope'\r\n | 'calendar'\r\n | 'check-circle'\r\n | 'link'\r\n | 'chevron-double-right'\r\n | 'chevron-double-left'\r\n | 'chevron-left'\r\n | 'chevrons-left'\r\n | 'chevrons-right'\r\n | 'list'\r\n | 'user'\r\n | 'grip-horizontal'\r\n | 'arrow-from-left'\r\n | 'vial'\r\n | 'stopwatch'\r\n | 'wrench'\r\n | 'arrow-up-right-from-square'\r\n | 'external-link'\r\n | 'external-link-alt'\r\n | 'close'\r\n | 'download'\r\n | 'bold'\r\n | 'italic'\r\n | 'underline'\r\n | 'h1'\r\n | 'h2'\r\n | 'quote-right'\r\n | 'list-ol'\r\n | 'file-alt'\r\n | 'at'\r\n | 'barcode'\r\n | 'chain'\r\n | 'power-off'\r\n | 'plug'\r\n | 'microscope'\r\n | 'calendar-check'\r\n | 'calendar-exclamation'\r\n | 'calendar-times'\r\n | 'file-upload'\r\n | 'spinner'\r\n | 'money-check-edit'\r\n | 'level-up-alt'\r\n | 'paperclip'\r\n | 'abacus'\r\n | 'album'\r\n | 'file'\r\n | 'sync'\r\n | 'rectangle-vertical-history'\r\n | 'university'\r\n | 'shop-slash'\r\n | 'dollar-sign'\r\n | 'exchange'\r\n | 'sms'\r\n | 'circle-check'\r\n | 'triangle-exclamation'\r\n | 'circle-quarters'\r\n | 'circle-exclamation'\r\n | 'minimize'\r\n | 'maximize'\r\n | 'table'\r\n | 'calendars'\r\n | 'telescope'\r\n | 'infinity'\r\n | 'calendar-check'\r\n | 'calendar-exclamation'\r\n | 'calendar-times'\r\n | 'calendar-plus'\r\n | 'maximize'\r\n | 'comment-question'\r\n | 'circle-exclamation'\r\n | 'circle-check'\r\n | 'google'\r\n | 'user-plus'\r\n | 'user-shield'\r\n | 'warning'\r\n | 'windows'\r\n | 'location-crosshairs'\r\n | 'circle-dollar-to-slot'\r\n | 'code-branch'\r\n | 'copy'\r\n | 'chevrons-up'\r\n | 'chevrons-down'\r\n | 'equals'\r\n | 'file-spreadsheet'\r\n | 'file-pdf'\r\n | 'newspaper'\r\n | 'file-image'\r\n | 'flag'\r\n | 'barcode-scan'\r\n | 'map'\r\n | 'bars'\r\n | 'magnifying-glass'\r\n | 'grid-2'\r\n | 'screwdriver'\r\n | 'bullhorn'\r\n | 'money-bill'\r\n | 'file-arrow-up'\r\n | 'earth-europe'\r\n | 'share'\r\n | 'scanner-keyboard'\r\n | 'circle-notch'\r\n | 'map-location'\r\n | 'screwdriver-wrench'\r\n | 'bandage'\r\n | 'hourglass-half';\r\n\r\n//library.add(fas, fad, far, fal, faGoogle, faWindows);\r\nlibrary.add(\r\n //fas\r\n faUserCircle,\r\n faChevronUp,\r\n faPencil,\r\n faLock,\r\n faUsers,\r\n faBell,\r\n faQuestionCircle,\r\n faSignOutAlt,\r\n faHome,\r\n faLayerGroup,\r\n faBookmark,\r\n faCalendarAlt,\r\n faDumbbell,\r\n faCommentAltDots,\r\n faBolt,\r\n faListUl,\r\n faChartBar,\r\n faChartColumn,\r\n faChartLine,\r\n faChartPie,\r\n faChartPieAlt,\r\n faMegaphone,\r\n faFileInvoiceDollar,\r\n faCog,\r\n faTimes,\r\n faCircle,\r\n faCircleSmall,\r\n faCircleCheck,\r\n faPrint,\r\n faSearch,\r\n faChevronDoubleUp,\r\n faChevronDoubleDown,\r\n faCheck,\r\n faCheckDouble,\r\n faInfo,\r\n faTriangleExclamation,\r\n faXmark,\r\n faChevronDown,\r\n faCircleXmark,\r\n faEllipsisV,\r\n faPlus,\r\n faFilter,\r\n faTable,\r\n faMinus,\r\n faFileImport,\r\n faGlobe,\r\n faLockOpen,\r\n faEdit,\r\n faTrash,\r\n faInfoCircle,\r\n faGripVertical,\r\n faBellSlash,\r\n faExclamationCircle,\r\n faTimesCircle,\r\n faArrowLeft,\r\n faTools,\r\n faPlay,\r\n faHistory,\r\n faAdd,\r\n faStream,\r\n faRulerTriangle,\r\n faThList,\r\n faClipboardListCheck,\r\n faPencilAlt,\r\n faCalendarPlus,\r\n faPause,\r\n faSave,\r\n faCalendars,\r\n faListTimeline,\r\n faCode,\r\n faBan,\r\n faFloppyDiskCircleArrowRight,\r\n faCalculator,\r\n faRefresh,\r\n faSquare,\r\n faClone,\r\n faClock,\r\n faChevronRight,\r\n faClipboardList,\r\n faEnvelope,\r\n faCalendar,\r\n faCheckCircle,\r\n faLink,\r\n faChevronDoubleRight,\r\n faChevronDoubleLeft,\r\n faChevronLeft,\r\n faList,\r\n faUser,\r\n faGripHorizontal,\r\n faArrowFromLeft,\r\n faVial,\r\n faStopwatch,\r\n faWrench,\r\n faArrowUpRightFromSquare,\r\n faExternalLink,\r\n faExternalLinkAlt,\r\n faClose,\r\n faDownload,\r\n faBold,\r\n faItalic,\r\n faUnderline,\r\n faH1,\r\n faH2,\r\n faQuoteRight,\r\n faListOl,\r\n faFileAlt,\r\n faAt,\r\n faBarcode,\r\n faChain,\r\n faPowerOff,\r\n faPlug,\r\n faMicroscope,\r\n faCalendarCheck,\r\n faCalendarExclamation,\r\n faCalendarTimes,\r\n faFileUpload,\r\n faSpinner,\r\n faMoneyCheckEdit,\r\n faLevelUpAlt,\r\n faPaperclip,\r\n faAbacus,\r\n faAlbum,\r\n faFile,\r\n faSync,\r\n faRectangleVerticalHistory,\r\n faUniversity,\r\n faShopSlash,\r\n faDollarSign,\r\n faExchange,\r\n faSms,\r\n faUserPlus,\r\n faUserShield,\r\n faWarning,\r\n faLocationCrosshairs,\r\n faCircleDollarToSlot,\r\n faCopy,\r\n faCodeBranch,\r\n faChevronsUp,\r\n faChevronsDown,\r\n faEquals,\r\n faFileSpreadsheet,\r\n faFilePdf,\r\n faNewspaper,\r\n faFileImage,\r\n faFlag,\r\n faBarcodeScan,\r\n faMap,\r\n faBars,\r\n faMagnifyingGlass,\r\n faGrid2,\r\n faScrewdriver,\r\n faBullhorn,\r\n faMoneyBill,\r\n faFileArrowUp,\r\n faEarthEurope,\r\n faScannerKeyboard,\r\n faChevronsLeft,\r\n faChevronsRight,\r\n faCircleNotch,\r\n faMapLocation,\r\n faScrewdriverWrench,\r\n faBandage,\r\n faHourglassHalf,\r\n fasInfinity,\r\n //fal\r\n falCircleCheck,\r\n falTriangleExclamation,\r\n falCircleQuarters,\r\n falCircleExclamation,\r\n falMinimize,\r\n falMaximize,\r\n falTable,\r\n falCalendars,\r\n //fad\r\n fadTelescope,\r\n fadInfinity,\r\n fadCalendarCheck,\r\n fadCalendarExclamation,\r\n fadCalendarTimes,\r\n fadCalendarPlus,\r\n //far\r\n farMaximize,\r\n farCommentQuestion,\r\n farcircleExclamation,\r\n farCircleCheck,\r\n //fab\r\n fabGoogle,\r\n fabWindows,\r\n faShare,\r\n);\r\nexport type IconProp = IconName | [IconPrefix, IconName] | IconLookup;\r\n\r\nexport const IconNames: string[] = [\r\n 'circle-user',\r\n 'user-circle',\r\n 'chevron-up',\r\n 'pencil',\r\n 'lock',\r\n 'users',\r\n 'bell',\r\n 'question-circle',\r\n 'sign-out-alt',\r\n 'home',\r\n 'layer-group',\r\n 'bookmark',\r\n 'calendar-alt',\r\n 'dumbbell',\r\n 'comment-alt-dots',\r\n 'bolt',\r\n 'list-ul',\r\n 'chart-bar',\r\n 'chart-column',\r\n 'chart-line',\r\n 'chart-pie',\r\n 'chart-pie-alt',\r\n 'megaphone',\r\n 'file-invoice-dollar',\r\n 'cog',\r\n 'times',\r\n 'circle',\r\n 'circle-small',\r\n 'circle-check',\r\n 'print',\r\n 'search',\r\n 'chevron-double-up',\r\n 'chevron-double-down',\r\n 'check',\r\n 'check-double',\r\n 'info',\r\n 'triangle-exclamation',\r\n 'xmark',\r\n 'chevron-down',\r\n 'circle-xmark',\r\n 'ellipsis-v',\r\n 'plus',\r\n 'filter',\r\n 'table',\r\n 'minus',\r\n 'file-import',\r\n 'globe',\r\n 'lock-open',\r\n 'edit',\r\n 'trash',\r\n 'info-circle',\r\n 'grip-vertical',\r\n 'bell-slash',\r\n 'exclamation-circle',\r\n 'times-circle',\r\n 'arrow-left',\r\n 'tools',\r\n 'play',\r\n 'history',\r\n 'add',\r\n 'stream',\r\n 'ruler-triangle',\r\n 'th-list',\r\n 'clipboard-list-check',\r\n 'pencil-alt',\r\n 'calendar-plus',\r\n 'pause',\r\n 'save',\r\n 'calendars',\r\n 'list-timeline',\r\n 'code',\r\n 'ban',\r\n 'floppy-disk-circle-arrow-right',\r\n 'calculator',\r\n 'refresh',\r\n 'square',\r\n 'clone',\r\n 'clock',\r\n 'chevron-right',\r\n 'chevrons-right',\r\n 'clipboard-list',\r\n 'envelope',\r\n 'calendar',\r\n 'check-circle',\r\n 'link',\r\n 'chevron-double-right',\r\n 'chevron-double-left',\r\n 'chevron-left',\r\n 'chevrons-left',\r\n 'list',\r\n 'user',\r\n 'grip-horizontal',\r\n 'arrow-from-left',\r\n 'vial',\r\n 'stopwatch',\r\n 'wrench',\r\n 'arrow-up-right-from-square',\r\n 'external-link',\r\n 'external-link-alt',\r\n 'close',\r\n 'download',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'h1',\r\n 'h2',\r\n 'quote-right',\r\n 'list-ol',\r\n 'file-alt',\r\n 'at',\r\n 'barcode',\r\n 'chain',\r\n 'power-off',\r\n 'plug',\r\n 'microscope',\r\n 'calendar-check',\r\n 'calendar-exclamation',\r\n 'calendar-times',\r\n 'file-upload',\r\n 'spinner',\r\n 'money-check-edit',\r\n 'level-up-alt',\r\n 'paperclip',\r\n 'abacus',\r\n 'album',\r\n 'file',\r\n 'sync',\r\n 'rectangle-vertical-history',\r\n 'university',\r\n 'shop-slash',\r\n 'dollar-sign',\r\n 'exchange',\r\n 'sms',\r\n 'circle-check',\r\n 'triangle-exclamation',\r\n 'circle-quarters',\r\n 'circle-exclamation',\r\n 'minimize',\r\n 'maximize',\r\n 'table',\r\n 'calendars',\r\n 'telescope',\r\n 'infinity',\r\n 'calendar-check',\r\n 'calendar-exclamation',\r\n 'calendar-times',\r\n 'calendar-plus',\r\n 'maximize',\r\n 'comment-question',\r\n 'circle-exclamation',\r\n 'circle-check',\r\n 'google',\r\n 'user-plus',\r\n 'user-shield',\r\n 'warning',\r\n 'windows',\r\n 'location-crosshairs',\r\n 'circle-dollar-to-slot',\r\n 'code-branch',\r\n 'copy',\r\n 'chevrons-up',\r\n 'chevrons-down',\r\n 'equals',\r\n 'file-spreadsheet',\r\n 'file-pdf',\r\n 'newspaper',\r\n 'flag',\r\n 'barcode-scan',\r\n 'map',\r\n 'bars',\r\n 'magnifying-glass',\r\n 'grid-2',\r\n 'screwdriver',\r\n 'bullhorn',\r\n 'money-bill',\r\n 'file-arrow-up',\r\n 'earth-europe',\r\n 'share',\r\n 'scanner-keyboard',\r\n 'circle-notch',\r\n 'map-location',\r\n 'screwdriver-wrench',\r\n 'bandage',\r\n 'hourglass-half',\r\n];\r\nexport const getIconNames = (): Entity[] => {\r\n const iconst = IconNames.map(icon => {\r\n return {\r\n Id: icon\r\n .split('-')\r\n .map((item, i) => {\r\n if (i === 0) {\r\n return item.toLowerCase();\r\n }\r\n return item.charAt(0).toUpperCase() + item.slice(1).toLowerCase();\r\n })\r\n .join(''),\r\n Name: icon,\r\n };\r\n });\r\n return iconst;\r\n};\r\nexport const getIconNamesObject = () => {\r\n const iconst = IconNames.map(icon => {\r\n return {\r\n [icon\r\n .split('-')\r\n .map((item, i) => {\r\n if (i === 0) {\r\n return item.toLowerCase();\r\n }\r\n return item.charAt(0).toUpperCase() + item.slice(1).toLowerCase();\r\n })\r\n .join('')]: icon,\r\n };\r\n });\r\n return iconst;\r\n};\r\n","/**\r\n *\r\n * PublicAssetsLayout\r\n *\r\n */\r\n// import { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport * as React from 'react';\r\n\r\nexport interface PublicAssetsLayoutProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function PublicAssetsLayout(props: PublicAssetsLayoutProps) {\r\n const { children } = props;\r\n // const { checkIsMobile } = useIsMobile();\r\n // const isMobile = checkIsMobile();\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const PublicAssetsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.PublicAssetsPage,\r\n);\r\n","/*\r\n * Asynchronously loads the component for NotAllowedPage\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const NotAllowedPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.NotAllowed,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for PlayGroundPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const PlayGroundPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.PlayGroundPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for AssetsInventoryPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AssetsInventoryPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AssetsInventoryPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for AssetsInventoryLogPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const AssetsInventoryLogPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.AssetsInventoryLogPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for UserTrainingPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const ServiceRequestAuditTrailHistoryPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.ServiceRequestAuditTrailHistoryPage,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for Floors Page\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const Floors = lazyLoad(\r\n () => import('./index'),\r\n module => module.Floors,\r\n);\r\n","/**\r\n *\r\n * Asynchronously loads the component for SubscriptionTypesPage\r\n *\r\n */\r\n\r\nimport { lazyLoad } from 'utils/loadable';\r\n\r\nexport const SubscriptionTypesPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.SubscriptionTypesPage,\r\n);\r\n","import { lazyLoad } from 'utils/loadable';\r\n\r\nexport const BudgetExperimentsPage = lazyLoad(\r\n () => import('./index'),\r\n module => module.BudgetExperiments,\r\n);\r\n","/**\r\n *\r\n * App\r\n *\r\n * This component is the skeleton around the actual pages, and should only\r\n * contain code that should be seen on all pages. (e.g. navigation bar)\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { Switch, Route } from 'react-router-dom';\r\n\r\nimport { GlobalStyle } from 'styles/global-styles';\r\n\r\nimport { NotFoundPage } from './pages/NotFoundPage/Loadable';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { FrontendLayout } from 'app/Layout/FrontendLayout/Loadable';\r\n\r\nimport {\r\n ThemeProvider as MuiThemeProvider,\r\n StylesProvider,\r\n jssPreset,\r\n} from '@material-ui/core/styles';\r\nimport { create } from 'jss';\r\nimport rtl from 'jss-rtl';\r\n\r\nimport { CreateTheme } from 'styles/theme';\r\nimport { SnackbarProvider } from 'notistack';\r\n\r\nimport { MuiPickersUtilsProvider } from '@material-ui/pickers';\r\n\r\n// pick a date util library\r\nimport DateFnsUtils from '@date-io/date-fns';\r\nimport * as dateFnsLocales from 'date-fns/locale';\r\n\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectAppSettings,\r\n selectDateFnsLocale,\r\n selectIsAuthenticated,\r\n selectLoading,\r\n selectLoadingUser,\r\n} from 'app/slice/selectors';\r\nimport { useAppSettingsSlice } from './slice';\r\nimport { useEffect } from 'react';\r\n\r\n// import i18n (needs to be bundled ;))\r\nimport '../locales/i18n';\r\nimport { AnimalTypesPage } from './pages/AnimalTypesPage/Loadable';\r\n\r\nimport { DialogAlert } from './components/DialogAlert';\r\nimport { ErrorBoundary } from './components/ErrorBoundary';\r\nimport { SnackbarManager } from './Layout/FrontendLayout/components/Snackbar/Loadable';\r\nimport { InternalIdLoginPage } from './pages/Animals/InternalIdLoginPage/Loadable';\r\nimport { AnimalsListPage } from './pages/AnimalsListPage/Loadable';\r\nimport { PosLayout } from './Layout/PosLayout';\r\nimport { AnimalCaseConsumablesPage } from './pages/Animals/AnimalCaseConsumablesPage/Loadable';\r\nimport { LoginLayout } from './Layout/LoginLayout';\r\nimport { AnimalsHomePage } from './pages/Animals/AnimalsHomePage/Loadable';\r\nimport { ConnectedRouter } from 'connected-react-router';\r\n\r\nimport { PrivateAnimalRoute } from './pages/Animals/PrivateAnimalRoute';\r\nimport Grow from '@material-ui/core/Grow';\r\nimport { TransitionProps } from '@material-ui/core/transitions/transition';\r\nimport { Box, CssBaseline } from '@material-ui/core';\r\nimport { CreateNewCasePage } from './pages/Animals/CreateNewCasePage/Loadable';\r\nimport { SamplesListPage } from './pages/Samples/SamplesListPage/Loadable';\r\nimport { RunDetailsPage } from './pages/Samples/RunDetailsPage/Loadable';\r\nimport {\r\n RequestDetailsPage,\r\n RequestSamplesPage,\r\n} from './pages/Samples/RequestSamplesPage/Loadable';\r\nimport { TrainingSessionsPage } from './pages/TrainingSessionsPage/Loadable';\r\nimport { BuildingsPage } from './pages/Buildings/Loadable';\r\nimport { History } from './pages/ReservationHistoryPage/Loadable';\r\nimport { AddNewReportPage } from './pages/AddNewReportPage/Loadable';\r\nimport { Progress } from './components/LoadingIndicator';\r\nimport { TrainingWaitingListPage } from './pages/TrainingWaitingListPage/Loadable';\r\nimport { history } from 'store/history';\r\nimport { EmailNotificationsPage } from './pages/EmailNotificationsPage/Loadable';\r\nimport { ExperimentTemplatesPage } from './pages/ExperimentTemplates/Loadable';\r\nimport { UsersHistoryPage } from './pages/UsersHistoryPage/Loadable';\r\nimport { UserTrainingPage } from './pages/UserTrainingsPage/Loadable';\r\nimport { NotAvailable } from './pages/NotAvailablePage/Loadable';\r\nimport { RestrictedRoute } from './components/Routers/RestrictedRoute';\r\nimport { Users } from './pages/UsersPage/loadable';\r\nimport { AnimalExtendedBillingReportPage } from './pages/Animals/AnimalExtendedBillingReportPage/Loadable';\r\nimport { UserTrainingHistoryPage } from './pages/UserTrainingHistoryPage/Loadable';\r\nimport { OtherServicesPage } from './pages/OtherServicesPage/Loadable';\r\nimport { BudgetsPage } from './pages/BudgetsPage/Loadable';\r\nimport { ServiceRequestPage } from './pages/ServiceRequestListPage/Loadable';\r\nimport { WorkOrdersPage } from './pages/WorkOrdersPage/Loadable';\r\nimport { DocumentsPage } from './pages/Documents/Loadable';\r\nimport { QuizPage } from './pages/QuizPage/Loadable';\r\nimport { QuizDetailsPage } from './pages/QuizDetailsPage/Loadable';\r\nimport { UserTrainingDetailsPage } from './pages/UserTrainings/TrainingDetailsPage/Loadable';\r\nimport { SampleModificationsPage } from './pages/Samples/SampleModificationsPage/Loadable';\r\nimport { UsageHistory } from './pages/UsageHistoryPage/Loadable';\r\nimport { RunsListPage } from './pages/Samples/RunsListPage/Loadable';\r\nimport { AnimalCasesHistoryPage } from './pages/Animals/AnimalCaseEditPage/AnimalCasesHistory/Loadable';\r\nimport { SendEmailToUsersPage } from './pages/SendEmailToUsers/Loadable';\r\nimport { Charges } from './pages/ChargesPage/Loadable';\r\nimport { MyAssetsPage } from './pages/MyAssetsPage/Loadable';\r\nimport { Locations } from './pages/LocationsPage/loadable';\r\nimport { BuildingPage } from './pages/LocationsPage/BuildingPage/loadable';\r\nimport { CampusesPage } from './pages/LocationsPage/CampusesPage/loadable';\r\nimport { AreasPage } from './pages/LocationsPage/AreasPage/loadable';\r\nimport { LocationListPage } from './pages/LocationsPage/LocationListPage/loadable';\r\nimport { SubLocationListPage } from './pages/LocationsPage/SubLocationListPage/loadable';\r\nimport { InvoiceBatches } from './pages/InvoiceBatches/Loadable';\r\nimport { CategoriesPage } from './pages/CategoriesPage/Loadable';\r\nimport { CategoryGroupsPage } from './pages/CategoryGroupsPage/Loadable';\r\nimport { BillingPreviewPage } from './pages/BillingPreviewPage/Loadable';\r\nimport { OnlineBudgetsStatusPage } from './pages/OnlineBudgetsStatusPage';\r\nimport { InvoiceDetailsPage } from './pages/InvoiceDetails/Loadable';\r\nimport { WorkOrderDetailsPage } from './pages/WorkOrders/WorkOrderDetailsPage/Loadable';\r\nimport { Billing } from './pages/InvoiceBillingPage/Loadable';\r\nimport { BillingActions } from './pages/BillingActions/BillingActionsPage/Loadable';\r\nimport { BillingActionsDetailsPage } from './pages/BillingActions/BillingActionsDetailsPage/Loadable';\r\nimport { LocationTypesPage } from './pages/LocationsPage/LocationTypesPage/loadable';\r\nimport { SubLocationTypesPage } from './pages/LocationsPage/SubLocationTypesPage/loadable';\r\nimport { GetBrowserInfo } from 'utils/mobileDetect';\r\nimport { SavedViewDetailsPage } from './pages/SavedViewsPage/SavedViewPage/Loadable';\r\nimport { SavedViews } from './pages/SavedViewsPage/SavedViewsPage/Loadable';\r\nimport { LabelTypesPage } from './pages/LabelTypesPage/Loadable';\r\nimport { AssetDetailsPage } from './pages/AssetDetailsPage/Loadable';\r\nimport { LabelPrintDialog } from './components/LabelPrint/LabelPrintDialog/Loadable';\r\nimport { KioskProjectsPage } from './pages/KioskProjects/Loadable';\r\nimport { KioskProjectConsumablesPage } from './pages/KioskProjects/KioskProjectConsumablesPage/Loadable';\r\nimport { PrivateKioskProjectsRoute } from './pages/KioskProjects/PrivateKioskProjectsRoute/Loadable';\r\nimport { SessionTimeout } from './components/SessionTimeout';\r\nimport { SubmissionsPage } from './pages/QuizSubmissionsPage/Loadable';\r\nimport { QuizzesPage } from './pages/QuizzesPage/Loadable';\r\nimport { AdHocReportListPage } from './pages/AdHocReportListPage/Loadable';\r\nimport { Rooms } from './pages/RoomsPage/Loadable';\r\nimport { CalendarMessages } from './pages/CalendarMessages/CalendarMessagesPage/Loadable';\r\nimport { CoresDirectoryPage } from './pages/CoresDirectoryPage/Loadable';\r\nimport { SamplePlatesPage } from './pages/Samples/SamplePlatesPage/Loadable';\r\nimport { HeadTitle } from './Layout/FrontendLayout/components/HeadTitle';\r\nimport { InstrumentRestrictionsPage } from './pages/InstrumentRestrictionsPage/Loadable';\r\nimport { LabelTypeDetailsPage } from './pages/LabelTypeDetailsPage/Loadable';\r\nimport { ConfigurableColumnExportImportPage } from './pages/ConfigurableColumnExportImport/Loadable';\r\nimport { AppSettings } from 'types/AppSettings';\r\nimport { ServerBarcodeRoute } from './components/Routers/ServerBarcodesRoute';\r\nimport { useLayoutSlice } from './Layout/FrontendLayout/slice';\r\nimport { NewMessagePage } from './pages/NewMessagePage/Loadable';\r\nimport { OtherServiceDetailsPage } from './pages/OtherServiceDetails/OtherServiceDetailsPage/Loadable';\r\nimport { InvoiceTemplates } from './pages/InvoiceTemplates/InvoiceTemplatesPage/Loadable';\r\nimport { Expenses } from './pages/ExpensesPage/Loadable';\r\nimport { PricePeriodsPagePage } from './pages/PriceSheetPeriodsPage/Loadable';\r\nimport { PriceSheetPeriodDetailsPage } from './pages/PriceSheetPeriodDetails/PriceSheetPeriodDetailsPage/Loadable';\r\nimport { ArticlesPagePath, ArticlesPage } from './pages/ArticlesPage/Loadable';\r\nimport {\r\n ArticlesExternalSearchPagePath,\r\n ArticlesExternalSearchPage,\r\n} from './pages/ArticlesExternalSearchPage/Loadable';\r\nimport { AccountLayout } from './Layout/AccountLayout/Loadable';\r\nimport { RegisterPage } from './pages/Account/Register/Loadable';\r\nimport { anonimusUrls } from './slice/types';\r\nimport {\r\n CalendarPage,\r\n CalendarPageDefaultRedir,\r\n} from './pages/CalendarPage/Loadable';\r\nimport {\r\n calendarPageDefaultPath,\r\n calendarPageFullPath,\r\n CalendarPagePaths,\r\n} from './pages/CalendarPage';\r\nimport { ReservationDetailsPage } from './pages/ReservationDetails/ReservationDetailsPage/Loadable';\r\nimport { HomePage } from './pages/HomePage/Loadable';\r\nimport { SystemPage } from './pages/SystemPage/Loadable';\r\nimport { DashboardPage } from './pages/DashboardPage/Loadable';\r\nimport { CoreSelectionPage } from './pages/CoreSelectionPage/Loadable';\r\nimport { CoreHomePage } from './pages/CoreHomePage/Loadable';\r\nimport { CoreStatsPage } from './pages/CoreStatsPage/Loadable';\r\nimport { ReportingPage } from './pages/ReportingPage/Loadable';\r\nimport { BookitLabDashboadPage } from './pages/BookitLabDashboardPage/Loadable';\r\nimport { RedirectWithSearch } from './components/RedirectWithSearch';\r\nimport { AssetSelectionPage } from './pages/MyAssetsPage/AssetsSelection/Loadable';\r\nimport { TermsOfUseAgreementPage } from './pages/TermsOfUseAgreementPage/Loadable';\r\nimport { SnackWrapper } from './Layout/FrontendLayout/components/Snackbar/SnackWrapper';\r\nimport { ActiveUserGroupPage } from './pages/ActiveUserGroupPage/Loadable';\r\nimport { CannedReportsPage } from './pages/CannedReports/Loadable';\r\nimport { ServiceRequestDetailsPath } from './pages/Samples/RequestSamplesPage/slice/path';\r\nimport { UserAttributes } from './pages/UserAttributes/UserAttributesPage/Loadable';\r\nimport { ReportConsumablesPage } from './pages/OtherServiceDetails/ReportConsumables/ReportConsumablesPage/Loadable';\r\nimport { LoginPage } from './pages/LoginPage/Loadable';\r\nimport { CalendarMessagesDetailsPage } from './pages/CalendarMessages/CalendarMessagesDetails/Loadable';\r\nimport { ServiceRequestsKanbanPage } from './pages/ServiceRequestsKanbanPage/Loadable';\r\nimport { OfflineServiceTypesPage } from './pages/OfflineServiceTypesPage/Loadable';\r\nimport { RUN_DETAILS_PAGE_PATH } from './pages/Samples/RunDetailsPage';\r\nimport { NOTIFICATIONS_LOG_PAGE_PATH } from './pages/EmailNotificationsPage';\r\nimport { AnimalCaseEditPage } from './pages/Animals/AnimalCaseEditPage/Loadable';\r\nimport { ServiceRequestsKanbanPagePath } from './pages/ServiceRequestsKanbanPage';\r\nimport './AllIcons';\r\nimport { PublicAssetsLayout } from './Layout/PublicAssetsLayout';\r\nimport { PublicAssetsPage } from './pages/PublicAssets/Loadable';\r\nimport { NotAllowedPage } from './pages/NotAllowedPage/Loadable';\r\nimport { PlayGroundPage } from './pages/PlayGround/Loadable';\r\nimport { AssetsInventoryPage } from './pages/AssetsInventory/Loadable';\r\nimport { AssetsInventoryLogPage } from './pages/AssetsInventoryLog/Loadable';\r\nimport { ServiceRequestAuditTrailHistoryPage } from './pages/ServiceRequestAuditTrailHistoryPage/Loadable';\r\nimport { Floors } from './pages/FloorsPage/Loadable';\r\nimport { SubscriptionTypesPage } from './pages/SubscriptionTypesPage/Loadable';\r\nimport { BudgetExperimentsPage } from './pages/BudgetExperimentsPage/Loadable';\r\nimport { toRootedURL } from 'utils/url-utils';\r\n\r\nconst jss = create({ plugins: [...jssPreset().plugins, rtl()] });\r\n\r\nexport function App() {\r\n const { i18n } = useTranslation();\r\n const dispatch = useDispatch();\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n const userLoading = useSelector(selectLoadingUser);\r\n const isLoading = useSelector(selectLoading);\r\n const isLoginPage = React.useMemo(() => {\r\n return window.location.pathname.toLowerCase().indexOf('login') > -1;\r\n }, []);\r\n const isPublicPage = React.useMemo(() => {\r\n return anonimusUrls.some(\r\n f => window.location.pathname.toLowerCase().indexOf(f) > -1,\r\n );\r\n }, []);\r\n //const [noValidLocation, setNoValidLocation] = React.useState(false);\r\n const useEffectOnMount = (effect: React.EffectCallback) => {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n useEffect(effect, []);\r\n };\r\n const { actions } = useAppSettingsSlice();\r\n // run the layout slice ahead of time so that it will process global actions like openSidePanel, etc.\r\n useLayoutSlice();\r\n useEffectOnMount(() => {\r\n if (!isLoginPage) {\r\n dispatch(actions.getAuthenticatedUser(isPublicPage));\r\n } else {\r\n dispatch(actions.loadLoginSystemSettings());\r\n }\r\n });\r\n React.useEffect(() => {\r\n if (!isLoginPage) {\r\n if (!userLoading && isAuthenticated !== undefined) {\r\n if (isAuthenticated) {\r\n // if (noValidLocation) {\r\n // window.location.href = toRootedURL('/Divisions.aspx');\r\n // }\r\n dispatch(actions.loadAppSettings(true));\r\n dispatch(actions.loadSiteMapSettings());\r\n dispatch(actions.loadUserProfileSettings());\r\n dispatch(actions.loadGlobalServiceGroupFilter());\r\n dispatch(actions.loadSystemSettings());\r\n setTimeout(() => dispatch(actions.loadEventsCount()), 0);\r\n\r\n GetBrowserInfo();\r\n } else {\r\n if (isPublicPage) {\r\n dispatch(actions.loadAppSettings(false));\r\n } else {\r\n window.location.replace(toRootedURL('/login'));\r\n //dispatch(actions.navigate('/login'));\r\n }\r\n }\r\n }\r\n }\r\n }, [\r\n actions,\r\n dispatch,\r\n isAuthenticated,\r\n isLoginPage,\r\n isPublicPage,\r\n userLoading,\r\n ]);\r\n // React.useEffect(() => {\r\n // setNoValidLocation(window.location.pathname.endsWith('index.html'));\r\n // }, []);\r\n\r\n const dir = i18n.dir();\r\n const bookitTheme = CreateTheme('ltr', 'bookit');\r\n const defaultTheme = CreateTheme(dir, 'default');\r\n const animalTheme = CreateTheme(dir, 'animals');\r\n const kioskTheme = CreateTheme('ltr', 'bookit');\r\n\r\n document.body.dir = dir;\r\n const dateFnsLocale = useSelector(selectDateFnsLocale);\r\n const locale = React.useMemo(\r\n () =>\r\n dateFnsLocale === undefined ? undefined : dateFnsLocales[dateFnsLocale],\r\n [dateFnsLocale],\r\n );\r\n const appSettings: AppSettings | null = useSelector(selectAppSettings);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {/* basename is required to properly route addresses when app is served from a non-root location like https://host/application/ */}\r\n \r\n {isLoading === false &&\r\n //!noValidLocation &&\r\n isAuthenticated === true && (\r\n \r\n )}\r\n {isLoading === false && }\r\n {isLoading === false &&\r\n //!noValidLocation &&\r\n (isAuthenticated !== undefined || isLoginPage) ? (\r\n \r\n {isAuthenticated === true ? (\r\n \r\n \r\n \r\n {/* todo: fix the LatoStyle - after initial load, first dialog open results in a glitch: text elements are switched from lato to default and immediately back. this results in elements on the page jumping back and forth */}\r\n {/* */}\r\n \r\n {/* todo : prepend public url like so to support virtual applications hosted at {process.env.PUBLIC_URL + '/Calendar'} */}\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\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 \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 \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 \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 direct navigation/aspx links are redirected on the server side,\r\n so reservation details should get the /reservation/details here\r\n reservation.aspx link might be added by mistake somewhere in react, so these cases are handled here\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 \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 \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 \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 \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 \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 {isLoading === false &&\r\n //!noValidLocation &&\r\n isAuthenticated === true && }\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 {isLoading === false &&\r\n //!noValidLocation &&\r\n isAuthenticated === true && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { BARCODE_SCANNED, BARCODE_SCANNING } from 'react-usb-barcode-scanner';\r\n\r\nexport const barcodeScannerMiddleware = store => next => action => {\r\n // processing barcode need to be here\r\n if (action.type === BARCODE_SCANNED) {\r\n console.debug(action);\r\n }\r\n if (action.type === BARCODE_SCANNING) {\r\n }\r\n return next(action);\r\n};\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","/**\r\n *\r\n * MobileBarcodeScanner\r\n *\r\n */\r\nimport { useEffectOnMount } from 'app/hooks/useEffectOnMount';\r\nimport React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport { BARCODE_SCANNED } from 'react-usb-barcode-scanner';\r\nexport interface MobileBarcodeScannerProps {}\r\n\r\nexport const MobileBarcodeScanner = React.memo(function MobileBarcodeScanner(\r\n props: MobileBarcodeScannerProps,\r\n) {\r\n const dispatch = useDispatch();\r\n const handleBarcodeScanned = (barcode: string) => {\r\n dispatch({\r\n type: BARCODE_SCANNED,\r\n payload: {\r\n data: barcode,\r\n },\r\n });\r\n };\r\n // sets the mobile barcode callback that will be called directly from the mobile app\r\n useEffectOnMount(() => {\r\n (window as any).mobileBarcodeScanCallback = handleBarcodeScanned;\r\n return () => ((window as any).mobileBarcodeScanCallback = undefined);\r\n });\r\n return
    ;\r\n});\r\n","/**\r\n * index.tsx\r\n *\r\n * This is the entry file for the application, only setup and boilerplate\r\n * code.\r\n */\r\n\r\nimport 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\n\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\n\r\n// Use consistent styling\r\nimport 'sanitize.css/sanitize.css';\r\n\r\n// Import root app\r\nimport { App } from 'app';\r\n\r\nimport { HelmetProvider } from 'react-helmet-async';\r\n\r\nimport { configureAppStore } from 'store/configureStore';\r\nimport { BarcodeScanner } from 'react-usb-barcode-scanner';\r\n\r\nimport reportWebVitals from 'reportWebVitals';\r\n\r\nimport WebfontLoader from '@dr-kobros/react-webfont-loader';\r\n// Initialize languages\r\nimport './locales/i18n';\r\nimport { MobileBarcodeScanner } from 'app/components/MobileBarcodeScanner';\r\n\r\nconst fontsConfig = {\r\n // custom: {\r\n // families: ['Lato:wght@300;400;700;900&display=swap'],\r\n // urls: [`${process.env.PUBLIC_URL}/fonts/Lato/lato.css`],\r\n // },\r\n google: {\r\n families: ['Lato:wght@300;400;700;900&display=swap'],\r\n },\r\n};\r\nconst store = configureAppStore();\r\nconst MOUNT_NODE = document.getElementById('root') as HTMLElement;\r\n\r\nReactDOM.render(\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 MOUNT_NODE,\r\n);\r\n\r\n// Hot reloadable translation json files\r\nif (module.hot) {\r\n module.hot.accept(['./locales/i18n'], () => {\r\n // No need to render the App again because i18next works with the hooks\r\n });\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\nreportWebVitals();\r\n","/**\r\n * Create the store with dynamic reducers\r\n */\r\n\r\nimport { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit';\r\nimport { createInjectorsEnhancer } from 'redux-injectors';\r\nimport createSagaMiddleware from 'redux-saga';\r\nimport { routerMiddleware as createRouterMiddleware } from 'connected-react-router';\r\n\r\nimport { createReducer as createReducerWithRouter } from './reducers';\r\nimport { history } from './history';\r\nimport { barcodeScannerMiddleware } from './BarcodeScanner';\r\n\r\nexport function configureAppStore() {\r\n const reduxSagaMonitorOptions = {};\r\n const sagaMiddleware = createSagaMiddleware(reduxSagaMonitorOptions);\r\n\r\n const { run: runSaga } = sagaMiddleware;\r\n\r\n // List middlewares here\r\n const middlewares = [\r\n // Create the store with saga middleware\r\n sagaMiddleware,\r\n // routerMiddleware is needed to to dispatch history actions (e.g. to change URL with push('/path/to/somewhere')).\r\n createRouterMiddleware(history),\r\n barcodeScannerMiddleware,\r\n ];\r\n\r\n // dev logging\r\n // Log only in development\r\n if (process.env.NODE_ENV === `development`) {\r\n const { createLogger } = require(`redux-logger`);\r\n middlewares.push(\r\n createLogger({\r\n collapsed: true,\r\n }),\r\n );\r\n }\r\n\r\n // Provide the created history to the root reducer creator.\r\n const createReducer = createReducerWithRouter(history);\r\n\r\n const enhancers = [\r\n createInjectorsEnhancer({\r\n createReducer,\r\n runSaga,\r\n }),\r\n ];\r\n\r\n const store = configureStore({\r\n reducer: createReducer(),\r\n middleware: [\r\n ...middlewares,\r\n ...getDefaultMiddleware({\r\n serializableCheck: {\r\n ignoredPaths: [\r\n 'workOrder.createState.data.StaffFormFiles',\r\n 'workOrder.createState.data.SubmissionFormFiles',\r\n ],\r\n ignoredActionPaths: [\r\n 'payload.workOrderDetails.SubmissionFormFiles',\r\n 'payload.workOrderDetails.StaffFormFiles',\r\n 'payload.current.SubmissionFormFiles',\r\n 'payload.current.StaffFormFiles',\r\n 'payload.customFormFiles',\r\n 'payload.currentCustomFormFiles',\r\n 'payload.originalCustomFormFiles',\r\n 'payload.state.customFormFiles',\r\n ],\r\n },\r\n }),\r\n ],\r\n devTools: process.env.NODE_ENV !== 'production',\r\n enhancers,\r\n });\r\n\r\n return store;\r\n}\r\n","/**\r\n * Combine all reducers in this file and export the combined reducers.\r\n */\r\n\r\nimport { combineReducers } from '@reduxjs/toolkit';\r\nimport { connectRouter } from 'connected-react-router';\r\nimport { barcodeScannerReducer } from 'react-usb-barcode-scanner';\r\nimport { InjectedReducersType } from 'utils/types/injector-typings';\r\n\r\n/**\r\n * Merges the main reducer with the router state and dynamically injected reducers\r\n */\r\nexport const createReducer = history => (\r\n injectedReducers: InjectedReducersType = {},\r\n) => {\r\n // Create a function that takes history as an argument and returns the root reducer.\r\n // Add router reducer into root reducer by passing history to connectRouter.\r\n // Note: The key MUST be router.\r\n\r\n return combineReducers({\r\n router: connectRouter(history),\r\n barcodeScanner: barcodeScannerReducer,\r\n ...injectedReducers,\r\n });\r\n};\r\n"],"sourceRoot":""}