{"version":3,"sources":["locales/translations.ts","utils/LocaleHE.js","utils/date-utils.ts","api/odata/ODataFilter.ts","styles/colors/bookitColors.ts","app/components/BasicIcons/FontAwesome/index.tsx","api/HttpClient.ts","app/components/BasicTable/types/FilterParam.ts","utils/userProfileSettings.ts","app/slice/selectors.ts","app/components/Forms/FormsLayout/FormFieldsSection/index.tsx","app/components/Forms/FormsLayout/FormLeftSection/index.tsx","app/components/Forms/FormsLayout/FormRightSection/index.tsx","app/components/Forms/FormsLayout/StyledFormFieldsContainer/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","utils/loadable.tsx","app/slice/types.ts","app/Layout/FrontendLayout/slice/saga.ts","app/Layout/FrontendLayout/slice/index.ts","app/Layout/FrontendLayout/slice/selectors.ts","app/Layout/FrontendLayout/slice/type.ts","app/components/BasicButtons/IconButton/index.tsx","types/AppSettings.ts","utils/typeUtils.ts","enums/asset.ts","utils/globalSettings/GlobalSettings.ts","types/KnownModules.ts","app/components/BasicTooltips/Tooltip/index.tsx","app/components/basic/Wrappers/Box/index.tsx","app/components/BasicPickers/AutocompletePicker/index.tsx","app/components/BasicPickers/BaseOptionsPicker/highlightSearchTerm.tsx","utils/mobileDetect.ts","enums/AssetAttributes.ts","enums/ServiceTypes.ts","utils/redux-injectors.ts","utils/enumKeys.ts","styles/typography/bookitTypography.ts","app/hooks/useEffectOnMount.ts","app/pages/ReservationDetails/Details/slice/types.ts","app/components/BasicPickers/Utils/autoCompletePickerUtils.ts","app/Layout/FrontendLayout/components/CoverWrapper/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","app/pages/OtherServiceDetails/Details/slice/selectors.ts","app/hooks/useAsyncAwaitedState.ts","utils/assertExhaustive.tsx","app/components/Typography/BasicTypography.tsx","app/pages/ReservationDetails/Details/slice/selectors.ts","app/hooks/useSystemDate.ts","app/components/Forms/Schemas/index.ts","utils/@reduxjs/toolkit.tsx","app/pages/Samples/RequestSamplesPage/slice/types.ts","app/pages/Samples/RequestSamplesPage/slice/utils/ServiceRequestTableColumn.ts","app/pages/Samples/RequestSamplesPage/slice/selectors.ts","app/components/DialogConfirm/index.tsx","utils/string-utils.ts","app/components/ExternalLink/index.tsx","app/components/Forms/FormTextField.tsx","enums/RepetitiveOptions.ts","app/components/Forms/FormRender/FormRenderer.tsx","utils/globalSettings/AllowedSettings.ts","app/components/BasicPickers/BaseOptionsPicker/index.tsx","enums/ConfigurableTypes.ts","app/components/BasicIcons/InfoIcon/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","app/components/DatePeriods/index.tsx","api/odata/generated/enums/RequiredTypes.ts","api/odata/generated/enums/DisplayTypes.ts","app/components/CustomForm/CustomFormUtils.ts","app/components/BasicButtons/TopActionButton/index.tsx","app/components/pickers/AutocompletePickers/UserPicker/index.tsx","app/hooks/usePromise.ts","app/pages/Samples/RequestSamplesPage/slice/saga.ts","app/pages/Samples/RequestSamplesPage/slice/index.ts","app/pages/Samples/SamplePlatesPage/slice/index.ts","types/PresetDatesRange.ts","utils/entity-utils.ts","app/components/pickers/MultiSelectPickers/AssetsPicker/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","app/pages/Samples/SamplesListPage/slice/index.ts","app/components/Forms/FormConnectedFilters/slice/selectors.ts","app/hooks/useIsMobile.ts","app/components/Forms/FormNumberField.tsx","app/components/Forms/FormLabelText.tsx","api/OtherServicesApi.ts","app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/selectors.ts","app/pages/AssetPopUp/AttributeRenderers/index.tsx","enums/RestrictedReservationsOptions.ts","app/components/BasicTable/components/DoubleRenderer/index.tsx","app/pages/AssetPopUp/components/TopAssetActionsDropDown.tsx","app/pages/AssetPopUp/index.tsx","app/pages/AssetPopUp/Rows.tsx","app/components/BasicTable/CellRenderers/DateRenderer/index.tsx","enums/Article.ts","app/components/BasicTable/Filters/AssetRangeFilter/index.tsx","utils/DateFormattingUtils/longFormatters.ts","utils/DateFormattingUtils/getFormatTokens.ts","app/components/BookitDatePicker/utils/types.ts","app/components/pickers/MultiSelectPickers/OnlineServicesPicker/index.tsx","app/components/DropDown/index.tsx","app/components/BasicInputs/TextControlField/index.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","utils/messages.ts","api/ReservationsApi.ts","app/pages/Samples/EditableTable/EditableCell/index.tsx","app/components/BasicInputs/BaseTextField/index.tsx","app/components/Forms/FormBookitDatePicker/index.tsx","app/components/BasicTable/withSavedHistory.tsx","app/components/BasicTable/BasicFilter/AppliedFilterComponent.tsx","app/components/BasicButtons/ActionButton/index.tsx","app/components/pickers/AutocompletePickers/OfflineServiceTypePicker/index.tsx","app/components/DatePicker/utils/pickerDateValidate.tsx","app/components/pickers/AutocompletePickers/BudgetPicker/index.tsx","app/components/BasicTable/components/BooleanRender/index.tsx","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/BasicTable/SelectedRowsActionButton/SelectedRowsActionIconButton/index.tsx","enums/commentReferenceTypes.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/pages/Actions/GlobalSelectedActions/ValidToRender/renderTypes.ts","app/components/pickers/AutocompletePickers/ExtraddlPicker/index.tsx","app/components/ValueLabel/index.tsx","app/pages/ArticlesPage/slice/selectors.ts","enums/EmptySlotAdminClick.ts","api/WorkOrderApi.ts","app/components/BasicTable/Filters/BooleanPickerFilter/index.tsx","app/components/BasicTable/Filters/DatesRangeFilter/index.tsx","app/components/BasicInputs/Check/styles.ts","app/components/BasicInputs/Check/index.tsx","app/components/pickers/StaticOptionsPickers/FundingTypeIdPicker/index.tsx","app/components/BasicChip/index.tsx","app/components/BasicTable/useProfileSetting/index.ts","app/components/Forms/Switch.tsx","app/components/Forms/FormBookitDateTimePicker/index.tsx","app/components/BasicTable/Filters/ExtraDDLFilter/index.tsx","app/components/BasicPickers/AutocompleteMultiPickerEx/index.tsx","app/components/BasicPickers/BaseURLPicker/index.tsx","enums/enums.ts","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/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/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/BasicTable/RowActions.tsx","app/hooks/useAsyncGetOnMount.ts","enums/TrainingState.ts","app/pages/Samples/SamplesListPage/slice/selectors.ts","app/components/BasicPickers/AutocompleteMultiPicker/index.tsx","app/components/TextField/index.tsx","app/components/Forms/FormCheckbox.tsx","app/components/AssetThumbImage/getAssetImageSrc.tsx","app/components/BookitDatePicker/DateInput.tsx","app/components/BookitDatePicker/StyledPicker.tsx","app/hooks/useEventListener.ts","app/components/BookitDatePicker/TimeOptionPicker/index.tsx","app/components/BookitDatePicker/index.tsx","app/hooks/useKeyUpOutside.ts","app/components/Forms/FormControls/FormControlLabel/index.tsx","utils/logLevel.ts","app/components/BasicTable/useProfileSetting/parseProfileUrl.ts","app/components/BasicTable/UnconfigurableTable/FilterHandler.tsx","api/CommentsApi.ts","types/DatesRange.ts","app/components/BasicAlert/index.tsx","app/components/pickers/AutocompletePickers/InventoryBatchesPicker/index.tsx","types/IRepetitiveDto.ts","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/pickers/AutocompletePickers/UserGroupPicker/index.tsx","enums/BudgetFields.ts","app/pages/Samples/RequestSamplesPage/slice/path.ts","styles/shadows/bookitShadow.ts","api/savedViewsApi.ts","app/pages/Samples/EditableTable/Fields/NumberField/index.tsx","app/pages/ServiceRequestsKanbanPage/slice/selectors.ts","app/components/pickers/StaticOptionsPickers/HoursPicker/index.tsx","app/components/Messages/slice/type.ts","app/components/pickers/ServiceGroupPicker/index.tsx","app/components/Forms/FormServiceGroupPicker.tsx","app/components/Forms/FormControls/FormControl/index.tsx","app/components/Forms/FormControls/FormHelperText/index.tsx","app/hooks/useExpandedSideBarState.ts","app/pages/ServiceRequestsKanbanPage/slice/saga.ts","app/pages/ServiceRequestsKanbanPage/slice/index.ts","app/pages/OtherServiceDetails/InventoryBatch/InventoryBatchForm.tsx","app/pages/OtherServiceDetails/InventoryBatch/index.tsx","app/components/BasicTable/Filters/UserFilter/index.tsx","app/components/DateTimeLabel/index.tsx","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/BasicFilter/AddFilterButton.tsx","app/components/BasicTable/BasicFilter/AppliedFiltersContainer/index.tsx","app/components/BasicTable/BasicFilter/index.tsx","app/permissions/WorkOrders/allowedroles.tsx","app/permissions/WorkOrders/workOrdersPermissionUtils.ts","app/components/BasicTable/components/TableSkeleton/index.tsx","app/components/pickers/AutocompletePickers/WorkOrderTypePicker/index.tsx","app/pages/CalendarPage/GetCalendarPagePath.tsx","app/components/CalendarButton/index.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/pickers/StaticOptionsPickers/MinutesPicker/index.tsx","app/components/BasicTable/types/ColumnWithDeps.ts","app/components/BasicTable/Comparers/index.ts","app/components/BasicTable/index.tsx","app/components/BasicTable/Filters/index.tsx","app/components/BasicTable/components/DescriptionCell/index.tsx","app/components/BasicTable/Filters/NumberFieldFilter/index.tsx","app/pages/ArticlesPage/slice/saga.ts","app/pages/ArticlesPage/slice/index.ts","app/components/PopupImportExport/Actions/Types.ts","app/components/BasicTable/BasicFilter/TableToolbar/TableToolbarHeader.tsx","app/components/BasicTable/BasicFilter/TableToolbar/index.tsx","app/components/basic/Wrappers/FlexWrappers/flexRow.tsx","app/components/BasicTable/UnconfigurableTable/UnconfigurableTable.tsx","app/components/pickers/AutocompletePickers/AssetPicker/index.tsx","app/components/PrintToPDF/slice/saga.ts","app/components/PrintToPDF/slice/index.ts","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/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/RemindBefore.ts","app/components/pickers/AutocompletePickers/UserMultiPicker/index.tsx","app/components/BasicTable/BasicFilter/utils.ts","app/components/Forms/FormBudgetPicker.tsx","app/components/Forms/FormEquipmentsPicker.tsx","app/components/Forms/FormFundingTypePicker.tsx","api/odata/generated/enums/ServiceRequestMilestoneStatuses.ts","api/odata/generated/entities/IAssetDto.ts","app/components/BasicTable/ConfigurableColumns.ts","app/components/BasicList/StyledList/index.tsx","app/pages/WorkOrders/WorkOrderDetailsPage/Details/slice/types.ts","styles/colors/info.ts","styles/MUIExtend/themeOverrides.ts","styles/theme.tsx","app/components/pickers/StaticOptionsPickers/AmPmPicker/index.tsx","app/components/BasicTable/components/UserProfileLink/index.tsx","app/components/pickers/AutocompletePickers/CampusPicker/index.tsx","app/components/pickers/AutocompletePickers/RoomPicker/index.tsx","app/components/pickers/MultiSelectPickers/ServiceGroupsPicker/index.tsx","app/components/ButtonConfirm/index.tsx","app/pages/Samples/components/RunTypePicker/index.tsx","app/components/Forms/ValidationSchemaProvider.tsx","app/pages/InvoiceDetails/InvoiceDetailsSidePanel/index.tsx","app/components/BasicInputs/Toggle/index.tsx","app/components/BasicToggle/index.tsx","app/hooks/useResponseModel.ts","types/SiteMapSettings.ts","app/Layout/FrontendLayout/components/TopBar/styled/index.tsx","app/components/BasicButtons/ActionIconButton/index.tsx","app/Layout/FrontendLayout/components/PageWrapper/PageActions/SwitchActions.tsx","app/components/Comments/index.tsx","app/components/Forms/FormOfflineServiceTypePicker.tsx","enums/ReferenceType.ts","app/pages/OtherServiceDetails/Details/OfflineForm/index.tsx","app/pages/OtherServiceDetails/Details/index.tsx","types/AuthenticatedUser.ts","app/components/BookitDatePicker/BookitDateTimePicker.tsx","enums/ReservationOrDowntimeEnum.ts","enums/CatRateTypes.ts","enums/MultipleInstrumentReservations.ts","app/pages/CalendarPage/Scheduler/slice/types.ts","app/components/BasicTable/Filters/ServiceMultiFilter/index.tsx","styles/MUIExtend/autocompleteStyles.ts","enums/InvoiceStatuses.ts","app/components/PrintToPDF/slice/selectors.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","api/odata/generated/enums/PurchaseOrderOptions.ts","api/odata/ODataParamsBuilder.ts","app/pages/CalendarPage/Scheduler/utils/formatSchedulerDateOrUndefined.tsx","api/odata/generated/enums/FileTypes.ts","utils/fileStoreHelper.ts","app/pages/Samples/RequestSamplesPage/slice/prepareServiceRequestRowModel.ts","app/components/pickers/AutocompletePickers/BuildingPicker/index.tsx","app/components/pickers/AutocompletePickers/AssetCatGroupPicker/index.tsx","api/utils.ts","app/components/pickers/AutocompletePickers/InstitutePicker/index.tsx","app/components/pickers/AutocompletePickers/DepartmentPicker/index.tsx","app/components/pickers/AutocompletePickers/AssetCatPicker/index.tsx","app/components/pickers/AutocompletePickers/LocationPicker/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/pages/Animals/InternalIdLoginPage/slice/saga.ts","app/pages/Animals/InternalIdLoginPage/slice/index.ts","app/hooks/useGlobalServiceGroupsFilter.ts","app/components/BasicTable/TableFilterBuilder/index.ts","app/components/BasicPickers/BaseOptionsMultiPicker/index.tsx","app/components/Forms/FormUsersPicker.tsx","enums/OnlineServiceTypeEnum.ts","app/components/pickers/StaticOptionsPickers/OnlineServiceTypePicker/index.tsx","app/pages/Actions/GlobalSelectedActions/AddWorkOrder.tsx","app/components/pickers/AutocompletePickers/MyAssetAvailabilityTypeMultiPicker/index.tsx","app/components/BasicButtons/FilterIconButton/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/pages/CalendarPage/SchedulerWithFiltersProps.tsx","app/pages/CalendarPage/getDefaultFilter.tsx","app/pages/CalendarPage/getRequiredFilter.tsx","app/pages/CalendarPage/CalendarPageDefaultRedir.tsx","app/pages/CalendarPage/index.tsx","enums/TrainingStatus.ts","api/RestrictionsApi.ts","app/pages/InstrumentRestrictionsPage/Details/components/UserOwnPermissions.tsx","api/UserPermissionsApi.ts","app/pages/InstrumentRestrictionsPage/Details/InstrumentRestrictions.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/pickers/AutocompletePickers/SampleTypePicker.index.tsx","app/components/CommentsContainer/commentParser.tsx","app/pages/ReservationDetails/Details/slice/getBudgetVisible.ts","app/components/BasicTable/styles.ts","app/components/BasicTable/useMemoFilters.ts","app/pages/ReservationDetails/Details/slice/combineOfflineServiceTypes.ts","app/components/pickers/AutocompletePickers/TrainingSessionPicker/index.tsx","app/components/pickers/StaticOptionsPickers/RemindBeforePicker/index.tsx","app/components/pickers/AutocompletePickers/WorkflowBookingPicker/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/Forms/FormRepetitive/slice/types.ts","enums/ServiceGroupRegistrationStatus.ts","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/components/ScannerView/index.tsx","app/pages/OtherServiceDetails/Details/components/BookQuickServices.tsx","app/components/CommentsContainer/styles.ts","app/components/CommentsContainer/FileButton.tsx","app/components/CommentsContainer/index.tsx","app/pages/OtherServiceDetails/RenewStock/RenewStockForm.tsx","app/pages/OtherServiceDetails/RenewStock/index.tsx","app/components/Forms/Schemas/InvoiceChildRowBaseSchema/index.ts","enums/BudgetExperimentStatuses.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","app/permissions/Asset/assetPermissions.ts","app/components/PopupImportExport/Actions/index.ts","app/components/PopupImportExport/Actions/Api.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","app/components/BasicTable/initFilterData.ts","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/BookitlabLogo/messages.ts","app/components/BasicTable/BasicFilter/FilterBox/index.tsx","app/components/Forms/Schemas/SchemaMethods.ts","app/components/Forms/FormRestrictedUserGroupPicker.tsx","app/pages/ServiceRequestsKanbanPage/Filter.ts","app/pages/UserTrainings/TrainingDetailsPage/Details/Actions/TrainingActions.tsx","app/components/pickers/AutocompletePickers/WorkOrdersPicker/index.tsx","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/BasicTable/Filters/UserGroupFIlter/index.tsx","app/components/BasicTable/Filters/BuildingPickerFilter/index.tsx","app/components/BasicLinks/ButtonLink/index.tsx","app/components/BasicTable/Filters/InstituteFilter/index.tsx","app/components/BasicTable/Filters/AssetCatGroupFilter/index.tsx","types/ResponseType.ts","app/components/BasicTable/Filters/ServiceGroupFilter/index.tsx","app/components/BasicTable/Filters/DepartmentFilter/index.tsx","app/components/BasicTable/Filters/AssetCatFilter/index.tsx","app/components/pickers/AutocompletePickers/ProjectPicker/index.tsx","app/components/BasicTable/Filters/ProjectFilter/index.tsx","app/components/BasicTable/Filters/RoomPickerFilter/index.tsx","app/components/pickers/AutocompletePickers/UserDisciplinePicker/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/InvoiceIdMultiPicker/index.tsx","app/components/BasicTable/Filters/InstituteTypeFilter/index.tsx","app/components/pickers/AutocompletePickers/ServiceTypePicker/index.tsx","app/components/pickers/AutocompletePickers/TrainingLevelPicker/index.tsx","app/components/BookitlabLogo/index.tsx","app/components/BasicTable/Filters/CampusPickerFilter/index.tsx","app/components/pickers/AutocompletePickers/AreassPicker/index.tsx","app/components/BasicTable/FilterContainer/index.tsx","app/components/BasicTable/Filters/ServiceGroupsFilter/index.tsx","api/odata/generated/enums/EmailType.ts","app/components/BasicTable/CellRenderers/ImageRenderer/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/pickers/AutocompletePickers/SubLocationListPicker/index.tsx","app/Layout/FrontendLayout/components/CustomerLogo/index.tsx","app/components/BasicButtons/BaseToggleButton/index.tsx","app/components/BasicButtons/BaseToggleButtonGroup/index.tsx","enums/InstrumentListAssemblyTypes.ts","app/components/pickers/StaticOptionsPickers/AssemblyTypePicker/index.tsx","app/components/BasicTable/GlobalFilter.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/useConfigurableColumnsAdvanced.ts","app/pages/Actions/GlobalSelectedActions/DownWorkOrder.tsx","app/pages/Actions/GlobalSelectedActions/OpenCalendar.tsx","app/pages/Actions/GlobalSelectedActions/OpenWrokOrders.tsx","app/pages/Actions/GlobalSelectedActions/ValidToRender/useAssetsPermissionsUtils.ts","app/components/Popover/index.tsx","app/pages/Actions/GlobalSelectedActions/OpenWorkOrder.tsx","app/pages/Actions/GlobalSelectedActions/BringBackUp.tsx","app/Layout/FrontendLayout/components/PageWrapper/components/SkeletonIfLoading.tsx","app/components/BasicLinks/RouterLink/index.tsx","api/odata/getPredicates.ts","app/components/BasicTable/BasicFilter/TableToolbar/styled/index.tsx","app/components/BasicTable/components/TableCardGrid/index.tsx","app/pages/AddChargePage/AddChargeButton.tsx","app/components/BasicTable/withoutGlobalServiceGroupFilter.tsx","app/components/ReservationCreateButton/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/PaymentMethodEnumPicker/index.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/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/components/CommentsContainer/IComment.ts","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","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/components/Copyright/messages.ts","app/components/Copyright/styled/index.tsx","app/components/Copyright/index.tsx","app/components/BasicDialog/BasicDialogActions.tsx","app/components/BasicDialog/BasicDialogContentWithTitle.tsx","app/components/BasicDialog/index.tsx","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/hooks/useIsomorphicLayoutEffect.ts","app/components/Forms/FormInventoryBatchPicker.tsx","app/components/BasicTable/useConfigurableColumns.ts","app/components/BasicTable/TablePaginationActions.tsx","app/components/Forms/FormsLayout/FormSectionTitle.tsx","app/components/BasicTable/ExportButton/index.tsx","app/hooks/useGlobalDomEvents.ts","app/components/BasicTable/SelectedActions/index.tsx","app/components/BasicTable/BasicFilter/FiltersGroupDisplay/index.tsx","app/components/BasicTable/BasicFilter/FilterDisplay/index.tsx","app/components/BasicTable/components/ConfigureColumnsButton.tsx","app/pages/ArticlesExternalSearchPage/Loadable.ts","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","enums/MinTimeAheadPeriodTypes.ts","api/SamplesApi.ts","app/components/Forms/FormControls/FormGroup/index.tsx","app/pages/Samples/RunDetailsPage/ImportComponents/ImportComponent.tsx","utils/redux-saga/index.ts","app/pages/ServiceRequestsKanbanPage/components/getServiceRequestTicketTitle.tsx","app/pages/ServiceRequestsKanbanPage/components/ParentTicketDetailsButton/index.tsx","app/components/Forms/FormAdminUserPicker.tsx","app/components/CustomForm/CustomFormFields/CustomFormFileUpload.tsx","api/InvoiceTemplatesApi.ts","app/components/Forms/FormsLayout/FormErrorSummury/index.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","app/components/Forms/FormRepetitive/RepetitiveControl.tsx","enums/allowCreateInvoicesBy.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/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","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/pages/AddPaymentPage/index.tsx","app/pages/AddPaymentPage/PaymentSchema.ts","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/BillingPreviewPage/Actions/Apis.ts","app/components/BasicTable/CellRenderers/PercentageRenderer/index.tsx","api/AssetDetailsApi.ts","app/components/LabelPrint/slice/selectors.ts","app/components/DatePicker/utils/toEndDateDisplayValue.tsx","app/components/DatePicker/utils/truncateTime.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/components/BasicTable/CellRenderers/AssetRenderer/index.tsx","app/pages/PublicAssets/slice/selectors.ts","app/components/BasicTable/Filters/UserDisciplineFilter/index.tsx","app/pages/SavedViewsPage/AddToLists/index.tsx","api/EmailApi.ts","app/hooks/useSendMail.ts","app/components/BasicTable/Filters/ServiceTypeFilter/index.tsx","app/components/Forms/FormRoomPicker.tsx","app/components/pickers/AutocompletePickers/ReservationStatusPicker/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/pickers/AutocompletePickers/ServiceUserGroupPicker/index.tsx","app/components/BasicTable/Filters/CampusFilter/index.tsx","app/components/InfoIcon/index.tsx","app/components/QrCodeExport/index.tsx","app/components/BasicDialog/BasicDialogTitle.tsx","app/pages/PublicAssets/slice/saga.ts","app/pages/PublicAssets/slice/index.ts","app/slice/router-selectors.ts","app/pages/Actions/PageTopActions/AddReservation/index.tsx","app/components/Forms/FormLocationPicker.tsx","app/components/PopupImport/index.tsx","app/pages/ArticlesPage/ArticleDoiLink/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/SubLocationListFilter/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/BasicTable/getFilterValue.tsx","app/components/pickers/AutocompletePickers/CatRateTypePicker/index.tsx","app/components/BasicTable/CellRenderers/InvoiceRowReferenceRenderer/index.tsx","app/components/BasicTable/Filters/ServiceFilter/index.tsx","app/components/BasicTable/BasicFilter/TableToolbar/RefreshIcon.tsx","app/components/BasicTable/Filters/NumbersRangeFilter/index.tsx","app/components/BasicTable/Filters/AvailabilityTypeBookableFilter/index.tsx","app/components/Forms/FormParagraph.tsx","app/pages/OtherServiceDetails/Details/components/InventoryBatchList.tsx","app/components/BasicTable/CellRenderers/EquipmentIdRenderer/index.tsx","app/components/BasicTable/CellRenderers/OperationTypeIdRenderer/index.tsx","enums/InternalServiceRequestStatuses.ts","app/hooks/useLocationChange.ts","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/ActiveSampleTypesPicker/index.tsx","app/components/pickers/AutocompletePickers/RelevantBudgetPicker/index.tsx","app/pages/ServiceRequestListPage/CreateNewRequest/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/BookitDatePicker/TimeDropDown/index.tsx","app/components/BasicTable/CellRenderers/UserRenderer/index.tsx","app/components/InvoiceRowReferenceLinks/index.tsx","app/pages/OtherServiceDetails/OtherServiceDetailsPage/getQueryStringParameter.ts","app/components/BasicTable/components/NoTableData/index.tsx","app/components/BasicTable/components/TableError/index.tsx","app/components/BasicTable/CellRenderers/DefaultRenderer/index.tsx","app/pages/OnlineBudgetsStatusPage/Filter.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/AssetPopUp/EnabledAttributes.tsx","app/pages/Samples/SamplePlatesPage/slice/saga.ts","app/components/BasicCheckBox/index.tsx","app/components/BasicTable/Filters/AssetFilter/index.tsx","app/components/InfiniteScroll/index.tsx","app/pages/QuizDetailsPage/QuizDetails/index.tsx","app/pages/Actions/GlobalSelectedActions/OpenTimeline.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/Actions/GlobalSelectedActions/CloneEquipments.tsx","app/components/BasicTable/CellRenderers/InvoiceIdRenderer/index.tsx","app/pages/InvoiceBatches/InvoiceBatchesComments.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/utils.ts","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/components/BasicLinks/Link/index.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/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/pages/LocationsPage/Details/index.tsx","app/pages/LabelTypesPage/LabelTypeEdit/Loadable.ts","app/components/Forms/FormAssetPicker.tsx","app/pages/ArticlesPage/utils.ts","app/pages/ArticlesPage/Hooks/useAllowedToChangeStatus.tsx","app/pages/ArticlesPage/ArticleAssociationForm/index.tsx","app/pages/ArticlesPage/ArticleDetails/index.tsx","app/components/Forms/FormCustomPicker.tsx","app/pages/ArticlesPage/NewArticleDetailsForm/index.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/Layout/FrontendLayout/components/SidePanel/SidePanelRenderer.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/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/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/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/CoreSelectionPage/Table/getFilters.tsx","app/pages/CoreSelectionPage/Table/getDefaultFilters.ts","app/pages/CoreSelectionPage/Table/CoreSelectionTable.tsx","app/pages/CoreSelectionPage/Table/Columns.tsx","app/pages/CoreSelectionPage/RowActions/index.tsx","app/pages/CoreSelectionPage/slice/index.ts","app/pages/CoreSelectionPage/slice/selectors.ts","app/pages/CoreSelectionPage/CoreSelection.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/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/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/Messages/slice/selector.ts","app/pages/ReservationDetails/Details/useOpenReservationSidePanel.tsx","app/components/Messages/index.tsx","app/components/pickers/StaticOptionsPickers/EmailTypePicker/index.tsx","app/components/BasicTable/Filters/EmailTypeFilter/index.tsx","app/pages/EmailNotificationsPage/Filter.tsx","app/components/BookitDatePicker/utils/useDateTimeChange.ts","app/components/BookitDatePicker/KeyboardRifmInput/index.tsx","app/components/BookitDatePicker/KeyboardInput.tsx","app/components/CustomForm/CustomFormSkeleton/index.tsx","app/components/CustomForm/QuizCustomForm.tsx","app/pages/QuizPage/StartQuiz/index.tsx","app/components/LabelPrint/PrintSelectedAssetLabelsButton/index.tsx","app/pages/AssetPopUp/IAsset.tsx","app/pages/MyAssetsPage/SelectedRowActions/GetSelectedActions.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/Samples/EditableTable/Fields/StyledSelect.tsx","app/pages/Samples/components/TmtType/index.tsx","app/pages/OtherServiceDetails/OtherServiceDetailsPage/index.tsx","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/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/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/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/ProfileMenu/SwitchSites/index.tsx","app/Layout/FrontendLayout/components/TopBar/ProfileMenu/index.tsx","app/Layout/FrontendLayout/components/TopBar/TopToolbar/index.tsx","app/Layout/FrontendLayout/components/TopBar/index.tsx","styles/CssVariables/styledVariables.ts","app/Layout/FrontendLayout/components/SideBar/styles.ts","app/Layout/FrontendLayout/components/SideBar/SideBarMenu/MenuItemComponent.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarMenu/HoverMenu.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarMenu/MenuItem.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarMenu/index.tsx","app/components/BookitlabLogo/BookitlabShortLogo.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarHeader/index.tsx","app/Layout/FrontendLayout/components/SideBar/SideBarFooter/index.tsx","app/Layout/FrontendLayout/components/SideBar/index.tsx","app/Layout/FrontendLayout/SideBarDrawer.tsx","app/Layout/FrontendLayout/styled/index.tsx","app/Layout/FrontendLayout/index.tsx","app/hooks/useRequiredRedirectToCoreSelection.ts","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/Layout/PublicAssetsLayout/styles.ts","app/pages/PublicAssets/Loadable.ts","app/pages/NotAllowedPage/Loadable.ts","app/pages/PlayGround/Loadable.ts","app/pages/SubscriptionTypesPage/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","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","params","get","response","data","config","put","post","patch","delete","b","payload","requests","r","index","rootedPathWithSearch","toRootedURL","pathName","search","method","atomicityGroup","URL","window","location","origin","headers","id","uniqueId","body","responses","every","urls","batch","file","formData","FormData","append","responseType","Accept","URLSearchParamsCI","URLSearchParams","other","GetRawValue","setisInversedForUrl","isInversedPrefix","findIsfilterInversed","startsWith","isFilterInversed","definedVal","hasprefix","substring","GetNumberOrUndefined","rawValue","number","GetStringOrUndefined","getStringUnionOrUndefined","unionArray","find","toLocaleLowerCase","GetBooleanOrUndefined","GetDateOrUndefined","type","parseQueryStringDate","GetPartialEntity","GetEnum","enumObject","t","enumToEntityArray","numValue","tryParseInt","item","GetBooleanEntity","Name","Yes","No","initPickerValue","additionalOptions","additionalItem","option","Promise","resolve","failureResult","verifiedData","initExPickerValue","sourceUrl","withoutServiceGroups","initMultiExPickerValue","separator","serviceGroups","ids","additionalItems","includes","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","UserProfile","settings","savedSettings","sett","Key","defaultSetting","Value","Enabled","Selected","UserName","AdGroup","DefaultGroups","IsMultiple","StaffEnabled","comparator","selectSlice","state","appSettings","initialState","selectAppSettings","createSelector","selectKnownModules","Modules","selectKnownModule","knownModules","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","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","selectIsExpanded","isExpanded","selectIsAuthenticated","updatedUserProfileSettings","selectGlobalServiceGroupFilter","DetectIsMobile","expanded","GetSideBarExpanded","topServiceGroupsIsHidden","selectShowGlobalServiceGroupFilter","showGlobalServiceGroupFilter","selectShowGlobalServiceGroupsAsList","showGlobalServiceGroupsAsList","selectBarcodeScanTarget","barcodeScanTarget","selectShowAllCores","showAllCores","selectReservationStatuses","KnownModules","UserGroupCoordRole","AllowWorkflowBooking","MultipleTentativeReservationsUnderWorkflowBooking","DraftReservationsEnabled","GetListItem","ReservationStatus","list","Approved","Pending","PendingCoord","Cancelled","CancelledByAdmin","Tentative","Draft","FormFieldsSection","titleSection","titleLink","styleSection","withTopSeparator","withBottomSeparator","style","Divider","width","alignSelf","marginBottom","className","bold","marginTop","FormLeftSection","pageDescription","errors","warningNodes","infoNodes","successNodes","isCover","isMobile","sidePanelExpanded","useSelector","selectExpandedSidePanel","sidePanelOpen","selectSidePanelOpen","showShortView","dataErrors","setDataErrors","dataWarnings","setDataWarnings","dataSuccess","setDataSuccess","dataInfos","setDataInfos","colapsedMinHeight","handleCloseError","splice","handleCloseWarning","handleCloseInfo","handleCloseSuccess","clsx","shortView","BasicAlert","showMore","collapsedMinHeight","margin","content","closable","message","succ","node","variant","onClose","ev","warn","FormRightSection","StyledFormFieldsContainer","avoidStyles","sectionStyle","sidePanelWidth","SIDE_PANEL_WIDTH","StyledForm","onSubmit","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","doUpdateExpandedState_Local","doLoadGlobalServiceGroupFilter","doSaveGlobalServiceGroupFilter","doSaveUserProfileSetting","doSaveFilter","doSavePageSize","doSaveCardsMode","doUpdateMyListSelected","doBarcodeScan","handleFullScreenChange","doEnterFullScreen","doExitFullScreen","doSetBarcodeScannigTarget","doShowAllCores","getAppSettingsFromSaga","action","call","actions","appSettingsLoaded","changeLanguage","loadError","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_Success","loadSystemSettings_Error","loadLoginSystemSettings_Success","loadLoginSystemSettings_Error","withDelay","GetSettingByKeyOrDefault","assign","model","requestURL","updateUserProfile_Success","updateUserProfile_Error","updateExpandedState_Success","updateExpandedState_Error","setExpandedState_Local","loadGlobalServiceGroupFilter_Success","selection","addNotification","SwitchedTo","httpPaload","equals","navigate","updateMyList","MIN_LENGTH_DEFAULT","MinBarcodeLength","minBarcodeLengthString","scannTarget","ScanTarget","BarcodeScanModalBody","path","parseBarcodeURL","globalThis","getRoomByExternalBarcode","roomId","roomid","BarcodeNotFoundEx","barcode","$top","publicBaseURL","toRelative","document","fullscreenElement","enterFullScreen_Success","exitFullScreen_Success","selector","documentElement","querySelector","fullScreenElement","requestFullscreen","exitFullscreen","barcodeScannigTarget_Success","setShowAllCores","takeLatest","loadAppSettings","loadSiteMapSettings","loadEventsCount","loadUserProfileSettings","updateExpandedState","updateExpandedState_Local","loadGlobalServiceGroupFilter","saveGlobalServiceGroupFilter","saveUserProfileSetting","saveFilter","loadSystemSettings","loadLoginSystemSettings","savePageSize","updateMyListSelected_Local","BARCODE_SCANNED","saveCardsMode","fullScreenChannel","eventChannel","emitter","addEventListener","removeEventListener","takeEvery","takeLeading","enterFullScreen","exitFullScreen","setBarcodeScannigTarget","notificationsCount","slice","createSlice","reducers","Language","findIndex","addNotifications","removeNotification","array","keyFn","upsert","itemIndex","updatedItem","DisplayName","userNodes","adminNodes","ChildNodes","flat","element","reactUrl","pathname","Url","ss","LoginScreenCompanyLogo","LoginScreenCompanyLogoLink","LoginScreenCompanyLogoHeight","ShowForgotPassword","Help_Login","saveGlobalServiceGroupFilter_Success","setShowGlobalServiceGroupsAsList","enterFullScreen_Error","exitFullScreen_Error","barcodeScannigTarget_Error","appSettingsActions","useAppSettingsSlice","useInjectReducer","reducer","useInjectSaga","saga","Button","processing","size","component","to","history","useHistory","absolutePath","handleClick","onClick","disableRipple","disableFocusRipple","disableTouchRipple","event","capitalize","startIcon","endIcon","H1","H2","H3","H4","Body","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","entries","buildURL","root","rootPath","hash","endsWith","useAbsolute","publicUrl","getExportParameters","$format","getExportForImportParameters","openExportLinkOld","open","openExportLink","cd","filename","fileDownload","odataUrlPrefix","getReturnURL","defaultReturnURL","returnURLKey","downloadFile","decodeURIComponent","defaultFileName","lazyLoad","importFunc","selectorFunc","opts","fallback","lazyFactory","then","module","LazyComponent","lazy","anonimusUrls","doOpenSidePanel","layoutSaga","selectHasNotSavedChanges","isChangesNotSaved","setContinueState","continue","setConfirmOpen","resetSidePanel","setTuggleOpenState","openSidePanel","sidePanelState","pageType","pageProps","coverOpen","coverExpanded","confirmState","confirmOpen","approved","rejected","showLocalConfirm","continueToLink","hasAnyNotSavedChanges","doRefreshTable","continueState","continueOnApprove","hideNavigation","actionTableProcessing","upsnackbarIndex","isMobileView","toggleSidePanel","setPageType","setPageProps","setExpanded","resetConfirmState","setConfirmApproved","setConfirmRejected","setContinueToLink","setNotSavedChanges","setRefreshTable","setActionTableProcessing","setLocalConfirm","setContinueOnApprove","setHideNavigation","resetContinueState","setUpSnackBarIndex","setIsMobileView","setIsCoverOpen","setIsCoverExpanded","layoutActions","useLayoutSlice","layout","selectSidePanelState","selectPageType","selectPageTypeProps","selectConfirmOpen","selectConfirmApproved","selectConfirmRejected","selectDoRefreshTable","selectContinueState","selectContinueToLink","selectHideNavigation","selectSnackBarIndex","selectIsMobileView","selectActionTableProcessing","selectProcessingIndicator","methodName","selectIsCoverOpen","selectIsCoverExpanded","RenderPageType","IconButton","shape","stopPropagation","IsBudgetFieldEnabled","setting","BudgetField","BudgetFieldSettings","bf","Disabled","IsModuleEnabled","IsAssetFieldEnabled","AssetField","AssetFieldSettings","IsAssetFieldIsPublic","IsPublic","IsAssetImageExist","imageName","imageSize","getOffsetDate","isEmptyOrWhitespace","toUndefinedIfEmptyOrWhitespace","toLowerCaseSafely","notUndefined","toNumberOrNull","AvailabilityTypes","keyValue","TryGet","GetString","typeEnum","getDefault","Tooltip","themeColor","headTitle","arrow","interactive","classes","popper","Box","AutocompletePicker","label","loadData","filterOptions","onChange","mini","isOpen","disableClearable","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","autocompleteStyles","extClasses","autocompleteExtendStyles","timerRef","firstOpen","setOpen","setOptions","searchTerm","setSearchTerm","hasSelected","setSelected","firstMounted","setFirstMounted","useEffectOnMount","handleSelectText","target","setSelectionRange","clearTimeout","setLoading","doload","active","rawResponse","extractDataFromResponse","optionsData","loadDataAndPrepareOptions","Autocomplete","onOpen","onPickerOpen","reason","details","multiple","onInputChange","newInputValue","getOptionSelected","getOptionDisabled","getOptionLabel","NA","renderOption","text","highlight","matches","match","parts","part","highlightSearchTerm","inputValue","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","checkIsMobile","useIsMobile","GetBrowserInfo","rdd","AssetAttributes","ServiceType","useReducer","useSaga","isNumber","onlyStringReducer","nums","reduce","enumToDescriptedArray","enumeration","Number","description","tryGetName","tFunction","GetTFunction","i18n","isInitialized","getFixedT","ns","defaultNS","prefixKey","GetOptionsFilterFunction","items","customSearch","enumToArray","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","effect","FundingTypes","RecurringReservationUpdateOptions","ReservationRepeatPeriods","ReservationRepeatMonthlyTypes","getSingleReservationStatus","MAX_TOP","getAutoCompleteLoadDataFn","idPropertyName","DisplaynamePropertyName","basePredicates","expand","transformModel","useSearchOrPredicate","queryString","maxTop","dynamicPredicates","$orderby","uniq","$expand","more","limit","unshift","nonSelectableOptions","ShowingFirstXRecords","maxRecordsLimit","CoverWrapper","dispatch","useDispatch","height","Dialog","maxWidth","coverShortRoot","hideBackdrop","scroll","disableAutoFocus","TitleRoot","styled","padding","spacing","display","flexDirection","alignItems","justifyContent","gap","Head","useSidePanel","closePanel","pageName","titlePage","pageLink","titleTooltip","disableExpandToggle","expandPanel","subTitlePage","leftTopActions","rightTopActions","showProcessing","useSwithActions","switchState","SkeletonIfLoading","cover","aria-label","CloseSidePanel","TitlePage","buttonsLenth","tooltip","Skeleton","ReactActions","ot","ind","SwitchActions","getProps","LinearProgress","ShortTitleRoot","ShortHead","rightTopActionsAsMenu","topIconsLength","TopButtonsContainer","ButtonsPanel","leftActions","rightActions","leftActionsMaxLength","ShowLess","MoreOptionsMobile","iconVariant","paddingInline","TopButtonsPanel","maxLeftTopButtonsLength","keepOpen","getRandomWidth","Math","random","toFixed","ButtonsSkeleton","FormSkeleton","overflow","fullPage","PageWrapperRoot","minWidth","flex","overflowY","boxShadow","palette","common","borderRadius","backgroundColor","bookitShadows","shadowBorderTop","PageWrapper","closeSidePanel","confirm","closeCover","useSwitchActions","topProcessing","hideTitleBar","isCoverOpen","isCovered","covered","baseRootUsePanelHeight","baseRootUsePanelShortHeight","baseRootHeight","baseNavigationHeight","contentRoot","contentMobRoot","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","useAsyncExtendedState","useState","setState","useMemo","nextState","initialNextState","mounted","partialState","initialExtendState","assertExhaustive","BasicTypography","italic","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","useSystemDate","appTimeZone","currentTimezoneOffser","getOffset","useCallback","newDate","parsedDate","getOffsetDateOrNull","localDate","withoutOffset","withOffset","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","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","ServiceGroup","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","tryParseBool","tryFormatIso","tryParse","DisplayValue","tryParseFloat","selectServiceRequestRowInsertStatus","createServiceRequestRowStatus","DialogConfirm","confirmButtonLabel","cancelButtonLabel","onConfirm","onCancel","subtitle","handleClose","handleConfirm","btnActions","Confirm","Cancel","isopen","PaperProps","removeHtml","tryParseWithoutNaN","isNumericPositive","test","ExternalLink","LinkBehavior","Link","rest","useStyles","showIcon","externalLinkRoot","link","CopyURL","externalLinkIcon","clipboardWrite","URLCopied","makeStyles","whiteSpace","clipboardWriteEnabled","navigator","permissions","clipboard","writeText","copyResult","FormTextField","useField","meta","RepetitiveOptions","RepeatPeriod","RepeatMonthlyBy","GetRepetitiveOptions","dayName","getDayText","weekName","WorkWeekDays","getWeekNumberOfMonth","weekDays","getLongDaysArray","RepeatWeeklyOn","RepeatMonthlyOn","RepeatEveryWeekDay","FormikField","fullRow","hide","minRow","FormikSection","fields","order","avoidRenderSection","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","BaseOptionsPicker","getOptions","createFilterOptions","ignoreAccents","ignoreCase","stringify","ExportTypes","styles","createStyles","cursor","zIndex","left","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","getPeriodTypesEntity","valueType","getPeriods","getPeriodTypesEntityById","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","visible","AlwaysVisible","VisibleToUserOnDoneRequest","isVisible","useCustomFormSchema","getCustomFormInitialValues","initialValues","orderFields","next","serializeValues","serialized","serializeCustomFormRowValue","getCustomFormColumnSchema","baseSchema","integer","getCustomFormColumnBaseSchema","TopActionButton","customIcon","noChangeOnMobile","starticon","endicon","fullActiveUrl","adminsUrl","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","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","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","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","setCover","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","Location","toEntity","LocationId","LocationName","Room","RoomId","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","shortDateTimeFormat","DatesRange","fromPreset","st","et","bookable","ApprovalRequiredBillable","BookableWApproval","FreelyBookable","FreelyBookableBillable","LectureRoom","LoanableEquipment","TrainingProgram","bookableAndnotbookable","AvailableNotBookable","servicesRelated","NotAvailable","RequestRelated","ServiceRelated","initAssetsData","initval","byService","serviceTypes","admin","types","AssetsFilterForWorkOrder","orederType","Groups","AssetCats","AssetsFilterForCalibrationWorkOrder","selectedIds","AssetsFilterForSavedView","topServiceGroups","AssetsPicker","defaultValue","restrictByAvType","showOnlyActiveAssets","avFilter","getAvFilter","innerLoadData","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","serviceType","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","parseInternalCode","searchParams","Consumables","internalId","serviceId","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","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","selectConnectedFilters","connectedFilters","selectConnectedFieldHandler","connectedValueHandler","selectConnectedSettings","connectedSettings","useMobileOrientation","orientation","isLandscape","isPortrait","innerWidth","breakpoints","md","FormNumberField","noWarnOnNuN","FormLabelText","html","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","DateRenderer","HtmlRenderer","ArrayRenderer","callback","RestrictedReservationsOptions","DoubleRender","ButtonOrLink","expandable","defaultRows","AssetPopUp","setRows","setData","openEndUsage","setOpenEndUsage","setReset","assetCover","setAssetCover","selectedServiceGroups","HideTopServiceGroupFilter","assetFieldEnabled","defaultAttributes","ExtraDDL0","ExtraDDL1","ExtraDDL2","ExtraDDL3","ExtraDDL4","ExtraDDL5","ExtraDDL6","ExtraDDL7","ExtraDDL8","ExtraDDL9","ExtraDDL10","ExtraDDL11","ExtraDDL12","ExtraDDL13","ExtraDDL14","ExtraDDL15","redirectToDashOnCoreClick","NoDashboardRedirectOnCoreSelection","assetProps","AssetPopUpActiveProps","dict","ImageName","Cell","src","getAssetImageSrc","GetNullableByKey","AssetImageSizeType","alt","maxHeight","NoHeader","validToRender","Availability","ApprovalRequired","RestrictionsOverview","ReservationEnabled","GetBooleanByKey","HideInstrumentRestrictions","AssemblyId","PrerequisiteTrainings","TrainingMandatory","MinimumReservationDurationH","MaximumReservationDurationH","ReservationMinimumGap","CarryOverTimeSlotGap","CarryOverTimeSlotTypeName","dependencies","MinimumTimeAhead","MinTimeAheadPeriodType","MinTimeAheadPeriodValue","MinTimeAheadMinutesSinceMidnight","Before","AdvancedReservation","MinTimeAheadPeriodTypes","OnTheSameDay","ToBeBookedBy","AdvancedReservation_info","ToBeBookedBy_info","InstrumentRestrictions","NoLimitations","PrerequisiteEquipments","ShowRestrictionsFull","serviceGroupId","CheckTrainingStatus","AssetsInstituteBusiness","Accessories","AssetCatGroupName","AssetCatEnabled","AssetCategory","PropName","AssetCatInternalServiceAvaliable","InternalServiceAvaliable","NickName","OtherNames","Brand","Model","ModelNumber","Campus","Building","RoomNumber","AmAdmin","LocationUpdatedAt","LocationUpdatedByDn","LocationUpdatedBy","LocationsList","EquipmentExpert","Email","OfficeTel","ContactsPersonForEquipment","ExternalCompany","MainSpecificationRange","ElectricalSpecs","FunctionalCharacteristics","WebLink","RoutineActiveAnalysisCapable","BooleanRender","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","ExtraDDL0Value","Asset_ExtraDDL1","ExtraDDL1Value","Asset_ExtraDDL2","ExtraDDL2Value","Asset_ExtraDDL3","ExtraDDL3Value","Asset_ExtraDDL4","ExtraDDL4Value","Asset_ExtraDDL5","ExtraDDL5Value","Asset_ExtraDDL6","ExtraDDL6Value","Asset_ExtraDDL7","ExtraDDL7Value","Asset_ExtraDDL8","ExtraDDL8Value","Asset_ExtraDDL9","ExtraDDL9Value","Asset_ExtraDDL10","ExtraDDL10Value","Asset_ExtraDDL11","ExtraDDL11Value","Asset_ExtraDDL12","ExtraDDL12Value","Asset_ExtraDDL13","ExtraDDL13Value","Asset_ExtraDDL14","ExtraDDL14Value","Asset_ExtraDDL15","ExtraDDL15Value","BrandBarcodeNumber","ServiceContract","WarrantyEndDate","LifeDateView","Age","ExportLicense","InternalEquipmentBarcodeNumber","AccountingId","NotActive","notActive","getRows","mismatchCore","AvailabilityTypeId","SuperGroup","updateGlobalServiceGroup","groups","getEnabledAttributes","flatMap","catch","source","fetchData","AssetDetailsApi","getAssetById","token","HandleEndUsage","usageData","endUsage","errmsg","wrnmsg","DefautltCell","getTopAssetActionsDropDown","isMismatchCore","NotificationIsAvailable","DivisionId","EditSettings","Settings","AssetDetails","menu_AddNewTrainingSessions","NewTrainingSession","CalendarButton","equipments","openToBook","Allowed_ByTraining","UntrainedToolTip","Calendar","Timeline","UsageEnabled","UsageHistory","Quizzes","TrainingQuiz","AlertsEnabled","AlertsIcon","PlanedEventsEnabled","ScheduledEvents","RequestAnOtherService","CanBeCreatedFromLinkOnly","CreateNewSampleRequest","SampleRequests","ResCancelNotifications","ReservationNotification","NotifyExists","NotifyToolTip","NoNotifyToolTip","EditRemainders","AddRemainders","ShowFeed","CalendarPublicIntegrationFeed_Icon","OutlookGoogle","useTopAssetActionsDropDown","ShowAssetFull","editLink","topActions","addWorkOrder","DropDown","CreateAnAssetRelatedEvent","addChevron","menuChildren","MenuItem","PleaseSelectAnEventType","aType","assetId","menuProps","Event","addReservation","PlaceAReservation","Reservation","addUsage","CanStartUsage","StartUsage","Use","CanEndUsage","StopUsage","Stop","addTakeDown","AlertInfo","show","hasDownActive","noAlerts","hasActive","alertId","HasActiveDownAlertsAdmin_info","HasNoAlertsAdmin_info","offH","down","ReportAConsumable","LogConsumables","assetActionsDropDown","RenderRows","Grid","container","direction","cell","cellData","justify","paddingBottom","paddingTop","xs","Header","EndUsageConfirm","EndUsageIds","RenderCoreMismatch","MismatchAssetCore_warning","SwitchToThisCore","err_Equipment_NotFound","availabilityTypeId","divisionId","AssetLink","openAsset","useOpenAssetPopUp","ShowAssetSidePanel","OpenAssetPrimaryAction","ArticleStatus","entity","initAssetRangeData","initUnitTypeData","assetRangeCustomFilter","SourceUnits","sourceConvert1","unitId1","TargetId","convert1","ConversionRate","sourceConvert2","unitId2","convert2","TargetUnits","targetConvert1","assetRangeDisplay","AssetRangeFilter","customData","stateValue","handleOnChange","oldValue","newState","PleaseSelectRangeUnitType","oldVal","dateLongFormatter","pattern","timeLongFormatter","longFormatters","P","dateTimeFormat","matchResult","datePattern","timePattern","formattingTokensRegExp","longFormattingTokensRegExp","getFormatTokens","formatString","tokens","firstCharacter","longFormatter","getInputViewDate","truncateTime","toEndDateDisplayValue","setInputViewDate","ddd","defaultDateTimeMask","defTokens","hour","minute","dateSeparator","dateStartFrom","first","dateStartWith","dateTokens","timeTokens","dateSelection","maskFormats","selectionStart","selectionEnd","preventDefault","timeSelection","oneLetterHour","dateArrowSelection","arrows","getMaskedDateValue","mask","singleValue","getMaskedTimeValue","formatingDate","partChanged","maskFormat","prevValue","increment","isPrevZero","isSelectionChanged","stayOnSelection","zeroPress","startedFrom","prevParts","dayVal","prevDayVal","newVal","dayInt","prevInt","comb","monthVal","prevMonthVal","monthInt","prevMonthInt","yearVal","prevYearVal","yearInt","padEnd","formatingTime","newTime","prevHour","prevMinute","prevMeridiem","hourInt","prevHourInt","minuteInt","prevMinuteInt","getDisplayDate","utils","isEmpty","invalidLabel","emptyLabel","labelFunc","adminUrl","reservableUrl","initOnlineServicesData","sourceurl","OnlineServiceMultiPicker","OnlineServiceSinglePicker","RestrictedByAdminFilter","ServiceGroupIds","IsAdminPanel","ServiceGroupFilter","onMouseDown","onHandleClose","disablePortal","anchorEl","setAnchorEl","marginThreshold","anchorOrigin","handleOpen","currentTarget","aria-controls","aria-haspopup","getContentAnchorEl","MenuListProps","dense","vertical","horizontal","transformOrigin","TextControlField","startIconComponent","endIconComponent","startAdornment","StyledMenuItem","button","HoverActions","popupState","usePopupState","popupId","buttons","anchorRef","bindHover","bindMenu","close","ClickableActions","bindTrigger","Menu","closeAfterTransition","hoverMenu","nonEmptyItems","_t","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","remarks","sids","quantity","userCanBookEquipment","equipmentid","EditableCell","WrappedComponent","initialValue","updateMyData","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","FormBookitDatePicker","disableFuture","disablePast","inputVariant","clearable","fullScreen","minDate","maxDate","toURLSearchParams","queryStringSerializer","serializer","n","useFilters","savedFilterKey","GetFiltersDefinition","getDefaultFilter","reservedQueryStringParameterNames","getRequiredFilter","getSelectedViewFilter","enableSavedLists","savedListSettings","useCardsByDefault","getPartialResults","useSyncSearch","useSavedViewSlice","savedViewActions","appActions","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","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","IsEntity","IsEntityType","IsEntityArray","IsEntityString","IsEmptyArray","IsNotEmptyArray","PureAppliedFilterComponent","onRemove","onApply","filterData","filterPredicates","depValue","depKey","predict","setPredict","handleChange","applyItem","handleRemoveClick","canHaveInversed","customFilter","inversionDisabled","toggleInversed","fieldName1","flexShrink","displayName","selected","dateTimeClear","NonRemovableFilter","textOverflow","flexWrap","AppliedFilterComponent","prevProps","nextProps","predicetes","ActionButton","placement","PopperProps","OfflineServiceTypePicker","UsageRelatedFilter","Ids","excludedIds","ReservationsRelatedFilter","equipmentGroups","optionalServiceTypes","hideProject","allServicesAllowed","budgetServiceGroupServicesAllowed","byAdmin","byUser","OfflineServiceRelatedFilter","relatedGroups","RenewStockRelatedFilter","InventoryBatchRelatedFilter","validateError","propss","validateDate","currentDate","opDate","maxMonthDays","finalDate","maxDateMessage","minDateMessage","invalidDateMessage","strictCompareDates","validateTime","convertToMeridiem","getMeridiem","checkDateInput","dateStart","regexDDMMYYYY","RegExp","regexYYYYMMdd","regexMMDDYYYY","initBudgetData","queryUrl","BudgetPicker","allActiveBudgets","BudgetByUserGroupFilter","loadBudgets","restrictedBudgetFilter","budgetLimitedByUsers","isBudgetsWithoutUserGroup","defaultBudgetEnabled","userDefaultBudgetEnabled","hideNonDefaultBudgets","fundingType","usrFilter","memberTimeFilter","fundingTypeId","startFilter","endFilter","groupFilter","servFilter","deffFilter","DraftReservationTypes","AllowReservationCollaboratorsTypes","mapSettingsFromServices","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","RequireUserGroupCoordApproval","DraftForAll","DraftReservationsTypeId","DraftReservationTypes_AllUser","DraftApprovalRequred","DraftReservationTypes_ApprovalRequired","DraftSaveForLater","DraftReservationTypes_SaveForLater","combineOptionalEquipments","offlineServices","terminate","EquipmentsData","AccServiceIds","SampleRunId","SampleIds","Collaborators","CollaboratedUsers","ExperimentId","ExperimentEln","PartialAttendance","PartialAttendanceStart","PartialAttendanceEnd","Tutoring","FullDayReservation","Username","StaffUser","UserGroupId","TrainingSessionId","TrainingSession","ServiceRequestProjectId","ServiceRequestProject","TransferFromId","UserRequestedByApproval","TransferredTo","WorkflowBooking","RecurringUpdateOption","AllStartTimes","BudgetIds","OfflineServices","ServiceTypeName","UnitsName","Factor","TransferInProgress","InsertedAt","Entered","InsertedBy","RecordDate","UpdatedAt","CancelledAt","CustomFormValues","FieldId","Parts","TutorName","BudgetPercent","Terminated","SavedForLater","StartDate","EndDate","PartReservations","BudgetName","percent","AssignToServiceRequestId","AssignToServiceRequestRowIds","AssignToServiceRequestSampleIds","Repeat","RecurringEvents","DoNotRepeat","RepeatsEveryType","RepeatsEveryPeriod","RepeatsEveryNum","RepeatsEveryDay","RepeatEndTime","RecurringEndDate","RepeatOption","Repeat_Period","RepeatsBy","RepeatsMonthlyBy","RepeatsOn","RepeatsOnDays","MandatoriesEquipments","OptionalsEquipments","doReservationInint","doUpdateSettigs","doUpdateEquipmentSettigs","doLoadValidationData","doSetStart","doSetEnd","doSetAny","doTransferReservation","doCancelTransferReservation","doTerminateReservation","reservationSaga","isChange","resourceChanged","BaseEquipment","extendEquipmentSettingsState","mandatories","End","sampleRunId","initReservation_Success","isChanged","userTrainigData","userTrainingsApprovalData","allEquipments","Equipments","ActiveUserGroup","CheckStatus","srrid","prevState","CheckSession","initValidationData","warnings","initReservation_Error","isCloned","calcCredit","customFormFiles","getFilesModel","FileTypes","ReservationFile","CustomFormTypeEnum","FileStoreApi","saveFormFiles","fileRes","fileResponse","self","setCloneReservation","ReservationDetails","warnOnTrainingSession","linkUrl","FirstEquipmentId","linkText","ClickHere","persist","showLinkMessage","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","extendReservationSettings","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","TerminateReservation","FirstInitEquipments","OfflineMandatory","FutureReservation","IsFuture","Ongoing","IsOngoing","PastReservation","IsPast","resetOperateState","resetAssisteTrainingData","resetEquipmentChangeState","getAnyValue","getAnyValueSuccess","resetRequestedFor","resetTransferState","setSavedOfflineServices","setRefreshOfflineServices","resetTerminateState","setAsyncChangeLoading","setSubmitCredit","setByApprovalErrors","setRefreshWorkOrderLink","reservationActions","useReservationSlice","SelectedRowsActionIconButton","snackBarMessageType","onRefresh","confirmTitle","confirmBody","variantButton","updateDialogVariant","validConfirm","toggleAllRowsSelected","busy","setBusy","showConfirm","setShowConfirm","handleAction","resp","Notification","respm","sccmsg","CommentReferenceTypes","mapSettings","isEditMode","budgetEnabled","resUGEnabled","reservationUserGroupGroupByBudgetUserGroup","isServiceAdmin","IsAllGroupOrLabTechAdmin","isRoleAdmin","GroupAdministrators","LabTech","isUserGroupCoordinator","UserGroupCoord","btExpEnabled","chargesViewAllowed","FinAdmin","InvoicesReader","hasConflictProjects","budgetVisible","fundingTypeVisible","fundingTypeBudgetEnabled","purchaseOrderBudgetEnabled","ReservationUserGroupGroupByBudgetUserGroup","userGroupVisible","userVisible","budgetExpirementVisible","instProjVisible","instituteProjectsEnabled","extCustomerVisible","purchaseOrderVisible","PurchaseOrderOptionId","PurchaseOrderOptions","Hidden","referenceVisible","showReferenceFieldInReservationDetails","External","onlyOwnUserGroupsAllowed","endTimeVisible","startTimeVisible","allowUsersToViewTheirCharges","doSetConnectedValue","doResetState","connectedFiltersSaga","setConnectedValueSuccess","currentData","updateSettingsState","resetConnectedState_success","setConnectedValue","resetConnectedState","toISOString","setSubmit","resetConnectedHandler","useConnectedFiltersSlice","DRAWER_WIDTH","DRAWER_MOBILE_WIDTH","COVER_WIDTH","RenderTypes","AllowedToRender","renderType","asset","AllowedByRolePermissions","AvailableByServiceType","AvailableByAvailabilityType","AddToList","AddWorkOrder","OpenCalendar","OpenTimeline","OpenWorkOrder","OpenWorkOrders","NewReservation","DownWorkOrder","BringBackUp","HasAdminGroupPermissions","HasAdminServicePermissions","HasLabTechGroupPermissions","CloneEquipments","DownloadImages","serType","availabilityType","avType","initExtraDDLData","ExtraDDLPicker","ValueLabel","displayValue","selectArticles","articles","selectArticlesExternalSearchResults","externalSearchResults","selectArticlesExternalSearchForm","externalSearchFormDetails","selectArticlesExternalSearchPageIndex","externalSearchPageIndex","selectArticlesExternalSearchPageSize","externalSearchPageSize","selectArticlesExternalSearchPageData","page","selectArticleDetails","articleDetails","selectShowEditArticleAssociation","showEditArticleAssociation","selectArticleDetailsBusy","articleDetailsBusy","selectArticleDetailsForm","ServiceGroupAssets","Assets","InstrumentAssets","EmptySlotAdminClick","WorkOrderApi","initCreateData","initUpdateData","insertWorkOrder","updateWorkOrder","offData","getNewWorkOrderStatus","deleteOrders","DowntimeOrders","assetIds","foo","nowDate","removefromLinks","linkedId","addToLinked","removeLinkedCalibration","addLinkedToCalibration","getLinkedToCalibration","getOverlappingDowntimes","BooleanPickerFilter","trueName","falseName","allPeriods","noFuturePeriods","DatesRangeFilter","periodValue","changedValue","periods","Forever","From","minutesStep","saveOnSelect","maskIfEmpty","To","withPadding","backgroundImage","checkedIcon","indeterminateIcon","Check","checkicon","uncheckicon","indetermicon","Checkbox","InvoiceFundingType","initFundingTypeData","FundingTypeIdPicker","marginRight","StyledChip","custombgcolor","main","customsize","customcolor","paddingBlock","opacity","pointerEvents","darken","fullwidth","customwidth","notremoved","labelSmall","clickable","sizeSmall","deleteIcon","customiconcolor","contrastText","fade","Chip","BookitChip","aria-disabled","onDelete","BookitChipWithCheck","BookitChipWithInfo","checkname","checkid","userProfileSetting","savedEnabled","updateEnabled","FormSwitch","boldLebel","maxLabelWidth","boldLabel","boxed","FormBookitDateTimePicker","labelInline","dateLabel","timeLabel","ExtraDDLFilter","AutocompleteMultiPickerEx","renderTags","renderOptionLabel","renderOptions","onChipClick","expandedColumns","newValue","getTagProps","selectable","undefinedIfIsEmpty","Color","Fragment","BaseURLPicker","queryfilter","PriceSheetBy","BudgetType","AutomaticAssetNamings","UserReservationsRestricted","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","eStart","alert_type","useSwithButtons","useSwitchButtons","selectedSavedView","updateMultiMode_Success","updateEmptySlotSettings_success","gsettings","defaultEmptySlotSetting","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","EquipmentAdministrator","InstituteCoord","privateBudgetsRoles","HeadOfLab","userRoles","reservationRestricted","setReservationRestricted","budgetModuleEnabled","setBudgetModuleEnabled","priceSheetPricing","setPriceSheetPricing","purchaseOrderLengthSetting","setPurchaseOrderLengthSetting","userIsMainAdmin","setUserIsMainAdmin","userSettings","setAllowOngoingReservationModificationEnabled","doNotAllowReservationUserChangeByStaff","setDoNotAllowReservationUserChangeByStaff","setInstituteProjectsEnabled","reservationTerminationEnabled","setReservationTerminationEnabled","draftReservationsEnabled","setDraftReservationsEnabled","MandatoryOfflineServicesOnTrainingSignUps","setMandatoryOfflineServicesOnTrainingSignUps","crossInstrumentTrainingEnabled","setCrossInstrumentTrainingEnabled","userAndGroupPermissionsEnabled","setUserAndGroupPermissionsEnabled","tutoringModulesEnabled","setTutoringModulesEnabled","accServicesEnabled","setAccServicesEnabled","setAllowUsersToViewTheirCharges","setShowReferenceFieldInReservationDetails","offlineServiceWithReservation","setOfflineServiceWithReservation","multipleInstrumentsEnabled","setMultipleInstrumentsEnabled","trainingSessionEnabled","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","isInRole","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","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","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","StyledItemIcon","ListItemIcon","RowMenuActions","tooltipOpen","setTooltipOpen","RouterLink","RowActionsMenu","useRowActionsColumn","rowActions","tablePlugins","actionColumns","Action","disableSortBy","hooks","useInlineRowActionsColumn","inlineRowActions","useAsyncGetWthEffect","load","defaultVal","deps","setVal","TrainingState","samplesList","selectSamplesList","selectRunDetails","selectShowRunDialog","selectSamplesListEditMode","selectImportingRunDetails","selectImportingRunDetailsFinished","selectRunDetailsInstrument","selectRunDetailsSecondaryInstrument","selectRunDetailsGradient","selectRunDetailsCreatedDate","CreateDate","selectRunDetailsAcquision_type","AutocompleteMultiPicker","fullWdithOptions","setInputValue","StyledTextField","MatTextField","FormCheckbox","getAssetImageThumbSrc","imageExist","defaultImage","getDefaultImage","DateInput","openPicker","TextFieldComponent","validationError","togglePicker","TextComponent","innerInputProps","readOnly","InputAdornment","nodeName","onKeyDown","StyledPicker","PickerPopper","Popper","shadowXL","useEventListener","eventName","handler","savedHandler","useIsomorphicLayoutEffect","targetElement","eventListener","TimeOptionPicker","onError","useUtils","dateTimeValue","dateSelected","setDateSelected","getHoursEntityFromDate","hoursSelected","setHoursSelected","getMinutesEntityFromDate","minutesSelected","setMinutesSelected","getAmPmEntityFromDate","ampmSelected","setAmpmSelected","innerError","setInnerError","hoursItems","hoursEntityArray12","hoursEntityArray24","minutesItems","minutesEntityArray","ampmItems","AmPmEntityArray","hourRef","minuteRef","selectedId","useAmPm","scrollTo","hourScroll","step","minuteScroll","ampmValue","withCompletion","handleHoursChange","handleMinutesChange","handleAmPmChange","FormControl","PickerOptions","List","disablePadding","ListItem","ap","FormHelperText","gridAutoColumns","gridAutoRows","gridColumn","gridRow","borderBottom","borderTop","listStyle","scrollBehavior","minHeight","BookitDatePicker","elementRef","closablePicker","closeTitle","readonlyInput","useTimeClockPicker","useTimeDropDowns","useDateDropDowns","dateInputProps","keyboardInputProps","dateValue","setDateValue","setValidationError","handleSave","contains","countState","inputDisplayValue","ClickAwayListener","mouseEvent","onClickAway","KeyboardInput","isPickerOpen","inpValue","getParsableDate","transition","TransitionProps","Fade","Paper","TimePicker","disableToolbar","timeValue","DatePicker","dateVal","TimeDropDown","DateDropDown","Save","Clear","FormControlLabel","withInfo","boxedChecked","boxedError","prefix","levelFormatter","level","nameFormatter","timestampFormatter","part1","part2","filterHandler","isSidePanel","saved","withoutReserved","withReserved","addReserved","filterSearch","filterValue","reserved","CommentsApi","GetComments","reference","SendComment","typeId","referenceId","Files","Text","IsInternal","form","removeFile","delteUrl","createPeriod","now","startFn","endFn","addFn","offset","MessageText","div","css","defaultIconMapping","isShowMore","setIsShowMore","in","severity","iconMapping","convertInventoryBatchName","loadBaseData","InventoryBatchPicker","loadInventoryBatchesData","BatchesByServiceTypeFilter","withStockRenewed","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","TimelineGroupByUnionArray","parseCalendarPageParams","dashView","defaultviewType","parseType","presetPeriodToViewLength","getTimelineGroupBy","AlignRight","textAlign","initUserGroupData","UserGroupPicker","RestrictedUserGroupPicker","RestrictedFilter","departmentId","instituteId","instituteTypeId","restricted","ServiceRequestDetailsPath","generatePath","box_shadow_s","shadowXS","shadowS","shadowM","shadowL","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","_","defaultHourValue12","getMeridiemHours","defaultHourValue24","HoursPicker","regPublicUrl","billableAdminUrl","initServiceGroupsData","ServiceGroupPicker","serviceGroupFilterUrl","FormServiceGroupPicker","shiftRight","userProfileComparer","useExpandedSideBarState","userProfileSett","userProfileSettCompared","useCustomCompareMemo","userProfExpanded","expandLocal","toggle","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","InventoryBatchForm","memo","bindSubmitForm","innerFormRef","fieldHandler","handleSubmit","resetFieldHandler","serviceChanged","setServiceChanged","batchChanged","setBatchChanged","serviceTypeSelected","setServiceTypeSelected","minStep","maxStep","handleFormChange","validateForm","computedSchema","inventoryBatchSchema","BatchName","err_BatchName_required","err_OfflineServiceTypeRequired","BatchExpirationDate","BatchPurchaseDate","err_BatchPurchaseDate_required","BatchInventory","err_BatchInventory_required","currVal","BatchLot","BatchPurchasePricePerUnit","withMutation","NotAllowNegativeInventory_err","validationSchema","validateOnMount","validateOnBlur","validateOnChange","enableReinitialize","innerRef","formikHelpers","formik","submitForm","BatchInfo","FormOfflineServiceTypePicker","Consumable","PleaseSelectServices","isSubmitting","inputMode","Inventory_ServiceType_Description","actionCompleted","hasChanges","confirmApproved","confirmRejected","continueToOther","continueLink","inventoryBatchData","firstLoad","setFirstLoad","requestCompleted","setRequestCompleted","submitFormRef","isReadOnlyUser","CalendarOnly","RoomOnly","handleCloselClick","handleSaveClick","handleSubmitForm","Close","Batch","CreateNewBatch","onBeforeunload","UserFilter","DateTimeLabel","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","g","col","nonGroupByColumns","isGrouped","groupedIndex","pluginName","defaultUserAggregations","flatRows","rowsById","allColumns","groupByFn","defaultGroupByFn","manualGroupBy","aggregations","userAggregations","plugins","autoResetGroupBy","disableGroupBy","defaultCanGroupBy","ensurePluginOrder","accessor","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","isPlaceholder","isAggregated","resKey","TableCard","imageSrcKey","titleKey","primaryAction","viewCheckBox","useSelect","hasAdditionalActions","hasInlineRowActions","isRowSelectable","someSelected","cardSize","showTitleCell","contentEditable","cardPosition","useButtons","cells","sizeOfMobileCard","img","hasImg","imgSrc","showSelect","setShowSelect","isDisabled","render","CardMouseOver_info","backStyle","imageSrc","selectVisible","checkBox","showBullet","mobileSize","toggleRowSelected","useImage","hasTopActions","cardContentRows","preventInnerClicks","TabsToolbar","leftTabs","selectedValue","selectedArray","rowsCount","allRowsSelected","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","Import","keepMounted","defaultRowIdAccessor","defaultGetSubRows","defaultCheckIfRowIsSelectable","ControlledTable","getRowId","useExport","onDownloadTemplate","pageActions","screenName","screenNameVariant","selectedRowsActions","filterOpen","useImportLink","customParams","importLink","importHandler","ServiceGroupsOptional","topAlertMessage","onChangeState","onSelectedRowsChange","onExport","tableRowsSize","getSubRows","withToolBar","allowCards","viewCardsCheck","floatingTabSettings","tabSectionSettings","onSelectedChange","hideMenuOnMobile","useConfigurable","customToolbarSettings","getAllFilteredRowsCallback","useExportForImport","exportForImportFilterKey","customEmptyTableSettings","manualPagination","manualSorting","enablePagination","printing","alwaysShowTableHeader","hideFilters","baseTableActionsOnToolbar","baseSortBy","showGlobalSearchIconOnToolbar","toggleGlobalSearchIcon","customExpandMenu","customScreenName","importMenuItems","isContentEditable","globalActions","filtersButtonAnchorEl","setFiltersButtonAnchorEl","useGlobalFilter","useSortBy","useExpanded","usePagination","useRowSelect","addRowSelect","columnsDefinition","columnDefaults","DefaultRenderer","useTable","manualSortBy","manualGlobalFilter","autoResetSelectedRows","autoResetPage","pageCount","getTableProps","getTableBodyProps","headerGroups","reactTableRows","reactTablePage","gotoPage","setGlobalFilter","selectedRowIds","selectedFlatRows","isAllRowsSelected","setSortBy","isSomeSelected","accumulator","appliedFiltersLength","alreadySelected","setAlreadySelected","filterRef","handleFilterOpen","customProcesing","globalSearchOpen","selectGlobalSearchOpen","showGlobalFilter","defaultPageActions","dataCount","refresh","FilterIconButton","filterLength","handleExportClick","rowsPerPageOptions","sortedUniq","handleSortBy","sortAction","newSortBy","sortDescFirst","isSortedDesc","existingSortBy","existingIndex","hasDescDefined","useMemoFilters","sortByActual","topMessage","setTopMessage","setGlobalMessage","ShowNotRelatedServiceGroups_warning","autoHideDuration","isCards","setIsCards","print","onLoading","baseTableActions","ConfigureColumnsButton","onConfigurableColumns","ExportButton","selectedFilterRowProp","onDownloadTemplateClick","Table","Cards","table_id","tableHead","TableHead","headerGroup","getHeaderGroupProps","getHeaderProps","getSortByToggleProps","TableSortLabel","IconComponent","TableHeaderIcon","isSorted","hideSortIcon","TableContainer","tableContainerSyles","TableToolbar","showAlert","alertContent","showMenu","showGlobalSearchIcon","toggleGlobalFilter","subHeader","FilterContainer","BasicFilter","autoOpenAddFilter","showFooter","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","role","TableBody","rowIndex","summaryRow","tableFooter","tableFooterWithBorder","TablePagination","colSpan","rowsPerPage","labelRowsPerPage","MenuProps","menuPaper","onChangePage","onChangeRowsPerPage","newPageSize","ActionsComponent","TablePaginationActions","NoTableData","useFloatingActions","selectedFloatingActions","buttonFloatingActions","selectPaper","selectRoot","selectTitle","selectContent","addButtonRoot","addCollapsContainer","AddFilterButton","filtersSelectionOpen","setInnput","disabledTitle","SelectFieldToFilterBy","SearchFilter","MenuList","mobHorizontal","tabIndex","handleFilterSelect","AppliedFiltersContainer","mobileRoot","mobileHorizontalRoot","dependencyProp","depFiltered","filt","filterValues","updateDepValues","BasicFilterGroup","appliedFiltersDirection","setVisibleFilters","handleAddFilterWithValue","currentState","handleApply","areSameFilter","handleRemoveFitler","available","applied","appliedFitltersCount","SavedListsDropDown","serviceItem","savedListRelatedPickerName","hasInVisibleFilters","addFilter","serializedKey","listViewbyAsset","MoreFilters","MoreFiltersDisabled","ButtonsContainer","apply","ResetFilters_info","ResetFilters","allowedroles","InstrumentEventsAdmin","useWorkOrdersPermissions","roles","hasPermissions","allowedToView","isMainOrInstrumentEventsAdmin","HasAdminGroupOnlyPermissions","HasAdminServiceOnlyPermissions","HasLabTechServicePermissions","InventoryAdmin","HasInstrumentEventsGroupPermissions","IsReadOnlyUser","tableContainer","tableHeaderCell","borderRight","tableHeader","tableRowContainer","tableRowCell","tableRow","tableFooterContainer","shadow","useTableCardsStyle","card","cardVertical","cardHorizontal","cardSkelet","RenderTableRowsItems","aria-live","aria-busy","RenderTableHeaderCells","RenderTableRows","TableCardsSkeleton","TableRowsSkeleton","flexGrow","TableSkeleton","sm","initWOTypeData","initWOTypeDataParams","downtime","filteredWorkOrderTypes","calibration","grp","elem","cts","AssetCatId","byGroups","byCats","WorkOrderTypePicker","GetSchedulerPagePath","calendarPageFullPath","useCalendarLink","selectGlobalDbSetting_EnableLegacyScheduler","Select","renderValue","classNames","ITEM_HEIGHT","displayEmpty","SavedLists","savedActions","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","defaultMinutes","MinutesPicker","hasDeps","SortByComparer","ServiceGroupsComparer","columnsComparer","ColumnAccesorsComparer","REQUEST_CANCELLED_MESSAGE","BasicTable","additionalColumns","needRefresh","initComplete","dataState","setDataState","extendDataState","doRefresh","setTableState","handleChangeState","serviceGroupsCompared","additionalColumnsCompared","columnsCompared","useConfigurableColumns","configurableColumns","handleConfigurableColumns","configCompleted","refreshConfigurableColumns","getDisplayColumns","calculateColumnAccessors","columnAccessors","getColumnAccessors","getAllAdditionalColumns","oDataParams","buildParams","getUrlAndParams","controlledPageCount","ceil","cancelTokenSource","allAdditionalColumns","columnsConfig","isFetchReady","globalFilterValue","TryGetExportColumns","exportColumnAccessors","tableParams","exporturl","getAllFilteredRows","setAllRowsSelected","handleRefresh","reloadConfigurableColumns","refreshFromState","compactTable","initialPageSize","DescriptionCell","leaveDelay","leaveTouchDelay","NumberFieldFilter","doShowDetails","doHideDetails","doExternalSearch","doSaveArticleAssociation","articlesSaga","ExternalId","ExternalIdSource","showDetails_Success","Article","externalSearch_Skip","searchForm","Source","externalSearch_Success","Count","Items","StatusCodes","TOO_MANY_REQUESTS","TooManyRequests","externalSearch_Error","isNew","fn","Queryable","AwaitingApproval","PublicationAwaitingApproval","Success","saveArticleAssociation_Success","saveArticleAssociation_Error","showDetails","hideDetails","externalSearch","chnagePage","saveArticleAssociation","editArticleAssociationBusy","someAction","articlesActions","useArticlesSlice","ImportAdditionalData","ImportResult","TableToolbarHeader","FormSectionTitle","gutterBottom","titleIcon","titleAsColumn","disableGutters","shortview","edge","titleAndIconMobile","RefreshIcon","RefreshContent","FlexRowDiv","UnconfigurableTable","onExportForImport","setDataLength","setControlledPageCount","serializedCustomFilter","handleSelectedRowsChange","initAssetData","AssetPicker","doUpdateSections","doSaveSections","printPDFSaga","selectPrintPDFSections","sections","updateSections","saveSections","isLoading","useSections","setPrinting","setUseSections","Sections","updateSection","clearLoading","tables","printPDFActions","usePrintPDFSlice","Section","attrs","LeftSection","RightSection","RowSection","FormFieldsBox","EnableLegacyScheduler","FormAssetsPicker","initReservationStatusMultiData","ReservationStatusMultiPicker","BaseOptionsMultiPicker","ResrvationStatusMultiFilter","Future","getInitUpcomingReservationfilterMultiData","UpcomingReservationfilter","AllReservations","WorkflowBookingFilter","WorkflowBookingPicker","InstrumentFilterChip","InstrumentsFilterDisplay","handleDelete","border","noWrap","chip","GetFilters","RG_DatePeriod","pushServicesFilter","initData","pushBookedByFilter","budgetsFilter","getBudgetsFilterSettings","pushAssetCatGroupFilter","pushAssetCatFilter","pushAssetAvailabilityFilter","Institute","initInstituteData","InstituteFilter","ExcludeStatus","UserGroupFilter","OrderedBy","ReservationStartsOn","DatePickerFilter","ReservationEndsOn","Loanable","Duration","NumbersRangeFilter","Department","initDepartmentData","DepartmentFilter","InstituteType","initInstituteTypeData","InstituteTypeFilter","TextFieldFilter","pushRoomFilter","pushBuildingFilter","Discipline","UserDisciplineFilter","initUserDisciplineData","pushBudgetManagerFilter","pushCampusFilter","UpcomingReservations","pushWorkflowBookingFilter","initAssetCatGroupData","AssetCatGroupFilter","AvailabilityType","initAvailabilityTypeData","AvailabilityTypeBookableFilter","BudgetManager","initAssetCatData","AssetCatFilter","initRoomData","RoomPickerFilter","initBuildingData","BuildingPickerFilter","includeAllMyManagedServicesOption","allMyManagedServicesOption","AllMyManagedServices","InstrumentServiceName","ServiceAdminFilter","ServiceReservationFilter","ServiceMultiFilter","pushServicesCalendarFilter","renderFilterDisplay","initCampusData","CampusFilter","initWorkflowBookingData","doSaveState","doSetRepetitiveValue","repetitiveSaga","saveState_success","setRepetitiveValueSuccess","setRepetitiveValue","repetitiveValueHandler","resetRepetitiveHandler","useRepetitiveSlice","RemindBefore","defaultUrl","initUserMultiData","UserMultiPicker","filterKey","FormBudgetPicker","FormOnlineServicesComboPicker","FormOnlineServicesSinglePicker","FormFundingTypePicker","ServiceRequestMilestoneStatusesUnionArray","mapAssetsToServiceFilterDto","mapAssetsToServiceTypeFilterDto","configurableColumnsCache","listId","configurableType","force","param","ListID","ConfigurableType","getTableColumns","ConfigurableColumnsSetUp","j","hasCustomName","CustomName","ColumnExportConfig","bulletedStyles","overflowX","rowOverRule","SimpleList","BulletedList","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","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","lato_Regular","lato_Bold","lato_Black","DefaultThemeSettings","typography","overrides","MuiCssBaseline","unicodeRange","BookitThemeSettings","mobileStepper","speedDial","appBar","drawer","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","transitions","duration","shorter","easing","easeOut","marginInline","borderBottomStyle","marginDense","inputMarginDense","inputHiddenLabel","inputMultiline","inputAdornedStart","inputAdornedEnd","MuiFormHelperText","MuiFormGroup","MuiFormLabel","asterisk","MuiInputLabel","formControl","animated","MuiInputAdornment","positionStart","positionEnd","MuiSvgIcon","fontSizeSmall","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","MuiMenuItem","MuiPickersDatePickerRoot","toolbarLandscape","dateLandscape","MuiPickerDTToolbar","MuiDrawer","sharp","enteringScreen","leavingScreen","up","MuiPickersToolbar","MuiPickersToolbarButton","toolbarBtn","MuiPickersToolbarText","toolbarTxt","toolbarBtnSelected","MuiAutocomplete","MuiTooltip","darkTheme","grey","green","animalsThemeSettings","h5","h6","body1","body2","CreateTheme","baseTheme","createMuiTheme","getBaseTheme","defaultAmPm","AmPmPicker","UserProfileLink","twoRows","UserFormatResult","assetCampusUrl","publicCampusUrl","CampusPicker","isAuth","CampusByServiceGroupFilter","assetRoomUrl","LocationsUrl","RoomPicker","RoomByBuildingFilter","initServiceGroupsMultiData","initFiltersServiceGroupsData","ServiceGroupByDivisionsFilter","ServiceGroupsPicker","ButtonConfirm","confirmationDialogTitle","confirmationDialogBody","AreYouSure","getRunTypeOptions","getRunTypeValue","runtype","RunTypePicker","RequiredFieldsContext","createContext","requiredFields","ValidationSchemaProvider","skipValidation","describe","fieldValidationSchema","getIn","tests","Provider","useIsRequired","useContext","InvoiceDetailsSidePanel","InvoiceDetailsSidePanelLink","InvoiceDetails","Toggle","Switch","BasicToggle","isChecked","setIsChecked","withInfoLabel","baseLabelStyle","FormGroup","control","useResponseModel","NoAuthNodes","HasChildNodes","ResourceKey","reg_NewUserRegistration","RootNode","HideReact","isAdminNode","ParentNode","Hide","searchItem","irurl","chitem","rurl","rpath","prurl","purl","rurl1","getCurrentMainNode","currentMainNodeIsAdmin","getAdminNodes","getUserNodes","parentNodes","childNodes","currentPathNameLowered","elementPathName","newSearch","getCurrentNodes","currentNode","findNode","StyledTopBar","drawerWidth","ProfileSection","StyledUserMenu","ActionIconButton","SwitchTarget","updateX","openReservation","openWorkOrder","SwitchToReservationTitle","SwitchToDowntime","setSelectedOption","WorkOrder","Comments","commentType","defaultComment","cannotComment","emailType","changed","setChanged","comments","onCommentAdded","finally","withMentions","Invoice","referenceName","ReferenceType","OfflineForm","connectedFiltersFormRef","onBatchClick","serviceSettings","connectedData","connectedInit","serviceChangeState","batchRequested","quantityChanged","setQuantityChanged","allIsValid","setAllIsValid","IsAdminOfService","setTouched","setError","validateForms","DefaultBudget","DefaultExperiment","otherServiceSchema","optional","err_Quantity_required","err_IntQuantityOnly","err_InventoryBatch_required","Details","ServiceGroupServicesAllowed","ConnectedFiltersControl","serviceTypeEnum","formIsValid","startTimeLabel","LogDateTimeLabel","startLabelInline","forceDisabled","FormInventoryBatchPicker","EditSelectedBatch","AddNewBatch","precision","offlineService","creditProccessing","creditCompleted","showCalculateCredit","setShowCalculateCredit","handleCalculateCredit","handleCalculateClose","CalculatePricing_info","CalculatePricing","topButtons","OfflineServiceCharges","refType","refId","EditOfflineServiceTitle","AddNewOfflineService","ConsumableLog","stid","Pricing_EstimatedCost","PricingConfirmationOfflineEditText1","PricingConfirmationOfflineText1","Pricing_Balance","Pricing_BalanceResult","CultureName","UserGroups","AdminEquipments","AdminServiceGroups","InstrumentEventsGroups","CreatableGroups","HasRegisterableServiceGroups","FormatedName","HasNotifications","HasOptOutCoreSelection","CalendarType","HasSignedTermsOfUse","IsActiveDirectory","IsLabTech","CreateNewAssetsAdmin","IsAllAdminGroupPermissions","IsAllServicesAdmin","IsAllLabTechGroupPermissions","IsAllServicesLabTech","baseRoles","odjRoles","BookitDateTimePicker","dateId","timeId","dateName","timeName","dateLabelInline","timeLabelInline","parsedValue","setTimeValue","setDateError","handleDateChange","finalValue","getSeconds","handleTimeChange","dateError","timeError","setTimeError","handleOnError","onDateError","onTimeError","noLabelInline","datePlaceholder","timePlaceholder","CatRateTypes","ViewLengthsArray","viewLengthOptions","shortName","viewTypeOptions","visibility","hasPopupIcon","hasClearIcon","clearIndicatorDirty","popperDisablePortal","outline","disabledOpacity","InvoiceStatuses","selectPrintPDF","printPDF","selectPrintPDFPrinting","selectPrintPDFisLoading","DATE_PERIODS","DatePeriodsPicker","getOptionsCallback","MAX_SIZE_DEFAULT","defaultImgSrc","AssetThumbImage","hasImgeBroken","setHasImgeBroken","avatar","maxSize","getContrastText","FormAutocompleteOptions","FormAutocomplete","FormAutocompleteMultiOptions","FormAutocompleteMulti","ExternalApi","formFieldId","isMultiple","OptionsSourceType","deserializeOptions","optsArray","opt","o","CustomFormDropDown","externalLoadData","getBlackColorOption","getColorOption","isExport","expaneded","customparams","getPredicates","serializeSchedulerDateOrUndefined","formType","updateOption","reccurentAssetId","recurrentGroupId","alertTypeId","added","operation","Values","rowValues","getArray","modelValue","assetBuildingUrl","publicBuildingUrl","BuildingPicker","assetBaseUrl","AssetCatGroupPicker","noGlobalServiceGroupFilter","handleBadRequest","ModelState","ms","InstitutePicker","DepartmentPicker","AssetCatPicker","initLocationData","LocationPicker","ReservationEditButton","useReservationEditBehavior","ReservationEditButtonLink","legacyURL","Edit","InstituteTypePicker","DEFAULT_WIDTH","textValue","tryCleanValue","titleValue","parsedTitle","htmlParse","maxChars","toCharsWidth","data-html","TruncatedDescriptionText","Styled","toCssWidth","BasicCard","cardContent","iconTitle","maxContentHeight","imgError","setImageError","imageDimensions","setImageDimensions","backgroundSize","imageUrl","Image","onload","loadImage","showHeader","contentHeight","mouseUp","setMouseUp","trimTitleText","trimmedTitle","trimSize","StyledCard","cardActive","cardInfo","cardSuccess","cardWarning","cardError","position_vertical","position_horizontal","cardSize_small","cardSize_medium","onMouseEnter","onMouseLeave","onMouseUp","ImageContainer","mobileSizeMedium","mobileSizeSmall","onLoadedMetadata","onLoad","onClickCapture","imageRendering","backgroundBlendMode","BasicCardWithInfo","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","useGlobalServiceGroupsFilter","applyGlobalServiceGroupsFilter","gloabalSettings","additionalFilters","multipleServiceGroups","filterSettingToCondition","extractValuePart","FormUsersPicker","OnlineServiceType","getSingleOnlineServiceType","initOnlineServiceTypeData","OnlineServiceTypePicker","roomsEnabled","RoomUserRoleEnabled","Software","LocalApp","Relay","IpRelay","WebRelayTm","WebRelayX600m","UsageForm","LoanDesk","DoorAccess","NiDAQmx","KmTronicRelay","RaspberryPi","GetAvailableOnlineServiceTypes","WorkButton","buttonName","getAssets","setAssets","workTypes","setWorkTypes","workTypeLoading","setWorkTypeLoading","assetLoading","setAssetLoading","handleAssetChange","getParamFromUrl","AddEvent","wrap","QuickWorkOrderPleaseSelectAssets","Asset","wt","AssetAlertType","Up","sympt","aStatus","aStart","sid","handleWorkTypeClick","NoAlertTypesFoundForSelectedAssets","onlineUrl","initMyAssetAvailabilityTypeMultiData","initMyAssetAvailabilityTypeOnlineMultiData","MyAssetAvailabilityTypeMultiPicker","filterLengs","badgeContent","showZero","myAssetsDefaultFilters","AdvancedAssetSearchFilterAttributes","initAssetMultiData","AssetMultiFilter","CampusPickerFilter","initLockersData","LockersFilter","CreatedSince","ActiveAssets","InstrumentType","initAssemblyTypeData","AssetTypesFilter","OperationType","OnlineServiceTypeFilter","Areas","initAreasData","AreasFilter","LocationList","LocationPickerFilter","SubLocationsList","initSubLocationListData","SubLocationFilter","InstrumentCat","InstrumentCatFilter","initInstrumentCatData","initStatusData","StatusFilter","LocationTracking","LocationNotUpdatedSince","initLoanableData","LoanableFilter","initTagsData","TagsFilter","AssetCatName","AvailabilityTypeAvailableMultiFilter","ResourceServiceType","initServiceTypeEnumData","ServiceTypeEnumFilter","UserAssetContactMultiFilter","EquipmentExperts","ShowAssemblyParts","UsageStatus","Range","RangeWeight","getDisplay","RangekN","RangeTemperature","RangeArea","RangeVolume","RangeAmount","AssetsSelectionTable","primaryMultiAction","multiModeDisabled","useRecentAssets","RecentAssets","actionType","customPredicates","isShortView","emptyTable","admins","canExportAssetRanges","AssetCat","AssetCatGroup","POnumber","AssetAccessories","Contacts","Experts","Suppliers","ShortDescription","MainSpecRange","multiAssetSelectionMode","setMultiAssetSelectionMode","setSelectedRowIds","setCurrentMode","currentModeRef","loacalAssets","setLoacalAssets","localAssetsRef","getMyListFilter","getColumns","selectedRowActions","sg","selectedRws","toggleAll","toggleSingle","DeleteSelectedCard_info","onSelectChange","selectedRowDefaultActions","GetSelectedActions","canPrintOrExport","isShowAllCores","handleRowsChange","handleSingleChange","oldAssets","TTable","DefaultFilter","AssetSearch","mode","canSwitch","isSelected","selectAssetsSelection","assetsSelection","selectAssetsSelectionFilters","RecentContent","fetchRecentAssets","recentAssets","setRecentAssets","fetchRecentAssetsState","fetchRecentAssetsPromise","recentShort","AssetsSelection","serviceIds","offTypeIds","requestTypeIds","appSettingsAction","openRequest","setOpenRequest","requestId","setRequestId","selectedAssets","setSelectedAssets","schedActions","pagelink","offActions","continueTo","createOffline","addTrainingSession","startUsage","useAddNewActions","allowMultiToggle","allowAllCoresToggle","setfilterCallback","availabilityTypesArray","CreateReservation","SelectConsumables","CreateRequest","CreateAWorkOrder","AddTrainingSession","InstrumentAssetSearch","noTableData","NoConsumablesHeadTitle","NoConsumablesTitle","primaryRecentAction","AvailabilityTypeName","notAvailable","handleSearchAllCores","SearchAllCores","menu_MyInstrumentsAssets","CreateNewRequest","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","purlSearchParams","schedulerServices","selectedMultipleEvents","handleEdit","handleCreate","selectedEquipment","Schedule","Messages","TrainingStatus","PrerequisiteFor","RestrictionsApi","UserOwnPermissions","onUserChange","permLoading","restrictedOption","handleUserChange","userIsAdmin","ShowRestrictionsFor","PleaseSelectAUser","clearOnBlur","permRoot","Valid","contentRow","PermissionName","TimeSlotTypeName","TimeSlotTypeId","NoAdditionalRestrictionsFound","res_err_Permissions_StaffOnly","cardTitle","titleOverRule","rowTitle","rowText","cardActions","cardActionsButtons","restUrl","UserPermissionsApi","showTable","initUser","authuser","equipmentId","setEquipmentId","equipmentGroupId","setEquipmentGroupId","selectedService","setSelectedService","convertAuthToIUserFilterDto","selectedUser","setSelectedUser","fetchRestrictions","restrictions","setRestriction","fetchRestrictionsState","fetchRestrictionsPromise","userRestrictions","setUserRestrictions","fetchUserRestrictions","username","fetchUserRestrictionsState","fetchUserRestrictionsPromise","fetchAsset","fetchAssetState","fetchAssetPromise","getStatus","validRender","PrerequisiteTrainingsIndicators","found","CoreWideRequirement","prerequisites","preq","usrrest","userOnChange","assetOnChange","RenderContent","Resource","Permissions","Passed","Expired","PreApproved","PreApproved_info","MinReservationOrder","MaxReservationOrder","CarryOverTimeSlotTypeId","BypassQuotas","BypassQuotasForReservations","BypassUserQuotasAndGaps","BypassUserQuotasAndGapsD","BypassUserQuotasAndGapsD_Description","BypassUserQuotasAndGapsD_DescriptionCont","BypassMinResDurationD","BypassMinResDurationT","BypassMinResDurationD_DescriptionCont","AdditionalRestrictions","SpecificUserSlotPermissions_info","ReservationRestrictions","GetBooleanFilterOptions","BooleanPicker","hideAlert","useDialogAlertSlice","_log","errorInfo","TitleSection","ShortTitle","showCopy","setShowCopy","copied","setCopied","truncatedTitle","cliTruncate","absolutePageLink","iconSize","initSampleTypeData","SampleTypePicker","domNode","attribs","class","attributes","tableRoot","filterPanel","tableButtonsLeftShort","divider","nonEmpty","singleValueToId","mapped","haidProject","group","combineMandatoryOfflineServices","Trainer","RemainedSlots","MaxAttendees_NA","TrainingSessionPicker","PleaseSelectATRainingSession","ReservRelatedFilter","RemindBeforePicker","initValue","initids","getGetUserSelectionsAutocompleteFn","CustomFormUserSelection","selectRepetitive","selectRepetitiveData","selectRepetitiveFieldHandler","RepetitiveFor","ServiceGroupRegistrationStatus","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","stopImmediatePropagation","NotFound","AddConsumable","InventoryBatchChip","renderService","onServiceClick","onAddBatchClick","renewStock","handleServiceChange","onRenewStockClick","savedCreatableRenewal","handleBatchListClose","availableBatches","currentBatch","handleChipSelect","InventoryBatchEmptyGenerateOn_info","InventoryBatchEmptyGenerateOff_info","InventoryBatch_notFound","handleBatchListOpen","InventoryBatchList","addNewBatchClick","selectedBatch","showRenewStockButtons","createdRenewal","batchId","batches","QuickItem","QuickServiceItem","mandatory","handleRemove","createdEditable","errorMessage","setErrorMessage","handleAddError","setQuantity","counterUpdated","setCounterUpdated","arrowTitle","RenewStockArrow_info","ReservationOfflineServiceEditArrow_info","ConsumableCreateArrow_info","ReservationOfflineServiceCreateArrow_info","serviceChange","change","withError","err_LowQuantity","err_HighQuantity","OfflineServiceMandatory_info","valid","StyledBaseTextField","spin","AddCoverConsumable","onAddClick","AddServiceFromSelection","addServices","removeServices","addAndRemoveServices","newSelectedServices","updated","setUpdated","isBarcodeScanned","iconScann","ScannerView","BarcodeScannViewDescription","QuickServiceItems","BookQuickServices","refreshServices","refreshCosumables","offlineActions","initServicesFunc","onServiceRemove","onServicesRemove","onServiceUpdate","createServiceFromServiceType","createServicesFromServiceType","loadSeviceTypes","userName","useAssetSelection","onAddAndRemoveServices","fetchServices","currentUser","serviceCreated","setServiceCreated","setServices","fetchServicesState","fetchServicesPromise","handleRemoveService","handleAddService","StokRenewed","handleAddServices","handleRemoveServices","newServices","handleAddAndRemoveServices","staticServices","addedServ","focusedService","hasServices","selParams","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","msg_DeleteFile","rawName","suffix","shortenName","Delete","err_DeleteFileFailure","AddComment","bindSubmitComment","setFiles","formRef","commentFilesChanged","setCommentFilesChanged","scrollIntoView","behavior","block","inline","userSchema","Users","initial","comment","onFileChange","resetForm","getFieldHelpers","VisibleToUsers","fixedWidth","WriteAComment","Input","CommentCell","onEditComment","onDeleteComment","setHover","setEdit","currentUserComment","CreatedBy","newComment","Avatar","CreatedAt","CommentsContainer","emailBody","emailSubject","shouldSendEmail","setCount","sortedComments","writeCommentOpen","setWriteCommentOpen","sendMail","useSendMail","createEmail","DefaultEmailTemplateBody","DefaultEmailTemplateSubject","DefaultPageName","DefaultReferenceName","CommentsCount","Comments_EmptyMessage","Subject","renderToStaticMarkup","SaveToLog","Cc","Bcc","RenewStockForm","renewStockSchema","err_DateReceived_required","NotAllowNegativeInventory_currentEqualsZero_err","NotAllowNegativeInventory_currentMoreThanZero_err","RenewStockInfo","ReceivedDateTimeLabel","renewStockData","RenewStockOfConsumables","InvoiceChildRowBaseSchema","PleaseSelectABudgetNumber","PleaseSelectServiceGroup","PleaseSelectADate","BudgetExperimentStatuses","syncSchedulerEvents","_events","mappedEventIds","getState","min_date","max_date","mapfn","usePrevious","SamplePlatePositionNamingTypes","CustomFormApi","customFormId","CustomFormContent","validationEnabled","sectionStyles","isVisibleField","sortedActiveFormFields","formName","setInitialValues","CustomFormControl","FormType","onLoadCompleted","onLoadStarted","originalFiles","setOriginalFiles","fetchCustomForm","loadValue","fieldId","InitFormFiles","resvalue","fetchFormValues","getFormValues","fetchFormState","fetchFormPromise","loadedValues","setValues","serializedvalues","vals","portalRef","Portal","useAdminPermissions","allowedToEdit","allowedToAdd","HasCreateAdminGroupPermissions","allowedToEditOffline","allowedToAddOffline","allowedToEditBatch","hasRolePermissions","Api","ConfigurableColumns","TemplateColumns","ScreenId","Iad","none","iad","ImportTemplate","Ext","ext","ExportForImport","importImages","maxContentLength","ExportImportActions","Export","ImportImages","initServiceRequestStatusMultiData","ServiceRequestStatusMultiPicker","exclude","NotFoundPage","Wrapper","DivStyle","viewBox","fill","xmlns","clipPath","stroke","stroke-width","stroke-linecap","stroke-linejoin","stroke-miterlimit","Radio","RadioIconUnchecked","RadioIconChecked","filterByServiceGroups","ServiceGroups","BillingActionsApi","insertBillingActionsDetails","updateBillingActionsDetails","deleteBillingActionsDetails","billingActionIds","getBillingActions","screen","getBillingActionById","billingActionId","getBillingActionInvoices","batchInvoiceIds","processEmailAction","billingActionsParams","invoiceIds","ProcessSftpUploadAction","processStatusAction","getRecipientsEmailAddresses","billingActionsRow","emailTypes","EmailRecipientTypes","ShowOn","specEmailAddresses","SpecificEmailAddresses","PaymentMethods","PaymentApi","AddPayment","payment","MethodId","Method","ShouldCloseInvoice","UpdatePayment","paymentId","FormRow","hideRow","selectSamplePlates","samplePlates","selectSamplePlatesData","selectSamplePlatesTableState","selectSamplePlatesCreate","selectBulkSamplePlatesCreate","selectSamplePlatesUpdate","UnitTypePicker","getLoadData","bookitlab","BookitLab","TransformDate","ctx","isType","FormRestrictedUserGroupPicker","StatusFilterId","IncludeStatus","SaveFormButton","TrainingActivationAllowedBySGAOnly","UpdateActiveTrainingWarningTitle","DeactivateTrainingMessage","Update","ActivateButton","DeactivateTraining","Deactivate","WorkOrderPicker","WorkOrdersCalibrationFilter","woTypeId","excludeIds","loadWorkOrders","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","positive","TotalOverhead","Equipment","SecondaryEquipment","CreateReservationComponent","runDetails","save","setSave","formikRef","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","validUpdate","Suffix","PopupSuffixComponent","handleSubmitk","AnalyticalSampleIDSuffix","AnalyticalSampleIDSuffix_info","Continue","AnalyticalSampleIDSuffixPopup","SuffixDialog","disableBackdropClick","disableEscapeKeyDown","aria-labelledby","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","SampleType","SamplePlatePicker","TargetSamplePlatePositionPicker","ExportForRobot","useConfigurableColumnsAdvanced","SampleRunsDetails","handleDownloadTemplateClick","DownloadTemplateRunDetailsSamples","SamplesAutomation","hideImportButton","RunDetailsPageInstructions","ExportRunDetailsSamples","paddingX","Card","CardContent","uploadStyle","buttonRoot","buttonLabel","dividerRoot","previewContainer","previewIconAndText","previewIcon","previewText","previewTextSize","previewCloseButton","previewCloseButtonIcon","FileView","fileName","prettyBytes","maximumFractionDigits","mimeType","fileUrl","webkitRelativePath","previewImg","downloadClick","Download","FileInput","uploadLabel","errorMesage","FilesPreview","FileUpload","showPreview","saveFiles","fileInputProps","innerFiles","setInnerFiles","fileValues","setFileValues","updateFiles","deleteFileName","savedFiles","convertFilesToArray","gridRowGap","updatedFiles","newFiles","addNewFiles","FormInputFile","helper","EmailNotificationsApi","NOTIFICATIONS_LOG_PAGE_PATH","EmailNotificationsPage","withGlobalServiceGroupFilter","scopeOfMonth","DeleteEmailNotficationsMonth","EmailNotficationsScreenWarning","isMainAdmin","Timestamp","Recipient","RecipientName","EmailTo","EmailCc","EmailBcc","EmailMessage","AssetRenderer","Attachment","DeleteEmailNotificationsRows_info","DeleteRows","ConfirmDeleteEmailNotif_title","ConfirmDeleteEmailNotif_message","OK","postData","DeleteNotifications_success","DeleteNotifications_error","menu_EmailNotifications","WebkitBoxShadow","WebkitTextFillColor","caretColor","inputTypeSearch","forwardRef","inputComponent","ButtonLink","StyledLink","GetResponseMessages","infoText","initProjectData","ProjectFilter","AllBudgets","UserDisciplinePicker","loadPublicData","UserDisciplinePublicPicker","getQrUrl","urlTemplate","InternalCode","assetDetails","AssetBarcodeUrlTemplate","getAssetQrUrl","Handlebars","compile","getQrUrlH","generateLabel","labelXml","assetData","dymo","framework","openLabelXml","objectMapping","getObjectMapping","objectName","writeData","splittedData","SubLocationName","setObjectText","staticObjectNames","getObjectNames","nameParts","assetPropertyName","properties","shift","getValue","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","initInvoiceIdData","InvoiceIdMultiPicker","initServiceTypeData","ServiceTypePicker","withServiceGroupFilter","initTrainingLevelData","TrainingLevelPicker","TrainingLevelFilter","trainingLevelPermissionsEnabled","userPermissionsEnabled","eq","UseServiceGroupTrainingLevels","BookitlabLogo","BookitlabLoginLogo","AreasPicker","filterRoot","scrollPaperCompact","useGlobalDOMEvents","keyup","Filters","PaperComponent","StyledDialogPaper","BackdropProps","invisible","ClearAll","clickAway","clickAwayFunc","ServiceGroupsFilter","EmailType","EmailTypeUnionArray","ImageRenderer","assetTagsUrl","publicAssetTagsUrl","intIds","strIds","TagsPicker","LoanTypeOptions","LoanablePicker","StatusPicker","LockersPicker","SubLocationListPicker","serviceGroup","objectFit","CustomerLogo","customerLink","setCustomerLink","customerImg","setCustomerImg","TopCustomerLogoLink","TopCustomerLogo","CompanyLogo","BaseToggleButton","mainIcon","separated","ToggleButton","BaseToggleButtonGroupInner","otherOptions","toggleValue","setToggleValue","handleOtherChange","handleToggleValue","newViewType","ToggleButtonGroup","errorBorder","fullWidthButton","hasStartIcon","hasEndIcon","hasMainIcon","withTitle","Other","BaseToggleButtonGroup","AssemblyTypes","AssemblyTypePicker","useRemoveSearch","useAsyncDebounce","Search","allFiltersLength","BudgetNumber","loadBookableData","AvailabilityTypeBookablePicker","excludeFroExport","configurableColumnsExport","GetTargetColumns","columnsToRemove","ExcludeColumns","getEquipmentIds","bookMultiple","getAssetIds","alertslink","aid","menu_WorkOrders","useAssetsPermissions","Popover","rootMobile","elevation","closeButtonTitle","bringBackUp","menu_EditWorkOrder","fetchDownOrders","downOrders","setDownOrders","fetchOrdersState","fetchOrdersPromise","calendarLinkParams","calendarLink","downTime","BringBackUpOnWorkOrders","BringBackUpOnCalendar","SceletonBox","cp","StyledToolbar","CardGrid","AddChargeButton","singleAdminServiceGroup","ServiceGroupBudgetsAdmin","AddCharge","AddManualInvoiceLine","withoutGlobalServiceGroupFilter","ReservationCreateButton","instruments","SamplePlatePositionPicker","SourceSamplePlatePositionPicker","onImportButtonClick","getSinglePaymentMethod","PaymentMethodEnumPicker","getSinglePriceSheetMethod","PriceSheetMethodPicker","baseUrl","initSuperGroupData","SuperGroupPicker","DecimalRenderer","getSingleServiceTypeEnum","ServiceTypeEnumPicker","Workflow","Workflows","GetAvailableServiceTypes","DateField","ServiceRequestStatusPicker","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","ConvertNewToComment","newcomment","WorkOrderComments","commentsFormRef","doSaveComments","setchanged","newSavedComments","setNewSavedComments","newComments","setNewComments","saveComments","referenceIds","AddCalibrationWorkOrder","workOrederIds","workOrederTypeId","saveLinkedOrders","setAsset","setWorkOrder","workOrderType","setWorkOrderType","fetchWorkOrderType","woId","handleWorkTypeChange","handleWorkOrderChange","LinkWorkOrder","bindPopover","AddCalibrationReference","PleaseSelectAnAlertType","PleaseSelectACalibration","HoverLinkedItem","linked","useHoverButton","onHoverClick","hoverIcon","HoverLinkedItems","onItemClcik","Linked","rotate","getLength","WorkOrderLinks","links","countLinks","LinkedWorkOrders","Collapse","unmountOnExit","WorkOrderForm","handleTypeChange","repetitiveFormRef","workOrderTypeFormRef","workOrderStaffFormRef","readonlyDetails","canView","onAssetClicked","setWorkOrderOfflineStartChangedValue","setWorkOrderOfflineEndChangedValue","onLinkedClick","bringUp","overlaps","unlimitedDowntime","setUnlimitedDowntime","typeChanged","setTypeChanged","downTimeChanged","setDownTimeChanged","remindBeforeChanged","setRemindBeforeChanged","setOriginalSubFormFiles","setOriginalStaffFormFiles","linkedWorkOrders","Links","updateFormValues","coming","orn","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","users","changeLinkedOrders","orders","addedOrders","removedOrders","removeCalibrationOrder","addCalibrationOrder","handleOfflineEventStartChange","handleOfflineEventEndChange","warningMessages","nodes","InstrumentHasOverlappingDowntimeEvents","ShowAllDowntimeEventsOn","produce","isInitialValid","assetCatId","LockedClosedRecord","EventDetails","PleaseSelectAsset","PleaseSelectAnAssigneeUser","PleaseSelectAnAlertTypeStatus","ReportSymptoms","PleaseSelectAnAlertSymptomCode","RepairCodesEnabled","PleaseSelectAnAlertRepairCode","EventDueDateTimeLabel","RemindMeBefore_Description","PleaseSelectAReasonType","OfflineRemarksPlaceholder","SubmissionFormDetails","RepetitiveControl","StaffFilledForm","PleaseSelectCustomForm","shallowEqual","repetitiveValues","sendOfflineEmail","sendOfflineProcessing","sendOfflineData","sendEmailCompleted","createModel","editModel","requestCreateCompleted","requestUpdateCompleted","hasCreateProcessing","hasUpdateUpdateProcessing","hasCreateError","hasUpdateError","showConfirmRecurring","setShowConfirmRecurring","showDeleteRecurring","setShowDeleteRecurring","showSendEmail","setShowSendEmail","showCloseStatus","setShowCloseStatus","closedStatus","setClosedStatus","radioNotifyUsersValue","setRadioNotifyUsersValue","radioCancelAffectedReservationsValue","setRadioCancelAffectedReservationsValue","workOrderOfflineStartChangedValue","workOrderOfflineEndChangedValue","isCloseWorkOrderClicked","setIsCloseWorkOrderClicked","hasProcessing","baseModel","IsAllInstrumentEventsGroupPermissions","viewPermissions","typeName","setTypeName","reservationSwithProps","eqids","submitCommentRef","subFormFiles","handleCancelClick","orderType","handleUpdateAllRecurrent","handleDeleteOrder","OnlyMainOrResourceWorkOrdersAdminCanDeleteCalibrationRecords","Failed","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","justifySelf","WorkOrderRestrictedNotAllowed","UpdateDowntimeAdditionalActions","CreateDowntimeAdditionalActions","TheDowntimePeriodHasChangedNotifyUsers","NotifyUsers","isChangedStartDowntimeShorter","isChangedEndDowntimeShorter","isChangedDowntimeShorter","CancelAffectedReservations","UpdateDowntime","CreateDowntime","UpdateRecurringEventsTitle","EventRepeatConfirmationMessage","JustThisOne","UpdateAllRecurringEvents","DeleteRecurringEvents","DeleteAllRecurringEvents","DeleteAllFutureRecurringEvents","YouAreClosingCalibrationRecord","RecordWillBeNotEditableAfterClosing","UserTrainingApi","trainings","approve","ur","AllowBookingFromTrainingDate","ExpiredDate","MustOrderEveryDays","MustUseEveryDays","RequiresAdminApproval","Reservations","TrainerId","TrainingDate","TrainingLevelId","TrainingLevel","TrainingLevelName","UnhideServiceGroup","TrainingProgramId","TrainingProgramName","duUpdateTraining","doApproveRejectReservations","doActivate","trainingSaga","initCreateTraining_Success","initCreateTraining_Error","initUpdateTraining_Success","initUpdateTraining_Error","trainingsResponse","TrainingDetails","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","TrainerName","setReservationsUpdateState","trainingActions","selectTraining","selectInitTrainingProcessing","selectCreateTraining","selectUpdateTraining","selectCreateTrainingCompleted","selectUpdateTrainingCompleted","selectCreateTrainingHasError","selectUpdateTrainingHasError","selectShowApproveReservatiions","selectShowRejectReservatiions","selectReservatiionsData","selectReservatiionsProcessing","selectReservatiionsUpdateCompleted","formatName","TrainingResevationsPicker","trainingDate","tDate","strDate","FormTrainingReservationsPicker","FormTrainingLevelPicker","UserTrainingComments","menu_EditUserTraining","UserTrainingForm","onEquipmentClicked","TrainingLevelPermissions","usersShema","equipmentShema","err_UserNameRequired","err_OnlineServiceFieldRequired","ServiceType_Online","err_TrainingDateFieldRequired","err_TrainerIsRequired","activeDisabled","resDisbaled","setResDisbaled","allowBookingDisbaled","setAllowBookingDisbaled","setAllowBookingVisible","setEquipmentChanged","userChanged","setUserChanged","trDateChanged","setTrDateChanged","trLevelChanged","setTrLevelChanged","handleEquipmentChange","handleTrDateChange","handleTrLevelChange","ExpiredDays","UserTrainingTopMessage","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","equId","equIds","fatherId","rid","showApprove","setShowApprove","showReject","setShowReject","approveReservations","rejectReservations","reservationProcessing","relatedReservations","updateResCompleted","editTraining","currenTrainingServiceGroupId","activateAllowed","handleActivateTraining","handleReject","handleApprove","handleResCancel","ActivateTraining","UserTrainingModificationHistory","menu_UserTraining","menu_AddNewUserTraining","RejectAllReservations","UserTraining_ReviseReservations","RejectAll","ApproveAllReservations","UserTraining_ApproveReservations","ApproveAll","Prog4biz","BookitlabCopyrightNoticeTitle","SoftwareBy","SystemTime","TermsOfUse","CopyrightSection","Copyright","webVersion","lastUpdate","appOffset","appNow","setAppNow","interval","setInterval","clearInterval","align","disableVersionOnMobile","actionsStyles","BasicDialogActions","titleContainer","titleSubtitle","closeButton","BasicDialogContentWithTitle","titles","formContainer","MuiDialogContent","BasicDialog","dialogStyles","doeRefreshReservations","addReservations","addUsages","addLoanDesks","addCalendarMessages","doGotIt","messagesSaga","calendarUrl","_action","reservationsInValue","_i","reservationStarted","usagesInValue","usages","usageReservation","LoanDeskInValue","LoanDesks","loadDesk","withNull","calendarInValue","calendars","calendar","gotIt","refreshUsages","clear","messagesActions","useMessagesSlice","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","Submit","rootMobileHorizontal","poperPaper","poperRoot","poperTitle","PopperTitle","poperTditle","RichTextEditor","useLayoutEffect","setConfigurableColumns","loadConfigurableColumns","WrongColumnDefinition_info","fetchConfigState","getConfigurableColumns","setConfigurableColumnsExport","loadConfigurableColumnsExport","fetchExport","publicSub","redirUrl","ReturnUrl","SectionTitle","setProcessing","handleExportForImport","rowsCallback","toBigQS","selectedRows","exportRows","MaxRecordsAllowedAssetImport","messageLongQS","err_ImportForExportFailed_longQS","deffMessage","err_ImportForExportFailed","showSingleExportButton","ExportButtonTooltip","ExportToXLSX","DownloadTemplate","func","allActions","indx","setItems","FilterChip","FilterDisplay","GetPresetDatesRangeDisplayString","ConfigurableColumnsLink","Columns","ArticlesExternalSearchPagePath","ArticlesExternalSearchPage","applyForceFullDayReservations","forceFullDayReservations","pick","truncatedEndTime","adjustSchedulerEventTimes","flow","partialRight","fileId","buttonId","ImportRecordsDescription","ImportRecordsSteps","ToImportNewRecords","UploadTheUpdatedFile","patternOrChannel","keyfn","fork","tasks","isKeyEmpty","task","getServiceRequestTicketTitle","ServiceRequest","ParentTicketDetailsButton","MainTicket","FormAdminUsersPicker","FormAdminSingleUsersPicker","InvoiceTemplatesApi","insertInvoiceTemplate","invoiceTemplate","HeaderFile","FooterFile","updateInvoiceTemplate","deleteInvoiceTemplates","invoiceTemplatesIds","getInvoiceTemplateById","SummuryBox","ErrorsSummury","CheckBoxGroup","isRow","labelPlacement","FormCheckBoxGroup","EveryDaysPicker","FormEveryDaysPicker","RepeatMonthlyByPicker","FormRepeatMonthlyByPicker","RepeatPeriodPicker","FormRepeatPeriodPicker","RepetitiveOptionsPicker","withParamsFilter","FormRepetitiveOptionsPicker","RepetitiveSchema","Until","err_RepeatUntilDateLessThanStart","err_AlertInvalidRecurringUntilDate","err_PepeatsOnDaysRequired","RepetitiveForm","RepetitiveData","recurringChanged","setRecurringChanged","repeatPeriodChanged","setRepeatPeriodChanged","repeatEndChanged","setRepeatEndChanged","reserFieldHandler","leftSideSections","RepetitiveReservation","RepeatsEvery","saveRepetitive","setInitData","AllowCreateInvoicesBy","ChargeApi","OtherService","BaseRate","CatRateTypeId","FeeType","SampleTypeId","ActualRate","FormCatRateTypePicker","CatRateTypePicker","OfflineServicePicker","FormOfflineServicePicker","FormSampleTypePicker","FormServiceUserGroupPicker","ServiceUserGroupPicker","serviceGroupPredicate","notifyActions","submitRef","closeApproved","closeRejected","insertedAt","setinsertedAt","insertedBy","setinsertedBy","userGroupByBudeget","invoiceId","budget","Manual","setInitialValue","OnlineServiceId","OnlineService","CatRateType","SampleServiceId","SampleService","isMounted","queryBudg","budgetRes","serviceGroupRes","budegtval","refreshTable","submit","success_EditInvoiceLine","msg_addedChargeSuccessfully","budgetOnly","CreateInovicesBy","AlllowCreateInvoicesBy_BudgetsOnly","ChargeSchema","catRateType","Refund","negative","GetChargeSchema","ChargeForm","setAmount","rate","bySystemSetting","manual","Charge","budgetExperimentsFilter","resStart","resEnd","BudgetExperimentsPicker","loadBudgetExperiments","FormBudgetExperimentsPicker","UserGroupListener","userGroup","setUser","setBudget","initilized","setInitilized","UserNameListener","setUserGroup","BudgetListener","setBudgetExperiment","fetchBudgetExperiment","budgetExperiments","budg","HideExperiments","experiments","ConnectedFiltersForm","ConnectedFiltersData","endTimeLabel","endLabelInline","orderForConsumables","budgetPickerInfo","userGroupChanged","setUserGroupChanged","budgetChanged","setBudgetChanged","budgetExpirementChanged","setBudgetExpirementChanged","startTimeChanged","setStartTimeChanged","endTimeChanged","setEndTimeChanged","ConnectedFiltersSchema","BudgetIsRequired","res_err_BudgetExperimentRequired","err_UserGroupRequired","err_UserFieldRequired","_errEndTimeRequired","err_EndTimeLowerThanStartTime","updateDataState","editAllowed","createUpdateAllowed","SponsorDepartment_Desc","ReservationUser_Desc","saveConnectedFilters","PopupPrintToPDFDialog","boxcontainer","selectFileBox","infoBox","CheckBox","ServiceRequestSectionTypesArray","PopupPrintToPDFComponent","convertItemsToFlags","checkboxes","setCheckboxes","handleCheckboxChecked","preparing","PrintToPDFPopup","ServiceRequestMilestoneStatusPicker","FormServiceRequestMilestoneStatusPicker","ServiceRequestMilestoneDetails","toDto","updateCharge","handleSubmitButtonClick","toInitialValues","AddMilestone","Milestone","serviceRequestMilestoneSchema","currentStatus","newStatus","oneOf","FormUnitTypeTypePicker","FormServiceRequestMilestoneChargeServicePicker","ServiceRequestMilestoneChargeDetails","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","parsed","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","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","unit","beforeRange","beforeText","string","beforeMatch","after","afterRange","afterMatch","newMentions","getMentions","onMentionsChange","anchor","focus","EnterAUser","spellCheck","hotkey","isHotkey","nativeEvent","toggleMark","data-cy","char","isMarkActive","removeMark","addMark","MarkButton","useSlate","BlockButton","isBlockActive","toggleBlock","LIST_TYPES","isActive","isList","unwrapNodes","setNodes","wrapNodes","marks","StartRichEditor","isInline","isVoid","ReactDOM","createPortal","insertData","getData","fetch","insertImage","uri","fnRemoteImage","isImageUrl","isUrl","pop","imageExtensions","deleteBackward","deleteForward","insertBreak","isEditor","SlateElement","isElement","cellPath","Point","fragment","insertFragment","Element","Leaf","ImageElement","useSelected","useFocused","TrStyled","TdStyled","Mention","withPointer","initials","defaultText","PaymentMethodPicker","FormPaymentMethodPicker","sendResponse","success_EditInvoicePayment","err_EditInvoicePayment","err_InvoicePaymentAdd","setinitialValues","PaymentMethodName","PaymentSchema","err_PaymentMethodRequired","PleaseEnterAnAmount","InvalidValue","getPaymentSchema","PaymentSchemaWithBudgetNotRequired","getPaymentSchemaWithBudgetNotRequired","Paymentform","PaymentMethod","Payment","AddPaymentInvoice","checkboxProps","headerProps","checkIfRowIsSelectable","shouldSelectPage","checkIfAllSelectableRowsSelected","isSelectPage","getToggleAllPageRowsSelectedProps","indeterminate","getConditionalSelectHeaderCheckboxProps","checkProps","getConditionalSelectColumnCheckboxProps","getToggleRowExpandedProps","ScreenToShowOn","BillingPreviewApi","FormView1_UpdateItem","PercentageRenderer","downloadImages","downUrl","labelPrint","truncatedDate","dir","DeatilsOperations","internalIdLogin","selectInternalIdLogin","selectInternalIdLoginUserId","selectInternalIdLoginUserName","selectLoginType","CustomPickerFilter","initCustomPicker","CustomPicker","selectPublicAsset","publicAsset","selectSelectedUnitItem","selectSelectedUnitSearch","selectedData","dataSearch","selectMenuOpen","menuOpen","AddToLists","getEquipments","setLoadingCompleted","updateAssets","CreateList","EmailApi","err_SendEmailToUserFailed","ServiceTypeFilter","initReservationStatusData","NaN","ReservationStatusPicker","AssetWorkOrderMultiFilter","initServiceUserGroupData","ExportQRCodesButton","ExportQR","titleStyles","titleBody","disableTypography","dosetSelectedItem","dosetSelectedItems","dosetAssetPublicFilters","publicAssetSaga","setSelectedItem_Success","setSelectedItems_Success","selectRouterSearchParams","currValue","setAssetPublicFilters_success","setSelectedItem","setSelectedItems","setAssetPublicFilters","setMenuOpen","toggleMenuOpen","setGlobalSearchOpen","toggleGlobalSearchOpen","publicAssetActions","usePublicAssetSlice","selectRouterSlice","router","selectRouterLocation","selectRouterSearch","AddReservation","serviceIdsRawValue","PopupImport","downloadTemplateprocessing","setDownloadTemplateProcessing","ArticleDoiLink","doi","externalIdSource","externalId","doiId","tryGetDoiFromUrl","doiURL","externalIdSourceType","linkURL","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","initCatRateTypeData","bysSystemSetting","InvoiceRowReferenceRenderer","OfflineServiceId","SubscriptionId","ServiceFilter","arrayValue","propsValue","batchDeletable","removedBatch","setRemovedBatch","removeBatchOpen","setRemoveBatchOpen","DeleteBatchInventory_title","DeleteBatchInventory_message","useServiceIdAction","hrefPath","ID","back","ServiceIdRenderer","OperationTypeIdRenderer","InternalServiceRequestStatuses","useLocationChange","prevLocation","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","ActiveSampleTypesPicker","RelevantBudgetPicker","selectedBudget","budgets","IsDefault","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","ExportToExcel","sheetName","book","sheet","Excel","addWorksheet","workBook","workSheet","addRow","columnNames","GetObjectNames","AddWorkSheetHeader","GetObjectValues","SetWorkSheetHeader","AddWorkSheetData","xlsx","writeBuffer","buffer","InvoiceStatusPicker","OpenMenuButton","hoursDisabled","minutesDisabled","isHourOpen","setIsHourOpen","isMinuteOpen","setIsMinuteOpen","isAmPmOpen","setIsAmPmOpen","someOpen","ampmVal","UserRenderer","InvoiceRowReferenceLinks","references","menu_UsageDetails","SubscriptionDetails","getParams","ipid","servicedate","bid","be","ecid","po","factor","adg","dash_EmptyWidgetTitle","dash_EmptyWidgetBody","LoadingFailed","BudgetIsOnline","HasBalanceOrEstimatedCharges","Company","ViewTypeLengthDropDown","onTypeLengthChange","lengthOptions","haideCalendarViewType","customTimelineDays","customCalendarDays","titletext","itemText","vt","subheader","vl","ExportToPDF","debouncedOnChange","enabled","filtered","doGet","doExport","doBulkCreate","doDelete","doDeactivatePlates","doDeletePlates","getLoadDataParams","someResult","genratePlatesFromBulk","LastId","firstId","FirstId","log10","Prefix","plates","samplePlate","BasicCheckBox","AssetPickerFilter","InfiniteScroll","scrollableTarget","FrontendLayout_MainContent_ID","loader","QuizDetails","quizSubmissionId","fetchDataPromiseState","fetchDataPromise","backToQuizess","BackToQuizzes","Quiz","QuizzYourScoreIsXoutofY","Score","MaxScore","CongratulationsYouHavePassedTheQuiz","YouAreNowCertified","Level","QuizSuccessTestMessage","SorryThisDidNotWorkSoWell","QuizFailureTestMessage","SuperGroupFilter","UpdateStatuses","SourceUrl","DeleteRequests","osid","suppliersLabel","RequireSupplierExternalId","SupplierExternalId","HashSymbol","notShowTitle","Created","LifeDate","AssetType2Counter","Overdue","DueToday","ShortDescriptionOfInstrument","AreaMapId","RoomMapId","CoreName","ServiceGroupAssetId","Division","DivisionAssetId","Raac","BrandCode","Rank","GasSource","SGA_Public","UnderOriginalWarranty","WarrantyEndDateVisibleAllUsers","canview","AssemblyParent","AssemblyChilds","BookAppVersion","BookAppVersionUpdateDate","LateTime","EarlyLeaveTime","EarlyStartAllowedMinutes","CloneEquipmentSettings","menu_CloneEquipmentSettings","InvoiceIdRenderer","InvoiceBatchesComments","allowedRoles","CustomRole","InvoiceBatchesCommentsRenderer","initEquipmentsData","ReservationEquipmentsPicker","ReservationSingleEquipmentPicker","ReservationsEquipmentFilter","firstInitEquipments","mandatoryIds","FormReservationEquipmentsPicker","autoExpand","FormReservationStatusPicker","ReservationCustomForm","customForms","customFormRef","mandatoryForms","optionalForms","isAsyncChangeLoading","selectedForms","formValuesForms","formId","validateReservation","validateMinEnd","validateAccServices","allAcc","equipmentSettings","getWorkFlowName","StartTimeListener","initialStart","initialEnd","changeHandler","prevStartTime","setPrevStartTime","prevEndTime","setPrevEndTime","isStartChanged","setIsStartChanged","isEndChanged","setIsEndChanged","dt","prevEnd","EndTimeListener","setInitialized","ChipCheckBoxGroup","ChipLabelGroup","FormChipCheckBoxGroup","setOnChanged","FormChipLabelGroup","ReservationOfflineServices","savedServices","savedServiceEditable","reservationSettings","hanleUpdateLocalServices","fooBar","OfflineOptional","fetchServiceType","sortFunc","prepareService","ReservationOfflineServiceDefaultRemarks","staticService","initServices","servicesFiltered","onRemoveService","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","FormReservationBudgetExperimentPicker","fetchDefaultBudgetExperimentState","fetchDefaultBudgetExperiment","setValueRef","serializedServices","deserializedServices","componentDidMount","BudgetTaskBudgetId","tt","toto","isPathAndQuery","toLocationDescriptorObject","getReservationsLink","trainingSignUp","EditTrainingSessionLink","trainingSessionId","TrainingSignUpAdminAlertContent","totalUsedSlotsCount","TotalUsedSlots","TrainingSessionsCountMessage","ManageSignUps","EditTrainingSession","FormReservationTimePeriodPicker","StartTimePropertyName","startField","startMeta","EndTimePropertyName","endField","endMeta","endHelpers","getStoreValue","handleStartTimeChange","originalStartTime","originalEndTime","diff","adjustEndByStart","onStartTimeChange","handleEndTimeChange","formattedValue","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","FormWorkFlowBooking","useWorkFlowPicker","entityVal","ReservationForm","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","changeOfflineServices","userProfileVisible","tutoringVisible","tutoringEnabled","tutoringAllowed","forceTutoring","hasValidTraining","trainingSessionVisible","workflowBookingVisible","workflowBookingEnabled","trainingSignUpVisible","staffVisible","reservationCollaboratorsVisible","staffRequired","AvailableInstrumentsMessage","ReservationPendingApproval","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","ReservationSidePanelAssemblyPart_ErrorMessage","successMessages","ReservationAssistedApproved","equipmentsChangeHandler","selectedEqs","extendStaffMandatoryEquipment","staff","extendMandatoryEquipments","initStaffReservation","staffEquipmentId","accid","singleClick","ft","UpdateToNow","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","AssemblyPartReservationCanNotBeUpdatedDirectly","otherwise","BudgetPercentPlaceholder","BudgetPercentInvalid_error","_errStartTimeRequired","OrderStatus","Experiment","Project","Attendance","PartialAttendanceStartDuration","PartialAttendanceEndDuration","AccompaniedService","CollaboratorUsers","err_AccompaniedService_required","StaffUserRequired","err_WorkflowBookingRequired","handleFullDayReservationChange","fullDayReservation","currentPeriod","adjusted","partialReservationDetailsState","messageList","reservationCollaboratorsFilter","getReservationCollaboratorsFilter","staffUserPickerPredicates","PleaseSelectAnAccompaniedService","AddingsMandatoryEquipments","AddingsOptionalEquipments","ReservationName_Desc","FullDayReservation_Description","StaffUser_Info","PleaseSelectStaffUser","CollaboratorUsers_Info","ReservationTrainingApproval_Desc","TrainingSignUp_info","ReservationConsumables","ReservationSampleRunId_Desc","ApproveTrainingRecords","handleApproveOnce","handleEditAssisted","appSetActions","existingTrainings","servicesWithoutTraining","TrainingRecordId","showPopupAccordingToSetting","NotShowPopup","showPopup","handleEditClick","handleNweCreateClick","handleCreateTrainings","trdata","TrainingsCreatedSuccessfully","TrainingsAlreadyExist","ApproveOnce","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","confirmAssisted","transferStepWaiting","transferUser","transferredForId","showConfirmAssisted","setShowConfirmAssisted","confirmBeforeTransfer","setConfirmBeforeTransfer","showTransfer","setShowTransfer","confirmCloned","setConfirmCloned","canceled","setCanceled","openModifications","setOpenModifications","allowSortenReservation","timeEnabledForOwner","canBeCanceled","canBeApproved","canSaveForLater","reservationCanceled","calculateButtonVisible","not_restricted","noInstumentRestricted","confidential","workOrderSwithProps","cancelReservation","approveReservation","draftReservation","handleChangeStatus","setOfflineServicesErrors","handleSetError","AutoEndReservation_remarks","handleUpdateFollowing","Following","handleByApprovalConfirm","editAssisted","handleEquipmentClick","handleRestrictionsClick","RestrictionDetails","handleOfflineServiceClick","handleAddBatchClick","mactions","CancelReservation","ApproveReservation","CreateTraining","OfflineServicesError_info","res_SaveAndClone_info","SaveAndClone","CreateAndClone","pageTitle","CloneReservation","menu_ReservationDetails","menu_NewReservation","ByApprovalAvailable","CancelMultipleReservations","UpdateMultipleReservations","WeeklyReservationConfirmationMessage","CancelFollowing","UpdateFollowing","CancelAll","CloneReservationConfirm","Proceed","transfer","ByApprovalConfirmationModalTitle","ReservationConfirmByApproval","RestrictedNotAllowed","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","innerHTML","ReactDOMServer","HTMLReactParser","eithSlotsHeight","startHeight","defaultColor","prepareSchedulerSections","r1","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","BuildingName","TrainingSignedUp","MinAttendees","TrainingSessions_Calendar_SignedUp","TrainingSessions_Calendar_UnderMinimum","TrainingSessions_Calendar_Available","TrainingSessions_Calendar_Maximum","TrainingSessions_Calendar_ClickToView","TrainingSessions_Calendar_ClickToSignUp","OfflineTooltip","user_name","ReservationTooltip","reservationHtml","reservationTooltipTemplate","DraftReservationStatus","ApprovedByStaff","tooltip_text","HIDE_TOOLTIP","schedulerEvent","TooltipElement","SchedulerEventTooltip","tooltipElementProps","GetSchedulerEventTooltipProps","createElement","tooltip_text_fn","currentPosition","forceUpdate","currentView","getView","_mark_now","deleteTempReservations","schedulerRef","deleteEvent","resetEventEdits","updateEvent","findParentTarget","selectors","closest","std","getElementSizes","sizes","_els","scrollWidth","scrollHeight","add_export_methods","getTimeline","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","appendChild","_get_export_size","scales","A5","A4","A3","A2","A1","A0","dataX","cSize","initialSizes","smartRendering","scrollable","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","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","assetPopupProps","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","LocationDetails","PageComponent","handleSubmitCallResult","submitcall","LocationContent","ModelDetails","IdSpec","AddNew","LabelTypePage","LabelTypeEdit","FormAssetPicker","assetSchema","assetsSchema","GetInstrumentFilter","sv","useAllowedToChangeStatus","ArticleAssociationForm","articleDetailsForm","allowedToChangeStatus","canEditStatus","setCanEditStatus","RelatedUser","ServiceGroupAsset","GetServiceGroupAsset","RelatedUserDisplayName","oldServiceGroups","setOldServiceGroups","setServiceGroups","instrumentFilter","AssociateThisPublication","ArticleDetails","selectedArticle","isSaved","CreatedByMe","PublicationRecordApproved_info","useCanEdit","canEdit","showCover","sidePanelProps","ArticleEdit","articleLabelColorPaddingTop","articleValueLabelBold","PublicationDetails","EditAssociationButton","Abstract","Authors","EnteredBy","EnteredAt","Doi","ISSN","ORCID","ORCIDs","Year","Journal","ArticlePageNumber","PageNumber","ParticipatedLabs","ParticipatedInstruments","EditArticle","EditAssociation","AssociateThisPublicationTitle","FormCustomPicker","NewArticleDetailsForm","ArticleContributionLevelId","FirstInstrumentAssetName","FirstServiceGroupAssetName","DepartmentId","DepartmentName","InstituteId","InstituteName","InstituteTypeId","InstituteTypeName","statusPickerData","AddPublication","EditArticleDetailsForm","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","UserAttributeDetails","MandatoryFieldsArePartOfTheRegistrationForm","hasUnsavedChanges","EditAttribute","AddNewAttribute","Priorities","getInitialValues","getTicketSchema","samplesAutomationEnabled","parentSamplesCount","samplesRequired","PriorityPicker","FormPriorityPicker","FormServiceRequestStatusPicker","Form","AssignedSamplesToThisTicket","AddSubTicket","SubSamplesCount","TotalSamplesCount","handleCancel","AddSubServiceRequestTicket","editState","editItem","enableAddSubTicket","handleAddSubTicketClick","ServiceRequestTicket","ServiceRequestTickets","StockRenewalForm","onAddServiceClick","recentMostBatchesChanged","setRecentMostBatchesChanged","servicesSelected","setServicesSelected","otherServicesSchema","stockRenwevalSchema","otherData","StockRenewal","createServices","onRemoveServices","onUpdateService","loadServiceTypes","setErrors","ReportConsumablesMainInfo","AutoGenerateNewBatchesDisabled_info","AutoGenerateNewBatches_info","ReportedConsumables","initialServices","stockRenewalServicesData","assetsFilter","userGroups","StockRenewals","SidePanelRenderer","renderPageType","renderPageProps","QuizCreate","StartQuiz","QuizzDetails","AddBillingAction","LabelType","PricePeriodsDetails","ArticleNew","InvoiceTemplatePopUp","CoreSelection","CalendarMessagesDetails","ReportConsumables","ServiceRequestMilestone","ServiceRequestMilestoneCharge","SidePanelRoot","SidePanelPopper","SidePanelPopup","sidePanelRootExpanded","sidePanelRootCollapsed","backdropOpen","rootopen","rootclose","mobileroot","modifiers","keepTogether","preventOverflow","boundariesElement","flip","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","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","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","invoiceHistoryOpen","setInvoiceHistoryOpen","rowHistoryOpen","setRowHistoryOpen","payHistoryOpen","setPayHistoryOpen","updateStatusOpen","setUpdateStatusOpen","updateInvoiceTemplateOpen","setUpdateInvoiceTemplateOpen","updateInvoiceIdsOpen","setUpdateInvoiceIdsOpen","openNewCharge","openNewPayment","deletable","setNewStatus","setInvoiceTemplate","setInvoiceIds","deleteInvoice","invoiceTemplateId","AddACharge","EditInvoiceStatus","EditInvoiceTemplate","CantDeleteInvoice","InvoiceRowsHistory","Preview","invoiceIdEntity","paymentPageActions","PaymentModificationsHistory","PayId","disableEnforceFocus","UpdateInvoiceStatus","UpdateInvoiceTemplate","handlePreview","InvoiceDeleteConfirmationMessage","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","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","OnlyMyCores","onlyMyCores","ownedbyme","CoreSelectionTable","updtFirstLogin","updtOptOut","redirectToDash","optOutCoreSelection","serviceGroupActions","savedServiceGroups","setOnlyMyCores","tabNumber","setTubNumber","multiCoresSelectionMode","setMultiCoresselectionMode","skipCoreSelectionScreen","SkipCoreSelectionScreen","loacalServiceGroups","setLoacalServiceGroups","showMyCoresOptions","handleRemoveGroup","oldGroups","handleRowsServiceGroupsChange","handleServiceGroupsChange","handleSingleGroupChange","CanRequestAccess","OnSelectNotRegisteredCore_error","primaryMultipleAction","RequestAccess","Badge","ApprovalStatusId","_selectedRows","_rows","_onRefresh","_toggleAll","tabLeftActions","Tab","_count","OwnedByMe","tabRightActions","DontShowThisAgain","_ev","CoreSelectionOptOut_info","SelectDeffServiceGroups","detailsRowActions","CoreDetails","GetDetailsRowActions","menu_CoreSelection","Rejected","_toggleAllRowsSelected","selectCoreSelection","coreSelection","selectCoreSelectionFilters","noDashboardRedirectByClick","isFirstLogin","updateIsFirstLogin","OptOutCoreSelection","updateIsOptOut","Private","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","Next","viewTypeControls","SavedViewForm","viewOnly","savedViewSchema","err_SavedViewNameRequired","SavedViewName","err_savedViewAssetRequired","SavedViewAssets","SavedViewShared","SavedViewBookMultiple","getsavedViewSchema","SavedViewAssetsPlaceholder","SavedViewBookMultiple_info","isServiceGroupAdmin","notShown","BookableAsset","TakeDown","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","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","daysEntityArray","defaultDayValue","getDayEntityFromDate","DaysByMonthPicker","maxDay","monthDate","monthEntityArray","FullName","MonthId","defaultMonthValue","getMonthEntityFromDate","MonthOfYearPicker","MAX_YEAR","yearsEntityArray","defaultYearValue","getYearEntityFromDate","YearsPicker","dayDisabled","monthDisabled","yearDisabled","daySelected","setDaySelected","monthSelected","setMonthSelected","yearSelected","setYearSelected","isYearOpen","setIsYearOpen","isMonthOpen","setIsMonthOpen","isDayOpen","setIsDayOpen","handleDayChange","handleMonthChange","handleYearChange","messagesState","selectMessages","useOpenReservationSidePanel","useMessageStyles","closeAllKey","hideIconVariant","preventDuplicate","maxSnack","MaxMessage","variantInfo","MessagesChildren","useSnackbar","enqueueSnackbar","closeSnackbar","closeAllOptions","removableAnnouncment","DashboardAnnouncement","CloseAll","GotIt","RenderMessge","Announcment","ReservationStartedMessage","AllUsagesEnded","InstrumentStillReservered","ReleaseUnusedReservation","YouHaveOngoingReservations","curr","ReservationStarted","UpdateOngoingReservations","UsageReservationMessage","IpRelay_reservationTimeForInstrument","IpRelay_LinkToUsage","CalendarMessage","LoanDeskMessage","ReservationStartedMessage_LoanDesk","WithSpace","Truncicated","cleanedValue","truncate","MoreLink","WebkitLineClamp","WebkitBoxOrient","EmailTypePicker","EmailTypeFilter","NotificationType","useDateTimeChange","valueRef","dateTimeMask","dateStartOf","userValue","isDeleleteButtonDownRef","wasZeroBefore","selectionStateChanged","eventValue","isHourChanged","isMinutesChanged","isAmPmChanged","isDayChanged","isMonthChanged","isYearChanged","isNoOperation","selectionChanged","moveSelectionForward","finalTime","handleKeyDown","evt","handleKeyUp","hasSingleChar","maskedValue","onSelectionChange","KeyboardRifmInput","inputMask","setHasError","setSelectionChanged","dateChange","onKeyUp","selStart","selEnd","displayDate","innerInputValue","setInnerInputValue","changedValueRef","innerValidationError","CustomFormSkeleton","QuizCustomForm","fetchQuiz","quizId","ShuffleFields","Question","UsedAttempts","Submissions","SubmittedById","QuizTrainingPassingScore","UserCanStartQuiz","QuizNumberOfAttempts","fetchQuizPromiseState","fetchQuizPromise","startQuiz","setStartQuiz","quizSubmission","submitStatus","submitQuiz","submission","setSubmission","submissionId","resultQuiz","ContinueToQuiz","CancelYourSubmission","QuizDescription","QuizInstructions","QuizFiledAttemptsMessage","QuizFiledAttemptsInstrumentMessage","PrintSelectedAssetLabelsButton","PrintLabels","mapToAssetDto","myAsset","canExportQRCodeRow","allowedToImport","CheckRows","enabledByCores","ExportAssetRangesTooltip","ExportAssetRanges","AssetRanges","DownloadAssetImages","writeCsvFile","Papa","exportCsv","stringData","csvContent","doLoadData","doUpdateField","doRunSelectedSamples","doCompleteRun","doUpdateRun","doLoadRunDetqails","doImportRunDetails","doLoadAllSelectedSamples","doExportRun","loadIds","httpUrl","allsamples","completeRunResponse","XSamplesWereProcessed","skippedSamplesCount","XSamplesWereSkipped","derivativesCount","runupdate","samples_response","readCsvFile","dynamicTyping","complete","platesUrl","createPlate","createPlates","runSamples","tpid","records","tablestate","AnalyticalSampleId","Position","TubeLabel","Volume","Concentration","ConsumablesForm","reportConsumableSchema","ConsumableProject_info","consumableServicesData","byGroup","AllowedServices","StyledSelect","TmtType","autoWidth","OtherServiceDetailsPage","queryProps","OtherServiceEditLinkprops","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","SendQuoteToUser","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","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","QuoteApproved","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","handleCloseClick","NOT_FOUND","addonType","AddonCharges","getServiceRequestTitle","CommentOnEditOnly","ReturnedToUser","EventsCount","StyledSpanIcon","AssetQuickSearchApi","getAssetSearch","q","Results","TotalResultsLength","getRecentAssets","doShowSearchInput","doSetOpen","doSearchAssets","doSearchAllAssets","doGetRecentAssets","doGetRecentSearchTerms","assetQuickSearchSaga","getRecentSearchTerms","searchAssets_Success","searchAssets_Error","allCores","setOnlineSearchResults","setOfflineSearchResults","setRequestSearchResults","setTotalSearchCount","online","request","totalRresults","searchAllAssets_Success","searchAllAssets_Error","getRecentAssets_Success","getRecentAssets_Error","getRecentSearchTerms_Success","getRecentSearchTerms_Error","showSearchInput","searchAssets","searchAllAssets","showSearchInSidebar","showSearchResults","recentSearchTerms","searchResults","allSearchResults","onlineSearchResults","offlineSearchResults","requestSearchResults","totalSearchCount","assetQuickSearchActions","useAssetQuickSearchSlice","selectAssetQuickSearch","assetQuickSearch","selectRecentAssets","selectRecentSearchTerms","selectAllSearchResults","selectSearchTerm","selectOpen","selectShowSearchInSidebar","selectOnlineSearchResults","selectOfflineSearchResults","selectRequestSearchResults","selectTotalSearchCount","ListItemLink","DefaultQuickAssetSearchAction","getAssetDetailsLink","getCalendarLink","getSettingValue","validKey","getTimelineLink","AssetListItem","useAssetPopup","truncateName","defaultLink","showCalendarLinks","ShowFullDetails","ListItemSecondaryAction","QuickSearchSection","QuickSearchSectionTitle","QuickSearchSearchesItems","QuickSearchRecentItems","QuickSearchEmptySection","QuickSearchEmptyContent","QuickSearchSeeAll","QuickSearchMainTitleSection","QuickSearchAllInstrumentsSection","RecentAssetsList","RecentItem","RecentSearchTermsList","recentSearchTermsState","RecentSearches","NoSearchTermFound","AssetSearchResultsByType","onAllAssetsClick","onlineState","offlineState","requestState","OnlineServiceLabel","InstrumentsFound","RequestServiceLabel","RequestsFound","OfflineServiceLabel","ConsumablesFound","showOnline","showOffline","showRequests","NothingFound","FullResults","AssetQuickSearch","searchAllCores","handleOpenAssets","SearchAnAssets","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","TopGroupButton","firstServiceGroupName","TruncatedLabel","CoreDashboardMenu","showGroups","popoverPaper","mainContentAndScroll","mainContent","searchAndHeader","controlButtons","coresAndServices","coreCheks","scrollPaddings","ddlClasses","listItemText","useListStyles","setSelectedServiceGroups","availableServiceGroups","setAvailableServiceGroups","availableLoading","setAvailableLoading","setShow","Dashboard_ServiceGroupSelection","handleItemClick","handleSaveItemClick","Dashboard_ServiceGroupSwith","CoreSelectionButton","showInlineGroups","SwitchSites","allowToSwitchToOtherSites","AllowToSwitchToOtherSites","externalTitleOne","ExternalSwitchTitle1","externalUrlOne","ExternalSwitchUrl1","externalTitleTwo","ExternalSwitchTitle2","externalUrlTwo","ExternalSwitchUrl2","externalSitesIcon","ExternalSitesIcon","buttonIcon","hasExternalOne","hasExternalTwo","useExternalLinks","SwitchToOtherSites","ProfileMenu","eventsLoading","assetSearchActions","SearchAssets","Separator","TopToolbar","TopBar","sidePanelCollapsed","appBarShift","sidePanelShift","verticalScrolling","sideBarHeader","sideBarFooter","MenuItemComponent","external","currentindex","childRoot","focusVisible","createMenuItemRefs","rowInd","menuItemRefs","HoverSideMenu","handleChildClick","childActiveIndex","setChildActiveIndex","parentRowIndex","keyCode","bindFocus","inset","anchorPosition","TransitionComponent","cindex","exact","focusVisibleClassName","SidbarMenuItem","PropTypes","bool","indexChanged","chIndex","isExpandable","setChildIndex","sidebarExpanded","urlLink","setUrlLink","data-parent-id","NavWrapper","replaceIcon","convertUrl","SideBarMenu","selectedIndex","setSelectedIndex","mapItems","setMapItems","handleListItemClick","ch","LinkWithChildren","citem","chItem","BookitlabShortLogo","xmlnsXlink","enableBackground","xmlSpace","SideBarHeader","logoMinimized","flexFlow","SideBarFooter","SideBarComponent","setCurrentNode","currentNodes","setCurrentNodes","SideBar","SideBarDrawer","handleDrawerClose","Drawer","drawerOpen","drawerClose","LayoutRoot","easeInOut","Main","FrontendLayout","isBudgets","globalCoreVisible","termsOfUseAgreementEnabled","TermsOfUseAgreement","isFirstActiveUserGroupSelected","usageKioskRoleEnabled","UsageKioskRoleEnabled","roomUserRoleEnabled","redirectToTermsOfUseAgreement","setRedirectToTermsOfUseAgreement","redirectToActiveUserGroup","setRedirectToActiveUserGroup","redirectToCoreSelection","setRedirectToCoreSelection","redirectToUsageKiosk","setRedirectToUsageKiosk","redirectToUsageRoom","setRedirectToUsageRoom","redirectToConsumableKiosk","setRedirectToConsumableKiosk","previus","KioskAdmin","ConsumableKiosk","useRequiredRedirect","isRedirectToTermsOfUseAgreement","isRedirectToActiveUserGroup","isRedirectToCoreSelection","isRedirectToUsageKiosk","isRedirectToUsageRoom","isRedirectToConsumableKiosk","handleRejectConfirm","handleApproveConfirm","useselectable","mobileOpen","NotSavedChanges_message","NotSavedChanges_title","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","renderItem","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","WorkOrders","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","rooted","ServerBarcodeRoute","AssetBarcodeRelativeUrlTemplate","RoomBarcodeRelativeUrlTemplate","LocationBarcodeRelativeUrlTemplate","SubLocationBarcodeRelativeUrlTemplate","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","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","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","SubscriptionTypesPage","jss","jssPreset","App","userLoading","isLoginPage","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":"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T,GAAsBz0U,aACjC,kBAAM,mCACN,SAAAO,GAAM,OAAIA,EAAOk0U,uBCFNC,GAAoB10U,aAC/B,kBAAM,oCACN,SAAAO,GAAM,OAAIA,EAAOo0U,iB,UCINC,GAAiB50U,aAC5B,kBAAM,oCACN,SAAAO,GAAM,OAAIA,EAAOs0U,sBCFNC,GAAwB90U,aACnC,kBAAM,oCACN,SAAAO,GAAM,OAAIA,EAAOu0U,yBCRNC,GAAY/0U,aACvB,kBAAM,0DACN,SAAAO,GAAM,OAAIA,EAAOw0U,aCINC,GAA8Bh1U,aACzC,kBAAM,oCACN,SAAAO,GAAM,OAAIA,EAAOy0U,+BCFNtV,GAA4B1/T,aACvC,kBAAM,6CACN,SAAAO,GAAM,OAAIA,EAAOm/T,6BCHNuV,GAA0Bj1U,aACrC,kBAAM,gEACN,SAAAO,GAAM,OAAIA,EAAO00U,2B,oBCDNC,GAAqBl1U,aAChC,kBAAM,yDACN,SAAAO,GAAM,OAAIA,EAAO20U,sB,y5DCyWnBC,KAAQ/qW,IAENgrW,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,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,QA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AAD,CAAU6tD,WAAYo2F,EAAWlkJ,KAAM,OA9wBzC,cAAC,WAAD,WACuB,IAApBlV,EACC,eAAC,IAAD,WACE,cAAC,IAAD,CAEEyxU,OAAK,EACLliU,KAAI,CACF,0BACA,oCACA,wBACA,wBACA,cACA,cACA,iBACA,8BARE,mBASCqoL,sBATD,CAUF,gBACA,eACA,WACA,WACA7yD,KACA,wBACA,YACA+4E,yBACA,kBACA,yBACA,kBACA,oBACA,uBACAqF,+BACA,gBACA,yBACA,4BACA,oBACA,6BACA,gCACA,kBACA,cACA,aACA,gBACA,YACA,sBACA,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,iBACA40B,KACAy0G,GACA,kBACA,uBAEA,iBACA,cACA,uBApHJ,SAuHE,cAAC,IAAD,CAAkBx6V,MAAOooW,EAAzB,SAGE,cAAC5lB,EAAD,UAEE,eAAC,IAAD,WACE,cAAC,IAAD,CACEjlU,KAAM,2BACN4F,UAAW43U,KAEb,cAAC,IAAD,CACEx9U,KAAM,CAAC,sCACP4F,UAAWi4U,KAEb,cAAC,IAAD,CACE79U,KAAM,wBACN4F,UAAWm4U,KAEb,cAAC,IAAD,CACE/9U,KAAM,wBACN4F,UAAWo4U,KAEb,cAAC,IAAD,CACEh+U,KAAM,cACN4F,UAAW83U,KAEb,cAAC,IAAD,CACE19U,KAAM,iBACN4F,UAAWg4U,KAEb,cAAC,IAAD,CACE59U,KAAM,cACN4F,UAAW63U,KAEb,cAAC,IAAD,CACEz9U,KAA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","file":"static/js/main.d584cf63.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","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 { 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","/**\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 { DetectIsMobile } from 'utils/mobileDetect';\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\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\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\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 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 selectIsExpandedSideBar = createSelector([selectSlice], state => {\r\n let result: boolean = false;\r\n if (DetectIsMobile()) {\r\n result = state.isExpanded;\r\n } else {\r\n if (state.updatedUserProfileSettings) {\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\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 * 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 * 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 { 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 { 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\n\r\nexport const StyledFormFieldsContainer = (\r\n props: Omit,\r\n) => {\r\n const { avoidStyles, children, sectionStyle, isCover, ...other } = 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}\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 ...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 } 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 Roles,\r\n SaveUserProfileSettingAction,\r\n ScanTarget,\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 { toRelative, 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 } 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() {\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) {\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 (action.payload.indexOf('.aspx') > 0) {\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\nfunction* 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' };\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\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\nfunction 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\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}\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};\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) {\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 .concat(state.siteMapSettings?.adminNodes)\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 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.updatedUserProfileSettings = true;\r\n },\r\n updateExpandedState_Success(\r\n state,\r\n action: PayloadAction,\r\n ) {\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.updatedUserProfileSettings = false;\r\n },\r\n updateExpandedState_Local(state, action: PayloadAction) {},\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 },\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\nimport { useHistory } from 'react-router-dom';\r\nimport { IPathAndQuery, toRootedURL } from 'utils/url-utils';\r\nimport clsx from 'clsx';\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;\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 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 history.push(to);\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) {\r\n const publicUrl = useSelector(selectPublicUrl);\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 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 { 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\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}\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 = ['registeraccount', 'assets/public'];\r\nexport enum ScanTarget {\r\n All,\r\n Consumables = 1,\r\n Asset = 2,\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\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 { selectHasNotSavedChanges, selectSidePanelOpen } from './selectors';\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* layoutSaga() {\r\n yield takeLatest(actions.openSidePanel.type, doOpenSidePanel);\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 { 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};\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 },\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 { 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\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\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}\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 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}\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","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 { useHistory } from 'react-router-dom';\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\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;\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 icon,\r\n ...other\r\n } = props;\r\n const history = useHistory();\r\n const handleClick = (e: any) => {\r\n if (to) {\r\n history.push(to);\r\n }\r\n if (props.onClick) {\r\n props.onClick(e);\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\nfunction 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 { 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\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: AssetSetting[];\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 AssetPopUpActiveProps: string;\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): boolean {\r\n if (!!setting && setting.AssetFieldSettings) {\r\n var result = setting.AssetFieldSettings.find(s => {\r\n return s.AssetField === AssetField && s.Disabled === false;\r\n });\r\n return result !== undefined && result !== null;\r\n }\r\n return false;\r\n}\r\nexport function IsAssetFieldIsPublic(\r\n setting: AppSettings | null,\r\n AssetField: AssetAttributes,\r\n): boolean {\r\n if (!!setting && setting.AssetFieldSettings) {\r\n var result = setting.AssetFieldSettings.find(s => {\r\n return s.AssetField === AssetField && s.IsPublic === true;\r\n });\r\n return result !== undefined && result !== null;\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\nexport interface AssetSetting {\r\n AssetField: AssetAttributes;\r\n Disabled: boolean;\r\n IsPublic: boolean;\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","export enum AvailabilityTypes {\r\n /// \r\n /// no connection to bookitlab service\r\n /// \r\n NotAvailable = 0,\r\n\r\n /// \r\n /// no connection to bookitlab service\r\n /// \r\n AvailableNotBookable = 1,\r\n\r\n /// \r\n /// connected to online service\r\n /// \r\n FreelyBookable = 2,\r\n\r\n /// \r\n /// connected to online service which requires tutoring\r\n /// \r\n BookableWApproval = 3,\r\n\r\n /// \r\n /// connected to offlineservice\r\n /// \r\n ServiceRelated = 4,\r\n /// \r\n /// Connected to a service group\r\n /// \r\n ServiceGroup = 5,\r\n\r\n /// \r\n /// connected to a division(super group)\r\n /// \r\n SuperGroup = 6,\r\n\r\n /// \r\n /// connected to a division(super group)\r\n /// \r\n FreelyBookableBillable = 7,\r\n\r\n /// \r\n /// connected to a division(super group)\r\n /// \r\n ApprovalRequiredBillable = 8,\r\n\r\n /// \r\n /// connected to requests\r\n /// \r\n RequestRelated = 9,\r\n\r\n TrainingProgram = 10,\r\n LoanableEquipment = 11,\r\n LectureRoom = 12,\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","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","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","/**\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","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","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 Hide,\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}\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 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 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\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\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 {\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 * 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 { IExperimentElnDto } from 'api/odata/generated/entities/IExperimentElnDto';\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 BudgetPercent: 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 ExperimentId: number | null;\r\n WorkflowBooking: Entity | null;\r\n ExternalCustomerId: number | null;\r\n FundingType: FundingTypes | null;\r\n StaffUser: string | null;\r\n ServiceRequestProjectId: number | 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 BudgetPercent: number | null;\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 ParentId: 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 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 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 BudgetPercent?: number | null;\r\n ExperimentEln?: Entity | null; //IExperimentElnDto | null;\r\n ServiceRequestProject?: 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 BudgetPercent?: number | null;\r\n ExperimentEln?: IExperimentElnDto | null; //IExperimentElnDto | null;\r\n ServiceRequestProject?: 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 * This property is probably used to send the funding type to the server or might not be in use at all?\r\n */\r\n FundingTypeId: number | null;\r\n /**\r\n * This property is used to read the funding type from the server (initReservation)\r\n */\r\n FundingType: 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 BudgetPercent: number | 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 { 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 { 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?: () => 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 {children}\r\n \r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { LinearProgress } from '@material-ui/core';\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\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 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}\r\nconst TitleRoot = styled('div')(({ theme }) => ({\r\n '&.page-wrapper-title-root': {\r\n padding: theme.spacing(4, 4, 0),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n width: '100%',\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 padding: theme.spacing(0, 0, 0),\r\n width: '100%',\r\n gap: theme.spacing(4.5),\r\n '.titleSubtitle': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n },\r\n '.rightControls': {\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 },\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 } = props;\r\n return (\r\n \r\n \r\n
\r\n
\r\n {closable && useSidePanel ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n
\r\n
\r\n
\r\n
\r\n {pageName && (\r\n \r\n {pageName}\r\n \r\n )}\r\n {titlePage ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {subTitlePage && {subTitlePage}}\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 {!!rightTopActions && rightTopActions?.length > 0 && (\r\n \r\n {rightTopActions[0](onSubmit)}\r\n ind > 0)\r\n .map((item, index) => (\r\n {item(onSubmit)}\r\n ))}\r\n >\r\n \r\n )}\r\n {useSwithActions && switchState && (\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 { LinearProgress } from '@material-ui/core';\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\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 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}\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, 3, 1.5),\r\n alignItems: 'center',\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 },\r\n '.shortRightIcons': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'flex-start',\r\n padding: 0,\r\n gap: '12px',\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 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 } = 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\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 && useSidePanel && !disableExpandToggle && (\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 );\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\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}\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(3, 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 } = props;\r\n const theme = useTheme();\r\n return (\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\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 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}\r\n\r\nexport interface CoverProps {\r\n isCover?: boolean;\r\n closeCover?: () => void;\r\n}\r\n\r\nconst PageWrapperRoot = styled('div')(({ theme }) => ({\r\n '&.page-wrapper-root': {\r\n background: bookitColors.base.white,\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 '&.covered': {\r\n filter: 'brightness(30%)',\r\n },\r\n '&.cover': {\r\n // height: '95vh',\r\n height: 'calc(100vh - 50px)',\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 },\r\n '&.baseRootHeight': {\r\n height: '91vh',\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: '10px',\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 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 } = 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 isCovered = !!cover;\r\n const showShortView = React.useMemo(() => {\r\n return (\r\n isMobile ||\r\n (useSidePanel && !sidePanelExpanded) ||\r\n (isCover && !coverExpanded)\r\n );\r\n }, [coverExpanded, isCover, isMobile, sidePanelExpanded, useSidePanel]);\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 (isCovered && isCoverOpen && event.target.id === 'page-wrapper-root') {\r\n closeCover?.();\r\n dispatch(actions.setIsCoverOpen(false));\r\n }\r\n };\r\n const theme = useTheme();\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 &&\r\n leftTopActions.length > 0 && (\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","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 { 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 * 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 { 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 { 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 { 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 { 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","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 'QuoteSendToUser',\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","/**\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}\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 ...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 setOpen(false);\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","/**\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, 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\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\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, ...rest } = props;\r\n const classes = useStyles();\r\n const absolutePath =\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 { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\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 \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);\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n externalLinkRoot: {\r\n whiteSpace: 'nowrap',\r\n },\r\n link: {},\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 * 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 { 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 { 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 'AssetPopUpActiveProps',\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 /**\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 * 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","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 // ~/Invoices/SubscriptionTypes/Default.aspx\r\n SubscriptionTypes = 68,\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","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 * 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","/**\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): Record | undefined => {\r\n if (formValues === undefined) {\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","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}\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 ...other\r\n } = props;\r\n const isMobile = DetectIsMobile();\r\n const action =\r\n isMobile && !noChangeOnMobile ? (\r\n \r\n ) : (\r\n \r\n );\r\n return action;\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 = 'restricted' | 'full' | 'admin' | 'relevant';\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\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' ? fullActiveUrl : urlType === 'admin' ? adminsUrl : 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 : 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: '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 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 {\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","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","/**\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 'enums/asset';\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}\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) => {\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 !!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 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 ...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 );\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 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 { 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 parseInternalCode(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 internalCode = url.searchParams.get('InternalCode');\r\n return internalCode;\r\n } catch (error) {\r\n return undefined;\r\n }\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 internalId = parseInternalCode(action, appSettings);\r\n if (internalId === undefined || internalId === null) {\r\n internalId = 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 { 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 { 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 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","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","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 ...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","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","import React, { ReactNode } from 'react';\r\nimport { IAsset } from '../IAsset';\r\nimport { AttributeValue } from '../IAssetRow';\r\nimport parse from 'html-react-parser';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\nexport const DateRenderer = (\r\n props: AttributeValue,\r\n): React.ReactNode => {\r\n let date = props.value as Date;\r\n return <>{dateUtils.shortDateFormat(date)};\r\n};\r\n\r\nexport const HtmlRenderer = (props: AttributeValue): ReactNode => {\r\n let html = props.value as string;\r\n return <>{parse(html)};\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 }\r\n };\r\n return mapper;\r\n}\r\n","export enum RestrictedReservationsOptions {\r\n NoLimitations = 1,\r\n StaffAndUsersLimitations = 2,\r\n StaffOnlyLimitations = 3,\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 { 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 { selectAppSettings, selectglobalSettings } from 'app/slice/selectors';\r\nimport { AvailabilityTypes } from 'enums/asset';\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 { 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 } from '../IAsset';\r\n\r\nexport interface TopAssetActionsDropDownProps {\r\n data: 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 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 = (isMismatchCore?: boolean) => {\r\n const { t } = useTranslation();\r\n const appSettings = useSelector(selectAppSettings);\r\n const globalSettings = useSelector(selectglobalSettings);\r\n const getMenuItems = React.useCallback(\r\n ({ data }: TopAssetActionsDropDownProps) => {\r\n const NotificationIsAvailable = [\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(data?.AvailabilityTypeId as AvailabilityTypes);\r\n let items: React.ReactNode[] = [];\r\n if (\r\n data.AmAdmin &&\r\n [\r\n AvailabilityTypes.NotAvailable,\r\n AvailabilityTypes.AvailableNotBookable,\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.ServiceRelated,\r\n AvailabilityTypes.RequestRelated,\r\n AvailabilityTypes.ServiceGroup,\r\n AvailabilityTypes.SuperGroup,\r\n ].includes(data.AvailabilityTypeId as AvailabilityTypes)\r\n ) {\r\n items.push(\r\n {\r\n switch (data.AvailabilityTypeId as AvailabilityTypes) {\r\n case AvailabilityTypes.NotAvailable:\r\n case AvailabilityTypes.AvailableNotBookable:\r\n case AvailabilityTypes.FreelyBookableBillable:\r\n case AvailabilityTypes.ApprovalRequiredBillable:\r\n case AvailabilityTypes.FreelyBookable:\r\n case AvailabilityTypes.BookableWApproval:\r\n case AvailabilityTypes.TrainingProgram:\r\n case AvailabilityTypes.LoanableEquipment:\r\n case AvailabilityTypes.LectureRoom:\r\n return toRootedURL(\r\n `/NewResource.aspx?Edit=${data.ServiceId}&back=assetdetails&assetid=${data.Id}`,\r\n );\r\n case AvailabilityTypes.ServiceRelated:\r\n return toRootedURL(\r\n `/OfflineServiceType.aspx?ID=${data.ServiceId}&back=assetdetails&assetid=${data.Id}`,\r\n );\r\n case AvailabilityTypes.RequestRelated:\r\n return toRootedURL(\r\n `/SampleType.aspx?ID=${data.ServiceId}&back=assetdetails&assetid=${data.Id}`,\r\n );\r\n case AvailabilityTypes.ServiceGroup:\r\n return toRootedURL(\r\n `/newgroup.aspx?edit=${data.ServiceGroupId}`,\r\n );\r\n case AvailabilityTypes.SuperGroup:\r\n return toRootedURL(\r\n `/newsupergroup.aspx?edit=${data.DivisionId}`,\r\n );\r\n default:\r\n return '';\r\n }\r\n })()}\r\n title={t(translations.EditSettings)}\r\n text={t(translations.Settings)}\r\n icon=\"pencil-alt\"\r\n target={'_blank'}\r\n />,\r\n );\r\n }\r\n items.push(\r\n ,\r\n );\r\n if (data.ReservationEnabled) {\r\n items.push(\r\n }\r\n variant=\"white\"\r\n component={'a'}\r\n >\r\n {t(translations.Calendar)}\r\n ,\r\n );\r\n }\r\n if (data.ReservationEnabled) {\r\n items.push(\r\n }\r\n >\r\n {t(translations.Timeline)}\r\n ,\r\n );\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (data.UsageEnabled) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (data.ServiceTypeId === ServiceType.Offline && data.AllowToUser) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (\r\n data.ServiceTypeId === ServiceType.Online &&\r\n IsModuleEnabled(appSettings, KnownModules.Quizzes)\r\n ) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (data.AlertsEnabled) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (data.PlanedEventsEnabled) {\r\n items.push(\r\n ,\r\n );\r\n }\r\n if (\r\n data.ShowFeed &&\r\n globalSettings.GetBoolean('CalendarPublicIntegrationFeed')\r\n ) {\r\n items.push(\r\n {\r\n const bookable: (number | undefined)[] = [\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 return bookable.includes(type);\r\n};\r\n\r\nconst maxLeftTopButtonsLength = 2;\r\n\r\nconst expandable = [\r\n 'Alerts',\r\n 'Tags',\r\n 'Suppliers',\r\n 'Contacts',\r\n 'Experts',\r\n 'Accessories',\r\n 'Articles',\r\n];\r\n\r\nconst defaultRows = [\r\n 'ImageName',\r\n 'ServiceGroupName',\r\n 'DivisionName',\r\n 'AvailabilityTypeName',\r\n 'Articles',\r\n];\r\n\r\nexport interface AssetPopUpProps extends CoverProps {\r\n Id?: number;\r\n serviceId?: number;\r\n onClose?: () => void;\r\n showAllCores?: boolean;\r\n}\r\n\r\nexport const AssetPopUp = ({\r\n Id,\r\n serviceId,\r\n onClose,\r\n showAllCores,\r\n ...props\r\n}: AssetPopUpProps) => {\r\n const { t } = useTranslation();\r\n const globalSettings = useSelector(selectglobalSettings);\r\n const appSettings = useSelector(selectAppSettings);\r\n const [rows, setRows] = useState([]);\r\n const [data, setData] = useState();\r\n const [loading, setLoading] = useState(false);\r\n const [openEndUsage, setOpenEndUsage] = useState(false);\r\n const [reset, setReset] = useState(false);\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const publicUrl = useSelector(selectPublicUrl);\r\n const isAuthenticated = useSelector(selectIsAuthenticated);\r\n const [assetCover, setAssetCover] = useState();\r\n const selectedServiceGroups = useSelector(selectGlobalServiceGroupFilter);\r\n const topServiceGroupsIsHidden = useSelector(state =>\r\n selectGlobalSettingBool(state, AllowedSettings.HideTopServiceGroupFilter),\r\n );\r\n const assetFieldEnabled = 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 defaultAttributes = useMemo(() => {\r\n let result: string[] = [\r\n 'Id',\r\n 'Name',\r\n 'ImageName',\r\n 'ServiceId',\r\n 'ServiceTypeId',\r\n 'NotifyExists',\r\n 'CanEndUsage',\r\n 'UsageId',\r\n 'ServiceGroupName',\r\n 'AvailabilityTypeId',\r\n 'EquipmentRestrictionsOverview',\r\n 'AssemblyId',\r\n 'EquipmentMinOrder',\r\n 'EquipmentMaxOrder',\r\n 'LoanTypeId',\r\n 'DivisionName',\r\n 'Alerts',\r\n 'AlertInfo',\r\n 'AmAdmin',\r\n 'AvailabilityTypeName',\r\n 'AlertsEnabled',\r\n 'UsageEnabled',\r\n 'ReservationEnabled',\r\n 'CanStartUsage',\r\n 'PlanedEventsEnabled',\r\n 'ShowFeed',\r\n 'ServiceGroupId',\r\n 'DivisionId',\r\n 'EndUsageIds',\r\n 'RestrictedReservationsOption',\r\n 'MinTimeAheadPeriodType',\r\n 'MinTimeAheadMinutesSinceMidnight',\r\n 'MinTimeAheadPeriodValue',\r\n 'ReservationMinimumGap',\r\n 'CarryOverTimeSlotTypeName',\r\n 'CarryOverTimeSlotGap',\r\n 'ApprovalRequired',\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 const redirectToDashOnCoreClick =\r\n globalSettings.GetBoolean(\r\n AllowedSettings[AllowedSettings.NoDashboardRedirectOnCoreSelection],\r\n ) === false;\r\n const closeAssetCover = () => {\r\n setAssetCover(undefined);\r\n };\r\n const assetProps = useMemo(\r\n () =>\r\n isAuthenticated\r\n ? [\r\n ...globalSettings\r\n .GetString(AllowedSettings.AssetPopUpActiveProps)\r\n .split(','),\r\n 'RestrictedReservationsOption',\r\n ]\r\n : (appSettings?.AssetPopUpActiveProps || '').split(','),\r\n [appSettings?.AssetPopUpActiveProps, globalSettings, isAuthenticated],\r\n );\r\n const dict: Record = useMemo(() => {\r\n return getRows(t, globalSettings, publicUrl, setAssetCover).reduce(\r\n (res, current) => {\r\n res[current.Id] = current;\r\n return res;\r\n },\r\n {},\r\n );\r\n }, [t, globalSettings, publicUrl]);\r\n\r\n const mismatchCore = useMemo(() => {\r\n return showAllCores && isAuthenticated && !topServiceGroupsIsHidden\r\n ? !!data &&\r\n !!data.AvailabilityTypeId &&\r\n data.AvailabilityTypeId !== AvailabilityTypes.ServiceGroup &&\r\n data.AvailabilityTypeId !== AvailabilityTypes.SuperGroup &&\r\n !!selectedServiceGroups &&\r\n selectedServiceGroups.length > 0 &&\r\n !selectedServiceGroups.some(f => f.Id === data.ServiceGroupId)\r\n : false;\r\n }, [\r\n data,\r\n isAuthenticated,\r\n selectedServiceGroups,\r\n showAllCores,\r\n topServiceGroupsIsHidden,\r\n ]);\r\n const updateGlobalServiceGroup = useCallback(() => {\r\n if (showAllCores && !!data && !!data.ServiceGroupId) {\r\n let groups = !!selectedServiceGroups\r\n ? [\r\n ...selectedServiceGroups,\r\n { Id: data.ServiceGroupId, Name: data.ServiceGroupName },\r\n ]\r\n : [{ Id: data.ServiceGroupId, Name: data.ServiceGroupName }];\r\n dispatch(actions.saveGlobalServiceGroupFilter(groups));\r\n }\r\n }, [actions, data, dispatch, selectedServiceGroups, showAllCores]);\r\n useEffect(() => {\r\n getEnabledAttributes(assetProps, isAuthenticated)\r\n .then(value =>\r\n setRows(\r\n [\r\n ...defaultRows.map(r => dict[r]),\r\n ...value.flatMap(v => {\r\n let val = dict[v.Id];\r\n if (!!val) {\r\n val.Name = v.Name ?? 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 ),\r\n )\r\n .catch(err => console.error(err));\r\n }, [dict, assetProps, Id, isAuthenticated]);\r\n\r\n useEffect(() => {\r\n if (rows.length === 0) return;\r\n setLoading(true);\r\n let active = true;\r\n const cancelToken = httpClient.cancelToken.source();\r\n let columns = [...rows.map(v => v.PropName ?? v.Id), ...defaultAttributes];\r\n async function fetchData() {\r\n let res = await AssetDetailsApi.getAssetById(\r\n Id,\r\n serviceId,\r\n columns,\r\n expandable,\r\n cancelToken.token,\r\n isAuthenticated,\r\n );\r\n if (active) {\r\n setData(res);\r\n }\r\n setLoading(false);\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 }, [Id, rows, serviceId, reset, isAuthenticated, defaultAttributes]);\r\n const refresh = () => {\r\n setReset(f => !f);\r\n };\r\n\r\n const HandleEndUsage = (usageData: EndUsageData) => {\r\n if (data?.UsageId)\r\n AssetDetailsApi.endUsage(data?.UsageId, usageData)\r\n .then(response => {\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 refresh();\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 setOpenEndUsage(false);\r\n };\r\n\r\n const DefautltCell = ({ value }: AttributeValue) => <>{value};\r\n\r\n const getTopAssetActionsDropDown = useTopAssetActionsDropDown(mismatchCore);\r\n const rightTopActions = useMemo(() => {\r\n let actions = [] as ActionRenderer[];\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 if (data?.AmAdmin) {\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 return actions;\r\n }, [\r\n data?.AmAdmin,\r\n data?.AvailabilityTypeId,\r\n data?.DivisionId,\r\n data?.Id,\r\n data?.ServiceGroupId,\r\n data?.ServiceId,\r\n t,\r\n ]);\r\n\r\n const topActions = useMemo(() => {\r\n let actions = [] as ActionRenderer[];\r\n if (data !== undefined) {\r\n const bookable = isBookable(data.AvailabilityTypeId);\r\n const addWorkOrder = () => {\r\n if (data.AlertsEnabled && isAuthenticated) {\r\n actions.push(() => (\r\n }\r\n title={t(translations.CreateAnAssetRelatedEvent)}\r\n color=\"primary\"\r\n variant={!bookable ? 'main' : 'white'}\r\n disabled={mismatchCore}\r\n addChevron\r\n menuChildren={() => [\r\n \r\n {t(translations.PleaseSelectAnEventType)}\r\n ,\r\n ...data.Alerts.map(a => (\r\n \r\n {a.Name}\r\n \r\n )),\r\n ]}\r\n menuProps={{}}\r\n >\r\n {t(translations.Event)}\r\n \r\n ));\r\n }\r\n };\r\n const addReservation = () => {\r\n if (!data.AssemblyId && data.ReservationEnabled) {\r\n actions.push(() => (\r\n }\r\n title={t(translations.PlaceAReservation)}\r\n equipments={[data.ServiceId]}\r\n disabled={mismatchCore}\r\n openToBook={true}\r\n >\r\n {t(translations.Reservation)}\r\n \r\n ));\r\n }\r\n };\r\n const addUsage = () => {\r\n if (!!data.UsageEnabled) {\r\n if (!!data.CanStartUsage && !data.AssemblyId) {\r\n actions.push(() => (\r\n }\r\n href={toRootedURL(`/Usage.aspx?id=${data.ServiceId}`)}\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 (!!data.CanEndUsage && !!data.UsageId) {\r\n actions.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 data.AlertInfo !== undefined &&\r\n !!data.PlanedEventsEnabled &&\r\n !!data.AlertInfo.show &&\r\n isAuthenticated\r\n ) {\r\n if (!data.AlertInfo.hasDownActive) {\r\n if (!!data.AlertInfo.isAdmin && !!data.AlertInfo.assetId) {\r\n actions.push(() => (\r\n [\r\n \r\n {t(translations.PleaseSelectAnEventType)}\r\n ,\r\n ...data.Alerts.map(a => (\r\n \r\n {a.Name}\r\n \r\n )),\r\n ]}\r\n >\r\n \r\n \r\n ));\r\n }\r\n } else if (!!data.AlertInfo.noAlerts || !!data.AlertInfo.hasActive) {\r\n if (!!data.AlertInfo.isAdmin && !!data.AlertInfo.alertId) {\r\n actions.push(() => (\r\n \r\n \r\n \r\n ));\r\n }\r\n }\r\n }\r\n };\r\n const addConsumable = () => {\r\n if (data.ServiceTypeId === ServiceType.Offline && isAuthenticated) {\r\n actions.push(() => (\r\n }\r\n title={t(translations.ReportAConsumable)}\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 if (bookable) {\r\n addReservation();\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 if (isAuthenticated) {\r\n const assetActionsDropDown = getTopAssetActionsDropDown({\r\n data,\r\n });\r\n\r\n actions.push(...assetActionsDropDown.map(item => () => item));\r\n }\r\n }\r\n return actions;\r\n }, [data, getTopAssetActionsDropDown, isAuthenticated, mismatchCore, t]);\r\n const RenderRows = () => {\r\n return !!data ? (\r\n \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 cellData.value !== null &&\r\n cellData.value !== undefined &&\r\n cellData.value !== '' && (\r\n \r\n {!r.NoHeader && (\r\n \r\n \r\n {r.Header ? r.Header(cellData) : r.Name}\r\n \r\n \r\n )}\r\n \r\n {cell(cellData)}\r\n \r\n \r\n )\r\n );\r\n })}\r\n setOpenEndUsage(false)}\r\n onConfirm={HandleEndUsage}\r\n />\r\n \r\n ) : (\r\n <>\r\n );\r\n };\r\n const RenderCoreMismatch = () => {\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 if (\r\n data?.AvailabilityTypeId === AvailabilityTypes.ServiceGroup &&\r\n redirectToDashOnCoreClick &&\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 ? (\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={onClose}\r\n rightTopActions={rightTopActions}\r\n leftTopActions={topActions}\r\n maxLeftTopButtonsLength={maxLeftTopButtonsLength}\r\n isCover={props.isCover}\r\n closeCover={props.closeCover || closeAssetCover}\r\n cover={assetCover}\r\n />\r\n );\r\n};\r\nexport const editLink = (\r\n availabilityTypeId: number,\r\n assetId?: number,\r\n serviceId?: number,\r\n serviceGroupId?: number,\r\n divisionId?: number,\r\n) => {\r\n switch (availabilityTypeId as AvailabilityTypes) {\r\n case AvailabilityTypes.NotAvailable:\r\n case AvailabilityTypes.AvailableNotBookable:\r\n case AvailabilityTypes.FreelyBookableBillable:\r\n case AvailabilityTypes.ApprovalRequiredBillable:\r\n case AvailabilityTypes.FreelyBookable:\r\n case AvailabilityTypes.BookableWApproval:\r\n case AvailabilityTypes.TrainingProgram:\r\n case AvailabilityTypes.LoanableEquipment:\r\n case AvailabilityTypes.LectureRoom:\r\n return toRootedURL(\r\n `/NewResource.aspx?Edit=${serviceId}&back=assetdetails&assetid=${assetId}`,\r\n );\r\n case AvailabilityTypes.ServiceRelated:\r\n return toRootedURL(\r\n `/OfflineServiceType.aspx?ID=${serviceId}&back=assetdetails&assetid=${assetId}`,\r\n );\r\n case AvailabilityTypes.RequestRelated:\r\n return toRootedURL(\r\n `/SampleType.aspx?ID=${serviceId}&back=assetdetails&assetid=${assetId}`,\r\n );\r\n case AvailabilityTypes.ServiceGroup:\r\n return toRootedURL(`/newgroup.aspx?edit=${serviceGroupId}`);\r\n case AvailabilityTypes.SuperGroup:\r\n return toRootedURL(`/newsupergroup.aspx?edit=${divisionId}`);\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nexport const AssetLink = (props: {\r\n id?: number;\r\n serviceId?: number;\r\n children: ReactNode;\r\n title?: string;\r\n}) => {\r\n const { t } = useTranslation();\r\n const openAsset = useOpenAssetPopUp();\r\n const open = () => {\r\n openAsset({ Id: props.id, serviceId: props.serviceId });\r\n };\r\n return (\r\n \r\n open()}>\r\n {props.children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport const useOpenAssetPopUp = () => {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n return useCallback(\r\n (props: { Id?: number; serviceId?: number }) => {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.AssetDetails,\r\n props: { Id: props.Id, serviceId: props.serviceId },\r\n expanded: false,\r\n }),\r\n );\r\n },\r\n [actions, dispatch],\r\n );\r\n};\r\nexport const OpenAssetPrimaryAction: PrimaryActionDynamic<{\r\n Id: number;\r\n}> = (dispatch, actions, row) => {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.AssetDetails,\r\n props: { Id: row.original.Id },\r\n expanded: false,\r\n }),\r\n );\r\n};\r\n","import { BooleanRender } from 'app/components/BasicTable/components/BooleanRender';\r\nimport { Link } from 'app/components/ExternalLink';\r\nimport { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport { Dispatch, Fragment, ReactNode, SetStateAction } from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { AllowedSettings, GlobalSettings } from 'utils/globalSettings';\r\nimport {\r\n ArrayRenderer,\r\n DateRenderer,\r\n HtmlRenderer,\r\n} from './AttributeRenderers';\r\nimport { AssetUser } from './IAsset';\r\nimport { IAssetRow } from './IAssetRow';\r\nimport { ServiceType } from '../../../enums/ServiceTypes';\r\nimport { Link as MuiLink } from '@material-ui/core';\r\nimport { AssetLink } from '.';\r\nimport { DoubleRender } from 'app/components/BasicTable/components/DoubleRenderer';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { enumToEntityArray } from 'utils/enumKeys';\r\nimport { MinTimeAheadPeriodTypes } from 'enums/MinTimeAheadPeriodTypes';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport { InstrumentRestrictions } from '../InstrumentRestrictionsPage/Details/InstrumentRestrictions';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { RestrictedReservationsOptions } from 'enums/RestrictedReservationsOptions';\r\nimport { getAssetImageSrc } from 'app/components/AssetThumbImage/getAssetImageSrc';\r\n\r\nexport const getRows = (\r\n t: TFunction,\r\n setting: GlobalSettings,\r\n publicUrl?: string,\r\n setCover?: Dispatch>,\r\n): IAssetRow[] => [\r\n {\r\n Id: 'ImageName',\r\n Name: t(translations.ImageName) as string,\r\n Cell: ({ value }) =>\r\n !!value && (\r\n \r\n ),\r\n NoHeader: true,\r\n validToRender: ({ value }) => !!value,\r\n },\r\n {\r\n Id: 'ServiceGroupName',\r\n Name: t(translations.ServiceGroup) as string,\r\n },\r\n {\r\n Id: 'AvailabilityTypeName',\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} - ${t(translations.ApprovalRequired)}`}\r\n \r\n ) : (\r\n {value}\r\n )}\r\n \r\n );\r\n },\r\n },\r\n {\r\n Id: 'EquipmentRestrictionsOverview',\r\n Name: t(translations.RestrictionsOverview) as string,\r\n validToRender: ({ value, original }) => {\r\n return (\r\n !!value &&\r\n value !== null &&\r\n value !== '' &&\r\n original.ServiceTypeId === ServiceType.Online &&\r\n original.ReservationEnabled &&\r\n !setting.GetBooleanByKey(AllowedSettings.HideInstrumentRestrictions) &&\r\n original.AssemblyId === null\r\n );\r\n },\r\n Cell: ({ value }) => {\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n },\r\n },\r\n {\r\n Id: 'PrerequisiteEquipments',\r\n Name: t(translations.PrerequisiteTrainings) as string,\r\n validToRender: ({ value, original }) =>\r\n !!value && value.length > 0 && original.ReservationEnabled,\r\n Cell: ArrayRenderer>(v => (\r\n {v.Name}\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.ReservationEnabled,\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.ReservationEnabled,\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.ReservationEnabled,\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.ReservationEnabled,\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 && value !== null && value > 0 && original.ReservationEnabled,\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.ServiceTypeId ?? 0) === (ServiceType.Online as number) &&\r\n !setting.GetBooleanByKey(\r\n AllowedSettings.HideInstrumentRestrictions,\r\n ) &&\r\n !original.AssemblyId) ||\r\n (!!original.PrerequisiteEquipments &&\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: 'DivisionName',\r\n Name: t(translations.AssetsInstituteBusiness) as string,\r\n },\r\n {\r\n Id: 'Accessories',\r\n Name: t(translations.Accessories) as string,\r\n Cell: ArrayRenderer>(v => <>{v.Name}),\r\n },\r\n {\r\n Id: 'AssetCatGroupName',\r\n Name: t(translations.AssetCatGroupName) as string,\r\n Cell: ({ value }) => {\r\n if (!!value && setting.GetBooleanByKey(AllowedSettings.AssetCatEnabled)) {\r\n return <>{value};\r\n }\r\n },\r\n },\r\n {\r\n Id: 'AssetCat',\r\n Name: t(translations.AssetCategory) as string,\r\n PropName: 'AssetCatName',\r\n validToRender: ({ value }) => {\r\n return (\r\n !!value && setting.GetBooleanByKey(AllowedSettings.AssetCatEnabled)\r\n );\r\n },\r\n Cell: ({ value, original }) => {\r\n return (\r\n <>\r\n {value}\r\n <>\r\n {!!original.AssetCatInternalServiceAvaliable && (\r\n <>{t(translations.InternalServiceAvaliable)}\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 }) =>\r\n !!value ||\r\n (!!original.AmAdmin &&\r\n (!!original.LocationUpdatedAt || !!original.LocationUpdatedByDn)),\r\n Cell: ({ value, original }) => (\r\n <>\r\n {!!value && <>{value}}\r\n {!!original.AmAdmin && (\r\n <>\r\n {!!original.LocationUpdatedAt && <>{original.LocationUpdatedAt}}\r\n {!!original.LocationUpdatedByDn && (\r\n <>{original.LocationUpdatedByDn}\r\n )}\r\n \r\n )}\r\n \r\n ),\r\n dependencies: ['LocationUpdatedAt', 'LocationUpdatedByDn'],\r\n },\r\n {\r\n Id: 'LocationUpdatedAt',\r\n Name: t(translations.LocationUpdatedAt),\r\n validToRender: ({ value, original }) =>\r\n !!original.Room && !!original.AmAdmin,\r\n Cell: ({ original, value }) => DateRenderer({ original, value }),\r\n },\r\n {\r\n Id: 'LocationUpdatedByDn',\r\n Name: t(translations.LocationUpdatedBy),\r\n validToRender: ({ value, original }) =>\r\n !!original.Room && !!original.AmAdmin && !!value,\r\n Cell: ({ value }) => <>{value},\r\n },\r\n {\r\n Id: 'LocationsList',\r\n Name: t(translations.LocationsList) as string,\r\n PropName: 'LocationName',\r\n },\r\n {\r\n Id: 'SubLocationName',\r\n Name: t(translations.LocationsList) as string,\r\n PropName: 'SubLocationName',\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: ArrayRenderer(v => (\r\n <>\r\n {!!v.DisplayName ? v.Name : v.DisplayName}\r\n {!!v.Email && {v.Email}}\r\n {!!v.OfficeTel && {v.OfficeTel}}\r\n \r\n )),\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: ArrayRenderer(v => (\r\n <>\r\n {!!v.DisplayName ? v.Name : v.DisplayName}\r\n {!!v.Email && {v.Email}}\r\n {!!v.OfficeTel && {v.OfficeTel}}\r\n \r\n )),\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.ExtraDDL0Value},\r\n },\r\n {\r\n Id: 'ExtraDDL1',\r\n Name: t(translations.Asset_ExtraDDL1) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL1Value},\r\n },\r\n {\r\n Id: 'ExtraDDL2',\r\n Name: t(translations.Asset_ExtraDDL2) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL2Value},\r\n },\r\n {\r\n Id: 'ExtraDDL3',\r\n Name: t(translations.Asset_ExtraDDL3) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL3Value},\r\n },\r\n {\r\n Id: 'ExtraDDL4',\r\n Name: t(translations.Asset_ExtraDDL4) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL4Value},\r\n },\r\n {\r\n Id: 'ExtraDDL5',\r\n Name: t(translations.Asset_ExtraDDL5) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL5Value},\r\n },\r\n {\r\n Id: 'ExtraDDL6',\r\n Name: t(translations.Asset_ExtraDDL6) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL6Value},\r\n },\r\n {\r\n Id: 'ExtraDDL7',\r\n Name: t(translations.Asset_ExtraDDL7) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL7Value},\r\n },\r\n {\r\n Id: 'ExtraDDL8',\r\n Name: t(translations.Asset_ExtraDDL8) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL8Value},\r\n },\r\n {\r\n Id: 'ExtraDDL9',\r\n Name: t(translations.Asset_ExtraDDL9) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL9Value},\r\n },\r\n {\r\n Id: 'ExtraDDL10',\r\n Name: t(translations.Asset_ExtraDDL10) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL10Value},\r\n },\r\n {\r\n Id: 'ExtraDDL11',\r\n Name: t(translations.Asset_ExtraDDL11) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL11Value},\r\n },\r\n {\r\n Id: 'ExtraDDL12',\r\n Name: t(translations.Asset_ExtraDDL12) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL12Value},\r\n },\r\n {\r\n Id: 'ExtraDDL13',\r\n Name: t(translations.Asset_ExtraDDL13) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL13Value},\r\n },\r\n {\r\n Id: 'ExtraDDL14',\r\n Name: t(translations.Asset_ExtraDDL14) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL14Value},\r\n },\r\n {\r\n Id: 'ExtraDDL15',\r\n Name: t(translations.Asset_ExtraDDL15) as string,\r\n Cell: ({ value, original }) => !!value && <>{original.ExtraDDL15Value},\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 }) => value && <>{original.Age},\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: 'NotActive',\r\n Name: t(translations.NotActive) as string,\r\n Cell: notActive => ,\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","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 { 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 ?? 0;\r\n let res: string = '';\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 '(' + res + ')';\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 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 setValue(oldVal => {\r\n const newState = {\r\n unitType: val,\r\n value: oldVal?.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","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 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","/**\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 { Menu, MenuProps } from '@material-ui/core';\r\nimport { ReactNode, useState } from 'react';\r\nimport { Button, ButtonProps } from '../BasicButtons/Button';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\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 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 disablePortal,\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 {title ? (\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 addChevron ? (\r\n \r\n ) : undefined\r\n }\r\n {...other}\r\n >\r\n {children}\r\n \r\n \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 addChevron ? (\r\n \r\n ) : undefined\r\n }\r\n {...other}\r\n >\r\n {children}\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 { 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 { 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","/**\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 {\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) => {\r\n const url = `/api/reservation/${id}`;\r\n return httpClient.get(url);\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 *\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","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\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","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 // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [globalServiceGroupFilter],\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 * 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 * 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\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}\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 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 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 {...other}\r\n >\r\n <>{text}\r\n \r\n );\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 { 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","/**\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","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","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\n\r\nexport function mapSettingsFromServices(\r\n equipments: IReservationEquipmentDto[],\r\n accServices: IEquipmentAccServiceDto[],\r\n globalSettings: GlobalSettingsType,\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 => f.ForceTutoring === true && f.IsAdmin === 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(f => f.IsAdmin === true),\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 ExperimentId: current.ExperimentEln?.Id,\r\n ExternalCustomerId: current.ExternalCustomer?.Id,\r\n FundingType: 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 ServiceRequestProjectId: current.ServiceRequestProject?.Id,\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 BudgetPercent: current.BudgetPercent,\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 ExperimentId: state.details.ExperimentEln?.Id,\r\n ExternalCustomerId: state.details.ExternalCustomer?.Id,\r\n FundingType: 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 ServiceRequestProjectId: state.details.ServiceRequestProject?.Id,\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 percent: f.BudgetPercent,\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 BudgetPercent: state.details.BudgetPercent,\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 { call, put, select, takeLatest, takeLeading } 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 {\r\n EquipmentsChangeStateParameters,\r\n IMandatoryEquipmentsDto,\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 { selectAuthenticatedUser, selectOffsetDate } 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 { tryParseInt } from 'utils/string-utils';\r\nimport { repetitiveActions } from 'app/components/Forms/FormRepetitive/slice';\r\n\r\nfunction* doReservationInint(\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 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* 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 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 let newSettings = mapSettingsFromServices(\r\n allEquipments,\r\n action.payload.accServices,\r\n action.payload.globalSettings,\r\n action.payload.settings,\r\n );\r\n yield put(actions.updateEquipmentSettingsState(newSettings));\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, doReservationInint);\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 BudgetPercent: dto.BudgetPercent,\r\n DisplayName: dto.DisplayName,\r\n ExperimentEln: (dto.ExperimentEln as Entity) || null,\r\n ExternalCustomer: (dto.ExternalCustomer as Entity) || null,\r\n FundingType: getSingleInvoiceFundingType(dto.FundingType || 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 ServiceRequestProject:\r\n (dto.ServiceRequestProject as Entity) || null,\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","/**\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 * 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}\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","import { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { AvailabilityTypes } from 'enums/asset';\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}\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 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 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 return (\r\n serType === ServiceType.Online ||\r\n serType === ServiceType.Offline ||\r\n serType === ServiceType.Sample\r\n );\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 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 default:\r\n return false;\r\n }\r\n};\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","/**\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 { createSelector } from '@reduxjs/toolkit';\r\nimport { AvailabilityTypes } from 'enums/asset';\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 selectShowEditArticleAssociation = createSelector(\r\n [selectArticles],\r\n state => state.showEditArticleAssociation,\r\n);\r\nexport const selectArticleDetailsBusy = createSelector(\r\n [selectArticles],\r\n state => state.articleDetailsBusy,\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","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","/**\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 * 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 { 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","/**\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 {\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 {...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","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 * 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 * 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","/**\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 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\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 { 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 { 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(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 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 { 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\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 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}\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 } = props;\r\n const classes = useStyles();\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\r\n return (\r\n
\r\n {\r\n setTooltipOpen(!popupState.isOpen);\r\n }}\r\n onClose={() => setTooltipOpen(false)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n {items.map((item, index) => {\r\n return item.href ? (\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","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 } 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","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 { 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","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 * 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 { 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","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 { 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","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","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 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 >(value);\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 value;\r\n }, [value]);\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 {\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 * 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","/**\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 { 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 {\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) => {\r\n return httpClient\r\n .get(url, {\r\n reference,\r\n type,\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 { 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","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 { 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 { 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 = (date?: Date | string): 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)[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","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","/**\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 * 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 { 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","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","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 * 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","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 processing?: boolean;\r\n}\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 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: props.predicates,\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 {\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","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 { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n selectIsExpanded,\r\n selectUserProfileSettings,\r\n} 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\nimport { useCustomCompareMemo } from 'use-custom-compare';\r\ninterface ExpandedType {\r\n expanded: boolean;\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(selectIsExpanded);\r\n const userProfileSett = useSelector(selectUserProfileSettings);\r\n const [expanded, setExpanded] = React.useState(\r\n !!defaultValue ? defaultValue : isExpanded,\r\n );\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 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 },\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 },\r\n [actions, dispatch],\r\n );\r\n const toggle = React.useCallback(() => {\r\n dispatch(actions.updateExpandedState_Local(!expanded));\r\n if (!isMobile) {\r\n dispatch(actions.updateExpandedState(!expanded));\r\n }\r\n }, [actions, dispatch, expanded, isMobile]);\r\n\r\n return { expanded, expand, expandLocal, toggle };\r\n}\r\n\r\nexport default useExpandedSideBarState;\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","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 { 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 { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\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 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 } 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\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 onClose,\r\n saveCreatable,\r\n preventRefreshTable,\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(selectInventoryBatchProcessing);\r\n const actionCompleted = useSelector(selectInventoryBatchCompleted);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const continueToOther = useSelector(selectContinueState);\r\n const continueLink = useSelector(selectContinueToLink);\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 [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 dispatch(actions.resetInventoryBatchState());\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: 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 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 * 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 * 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","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);\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\nconst 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\n\r\nexport interface CustomEmptyTableProps {\r\n id?: string;\r\n headTitle?: string;\r\n title?: string;\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 {headTitle &&

{headTitle}

}\r\n {title &&

{title}

}\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 } 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 ...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) {\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 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 {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 \r\n {isSomeSelected && selectedRowsActions !== undefined ? (\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 // )\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 { 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}\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 ...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 = [...currentState, { ...item, ...{ open: true } }];\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 = [...currentState, { ...item, ...{ open: true } }];\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 { 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 { Grid, Divider, Card } 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","/**\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 { IViewState, ViewTypes } from './Scheduler/slice/types';\r\nimport { generatePath } from 'react-router';\r\nimport { calendarPageFullPath } from './index';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectGlobalDbSetting_EnableLegacyScheduler } from 'app/slice/globalDbSettingsSelectors';\r\nimport { toQueryString } from 'utils/url-utils';\r\nimport { dateUtils } from 'utils/date-utils';\r\n\r\n/**\r\n * Generates path of the scheduler (calendar/timeline) page\r\n * @param params\r\n * @returns\r\n */\r\nexport const GetCalendarPagePath = (params: IViewState) =>\r\n GetSchedulerPagePath(params.viewType);\r\n\r\nexport const GetSchedulerPagePath = (viewType: ViewTypes) =>\r\n generatePath(calendarPageFullPath, {\r\n type: viewType,\r\n });\r\n\r\nexport const useCalendarLink = (props?: {\r\n equipments?: Array;\r\n start?: string | Date;\r\n openToBook?: boolean;\r\n viewType: ViewTypes;\r\n defaultMulti?: boolean;\r\n}): string => {\r\n const EnableLegacyScheduler = useSelector(\r\n selectGlobalDbSetting_EnableLegacyScheduler,\r\n );\r\n if (EnableLegacyScheduler) {\r\n switch (props?.viewType) {\r\n case 'calendar':\r\n const params = {\r\n id: props?.equipments\r\n ?.filter(f => f !== undefined)\r\n ?.map(r => `os${r}`)\r\n ?.join(','),\r\n Start:\r\n props?.start === undefined\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(props?.start),\r\n ),\r\n openToBook: props?.openToBook,\r\n };\r\n\r\n return `/Weekly.aspx?${toQueryString(params)}`;\r\n case 'timeline':\r\n return `/Timeline.aspx?${toQueryString({\r\n services: props?.equipments?.filter(f => f !== undefined)?.join(','),\r\n Start:\r\n props?.start === undefined\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(\r\n dateUtils.parseISO(props?.start),\r\n ),\r\n openToBook: props?.openToBook,\r\n })}`;\r\n }\r\n }\r\n return `/schedule/${props?.viewType.toLowerCase()}?${toQueryString({\r\n eid: props?.equipments\r\n ?.filter(f => f !== undefined)\r\n ?.map(r => `${r}`)\r\n ?.join(','),\r\n Start:\r\n props?.start === undefined\r\n ? undefined\r\n : dateUtils.formatQueryStringDate(dateUtils.parseISO(props?.start)),\r\n openToBook: props?.openToBook,\r\n defaultMulti: props?.defaultMulti,\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}\r\n\r\nexport function CalendarButton({\r\n equipments,\r\n start,\r\n openToBook,\r\n viewType = 'calendar',\r\n defaultMulti,\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 * 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","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 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) {\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","export * from './CampusPickerFilter';\r\nexport * from './DatePickerFilter';\r\nexport * from './TextFieldFilter';\r\nexport * from './IFilterComponentProps';\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 * 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","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 { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { ArticleDetailsProps } from 'app/pages/ArticlesPage/ArticleDetails';\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\n\r\nfunction* doShowDetails(action: PayloadAction) {\r\n const props: ArticleDetailsProps = {\r\n useSidePanel: true,\r\n value: action.payload,\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 > 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 = data;\r\n } else {\r\n if (action.payload.ExternalId !== null) {\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\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\nfunction* doHideDetails(action: PayloadAction) {\r\n yield put(layoutActions.toggleSidePanel(false));\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.resetSidePanel());\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));\r\n } catch (error) {\r\n yield put(\r\n appSettingsActions.addNotification({\r\n variant: 'error',\r\n message: 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.hideDetails.type, doHideDetails);\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 showEditArticleAssociation: false,\r\n articleDetailsBusy: false,\r\n editArticleAssociationBusy: false,\r\n};\r\n\r\nconst slice = createSlice({\r\n name: 'articles',\r\n initialState,\r\n reducers: {\r\n showDetails(state, action: PayloadAction) {\r\n state.articleDetails = action.payload;\r\n state.articleDetailsBusy = true;\r\n state.editArticleAssociationBusy = false;\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 hideDetails(state, action: PayloadAction) {\r\n delete state.articleDetails;\r\n },\r\n showEditArticleAssociation(state, action: PayloadAction) {\r\n state.showEditArticleAssociation = action.payload;\r\n },\r\n saveArticleAssociation(state, action: PayloadAction) {\r\n state.editArticleAssociationBusy = true;\r\n },\r\n saveArticleAssociation_Success(state, action: PayloadAction) {\r\n state.articleDetails = action.payload;\r\n state.showEditArticleAssociation = false;\r\n state.editArticleAssociationBusy = false;\r\n },\r\n saveArticleAssociation_Error(state, action: PayloadAction) {\r\n state.editArticleAssociationBusy = false;\r\n },\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 },\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","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}\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 { 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","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","/**\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 { 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 { 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 &.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 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}));\r\n\r\nexport const FormFieldsBox = 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 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(2)}px;\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 }) => {\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 * 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","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 } 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 { InstrumentsFilterDisplay } from 'app/components/BasicTable/BasicFilter/FilterDisplay/InstrumentsFilterDisplay';\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 });\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 });\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 });\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 });\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 });\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 });\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 });\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 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 });\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 });\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","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","/**\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","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 * 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","/**\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","// 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 { 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","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 { 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 { 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_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 '&: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 },\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 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 },\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 #e0e5ec',\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 #e0e5ec',\r\n },\r\n '& th:first-child ': {\r\n boxShadow: '0px 1px 0px 0px #e0e5ec',\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 #e0e5ec',\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 },\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 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.grayscale.grayBackground,\r\n zIndex: 1200,\r\n '&.mobile': {\r\n width: 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 '&.mobile': {\r\n width: 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: 7 * 8 + 1,\r\n },\r\n },\r\n },\r\n },\r\n paper: {\r\n '.sideBarDrawer &': {\r\n background: bookitColors.grayscale.grayBackground,\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 },\r\n '.sideBarDrawer.mobile &': {\r\n width: DRAWER_MOBILE_WIDTH,\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: 7 * 8,\r\n [breakpoints.up('sm')]: {\r\n width: 7 * 8 + 1,\r\n },\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 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 * 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 Box from '@material-ui/core/Box';\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 {\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 * 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 withoutServiceGroups?: boolean;\r\n}\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) => {\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:\r\n withoutServiceGroups === undefined || withoutServiceGroups === false\r\n ? 'Id,Name,BuildingId,BuildingName,ServiceGroupsIds'\r\n : 'Id,Name,BuildingId,BuildingName,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 ? 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) => {\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 withoutServiceGroups === undefined || withoutServiceGroups === false\r\n ? ['Id', 'Name', 'BuildingId', 'BuildingName', 'ServiceGroupsIds']\r\n : ['Id', 'Name', 'BuildingId', 'BuildingName', 'ServiceGroups'],\r\n maxTop: 100,\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 '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 });\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 );\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","/**\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\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', '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","/**\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 openWorkOrder()}\r\n >\r\n {t(translations.SwitchToDowntime)}\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\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: NewComment) => void;\r\n\r\n onEditComment?: (comment: IComment, newComment: NewComment) => void;\r\n onDeleteComment?: (comment: IComment) => void;\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 [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 // const classes = useStyles();\r\n\r\n return (\r\n {\r\n CommentsApi.SendComment(commentType, referenceId, c)\r\n .then(() => props.onCommentAdded?.(c))\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 { 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","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 { 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 { 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 { SidePanelContentProps } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { InventoryBatch } from '../InventoryBatch';\r\nimport { Body, ButtonLabel } from 'app/components/Typography';\r\nimport { Roles } from 'app/slice/types';\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 onClose,\r\n editCreatable,\r\n saveCreatable,\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\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 confirmApproved = useSelector(selectConfirmApproved);\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const continueToOther = useSelector(selectContinueState);\r\n const continueLink = useSelector(selectContinueToLink);\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 [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 // dispatch(connectedFiltersActions.resetConnectedState());\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.resetDetailsState(editCreatable));\r\n if (!editCreatable) {\r\n dispatch(connectedFiltersActions.resetConnectedState());\r\n }\r\n }, [\r\n actions,\r\n connectedFiltersActions,\r\n dispatch,\r\n editCreatable,\r\n layoutActions,\r\n onClose,\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 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 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 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: '' + serviceType,\r\n }}\r\n />,\r\n );\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 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={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","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 { 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","export enum ReservationOrDowntimeEnum {\r\n All = 0,\r\n ReservationsOnly = 1,\r\n DownTimeOnly = 2,\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","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","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 {\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","export enum PurchaseOrderOptions {\r\n Hidden = 0,\r\n Optional = 1,\r\n Mandatory = 2,\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 { 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","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","/**\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 * 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","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","/**\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 * 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 * 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,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 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 * LocationPicker\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 LocationPickerProps\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/LocationsFilter';\r\nexport const initLocationData = (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,LocationTypeId',\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,LocationTypeId',\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 LocationPicker(props: LocationPickerProps) {\r\n return (\r\n \r\n );\r\n}\r\n","import { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\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 { useDispatch, 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}\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 ...props\r\n}: ReservationEditButtonProps) {\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\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}\r\nexport function useReservationEditBehavior(\r\n props: ReservationEditBehaviorProps,\r\n) {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\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\r\n const handleClick = e => {\r\n if (!EnableLegacyScheduler) {\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 } as ReservationDetailsProps,\r\n }),\r\n );\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 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 {\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 '&.cardSize_small': {\r\n padding: '8px 12px 8px 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: 'auto',\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: 'center',\r\n padding: 0,\r\n gap: 8,\r\n height: '20px',\r\n // width: '100%',\r\n '& .rowOverRule': {\r\n display: 'flex',\r\n width: '100%',\r\n alignItems: 'center',\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 { 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","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","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) {\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);\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","/**\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","/**\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","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 { Button } from 'app/components/BasicButtons/Button';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { toQueryString } from 'utils/url-utils';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { translations } from 'locales/translations';\r\nimport { useDispatch } from 'react-redux';\r\nimport * as React from 'react';\r\nimport { useHistory, 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 { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { Skeleton } from '@material-ui/lab';\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}\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}: AddWorkOrderProps) {\r\n const { t } = useTranslation();\r\n const location = useLocation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const isMobile = DetectIsMobile();\r\n const history = useHistory();\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 isMobile\r\n ? history.push(['/workorders/details?', toQueryString(params)].join(''))\r\n : dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.WorkOrderDetails,\r\n props: params,\r\n }),\r\n );\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: 'Name 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\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: 'Name 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(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 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 { 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 { Roles } from 'app/slice/types';\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 const admins =\r\n authenticatedUser !== undefined &&\r\n (authenticatedUser.Roles.includes(Roles.Administrators) ||\r\n authenticatedUser.Roles.includes(Roles.GroupAdministrators));\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 ];\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: true,\r\n canPrintOrExport: admins,\r\n canExportAssetRanges: canExportAssetRanges,\r\n isShowAllCores: showAllCores,\r\n authenticatedUser: authenticatedUser,\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, 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\n\r\nexport interface RecentAssetsProps {\r\n actionType: AssetActionType;\r\n primaryAction?: (row: AssetQuickSearchDetails) => void;\r\n useSidePanel?: boolean;\r\n expanded?: 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 '& .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 } = 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 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
    \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","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 { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { AssetPopUp } from 'app/pages/AssetPopUp';\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 'enums/asset';\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\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 searchTerm?: string;\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 // 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: layoutActions } = useLayoutSlice();\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 [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 }),\r\n ),\r\n [actionType, filters, props.pageLink, publicUrl, searchTerm, serviceTypeId],\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(\r\n (id: number) => {\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: { Id: id, showAllCores: showAllCores },\r\n expanded: false,\r\n }),\r\n );\r\n },\r\n [dispatch, layoutActions, 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 true;\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]);\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.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 '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.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 AvailabilityTypes.ServiceRelated as number,\r\n AvailabilityTypes.RequestRelated as number,\r\n ];\r\n case 'TrainingSession':\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 '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 return actions;\r\n }, [allowAllCoresToggle, handleSearchAllCores, showAllCores, t]);\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 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 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","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","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 { 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","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 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 { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport {\r\n RenderPageType,\r\n SidePanelContentProps,\r\n} 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 { Link as MuiLink } from '@material-ui/core';\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 { toRootedURL } from 'utils/url-utils';\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\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}\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 onClose,\r\n useSidePanel,\r\n showTable,\r\n initUser,\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 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\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\r\n const openAsset = React.useCallback(\r\n (item: IAssetDto) => {\r\n if (props.isCover) {\r\n window.location.href = toRootedURL(\r\n `/Assets/Details.aspx?id=${item.Id}`,\r\n );\r\n } else {\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n props: { Id: item.Id, serviceId: item.ServiceId ?? -1 },\r\n type: RenderPageType.AssetDetails,\r\n expanded: false,\r\n }),\r\n );\r\n }\r\n },\r\n [dispatch, layoutActions, props.isCover],\r\n );\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\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 {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={() => openAsset(item)}\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 (\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={onClose}\r\n //rightTopActions={data?.AmAdmin ? [EditButton] : undefined}\r\n isCover={props.isCover && !showTable}\r\n closeCover={props.closeCover}\r\n />\r\n );\r\n}\r\nexport const RestrictionsLink = (props: {\r\n serviceId?: number;\r\n children: React.ReactNode;\r\n useSidePanel?: boolean;\r\n showTable?: boolean;\r\n title?: string;\r\n}) => {\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const open = () => {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.RestrictionDetails,\r\n props: {\r\n serviceId: props.serviceId,\r\n showTable: props.showTable,\r\n useSidePanel: props.useSidePanel || true,\r\n isCover: false,\r\n },\r\n expanded: props.showTable,\r\n }),\r\n );\r\n };\r\n return (\r\n \r\n open()}>\r\n {props.children}\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 { H4 } 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 useSidePanel?: boolean;\r\n buttonsLenth: number;\r\n expandPanel?: () => void;\r\n tooltip?: string;\r\n isCover?: boolean;\r\n}\r\nconst TitleSection = styled('div')`\r\n display: flex;\r\n gap: 4px;\r\n`;\r\nconst ShortTitle = styled('span')`\r\n cursor: pointer;\r\n`;\r\nexport function TitlePage(props: TitlePageProps) {\r\n const { t } = useTranslation();\r\n const {\r\n title,\r\n pageLink,\r\n useSidePanel,\r\n buttonsLenth,\r\n expandPanel,\r\n tooltip,\r\n isCover,\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 isMobile || (useSidePanel && !sidePanelExpanded) || isCover;\r\n }, [isCover, isMobile, sidePanelExpanded, 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 : 20\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);\r\n return pageLink ? (\r\n setShowCopy(true)}\r\n onMouseLeave={() => setShowCopy(false)}\r\n >\r\n {isMobile && !useSidePanel && }\r\n {expandPanel && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n

    \r\n {showShortView ? (\r\n \r\n {{truncatedTitle}}\r\n \r\n ) : (\r\n title\r\n )}\r\n

    \r\n
    \r\n {showCopy && absolutePageLink !== undefined && (\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 {showShortView ? (\r\n \r\n {{truncatedTitle}}\r\n \r\n ) : (\r\n title\r\n )}\r\n

    \r\n );\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 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 { 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","import { makeStyles, Theme } from '@material-ui/core/styles';\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: '10px',\r\n height: '10px',\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 },\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 },\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 },\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 },\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: 'inherit',\r\n minHeight: '42px',\r\n overflowX: 'auto',\r\n '&::-webkit-scrollbar': {\r\n height: '8px',\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 }));\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","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","/**\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 { FieldHookConfig, useField } from 'formik';\r\nimport * as React from 'react';\r\nimport { EntityType } from 'types/common';\r\nimport { AutocompletePicker } from '../BasicPickers/AutocompletePicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport interface FormAutocompleteProps {\r\n loadData: (searchTerm: string | null) => Promise;\r\n initValue?: T | null;\r\n size?: 'medium' | 'small';\r\n mini?: boolean;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n}\r\nexport function FormAutocomplete({\r\n label,\r\n loadData,\r\n id,\r\n initValue,\r\n variant,\r\n ...props\r\n}: FieldHookConfig & FormAutocompleteProps & IFieldProps) {\r\n const [field, meta, helpers] = useField(props);\r\n const handleChange = (e: T | null) => {\r\n helpers.setValue(e, true);\r\n if (props.onChange !== undefined) {\r\n props.onChange(e);\r\n }\r\n //field.onChange(e);\r\n };\r\n return (\r\n \r\n );\r\n}\r\n","import { FieldHookConfig, useField } from 'formik';\r\nimport * as React from 'react';\r\nimport { Entity } from 'types/common';\r\nimport { AutocompleteMultiPicker } from '../BasicPickers/AutocompleteMultiPicker';\r\nimport { IFieldProps } from './FormRender/IFormFieldSetting';\r\n\r\nexport interface FormAutocompleteMultiProps {\r\n loadData: (searchTerm: string | null) => Promise[]>;\r\n initValue?: Entity[];\r\n size?: 'medium' | 'small';\r\n mini?: boolean;\r\n variant?: 'standard' | 'filled' | 'outlined';\r\n}\r\n\r\nexport function FormAutocompleteMulti({\r\n label,\r\n loadData,\r\n id,\r\n initValue,\r\n variant,\r\n ...props\r\n}: FormAutocompleteMultiProps &\r\n FieldHookConfig[] | null> &\r\n IFieldProps) {\r\n const [field, meta, helpers] = useField[] | null>(props);\r\n const handleChange = (e: Entity[] | null) => {\r\n helpers.setValue(e, true);\r\n if (props.onChange !== undefined) {\r\n props.onChange(e);\r\n }\r\n //field.onChange(e);\r\n };\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 { 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}\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 * 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 { Box, makeStyles, Theme } from '@material-ui/core';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Icon } from '../BasicIcons/FontAwesome';\r\nimport { Body } from '../Typography';\r\n\r\nexport interface ScannerViewProps {}\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '144px',\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 },\r\n iconScann: {\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 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\nexport function ScannerView(props: ScannerViewProps) {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {t(translations.BarcodeScannViewDescription)}\r\n \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","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 },\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 { Input, MenuItem } from '@material-ui/core';\r\nimport { useMemo, useState, useRef } from 'react';\r\nimport { dateUtils } from 'utils/date-utils';\r\nimport { 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 { 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\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}\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 [files, setFiles] = useState();\r\n const formRef = useRef(null);\r\n const [commentFilesChanged, setCommentFilesChanged] = useState<\r\n boolean | undefined\r\n >(undefined);\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 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 || !!commentFilesChanged),\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 const handleSubmit = ({ Files, ...values }: NewComment) => {\r\n const comment: NewComment = {\r\n Files: files,\r\n ...values,\r\n };\r\n onSubmit(comment);\r\n onClose();\r\n };\r\n const onFileChange = e => {\r\n setFiles(e.target.files);\r\n setCommentFilesChanged((e.target.files as FileList).length > 0);\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 || commentFilesChanged)) {\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 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 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 [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(comment.Files);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const currentUserComment = authenticatedUser?.Id === comment.CreatedBy.Id;\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}: 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 \r\n {sectionTitle || t(translations.CommentsCount)}\r\n \r\n {sortedComments\r\n .slice(0, count < sortedComments.length ? count : undefined)\r\n .map((c, i) => (\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","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 { 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 { SidePanelContentProps } 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 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 } from 'utils/url-utils';\r\nimport { RenewStockForm } from './RenewStockForm';\r\nimport { InventoryBatch } from '../InventoryBatch';\r\nimport { Roles } from 'app/slice/types';\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 onClose,\r\n editCreatable,\r\n preventRefreshTable,\r\n saveCreatable,\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(selectRenewStockProcessing);\r\n const actionCompleted = useSelector(selectRenewStockCompleted);\r\n const User = useSelector(selectAuthenticatedUser);\r\n const hasChanges = useSelector(selectHasNotSavedChanges);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const continueToOther = useSelector(selectContinueState);\r\n const continueLink = useSelector(selectContinueToLink);\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 [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 dispatch(actions.resetRenewStockState());\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: 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 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.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 setCover(\r\n {\r\n closeCover();\r\n }}\r\n onClose={() => {\r\n closeCover();\r\n }}\r\n initialBatch={\r\n batch?.OfflineServiceTypeId === undefined\r\n ? undefined\r\n : batch\r\n }\r\n saveCreatable={true}\r\n queryParams={{\r\n id: '' + (batch?.Id ?? -1),\r\n stid: '' + serviceType,\r\n }}\r\n />,\r\n );\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 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","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 BudgetExperimentStatuses {\r\n Draft = 0,\r\n Pending = 1,\r\n Approved = 2,\r\n Rejected = 3,\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 { 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\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 user.HasAdminServicePermissions(row.ServiceTypeId, row.ServiceId)\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 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 };\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 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 };\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 * 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 { 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 },\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","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 isCover?: boolean;\r\n}\r\nexport const FormRow = (props: FormRowProps) => {\r\n const { children, fullRow, hide, minRow, 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 {\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\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\n\r\nconst 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 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 loadData = React.useMemo(() => getLoadData(type, $select), [\r\n $select,\r\n type,\r\n ]);\r\n return (\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","/**\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 },\r\n '&.horizontal': {\r\n display: 'inline-flex',\r\n flexWrap: 'wrap',\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 * 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 { 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","/**\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","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","/**\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 * 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 * 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 * 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","/**\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","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 * 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 * 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 * 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 * 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","/**\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","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 => reject(reason),\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","/**\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","/**\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 * 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","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","/**\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}\r\n\r\nexport const BookitlabLogo = React.memo(function BookitlabLogo(\r\n props: BookitlabLogoProps,\r\n) {\r\n const { width, height } = props;\r\n const { t } = useTranslation();\r\n\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\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","/**\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 * 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","/**\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 * 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}\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];\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 * 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 * 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\r\nconst url = '/api/odata/v4/SubLocationList';\r\nexport const initSubLocationListData = (initval: string | undefined) => {\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 });\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 globalServiceGroupFilter || [],\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\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}\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 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","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","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 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 * 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 };\r\n}\r\n","/**\r\n *\r\n * AvailabilityTypePicker\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 { AvailabilityTypes } from 'enums/asset';\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 { 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","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}\r\n\r\nexport function DownWorkOrder({\r\n rows,\r\n getAssets,\r\n buttonName,\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 * 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","/**\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 { Button } from 'app/components/BasicButtons/Button';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\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 { useDispatch } from 'react-redux';\r\n\r\nexport interface OpenWorkOrderProps {\r\n buttonName: React.ReactNode;\r\n id: number;\r\n bringBackUp?: boolean;\r\n}\r\nexport function OpenWorkOrder(props: OpenWorkOrderProps) {\r\n const { buttonName, id, bringBackUp } = props;\r\n const { t } = useTranslation();\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const openOrder = () => {\r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.WorkOrderDetails,\r\n props: {\r\n queryParams: {\r\n id: id.toString(),\r\n Up: (bringBackUp === true).toString(),\r\n },\r\n useSidePanel: true,\r\n } as WorkOrderDetailsProps,\r\n }),\r\n );\r\n };\r\n\r\n return (\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 { OpenWorkOrder } 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}\r\n\r\nexport function BringBackUp({\r\n rows,\r\n getAssetIds,\r\n getEquipmentIds,\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 { 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","/**\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","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)\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","import styled from 'styled-components';\r\nimport { Theme, Toolbar, ToolbarProps } from '@material-ui/core';\r\n\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 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 margin: 0px;\r\n padding-inline: 16px;\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 { 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}\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}: 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: '10px',\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 },\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","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 { Button, ButtonProps } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ExternalLink } from 'app/components/ExternalLink';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\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 { useDispatch, 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}\r\nexport function ReservationCreateButton({\r\n variant = 'white',\r\n size = 'small',\r\n onClick,\r\n startIcon,\r\n instruments,\r\n ...props\r\n}: ReservationCreateButtonProps) {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\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 dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.ReservationDetails,\r\n props: {\r\n useSidePanel: true,\r\n queryParams: params,\r\n } as ReservationDetailsProps,\r\n }),\r\n );\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 {...p}\r\n {...props}\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}\r\n\r\nexport function ImportButton({\r\n onDownloadTemplateButtonClick,\r\n disabled,\r\n hideImportButton,\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(actions.import({ file: file, serviceRequestId: 0 }));\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 * 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 * 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 { Condition } 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\nimport { getAutoCompleteLoadDataFn } from 'app/components/BasicPickers/Utils/autoCompletePickerUtils';\r\n\r\nconst url = '/api/odata/v4/ServiceRequestStatusFilter';\r\n\r\nexport interface ServiceRequestStatusPickerProps\r\n extends Omit, 'loadData'> {\r\n predicates?: (string | Condition)[];\r\n}\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\nconst loadData = (\r\n predicates?: (string | Condition)[],\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', 'InternalStatusId'],\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 { 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 { 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 { 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\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 [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\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 ).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 selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n selectContinueToLink,\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 } 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 { AssetPopUp } from 'app/pages/AssetPopUp';\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 { SidePanelContentProps } 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\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 onClose,\r\n continueTo,\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 continueLink = useSelector(selectContinueToLink);\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const continueToOther = useSelector(selectContinueState);\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 [cover, setCover] = React.useState();\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\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 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 handleCancelClick();\r\n }\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(layoutActions.resetContinueState());\r\n dispatch(layoutActions.resetSidePanel());\r\n dispatch(push('/workorders'));\r\n }\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 // dispatch(actions.resetReservationsState());\r\n }, [actions, dispatch, edit, layoutActions, onClose, 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 React.useEffect(() => {\r\n if (confirmApproved) {\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 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(globalActions.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 confirmApproved,\r\n confirmRejected,\r\n continueLink,\r\n continueToOther,\r\n dispatch,\r\n edit,\r\n globalActions,\r\n layoutActions,\r\n ]);\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.aspx?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 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={props.isCover ? onClose : handleClose}\r\n leftTopActions={viewPermissions ? topActions : []}\r\n children={\r\n baseModel !== undefined && !loading ? (\r\n \r\n {viewPermissions || isReadOnlyUser ? (\r\n \r\n setCover(\r\n ,\r\n )\r\n }\r\n onLinkedClick={linked =>\r\n setCover(\r\n ,\r\n )\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 pageLink={buildURL(publicUrl + 'workorders/details', props.queryParams)}\r\n leftActions={isReadOnlyUser || !viewPermissions ? [] : leftActions}\r\n rightActions={isReadOnlyUser || !viewPermissions ? [] : rightActions}\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 cover={cover}\r\n closeCover={closeCover}\r\n isCover={props.isCover}\r\n />\r\n {hasChanges && (\r\n 'Youll lose your data!'} />\r\n )}\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 { 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\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 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 portalRef = React.useRef(null);\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 ).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 } 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 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","/**\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","/**\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 { 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 } 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 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\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 processing: undefined,\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.processing = true;\r\n },\r\n init_success(state, action: PayloadAction) {\r\n state.messages.push(...action.payload);\r\n state.processing = false;\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 },\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 { 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 { 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 { 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 }\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.location.href = redirUrl; // + 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","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","/**\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 // 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 [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 = () => {\r\n if (\r\n !!props.getAllFilteredRowsCallback &&\r\n !!props.selectedFilterRowProp &&\r\n !!props.screenId\r\n ) {\r\n handleExportForImport(\r\n props.getAllFilteredRowsCallback,\r\n props.selectedFilterRowProp,\r\n props.screenId,\r\n );\r\n } else {\r\n dispatch(actions.showAlert('Import for Export is not configured!'));\r\n }\r\n // if (\r\n // props.selectedRows.length > 0 &&\r\n // props.onExportForImportClick !== undefined\r\n // ) {\r\n // props.onExportForImportClick(props.selectedRows);\r\n // } else {\r\n // dispatch(actions.showAlert(t(translations.PleaseSelectAtLeasOneRow)));\r\n // }\r\n handleClose();\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 { 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","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","/**\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","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","/**\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","/**\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 };\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","export enum MinTimeAheadPeriodTypes {\r\n Hours = 0,\r\n Days = 1,\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 {\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","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 { 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","/**\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","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 { 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 ].join(','),\r\n };\r\n return httpClient.get(url, params);\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 * 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}\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}: 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 : t(translations.RepetitiveReservation),\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 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 { 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","export enum AllowCreateInvoicesBy {\r\n AlllowCreateInvoicesBy_AllowToChooseOnCreation,\r\n AlllowCreateInvoicesBy_BudgetsOnly,\r\n AlllowCreateInvoicesBy_UserGroupOnly,\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\nimport { useSystemDate } from 'app/hooks/useSystemDate';\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 { newDate } = useSystemDate();\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: newDate(),\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 formik.setFieldValue('Date', value);\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","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","/**\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 formik.setFieldValue('Date', value);\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: '10px',\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));\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 { 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 * 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 { 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 { EndUsageData } from 'app/components/EndUsageConfirm';\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};\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 { 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","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 { AssetLink } from 'app/pages/AssetPopUp';\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 { 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 * 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 { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\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\n\r\nexport interface AddToListsProps {\r\n rows: TRow[];\r\n getEquipments: (rows: TRow[]) => Entity[];\r\n getAssets: (rows: TRow[]) => Promise[]>;\r\n}\r\n\r\nexport function AddToLists({\r\n rows,\r\n getEquipments,\r\n getAssets,\r\n}: AddToListsProps) {\r\n const { t } = useTranslation();\r\n const user = useSelector(selectAuthenticatedUser);\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 { actions } = useLayoutSlice();\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 dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.SavedViewDetails,\r\n props: params,\r\n }),\r\n );\r\n },\r\n [actions, dispatch, getEquipments, rows],\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 { 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);\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 { extractErrorMessages } from 'api/utils';\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\nimport { IResponseType } from 'types/ResponseType';\r\nimport { useResponseModel } from './useResponseModel';\r\n\r\nexport const useSendMail = (setBusy?: (busy: boolean) => void) => {\r\n const dispatch = useDispatch();\r\n const { actions } = useAppSettingsSlice();\r\n const { t } = useTranslation();\r\n const response = useResponseModel();\r\n\r\n return useCallback(\r\n (email: IEmail) => {\r\n try {\r\n setBusy?.(true);\r\n EmailApi.SendEmail(email)\r\n .then(v => {\r\n const value = v as IResponseType;\r\n response(value);\r\n })\r\n .catch(e => {\r\n //console.log(e);\r\n const error = extractErrorMessages(e);\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: !!error\r\n ? error[0]\r\n : (t(translations.err_SendEmailToUserFailed) as string),\r\n }),\r\n );\r\n setBusy?.(false);\r\n })\r\n .finally(() => setBusy?.(false));\r\n } catch (e) {\r\n const error = extractErrorMessages(e);\r\n dispatch(\r\n actions.addNotification({\r\n variant: 'error',\r\n message: !!error\r\n ? error[0]\r\n : (t(translations.err_SendEmailToUserFailed) as string),\r\n }),\r\n );\r\n setBusy?.(false);\r\n }\r\n },\r\n [actions, dispatch, response, setBusy, t],\r\n );\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","/**\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","/**\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","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 | 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 LocationPickerFilter;\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","/**\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","/**\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 { 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 await downloadFile({ path: path });\r\n resolve({\r\n ErrorMessages: [],\r\n SuccessMessages: [],\r\n WarningMessages: [],\r\n });\r\n })\r\n }\r\n />\r\n );\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","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","import { TopActionButton } from 'app/components/BasicButtons/TopActionButton';\r\nimport { translations } from 'locales/translations';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } 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 {\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\n\r\nexport function AddReservation({\r\n size,\r\n text,\r\n variant,\r\n icon,\r\n compact = true,\r\n ...props\r\n}: PageTopActionsProps) {\r\n const location = useLocation();\r\n //const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\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: true,\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 dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.AssetsSelection,\r\n props: selParams,\r\n expanded: !isMobile,\r\n }),\r\n );\r\n }}\r\n {...props}\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\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}\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 * 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 * 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 * 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","/**\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 'enums/asset';\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 { 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","/**\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 { InvoiceRowReferenceLinks } from 'app/components/InvoiceRowReferenceLinks';\r\nimport { CellProps, Renderer } from 'react-table';\r\n\r\ntype RecordType = Record;\r\nconst InvoiceRowReferenceRenderer: Renderer> = ({\r\n value,\r\n row,\r\n}) => (\r\n \r\n);\r\nexport default InvoiceRowReferenceRenderer;\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","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 { 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","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 { 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 { ServiceType } from 'enums/ServiceTypes';\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.ServiceTypeId === (ServiceType.Offline as number)) {\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.ServiceTypeId === (ServiceType.Sample as number)) {\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.ServiceTypeId]);\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.ServiceTypeId === (ServiceType.Offline as number)) {\r\n return {\r\n path: '/offlineServicetype.aspx',\r\n search: { ID: row.original.ServiceId, back: 'myassets' },\r\n };\r\n } else if (\r\n row.original.ServiceTypeId === (ServiceType.Sample as number)\r\n ) {\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.location.href = toRootedURL(hrefPath.path, hrefPath.search);\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","/**\r\n * Internal ServiceRequest Statuses enum. Generated from Bookit.Data.Enums.InternalServiceRequestStatus\r\n */\r\nexport enum InternalServiceRequestStatuses {\r\n Draft = 0,\r\n\r\n WaitingForQuote = 1,\r\n\r\n QuoteSendToUser = 2,\r\n\r\n QuoteApproved = 3,\r\n\r\n Completed = 5,\r\n\r\n Cancelled = 6,\r\n\r\n InProcess = 7,\r\n\r\n ReturnedToUser = 8,\r\n\r\n Pending = 9,\r\n\r\n Started = 10,\r\n\r\n Skipped = 11,\r\n}\r\n\r\nexport type InternalServiceRequestStatusesUnion = keyof typeof InternalServiceRequestStatuses;\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","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","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 {\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 { 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 { 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","/**\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 { OtherServiceEditLinkprops } 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}\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 }> = [];\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 });\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 });\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 });\r\n\r\n let result = references.map((item, i) => {\r\n return (\r\n \r\n \r\n \r\n {item.id}\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","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 { 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 interface NoTableDataProps {\r\n id?: string;\r\n}\r\nexport function NoTableData(props: NoTableDataProps) {\r\n const { t } = useTranslation();\r\n return (\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","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 { 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 {\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 { httpClient } from 'api/HttpClient';\r\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { Entity } from 'types/common';\r\n\r\nexport const getEnabledAttributes = async (\r\n enabled: string[],\r\n isAuthenticated?: boolean,\r\n) => {\r\n let url = '/Api/Odata/v4/AssetAttributes';\r\n let publicUrl = '/api/odata/v4/AssetAttributes/PublicAssetAttributes';\r\n try {\r\n const params = {\r\n $filter: new Condition(\r\n 'Id',\r\n ODataOperators.Includes,\r\n enabled.map(s => ({ Id: s })),\r\n ).toString(),\r\n };\r\n let result = await httpClient.get(\r\n isAuthenticated === true ? url : publicUrl,\r\n params,\r\n );\r\n const filtered = result.value;\r\n return filtered as Entity[];\r\n } catch (err) {\r\n return [];\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","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","/**\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 { 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","/**\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 { 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 ImageRenderer from 'app/components/BasicTable/CellRenderers/ImageRenderer';\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 '../AssetPopUp';\r\nimport { IMyAssetsRow } from './IMyAssetsRow';\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: ImageRenderer,\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 {value};\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 { 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","import { InvoiceDetailsSidePanelLink } from 'app/pages/InvoiceDetails/InvoiceDetailsSidePanel';\r\nimport { CellProps, Renderer } from 'react-table';\r\n\r\ntype RecordType = Record;\r\nconst InvoiceIdRenderer: Renderer> = ({ value, row }) => {\r\n return value !== null && value !== undefined && typeof value === 'number' ? (\r\n \r\n {value}\r\n \r\n ) : (\r\n <>{value}\r\n );\r\n};\r\nexport default InvoiceIdRenderer;\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\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, Roles.GroupAdministrators];\r\n\r\n const isAdmin: boolean = intersection(roles, adminRoles).length > 0;\r\n const hasPermissions: boolean = intersection(roles, allowedRoles).length > 0;\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","/**\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 'IsAdmin',\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 { 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 { 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\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 : 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 }\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 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 style?: React.CSSProperties;\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 style,\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}\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 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: 2 } });\r\n if (result.value.length === 1) {\r\n return result.value[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 }).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","/**\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","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 { 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 { ITrainingSessionDto } from 'api/odata/generated/entities/ITrainingSessionDto';\r\n\r\nexport interface TrainingSignUpAdminAlertContentProps {\r\n isAdmin: boolean;\r\n trainingSignUp?: boolean;\r\n trainingSession?: ITrainingSessionDto;\r\n}\r\nexport function TrainingSignUpAdminAlertContent({\r\n trainingSession,\r\n ...props\r\n}: TrainingSignUpAdminAlertContentProps) {\r\n const { t } = useTranslation();\r\n\r\n if (trainingSession === null) {\r\n return null;\r\n }\r\n if (trainingSession === undefined) {\r\n return null;\r\n }\r\n var show =\r\n props.isAdmin &&\r\n props.trainingSignUp &&\r\n trainingSession !== undefined &&\r\n trainingSession !== null;\r\n if (!show) {\r\n return null;\r\n }\r\n const totalUsedSlotsCount = trainingSession.TotalUsedSlots ?? 0;\r\n return (\r\n <>\r\n {t(translations.TrainingSessionsCountMessage, {\r\n count: totalUsedSlotsCount,\r\n })}\r\n\r\n {totalUsedSlotsCount > 0 && (\r\n <>\r\n \r\n \r\n {t(translations.ManageSignUps)}\r\n \r\n \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","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}\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}: 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 isUserGroupCoordinator,\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) {\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(f => f.AccServices.length > 0) &&\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 BudgetPercent: Yup.number()\r\n .label(t(translations.BudgetPercentPlaceholder) as string)\r\n .min(1, t(translations.BudgetPercentInvalid_error) as string)\r\n .max(100, t(translations.BudgetPercentInvalid_error) as string)\r\n .nullable(true),\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 ServiceRequestProject: Yup.mixed()\r\n .label(t(translations.Project) 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?.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 { PageWrapper } from 'app/Layout/FrontendLayout/components/PageWrapper';\r\nimport { translations } from 'locales/translations';\r\nimport {\r\n selectConfirmApproved,\r\n selectConfirmRejected,\r\n selectContinueState,\r\n selectContinueToLink,\r\n selectExpandedSidePanel,\r\n selectHasNotSavedChanges,\r\n} from 'app/Layout/FrontendLayout/slice/selectors';\r\nimport { push } from 'connected-react-router';\r\nimport { buildURL } 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 { AssetPopUp } from 'app/pages/AssetPopUp';\r\nimport { InstrumentRestrictions } from 'app/pages/InstrumentRestrictionsPage/Details/InstrumentRestrictions';\r\nimport { ApproveTrainingRecords } from './components/ApproveTrainingRecords';\r\nimport {\r\n TrainingDetails,\r\n TrainingDetailsProps,\r\n} from 'app/pages/UserTrainings/TrainingDetailsPage/Details';\r\nimport { OtherServiceDetails } from 'app/pages/OtherServiceDetails/Details';\r\nimport { ServiceType } from 'enums/ServiceTypes';\r\nimport { IServiceTypeFilterDto } from 'api/odata/generated/entities/IServiceTypeFilterDto';\r\nimport { useAppSettingsSlice } from 'app/slice';\r\nimport {\r\n WorkOrderDetails,\r\n WorkOrderDetailsProps,\r\n} 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 InventoryBatch,\r\n InventoryBatchProps,\r\n} from 'app/pages/OtherServiceDetails/InventoryBatch';\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 { IWorkOrderTypeDto } from 'api/odata/generated/entities/IWorkOrderTypeDto';\r\n\r\nexport interface ReservationDetailsProps extends SidePanelContentProps {\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 { queryParams, useSidePanel, useSwitchButtons } = 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 continueLink = useSelector(selectContinueToLink);\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 confirmRejected = useSelector(selectConfirmRejected);\r\n const confirmApproved = useSelector(selectConfirmApproved);\r\n const continueToOther = useSelector(selectContinueState);\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 /// 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 dispatch(actions.resetDetailsState());\r\n if (useSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n dispatch(push('/reservations'));\r\n }\r\n }, [actions, dispatch, layoutActions, 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(actions.createReservation({ state: value, calcCredit: true }));\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({ state: value, calcCredit: undefined }),\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: 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 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, layoutActions],\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 useSidePanel\r\n ? setCover(\r\n ,\r\n )\r\n : dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.AssetDetails,\r\n props: { Id: undefined, serviceId: equipment.Id },\r\n expanded: false,\r\n }),\r\n );\r\n },\r\n [dispatch, layoutActions, useSidePanel],\r\n );\r\n const handleRestrictionsClick = React.useCallback(\r\n (equipment: Entity) => {\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, dispatch, layoutActions, useSidePanel],\r\n );\r\n const handleOfflineServiceClick = React.useCallback(\r\n (service: IOtherServices) => {\r\n if (edit) {\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 [dispatch, edit, layoutActions, 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 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, layoutActions, useSidePanel],\r\n );\r\n const handleAddBatchClick = React.useCallback(\r\n (batch: IInventoryBatchDto | null, serviceTypeId: number) => {\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 [dispatch, layoutActions, 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 return mactions;\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 offlineServicesErrors.length,\r\n repeat,\r\n requestCompleted,\r\n reservationCanceled,\r\n reservationSettings,\r\n showShortView,\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={closeCover}\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 * 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 { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { AssetPopUpProps } from 'app/pages/AssetPopUp';\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\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 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\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 };\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(scheduler, isMobile, customDays || 2, useAmPm);\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 const assetPopupProps: AssetPopUpProps = {\r\n serviceId: serviceId,\r\n };\r\n dispatch(layoutActions.toggleSidePanel(true));\r\n dispatch(layoutActions.setPageType(RenderPageType.AssetDetails));\r\n dispatch(layoutActions.setPageProps(assetPopupProps));\r\n dispatch(layoutActions.setExpanded(false));\r\n },\r\n [dispatch],\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) {\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 => 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","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 } 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 *\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","/**\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 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}\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\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 allowedToChangeStatus = React.useCallback(\r\n asset => {\r\n if (admin && 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 ? true\r\n : false;\r\n } else {\r\n return false;\r\n }\r\n },\r\n [admin, authenticatedUser],\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\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} 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 { GetInstrumentFilter } from '../utils';\r\nimport { useLayoutSlice } from 'app/Layout/FrontendLayout/slice';\r\nimport { useAllowedToChangeStatus } from '../Hooks/useAllowedToChangeStatus';\r\nimport { ArticleStatus } from 'enums/Article';\r\n\r\nexport interface ArticleAssociationFormProps extends 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}\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const state = useSelector(selectArticles);\r\n const articleDetails = useSelector(selectArticleDetails);\r\n const articleDetailsForm = useSelector(selectArticleDetailsForm);\r\n //const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const allowedToChangeStatus = useAllowedToChangeStatus();\r\n const { actions: layoutActions } = useLayoutSlice();\r\n const [canEditStatus, setCanEditStatus] = React.useState(false);\r\n const schema: Yup.SchemaOf = Yup.object().shape(\r\n {\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 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?.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 instrumentFilter = React.useCallback(() => {\r\n return GetInstrumentFilter(serviceGroups);\r\n }, [serviceGroups]);\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 const dispatch = useDispatch();\r\n const { actions } = useArticlesSlice();\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?.Id : null,\r\n },\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: 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 dispatch(layoutActions.setNotSavedChanges(false));\r\n if (props.closeCover !== undefined) props.closeCover();\r\n }}\r\n topProcessing={processing}\r\n isCover\r\n closeCover={props.closeCover}\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 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 />\r\n \r\n \r\n \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\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 { createStyles, Grid, makeStyles, Theme } from '@material-ui/core';\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 selectShowEditArticleAssociation,\r\n} from 'app/pages/ArticlesPage/slice/selectors';\r\nimport { ArticleAssociationForm } from 'app/pages/ArticlesPage/ArticleAssociationForm';\r\nimport { ValueLabel } from 'app/components/ValueLabel';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { ArticleDoiLink } from 'app/pages/ArticlesPage/ArticleDoiLink';\r\nimport { AssetLink } from 'app/pages/AssetPopUp';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { layoutActions } from 'app/Layout/FrontendLayout/slice';\r\nimport { RenderPageType } from 'app/Layout/FrontendLayout/slice/type';\r\nimport { DateTimeLabel } from 'app/components/DateTimeLabel';\r\nimport { EditArticleDetailsFormProps } from '../EditArticleDetailsForm';\r\nimport { ArticleStatus } from 'enums/Article';\r\nimport { useCanEdit } from '../Hooks/useAllowedToChangeStatus';\r\n\r\nexport interface ArticleDetailsProps extends CoverProps {\r\n useSidePanel: boolean;\r\n value?: IArticleDto;\r\n onClose?: () => void;\r\n}\r\n\r\nexport function ArticleDetails({ ...props }: 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 value = useSelector(selectArticleDetailsForm);\r\n const busy = useSelector(selectArticleDetailsBusy);\r\n const isSaved = value?.Id !== undefined && value?.Id > 0;\r\n const [canEdit, msg] = useCanEdit();\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 cover = 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\r\n return (\r\n {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n dispatch(actions.hideDetails());\r\n }}\r\n loading={busy}\r\n leftTopActions={[\r\n () => (\r\n <>\r\n setCover(true)}\r\n disabled={!canEdit}\r\n />\r\n \r\n ),\r\n ]}\r\n cover={\r\n cover && setCover(false)} />\r\n }\r\n closeCover={() => setCover(false)}\r\n useSwitchActions={true}\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(value.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 {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 {t(translations.ArticleStatus)}\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 {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 {value.ServiceGroupAssets.length === 0 ? (\r\n t(translations.NA)\r\n ) : (\r\n
      \r\n {value.ServiceGroupAssets.map(asset => (\r\n
    • \r\n {asset.Name}\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 {value.InstrumentAssets.length === 0 ? (\r\n t(translations.NA)\r\n ) : (\r\n
      \r\n {value.InstrumentAssets.map(asset => (\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\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","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","/**\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 { selectArticles } 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 { 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 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\n\r\nexport interface NewArticleDetailsFormProps extends 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 state = useSelector(selectArticles);\r\n const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const admin = authenticatedUser?.Roles.includes(Roles.GroupAdministrators);\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 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 /*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 ISSN: null,\r\n ORCIDs: null,\r\n Year: 0,\r\n RelatedUser: 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 const instrumentFilter = React.useCallback(() => {\r\n return GetInstrumentFilter(serviceGroups);\r\n }, [serviceGroups]);\r\n const dispatch = useDispatch();\r\n const { actions } = useArticlesSlice();\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 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 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 const processing = state.editArticleAssociationBusy;\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 dispatch(layoutActions.setNotSavedChanges(false));\r\n dispatch(actions.hideDetails());\r\n }}\r\n topProcessing={processing}\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 {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 {\r\n setOldServiceGroups(serviceGroups);\r\n setServiceGroups([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 *\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 { selectArticleDetailsForm, selectArticles } 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 { 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 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\n\r\nexport interface EditArticleDetailsFormProps extends CoverProps {\r\n useSidePanel: boolean;\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { t, i18n } = useTranslation();\r\n const state = useSelector(selectArticles);\r\n const articleDetailsForm = useSelector(selectArticleDetailsForm);\r\n //const authenticatedUser = useSelector(selectAuthenticatedUser);\r\n const { actions: layoutActions } = useLayoutSlice();\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 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: 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: props.value.Title === null ? '' : props.value.Title,\r\n Authors:\r\n props.value.Authors === null ? '' : props.value.Authors.join(','),\r\n Abstract:\r\n props.value.Abstract === null ? '' : props.value.Abstract.trim(),\r\n Doi: props.value.Doi,\r\n ISSN: props.value.ISSN,\r\n ORCIDs: props.value.ORCIDs === null ? null : props.value.ORCIDs.join(','),\r\n Year: props.value.Year,\r\n Journal: props.value.Journal,\r\n PageNumber: props.value.PageNumber,\r\n RelatedUser: {\r\n Id: props.value.RelatedUser,\r\n Name: props.value.RelatedUserDisplayName,\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 [\r\n GetServiceGroupAsset,\r\n articleDetailsForm,\r\n props.value.Abstract,\r\n props.value.Authors,\r\n props.value.Doi,\r\n props.value.ISSN,\r\n props.value.Journal,\r\n props.value.ORCIDs,\r\n props.value.PageNumber,\r\n props.value.RelatedUser,\r\n props.value.RelatedUserDisplayName,\r\n props.value.Title,\r\n props.value.Year,\r\n t,\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 instrumentFilter = React.useCallback(() => {\r\n return GetInstrumentFilter(serviceGroups);\r\n }, [serviceGroups]);\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 dispatch = useDispatch();\r\n const { actions } = useArticlesSlice();\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 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 ExternalId: props.value?.ExternalId,\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 [actions, dispatch, props.value],\r\n );\r\n const processing = state.editArticleAssociationBusy;\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 dispatch(layoutActions.setNotSavedChanges(false));\r\n dispatch(actions.hideDetails());\r\n }}\r\n topProcessing={processing}\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 {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 {\r\n setOldServiceGroups(serviceGroups);\r\n setServiceGroups([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 *\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 predicates={props.predicates}\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\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 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 { 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 { SidePanelContentProps } 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 } from 'utils/url-utils';\r\nimport { AssetsSelection } 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 { RenewStock } from '../RenewStock';\r\nimport { InventoryBatch } from '../InventoryBatch';\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 { useSidePanel, queryParams, initialServices, onClose } = 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 confirmApproved = useSelector(selectConfirmApproved);\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const continueToOther = useSelector(selectContinueState);\r\n const continueLink = useSelector(selectContinueToLink);\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 [cover, setCover] = React.useState();\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\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 dispatch(actions.resetStockRenewalState());\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: StockRenewalState) => {\r\n setBusy(true);\r\n dispatch(actions.createStockRenewals(values));\r\n },\r\n [actions, dispatch],\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 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.resetStockRenewalState());\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 // 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 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 return (\r\n \r\n \r\n setCover(\r\n {\r\n closeCover();\r\n }}\r\n onClose={() => {\r\n closeCover();\r\n }}\r\n initialService={service}\r\n editCreatable={true}\r\n queryParams={{\r\n id: '' + service.Id ?? -1,\r\n }}\r\n />,\r\n )\r\n }\r\n onAddBatchClick={(batch, serviceType) => {\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: '' + serviceType,\r\n }}\r\n />,\r\n );\r\n }}\r\n onAddServiceClick={services => {\r\n setCover(\r\n {\r\n closeCover();\r\n }}\r\n onClose={() => {\r\n closeCover();\r\n }}\r\n />,\r\n );\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 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","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\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 default:\r\n return ;\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 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","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 {/* {elementRef.current !== null && ( */}\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 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\n\r\nexport const InvoiceComments = () => {\r\n const invoice = useSelector(selectInvoice);\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 InvoiceRowReferenceRenderer from 'app/components/BasicTable/CellRenderers/InvoiceRowReferenceRenderer';\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) => {\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 },\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);\r\n }, [OpenEditRow, appSettings, 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 {value}\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 { 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 { RenderPageType } 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 { ReactNode, 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 { AddCharge, ChargeProps } from '../AddChargePage';\r\nimport { AddPayment, 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\nconst url = '/api/odata/v4/InvoiceDetails';\r\nexport interface InvoiceDetailsProps {\r\n id: number;\r\n isSidePanel: boolean;\r\n}\r\nexport const InvoiceDetails = ({ id, isSidePanel }: 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: layoutActions } = useLayoutSlice();\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 openNewCharge = useCallback(\r\n (props: ChargeProps) => {\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 [dispatch, isSidePanel, layoutActions],\r\n );\r\n const openNewPayment = useCallback(\r\n (props: PaymentProps) => {\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 [dispatch, invoice?.UserGroupId, isSidePanel, layoutActions],\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 (isSidePanel) {\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n window.location.href = toRootedURL('/invoices/default.aspx');\r\n }\r\n }\r\n })\r\n .catch(e => console.warn(e));\r\n }\r\n }, [deletable, dispatch, id, isSidePanel, layoutActions, response]);\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={() => setCover(undefined)}\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","/**\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 } 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 { 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.location.href = 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 }\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 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","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 { 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 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 (!!user && user.AdminServiceGroups && user.AdminServiceGroups.length > 0) {\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 return res;\r\n};\r\n","import { IAuthenticatedUser } from 'types/AuthenticatedUser';\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\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 { SelectedRowsActionExtRenderer } from 'app/components/BasicTable/SelectedRowsActionButton/SelectedRowsActionRenderer';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n selectGlobalServiceGroupFilter,\r\n selectGlobalSettingBool,\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 { Badge, Tab } from '@material-ui/core';\r\nimport { getDefaultFilter } 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 { GetDetailsRowActions } from '../RowActions';\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}\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 } = 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 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 [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 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.location.href = toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n );\r\n dispatch(layoutActions.setHideNavigation(false));\r\n }, 20);\r\n } else if (isSidePanel) {\r\n window.location.href = toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n );\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n window.location.href = toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\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.location.href = toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n );\r\n }, 20);\r\n } else if (isSidePanel) {\r\n window.location.href = toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\r\n );\r\n dispatch(layoutActions.resetSidePanel());\r\n } else {\r\n window.location.href = toRootedURL(\r\n `/ServiceGroupRegister.aspx?sgid=${row.original.Id}`,\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 }),\r\n [isSidePanel, onlyMyCores, setFilters],\r\n );\r\n const columns = React.useMemo(() => {\r\n return getColumns(t, isRowSelectable);\r\n }, [isRowSelectable, t]);\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 {\r\n return (\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 });\r\n\r\n return actions;\r\n }, [primaryAction, t]);\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 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 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 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 const pageActions: PageActionRenderer[] = React.useMemo(() => {\r\n return isSidePanel\r\n ? [\r\n () => (\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 ]\r\n : [];\r\n }, [\r\n closeSidePanel,\r\n handleServiceGroupsChange,\r\n hideNavigation,\r\n history,\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);\r\n return (\r\n \r\n 0 ? rowActions : undefined}\r\n rowActions={detailsRowActions}\r\n //selectedRowsActions={selectedRowActions}\r\n initialState={initialState}\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.Pending &&\r\n row.original.ApprovalStatusId !==\r\n ServiceGroupRegistrationStatus.Rejected\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={[\r\n 'Id',\r\n 'AssetId',\r\n 'CanRequestAccess',\r\n 'UserRegistrationEnabled',\r\n 'ApprovalStatusId',\r\n 'Private',\r\n 'DivisionId',\r\n 'DivisionName',\r\n 'OwnedByMe',\r\n ]}\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';\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\n\r\nexport const getColumns = (\r\n t: TFunction,\r\n isRowSelectable: (row: Row) => boolean,\r\n) => {\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 {value}\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 return cols.filter(v => !v.invisible) as Column[];\r\n};\r\n","import { TFunction } from 'i18next';\r\nimport { translations } from 'locales/translations';\r\nimport React from 'react';\r\nimport {\r\n RowActionsMenu,\r\n RowActionsProps,\r\n} from 'app/components/BasicTable/RowActions';\r\nimport { CellRenderer } from 'app/components/BasicTable/BasicTableProps';\r\nimport { ICoresDirectoryRow } from 'types/ICoresDirectoryRow';\r\nimport { Row } from 'react-table';\r\nimport { useOpenAssetPopUp } from 'app/pages/AssetPopUp';\r\n\r\nexport function GetDetailsRowActions(\r\n t: TFunction,\r\n isRowSelectable: (row: Row) => boolean,\r\n): CellRenderer[] {\r\n const openAsset = useOpenAssetPopUp();\r\n const rowActions: CellRenderer[] = React.useMemo<\r\n CellRenderer[]\r\n >(\r\n () => [\r\n ({ row }) => {\r\n const items: RowActionsProps[] = [];\r\n if (isRowSelectable(row)) {\r\n items.push({\r\n onClick: () => {\r\n openAsset({ Id: row.original.AssetId ?? undefined });\r\n },\r\n text: t(translations.CoreDetails) as string,\r\n icon: 'list',\r\n } as RowActionsProps);\r\n return (\r\n \r\n );\r\n } else {\r\n return [];\r\n }\r\n },\r\n ],\r\n [isRowSelectable, openAsset, t],\r\n );\r\n return rowActions;\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 { PageWrapper } 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\n\r\nexport interface CoreSelectionProps extends SidePanelContentProps {}\r\n\r\nexport function CoreSelection(props: CoreSelectionProps) {\r\n const { useSidePanel } = 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 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 dispatch(layoutActions.resetSidePanel());\r\n }, [\r\n dispatch,\r\n hideNavigation,\r\n isFirstLogin,\r\n layoutActions,\r\n updateIsFirstLogin,\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 hideTitleBar={true}\r\n cover={cover}\r\n closeCover={closeCover}\r\n children={\r\n \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 } 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 } 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}\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 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: props.date,\r\n customStart: undefined,\r\n });\r\n }, [extendState, props.date, props.viewLength]);\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}\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 ...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 ]);\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 { 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 } 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 const savedViewUserName = useSelector(selectUpdateUserName);\r\n const viewOnly = React.useMemo(() => {\r\n return edit && !fullAdmin && User?.Name !== savedViewUserName;\r\n }, [User?.Name, 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 });\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 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}\r\n\r\ntype filterableArray = Array<{ notShown?: boolean; value: T }>;\r\n\r\nexport const useLeftTopActions: (\r\n props: GetLeftTopActionsProps,\r\n) => ActionRenderer[] = ({ savedView, isNew }: 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 />\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 />\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 ]);\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: '10px',\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: '10px',\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 });\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 },\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 };\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 };\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 });\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 * 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","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\nexport const selectMsgInitProcessing = createSelector(\r\n [selectSlice],\r\n state => state.processing,\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 } 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';\r\nimport { removeHtml } from 'utils/string-utils';\r\nimport { Tooltip } from '../BasicTooltips/Tooltip';\r\nimport {\r\n createStyles,\r\n Dialog,\r\n Link,\r\n makeStyles,\r\n Theme,\r\n} 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\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 interface MessageProps {\r\n pageName: string;\r\n selectedEquipment?: Entity[];\r\n}\r\n\r\nexport const Messages = (props: MessageProps) => {\r\n const classes = useMessageStyles();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst MessagesChildren = (props: MessageProps) => {\r\n const { pageName, selectedEquipment } = props;\r\n const dispatch = useDispatch();\r\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\r\n const { actions } = useMessagesSlice();\r\n const messages = useSelector(selectMessages);\r\n const classes = useStyles();\r\n useEffectOnMount(() => {\r\n dispatch(\r\n actions.init({\r\n pageName: pageName,\r\n selectedEquipment: selectedEquipment,\r\n }),\r\n );\r\n\r\n return () => {\r\n dispatch(actions.clear());\r\n };\r\n });\r\n useEffect(() => {\r\n dispatch(actions.clear());\r\n closeSnackbar();\r\n dispatch(\r\n actions.init({\r\n pageName: pageName,\r\n selectedEquipment: selectedEquipment,\r\n }),\r\n );\r\n }, [actions, closeSnackbar, dispatch, pageName, selectedEquipment]);\r\n useEffect(() => {\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 }, [actions, classes, closeSnackbar, dispatch, enqueueSnackbar, messages]);\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 return (\r\n <>\r\n {t(translations.IpRelay_reservationTimeForInstrument).replace(\r\n '{0}',\r\n props.Name,\r\n )}\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.Title ?? '') !== '' &&

    {props.Title}

    }\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 children,\r\n}: React.PropsWithChildren<{ value: string }>) => {\r\n const classes = useStyles();\r\n const cleanedValue = useMemo(() => removeHtml(value), [value]);\r\n const parsed = parse(value);\r\n if (cleanedValue.length > 255) {\r\n return (\r\n {parsed}}>\r\n <>\r\n {children ?? parsed}\r\n {children ?? parsed}\r\n \r\n \r\n );\r\n }\r\n return {children ?? parsed};\r\n};\r\n\r\nconst MoreLink = ({ children }: React.PropsWithChildren<{}>) => {\r\n const [open, setOpen] = useState(false);\r\n return (\r\n <>\r\n \r\n setOpen(false)}>\r\n {children}\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: 'elipsis',\r\n height: '140px',\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 * 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","/* @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 { 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(formFields, formValues);\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 { 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 { IAssetDto } from 'api/odata/generated/entities/IAssetDto';\r\nimport { Entity } from 'types/common';\r\nimport { IMyAssetsRow } from '../MyAssetsPage/IMyAssetsRow';\r\n\r\nexport interface IAsset extends Entity {\r\n ImageName: string;\r\n ServiceGroupName: string;\r\n DivisionName: string;\r\n Accessories: Entity[];\r\n AssetCatGroupName: string;\r\n AssetCatName: string;\r\n NickName: string;\r\n OtherNames: string;\r\n Brand: string;\r\n Model: string;\r\n ModelID?: number;\r\n ModelNumber: string;\r\n Campus?: number;\r\n Building: string;\r\n Room: string;\r\n LocationId?: number;\r\n LocationName: string;\r\n Experts?: AssetUser[];\r\n Contacts?: AssetUser[];\r\n Suppliers?: Entity[];\r\n MainSpecRange: string;\r\n ElectricalSpecs: string;\r\n FunctionalCharacteristics: string;\r\n Description: string;\r\n WebLink: string;\r\n Raac?: boolean;\r\n Tags?: Entity[];\r\n ExtraDate0?: Date;\r\n ExtraDate1?: Date;\r\n ExtraDate2?: Date;\r\n ExtraDate3?: Date;\r\n ExtraDate4?: Date;\r\n ExtraDate5?: string;\r\n ExtraDate6?: string;\r\n ExtraDate7?: string;\r\n ExtraDate8?: string;\r\n ExtraDate9?: string;\r\n ExtraText0?: string;\r\n ExtraText1?: string;\r\n ExtraText2?: string;\r\n ExtraText3?: string;\r\n ExtraText4?: string;\r\n ExtraText5?: string;\r\n ExtraText6?: string;\r\n ExtraText7?: string;\r\n ExtraText8?: string;\r\n ExtraText9?: string;\r\n ExtraText10?: string;\r\n ExtraText11?: string;\r\n ExtraText12?: string;\r\n ExtraText13?: string;\r\n ExtraText14?: string;\r\n ExtraText15?: string;\r\n ExtraInt0?: number;\r\n ExtraInt1?: number;\r\n ExtraInt2?: number;\r\n ExtraInt3?: number;\r\n ExtraInt4?: number;\r\n ExtraDec0?: number;\r\n ExtraDec1?: number;\r\n ExtraDec2?: number;\r\n ExtraDec3?: number;\r\n ExtraDec4?: number;\r\n ExtraBool0?: boolean;\r\n ExtraBool1?: boolean;\r\n ExtraBool2?: boolean;\r\n ExtraBool3?: boolean;\r\n ExtraBool4?: boolean;\r\n ExtraUrl0: string;\r\n ExtraUrl1: string;\r\n ExtraUrl2: string;\r\n ExtraUrl3: string;\r\n ExtraUrl4: string;\r\n ExtraRichText0: string;\r\n ExtraRichText1: string;\r\n ExtraRichText2: string;\r\n ExtraRichText3: string;\r\n ExtraRichText4: string;\r\n ExtraDDL0?: number;\r\n ExtraDDL1?: number;\r\n ExtraDDL2?: number;\r\n ExtraDDL3?: number;\r\n ExtraDDL4?: number;\r\n ExtraDDL5?: number;\r\n ExtraDDL6?: number;\r\n ExtraDDL7?: number;\r\n ExtraDDL8?: number;\r\n ExtraDDL9?: number;\r\n ExtraDDL10?: number;\r\n ExtraDDL11?: number;\r\n ExtraDDL12?: number;\r\n ExtraDDL13?: number;\r\n ExtraDDL14?: number;\r\n ExtraDDL15?: number;\r\n ExtraDDL0Value?: string;\r\n ExtraDDL1Value?: string;\r\n ExtraDDL2Value?: string;\r\n ExtraDDL3Value?: string;\r\n ExtraDDL4Value?: string;\r\n ExtraDDL5Value?: string;\r\n ExtraDDL6Value?: string;\r\n ExtraDDL7Value?: string;\r\n ExtraDDL8Value?: string;\r\n ExtraDDL9Value?: string;\r\n ExtraDDL10Value?: string;\r\n ExtraDDL11Value?: string;\r\n ExtraDDL12Value?: string;\r\n ExtraDDL13Value?: string;\r\n ExtraDDL14Value?: string;\r\n ExtraDDL15Value?: string;\r\n BrandCode: string;\r\n ServiceContract: string;\r\n POnumber: string;\r\n WarrantyEndDate?: Date;\r\n LifeDate?: Date;\r\n Age: string;\r\n ExportLicense: boolean;\r\n InternalCode: string;\r\n AccountingId: string;\r\n CanEndUsage: boolean;\r\n UsageId?: number;\r\n ServiceId?: number;\r\n ServiceTypeId: number;\r\n Allowed_ByTraining?: boolean;\r\n AllowToUser?: boolean;\r\n CanBeCreatedFromLinkOnly?: boolean;\r\n NotifyExists: boolean;\r\n EquipmentRestrictionsOverview: string;\r\n AssemblyId?: number;\r\n EquipmentMinOrder: string;\r\n EquipmentMaxOrder: string;\r\n AvailabilityTypeId?: number;\r\n LoanTypeId?: number;\r\n AssetCatInternalServiceAvaliable?: boolean;\r\n LocationUpdatedAt?: Date;\r\n LocationUpdatedByDn: string;\r\n Alerts: Entity[];\r\n AlertInfo?: AlertInfo;\r\n AmAdmin: boolean;\r\n AlertsEnabled: boolean;\r\n ReservationEnabled: boolean;\r\n UsageEnabled: boolean;\r\n CanStartUsage: boolean;\r\n PlanedEventsEnabled: boolean;\r\n ShowFeed: boolean;\r\n ServiceGroupId?: number;\r\n DivisionId?: number;\r\n EndUsageIds: number[];\r\n Active?: boolean;\r\n Type2Counter?: number;\r\n AvailabilityTypeName: string;\r\n minorder?: number;\r\n maxorder?: number;\r\n ReservationMinimumGap?: number;\r\n MinTimeAheadPeriodType?: number;\r\n MinTimeAheadPeriodValue?: number;\r\n MinTimeAheadMinutesSinceMidnight?: number;\r\n PrerequisiteEquipments: Entity[];\r\n ForceTutoring: boolean;\r\n MinimumTimeAhead?: number;\r\n CarryOverTimeSlotGap: number | null;\r\n CarryOverTimeSlotTypeId: number | null;\r\n CarryOverTimeSlotTypeName: string | null;\r\n ApprovalRequired: boolean;\r\n}\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 { 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 canPrintOrExport?: boolean;\r\n canExportAssetRanges?: boolean;\r\n isShowAllCores?: boolean;\r\n authenticatedUser?: AuthenticatedUser;\r\n}\r\n\r\nexport function GetSelectedActions(\r\n t: TFunction,\r\n props: GetSelectedActionsProps,\r\n canPrintOrExport?: boolean,\r\n canExportQRCodeRow?: (serviceGroups: number[]) => boolean,\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 CheckRows = React.useCallback(\r\n (rows: IMyAssetsRow[]): boolean => {\r\n if (!!canExportQRCodeRow) {\r\n let res: boolean;\r\n res =\r\n rows.filter(\r\n row =>\r\n canExportQRCodeRow(\r\n !!row.ServiceGroupId ? [row.ServiceGroupId] : [],\r\n ) === false,\r\n ).length === 0;\r\n return res;\r\n } else {\r\n return false;\r\n }\r\n },\r\n [canExportQRCodeRow],\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 />\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 />\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 (props.canPrintOrExport !== undefined && props.canPrintOrExport) {\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 props.canPrintOrExport !== undefined &&\r\n props.canPrintOrExport &&\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 />\r\n ),\r\n (rows, onRefresh) => {\r\n if (props.canPrintOrExport /* || CheckRows(rows) */) {\r\n return (\r\n \r\n );\r\n }\r\n },\r\n (rows, onRefresh, toggleAllRowsSelected) => {\r\n if (canPrintOrExport || CheckRows(rows)) {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n } else {\r\n }\r\n },\r\n ],\r\n [\r\n props.enableSavedLists,\r\n props.canPrintOrExport,\r\n props.canExportAssetRanges,\r\n allowedToView,\r\n enabledByCores,\r\n t,\r\n allowedToImport,\r\n canPrintOrExport,\r\n CheckRows,\r\n ],\r\n );\r\n\r\n return SelectedActions;\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 {\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 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 } from 'utils/url-utils';\r\nimport { OtherServiceDetails } from '../Details';\r\nimport {\r\n AssetsSelection,\r\n AssetsSelectionProps,\r\n} 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 { InventoryBatch, InventoryBatchProps } from '../InventoryBatch';\r\nimport { RenewStock, RenewStockProps } from '../RenewStock';\r\nimport { DialogConfirm } from 'app/components/DialogConfirm';\r\nimport { Body, ButtonLabel } from 'app/components/Typography';\r\nimport { LinearProgress } from '@material-ui/core';\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 { useSidePanel, queryParams, initialServices, onClose } = 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 confirmApproved = useSelector(selectConfirmApproved);\r\n const confirmRejected = useSelector(selectConfirmRejected);\r\n const continueToOther = useSelector(selectContinueState);\r\n const continueLink = useSelector(selectContinueToLink);\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 [cover, setCover] = React.useState();\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 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 dispatch(actions.resetConsumablesState());\r\n dispatch(connectedFiltersActions.resetConnectedState());\r\n }, [\r\n actions,\r\n connectedFiltersActions,\r\n dispatch,\r\n layoutActions,\r\n onClose,\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 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.resetConsumablesState());\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 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 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 return (\r\n \r\n {\r\n if (useSidePanel) {\r\n setCover(\r\n {\r\n closeCover();\r\n }}\r\n onClose={() => {\r\n closeCover();\r\n }}\r\n preventRefreshTable={true}\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 );\r\n } else {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n let selParams = {\r\n useSidePanel: true,\r\n saveCreatable: true,\r\n preventRefreshTable: true,\r\n initialBatch: batch ?? undefined,\r\n queryParams: {\r\n id: '' + (batch?.Id ?? -1),\r\n stid: '' + serviceType,\r\n },\r\n } as InventoryBatchProps;\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.InventoryBatch,\r\n props: selParams,\r\n expanded: false,\r\n }),\r\n );\r\n }\r\n }}\r\n onRenewStockClick={(service: IOtherServices) => {\r\n if (useSidePanel) {\r\n setCover(\r\n {\r\n closeCover();\r\n }}\r\n onClose={() => {\r\n closeCover();\r\n }}\r\n saveCreatable={true}\r\n preventRefreshTable={true}\r\n initialService={undefined}\r\n //editCreatable={true}\r\n queryParams={{\r\n id: '-1',\r\n stid: '' + service.ServiceTypeID,\r\n batchId:\r\n !!service.InventoryBatchId &&\r\n service.InventoryBatchId !== null\r\n ? '' + service.InventoryBatchId\r\n : undefined,\r\n }}\r\n />,\r\n );\r\n } else {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n let selParams = {\r\n useSidePanel: true,\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 &&\r\n service.InventoryBatchId !== null\r\n ? '' + service.InventoryBatchId\r\n : undefined,\r\n },\r\n } as RenewStockProps;\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.RenewStock,\r\n props: selParams,\r\n expanded: false,\r\n }),\r\n );\r\n }\r\n }}\r\n onOfflineServiceClick={service => {\r\n if (useSidePanel) {\r\n setCover(\r\n {\r\n closeCover();\r\n }}\r\n onClose={() => {\r\n closeCover();\r\n }}\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 );\r\n } else {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n dispatch(\r\n layoutActions.openSidePanel({\r\n type: RenderPageType.OtherServiceDetails,\r\n props: {\r\n useSidePanel: true,\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 }),\r\n );\r\n }\r\n }}\r\n onAddServiceClick={services => {\r\n if (useSidePanel) {\r\n setCover(\r\n {\r\n closeCover();\r\n }}\r\n onClose={() => {\r\n closeCover();\r\n }}\r\n />,\r\n );\r\n } else {\r\n dispatch(layoutActions.setNotSavedChanges(false));\r\n let selParams = {\r\n useSidePanel: true,\r\n actionType: 'OfflineService',\r\n offTypeIds: services,\r\n customPredicates: assetsFilter,\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 setError={handleSetError}\r\n offlineServicesErrors={offlineServicesErrors}\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 isCover={props.isCover}\r\n cover={cover}\r\n closeCover={props.closeCover || 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","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","/**\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, OtherServiceDetailsProps } from '../Details';\r\nimport { getParams } from './getQueryStringParameter';\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 { Button } from 'app/components/BasicButtons/Button';\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 OtherServiceEditLinkprops(props: { id: number }) {\r\n const dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n return (\r\n \r\n dispatch(\r\n actions.openSidePanel({\r\n type: RenderPageType.OtherServiceDetails,\r\n props: {\r\n useSidePanel: true,\r\n queryParams: { id: props.id.toString() },\r\n initialService: undefined,\r\n } as OtherServiceDetailsProps,\r\n }),\r\n )\r\n }\r\n >\r\n {props.id}\r\n \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 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\nimport { Condition, ODataOperators } from 'api/odata/ODataFilter';\r\nimport { IServiceRequestStatusDto } from 'api/odata/generated/entities/IServiceRequestStatusDto';\r\nimport { InternalServiceRequestStatusesUnion } from 'enums/InternalServiceRequestStatuses';\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 const excludedQuoteStatuses: Array = [\r\n 'QuoteSendToUser',\r\n 'QuoteApproved',\r\n 'WaitingForQuote',\r\n ];\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 'InternalStatusId',\r\n ODataOperators.Excludes,\r\n excludedQuoteStatuses,\r\n ),\r\n ]\r\n : undefined\r\n }\r\n value={requestDetails.Status}\r\n disabled={statusFieldState?.status === 'pending'}\r\n disableClearable={true}\r\n onChange={handleStatusChange}\r\n fullWidth\r\n variant=\"filled\"\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 InvoiceIdRenderer from 'app/components/BasicTable/CellRenderers/InvoiceIdRenderer';\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\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}\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\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: InvoiceIdRenderer,\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 [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 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={false}\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}\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 ...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: '10px',\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}\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 { Button } from 'app/components/BasicButtons/Button';\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 { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { ServiceRequestTableColumnsCollection } from 'app/pages/Samples/RequestSamplesPage/slice/utils/ServiceRequestTableColumn';\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 size=\"small\"\r\n disabled={props.disabled}\r\n processing={processing === 'pending'}\r\n >\r\n {t(translations.AddRows)}\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,\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 * as React from 'react';\r\nimport { 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\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 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 };\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 { Button } from 'app/components/BasicButtons/Button';\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\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 >\r\n {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 { Button } from 'app/components/BasicButtons/Button';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\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 onClick={handleOpen}\r\n title={t(translations.colvis_buttontext)}\r\n >\r\n {t(translations.Columns)}\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\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 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 && (\r\n \r\n )}\r\n {props.isEditable && (\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 {\r\n InternalServiceRequestStatuses,\r\n InternalServiceRequestStatusesUnion,\r\n} 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 = {\r\n Id: InternalServiceRequestStatuses.QuoteApproved as number,\r\n Name: 'QuoteApproved',\r\n InternalStatusId: 'QuoteApproved',\r\n } as IServiceRequestStatusDto;\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 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\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 dispatch(layoutActions.setRefreshTable(true));\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 {isEditable && (\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 />\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 { styled } from '@material-ui/core';\r\nimport { Tooltip } from 'app/components/BasicTooltips/Tooltip';\r\nimport {\r\n //selectAuthenticatedUser,\r\n selectEventsCount,\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 { Link } from 'react-router-dom';\r\nimport { dateUtils } from 'utils/date-utils';\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\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 StyledSpanIcon = styled('span')(({ theme }) => ({\r\n fontSize: '20px',\r\n color: bookitColors.grayscale.grayComponentsLight,\r\n '&:hover': { color: bookitColors.grayscale.grayComponents },\r\n }));\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {count}\r\n \r\n \r\n \r\n \r\n \r\n );\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?q=${payload.q}`;\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 $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: 5,\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 selectGlobalServiceGroupFilter,\r\n selectShowAllCores,\r\n} from 'app/slice/selectors';\r\nimport { Identifiable } from 'types/common';\r\nimport { AssetQuickSearchApi } from 'api/assetQuickSearchApi';\r\nimport { IQuickAssetsSearchResult, IQuickSearchResults } from './types';\r\nimport { ServiceType } from 'enums/ServiceTypes';\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\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\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 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 },\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\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 { 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 toRootedURL(`/assets/details.aspx?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) => 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 getAssetDetailsLink(item);\r\n }\r\n switch (validKey) {\r\n case 'AssetDetails':\r\n return getAssetDetailsLink(item);\r\n case 'Calendar':\r\n return getCalendarLink(item, t);\r\n case 'Timeline':\r\n return 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 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 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\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","/**\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 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\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 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 \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 { 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\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 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 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 // 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 autoFocus={false}\r\n size=\"small\"\r\n value={state.searchTerm || ''}\r\n classes={{\r\n root: 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 }\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 }\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 handleOpenAssets()}\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: 6,\r\n paddingBottom: 6,\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 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 * as React from 'react';\r\n\r\nexport interface UserMenuButtonProps extends ButtonProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport default function UserMenuButton(props: UserMenuButtonProps) {\r\n const { children, ...other } = props;\r\n return (\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\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 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 \r\n )\r\n }\r\n startIcon={\r\n \r\n }\r\n onClick={event => handleClick(event)}\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 >\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 >\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={toRootedURL('/help.aspx')}\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 { 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}\r\n\r\nexport default function TopGroupButton(props: TopGroupButtonProps) {\r\n const {\r\n children,\r\n savedServiceGroups,\r\n firstServiceGroupName,\r\n ...other\r\n } = props;\r\n const { t } = useTranslation();\r\n return (\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: '8px',\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 {\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\n\r\nexport interface SwitchSitesProps {}\r\n\r\nexport function SwitchSites(props: SwitchSitesProps) {\r\n const { t } = useTranslation();\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 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 ) : (\r\n \r\n );\r\n}\r\n","/**\r\n *\r\n * ProfileMenu\r\n *\r\n */\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectEventsCountLoading } from 'app/slice/selectors';\r\nimport { EventsCount } from './EventsCount';\r\nimport { AssetQuickSearch } from 'app/components/AssetQuickSearch';\r\nimport { useAssetQuickSearchSlice } from 'app/components/AssetQuickSearch/slice';\r\nimport { translations } from 'locales/translations';\r\nimport { selectShowSearchInSidebar } from 'app/components/AssetQuickSearch/slice/selectors';\r\nimport { UserMenu } from './UserMenu';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport { CoreSelectionButton } from 'app/components/GlobalServiceGroupFilter/CoreSelectionButton';\r\nimport { bookitColors } from 'styles/colors/bookitColors';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport { ProfileSection } from '../styled';\r\nimport { SwitchSites } from './SwitchSites';\r\n\r\nexport const ProfileMenu = React.memo(function ProfileMenu() {\r\n const { t } = useTranslation();\r\n const eventsLoading = useSelector(selectEventsCountLoading);\r\n const { checkIsMobile } = useIsMobile();\r\n const isMobile = checkIsMobile();\r\n const dispatch = useDispatch();\r\n const { actions: assetSearchActions } = useAssetQuickSearchSlice();\r\n const showSearchInSidebar = useSelector(selectShowSearchInSidebar);\r\n\r\n const theme = useTheme();\r\n return (\r\n \r\n {!isMobile && (\r\n
    \r\n \r\n
    \r\n )}\r\n {!eventsLoading && (\r\n
    \r\n \r\n
    \r\n )}\r\n {isMobile && (\r\n
    \r\n {\r\n dispatch(\r\n assetSearchActions.showSearchInput(!showSearchInSidebar),\r\n );\r\n }}\r\n title={t(translations.SearchAssets)}\r\n shape=\"square\"\r\n >\r\n \r\n \r\n
    \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 );\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 useExpandedSideBarState from 'app/hooks/useExpandedSideBarState';\r\nimport { ProfileMenu } from '../ProfileMenu';\r\nimport { IconButton } from 'app/components/BasicButtons/IconButton';\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 { Icon } from 'app/components/BasicIcons/FontAwesome';\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 { toggle } = useExpandedSideBarState();\r\n\r\n const handleClick = React.useCallback(() => {\r\n toggle();\r\n }, [toggle]);\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 {/* 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","/**\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\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 theme = useTheme();\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n}\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: 10px;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n box-shadow: inset 0 0 2px ${bookitColors.grayscale.grayBorders};\r\n border-radius: 6px;\r\n background-color: ${bookitColors.grayscale.grayBorders};\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 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}\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\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 {...other}\r\n />\r\n );\r\n } else {\r\n if (external) {\r\n return (\r\n onClick(event, currentindex)}\r\n onKeyDown={event => onKeyDown && onKeyDown(event, currentindex)}\r\n component={LinkBehavior}\r\n href={link}\r\n selected={selected}\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 {...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 {\r\n Fade,\r\n ListItemIcon,\r\n ListItemText,\r\n makeStyles,\r\n MenuItem,\r\n} 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\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 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 } = props;\r\n const popupState = usePopupState({\r\n variant: 'popover',\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 {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 } else {\r\n if (item.external) {\r\n return (\r\n {\r\n console.log('child-external-click', event);\r\n handleChildClick(event, cindex);\r\n }}\r\n selected={selected && item.selected}\r\n component={LinkBehavior}\r\n href={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 } 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[index + cindex] = 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 },\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 ListItemText from '@material-ui/core/ListItemText';\r\nimport List from '@material-ui/core/List';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { DetectIsMobile } from 'utils/mobileDetect';\r\nimport { selectSiteMapSettings } from 'app/slice/selectors';\r\nimport { HoverSideMenu } from './HoverMenu';\r\nimport { SiteMapProvider } 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\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};\r\ntype MenuItemPropTypesItems = PropTypes.InferProps;\r\ntype MenuItemPropTypesNoItems = Omit;\r\n\r\nexport type SidebarMenuItemProps = MenuItemPropTypesNoItems & {\r\n items?: SidebarMenuItemProps[];\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 } = 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 dispatch = useDispatch();\r\n const { actions } = useLayoutSlice();\r\n const {\r\n expanded: sidebarExpanded,\r\n expandLocal,\r\n } = useExpandedSideBarState();\r\n const siteMapSettings = useSelector(selectSiteMapSettings);\r\n const location = useLocation();\r\n const [urlLink, setUrlLink] = React.useState(\r\n link,\r\n );\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 (hasChanges && (props.items === undefined || props.items.length < 1)) {\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 }\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 isExpandable && !sidebarExpanded ? (\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 \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 { List } from '@material-ui/core';\r\nimport { IconProp } from 'app/AllIcons';\r\nimport { Icon } from 'app/components/BasicIcons/FontAwesome';\r\nimport * as React from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport styled from 'styled-components';\r\nimport { verticalScrolling } from 'styles/CssVariables/styledVariables';\r\nimport { SiteMapNode } from 'types/SiteMapSettings';\r\nimport { isNullOrUndefined } from 'utils/typeUtils';\r\nimport { useStyles } from '../styles';\r\nimport { createMenuItemRefs } from './HoverMenu';\r\nimport SidbarMenuItem, { SidebarMenuItemProps } from './MenuItem';\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}\r\nconst NavWrapper = styled('div')`\r\n height: calc(100% - 50px);\r\n overflow-y: auto;\r\n ${verticalScrolling}\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 function SideBarMenu(props: SideBarMenuItemProps) {\r\n const classes = useStyles({ isOpen: props.isOpen });\r\n const location = useLocation();\r\n const { menuItems, currentIndex } = props;\r\n const [selectedIndex, setSelectedIndex] = React.useState(currentIndex || -1);\r\n const [mapItems, setMapItems] = React.useState([]);\r\n\r\n const handleListItemClick = (event, index) => {\r\n setSelectedIndex(index);\r\n };\r\n React.useEffect(() => {\r\n setMapItems(\r\n menuItems\r\n .filter(f => f.Hide === false)\r\n .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 };\r\n })\r\n : ([] as SidebarMenuItemProps[]),\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 props.currentNode === undefined\r\n ? false\r\n : selectedIndex === -1\r\n ? props.currentNode.Key === item.Key\r\n : selectedIndex === index,\r\n };\r\n }),\r\n );\r\n }, [location.pathname, menuItems, props.currentNode, selectedIndex]);\r\n const menuItemRefs = React.useRef(\r\n createMenuItemRefs(menuItems, currentIndex ?? 0),\r\n );\r\n return (\r\n \r\n \r\n {mapItems.map((item, index) => (\r\n (menuItemRefs.current[index] = element)}\r\n indexChanged={handleListItemClick}\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 Divider from '@material-ui/core/Divider';\r\nimport { AssetQuickSearch } from 'app/components/AssetQuickSearch';\r\nimport { selectShowSearchInSidebar } from 'app/components/AssetQuickSearch/slice/selectors';\r\nimport { Box } from 'app/components/basic/Wrappers/Box';\r\nimport { BookitlabLogo } from 'app/components/BookitlabLogo';\r\nimport { BookitlabShortLogo } from 'app/components/BookitlabLogo/BookitlabShortLogo';\r\nimport { CoreSelectionButton } from 'app/components/GlobalServiceGroupFilter/CoreSelectionButton';\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 { ProfileMenu } from '../../TopBar/ProfileMenu';\r\nimport { useStyles } from '../styles';\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 classes = useStyles({ isOpen: isOpen });\r\n const isMobile = DetectIsMobile();\r\n const showSearchInSidebar = useSelector(selectShowSearchInSidebar);\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 {isMobile && isOpen && }\r\n {children}\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 )}\r\n \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","/**\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 { isMobile } from 'react-device-detect';\r\nimport { SideBarFooter } from './SideBarFooter';\r\ninterface Props {\r\n isOpen: boolean;\r\n}\r\n\r\nconst SideBarComponent = (props: Props) => {\r\n const { isOpen } = props;\r\n const siteMapSettings = useSelector(selectSiteMapSettings);\r\n const [currentNode, setCurrentNode] = React.useState(\r\n undefined,\r\n );\r\n const location = useLocation();\r\n const [currentNodes, setCurrentNodes] = React.useState([]);\r\n const loading = isNullOrUndefined(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 || window.location.pathname,\r\n ),\r\n );\r\n setCurrentNodes(\r\n siteMapProvider.getCurrentNodes(\r\n location?.pathname || window.location.pathname,\r\n ),\r\n );\r\n }\r\n return () => {\r\n active = false;\r\n };\r\n }, [currentNodes, loading, location, siteMapSettings]);\r\n return (\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\n\r\nexport interface SideBarDrawerProps {\r\n hideNavigation: boolean | undefined;\r\n isMobile: boolean;\r\n open: 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 if (props.hideNavigation) {\r\n return null;\r\n }\r\n const { isMobile, open, handleDrawerClose } = props;\r\n return (\r\n \r\n \r\n \r\n );\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 direction: ltr;\r\n @media (min-width: ${props => props.theme.breakpoints.values.sm}px) {\r\n display: flex;\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\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: ${props => props.theme.palette.background.paper};\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: 48px;\r\n }\r\n & .container {\r\n padding: 0px;\r\n position: relative;\r\n background-color: ${props => props.theme.palette.background.paper};\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: absolute;\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\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 { selectAppSettings } from 'app/slice/selectors';\r\nimport { IsModuleEnabled } from 'types/AppSettings';\r\nimport { KnownModules } from 'types/KnownModules';\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 { expanded: open, expand } = useExpandedSideBarState();\r\n const { checkIsMobile } = useIsMobile();\r\n const isMobile = checkIsMobile();\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\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.location.href = toRootedURL('/UsageKiosk.aspx');\r\n }\r\n if (isRedirectToUsageRoom) {\r\n window.location.href = 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(!open);\r\n },\r\n [expand, open],\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","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 { 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 { 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\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';\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-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 | '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\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 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 //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-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 '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];\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\nimport { useIsMobile } from 'app/hooks/useIsMobile';\r\nimport * as React from 'react';\r\n\r\nimport { useStyles } from './styles';\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 const classes = useStyles({ isMobile: isMobile })();\r\n return
    {children}
    ;\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles';\r\n\r\nexport const useStyles = props =>\r\n makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n boxShadow: '0px 4px 20px rgba(0, 0, 0, 0.25)',\r\n width: '100%',\r\n height: '100vh',\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 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","/**\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 { SubscriptionTypesPage } from './pages/SubscriptionTypesPage/Loadable';\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 [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());\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 dispatch(actions.loadEventsCount());\r\n\r\n GetBrowserInfo();\r\n } else {\r\n if (\r\n anonimusUrls.some(\r\n f => window.location.pathname.toLowerCase().indexOf(f) > -1,\r\n )\r\n ) {\r\n dispatch(actions.loadAppSettings(false));\r\n } else {\r\n //dispatch(actions.navigate('/login'));\r\n }\r\n }\r\n }\r\n }\r\n }, [actions, dispatch, isAuthenticated, isLoginPage, userLoading]);\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', 'animals');\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 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 {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","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":""}