{"version":3,"sources":["components/bookings/menus/MyBookings.module.scss","components/bookings/menus/CalendarView.module.scss","components/settings/menus/AdministratorsPanel.module.scss","components/bookings/forms/DeskBookingForm.module.scss","components/drawing/SvgElements.ts","types/Floorplan.types.ts","components/drawing/Desks.tsx","components/drawing/ZoomControls.tsx","components/drawing/editor/DeskCanvasControls.tsx","components/drawing/editor/RoomEditorTools.tsx","components/drawing/Doors.tsx","components/drawing/editor/DoorCanvasControls.tsx","components/drawing/TextElements.tsx","components/drawing/editor/TextEditorPanel.tsx","api/index.ts","api/floorplans.ts","api/userInfo.ts","api/tagging.ts","types/Tagging.types.ts","components/NewTagDialog.tsx","components/TagPicker.tsx","components/drawing/editor/DeskEditorPanel.tsx","api/bookings.ts","components/drawing/DeskCheckDialog.tsx","types/Booking.types.ts","utils/index.ts","components/settings/menus/CancelReasonDialog.tsx","components/drawing/CancelBookingsPanel.tsx","components/drawing/FloorRects.tsx","components/drawing/RoomRects.tsx","components/drawing/CustomShapes.tsx","components/drawing/PreviewShape.tsx","components/drawing/editor/ShapeCanvasControls.tsx","components/drawing/editor/FloorRectCanvasControls.tsx","components/drawing/editor/MultiSelectCanvasControls.tsx","components/drawing/editor/FloorplanEditor.tsx","reportWebVitals.ts","assets/undraw_Hello_re_3evm.svg","assets/undraw_date_picker_gorr.svg","assets/undraw_Profile_re_4a55.svg","assets/undraw_Setup_re_y9w8.svg","assets/undraw_in_the_office_re_jtgc.svg","assets/undraw_accept_request_re_d81h.svg","assets/undraw_schedule_re_2vro.svg","assets/undraw_medicine_b-1-ol.svg","components/profileEditor/ProfileEditorPanel.tsx","api/settings.ts","utils/constants.ts","components/settings/forms/RestrictionsSection.tsx","components/settings/forms/GlobalSettingsForm.tsx","components/settings/menus/RoleAssignment.tsx","components/settings/menus/AdministratorsPanel.tsx","api/siteslocations.ts","components/settings/menus/ManageBookings.tsx","components/settings/menus/Reporting.tsx","components/settings/forms/FloorplanForm.tsx","components/settings/menus/NewLayoutDialog.tsx","components/settings/menus/FloorplansPanel.tsx","components/settings/forms/LocationFormPanel.tsx","api/rooms.ts","components/settings/forms/RoomFormPanel.tsx","components/settings/menus/RoomQRCodeDialog.tsx","components/settings/menus/RoomsPanel.tsx","components/settings/menus/LocationsPanel.tsx","components/settings/forms/SiteFormPanel.tsx","components/settings/menus/SitesPanel.tsx","components/settings/menus/UpdateRoomDetails.tsx","components/settings/SettingsPanel.tsx","components/bookings/menus/BookingDatePanel.tsx","types/SiteLocation.types.ts","components/bookings/menus/BookingSitePanel.tsx","components/bookings/menus/BookingLocationsPanel.tsx","components/bookings/menus/BookingFloorplansPanel.tsx","components/bookings/forms/DeskBookingForm.tsx","components/bookings/forms/RoomBookingForm.tsx","components/bookings/menus/MyBookingList.tsx","components/bookings/menus/MyBookings.tsx","components/bookings/menus/RoomBookingSearch.tsx","components/bookings/menus/CalendarView.tsx","components/bookings/menus/SiteLocRoomList.tsx","components/bookings/menus/RoomBookingTop.tsx","components/bookings/menus/PendingApproval.tsx","components/bookings/menus/SiteCalendar.tsx","../pushNotifications.ts","components/cacheBuster.tsx","Home.tsx","components/policies/PrivacyPolicy.tsx","components/checkin.tsx","index.tsx","Home.module.scss","components/bookings/menus/SiteCalendar.module.scss"],"names":["module","exports","xmlns","applyAttributeObj","element","attributes","key","setAttribute","TBFontSize","createDeskSvg","deskRect","document","createElementNS","classList","add","ry","rx","y","x","height","width","fill","style","availabilityCircle","cy","cx","clippedGroup","unavailableLine1","x1","x2","y1","y2","stroke","unavailableLine2","appendChild","mainGroup","createDoorSvg","door","d","strokeDasharray","strokeLinecap","strokeLinejoin","line","Desks","props","desks","selectedDeskIdx","selectedTool","length","id","map","desk","idx","html","innerHTML","transform","undefined","className","selectedObjects","includes","rotation","bookable","data-idx","pointerEvents","cursor","overflow","transformOrigin","dangerouslySetInnerHTML","__html","ZoomControls","position","absolutePos","userSelect","bottom","left","display","flexDirection","onClick","e","zoom","currentZoom","min","onZoom","max","DeskCanvasControls","r","strokeWidth","iconStyle","name","background","fontSize","RoomEditorTools","titleStyle","root","paddingLeft","paddingRight","borderRight","textTransform","Stack","horizontal","verticalAlign","styles","TooltipHost","content","IconButton","iconProps","iconName","onToolSelection","delay","TooltipDelay","long","onSettingToggle","disabled","onFitToScreen","editableSelection","onEdit","removableSelection","onDelete","undoStates","onUndo","redoStates","onRedo","doors","selectedDoorIdx","DoorCanvasControls","TextElements","textBoxes","selectedTextIdx","textBox","textStr","text","trim","textArr","split","enableBackground","dominantBaseline","textAnchor","textComponent","dy","onFocus","event","target","value","setSelectionRange","TextEditorPanel","Panel","isBlocking","isOpen","isLightDismiss","onDismiss","onRenderFooter","panelProps","horizontalAlign","padding","PrimaryButton","TextField","autoFocus","multiline","onChange","newText","newValue","ChoiceGroup","label","option","large","options","selectedKey","apiFetch","info","init","fetch","then","response","catch","reason","test","window","location","href","toString","message","protocol","host","editFloorplanMetadata","floorplan","a","Id","method","body","JSON","stringify","headers","Accept","credentials","Error","createNewFloorplan","locationId","deleteFloorplan","floorplanId","loadLatestFloorplanEdit","loadLatestPublishedFloorplan","loadFloorplansForLocation","newFloorplanLayoutFromBlank","newFloorplanLayoutFromPrevious","updateFloorplanLayout","layoutId","drawing","publishFloorplanLayout","isAuthenticated","ok","getUserProfile","updateMyProfile","profile","json","searchUsers","searchStr","encodeURIComponent","searchTeams","getRoles","status","saveRoles","email","roleIds","RoleIds","err","loadAllTeams","getTagsByType","type","tags","editTag","tag","url","result","searchTags","Boolean","query","assignTags","entityId","entityType","success","t","TagType","NewTagDialog","onSubmit","React","newTagType","setNewTagType","newTagTooltip","setNewTagTooltip","dismiss","Dialog","hidden","dialogContentProps","title","showCloseButton","preventDefault","stopPropagation","Label","Tooltip","Type","visibility","Dropdown","opt","errorMessage","newVal","placeholder","DialogFooter","TagPicker","onTagsRemoved","initialTags","selectedTags","setSelectedTags","ready","setReady","newTag","setNewTag","closeNewTagForm","saveNewTag","search","filter","results","onResolveSuggestions","selectedItems","data","si","indexOf","pickerOnChange","items","addNewTag","i","tagsRemoved","st","Promise","resolve","rtnVal","tr","resolveDelay","pickerSuggestionsProps","suggestionsHeaderText","onRenderItem","itemProps","item","TagItem","onRenderSuggestionsItem","tagProps","suggestionItemProps","TagItemSuggestion","getTextFromItem","snapTo45","num","Math","round","DeskEditorPanel","snapping","useState","alias","setAlias","setRotation","setBookable","assignedTeamTag","setAssignedTeamTag","deskTags","setDeskTags","teamsTags","setTeamsTags","loadTeamOptions","useCallback","teamsResponse","teams","teamTagOptions","s","Name","assignedTeams","index","forEach","push","loadTags","onResolveTeamSuggestions","toLowerCase","tagList","compareTag","_listContainsTeamsTags","updateDesk","update","useEffect","newDesk","PanelType","smallFixedFar","headerText","Slider","step","Desk","Toggle","onText","offText","checked","paddingBottom","fontStyle","noResultsFoundText","inputProps","itemLimit","searchDeskBookings","searchParams","getMyBookings","getBookingsForLayoutAndTime","startDateStr","endDateStr","saveNewBooking","booking","cancelBooking","getPendingBookingCount","abortController","signal","getPendingBookings","rejectBooking","bookingId","statusText","approveBooking","BookingStatus","ResourceType","AccessType","ConstraintType","DeskCheckDialog","loading","setLoading","numOfBookings","setNumOfBookings","checkDeskBookings","FromDate","Date","toISOString","DeskId","deskId","bookings","Spinner","loadBookings","DefaultButton","CancelReasonDialog","cancelReason","setCancelReason","CancelBookingsPanel","cancelling","setCancelling","setBookings","bookingSelected","setBookingSelected","selectedBookings","setSelectedBookings","showDialog","setShowDialog","Selection","onSelectionChanged","selection","getSelection","_load","_cancelBulkBookings","cancelSuccess","CancelledByAdmin","CancellationReason","alert","custom","customWidth","innerWidth","MessageBar","messageBarType","MessageBarType","CommandBar","onRender","DetailsList","columns","fieldName","minWidth","maxWidth","column","deskName","DeskName","SiteName","OnBehalfOfEmail","Start","date","dateStr","toLocaleDateString","substr","toLocaleTimeString","Finish","isIconOnly","IncludeParking","Icon","selectionMode","SelectionMode","multiple","cancel","FloorRects","floorplanRectangles","selectedFloorIdx","floor","originX","originY","children","RoomRects","roomRectangles","selectedRoomIdx","room","SvgShapes","committedShapes","selectedShapeIdx","getPath","shapeElements","shape","pathEl","join","path","PreviewShape","tempShape","ShapeCanvasControls","shapes","selectedShape","radius","RectCanvasControls","rects","selectedFloorRect","MultiSelectCanvasControls","drawingState","floorplanShapes","RoomEditor","_initialDrawingState","_autoSaveTimer","svg","_liveX","_liveY","_mouseDownOperation","_penInUse","_setupIcons","_publish","bind","_autoSave","_loadLayout","_checkLocalDrafts","_fitDesksToScreen","_handleKeyUp","_handleKeyDown","_setZoom","_svgHandleDoubleClick","_svgHandleMouseDown","_svgHandleMouseMove","_svgHandleMouseUp","_svgHandleMouseOut","_svgHandleWheel","_toggleStateBool","_toolSelection","undo","redo","state","saving","drawInternalRooms","availability","defaultDeskRotation","showGrid","snapToGrid","showBookingsPanel","addEventListener","this","removeEventListener","callback","newState","lastUpdate","localStorage","setItem","editingDeskIdx","editingTextIdx","deletingDeskId","viewBox","editableSelectionMade","removableSelectionMade","isSafari","navigator","userAgent","Fabric","flex","setState","cloneDeep","marginRight","confirm","history","maxHeight","gridTemplateColumns","gridTemplateRows","gridColumnStart","gridColumnEnd","gridRowStart","gridRowEnd","ref","version","baseProfile","onWheel","onDoubleClick","onMouseDown","onMouseMove","onMouseOut","onMouseUp","in","operator","floodColor","floodOpacity","in2","patternUnits","Doors","amendedDesks","canDelete","layoutResponse","parse","Json","setInterval","clear","manualSave","lastSave","lastUpdateDt","loadedDrawing","draft","getItem","savedUpdate","draftUpdate","hasContent","_getSvgMousePosition","clickedDeskIdx","_checkSelection","clientX","clientY","elementFromPoint","nodeName","parentElement","parentNode","idxStr","getAttribute","parseInt","replace","charAt","toUpperCase","slice","selectedObjIdx","_startRotation","clickedDoorIdx","clickedTextIdx","clickedFloorIdx","clickedRoomIdx","clickedShapeIdx","_startMoveOrSelect","_startGrabCanvas","_startMultiSelection","_doRoomDrawing","deskX","deskY","coordsContainer","querySelector","_previewNextPenNode","initialCoords","itemIdx","_performCanvasScroll","_previewMultiSelection","_drawRoomLayoutPreviewBox","_performDeskRotation","_performDoorRotation","_performFloorRotation","_performRoomRotation","_performShapeRotation","_moveDraggable","collision","_checkDeskCollision","_handleStampableToolHover","mouseX","mouseY","_commitMovedObject","rotationType","_commitRotation","_releaseGrabbedCanvas","_commitPenNode","_commitMultiSelection","remove","drawingStateChanged","_addNewStampable","scrollTop","scrollLeft","scrollTo","top","deltaY","deltaX","initX","initY","preview","isDrag","abs","controlX","controlY","shapeStartX","shapeStartY","isClosing","newShape","svgShape","_calculateShapeObject","fallback","Number","MAX_SAFE_INTEGER","reduce","prev","cur","arr","minx","miny","maxx","maxy","curve","_calculateCurvePoints","xVals","yVals","curveMin","curveMax","minX","minY","maxX","maxY","el","arg1","x0","y0","denom_x","denom_y","tx","ty","bezier_x","bezier_y","x_values","y_values","firstChild","selectedIdx","clickedIdx","opType","rooms","rect","cursorContainer","doorPath","objectIdx","initialClickCoords","controlHandles","curX","curY","arrName","selectionEl","selectionRect","atan2","deg","PI","deskElement","doorElement","_performFloorOrRoomRectRotation","floorElement","gEl","transformOriginX","transformOriginY","shapeElement","stampables","offset","stampable","amendedObject","amendedObjects","draggableType","arrayName","draggableArr","parseFloat","_checkMultiSelection","tool","_triggerMouseMove","bool","bounds","getBoundingClientRect","ratio","innerHeight","wDiff","hDiff","initializeIcons","registerIcons","icons","points","xmlnsXlink","fillRule","clipRule","alignSelf","fillOpacity","strokeMiterlimit","ctm","getScreenCTM","f","xSvg","ySvg","xMouse","yMouse","returnObj","boundsChecker","Floor","Shape","Room","Door","right","console","log","multiSelection","drawingObjs","obj","boundsA","boundsB","redos","newUndoState","newDrawingState","pop","undos","newRedoState","ctrlKey","dispatchEvent","MouseEvent","view","bubbles","cancelable","reportWebVitals","withRouter","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ProfileEditorPanel","validForm","fullName","org","phone","useTeams","FullName","setFullName","Organisation","organisation","setOrganisation","Phone","setPhone","UseTeams","setTeams","error","setError","formValid","setFormValid","updateProfile","Success","onSaved","medium","PersonaCoin","size","PersonaSize","size100","imageUrl","Photo","Data","margin","src","alt","marginTop","getSettings","saveSettings","settings","mapToPersona","isUser","hasOwnProperty","userId","teamId","secondaryText","Email","b","nameA","nameB","numRegex","alphaOnlyA","alphaOnlyB","numberAmatches","exec","numberBmatches","numHighOrLow","numA","numB","off","getTimezoneOffset","absoff","getTime","toFixed","padStart","resourceType","siteId","roomId","SiteId","LocationId","RoomId","Week","includeTeams","selectedSuggestions","userResults","teamResults","Utils","Constants","RestrictionUpdate","RestrictionsSection","deskBookingConstraint","deskConstraint","setDeskConstraint","useDeskConstraint","setUseDeskConstraint","roomBookingConstraint","roomConstraint","setRoomConstraint","useRoomConstraint","setUseRoomConstraint","roomCheckIn","enableCheckIn","setEnableCheckIn","getDefaultConstraint","constraintParams","updateType","resourceId","constraintOptions","ConstraintTypeOptions","tokens","childrenGap","constraint","numVal","Global","GlobalSettingsForm","profileContext","ProfileContext","Settings","MaintenanceMode","maintenanceMode","setMaintenanceMode","RoomBookingEnabled","roomBookingEnabled","setRbEnabled","DeskBookingEnabled","deskBookingEnabled","setDbEnabled","GlobalDeskConstraint","GlobalRoomConstraint","_saveSettings","saveObj","onProfileUpdated","AbortController","constraints","RoleAssignmentDialog","userContext","useContext","roles","setRoles","selectedRoles","setSelectedRoles","loadRoles","user","Roles","submitNewRoles","Profile","checkboxStyle","role","Checkbox","UserManagementPanel","waiting","setWaiting","userSearch","setUserSearch","searchResults","setSearchResults","itemsSelected","setItemsSelected","assignRolesToUser","setAssignRolesToUser","assignTagsToUserIdx","setAssignTagsToUserIdx","updateSearch","debounce","assignTagsToUser","backgroundColor","getItems","getSelectedIndices","farItems","iconOnly","photo","Persona","isAdminColumn","roleName","getIconOrRoleName","Tags","tooltipProps","onRenderContent","single","saved","subText","User","saveSite","site","deleteSite","getSite","getDeskSites","getSites","getMySites","saveLocation","deleteLocation","loadLocations","deskCheck","ManageBookingsPanel","today","defaultFrom","getFullYear","getMonth","getDate","defaultTo","setDate","fromDate","setFromDate","toDate","setToDate","siteOptions","setSites","chosenSite","setChosenSite","locationOptions","setLocations","chosenLocation","setChosenLocation","chosenUser","setChosenUser","ToDate","UserId","_onUserSearchChanged","reject","c","siteResponse","sites","Title","_setSite","locationResponse","locations","numericalSpacingStackTokens","newDate","getHours","getMinutes","setBeginningDate","setHours","setMinutes","setSeconds","setEndDate","DatePicker","onSelectDate","input","PostCode","tagDropdownStyles","dropdown","defaultStartDate","setMilliseconds","defaultEndDate","setMonth","Reporting","startDate","setStartDate","endDate","filterType","setFilterType","chartTitle","setChartTitle","tagOptions","setTagOptions","selectedTag","setSelectedTag","chartData","setChartData","tagResponse","_loadCountStats","bookingCounts","labels","Object","keys","counts","entries","datasets","borderColor","alignItems","marginBottom","textAlign","marginLeft","FloorplanForm","setName","_editFloorplanData","NewLayoutDialog","useHistory","_newLayout","fromBlank","onError","FloorplansPanel","formData","setFormData","floorplans","setFloorplans","floorplanSelected","setFloorplanSelected","showNewLayoutDialog","setShowNewLayoutDialog","_loadFloorplans","setAllSelected","locationsResponse","_newFloorplan","_editFloorplanLayout","FloorplanLayout","layout","Published","_deleteFloorplan","deleteResponse","selectedItem","reloadFloorplans","LocationFormPanel","initialLocationAdminUsers","initialLocationDeskAccessUsers","ResourceAdminUsers","sau","setTitle","BuildingNameNo","buildingNameNo","setBuildingNameNo","DeskBookingConstraint","RoomBookingConstraint","RoomCheckIns","RestrictRoomAccess","restrictRoomAccess","setRestrictRoomAccess","RestrictDeskAccess","restrictDeskAccess","setRestrictDeskAccess","locationAdmins","setLocationAdmins","deskAccess","setDeskAccess","roomIncludeTeams","setRoomIncludeTeams","deskIncludeTeams","setDeskIncludeTeams","getTitleCasedValues","_saveForm","formValues","siteAdminUserIds","sa","roomAdminTeamIds","deskAccessUserIds","da","deskAccessTeamIds","RoomAdminUsers","DeskAccessUsers","RoomAdminTeams","DeskAccessTeams","BookingConstraints","bc","find","mapUserToPersona","roomUserSearch","deskUserSearch","Pivot","PivotItem","checkIn","Location","saveRoom","deleteRoom","getCheckInRoomInfo","getRoomInfo","loadRoomsByApprover","loadRoomsBySite","roomType","loadRoomsByLocation","loadRoomsByLocationInclDisabled","getRoomAvailability","params","getRoomBookings","getSiteRoomBookings","RoomFormPanel","asRoomApprover","initialSiteAdminUsers","Capacity","capacity","setCapacity","Equipment","equipment","setEquipment","Disabled","setDisabled","Hidden","setHidden","RoomType","setRoomType","roomAdmins","setRoomAdmins","qrCode","setQrCode","roomAdminUserIds","roomName","QRCode","toDataURL","code","Site","warning","createElement","LocationName","download","click","RoomQRCodeDialog","RoomsPanel","setRooms","locationSelected","setLocationSelected","showQR","setShowQR","_loadRooms","_deleteRoom","sort","onRenderHeader","colProps","defaultRenderer","ActionButton","exact","component","route","isNaN","match","reloadLocations","goBack","matchingRoom","l","LocationsPanel","_loadLocations","_deleteLocation","flexContainer","matchingSite","SiteFormPanel","initialDeskAccessUsers","ResourceAdminTeams","team","Address","address","setAddress","Description","description","setDescription","postCode","setPostCode","SiteLevelParking","siteLevelParking","setSiteLevelParking","ParkingSpaces","parkingSpaces","setParkingSpaces","Notes","notes","setNotes","NotificationEmail","notificationEmail","setNotificationEmail","WorkWeekOnly","workWeekOnly","setWorkWeekOnly","siteAdmins","setSiteAdmins","isValidEmail","emailSetting","isFooterAtBottom","parsed","ev","flexGrow","SitesPanel","siteSelected","setSiteSelected","_loadSites","sitesResponse","_deleteSite","reloadSites","UpdateRoomDetails","none","SettingsPanel","buttonStyles","justifyContent","hasRoles","isAdmin","accessReporting","accessBookingMgmt","isRoomApprover","RoomApprover","scrollableContent","mins","hours","getNearestTime","initialStartHours","initialMins","initialEndHours","BookingDatePanel","startHours","setStartHours","startMins","setStartMins","endHours","setEndHours","endMins","setEndMins","dateA","dateB","nextDay","endTimeChanged","setTime","currentTime","maxDate","hourOptions","minOptions","startHourOption","dropdownOption","Month","Year","setFullYear","minDate","formatDate","dateToLocalISO","BookingSitePanel","color","borderRadius","BookingLocationPanel","siteNotes","setSiteNotes","_loadSiteInfo","to","BookingFloorplanPanel","floorplansResponse","calculateSvgDimensions","leftMostPoint","rightMostPoint","topMostPoint","bottomMostPoint","rectangles","shapeOriginX","shapeOriginY","calculateCurvePoints","Drawing","disableInteraction","filterTags","layoutDrawing","svgDimensions","handleHover","handleInteraction","bookingFormValues","context","scaleFactor","filteredDesks","onTouchStart","touches","xlinkHref","permitted","Teams","userTeamIds","deskTeams","some","val","getDeskFromPoint","deskEl","childEls","elementsFromPoint","contains","g","DeskCallout","hoveredBooking","setUser","loadUserInfo","userData","BookedByUserId","start","end","onBehalfOf","Callout","htmlId","rel","DeskBookingForm","readOnly","setSaving","setLayoutDrawing","setParkingEnabled","availableParking","setAvailableParking","setHoveredBooking","decodeURIComponent","FloorplanId","setBookingFormValues","locationName","setLocationName","locationBuildingNo","setLocationBuildingNo","setZoom","setTags","tagFilter","setTagFilter","toggleTag","tagId","LocationBuildingNo","SiteNotes","p","HasParking","totalSpaces","ParkingLimit","LayoutId","bookingsResponse","parkingBooked","_save","responseText","dt","defaultRender","closeLabel","onScroll","border","idxAttr","idxAttrSplit","isTouch","isFree","newZoom","wrap","css","selected","RoomBookingForm","roomInfo","setRoomInfo","isOwner","setIsOwner","newBooking","setNewBooking","showReasonDialog","setShowReasonDialog","setReason","setOnBehalfOf","comments","setComments","onCancelClick","cancelledByAdmin","IsRoomAdmin","save","finish","checkIsAdmin","str","IsRestricted","innerText","whiteSpace","rows","BookingList","listKey","tooltip","_onRejectClick","roomInfoResponse","_approveBooking","fmh","fma","rtn","isApprovalMode","isDesk","resourceName","RoomName","MeetingRoom","Status","itemDt","showStatus","CancelledByUserName","Rejected","labelJsx","bookingTable","setKey","getKey","MyBookingsPanel","viewDeskBooking","setViewDeskBooking","viewRoomBooking","setViewRoomBooking","table","selectionPending","_cancelBooking","commandBar","changesMade","RoomBookingSearch","initialFromDate","initialToDate","slotFromDate","setSlotFromDate","slotToDate","setSlotToDate","setSiteOptions","setLocationOptions","selectedSite","setSelectedSite","selectedLocation","setSelectedLocation","setAvailability","availabilityError","resultsLoading","setResultsLoading","multiDay","setMultiDay","pickRoom","setPickRoom","bookRoom","setBookRoom","siteDropdownOptions","_getLocations","locationDropdownOptions","_getAvailability","abort","_onTimeChange","timeElements","newFromDate","newToDate","activeConstraint","selectedSiteInfo","availableRooms","slot","ID","timeSlotChoices","Array","dateSt","dateEd","startTime","Intl","DateTimeFormat","hour","minute","hour12","format","endTime","dtStr","weekday","day","month","year","LocationID","getDefaultStartDate","getDay","getDefaultEndDate","localizer","momentLocalizer","moment","CalendarView","setView","bookRoomId","setBookRoomId","bookingStart","setBookingStart","bookingEnd","setBookingEnd","setBooking","setRoom","bookingConstraint","setBookingConstraint","setTooltipProps","views","v","splice","_loadBookings","roomResponse","roomObj","checkForOverlap","slotStart","slotEnd","overlap","events","BookedByUserName","substring","allDay","Pending","bookingItem","pending","layerProps","eventBubblingEnabled","selectable","startAccessor","endAccessor","onView","newView","onNavigate","action","onSelectSlot","slotInfo","stDate","edDate","onSelectEvent","calendarEvent","currentTarget","targetElement","calloutProps","onDoubleClickEvent","matchingBooking","eventPropGetter","SiteLocRoomList","roomCalendar","setRoomCalendar","siteList","_getRooms","RoomBookingTop","onRenderItemLink","pivotItemProps","PendingApproval","reload","getDateRangeFromDate","baseDate","SiteCalendar","calendarDate","setCalendarDate","setFilter","siteJson","_onInit","sitesAbort","regex","RegExp","panel","where","drilldownView","components","agenda","parent","titleRow","bookedBy","flexBasis","flexShrink","unregisteredCallback","vapidKey","serviceWorker","register","reg","CacheBuster","isLatestVersion","meta","latestVersion","versionA","versionB","versionsA","versionsB","shift","semverGreaterThan","process","prevProps","prevState","caches","names","delete","PrivacyPolicy","CheckIn","emailError","loggedIn","setLoggedIn","checkInBookings","setCheckInBookings","checkInError","setCheckInError","emailAddr","setEmailAddr","upcomingMeeting","UpcomingMeeting","previousMeeting","PreviousMeeting","roomDetails","RoomDetails","getData","isLoggedIn","ri","CheckedInByUserId","CheckedInByUserName","accept","gridColumn","gridRow","ReactDOM","render","StrictMode","signOutDiv","useRef","loadingProfile","setLoadingProfile","showSignOut","setShowSignOut","profileAndSettings","setProfileAndSettings","pendingBookingCount","setPendingBookingCount","notificationsDefault","setNotificationsDefault","notifications","useMemo","PushNotifications","_loadProfile","_profileAndSettings","_loadPendingBookings","count","PendingApprovals","Provider","homepage","homepageGrid","logoRow","signOut","logo","menuRow","myBookingsImg","bookDeskImg","inOfficeImg","clinical","approvals","SiteLvlAdmin","calendar","profileImg","settingsImg","Clinical","RequestPermission","SetSnoozeCookie","getElementById"],"mappings":"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","file":"static/js/main.a56454a4.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"commandBar\":\"MyBookings_commandBar__1dJ4M\",\"bookingTable\":\"MyBookings_bookingTable__1I3Nw\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"bookingItem\":\"CalendarView_bookingItem__WXSmz\",\"pending\":\"CalendarView_pending__bAJ_x\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"isAdminColumn\":\"AdministratorsPanel_isAdminColumn__JDQSP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tag\":\"DeskBookingForm_tag__1a0MG\",\"selected\":\"DeskBookingForm_selected__326hF\"};","const xmlns = \"http://www.w3.org/2000/svg\";\r\n\r\nfunction applyAttributeObj(element:any, attributes: Record): any {\r\n for (let key in attributes) {\r\n element.setAttribute(key, attributes[key]);\r\n }\r\n return element;\r\n}\r\n\r\nexport const createPointerSvg = () => {\r\n let svg = document.createElementNS(xmlns, \"svg\");\r\n svg = applyAttributeObj(svg, {\r\n id: \"pointer\", width: \"22\", height: \"20\"\r\n });\r\n let g = document.createElementNS(xmlns, \"g\");\r\n g.setAttribute(\"transform\", \"matrix(1.3101052,0,0,1.3101052,-6.2175751,-9.0274217)\");\r\n let arrowbody = document.createElementNS(xmlns, \"rect\");\r\n arrowbody = applyAttributeObj(arrowbody, {\r\n x: \"12.5\", y: \"13.6\", transform: \"matrix(0.9221,-0.3871,0.3871,0.9221,-5.7605,6.5909)\", width: \"2\", height: \"8\"\r\n });\r\n let arrowhead = document.createElementNS(xmlns, \"polygon\");\r\n arrowhead.setAttribute(\"points\", \"12.2,15.6 12.6,15.5 17.4,15.5 9.2,7.3 9.2,18.5\");\r\n g.appendChild(arrowbody);\r\n g.appendChild(arrowhead);\r\n svg.appendChild(g);\r\n return svg;\r\n}\r\n\r\n/** Generates a 22x20 Desk Icon SVG */\r\nexport const createDeskSvg = () => {\r\n\r\n let deskRect = document.createElementNS(xmlns, \"rect\");\r\n deskRect.classList.add(\"deskRect\");\r\n deskRect = applyAttributeObj(deskRect, {\r\n ry: \"3\",\r\n rx: \"3\",\r\n y: \"4\",\r\n x: \"1\",\r\n height: \"17\",\r\n width: \"18\",\r\n fill: \"#cccccc\",\r\n style: \"stroke:none;\"\r\n });\r\n let availabilityCircle = document.createElementNS(xmlns, \"ellipse\");\r\n availabilityCircle.classList.add(\"availability\");\r\n availabilityCircle = applyAttributeObj(availabilityCircle, {\r\n ry: \"7\",\r\n rx: \"7\",\r\n cy: \"10\",\r\n cx: \"10\",\r\n fill: \"#ffffff\",\r\n style: \"stroke:#808080;stroke-width:1.1;stroke-miterlimit:4;stroke-dasharray:none\"\r\n });\r\n \r\n // x - marking non-availability\r\n let clippedGroup = document.createElementNS(xmlns, \"g\");\r\n clippedGroup.setAttribute(\"clip-path\", \"url(#nonAvailability)\");\r\n clippedGroup.classList.add(\"notAvailableIcon\");\r\n let unavailableLine1 = document.createElementNS(xmlns, \"line\");\r\n unavailableLine1 = applyAttributeObj(unavailableLine1, {\r\n x1: \"3\", x2: \"17\", y1: \"3\", y2: \"16\", stroke: \"#aa0000\", \"stroke-width\": \"2\"\r\n });\r\n let unavailableLine2 = document.createElementNS(xmlns, \"line\");\r\n unavailableLine2 = applyAttributeObj(unavailableLine2, {\r\n x1: \"17\", x2: \"3\", y1: \"3\", y2: \"16\", stroke: \"#aa0000\", \"stroke-width\": \"2\"\r\n });\r\n clippedGroup.appendChild(unavailableLine1);\r\n clippedGroup.appendChild(unavailableLine2);\r\n \r\n let mainGroup = document.createElementNS(xmlns, \"g\");\r\n mainGroup.appendChild(deskRect);\r\n mainGroup.appendChild(availabilityCircle);\r\n mainGroup.appendChild(clippedGroup);\r\n\r\n return mainGroup;\r\n}\r\n\r\nexport const createDoorSvg = () => {\r\n let mainGroup = document.createElementNS(xmlns, \"g\");\r\n mainGroup = applyAttributeObj(mainGroup, {\r\n width: \"20\", height: \"20\"\r\n });\r\n let door = document.createElementNS(xmlns, \"path\");\r\n door = applyAttributeObj(door, {\r\n d: \"m1,22.5l10,-11c0,0.08 6,1.5 6.8,11z\",\r\n fill: \"#fff\",\r\n stroke: \"#e3e3e3\",\r\n strokeDasharray: \"29\", \r\n strokeLinecap:\"round\",\r\n strokeLinejoin:\"round\"\r\n });\r\n let line = document.createElementNS(xmlns, \"line\");\r\n line = applyAttributeObj(line, {\r\n x1: \"1\", x2: \"11\", y1: \"22.5\", y2: \"11\", stroke: \"#000\"\r\n });\r\n mainGroup.appendChild(door);\r\n mainGroup.appendChild(line);\r\n return mainGroup;\r\n};","import { Tag } from \"./Tagging.types\";\r\n\r\nexport interface IStampable {\r\n id?: number; x: number; y: number; width?: number; height?: number;\r\n rotation: number;\r\n}\r\n\r\nexport interface IDesk extends IStampable {\r\n alias: string;\r\n bookable: boolean;\r\n assignedTeams: number[];\r\n tags: Tag[];\r\n}\r\n\r\nexport enum TBFontSize {\r\n large = \"large\",\r\n small = \"small\"\r\n}\r\n\r\nexport interface ITextBox extends IStampable {\r\n text?: string;\r\n fontSize: TBFontSize;\r\n}\r\n\r\nexport interface IRoomRectangle extends IStampable {\r\n x: number; y: number;\r\n width: number; height: number;\r\n}\r\n\r\ntype SvgShapeComponentType = \"Move\" | \"Line\" | \"Curve\" | \"ReflectedCurve\" | \"Closure\";\r\n\r\ninterface ISvgShapeComponent {\r\n type: SvgShapeComponentType;\r\n preview?: boolean;\r\n}\r\n\r\nexport interface ISvgLine extends ISvgShapeComponent {\r\n type: \"Line\";\r\n /* target x co-ordinate of the line */\r\n x: number;\r\n /* target y co-ordinate of the line */\r\n y: number;\r\n}\r\n\r\nexport interface ISvgCurve extends ISvgShapeComponent {\r\n type: \"Curve\";\r\n /* x co-ordinate of the curve control point */\r\n x1: number;\r\n /* y co-ordinate of the curve control point */\r\n y1: number;\r\n /* target x co-ordinate of the curve */\r\n x: number;\r\n /* target y co-ordinate of the curve */\r\n y: number;\r\n}\r\n\r\nexport interface ISvgReflectedCurve extends ISvgShapeComponent {\r\n type: \"ReflectedCurve\";\r\n /* target x co-ordinate of the reflected curve */\r\n x: number;\r\n /* target y co-ordinate of the reflected curve */\r\n y: number;\r\n}\r\n\r\nexport interface ISvgClosure extends ISvgShapeComponent {\r\n type: \"Closure\";\r\n}\r\n\r\nexport interface ISvgStart extends ISvgShapeComponent {\r\n type: \"Move\",\r\n /* target x co-ordinate of the move operation */\r\n x: number;\r\n /* target y co-ordinate of the move operation */\r\n y: number;\r\n}\r\n\r\nexport type SvgShapeComponent = ISvgStart | ISvgLine | ISvgCurve | ISvgReflectedCurve | ISvgClosure;\r\n\r\nexport interface ISvgShape extends IStampable {\r\n path: SvgShapeComponent[];\r\n}\r\n\r\nexport type StampObj = \"Desk\" | \"Door\" | \"Text\" | \"Floor\" | \"Room\" | \"Shape\";\r\n\r\nexport type ToolType = \"Pointer\" | \"Floor\" | \"Room\" | \"Pen\" | \"Select\" | StampObj;\r\n\r\nexport type MouseDownOperationType = \"Scroll\" | \"MoveShape\" | \"MoveDesk\" | \"MoveDoor\" | \"MoveText\" | \"MoveRoom\" | \"MoveFloor\" |\r\n \"RotateDesk\" | \"RotateDoor\" | \"RotateFloor\" | \"RotateRoom\" | \"RotateShape\" |\r\n \"DrawFloorplan\" | \"DrawRoom\" | \"DrawWithPen\" | \"MultiSelect\";\r\n\r\nexport interface IMouseDownOperation {\r\n type: MouseDownOperationType;\r\n itemIdx: number;\r\n initialCoords: number[];\r\n}","import { IDesk, ToolType } from \"../../types/Floorplan.types\";\r\nimport { createDeskSvg } from \"./SvgElements\";\r\n\r\nexport interface IDesksProps {\r\n desks?: IDesk[];\r\n selectedDeskIdx?: number;\r\n selectedObjects?: Record;\r\n selectedTool?: ToolType;\r\n}\r\n\r\nconst Desks = (props: IDesksProps) => {\r\n const { desks, selectedDeskIdx, selectedTool } = props;\r\n if (desks && desks.length > 0) {\r\n return (\r\n \r\n { desks.map((desk, idx) => {\r\n const svg = createDeskSvg();\r\n const html = svg.innerHTML;\r\n let cursor: string | undefined = undefined, transform: string | undefined = undefined;\r\n let className = \"desk desk-\" + idx;\r\n if (selectedTool === \"Pointer\" && (selectedDeskIdx === idx || (props.selectedObjects && props.selectedObjects.desks.includes(idx)))) {\r\n className = \"draggable draggableDesk-\" + idx;\r\n }\r\n if (desk.rotation !== 0) {\r\n transform = `rotate(${desk.rotation})`;\r\n }\r\n if (!desk.bookable) className += \" nonAvailableDesk\";\r\n \r\n return (\r\n \r\n \r\n \r\n );\r\n }) }\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default Desks;","export interface IZoomControlsProps {\r\n currentZoom: number;\r\n onZoom: (zoom: number) => void;\r\n min: number; max: number;\r\n absolutePos?: boolean;\r\n}\r\n\r\nconst ZoomControls = (props: IZoomControlsProps) => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ZoomControls;","import { IDesk } from \"../../../types/Floorplan.types\";\r\n\r\nexport interface IDeskCanvasControlsProps {\r\n desks: IDesk[];\r\n selectedDeskIdx?: number;\r\n}\r\n\r\nconst DeskCanvasControls = (props: IDeskCanvasControlsProps) => {\r\n const { desks, selectedDeskIdx } = props;\r\n if (selectedDeskIdx !== undefined) {\r\n const selectedDesk = desks[selectedDeskIdx];\r\n if (selectedDesk) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport default DeskCanvasControls;","import { BaseButton, IconButton, Stack, TooltipDelay, TooltipHost } from \"office-ui-fabric-react\";\r\nimport { IDesk, ToolType } from \"../../../types/Floorplan.types\";\r\n\r\nexport interface IRoomEditorToolsProps {\r\n desks: IDesk[];\r\n undoStates: any;\r\n redoStates: any;\r\n editableSelection: boolean;\r\n removableSelection: boolean;\r\n selectedTool: string;\r\n onFitToScreen: () => void;\r\n onSettingToggle: (boolName: string) => React.MouseEventHandler | undefined;\r\n onToolSelection: (toolName: ToolType) => React.MouseEventHandler | undefined;\r\n onEdit: () => void;\r\n onUndo: () => void;\r\n onRedo: () => void;\r\n onDelete: () => void;\r\n}\r\n\r\nconst iconStyle = (name: string, selectedTool: string): React.CSSProperties => {\r\n let background: string | undefined = undefined;\r\n if (name === selectedTool) background = \"#cfd8dc\";\r\n return {\r\n fontSize: 20, background\r\n };\r\n};\r\n\r\nconst RoomEditorTools = (props: IRoomEditorToolsProps) => {\r\n const titleStyle = { root: {\r\n paddingLeft: 10,\r\n paddingRight: 10,\r\n borderRight: \"1px solid #e3e3e3\",\r\n \"> div\": {\r\n textTransform: \"uppercase\",\r\n fontSize: \"0.7rem\"\r\n },\r\n \"> div:first-letter\": {\r\n fontSize: \"0.8rem\"\r\n }\r\n }\r\n };\r\n return (\r\n \r\n \r\n
Tools
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Desk

\r\n Toggle between bookable and non-bookable with the letter T.

\r\n Rotate with the letter R.\r\n \r\n }>\r\n \r\n
\r\n \r\n \r\n \r\n \r\n Floor Space

\r\n Toggle between the floor space and internal room tools with the letter I.\r\n \r\n }>\r\n \r\n
\r\n \r\n Internal Room / Rectangle

\r\n Toggle between the floor space and internal room tools with the letter I.\r\n \r\n }>\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
View
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
Editing
\r\n \r\n \r\n \r\n \r\n \r\n { props.onEdit(); }} \r\n style={{fontSize: 20}}\r\n />\r\n \r\n \r\n { props.onDelete(); }} \r\n style={{fontSize: 20}}\r\n />\r\n \r\n \r\n
\r\n \r\n
Other
\r\n \r\n \r\n { props.onUndo(); }} \r\n style={{fontSize: 20}}\r\n />\r\n \r\n \r\n { props.onRedo(); }} \r\n style={{fontSize: 20}}\r\n />\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoomEditorTools;","import { IStampable, ToolType } from \"../../types/Floorplan.types\";\r\nimport { createDoorSvg } from \"./SvgElements\";\r\n\r\nexport interface IDoorsProps {\r\n doors?: IStampable[];\r\n selectedDoorIdx?: number;\r\n selectedObjects?: Record;\r\n selectedTool?: ToolType;\r\n}\r\n\r\nconst Desks = (props: IDoorsProps) => {\r\n const { doors, selectedDoorIdx, selectedTool } = props;\r\n if (doors && doors.length > 0) {\r\n return (\r\n \r\n { doors.map((door, idx) => {\r\n const svg = createDoorSvg();\r\n const html = svg.innerHTML;\r\n let cursor: string | undefined = undefined, transform: string | undefined = undefined;\r\n let className = \"door door-\" + idx;\r\n if (selectedTool === \"Pointer\" && (selectedDoorIdx === idx || (props.selectedObjects && props.selectedObjects.doors.includes(idx)))) {\r\n className = \"draggable draggableDoor-\" + idx;\r\n }\r\n if (door.rotation !== 0) {\r\n transform = `rotate(${door.rotation}, 10, 12)`;\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 return null;\r\n};\r\n\r\nexport default Desks;","import { IStampable } from \"../../../types/Floorplan.types\";\r\n\r\nexport interface IDeskCanvasControlsProps {\r\n doors: IStampable[];\r\n selectedDoorIdx?: number;\r\n}\r\n\r\nconst DoorCanvasControls = (props: IDeskCanvasControlsProps) => {\r\n const { doors, selectedDoorIdx } = props;\r\n if (selectedDoorIdx !== undefined) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default DoorCanvasControls;","import { ITextBox, ToolType } from \"../../types/Floorplan.types\";\r\n\r\nexport interface IDesksProps {\r\n textBoxes?: ITextBox[];\r\n selectedTextIdx?: number;\r\n selectedObjects?: Record;\r\n selectedTool?: ToolType;\r\n}\r\n\r\nconst TextElements = (props: IDesksProps) => {\r\n const { textBoxes, selectedTextIdx, selectedTool } = props;\r\n if (textBoxes && textBoxes.length > 0) {\r\n return (\r\n \r\n { textBoxes.map((textBox, idx) => {\r\n let cursor: string | undefined = undefined;\r\n let className = \"text text-\" + idx;\r\n if ((selectedTool === \"Pointer\" || selectedTool === \"Text\") && (selectedTextIdx === idx || (props.selectedObjects && props.selectedObjects.textBoxes.includes(idx)))) {\r\n className = \"draggable text draggableText-\" + idx;\r\n }\r\n\r\n let textStr = textBox.text;\r\n if (!textStr || textStr.trim() === \"\") {\r\n textStr = \"Text\";\r\n }\r\n let textArr = textStr.split('\\n');\r\n \r\n return (\r\n \r\n \r\n { textArr.length > 1 && textArr.map((textComponent, idx) => (\r\n 0 ? \"15\" : undefined}>{textComponent}\r\n )) }\r\n { textArr.length === 1 && textStr }\r\n \r\n \r\n );\r\n }) }\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default TextElements;","import { Stack } from \"@fluentui/react\";\r\nimport { ChoiceGroup, Panel, PrimaryButton, TextField } from \"office-ui-fabric-react\";\r\nimport { ITextBox, TBFontSize } from \"../../../types/Floorplan.types\";\r\n\r\nexport interface ITextEditorPanelProps {\r\n onChange: (event: React.FormEvent | undefined, newValue: ITextBox) => void;\r\n onDismiss: () => void;\r\n value: ITextBox;\r\n}\r\n\r\nconst onFocus = (event: React.FocusEvent) => {\r\n const length = event.target.value.length;\r\n if (length) {\r\n event.target.setSelectionRange(length, length);\r\n }\r\n};\r\n\r\nexport const TextEditorPanel = (props: ITextEditorPanelProps) => {\r\n return (\r\n (\r\n \r\n Close\r\n \r\n )}>\r\n {\r\n let newValue = {...props.value};\r\n newValue.text = newText;\r\n props.onChange(e, newValue);\r\n }} onFocus={onFocus} />\r\n {\r\n let newValue = {...props.value};\r\n newValue.fontSize = option ? option.key as TBFontSize : TBFontSize.large;\r\n props.onChange(e, newValue);\r\n }}\r\n options={[\r\n {\r\n key: \"small\", iconProps: {iconName: \"FontDecrease\"}, text: \"Small\"\r\n },\r\n {\r\n key: \"large\", iconProps: {iconName: \"FontIncrease\"}, text: \"Large\"\r\n },\r\n ]}\r\n selectedKey={props.value.fontSize}\r\n />\r\n \r\n );\r\n}","function apiFetch(info: RequestInfo, init?: RequestInit) {\r\n return fetch(info, init).then((response) => {\r\n return response;\r\n }).catch((reason) => {\r\n if (!/check-in/.test(window.location.href) && (/\\/api\\//.test(info.toString()) && /failed to fetch/i.test(reason.message))) {\r\n window.location.href = window.location.protocol + '//' + window.location.host;\r\n } \r\n return reason;\r\n });\r\n}\r\n\r\nexport default apiFetch;","import { IRoomEditorDrawingState } from \"../components/drawing/editor/FloorplanEditor\";\r\nimport { IFloorplan } from \"../types/SiteLocation.types\";\r\nimport apiFetch from './index';\r\n\r\n/** Saves an edit to the floorplan metadata, effectively allows users to rename a floorplan */\r\nexport async function editFloorplanMetadata(floorplan: IFloorplan) {\r\n if (floorplan.Id !== undefined && floorplan.Id.trim() !== \"\") {\r\n return await apiFetch(`/api/floorplans/${floorplan.Id}`, {\r\n method: 'POST',\r\n body: JSON.stringify(floorplan),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n } else {\r\n return new Error(\"Unable to update floorplan metadata: Id is invalid\");\r\n }\r\n}\r\n\r\n/** Creates a new, blank floorplan for a given location */\r\nexport async function createNewFloorplan(locationId: number) {\r\n return await apiFetch(`/api/floorplans/location/${locationId}`, {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\n/** Deletes a floorplan from the system */\r\nexport async function deleteFloorplan(floorplanId: string) {\r\n return await apiFetch(`/api/floorplans/${floorplanId}`, {\r\n method: 'DELETE',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\n/** Loads the lastest floorplan layout edit */\r\nexport async function loadLatestFloorplanEdit(floorplanId: string) {\r\n return await apiFetch(`/api/floorplans/${floorplanId}/layout/latest`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\n/** Loads the latest published floorplan layout */\r\nexport async function loadLatestPublishedFloorplan(floorplanId: string) {\r\n return await apiFetch(`/api/floorplans/${floorplanId}/layout`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\n/** Loads floorplans for a given location */\r\nexport async function loadFloorplansForLocation(locationId: number) {\r\n return await apiFetch(`/api/floorplans/location/${locationId}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\n// POST floorplan/{floorplanGuid}/layout - new blank layout\r\nexport async function newFloorplanLayoutFromBlank(floorplanId: string) {\r\n return await apiFetch(`/api/floorplans/${floorplanId}/newlayout`, {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\n// POST floorplan/{floorplanGuid}/layout/fromPrevious \r\nexport async function newFloorplanLayoutFromPrevious(floorplanId: string) {\r\n return await apiFetch(`/api/floorplans/${floorplanId}/newlayout/fromPrevious`, {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\n// floorplan/{floorplanGuid}/layout/{id} - updates a floorplan layout\r\nexport async function updateFloorplanLayout(floorplanId: string, layoutId: number, drawing: IRoomEditorDrawingState) {\r\n return await apiFetch(`/api/floorplans/${floorplanId}/layout/${layoutId}`, {\r\n method: 'POST',\r\n body: JSON.stringify(drawing),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\n// floorplan/{floorplanGuid}/layout/{id}/publish - publishes a draft floorplan layout\r\nexport async function publishFloorplanLayout(floorplanId: string, layoutId: number, drawing: IRoomEditorDrawingState) {\r\n return await apiFetch(`/api/floorplans/${floorplanId}/layout/${layoutId}/publish`, {\r\n method: 'POST',\r\n body: JSON.stringify(drawing),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n","import { IProfileUpdateResponse, IRole, ITeam, IUserWithPhoto } from \"../types/User.types\";\r\nimport apiFetch from './index';\r\n\r\nexport async function isAuthenticated(): Promise {\r\n const response = await apiFetch('/api/users/current/isAuthenticated');\r\n if (response.ok) {\r\n const text = await response.text();\r\n return text === \"true\";\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function getMyProfile(): Promise {\r\n const response = await apiFetch('/api/users/me', {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n return await response.json();\r\n}\r\n\r\nexport async function getUserProfile(id: number) {\r\n return await apiFetch('/api/users/' + id, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function updateMyProfile(profile: IUserWithPhoto): Promise {\r\n const response = await apiFetch('/api/users/me', {\r\n method: 'POST',\r\n body: JSON.stringify(profile),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n return await response.json();\r\n}\r\n\r\nexport async function searchUsers(searchStr?: string): Promise {\r\n if (!searchStr || searchStr.length < 3) return [];\r\n const response = await apiFetch('/api/users/search/' + encodeURIComponent(searchStr), {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n return await response.json();\r\n}\r\n\r\nexport async function searchTeams(searchStr?: string): Promise {\r\n if (!searchStr || searchStr.length < 3) return [];\r\n const response = await apiFetch('/api/users/searchTeams/' + encodeURIComponent(searchStr), {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n return await response.json();\r\n}\r\n\r\nexport async function getRoles() {\r\n const response = await apiFetch(`/api/roles`);\r\n if (response.status === 200) {\r\n return await response.json() as IRole[];\r\n } else {\r\n return new Error(\"Unable to fetch roles\");\r\n }\r\n}\r\n\r\nexport async function saveRoles(email: string, roleIds: number[]): Promise {\r\n const response = await apiFetch(`/api/users/${email}/roles`, {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n RoleIds: roleIds\r\n }),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n }).catch((err) => err);\r\n return response.status === 200;\r\n}\r\n\r\nexport async function loadAllTeams() {\r\n const response = await apiFetch('/api/teams', {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n return response;\r\n}\r\n","import { Tag, TagType } from \"../types/Tagging.types\";\r\nimport apiFetch from './index';\r\n\r\nexport async function getTagsByType(type: TagType) {\r\n const tags: Tag[] = await (await apiFetch(`/api/tags/byType/${type}`, {\r\n headers: {\r\n 'Accept': 'application/json',\r\n },\r\n credentials: 'include'\r\n })).json();\r\n return tags;\r\n}\r\n\r\nexport async function editTag(tag: Tag) {\r\n let url = '/api/tags';\r\n if (tag.Id && tag.Id > 0) url += '/' + tag.Id;\r\n const result = await apiFetch(url, {\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n credentials: 'include',\r\n method: 'POST',\r\n body: JSON.stringify(tag),\r\n });\r\n return await result.json() as Tag;\r\n}\r\n\r\nexport async function searchTags(searchStr: string, type?: TagType) {\r\n let url = '/api/tags/search';\r\n if (Boolean(type)) url += 'byType';\r\n const result = await apiFetch(url, {\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n credentials: 'include',\r\n method: 'POST',\r\n body: JSON.stringify({\r\n query: searchStr,\r\n type\r\n })\r\n });\r\n return await result.json() as Tag[];\r\n}\r\n\r\nexport async function assignTags(entityId: number, entityType: 'user' | 'desk', tags: Tag[]) {\r\n let success = true;\r\n await apiFetch(`/api/tags/assign/${entityType}/${entityId}`, {\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n credentials: 'include',\r\n method: 'POST',\r\n body: JSON.stringify(tags.map(t => t.Id))\r\n }).catch(r => success = false);\r\n return success; \r\n}\r\n","export enum TagType {\r\n User = 1,\r\n Desk = 2,\r\n Room = 3,\r\n Location = 4,\r\n Site = 5\r\n}\r\n\r\nexport type Tag = {\r\n Id: number;\r\n Type: TagType;\r\n Label: string;\r\n Tooltip: string;\r\n}","import * as React from \"react\";\r\nimport { Tag, TagType } from \"../types/Tagging.types\";\r\nimport { Dialog, DialogFooter, Dropdown, PrimaryButton, TextField } from \"office-ui-fabric-react\";\r\n\r\nexport interface INewTagDialogProps {\r\n tag?: Tag;\r\n onDismiss: () => void;\r\n onSubmit: (tag: Tag) => Promise;\r\n type: TagType | undefined;\r\n}\r\n\r\nexport const NewTagDialog = (props: INewTagDialogProps) => {\r\n\r\n const { tag, onDismiss, onSubmit, type } = props;\r\n\r\n // Tag Type dropdown will be hidden if passed in via props\r\n const [ newTagType, setNewTagType ] = React.useState(type as number);\r\n const [ newTagTooltip, setNewTagTooltip ] = React.useState();\r\n\r\n const dismiss = React.useCallback(() => {\r\n if (onDismiss) {\r\n setNewTagType(undefined);\r\n setNewTagTooltip(undefined);\r\n onDismiss();\r\n }\r\n }, [onDismiss]);\r\n\r\n if (!tag) return null;\r\n\r\n return (\r\n \r\n )\r\n}","import * as React from \"react\";\r\nimport { Tag, TagType } from \"../types/Tagging.types\";\r\nimport { ITag, Label, TagPicker as OUITagPicker, TagItem, TagItemSuggestion, TooltipHost } from \"office-ui-fabric-react\";\r\nimport { editTag, searchTags } from \"../api/tagging\";\r\nimport { NewTagDialog } from \"./NewTagDialog\";\r\n\r\nexport interface ITagPickerProps {\r\n /** Label for the picker */\r\n label: string;\r\n selectedTags?: Tag[];\r\n /** Type of tags to be used */\r\n type?: TagType;\r\n onChange?: (tags: Tag[]) => void;\r\n /** Behaviour that should occur when a tag is removed. If a Tag[] is returned, those tags will be considered not removed and kept in selected items. */\r\n onTagsRemoved?: (tags: Tag[]) => Tag[] | PromiseLike | undefined | void;\r\n}\r\n\r\nexport const TagPicker = (props: ITagPickerProps) => {\r\n\r\n const { onChange, onTagsRemoved, selectedTags: initialTags, type } = props; \r\n \r\n // Tracks currently selected tags in the picker\r\n const [ selectedTags, setSelectedTags ] = React.useState([]);\r\n const [ ready, setReady ] = React.useState(false);\r\n \r\n // setNewTag effectively opens a new tag dialog box. Set to undefined to hide.\r\n const [ newTag, setNewTag ] = React.useState();\r\n\r\n // When selected tags is updated, notify outside components\r\n React.useEffect(() => {\r\n if (ready && onChange) {\r\n onChange(selectedTags);\r\n }\r\n }, [onChange, selectedTags]);\r\n\r\n // Reset state of New Tag dialog and hide it\r\n const closeNewTagForm = React.useCallback(() => {\r\n setNewTag(undefined);\r\n }, []);\r\n\r\n // Save a new tag and add it to the selected tags\r\n const saveNewTag = React.useCallback(async (tag: Tag) => {\r\n if (newTag) {\r\n const result = await editTag(tag);\r\n setSelectedTags([...selectedTags, result]);\r\n }\r\n }, [newTag, selectedTags]);\r\n\r\n // Perform a search against the database for existing tags\r\n const search = React.useCallback(async (filter: string) => {\r\n const results = await searchTags(filter, props.type);\r\n return results;\r\n }, [props?.type]);\r\n\r\n // TAG PICKER - Get Suggestions\r\n const onResolveSuggestions = React.useCallback(async (filter: string, selectedItems?: ITag[] | undefined): Promise => {\r\n // Get search results from DB and map to OUI ITag object\r\n const results = await search(filter);\r\n let tags = results?.map((r) => ({\r\n key: r.Id,\r\n name: r.Label,\r\n data: r\r\n } as ITag)) ?? [];\r\n\r\n // Exclude any tags that were already picked\r\n if (selectedItems) {\r\n tags = tags.filter(t => selectedItems.map(si => si.key).indexOf(t.key) < 0);\r\n }\r\n\r\n // If this exact string is not found in DB, offer to add it\r\n if (tags.length === 0 || (!tags.map(t => t.name).includes(filter) && !selectedItems?.map(si => si.name).includes(filter))) {\r\n return [...tags, {\r\n key: -1,\r\n name: `> Click to add '${filter}'`,\r\n data: {\r\n Id: -1,\r\n Label: filter, \r\n } as any as Tag\r\n }] as any as ITag[];\r\n }\r\n return tags;\r\n }, [search]);\r\n\r\n // TAG PICKER - OnChange\r\n // When the tag picker updates with a change...\r\n const pickerOnChange = React.useCallback((items: ITag[] | undefined) => {\r\n if (ready) {\r\n // If any items have the id -1, the user has pressed enter on a new user-defined tag. Open new tag dialog:\r\n const addNewTag = items?.filter(i => i.key === -1)[0];\r\n if (addNewTag) {\r\n setNewTag((addNewTag as any).data as Tag);\r\n }\r\n \r\n // All other tags that were added should be added to selected tags in state\r\n items = items?.filter(i => i.key as number > 0);\r\n \r\n // Callback for tags that are removed. We may wish to perform additional behaviour outside of the component\r\n // such as deleting the tag from the database when removed etc.\r\n const tagsRemoved = selectedTags.filter(st => !(items || []).map(i => i.key as number).includes(st.Id));\r\n if (tagsRemoved.length && onTagsRemoved) {\r\n Promise.resolve(onTagsRemoved(tagsRemoved)).then(rtnVal => {\r\n // If the callback returns a Tag[], those tags are considered to have been kept\r\n if (items && rtnVal) {\r\n items = [...items, ...rtnVal.map(tr => ({ key: tr.Id, name: tr.Label, data: tr } as ITag))];\r\n }\r\n });\r\n }\r\n \r\n // Update state\r\n setSelectedTags(items?.map(i => (i as any).data as Tag) || []);\r\n }\r\n }, [selectedTags, onTagsRemoved]);\r\n\r\n React.useEffect(() => {\r\n if (!ready) {\r\n setSelectedTags(initialTags || []);\r\n setReady(true);\r\n }\r\n }, [initialTags, ready, selectedTags]);\r\n\r\n return (\r\n <>\r\n \r\n ({\r\n key: st.Id,\r\n name: st.Label,\r\n data: st\r\n } as ITag))}\r\n onChange={pickerOnChange}\r\n resolveDelay={800}\r\n pickerSuggestionsProps={{\r\n suggestionsHeaderText: \"Suggested Tags\"\r\n }}\r\n onRenderItem={(itemProps) => {\r\n return (\r\n \r\n {itemProps.item.name}\r\n \r\n );\r\n }}\r\n onRenderSuggestionsItem={(tagProps, suggestionItemProps) => {\r\n return (\r\n \r\n {tagProps.name}\r\n \r\n );\r\n }}\r\n onResolveSuggestions={onResolveSuggestions} \r\n />\r\n \r\n \r\n )\r\n}","import { useCallback, useEffect, useState } from \"react\";\r\nimport { \r\n ITag, \r\n Label, \r\n Panel, \r\n PanelType, \r\n Slider, \r\n TagPicker as OUITagPicker, \r\n TextField, \r\n Toggle \r\n} from \"office-ui-fabric-react\";\r\nimport { loadAllTeams } from \"../../../api/userInfo\";\r\nimport { IDesk } from \"../../../types/Floorplan.types\";\r\nimport { ITeam } from \"../../../types/User.types\";\r\nimport { TagPicker } from \"../../TagPicker\";\r\nimport { Tag, TagType } from \"../../../types/Tagging.types\";\r\n\r\nexport interface IDeskEditorPanel {\r\n onChange: (desk: IDesk) => void;\r\n onDismiss: () => void;\r\n snapping: boolean;\r\n value: IDesk;\r\n}\r\n\r\nconst getTextFromItem = (item: ITag) => {\r\n return item.name;\r\n}\r\n\r\nconst snapTo45 = (num: number) => {\r\n return Math.round(num / 45) * 45\r\n};\r\n\r\nconst _listContainsTeamsTags = (tag: ITag, tagList?: ITag[]) => {\r\n if (!tagList || !tagList.length || tagList.length === 0) {\r\n return false;\r\n }\r\n return tagList.filter((compareTag) => compareTag.key === tag.key).length > 0;\r\n}\r\n\r\nexport const DeskEditorPanel = (props: IDeskEditorPanel) => {\r\n const { onChange, value: desk, snapping } = props;\r\n \r\n const [ alias, setAlias ] = useState(desk.alias);\r\n const [ rotation, setRotation ] = useState(snapping ? snapTo45(desk.rotation) : desk.rotation);\r\n const [ bookable, setBookable ] = useState(desk.bookable);\r\n const [ assignedTeamTag, setAssignedTeamTag ] = useState([]);\r\n const [ deskTags, setDeskTags ] = useState();\r\n const [ teamsTags, setTeamsTags] = useState([]);\r\n const [ ready, setReady ] = useState(false);\r\n\r\n // Load Teams options and assigned tags\r\n const loadTeamOptions = useCallback(async () => {\r\n const teamsResponse = await loadAllTeams();\r\n if (teamsResponse.ok) {\r\n const teams = await teamsResponse.json() as ITeam[];\r\n const teamTagOptions:ITag[] = teams.map((s) => {\r\n return {\r\n key: s.Id,\r\n name: s.Name\r\n }\r\n }); \r\n setTeamsTags(teamTagOptions);\r\n const assignedTeamTag:ITag[] = [];\r\n if (desk.assignedTeams && desk.assignedTeams.length > 0) {\r\n for (let index = 0; index < teamTagOptions.length; index++) {\r\n const element = teamTagOptions[index];\r\n desk.assignedTeams.forEach((a) => {\r\n if (a === element.key as number) {\r\n assignedTeamTag.push(element)\r\n }\r\n });\r\n }\r\n }\r\n setAssignedTeamTag(assignedTeamTag);\r\n }\r\n }, [desk]);\r\n\r\n const loadTags = useCallback(() => {\r\n setDeskTags(desk.tags);\r\n }, [desk]);\r\n\r\n // When Teams Tag Picker is updated\r\n const onResolveTeamSuggestions = useCallback((filter: string, selectedItems?: ITag[]): ITag[] => {\r\n if (teamsTags) {\r\n return filter\r\n ? teamsTags\r\n .filter((tag) => tag.name.toLowerCase().indexOf(filter.toLowerCase()) === 0)\r\n .filter((tag) => !_listContainsTeamsTags(tag, selectedItems))\r\n : [];\r\n } else {\r\n return [];\r\n }\r\n }, [teamsTags]);\r\n\r\n // When bookable is changed\r\n const onBookableUpdated = (event: React.MouseEvent, checked?: boolean | undefined) => {\r\n if (!checked) {\r\n setAssignedTeamTag([]);\r\n }\r\n setBookable(checked);\r\n }\r\n\r\n // When form changes, update JSON and update parent component(s)\r\n const updateDesk = useCallback((update: IDesk) => {\r\n return {...desk, ...update};\r\n }, [desk]);\r\n useEffect(() => {\r\n if (ready) {\r\n const newDesk = {} as IDesk;\r\n if (alias !== undefined) newDesk.alias = alias;\r\n if (bookable !== undefined) newDesk.bookable = bookable;\r\n if (rotation !== undefined) newDesk.rotation = rotation;\r\n if (!newDesk.assignedTeams) newDesk.assignedTeams = [];\r\n if (assignedTeamTag !== undefined && assignedTeamTag.length > 0) {\r\n newDesk.assignedTeams.push(assignedTeamTag[0].key as number);\r\n } \r\n newDesk.tags = deskTags || [];\r\n onChange(updateDesk(newDesk));\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [alias, assignedTeamTag, bookable, deskTags, rotation]);\r\n\r\n useEffect(() => {\r\n loadTeamOptions().then(() => {\r\n loadTags();\r\n setReady(true);\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n setAlias(newValue)} />\r\n {\r\n setRotation(snapping ? snapTo45(value) : value);\r\n }} />\r\n {\r\n if (ready) setDeskTags(tags);\r\n }}\r\n selectedTags={desk.tags}\r\n />\r\n \r\n { bookable && (\r\n
\r\n \r\n
Note: If you assign a Team to this desk only staff from that team can book it out.
\r\n {\r\n setAssignedTeamTag(items !== undefined ? items : []); \r\n }}\r\n itemLimit={1}\r\n />\r\n
\r\n )}\r\n
\r\n );\r\n}","import { IBooking, IBookingSearchParams } from \"../types/Booking.types\";\r\nimport apiFetch from './index';\r\n\r\nexport async function searchDeskBookings(searchParams: IBookingSearchParams) {\r\n return await apiFetch('/api/bookings/searchDesks', {\r\n method: 'POST',\r\n body: JSON.stringify(searchParams),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getMyBookings() {\r\n return await apiFetch('/api/bookings/my', {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getBookingsForLayoutAndTime(floorplanId: string, startDateStr: string, endDateStr: string) {\r\n return await apiFetch(`/api/bookings/for/${floorplanId}?start=${encodeURIComponent(startDateStr)}&end=${encodeURIComponent(endDateStr)}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function saveNewBooking(type: \"room\" | \"desk\", booking: IBooking) {\r\n return await apiFetch(`/api/bookings/${type}`, {\r\n method: 'POST',\r\n body: JSON.stringify(booking),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function cancelBooking(booking: IBooking) {\r\n return await apiFetch(`/api/bookings`, {\r\n method: 'DELETE',\r\n body: JSON.stringify(booking),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getPendingBookingCount(abortController: AbortController) {\r\n const response = await apiFetch(`/api/bookings/pendingApprovals/count`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n signal: abortController.signal\r\n });\r\n if (response.ok) {\r\n return await response.json() as { PendingApprovals: number };\r\n } else {\r\n return Error(\"Unable to get pending booking count\");\r\n }\r\n}\r\n\r\nexport async function getPendingBookings(abortController: AbortController) {\r\n const response = await apiFetch(`/api/bookings/pendingApprovals`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n signal: abortController.signal\r\n });\r\n if (response.ok) {\r\n return await response.json() as IBooking[];\r\n } else {\r\n return Error(\"Unable to get pending bookings\");\r\n }\r\n}\r\n\r\nexport async function rejectBooking(bookingId: number, info: { CancellationReason?: string, CancelledByAdmin: boolean }) {\r\n const response = await apiFetch(`/api/bookings/reject/${bookingId}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n \"Content-Type\": \"application/json\"\r\n },\r\n body: JSON.stringify(info),\r\n credentials: 'include',\r\n method: \"POST\"\r\n });\r\n if (response.ok) {\r\n return true;\r\n } else {\r\n return Error(\"Unable to reject booking: \" + response.statusText);\r\n }\r\n}\r\n\r\nexport async function approveBooking(bookingId: number) {\r\n const response = await apiFetch(`/api/bookings/approve/${bookingId}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n method: \"POST\"\r\n });\r\n if (response.ok) {\r\n return true;\r\n } else {\r\n return Error(\"Unable to approve booking: \" + response.statusText);\r\n }\r\n}\r\n\r\n","import { DefaultButton, Dialog, DialogFooter, PrimaryButton, Spinner } from \"office-ui-fabric-react\";\r\nimport * as React from \"react\";\r\nimport { useState } from \"react\";\r\nimport { searchDeskBookings } from \"../../api/bookings\";\r\nimport { IBookingSearchParams, IMyBooking } from \"../../types/Booking.types\";\r\n\r\nexport interface IDeskCheckDialogProps {\r\n deskId: number;\r\n onDismiss: (saved: boolean) => void;\r\n loadBookings?: (deskId: number) => void;\r\n}\r\n\r\nexport const DeskCheckDialog = (props: IDeskCheckDialogProps) => {\r\n const [ loading, setLoading ] = useState(true);\r\n const [ numOfBookings, setNumOfBookings ] = useState(0);\r\n\r\n const checkDeskBookings = async () => {\r\n let searchParams: IBookingSearchParams = {\r\n FromDate: new Date().toISOString(),\r\n DeskId: props.deskId\r\n }; \r\n const results = await searchDeskBookings(searchParams);\r\n if (results.ok) {\r\n setLoading(false);\r\n const bookings = await results.json() as IMyBooking[];\r\n setNumOfBookings(bookings.length);\r\n } \r\n } \r\n\r\n React.useEffect(() => {\r\n checkDeskBookings();\r\n }, []);\r\n\r\n return (\r\n \r\n { loading === true && (\r\n \r\n )}\r\n { loading === false && numOfBookings > 0 && (\r\n
\r\n )}\r\n { loading === false && numOfBookings === 0 && (\r\n
There are no future bookings for the desk you are trying to delete. Are you sure you want to continue?
\r\n )}\r\n { loading === false && numOfBookings > 0 && (\r\n
There are {numOfBookings} future bookings for the desk you are trying to delete. Please click the bookings button below to view these bookings and cancel them if you wish to delete this desk.
\r\n )} \r\n \r\n { loading === false && numOfBookings === 0 && (\r\n {\r\n props.onDismiss(true);\r\n }} />\r\n )}\r\n { loading === false && numOfBookings > 0 && (\r\n {\r\n props.loadBookings ? props.loadBookings(props.deskId) : props.onDismiss(false);\r\n }} />\r\n )} \r\n {\r\n props.onDismiss(false);\r\n }} />\r\n \r\n
\r\n )\r\n};\r\n","import { IRoom, RoomType } from \"./SiteLocation.types\";\r\n\r\nexport interface IBooking {\r\n Id: number;\r\n Start: string;\r\n Finish: string;\r\n OnBehalfOfEmail: string;\r\n BookedByUserId: number;\r\n BookedByUserName: string;\r\n Description: string;\r\n DeskId?: number;\r\n SiteId?: number;\r\n LocationId?: number;\r\n RoomId?: number;\r\n FloorplanId: string;\r\n LayoutId: number;\r\n IncludeParking: boolean;\r\n CancelledByAdmin?: boolean;\r\n CancellationReason?: string;\r\n CancelledByUserId?: number;\r\n CancelledByUserName?: string;\r\n CheckedInByUserId?: number;\r\n CheckedInByUserName?: string;\r\n CheckedInByOther?: string;\r\n Status?: BookingStatus;\r\n}\r\n\r\nexport interface IMyBooking extends IBooking {\r\n SiteName: string;\r\n LocationName: string;\r\n FloorplanName: string;\r\n DeskName: string;\r\n RoomName: string;\r\n PostCode: string;\r\n RoomType: RoomType;\r\n}\r\n\r\nexport interface ICheckInBookings {\r\n PreviousMeeting?: IBooking;\r\n UpcomingMeeting?: IBooking;\r\n RoomDetails: IRoom;\r\n}\r\n\r\nexport interface IBookingSearchParams {\r\n FromDate?: string;\r\n ToDate?: string;\r\n UserId?: number;\r\n SiteId?: number;\r\n LocationId?: number;\r\n FloorplanId?: string;\r\n DeskId?: number;\r\n}\r\n\r\nexport interface IAvailableRoomSlot {\r\n ID: number;\r\n SiteID: number;\r\n LocationID: number;\r\n Name: string;\r\n Capacity: number;\r\n Equipment?: string;\r\n Disabled: boolean;\r\n RestrictRoomAccess: boolean;\r\n Hidden: boolean;\r\n Start: string;\r\n Finish: string;\r\n}\r\nexport interface IRoomAvailability {\r\n clear: IRoom[];\r\n busy: IRoom[];\r\n}\r\n\r\nexport interface IBookingConstraint {\r\n [index: string]: number | undefined | null;\r\n Id?: number | undefined;\r\n SiteId?: number | null;\r\n LocationId?: number | null;\r\n RoomId?: number | null;\r\n Number?: number | undefined;\r\n Type?: number | undefined;\r\n ResourceType?: number | undefined;\r\n}\r\n\r\nexport enum BookingStatus {\r\n Pending = 0,\r\n Approved = 1,\r\n Rejected = 2,\r\n Cancelled = 3,\r\n AutoCancel = 4\r\n}\r\n\r\nexport enum ResourceType {\r\n Room = 1,\r\n Desk = 2\r\n}\r\n\r\nexport enum AccessType {\r\n Room = 1,\r\n Desk = 2\r\n}\r\n\r\nexport enum ConstraintType {\r\n Week = 1,\r\n Month = 2,\r\n Year = 3\r\n}","import { IPersonaProps } from \"office-ui-fabric-react\";\r\nimport * as React from \"react\";\r\nimport { searchTeams, searchUsers } from \"../api/userInfo\";\r\nimport { ConstraintType, IAvailableRoomSlot, IBookingConstraint, ResourceType } from \"../types/Booking.types\";\r\nimport { IRoom } from \"../types/SiteLocation.types\";\r\nimport { ITeam, IUserWithPhoto } from \"../types/User.types\";\r\n\r\nexport namespace Utils {\r\n export function sortRoomInfoAlphabetically(a: IRoom | IAvailableRoomSlot, b: IRoom | IAvailableRoomSlot) {\r\n let nameA = a.Name || \"\", nameB = b.Name || \"\";\r\n let numRegex = /(\\d{1,3})/;\r\n let alphaOnlyA = nameA.replace(/\\d/g, '');\r\n let alphaOnlyB = nameB.replace(/\\d/g, '');\r\n let numberAmatches = numRegex.exec(nameA);\r\n let numberBmatches = numRegex.exec(nameB);\r\n let numHighOrLow = 0;\r\n if (numberAmatches != null && numberBmatches === null) numHighOrLow = -1;\r\n if (numberAmatches === null && numberBmatches !== null) numHighOrLow = 1;\r\n if (numberAmatches !== null && numberBmatches !== null) {\r\n const numA = parseFloat(numberAmatches[1]), numB = parseFloat(numberBmatches[1]);\r\n if (numA < numB) numHighOrLow = -1;\r\n if (numA > numB) numHighOrLow = 1;\r\n }\r\n if (alphaOnlyA === alphaOnlyB) return numHighOrLow;\r\n return nameA < nameB ? -1 : 1;\r\n }\r\n export function isValidEmail(email?: string | undefined) {\r\n if (!email) return true;\r\n // eslint-disable-next-line no-control-regex\r\n const regex = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])/;\r\n return regex.test(email);\r\n }\r\n export function dateToLocalISO(date: Date) {\r\n const off = date.getTimezoneOffset()\r\n const absoff = Math.abs(off)\r\n return (new Date(date.getTime() - off*60*1000).toISOString().substr(0,23) +\r\n (off > 0 ? '-' : '+') + \r\n Math.floor(absoff / 60).toFixed(0).padStart(2,'0') + ':' + \r\n (absoff % 60).toString().padStart(2,'0'))\r\n }\r\n export function getDefaultConstraint(resourceType: ResourceType, siteId: number | null = null, locationId: number | null = null, roomId: number | null = null) {\r\n return {\r\n Id: -1,\r\n SiteId: siteId,\r\n LocationId: locationId,\r\n RoomId: roomId,\r\n Number: 1,\r\n ResourceType: resourceType,\r\n Type: ConstraintType.Week\r\n } as IBookingConstraint;\r\n }\r\n\r\n export function mapToPersona(obj: any) {\r\n let isUser = true;\r\n if (!obj.hasOwnProperty('Email')) {\r\n isUser = false;\r\n }\r\n let imageUrl: string | undefined;\r\n\r\n if (isUser && obj.Photo) {\r\n imageUrl = `data:${obj.Photo.Type};base64,${obj.Photo.Data}`;\r\n }\r\n let data: any;\r\n if (isUser) data = { userId: obj.Id };\r\n if (!isUser) data = { teamId: obj.Id };\r\n return ({\r\n text: isUser ? obj.FullName : obj.Name,\r\n secondaryText: isUser ? obj.Email : '(Team)',\r\n imageUrl, \r\n data\r\n } as IPersonaProps);\r\n }\r\n\r\n export function userSearch(includeTeams?: boolean) {\r\n return async (filter: string, selectedSuggestions?: IPersonaProps[]) => {\r\n const userResults = await searchUsers(filter);\r\n const teamResults = includeTeams ? await searchTeams(filter) : [];\r\n const results: (IUserWithPhoto|ITeam)[] = [...userResults, ...teamResults];\r\n\r\n return results.map(mapToPersona);\r\n }\r\n }\r\n}\r\n\r\nexport default Utils;","import * as React from \"react\";\r\nimport { Checkbox, DefaultButton, Dialog, DialogFooter, PrimaryButton, Spinner, TextField } from \"office-ui-fabric-react\";\r\nimport { useState } from \"react\";\r\nimport { IRole, IUserWithPhoto } from \"../../../types/User.types\";\r\nimport { getRoles, saveRoles } from \"../../../api/userInfo\";\r\nimport { ICheckboxStyles } from \"@fluentui/react\";\r\n\r\nexport interface ICancelReasonDialogProps {\r\n onDismiss: (cancel: boolean, cancelReason: string | undefined) => void;\r\n}\r\n\r\nexport const CancelReasonDialog = (props: ICancelReasonDialogProps) => {\r\n const [ loading, setLoading ] = useState(true);\r\n const [ cancelReason, setCancelReason ] = useState();\r\n\r\n React.useEffect(() => {\r\n setLoading(false);\r\n }); \r\n\r\n return (\r\n \r\n { loading === false && (\r\n {\r\n setCancelReason(newValue);\r\n }} />\r\n )}\r\n \r\n {\r\n props.onDismiss(true,cancelReason);\r\n }} />\r\n {\r\n props.onDismiss(false,\"\");\r\n }} />\r\n \r\n \r\n )\r\n};\r\n","import { CommandBar, DetailsList, Selection, Icon, Panel, PanelType, SelectionMode, TooltipHost, MessageBar, MessageBarType, Spinner, IconButton, Stack, PrimaryButton } from \"office-ui-fabric-react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { cancelBooking, searchDeskBookings } from \"../../api/bookings\";\r\nimport { IBooking, IMyBooking, IBookingSearchParams } from \"../../types/Booking.types\";\r\nimport { CancelReasonDialog } from \"../settings/menus/CancelReasonDialog\";\r\n\r\nexport interface ICancelBookingsPanelProps {\r\n deskId: number | undefined;\r\n onDismiss: (deskId: number | undefined) => void;\r\n}\r\n\r\nexport const CancelBookingsPanel = (props: ICancelBookingsPanelProps) => {\r\n const { onDismiss } = props;\r\n\r\n const [ cancelling, setCancelling ] = useState(false);\r\n const [ bookings, setBookings ] = useState();\r\n const [ bookingSelected, setBookingSelected ] = useState();\r\n const [ selectedBookings, setSelectedBookings ] = useState([]);\r\n const [ showDialog, setShowDialog ] = useState(false);\r\n\r\n const onSelectionChanged = () => {\r\n const selectedItems = selection.getSelection() as IMyBooking[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n setBookingSelected(true);\r\n setSelectedBookings(selectedItems);\r\n } else {\r\n setBookingSelected(false);\r\n setSelectedBookings([]);\r\n }\r\n };\r\n \r\n const [ selection ] = useState(new Selection({ onSelectionChanged }));\r\n\r\n const _load = async () => {\r\n const response = await searchDeskBookings({\r\n FromDate: new Date().toISOString(),\r\n DeskId: props.deskId\r\n });\r\n if (response.ok) {\r\n const bookings = await response.json() as IMyBooking[];\r\n setBookings(bookings);\r\n }\r\n } \r\n\r\n const _cancelBulkBookings = async (bookings: IMyBooking[], cancelReason: string | undefined) => {\r\n setCancelling(true);\r\n let cancelSuccess = 0;\r\n for (let index = 0; index < bookings.length; index++) {\r\n const booking = bookings[index];\r\n booking.CancelledByAdmin = true;\r\n booking.CancellationReason = cancelReason;\r\n const response = await cancelBooking(booking);\r\n if (response.ok) {\r\n cancelSuccess++;\r\n }\r\n }\r\n\r\n if (bookings.length == cancelSuccess) {\r\n alert('All selected bookings cancelled.');\r\n setCancelling(false);\r\n setSelectedBookings([]);\r\n _load();\r\n } else { \r\n if (cancelSuccess == 0) {\r\n alert('Unable to cancel bookings');\r\n setCancelling(false);\r\n setSelectedBookings([]);\r\n } else {\r\n alert(cancelSuccess + ' out of ' + bookings.length + ' bookings cancelled. There were issues cancelling the remaining bookings')\r\n setCancelling(false);\r\n setSelectedBookings([]);\r\n _load();\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n _load();\r\n }, []);\r\n\r\n return (\r\n onDismiss(props.deskId)}>\r\n { window.innerWidth < 640 && (\r\n You can scroll the table below with the mouse or your finger\r\n )}\r\n : undefined,\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as IMyBooking[];\r\n if (selectedItems) {\r\n setSelectedBookings(selectedItems);\r\n setShowDialog(true);\r\n }\r\n }\r\n }\r\n ]}\r\n />\r\n { bookings !== undefined && bookings.length > 0 && [\r\n {\r\n // For other orgs or if sites expand may want to list location and floorplan here too \r\n let deskName = item.DeskName;\r\n if (!deskName || deskName.trim().length === 0) deskName = \"Desk (Id: \" + item.DeskId + \")\";\r\n return (\r\n
\r\n {deskName}\r\n
\r\n {item.SiteName}\r\n
\r\n
\r\n )\r\n }\r\n },\r\n {\r\n key: \"onBehalf\",\r\n name: \"On Behalf Of\",\r\n fieldName: \"OnBehalfOfEmail\",\r\n minWidth: 80,\r\n maxWidth: 100,\r\n onRender: (item: IMyBooking) => {\r\n return item.OnBehalfOfEmail ? item.OnBehalfOfEmail : \"Self\";\r\n },\r\n },\r\n {\r\n key: \"start\",\r\n name: \"Start\",\r\n fieldName: \"Start\",\r\n minWidth: 80,\r\n maxWidth: 150,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.Start) {\r\n const date = new Date(item.Start);\r\n let dateStr = date.toLocaleDateString();\r\n if (window.innerWidth < 768) dateStr = dateStr.substr(0, 5);\r\n return dateStr + \" \" + date.toLocaleTimeString().substr(0,5);\r\n }\r\n }\r\n },\r\n {\r\n key: \"finish\",\r\n name: \"Finish\",\r\n fieldName: \"Finish\",\r\n minWidth: 80,\r\n maxWidth: 150,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.Finish) {\r\n const date = new Date(item.Finish);\r\n let dateStr = date.toLocaleDateString();\r\n if (window.innerWidth < 768) dateStr = dateStr.substr(0, 5);\r\n return dateStr + \" \" + date.toLocaleTimeString().substr(0,5);\r\n }\r\n }\r\n },\r\n {\r\n key: \"parking\",\r\n name: \"Parking\",\r\n fieldName: \"IncludeParking\",\r\n iconName: \"ParkingSolid\",\r\n isIconOnly: true,\r\n minWidth: 40,\r\n maxWidth: 40,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.IncludeParking) {\r\n return \r\n \r\n ;\r\n }\r\n }\r\n }\r\n ]}\r\n selection={selection}\r\n selectionMode={SelectionMode.multiple}\r\n />\r\n ]}\r\n { (bookings === undefined || bookings.length === 0) &&(\r\n No bookings found for the chosen desk.\r\n )}\r\n { showDialog && (\r\n {\r\n if (cancel) _cancelBulkBookings(selectedBookings, cancelReason);\r\n setShowDialog(false);\r\n }}\r\n />\r\n )} \r\n
\r\n );\r\n}","import { IRoomRectangle, ToolType } from \"../../types/Floorplan.types\";\r\n\r\nexport interface IFloorRects {\r\n floorplanRectangles?: IRoomRectangle[];\r\n selectedFloorIdx?: number;\r\n selectedTool?: ToolType;\r\n selectedObjects?: Record;\r\n children?: JSX.Element;\r\n}\r\n\r\nconst FloorRects = (props: IFloorRects) => {\r\n const { floorplanRectangles, selectedFloorIdx, selectedTool } = props;\r\n return (\r\n \r\n { floorplanRectangles && floorplanRectangles.length > 0 && floorplanRectangles.map((floor, idx) => {\r\n let className = \"floor floor-\" + idx;\r\n let transform: string | undefined = undefined;\r\n if (selectedTool === \"Pointer\" && (selectedFloorIdx === idx || (props.selectedObjects && props.selectedObjects.floorplanRectangles.includes(idx)))) {\r\n className = \"draggable draggableFloor-\" + idx;\r\n }\r\n if (floor.rotation !== 0) {\r\n const originX = floor.width! / 2;\r\n const originY = floor.height! / 2;\r\n transform = `rotate(${floor.rotation}, ${originX}, ${originY})`;\r\n } \r\n\r\n return ( \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n { props.children }\r\n \r\n );\r\n};\r\n\r\nexport default FloorRects;","import { IRoomRectangle, ToolType } from \"../../types/Floorplan.types\";\r\n\r\nexport interface IRoomRects {\r\n roomRectangles?: IRoomRectangle[];\r\n selectedRoomIdx?: number;\r\n selectedObjects?: Record;\r\n selectedTool?: ToolType;\r\n}\r\n\r\nconst RoomRects = (props: IRoomRects) => {\r\n const { roomRectangles, selectedRoomIdx, selectedTool } = props;\r\n if (roomRectangles && roomRectangles.length > 0) {\r\n return (\r\n \r\n { roomRectangles && roomRectangles.length > 0 && roomRectangles.map((room,idx) => {\r\n let className = \"room room-\" + idx;\r\n let transform: string | undefined = undefined;\r\n if (selectedTool === \"Pointer\" && ( selectedRoomIdx === idx || (props.selectedObjects && props.selectedObjects.roomRectangles.includes(idx)))) {\r\n className = \"draggable draggableRoom-\" + idx;\r\n }\r\n if (room.rotation !== 0) {\r\n const originX = room.width! / 2;\r\n const originY = room.height! / 2;\r\n transform = `rotate(${room.rotation}, ${originX}, ${originY})`;\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 return null;\r\n};\r\n\r\nexport default RoomRects;","import * as React from \"react\";\r\nimport { ISvgShape, SvgShapeComponent, ToolType } from \"../../types/Floorplan.types\";\r\n\r\nexport interface ISvgShapesProps {\r\n committedShapes?: ISvgShape[];\r\n selectedShapeIdx?: number;\r\n selectedTool?: ToolType;\r\n}\r\n\r\nconst SvgShapes = (props: ISvgShapesProps) => {\r\n const { committedShapes, selectedShapeIdx, selectedTool } = props;\r\n\r\n const getPath = React.useCallback((shapeElements: SvgShapeComponent[]) => {\r\n return shapeElements.map((shape) => {\r\n let pathEl = \"\";\r\n switch (shape.type) {\r\n case \"Move\":\r\n pathEl = `M ${shape.x} ${shape.y}`;\r\n break;\r\n case \"Line\":\r\n pathEl = `L ${shape.x} ${shape.y}`;\r\n break;\r\n case \"Curve\":\r\n pathEl = `Q ${shape.x1} ${shape.y1} ${shape.x} ${shape.y}`;\r\n break;\r\n case \"ReflectedCurve\":\r\n pathEl = `T ${shape.x} ${shape.y}`;\r\n break;\r\n case \"Closure\":\r\n pathEl = \"Z\";\r\n break;\r\n }\r\n return pathEl;\r\n }).join(' ');\r\n }, []);\r\n\r\n if (committedShapes && committedShapes.length > 0) {\r\n return (\r\n \r\n { committedShapes.map((shape, idx) => {\r\n let className = \"shape shape-\" + idx;\r\n let transform: string | undefined = undefined;\r\n if (selectedTool === \"Pointer\" && selectedShapeIdx === idx) {\r\n className = \"draggable draggableShape-\" + idx;\r\n }\r\n if (shape.rotation !== 0) {\r\n const originX = shape.width! / 2;\r\n const originY = shape.height! / 2;\r\n transform = `rotate(${shape.rotation}, ${originX}, ${originY})`;\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 return null;\r\n};\r\n\r\nexport default SvgShapes;","import * as React from \"react\";\r\nimport { SvgShapeComponent, ToolType } from \"../../types/Floorplan.types\";\r\n\r\nexport interface IPreviewShapeProps {\r\n tempShape?: SvgShapeComponent[];\r\n selectedShapeIdx?: number;\r\n selectedTool?: ToolType;\r\n}\r\n\r\nconst PreviewShape = (props: IPreviewShapeProps) => {\r\n const { tempShape, selectedShapeIdx, selectedTool } = props;\r\n\r\n const getPath = React.useCallback((shapeElements: SvgShapeComponent[]) => {\r\n return shapeElements.map((shape) => {\r\n let pathEl = \"\";\r\n switch (shape.type) {\r\n case \"Move\":\r\n pathEl = `M ${shape.x} ${shape.y}`;\r\n break;\r\n case \"Line\":\r\n pathEl = `L ${shape.x} ${shape.y}`;\r\n break;\r\n case \"Curve\":\r\n pathEl = `Q ${shape.x1} ${shape.y1} ${shape.x} ${shape.y}`;\r\n break;\r\n case \"ReflectedCurve\":\r\n pathEl = `T ${shape.x} ${shape.y}`;\r\n break;\r\n case \"Closure\":\r\n pathEl = \"Z\";\r\n break;\r\n }\r\n return pathEl;\r\n }).join(' ');\r\n }, []);\r\n\r\n if (tempShape && tempShape.length > 0) {\r\n return <>\r\n { tempShape !== undefined && tempShape.length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n ;\r\n }\r\n return null;\r\n};\r\n\r\nexport default PreviewShape;","import { ISvgShape } from \"../../../types/Floorplan.types\";\r\n\r\nexport interface IShapeCanvasControlsProps {\r\n shapes: ISvgShape[];\r\n selectedShapeIdx?: number;\r\n}\r\n\r\nconst ShapeCanvasControls = (props: IShapeCanvasControlsProps) => {\r\n const { shapes, selectedShapeIdx } = props;\r\n if (selectedShapeIdx !== undefined) {\r\n const selectedShape = shapes[selectedShapeIdx];\r\n if (selectedShape) {\r\n const x = selectedShape.x+(selectedShape.width! / 2);\r\n const y = selectedShape.y+(selectedShape.height! / 2);\r\n let radius = Math.max(selectedShape.width!, selectedShape.height!);\r\n if (radius > 50) radius = 50;\r\n if (radius < 15) radius = 15;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport default ShapeCanvasControls;","import { IRoomRectangle } from \"../../../types/Floorplan.types\";\r\n\r\nexport interface IRectCanvasControlsProps {\r\n rects: IRoomRectangle[];\r\n selectedFloorIdx?: number;\r\n type: \"Floor\" | \"Room\";\r\n}\r\n\r\nconst RectCanvasControls = (props: IRectCanvasControlsProps) => {\r\n const { rects, selectedFloorIdx } = props;\r\n if (selectedFloorIdx !== undefined) {\r\n const selectedFloorRect = rects[selectedFloorIdx];\r\n if (selectedFloorRect) {\r\n const x = selectedFloorRect.x+(selectedFloorRect.width! / 2);\r\n const y = selectedFloorRect.y+(selectedFloorRect.height! / 2);\r\n let radius = Math.max(selectedFloorRect.width!, selectedFloorRect.height!);\r\n if (radius > 50) radius = 50;\r\n if (radius < 15) radius = 15;\r\n // const handleX = selectedFloorRect.x + ((selectedFloorRect.width! / 2) + radius);\r\n // const handleY = selectedFloorRect.y;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport default RectCanvasControls;","import { IRoomEditorDrawingState } from \"./FloorplanEditor\";\r\n\r\nexport interface IMultiSelectCanvasControlsProps {\r\n drawingState: IRoomEditorDrawingState;\r\n selectedObjects?: Record;\r\n}\r\n\r\nconst MultiSelectCanvasControls = (props: IMultiSelectCanvasControlsProps) => {\r\n const { drawingState, selectedObjects } = props;\r\n const { desks, doors, floorplanRectangles, roomRectangles, floorplanShapes, text } = drawingState;\r\n\r\n return null;\r\n\r\n // if (selectedObjects !== undefined) {\r\n\r\n // let minX = Number.MAX_VALUE;\r\n // let minY = Number.MAX_VALUE;\r\n // let maxX = Number.MIN_VALUE;\r\n // let maxY = Number.MIN_VALUE;\r\n \r\n // // Get the x,y min and max for desks and doors, desks are rotated around their center\r\n // if (selectedObjects.desks) {\r\n // selectedObjects.desks.forEach(idx => {\r\n // const desk = desks[idx];\r\n // const truex = desk.x - 10, truey = desk.y - 12.5;\r\n // if (desk.x < minX) minX = desk.x;\r\n // if (desk.y < minY) minY = desk.y;\r\n // if (desk.x + 20 > maxX) maxX = desk.x + 20;\r\n // if (desk.y + 20 > maxY) maxY = desk.y + 20;\r\n // });\r\n // }\r\n // if (selectedObjects.doors) {\r\n // selectedObjects.doors.forEach(idx => {\r\n // const door = doors[idx];\r\n // if (door.x < minX) minX = door.x;\r\n // if (door.y < minY) minY = door.y;\r\n // if (door.x + 20 > maxX) maxX = door.x + 20;\r\n // if (door.y + 20 > maxY) maxY = door.y + 20;\r\n // });\r\n // }\r\n \r\n // // Get the x,y min and max for floorplanRectangles and roomRec\r\n \r\n // // if (selectedDeskIdx !== undefined) {\r\n // // const selectedDesk = desks[selectedDeskIdx];\r\n // // if (selectedDesk) {\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 // return null;\r\n};\r\n\r\nexport default MultiSelectCanvasControls;","import { Fabric, initializeIcons, registerIcons, IconButton, Stack, PrimaryButton, Spinner } from \"office-ui-fabric-react\";\r\nimport { cloneDeep, initial } from \"lodash\";\r\nimport * as React from \"react\";\r\nimport { createDeskSvg, createDoorSvg } from \"../SvgElements\";\r\nimport { IDesk, IMouseDownOperation, IRoomRectangle, IStampable, ISvgCurve, ISvgShape, ISvgStart, ITextBox, MouseDownOperationType, StampObj, SvgShapeComponent, TBFontSize, ToolType } from \"../../../types/Floorplan.types\";\r\nimport Desks from \"../Desks\";\r\nimport ZoomControls from \"../ZoomControls\";\r\nimport DeskCanvasControls from \"./DeskCanvasControls\";\r\nimport RoomEditorTools from \"./RoomEditorTools\";\r\nimport Doors from \"../Doors\";\r\nimport DoorCanvasControls from \"./DoorCanvasControls\";\r\nimport TextElements from \"../TextElements\";\r\nimport { TextEditorPanel } from \"./TextEditorPanel\";\r\nimport { loadLatestFloorplanEdit, publishFloorplanLayout, updateFloorplanLayout } from \"../../../api/floorplans\";\r\nimport { IFloorplanLayout } from \"../../../types/SiteLocation.types\";\r\nimport { DeskEditorPanel } from \"./DeskEditorPanel\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport { isAuthenticated } from \"../../../api/userInfo\";\r\nimport { DeskCheckDialog } from \"../DeskCheckDialog\";\r\nimport { CancelBookingsPanel } from \"../CancelBookingsPanel\";\r\nimport FloorRects from \"../FloorRects\";\r\nimport RoomRects from \"../RoomRects\";\r\nimport SvgShapes from \"../CustomShapes\";\r\nimport PreviewShape from \"../PreviewShape\";\r\nimport ShapeCanvasControls from \"./ShapeCanvasControls\";\r\nimport RectCanvasControls from \"./FloorRectCanvasControls\";\r\nimport MultiSelectCanvasControls from \"./MultiSelectCanvasControls\";\r\n\r\nexport interface IRoomEditorProps extends RouteComponentProps {\r\n floorplanId: string;\r\n layoutId: number;\r\n}\r\n\r\nexport interface IRoomEditorDrawingState {\r\n desks: IDesk[];\r\n doors: IStampable[];\r\n text: ITextBox[];\r\n roomRectangles: IRoomRectangle[];\r\n floorplanRectangles: IRoomRectangle[];\r\n floorplanShapes:ISvgShape[];\r\n tempShape: SvgShapeComponent[];\r\n lastUpdate?: string;\r\n}\r\n\r\nexport interface IRoomEditorState {\r\n lastSave?: Date;\r\n saving: boolean;\r\n /** Current drawing state including desks, floorplan rectangles and room rectangles */\r\n drawing: IRoomEditorDrawingState;\r\n /** Determines whether the Room/Rectangle draw operation will draw mergable floorplan rectangles or regular rooms/boxes */\r\n drawInternalRooms: boolean;\r\n /** Determines whether the Desk tool will place a bookable desk or a non-bookable desk */\r\n availability: boolean;\r\n /** Determines the rotation of a desk when first placed */\r\n defaultDeskRotation: number;\r\n /** Stores drawing state following actions that have been undone */\r\n redoStates: IRoomEditorDrawingState[];\r\n /** Index of the selected desk in the drawing.desks array. Populated by clicking a desk using the Pointer tool. */\r\n selectedDeskIdx?: number;\r\n /** Index of the desk element being edited in the drawing.desks array. Populated by double clicking a desk using the Pointer tool. */\r\n editingDeskIdx?: number;\r\n /** Index of the selected desk in the drawing.doors array. Populated by clicking a door using the Pointer tool. */\r\n selectedDoorIdx?: number;\r\n /** Index of the selected text element in the drawing.text array. Populated by adding new text or clicking a text element */\r\n selectedTextIdx?: number;\r\n /** Index of the selected room element in the drawing.roomRectangles array. Populated by clicking a room using the Pointer tool */\r\n selectedRoomIdx?: number;\r\n /** Index of the selected flooring element in the drawing.floorplanRectangles array. Populated by clicking a floor using the Pointer tool */\r\n selectedFloorIdx?: number;\r\n /** Index of the selected flooring shape element in the drawing.floorplanShapes array. Populated by clicking a floor using the Pointer tool */\r\n selectedShapeIdx?: number;\r\n /** Index of the text element being edited in the drawing.text array. Populated by adding new text or double clicking a text element */\r\n editingTextIdx?: number;\r\n /** Multi-selection - index arrays of any objects captured by a selection operation */\r\n selectedObjects?: Record;\r\n /** The currently selected editor tool */\r\n selectedTool: ToolType;\r\n /** Determines whether gridlines will be shown on the canvas */\r\n showGrid: boolean;\r\n /** Determines whether drawing operations will be restricted to 10px units */\r\n snapToGrid: boolean;\r\n /** Stores historical drawing state to allow reverting recently performed actions */\r\n undoStates: IRoomEditorDrawingState[];\r\n /** The zoom level of the drawing. Used to calculate a viewBox for the SVG. */\r\n zoom: number;\r\n /** Determines whether user is attempting to delete a desk from the floorplan */\r\n deletingDeskId?: number;\r\n /** Determines whether bookings panel it to be shown */\r\n showBookingsPanel?: boolean;\r\n}\r\n\r\nconst xmlns = \"http://www.w3.org/2000/svg\";\r\n\r\nexport class RoomEditor extends React.Component {\r\n \r\n private _initialDrawingState: IRoomEditorDrawingState = { \r\n desks: [],\r\n doors: [],\r\n text: [],\r\n floorplanRectangles: [], \r\n floorplanShapes: [],\r\n tempShape: [],\r\n roomRectangles: []\r\n };\r\n\r\n private _autoSaveTimer: number|undefined;\r\n\r\n /** Reference to the Room Editor's SVG Canvas */\r\n private svg: SVGSVGElement | null = null;\r\n /** Live mouse cursor X position - used in some drawing operations during MouseMove */\r\n private _liveX: number = 0; \r\n /** Live mouse cursor Y position - used in some drawing operations during MouseMove */\r\n private _liveY: number = 0;\r\n /** Editor's current MouseDown operation. This determines how the editor will behave during MouseMove and on MouseUp. */\r\n private _mouseDownOperation: IMouseDownOperation | null = null;\r\n /** Tells the editor if the pen is in use. Mouse move, mouse down and mouse up behaviour changes based on this */\r\n private _penInUse: boolean = false;\r\n\r\n constructor(props: IRoomEditorProps) {\r\n super(props);\r\n\r\n this._setupIcons();\r\n\r\n this._publish = this._publish.bind(this);\r\n this._autoSave = this._autoSave.bind(this);\r\n this._loadLayout = this._loadLayout.bind(this);\r\n this._checkLocalDrafts = this._checkLocalDrafts.bind(this);\r\n this._fitDesksToScreen = this._fitDesksToScreen.bind(this);\r\n this._handleKeyUp = this._handleKeyUp.bind(this);\r\n this._handleKeyDown = this._handleKeyDown.bind(this);\r\n this._setZoom = this._setZoom.bind(this);\r\n this._svgHandleDoubleClick = this._svgHandleDoubleClick.bind(this);\r\n this._svgHandleMouseDown = this._svgHandleMouseDown.bind(this);\r\n this._svgHandleMouseMove = this._svgHandleMouseMove.bind(this);\r\n this._svgHandleMouseUp = this._svgHandleMouseUp.bind(this);\r\n this._svgHandleMouseOut = this._svgHandleMouseOut.bind(this);\r\n this._svgHandleWheel = this._svgHandleWheel.bind(this);\r\n this._toggleStateBool = this._toggleStateBool.bind(this);\r\n this._toolSelection = this._toolSelection.bind(this);\r\n this.undo = this.undo.bind(this);\r\n this.redo = this.redo.bind(this);\r\n\r\n this.state = {\r\n saving: false,\r\n drawing: this._initialDrawingState,\r\n drawInternalRooms: false,\r\n availability: false,\r\n defaultDeskRotation: 0,\r\n redoStates: [],\r\n selectedTool: \"Pointer\",\r\n showGrid: true,\r\n snapToGrid: true,\r\n undoStates: [],\r\n zoom: 0.5,\r\n showBookingsPanel: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener(\"keyup\", this._handleKeyUp);\r\n document.addEventListener(\"keydown\", this._handleKeyDown);\r\n this._loadLayout();\r\n }\r\n \r\n componentWillUnmount() {\r\n document.removeEventListener(\"keyup\", this._handleKeyUp);\r\n document.removeEventListener(\"keydown\", this._handleKeyDown);\r\n }\r\n\r\n /** Override of React.Component setState, keeping track of previous state - allows for undo / redo functionality */\r\n public setState(state: IRoomEditorState, callback?: () => void) {\r\n const { floorplanId, layoutId } = this.props;\r\n const undoStates = [...this.state.undoStates];\r\n undoStates.push({...this.state.drawing});\r\n const newState = {\r\n ...state, \r\n drawing: {...state.drawing, lastUpdate: new Date().toISOString()}, \r\n undoStates, redoStates: []\r\n };\r\n localStorage.setItem(`draft_${floorplanId}_${layoutId}`, JSON.stringify(newState.drawing));\r\n super.setState(newState, callback);\r\n }\r\n\r\n public render() {\r\n const { \r\n saving, \r\n defaultDeskRotation, \r\n drawing, \r\n selectedShapeIdx, \r\n selectedDeskIdx, \r\n selectedDoorIdx, \r\n selectedTextIdx,\r\n selectedFloorIdx, \r\n selectedRoomIdx, \r\n selectedObjects,\r\n editingDeskIdx, \r\n editingTextIdx, \r\n selectedTool, \r\n showGrid, \r\n snapToGrid, \r\n zoom, \r\n undoStates, \r\n redoStates,\r\n deletingDeskId, \r\n showBookingsPanel \r\n } = this.state;\r\n const { desks, doors, text, floorplanRectangles, roomRectangles, floorplanShapes, tempShape } = drawing;\r\n const viewBox = `0 0 ${20000 * zoom} ${20000 * zoom}`;\r\n\r\n const editableSelectionMade = \r\n selectedDeskIdx !== undefined || \r\n selectedDoorIdx !== undefined || \r\n selectedTextIdx !== undefined;\r\n const removableSelectionMade =\r\n editableSelectionMade ||\r\n selectedRoomIdx !== undefined ||\r\n selectedFloorIdx !== undefined ||\r\n selectedShapeIdx !== undefined;\r\n\r\n const isSafari = /(Macintosh|iPhone|iPad|iPod).*Safari.*/i.test(navigator.userAgent);\r\n\r\n const svgCss = `\r\n @keyframes blink {\r\n 100%,\r\n 0% {\r\n fill: #500;\r\n }\r\n 60% {\r\n fill: #f00;\r\n }\r\n }\r\n #svgFloorplanEditor.pointerTool #bgColor,\r\n #svgFloorplanEditor.pointerTool #gridlines {\r\n cursor: grab;\r\n }\r\n #svgFloorplanEditor.pointerTool.grabbed #bgColor,\r\n #svgFloorplanEditor.pointerTool.grabbed #gridlines {\r\n cursor: grabbing;\r\n }\r\n #svgFloorplanEditor.pointerTool .desk {\r\n cursor: url('data:image/svg+xml,') 8 0, auto;\r\n }\r\n #svgFloorplanEditor.pointerTool .text.draggable text, \r\n #svgFloorplanEditor.textTool .text.draggable text {\r\n animation: blink 0.8s infinite;\r\n }\r\n #svgFloorplanEditor.pointerTool [class*=\"draggableFloor\"] rect,\r\n #svgFloorplanEditor.pointerTool [class*=\"draggableRoom\"] rect,\r\n #svgFloorplanEditor.pointerTool [class*=\"draggableShape\"] path{\r\n stroke: red !important;\r\n }\r\n #svgFloorplanEditor.pointerTool .draggable {\r\n cursor: move;\r\n }\r\n #svgFloorplanEditor.pointerTool [id$=\"RotationHandle\"] {\r\n cursor: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2232%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.0%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%2024%2024%22%20enable-background%3D%22new%200%200%2024%2024%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%223%2C3%202%2C10.3%208.9%2C8%20%22%2F%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%20stroke-miterlimit%3D%2210%22%20d%3D%22M5.8%2C5.4%20%20C7.4%2C3.9%2C9.6%2C3%2C12%2C3c5%2C0%2C9%2C4%2C9%2C9%22%2F%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%20stroke-miterlimit%3D%2210%22%20stroke-dasharray%3D%223%2C2%22%20d%3D%22%20%20M21%2C12c0%2C5-4%2C9-9%2C9c-3.2%2C0-5.9-1.6-7.5-4.1%22%2F%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%20stroke-miterlimit%3D%2210%22%20d%3D%22M4.2%2C7.6%20%20C5.7%2C4.8%2C8.6%2C3%2C12%2C3c5%2C0%2C9%2C4%2C9%2C9%22%2F%3E%3C%2Fsvg%3E') -4 -4, pointer;\r\n }\r\n #svgFloorplanEditor.deskTool .desk {\r\n cursor: not-allowed;\r\n }\r\n #svgFloorplanEditor.roomTool, #svgFloorplanEditor.floorTool {\r\n cursor: crosshair;\r\n }\r\n \r\n .notAvailableIcon {\r\n display: none;\r\n }\r\n .nonAvailableDesk .notAvailableIcon, .nonAvailableDesk .availability {\r\n display: none;\r\n }\r\n #floorplan {\r\n filter: url(#addborder);\r\n }\r\n #tempShape {\r\n stroke: black;\r\n }\r\n #shapes, #tempShape {\r\n fill: white;\r\n }\r\n .safari #floorplan {\r\n filter: none;\r\n }\r\n .safari #floorplan rect {\r\n stroke: none;\r\n }\r\n `;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n if (selectedDeskIdx !== undefined) {\r\n this.setState({...this.state, editingDeskIdx: selectedDeskIdx});\r\n }\r\n if (selectedDoorIdx !== undefined) alert('No properties to edit');\r\n if (selectedTextIdx !== undefined) {\r\n this.setState({...this.state, editingTextIdx: selectedTextIdx});\r\n }\r\n }}\r\n onDelete={() => {\r\n const drawingState = cloneDeep(this.state.drawing);\r\n let deletingDeskId: number | undefined;\r\n if (selectedDeskIdx !== undefined) {\r\n deletingDeskId = drawingState.desks[selectedDeskIdx].id;\r\n // this.setState({...this.state, deletingDeskId: selectedDeskIdx});\r\n // drawingState.desks = [...this.state.drawing.desks].filter((d, idx) => idx !== selectedDeskIdx);\r\n }\r\n if (selectedDoorIdx !== undefined) {\r\n drawingState.doors = [...this.state.drawing.doors].filter((d, idx) => idx !== selectedDoorIdx);\r\n }\r\n if (selectedTextIdx !== undefined) {\r\n drawingState.text = [...this.state.drawing.text].filter((d, idx) => idx !== selectedTextIdx);\r\n }\r\n if (selectedRoomIdx !== undefined) {\r\n drawingState.roomRectangles = [...this.state.drawing.roomRectangles].filter((d, idx) => idx !== selectedRoomIdx);\r\n }\r\n if (selectedFloorIdx !== undefined) {\r\n drawingState.floorplanRectangles = [...this.state.drawing.floorplanRectangles].filter((d, idx) => idx !== selectedFloorIdx);\r\n }\r\n if (selectedShapeIdx !== undefined) {\r\n drawingState.floorplanShapes = [...this.state.drawing.floorplanShapes].filter((s, idx) => idx !== selectedShapeIdx);\r\n }\r\n \r\n this.setState({\r\n ...this.state,\r\n drawing: drawingState,\r\n deletingDeskId,\r\n selectedDeskIdx: undefined,\r\n selectedDoorIdx: undefined,\r\n selectedTextIdx: undefined,\r\n editingTextIdx: undefined,\r\n });\r\n }}\r\n redoStates={redoStates}\r\n undoStates={undoStates}\r\n />\r\n \r\n { saving === true && (\r\n \r\n )}\r\n { saving === false && (\r\n this._autoSave()} style={{marginRight: 10}} />\r\n )}\r\n {\r\n if (window.confirm(\"Publish this layout and make the desks live to book?\")) {\r\n this._publish();\r\n }\r\n }} />\r\n {\r\n this.props.history.push(\"/\");\r\n }} />\r\n \r\n \r\n
\r\n
\r\n\r\n this.svg = ref} \r\n id=\"svgFloorplanEditor\"\r\n className={\"rotate\" + defaultDeskRotation + \" pointerTool\" + (isSafari ? \" safari\" : \"\")}\r\n version=\"1.1\"\r\n baseProfile=\"full\"\r\n width=\"20000\" height=\"20000\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n onWheel={this._svgHandleWheel}\r\n viewBox={viewBox}\r\n onDoubleClick={this._svgHandleDoubleClick}\r\n onMouseDown={this._svgHandleMouseDown}\r\n onMouseMove={this._svgHandleMouseMove}\r\n onMouseOut={this._svgHandleMouseOut}\r\n onMouseUp={this._svgHandleMouseUp}\r\n >\r\n \r\n \r\n \r\n\r\n { /* Mask for red x on non-available desks */ }\r\n \r\n \r\n \r\n\r\n { /* Thick floorplan outline */ }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n { /* Door template */}\r\n \r\n \r\n \r\n \r\n\r\n { /* Background Grid Template */ }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n { /* Background */ }\r\n \r\n \r\n\r\n { /* Floorplan layout */ }\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n { /* Doorways */ }\r\n \r\n\r\n { /* Text Labels */ }\r\n \r\n\r\n { /* Desks */ }\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n { editingDeskIdx !== undefined && (\r\n {\r\n const amendedDesks = cloneDeep(desks);\r\n amendedDesks[editingDeskIdx] = desk;\r\n this.setState({\r\n ...this.state,\r\n drawing: {...drawing, desks: amendedDesks}\r\n });\r\n }}\r\n onDismiss={() => {\r\n super.setState({\r\n ...this.state,\r\n selectedDeskIdx: undefined,\r\n editingDeskIdx: undefined,\r\n });\r\n }}\r\n snapping={snapToGrid}\r\n value={desks[editingDeskIdx]}\r\n />\r\n )}\r\n { editingTextIdx !== undefined && (\r\n {\r\n const textBoxes = cloneDeep(text);\r\n textBoxes[editingTextIdx] = newValue;\r\n super.setState({\r\n ...this.state,\r\n drawing: {...drawing, text: textBoxes}\r\n });\r\n }} onDismiss={() => {\r\n const newState = {...this.state};\r\n newState.selectedTextIdx = undefined;\r\n newState.editingTextIdx = undefined;\r\n super.setState(newState);\r\n }} value={text[editingTextIdx]} />\r\n )}\r\n { !showBookingsPanel && deletingDeskId !== undefined && (\r\n {\r\n this.setState({...this.state, showBookingsPanel: true});\r\n }}\r\n onDismiss={(canDelete) => {\r\n if (canDelete) {\r\n const drawingState = cloneDeep(this.state.drawing);\r\n drawingState.desks = [...this.state.drawing.desks].filter((d, idx) => d.id !== deletingDeskId);\r\n this.setState({...this.state, deletingDeskId: undefined, drawing: drawingState});\r\n } else {\r\n this.setState({...this.state, deletingDeskId: undefined});\r\n }\r\n }}\r\n />\r\n )}\r\n { showBookingsPanel && (\r\n {\r\n this.setState({...this.state, showBookingsPanel: false, deletingDeskId: deskId});\r\n }}\r\n />\r\n )}\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n private async _loadLayout() {\r\n const { floorplanId } = this.props;\r\n const loggedIn = await isAuthenticated();\r\n if (!loggedIn) this.props.history.push('/');\r\n const response = await loadLatestFloorplanEdit(floorplanId);\r\n if (response.ok) {\r\n const layoutResponse = await response.json() as IFloorplanLayout;\r\n const drawing = JSON.parse(layoutResponse.Json) as IRoomEditorDrawingState;\r\n if (drawing) {\r\n super.setState({\r\n ...this.state,\r\n drawing: {\r\n ...drawing,\r\n floorplanShapes: drawing.floorplanShapes || [],\r\n tempShape: []\r\n }\r\n }, this._checkLocalDrafts);\r\n } else {\r\n this._checkLocalDrafts();\r\n }\r\n this._autoSaveTimer = window.setInterval(this._autoSave, 60000);\r\n } else {\r\n alert('Unable to load layout');\r\n }\r\n }\r\n\r\n private async _publish() {\r\n const { floorplanId, layoutId, history } = this.props;\r\n const { drawing } = this.state;\r\n super.setState({\r\n ...this.state,\r\n saving: true,\r\n }, async () => {\r\n const saveResponse = await updateFloorplanLayout(floorplanId, layoutId, drawing);\r\n if (saveResponse.ok) {\r\n const response = await publishFloorplanLayout(floorplanId, layoutId, this.state.drawing);\r\n if (response.ok) {\r\n localStorage.clear();\r\n history.push('/');\r\n } else {\r\n alert('Unable to publish. Check the console for more details');\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _autoSave(manualSave?: boolean) {\r\n const { floorplanId, layoutId } = this.props;\r\n const { drawing, lastSave } = this.state;\r\n if (drawing && drawing.lastUpdate) {\r\n const lastUpdateDt = new Date(drawing.lastUpdate);\r\n if (manualSave || (!lastSave || lastUpdateDt > lastSave)) {\r\n super.setState({\r\n ...this.state,\r\n saving: true,\r\n }, async () => {\r\n const response = await updateFloorplanLayout(floorplanId, layoutId, drawing);\r\n if (response.ok) {\r\n super.setState({\r\n ...this.state,\r\n saving: false,\r\n lastSave: new Date()\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n private _checkLocalDrafts() {\r\n const { drawing: loadedDrawing } = this.state;\r\n const { floorplanId, layoutId } = this.props;\r\n const draft = localStorage.getItem(`draft_${floorplanId}_${layoutId}`);\r\n if (draft) {\r\n let drawing: IRoomEditorDrawingState | undefined = undefined;\r\n try {\r\n drawing = JSON.parse(draft) as IRoomEditorDrawingState;\r\n } catch (e) {}\r\n if (drawing) {\r\n const lastUpdate = drawing.lastUpdate;\r\n if (lastUpdate) {\r\n const draftUpdate = new Date(lastUpdate);\r\n let savedUpdate;\r\n if (loadedDrawing && loadedDrawing.lastUpdate) savedUpdate = new Date(loadedDrawing.lastUpdate);\r\n if (!savedUpdate || draftUpdate > savedUpdate) {\r\n let hasContent = false;\r\n for (let key in drawing) {\r\n if ((drawing as any)[key] && ((drawing as any)[key] as any[]).length) {\r\n hasContent = true;\r\n }\r\n }\r\n if (hasContent && window.confirm('A draft was found locally that is newer than what is saved to the server. Restore?')) {\r\n super.setState({\r\n ...this.state,\r\n drawing\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _svgHandleDoubleClick(e: React.MouseEvent) {\r\n if (this.svg) {\r\n const { x, y } = this._getSvgMousePosition(e, this.svg);\r\n if (x !== undefined && y !== undefined) {\r\n const { clickedDeskIdx } = this._checkSelection(x, y, e.clientX, e.clientY);\r\n if (clickedDeskIdx !== undefined) {\r\n super.setState({\r\n ...this.state,\r\n editingDeskIdx: clickedDeskIdx\r\n });\r\n return;\r\n } \r\n }\r\n const element = document.elementFromPoint(e.clientX, e.clientY);\r\n if (element && (element.nodeName === \"text\" || element.nodeName === \"tspan\")) {\r\n let parentElement: Node | null = element as SVGElement;\r\n while (parentElement !== null && parentElement.nodeName !== \"svg\") {\r\n parentElement = parentElement.parentNode;\r\n }\r\n if (parentElement) {\r\n const idxStr = (parentElement as SVGSVGElement).getAttribute(\"data-idx\");\r\n if (idxStr) {\r\n const idx = parseInt(idxStr, 10);\r\n super.setState({\r\n ...this.state,\r\n selectedTextIdx: idx,\r\n editingTextIdx: idx,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _svgHandleMouseDown(e: React.MouseEvent) {\r\n const { selectedDeskIdx, selectedDoorIdx, selectedTextIdx, selectedTool, selectedFloorIdx, selectedRoomIdx, selectedShapeIdx, snapToGrid } = this.state;\r\n const element = document.elementFromPoint(e.clientX, e.clientY);\r\n if (this.svg && element) {\r\n if (/RotationHandle/i.test(element.id)) {\r\n let type = element.id.replace(\"RotationHandle\", \"\");\r\n type = type.charAt(0).toUpperCase() + type.slice(1);\r\n const selectedObjIdx = (this.state as any)[`selected${type}Idx`];\r\n this._startRotation(e, type as StampObj, selectedObjIdx);\r\n return;\r\n }\r\n }\r\n if (this.svg) {\r\n const { x, y } = this._getSvgMousePosition(e, this.svg);\r\n if (x !== undefined && y !== undefined) {\r\n if (selectedTool === \"Pointer\") {\r\n const { clickedDeskIdx, clickedDoorIdx, clickedTextIdx, clickedFloorIdx, clickedRoomIdx, clickedShapeIdx } = this._checkSelection(x, y, e.clientX, e.clientY);\r\n if (clickedDeskIdx !== undefined) {\r\n this._startMoveOrSelect(\"MoveDesk\", selectedDeskIdx, clickedDeskIdx, x, y);\r\n } else if (clickedDoorIdx !== undefined) {\r\n this._startMoveOrSelect(\"MoveDoor\", selectedDoorIdx, clickedDoorIdx, x, y);\r\n } else if (clickedTextIdx !== undefined) {\r\n this._startMoveOrSelect(\"MoveText\", selectedTextIdx, clickedTextIdx, x, y);\r\n } else if (clickedRoomIdx !== undefined) {\r\n this._startMoveOrSelect(\"MoveRoom\", selectedRoomIdx, clickedRoomIdx, x, y);\r\n } else if (clickedFloorIdx !== undefined) {\r\n this._startMoveOrSelect(\"MoveFloor\", selectedFloorIdx, clickedFloorIdx, x, y);\r\n } else if (clickedShapeIdx !== undefined) {\r\n this._startMoveOrSelect(\"MoveShape\", selectedShapeIdx, clickedShapeIdx, x, y);\r\n } else {\r\n this._startGrabCanvas(e);\r\n }\r\n }\r\n if (selectedTool === \"Select\") {\r\n this._startMultiSelection(e);\r\n }\r\n if (selectedTool === \"Floor\" || selectedTool === \"Room\" || selectedTool === \"Pen\") {\r\n // prevent starting a room / office drawing directly over a desk\r\n const { clickedDeskIdx } = this._checkSelection(x, y, e.clientX, e.clientY);\r\n if (clickedDeskIdx === undefined) {\r\n this._doRoomDrawing(e, x, y, snapToGrid);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _svgHandleMouseMove(e: React.MouseEvent) {\r\n const { availability, defaultDeskRotation, drawing, selectedTool, snapToGrid } = this.state;\r\n const { desks, doors } = drawing;\r\n if (this.svg) {\r\n \r\n // update mouse coords\r\n this._liveX = e.clientX;\r\n this._liveY = e.clientY;\r\n let { x, y } = this._getSvgMousePosition(e, this.svg);\r\n \r\n if (x !== undefined && y !== undefined) {\r\n \r\n // desk coordinates are offset\r\n let deskX = x - 10;\r\n let deskY = y - 10;\r\n\r\n if (snapToGrid) {\r\n if (x % 10 !== 0) x = Math.round(x / 10) * 10;\r\n if (y % 10 !== 0) y = Math.round(y / 10) * 10;\r\n if (deskX % 10 !== 0) deskX = Math.round(deskX / 10) * 10;\r\n if (deskY % 10 !== 0) deskY = Math.round(deskY / 10) * 10;\r\n }\r\n\r\n // update coordinates in view (for debug purposes)\r\n const coordsContainer = document.querySelector(\"#coords\");\r\n if (coordsContainer) {\r\n coordsContainer.innerHTML = `(${deskX}, ${deskY})`;\r\n }\r\n\r\n // if an operation has been set by mousedown, act on it during mousemove\r\n if (this._penInUse) {\r\n this._previewNextPenNode(e, x, y, snapToGrid, this._mouseDownOperation);\r\n } else {\r\n if (this._mouseDownOperation) {\r\n const { initialCoords, itemIdx, type } = this._mouseDownOperation;\r\n if (this._mouseDownOperation.type === \"Scroll\") {\r\n this._performCanvasScroll(e, initialCoords);\r\n }\r\n if (this._mouseDownOperation.type === \"MultiSelect\") {\r\n this._previewMultiSelection(e);\r\n }\r\n if (this._mouseDownOperation.type === \"DrawFloorplan\" ||\r\n this._mouseDownOperation.type === \"DrawRoom\") {\r\n this._drawRoomLayoutPreviewBox(type, initialCoords, x, y, snapToGrid);\r\n }\r\n if (this._mouseDownOperation.type === \"RotateDesk\") {\r\n this._performDeskRotation(desks, itemIdx, x, y, snapToGrid);\r\n }\r\n if (this._mouseDownOperation.type === \"RotateDoor\") {\r\n this._performDoorRotation(doors, itemIdx, x, y, snapToGrid);\r\n }\r\n if (this._mouseDownOperation.type === \"RotateFloor\") {\r\n this._performFloorRotation(itemIdx, x, y, snapToGrid);\r\n }\r\n if (this._mouseDownOperation.type === \"RotateRoom\") {\r\n this._performRoomRotation(itemIdx, x, y, snapToGrid);\r\n }\r\n if (this._mouseDownOperation.type === \"RotateShape\") {\r\n this._performShapeRotation(itemIdx, x, y, snapToGrid);\r\n }\r\n if (this._mouseDownOperation.type === \"MoveDesk\") {\r\n this._moveDraggable(\"Desk\", itemIdx, deskX, deskY);\r\n }\r\n if (this._mouseDownOperation.type === \"MoveDoor\") {\r\n this._moveDraggable(\"Door\", itemIdx, deskX, deskY);\r\n }\r\n if (this._mouseDownOperation.type === \"MoveText\") {\r\n this._moveDraggable(\"Text\", itemIdx, deskX + 10, deskY + 10);\r\n }\r\n if (this._mouseDownOperation.type === \"MoveFloor\") {\r\n this._moveDraggable(\"Floor\", itemIdx, x, y, initialCoords);\r\n }\r\n if (this._mouseDownOperation.type === \"MoveRoom\") {\r\n this._moveDraggable(\"Room\", itemIdx, x, y, initialCoords);\r\n }\r\n if (this._mouseDownOperation.type === \"MoveShape\") {\r\n this._moveDraggable(\"Shape\", itemIdx, x, y, initialCoords);\r\n }\r\n } else {\r\n // Otherwise, hover behaviour needs to be scripted for the desk tool, as we simulate rotation etc.\r\n const collision = this._checkDeskCollision(deskX, deskY);\r\n if (selectedTool === \"Desk\" || selectedTool === \"Door\") {\r\n this._handleStampableToolHover(deskX, deskY, defaultDeskRotation, collision, availability);\r\n }\r\n }\r\n }\r\n \r\n }\r\n }\r\n }\r\n\r\n /** SVG Mouse Up Handler. Based on previously set MouseDown operations and movements, evaluates which data should be changed in state\r\n * based on user actions. State changes trigger a re-render of the SVG canvas.\r\n */\r\n private _svgHandleMouseUp(e: React.MouseEvent) {\r\n const { availability, defaultDeskRotation, drawing, selectedTool, snapToGrid } = cloneDeep(this.state);\r\n const { desks, doors, text } = drawing;\r\n if (this.svg) {\r\n let { x: mouseX, y: mouseY } = this._getSvgMousePosition(e, this.svg);\r\n if (this._mouseDownOperation) {\r\n const { itemIdx, type } = this._mouseDownOperation;\r\n if ([\"MoveDesk\", \"MoveDoor\", \"MoveText\", \"MoveFloor\", \"MoveRoom\", \"MoveShape\"].indexOf(type) >= 0) {\r\n this._commitMovedObject(type, itemIdx);\r\n }\r\n if (/Rotate/i.test(type)) {\r\n const rotationType = type.replace(\"Rotate\", \"\");\r\n if (mouseX !== undefined && mouseY !== undefined) {\r\n this._commitRotation(rotationType as StampObj, itemIdx, mouseX, mouseY, snapToGrid);\r\n }\r\n }\r\n // if (type === \"RotateDesk\") {\r\n // if (mouseX !== undefined && mouseY !== undefined) {\r\n // this._commitDeskRotation(desks, itemIdx, mouseX, mouseY, snapToGrid);\r\n // }\r\n // }\r\n // if (type === \"RotateDoor\") {\r\n // if (mouseX !== undefined && mouseY !== undefined) {\r\n // this._commitDoorRotation(doors, itemIdx, mouseX, mouseY, snapToGrid);\r\n // }\r\n // }\r\n if (type === \"Scroll\") {\r\n this._releaseGrabbedCanvas(this.svg);\r\n }\r\n if (type === \"DrawWithPen\") {\r\n this._commitPenNode(e, mouseX, mouseY, snapToGrid);\r\n }\r\n if (type === \"MultiSelect\") {\r\n this._commitMultiSelection(mouseX!, mouseY!);\r\n this.svg.classList.remove(\"selecting\");\r\n }\r\n } else {\r\n let drawingStateChanged: boolean = false;\r\n if (mouseX !== undefined && mouseY !== undefined) {\r\n if (selectedTool === \"Desk\") {\r\n this._addNewStampable(mouseX, mouseY, snapToGrid, desks, defaultDeskRotation, -10, { bookable: !availability });\r\n drawingStateChanged = true;\r\n }\r\n if (selectedTool === \"Door\") {\r\n this._addNewStampable(mouseX, mouseY, snapToGrid, doors, defaultDeskRotation, -10);\r\n drawingStateChanged = true;\r\n }\r\n if (selectedTool === \"Text\") {\r\n this._addNewStampable(mouseX, mouseY, snapToGrid, text, defaultDeskRotation, 0, { text: undefined, fontSize: TBFontSize.large });\r\n drawingStateChanged = true;\r\n }\r\n }\r\n // deselect items if the user has clicked the grid or background\r\n const element = document.elementFromPoint(e.clientX, e.clientY);\r\n const newState = {\r\n ...this.state,\r\n drawing,\r\n };\r\n if (element && (element.id === \"gridlines\" || element.id === \"bgColor\")) {\r\n newState.selectedDeskIdx = undefined;\r\n newState.selectedDoorIdx = undefined;\r\n newState.selectedTextIdx = undefined;\r\n newState.selectedFloorIdx = undefined;\r\n newState.selectedRoomIdx = undefined;\r\n newState.selectedShapeIdx = undefined;\r\n newState.editingDeskIdx = undefined;\r\n newState.editingTextIdx = undefined;\r\n }\r\n if (drawingStateChanged) {\r\n if (selectedTool === \"Text\") {\r\n newState.selectedTextIdx = text.length - 1;\r\n newState.editingTextIdx = text.length - 1;\r\n }\r\n this.setState(newState);\r\n } else {\r\n super.setState(newState);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** SVG Canvas Mouse Out handler. Ensures cursors and other mouse-over previews are cleared when the cursor leaves the canvas. */\r\n private _svgHandleMouseOut(e: React.MouseEvent) {\r\n // hide svg-stamp / cursor\r\n if (this.svg) { \r\n let cursor = this.svg.querySelector('#cursor');\r\n if (cursor) {\r\n cursor.remove();\r\n }\r\n }\r\n }\r\n\r\n private _svgHandleWheel(e: React.WheelEvent) {\r\n if (this.svg) {\r\n const scrollTop = this.svg.scrollTop;\r\n const scrollLeft = this.svg.scrollLeft;\r\n this.svg.scrollTo({ top: scrollTop + e.deltaY, left: scrollLeft + e.deltaX });\r\n }\r\n }\r\n\r\n /** Provides real-time preview for the pen tool, before a new node is committed */\r\n private _previewNextPenNode(e: React.MouseEvent, mouseX: number, mouseY: number, snapToGrid: boolean, _mouseDownOperation: IMouseDownOperation | null) {\r\n const { drawing } = this.state;\r\n let { tempShape } = drawing;\r\n\r\n if (snapToGrid) {\r\n if (mouseX % 10 !== 0) mouseX = Math.round(mouseX / 10) * 10;\r\n if (mouseY % 10 !== 0) mouseY = (Math.round(mouseY / 10) * 10) + 2.5;\r\n }\r\n\r\n /* If tempShape.length > 1, we have a shape in progress and need to remove any prior preview nodes */\r\n tempShape = tempShape.filter(s => !s.preview);\r\n\r\n /* If we have a mouseDownOperation, the pen is \"down\" and possibly dragging */\r\n let initX: number | undefined;\r\n let initY: number | undefined;\r\n if (this._mouseDownOperation) {\r\n [initX, initY] = this._mouseDownOperation.initialCoords;\r\n }\r\n const isDrag = \r\n /* Drag / curve not allowed for first point */\r\n tempShape.length > 1 &&\r\n /* Drag / curve allowed if mouse moved more than 5 pixels */\r\n this._mouseDownOperation && \r\n (Math.abs(mouseX - initX!) > 5 || Math.abs(mouseY - initY!) > 5);\r\n\r\n /* Add the preview node to the tempShape array */\r\n if (tempShape && tempShape.length) {\r\n /* Depending on whether the user dragged or simply clicked a point, we need to add a new point or a new curve */\r\n const lastShapeEl = tempShape[tempShape.length - 1];\r\n const { type: lastShapeElType } = lastShapeEl;\r\n switch (lastShapeElType) {\r\n case \"Move\":\r\n case \"Line\": \r\n case \"ReflectedCurve\": {\r\n if (isDrag) {\r\n const controlX = initX! + ((mouseX - initX!) * -1);\r\n const controlY = initY! + ((mouseY - initY!) * -1);\r\n tempShape.push({\r\n type: \"Curve\",\r\n x: initX!, y: initY!,\r\n x1: controlX, y1: controlY,\r\n preview: true\r\n });\r\n } else {\r\n tempShape.push({\r\n type: \"Line\",\r\n x: mouseX, y: mouseY,\r\n preview: true\r\n });\r\n }\r\n break;\r\n }\r\n case \"Curve\": {\r\n if (isDrag) {\r\n const controlX = initX! + ((mouseX - initX!) * -1);\r\n const controlY = initY! + ((mouseY - initY!) * -1);\r\n tempShape.push({\r\n type: \"Curve\",\r\n x: initX!, y: initY!,\r\n x1: controlX, y1: controlY,\r\n preview: true\r\n });\r\n } else {\r\n tempShape.push({\r\n type: \"ReflectedCurve\",\r\n x: mouseX, y: mouseY,\r\n preview: true\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n super.setState({\r\n ...this.state,\r\n drawing: {\r\n ...this.state.drawing,\r\n tempShape\r\n }\r\n }); \r\n }\r\n }\r\n\r\n /** Commits a pen node to the temporary / WIP shape. The shape is closed and added to the drawing when the last node meets the first. */\r\n private _commitPenNode(e: React.MouseEvent, mouseX: number | undefined, mouseY: number | undefined, snapToGrid: boolean) {\r\n const { drawing } = this.state;\r\n let { tempShape, floorplanShapes } = drawing;\r\n if (this._mouseDownOperation) {\r\n const [initX,initY] = this._mouseDownOperation.initialCoords;\r\n if (mouseX !== undefined && mouseY !== undefined) {\r\n if (snapToGrid) {\r\n if (mouseX % 10 !== 0) mouseX = Math.round(mouseX / 10) * 10;\r\n if (mouseY % 10 !== 0) mouseY = (Math.round(mouseY / 10) * 10) + 2.5;\r\n }\r\n const isDrag = \r\n /* Drag / curve not allowed for first point */\r\n tempShape.length > 2 &&\r\n /* Drag / curve allowed if mouse moved more than 5 pixels */\r\n (Math.abs(mouseX - initX) > 5 || Math.abs(mouseY - initY) > 5);\r\n\r\n if (tempShape && tempShape.length) {\r\n /* If tempShape.length > 1, we have a shape in progress */\r\n tempShape = tempShape.filter(s => !s.preview);\r\n\r\n const { x: shapeStartX, y: shapeStartY } = tempShape[0] as ISvgStart;\r\n const isClosing = tempShape.length > 2 && Math.abs(mouseX - shapeStartX) < 5 && Math.abs(mouseY - shapeStartY) < 5;\r\n\r\n const lastShapeEl = tempShape[tempShape.length - 1];\r\n const { type: lastShapeElType } = lastShapeEl;\r\n\r\n /* Depending on whether the user dragged or simply clicked a point, we need to add a new point or a new curve */\r\n switch (lastShapeElType) {\r\n case \"Move\":\r\n case \"Line\": \r\n case \"ReflectedCurve\": {\r\n if (isDrag) {\r\n const controlX = initX + ((mouseX - initX) * -1);\r\n const controlY = initY + ((mouseY - initY) * -1);\r\n tempShape.push({\r\n type: \"Curve\",\r\n x: initX, y: initY,\r\n x1: controlX, y1: controlY\r\n });\r\n } else {\r\n tempShape.push({\r\n type: \"Line\",\r\n x: mouseX, y: mouseY\r\n });\r\n }\r\n break;\r\n }\r\n case \"Curve\": {\r\n if (isDrag) {\r\n const controlX = initX + ((mouseX - initX) * -1);\r\n const controlY = initY + ((mouseY - initY) * -1);\r\n tempShape.push({\r\n type: \"Curve\",\r\n x: initX, y: initY,\r\n x1: controlX, y1: controlY\r\n });\r\n } else {\r\n tempShape.push({\r\n type: \"ReflectedCurve\",\r\n x: mouseX, y: mouseY\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n const setState = isClosing ? this.setState.bind(this) : super.setState.bind(this);\r\n if (isClosing) {\r\n const newShape = [...tempShape];\r\n const svgShape = this._calculateShapeObject(newShape);\r\n floorplanShapes = [...floorplanShapes, svgShape];\r\n this._penInUse = false;\r\n }\r\n setState({\r\n ...this.state,\r\n drawing: {\r\n ...this.state.drawing,\r\n floorplanShapes,\r\n tempShape: isClosing ? [] : tempShape\r\n }\r\n }, () => {\r\n this._mouseDownOperation = null;\r\n });\r\n\r\n }\r\n }\r\n }\r\n }\r\n \r\n /** Calculates the bounding box of a complex SVG shape */\r\n private _calculateShapeObject(newShape: SvgShapeComponent[]): ISvgShape {\r\n const fallback = Number.MAX_SAFE_INTEGER;\r\n let [ minX, minY, maxX, maxY ] = newShape.reduce((prev, cur, idx, arr) => {\r\n let minx = (cur as any).x || fallback;\r\n let miny = (cur as any).y || fallback;\r\n let maxx = (cur as any).x || 0;\r\n let maxy = (cur as any).y || 0;\r\n if (cur.type === \"Curve\") {\r\n const curve = cur as ISvgCurve;\r\n const [ xVals, yVals ] = this._calculateCurvePoints(curve, arr[idx - 1]);\r\n const curveMin = [ Math.min(...xVals), Math.min(...yVals) ];\r\n const curveMax = [ Math.max(...xVals), Math.max(...yVals) ];\r\n if (curveMin[0] < minx) minx = curveMin[0];\r\n if (curveMin[1] < miny) miny = curveMin[1];\r\n if (curveMax[0] > maxx) maxx = curveMax[0];\r\n if (curveMax[1] > maxy) maxy = curveMax[1];\r\n }\r\n return [ Math.min(prev[0], minx), Math.min(prev[1], miny), Math.max(prev[2], maxx), Math.max(prev[3], maxy) ];\r\n }, [fallback, fallback, 0, 0]);\r\n newShape.forEach((el) => {\r\n if ((el as any).x) (el as any).x -= minX;\r\n if ((el as any).x1) (el as any).x1 -= minX;\r\n if ((el as any).y) (el as any).y -= minY;\r\n if ((el as any).y1) (el as any).y1 -= minY;\r\n });\r\n return {\r\n path: newShape,\r\n rotation: 0,\r\n x: minX,\r\n y: minY,\r\n width: maxX - minX,\r\n height: maxY - minY,\r\n id: this.state.drawing.floorplanShapes.length,\r\n };\r\n }\r\n\r\n /** Calculates the points on a curve (used by _calculateShapeObject) */\r\n private _calculateCurvePoints(curve: ISvgCurve, arg1: SvgShapeComponent): [any, any] {\r\n // Given points: start, control, and end\r\n const x0 = (arg1 as any).x, y0 = (arg1 as any).y; // Start point\r\n const x1 = curve.x1, y1 = curve.y1; // Control point\r\n const x2 = curve.x, y2 = curve.y; // End point\r\n\r\n // Compute tx and ty\r\n const denom_x = (x0 - 2 * x1 + x2);\r\n const denom_y = (y0 - 2 * y1 + y2);\r\n const tx = denom_x !== 0 ? (x0 - x1) / denom_x : null;\r\n const ty = denom_y !== 0 ? (y0 - y1) / denom_y : null;\r\n\r\n // Parametric functions for x and y\r\n function bezier_x(t: number): number {\r\n return (1 - t) ** 2 * x0 + 2 * (1 - t) * t * x1 + t ** 2 * x2;\r\n }\r\n\r\n function bezier_y(t: number): number {\r\n return (1 - t) ** 2 * y0 + 2 * (1 - t) * t * y1 + t ** 2 * y2;\r\n }\r\n\r\n // Evaluate critical points and endpoints\r\n const x_values: number[] = [bezier_x(0), bezier_x(1)];\r\n const y_values: number[] = [bezier_y(0), bezier_y(1)];\r\n\r\n if (tx !== null && tx >= 0 && tx <= 1) {\r\n x_values.push(bezier_x(tx));\r\n }\r\n if (ty !== null && ty >= 0 && ty <= 1) {\r\n y_values.push(bezier_y(ty));\r\n }\r\n\r\n return [x_values, y_values];\r\n }\r\n\r\n /** Pointer Tool Operation: Begins a scrolling operation triggered by the user clicking a blank area of the SVG canvas, while using the pointer tool */\r\n private _startGrabCanvas(e: React.MouseEvent) {\r\n const drawing = document.querySelector('#drawing');\r\n if (this.svg && drawing && drawing.firstChild) {\r\n this.svg.classList.add(\"grabbed\");\r\n const el = drawing.firstChild as HTMLElement;\r\n this._mouseDownOperation = {\r\n initialCoords: [e.clientX, e.clientY, el.scrollLeft, el.scrollTop],\r\n itemIdx: -1,\r\n type: \"Scroll\"\r\n };\r\n }\r\n }\r\n\r\n private _startMultiSelection(e: React.MouseEvent) {\r\n const drawing = document.querySelector('#drawing');\r\n if (this.svg && drawing && drawing.firstChild) {\r\n this.svg.classList.add(\"selecting\");\r\n const { x, y } = this._getSvgMousePosition(e, this.svg);\r\n if (x !== undefined && y !== undefined) {\r\n this._mouseDownOperation = {\r\n initialCoords: [ x, y ],\r\n itemIdx: -1,\r\n type: \"MultiSelect\"\r\n };\r\n }\r\n }\r\n }\r\n\r\n /** Releases the grabbed canvas by clearing the current mouse down operation. Also clears any selected desks. */\r\n private _releaseGrabbedCanvas(svg: SVGSVGElement) {\r\n svg.classList.remove(\"grabbed\");\r\n this._mouseDownOperation = null;\r\n super.setState({\r\n ...this.state,\r\n selectedDeskIdx: undefined,\r\n selectedDoorIdx: undefined,\r\n selectedFloorIdx: undefined,\r\n selectedRoomIdx: undefined,\r\n selectedShapeIdx: undefined,\r\n selectedTextIdx: undefined,\r\n editingDeskIdx: undefined,\r\n editingTextIdx: undefined,\r\n });\r\n }\r\n\r\n /** Pointer Tool Operation: selects a movable object, or begins a move operation */\r\n private _startMoveOrSelect(type: MouseDownOperationType, selectedIdx: number | undefined, clickedIdx: number | undefined, x: number, y: number) {\r\n if (selectedIdx !== undefined && selectedIdx === clickedIdx) {\r\n this._mouseDownOperation = {\r\n initialCoords: [x, y],\r\n itemIdx: selectedIdx,\r\n type\r\n };\r\n }\r\n if (selectedIdx !== clickedIdx) {\r\n const newState = {\r\n ...this.state,\r\n selectedDeskIdx: undefined,\r\n selectedDoorIdx: undefined,\r\n selectedTextIdx: undefined,\r\n selectedRoomIdx: undefined,\r\n selectedFloorIdx: undefined,\r\n selectedShapeIdx: undefined,\r\n editingTextIdx: undefined,\r\n };\r\n (newState as any)[`selected${type.replace(\"Move\",\"\")}Idx`] = clickedIdx;\r\n super.setState(newState);\r\n }\r\n }\r\n\r\n private _startRotation(e: React.MouseEvent, type: StampObj, selectedObjIdx: number | undefined) {\r\n const { x, y } = this._getSvgMousePosition(e, this.svg);\r\n if (selectedObjIdx !== undefined && x !== undefined && y !== undefined) {\r\n this._mouseDownOperation = {\r\n initialCoords: [x, y],\r\n itemIdx: selectedObjIdx,\r\n type: (\"Rotate\" + type) as MouseDownOperationType\r\n };\r\n }\r\n }\r\n\r\n /** Room Drawing: handles draw operations with the Room, Floor and Pen tools */\r\n private _doRoomDrawing(e: React.MouseEvent, x: number, y: number, snapToGrid: boolean) {\r\n const { roomRectangles, floorplanRectangles } = this.state.drawing;\r\n if (snapToGrid) {\r\n if (x % 10 !== 0) x = Math.round(x / 10) * 10;\r\n if (y % 10 !== 0) y = (Math.round(y / 10) * 10) + 2.5;\r\n }\r\n if (!this._mouseDownOperation) {\r\n let opType: MouseDownOperationType = \"DrawRoom\";\r\n if (this.state.selectedTool === \"Floor\") opType = \"DrawFloorplan\";\r\n if (this.state.selectedTool === \"Pen\") {\r\n opType = \"DrawWithPen\";\r\n if (!this._penInUse) {\r\n this._penInUse = true;\r\n this.setState({\r\n ...this.state,\r\n drawing: {\r\n ...this.state.drawing,\r\n tempShape: [{\r\n type: \"Move\",\r\n x, y\r\n }]\r\n }\r\n });\r\n }\r\n }\r\n this._mouseDownOperation = {\r\n initialCoords: [x, y],\r\n itemIdx: -1,\r\n type: opType\r\n };\r\n return;\r\n }\r\n /* With Floor and Room operations, the first click commences a room drawing operation, the second commits the drawn room or shape to state */\r\n if (this._mouseDownOperation &&\r\n (\r\n this._mouseDownOperation.type === \"DrawFloorplan\" ||\r\n this._mouseDownOperation.type === \"DrawRoom\"\r\n )\r\n ) {\r\n /* Take the lower and higher values from initial coordinates and the current mouse position, these are our bounding box coords for a room\r\n container or floorspace */\r\n let x1 = Math.min(x, this._mouseDownOperation.initialCoords[0]);\r\n let x2 = Math.max(x, this._mouseDownOperation.initialCoords[0]);\r\n let y1 = Math.min(y, this._mouseDownOperation.initialCoords[1]);\r\n let y2 = Math.max(y, this._mouseDownOperation.initialCoords[1]);\r\n /* Adjust for snap to grid */\r\n if (snapToGrid) {\r\n if (x1 % 10 !== 0) x1 = Math.round(x1 / 10) * 10;\r\n if (x2 % 10 !== 0) x2 = Math.round(x2 / 10) * 10;\r\n if (y1 % 10 !== 0) y1 = Math.round(y1 / 10) * 10 + 2.5;\r\n if (y2 % 10 !== 0) y2 = Math.round(y2 / 10) * 10 + 2.5;\r\n }\r\n /* Define rectangle object */\r\n const rect: IRoomRectangle = {\r\n x: x1, y: y1,\r\n width: (x2 - x1), height: (y2 - y1),\r\n rotation: 0\r\n };\r\n /* Commit to state */\r\n let newState = cloneDeep(this.state);\r\n let rooms: IRoomRectangle[];\r\n if (this._mouseDownOperation.type === \"DrawFloorplan\") {\r\n rooms = [...floorplanRectangles];\r\n rooms.push(rect);\r\n newState.drawing.floorplanRectangles = rooms;\r\n } else {\r\n rooms = [...roomRectangles];\r\n rooms.push(rect);\r\n newState.drawing.roomRectangles = rooms;\r\n }\r\n this.setState(newState, () => {\r\n this._mouseDownOperation = null;\r\n if (this.svg) {\r\n const room = this.svg.querySelector('#roomDrawing');\r\n if (room) room.remove();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Injects a desk-preview in to the SVG canvas, giving the user a stamp-like cursor that reflects the set desk rotation etc. */\r\n private _handleStampableToolHover(deskX: number, deskY: number, defaultDeskRotation: number, collision: boolean, availability: boolean) {\r\n if (this.svg) {\r\n let cursorContainer = this.svg.querySelector('#cursor');\r\n \r\n if (!cursorContainer) {\r\n cursorContainer = document.createElementNS(xmlns, 'g');\r\n cursorContainer.id = \"cursor\";\r\n cursorContainer.setAttribute(\"transform\", `translate(${deskX}, ${deskY})`);\r\n let cursor: SVGGElement | undefined = undefined;\r\n if (this.state.selectedTool === \"Desk\") {\r\n cursor = createDeskSvg();\r\n } else if (this.state.selectedTool === \"Door\") {\r\n cursor = createDoorSvg();\r\n }\r\n if (cursor) {\r\n cursor.setAttribute(\"style\", \"pointer-events: none; transform-origin: 10px 12px;\");\r\n cursorContainer.appendChild(cursor);\r\n }\r\n this.svg.appendChild(cursorContainer);\r\n } else {\r\n cursorContainer.setAttribute(\"transform\", `translate(${deskX}, ${deskY})`);\r\n const cursor = cursorContainer.firstChild as SVGGElement;\r\n if (cursor) {\r\n if (cursor.getAttribute(\"transform\") !== `rotate(${defaultDeskRotation})`) {\r\n cursor.setAttribute(\"transform\", `rotate(${defaultDeskRotation})`);\r\n }\r\n if (this.state.selectedTool === \"Desk\") {\r\n const deskRect = cursor.querySelector('rect');\r\n if (deskRect) {\r\n deskRect.setAttribute(\"fill\", collision ? \"#e3bcbc\" : \"#cccccc\");\r\n }\r\n if (availability) {\r\n cursor.classList.add(\"nonAvailableDesk\");\r\n } else {\r\n cursor.classList.remove(\"nonAvailableDesk\");\r\n }\r\n } else if (this.state.selectedTool === \"Door\") {\r\n const doorPath = cursor.querySelector('path');\r\n if (doorPath) {\r\n doorPath.setAttribute(\"fill\", collision ? \"#e3bcbc\" : \"#fff\");\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Moves the draggable item for real-time preview, such as a desk or door. Item's final position is not updated until the mouse up event and _commitMovedObject. */\r\n private _moveDraggable(type: StampObj, objectIdx: number, x: number, y: number, initialClickCoords?: number[]) {\r\n const element = document.querySelector(`.draggable${type}-${objectIdx}`);\r\n const controlHandles = document.querySelector(`#${type.toLowerCase()}ControlHandles`);\r\n if (element) {\r\n if (initialClickCoords) {\r\n const arr = type === \"Floor\" ? \"floorplanRectangles\" : (type === \"Room\" ? \"roomRectangles\" : \"floorplanShapes\");\r\n const shape = (this.state.drawing as any)[arr][objectIdx];\r\n const curX = shape.x;\r\n const curY = shape.y;\r\n const movementX = x - initialClickCoords[0];\r\n const movementY = y - initialClickCoords[1];\r\n x = curX + movementX; //+ offsetX;\r\n y = curY + movementY; // + offsetY;\r\n }\r\n element.setAttribute(\"x\", x.toString());\r\n element.setAttribute(\"y\", y.toString());\r\n }\r\n if (controlHandles) {\r\n if (type === \"Desk\" || type === \"Door\") {\r\n controlHandles.setAttribute(\"x\", (x + 10).toString());\r\n controlHandles.setAttribute(\"y\", (y + 12.5).toString());\r\n } else if (type === \"Shape\" || type === \"Floor\" || type === \"Room\") {\r\n const arrName = type === \"Shape\" ? \"floorplanShapes\" : (type === \"Floor\" ? \"floorplanRectangles\" : \"roomRectangles\");\r\n const shape = (this.state.drawing as any)[arrName][objectIdx];\r\n controlHandles.setAttribute(\"x\", (shape.x+(shape.width! / 2)).toString());\r\n controlHandles.setAttribute(\"y\", (shape.y+(shape.height! / 2)).toString());\r\n }\r\n \r\n }\r\n }\r\n\r\n private _previewMultiSelection(e: React.MouseEvent) {\r\n const { x, y } = this._getSvgMousePosition(e, this.svg);\r\n if (x !== undefined && y !== undefined) {\r\n const { initialCoords } = this._mouseDownOperation!;\r\n const x1 = Math.min(x, initialCoords[0]);\r\n const x2 = Math.max(x, initialCoords[0]);\r\n const y1 = Math.min(y, initialCoords[1]);\r\n const y2 = Math.max(y, initialCoords[1]);\r\n if (this.svg) {\r\n const selectionEl = document.querySelector('#selectionRect');\r\n if (!selectionEl) {\r\n const selectionRect = document.createElementNS(xmlns, 'rect');\r\n selectionRect.setAttribute(\"id\", \"selectionRect\");\r\n selectionRect.setAttribute(\"x\", x1.toString());\r\n selectionRect.setAttribute(\"y\", y1.toString());\r\n selectionRect.setAttribute(\"width\", (x2 - x1).toString());\r\n selectionRect.setAttribute(\"height\", (y2 - y1).toString());\r\n selectionRect.setAttribute(\"fill\", \"rgba(0,0,0,0.1)\");\r\n selectionRect.setAttribute(\"stroke\", \"#000\");\r\n selectionRect.setAttribute(\"stroke-dasharray\", \"5,5\");\r\n this.svg.appendChild(selectionRect);\r\n } else {\r\n selectionEl.setAttribute(\"x\", x1.toString());\r\n selectionEl.setAttribute(\"y\", y1.toString());\r\n selectionEl.setAttribute(\"width\", (x2 - x1).toString());\r\n selectionEl.setAttribute(\"height\", (y2 - y1).toString());\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Rotates the selected desk (at index), based on mouse position */\r\n private _performDeskRotation(desks: IDesk[], itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean): number {\r\n const desk = desks[itemIdx];\r\n // Find the angle between the clicked mouse position and the desk's center\r\n mouseX = mouseX - (desk.x + 10);\r\n mouseY = mouseY - (desk.y + 10);\r\n const a = Math.atan2(mouseY, mouseX);\r\n let deg = Math.round(a * (180 / Math.PI));\r\n // Fix to 45 degree increments if snapToGrid is on\r\n if (snapToGrid) {\r\n if (deg % 45 !== 0)\r\n deg = Math.round(deg / 45) * 45;\r\n }\r\n // Amend desk SVG element for live-preview\r\n deg = Math.round(deg);\r\n const deskElement = document.querySelector('.draggableDesk-' + itemIdx);\r\n const controlHandles = document.querySelector('#deskControlHandles');\r\n if (deskElement && deskElement.firstChild) {\r\n (deskElement.firstChild as SVGGElement).setAttribute(\"transform\", `rotate(${deg})`);\r\n }\r\n if (controlHandles) {\r\n (controlHandles.firstChild as SVGGElement).setAttribute(\"transform\", `rotate(${deg})`);\r\n }\r\n return deg;\r\n }\r\n\r\n /** Rotates the selected door (at index), based on mouse position */\r\n private _performDoorRotation(doors: IStampable[], itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean) {\r\n const door = doors[itemIdx];\r\n // Find the angle between the clicked mouse position and the desk's center\r\n mouseX = mouseX - (door.x + 10);\r\n mouseY = mouseY - (door.y + 10);\r\n const a = Math.atan2(mouseY, mouseX);\r\n let deg = Math.round(a * (180 / Math.PI));\r\n // Fix to 45 degree increments if snapToGrid is on\r\n if (snapToGrid) {\r\n if (deg % 45 !== 0)\r\n deg = Math.round(deg / 45) * 45;\r\n }\r\n // Amend desk SVG element for live-preview\r\n deg = Math.round(deg);\r\n const doorElement = document.querySelector('.draggableDoor-' + itemIdx);\r\n const controlHandles = document.querySelector('#doorControlHandles');\r\n if (doorElement && doorElement.firstChild) {\r\n (doorElement.firstChild as SVGGElement).setAttribute(\"transform\", `rotate(${deg}, 10, 12)`);\r\n }\r\n if (controlHandles) {\r\n (controlHandles.firstChild as SVGGElement).setAttribute(\"transform\", `rotate(${deg})`);\r\n }\r\n return deg;\r\n }\r\n\r\n private _performFloorRotation(itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean): number {\r\n return this._performFloorOrRoomRectRotation(\"Floor\", this.state.drawing.floorplanRectangles, itemIdx, mouseX, mouseY, snapToGrid);\r\n }\r\n\r\n private _performRoomRotation(itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean): number {\r\n return this._performFloorOrRoomRectRotation(\"Room\", this.state.drawing.roomRectangles, itemIdx, mouseX, mouseY, snapToGrid);\r\n }\r\n\r\n private _performFloorOrRoomRectRotation(type: \"Room\" | \"Floor\", rects: IRoomRectangle[], itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean): number {\r\n const rect = rects[itemIdx];\r\n // Find the angle between the clicked mouse position and the floor object's center\r\n mouseX = mouseX - (rect.x + (rect.width! / 2));\r\n mouseY = mouseY - (rect.y + (rect.height! / 2));\r\n const a = Math.atan2(mouseY, mouseX);\r\n let deg = Math.round(a * (180 / Math.PI));\r\n // Fix to 45 degree increments if snapToGrid is on\r\n if (snapToGrid) {\r\n if (deg % 45 !== 0)\r\n deg = Math.round(deg / 45) * 45;\r\n }\r\n // Amend floor SVG element for live-preview\r\n deg = Math.round(deg);\r\n const floorElement = document.querySelector(`.draggable${type}-${itemIdx}`) as SVGRectElement;\r\n const controlHandles = document.querySelector(`#${type.toLowerCase()}ControlHandles`);\r\n if (floorElement && floorElement.firstChild) {\r\n const gEl = floorElement.firstChild as SVGGElement;\r\n // transform origin should be the center of the object\r\n const transformOriginX = rect.width! / 2;\r\n const transformOriginY = rect.height! / 2;\r\n gEl.setAttribute(\"transform\", `rotate(${deg}, ${transformOriginX}, ${transformOriginY})`);\r\n }\r\n if (controlHandles) {\r\n (controlHandles.firstChild as SVGGElement).setAttribute(\"transform\", `rotate(${deg})`);\r\n }\r\n return deg;\r\n }\r\n\r\n private _performShapeRotation(itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean): number {\r\n const shapes = this.state.drawing.floorplanShapes;\r\n const shape = shapes[itemIdx];\r\n // Find the angle between the clicked mouse position and the shape object's center\r\n mouseX = mouseX - (shape.x + (shape.width! / 2));\r\n mouseY = mouseY - (shape.y + (shape.height! / 2));\r\n const a = Math.atan2(mouseY, mouseX);\r\n let deg = Math.round(a * (180 / Math.PI));\r\n // Fix to 45 degree increments if snapToGrid is on\r\n if (snapToGrid) {\r\n if (deg % 45 !== 0)\r\n deg = Math.round(deg / 45) * 45;\r\n }\r\n // Amend shape SVG element for live-preview\r\n const shapeElement = document.querySelector(`.draggableShape-${itemIdx}`) as SVGSVGElement;\r\n const controlHandles = document.querySelector(`#shapeControlHandles`);\r\n if (shapeElement && shapeElement.firstChild) {\r\n const gEl = shapeElement.firstChild as SVGGElement;\r\n // transform origin should be the center of the object\r\n const transformOriginX = shape.width! / 2;\r\n const transformOriginY = shape.height! / 2;\r\n gEl.setAttribute(\"transform\", `rotate(${Math.round(deg)}, ${transformOriginX}, ${transformOriginY})`);\r\n }\r\n if (controlHandles) {\r\n (controlHandles.firstChild as SVGGElement).setAttribute(\"transform\", `rotate(${Math.round(deg)})`);\r\n }\r\n return deg;\r\n }\r\n\r\n /** Draws an SVG rectangle as preview for room drawing */\r\n private _drawRoomLayoutPreviewBox(type: string, initialCoords: number[], mouseX: number, mouseY: number, snapToGrid: boolean) {\r\n if (this.svg) {\r\n let room = this.svg.querySelector('#roomDrawing');\r\n if (!room) {\r\n room = document.createElementNS(xmlns, \"rect\") as SVGRectElement;\r\n room.id = \"roomDrawing\";\r\n this.svg.appendChild(room);\r\n }\r\n let x1 = Math.min(mouseX, initialCoords[0]);\r\n let x2 = Math.max(mouseX, initialCoords[0]);\r\n let y1 = Math.min(mouseY, initialCoords[1]);\r\n let y2 = Math.max(mouseY, initialCoords[1]);\r\n if (snapToGrid) {\r\n if (x1 % 10 !== 0)\r\n x1 = Math.round(x1 / 10) * 10;\r\n if (x2 % 10 !== 0)\r\n x2 = Math.round(x2 / 10) * 10;\r\n if (y1 % 10 !== 0)\r\n y1 = Math.round(y1 / 10) * 10 + 2.5;\r\n if (y2 % 10 !== 0)\r\n y2 = Math.round(y2 / 10) * 10 + 2.5;\r\n }\r\n room.setAttribute(\"x\", x1.toString());\r\n room.setAttribute(\"width\", (x2 - x1).toString());\r\n room.setAttribute(\"y\", y1.toString());\r\n room.setAttribute(\"height\", (y2 - y1).toString());\r\n room.setAttribute(\"fill\", type === \"DrawFloorplan\" ? \"white\" : \"none\");\r\n room.setAttribute(\"stroke\", type === \"DrawFloorplan\" ? \"#999\" : \"black\");\r\n }\r\n }\r\n\r\n /** Scrolls the canvas based on the disance between the current mouse position and coordinates captured during initial canvas grab */\r\n private _performCanvasScroll(e: React.MouseEvent, initialCoords: number[]) {\r\n const deltaX = e.clientX - initialCoords[0];\r\n const deltaY = e.clientY - initialCoords[1];\r\n const drawing = document.querySelector('#drawing');\r\n if (drawing && drawing.firstChild) {\r\n (drawing.firstChild as HTMLElement).scrollLeft = initialCoords[2] + (deltaX * -1);\r\n (drawing.firstChild as HTMLElement).scrollTop = initialCoords[3] + (deltaY * -1);\r\n }\r\n }\r\n\r\n /** Adds a new stampable element to the canvas, such as a desk or a door - providing there are no collisions */\r\n private _addNewStampable(mouseX: number, mouseY: number, snapToGrid: boolean, stampables: IStampable[], defaultDeskRotation?: number, offset?: number, options?: {[index: string]: any}) {\r\n let deskX = mouseX + (offset !== undefined ? offset : -10);\r\n let deskY = mouseY + (offset !== undefined ? offset : -10);\r\n if (snapToGrid) {\r\n if (deskX % 10 !== 0)\r\n deskX = Math.round(deskX / 10) * 10;\r\n if (deskY % 10 !== 0)\r\n deskY = Math.round(deskY / 10) * 10;\r\n }\r\n const collision = this._checkDeskCollision(deskX, deskY);\r\n if (!collision) {\r\n let stampable: IStampable = {\r\n x: deskX,\r\n y: deskY,\r\n rotation: defaultDeskRotation || 0\r\n };\r\n if (options) {\r\n for (let key in options) {\r\n (stampable as any)[key] = options[key];\r\n }\r\n }\r\n (stampables as any).push(stampable);\r\n }\r\n return stampables;\r\n }\r\n\r\n private _commitRotation(type: StampObj, itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean) {\r\n let deg: number = 0; let arrName = \"floorplanShapes\";\r\n switch (type) {\r\n case \"Desk\":\r\n deg = this._performDeskRotation(this.state.drawing.desks, itemIdx, mouseX, mouseY, snapToGrid);\r\n arrName = \"desks\";\r\n break;\r\n case \"Door\":\r\n deg = this._performDoorRotation(this.state.drawing.doors, itemIdx, mouseX, mouseY, snapToGrid);\r\n arrName = \"doors\";\r\n break;\r\n case \"Floor\":\r\n case \"Room\":\r\n deg = type === \"Floor\" ? this._performFloorRotation(itemIdx, mouseX, mouseY, snapToGrid) : this._performRoomRotation(itemIdx, mouseX, mouseY, snapToGrid);\r\n arrName = type === \"Floor\" ? \"floorplanRectangles\" : \"roomRectangles\";\r\n break;\r\n case \"Shape\":\r\n deg = this._performShapeRotation(itemIdx, mouseX, mouseY, snapToGrid);\r\n arrName = \"floorplanShapes\";\r\n break;\r\n }\r\n const amendedObject = { ...(this.state.drawing as any)[arrName][itemIdx] };\r\n amendedObject.rotation = deg;\r\n const amendedObjects = [...(this.state.drawing as any)[arrName]];\r\n amendedObjects[itemIdx] = amendedObject;\r\n const newState = cloneDeep(this.state);\r\n (newState.drawing as any)[arrName] = amendedObjects;\r\n this.setState(newState, () => {\r\n this._mouseDownOperation = null;\r\n });\r\n }\r\n\r\n private _commitMovedObject(type: MouseDownOperationType, itemIdx: number) {\r\n const { drawing } = this.state;\r\n \r\n const draggableType = type.replace(\"Move\", \"\");\r\n let arrayName = \"floorplanShapes\";\r\n switch (draggableType) {\r\n case \"Desk\":\r\n arrayName = \"desks\";\r\n break;\r\n case \"Door\":\r\n arrayName = \"doors\";\r\n break;\r\n case \"Text\":\r\n arrayName = \"text\";\r\n break;\r\n case \"Floor\":\r\n arrayName = \"floorplanRectangles\";\r\n break;\r\n case \"Room\":\r\n arrayName = \"roomRectangles\";\r\n break;\r\n }\r\n let draggableArr: IStampable[] = [...(drawing as any)[arrayName]];\r\n \r\n const element = document.querySelector(`.draggable${draggableType}-${itemIdx}`);\r\n if (draggableArr && element) {\r\n const x = element.getAttribute(\"x\"), y = element.getAttribute(\"y\");\r\n if (x && y) {\r\n const amendedObject = { ...draggableArr[itemIdx] };\r\n const amendedObjects = [...draggableArr];\r\n amendedObject.x = parseFloat(x);\r\n amendedObject.y = parseFloat(y);\r\n amendedObjects[itemIdx] = amendedObject;\r\n const newState = cloneDeep(this.state);\r\n (newState.drawing as any)[arrayName] = amendedObjects;\r\n this.setState(newState, () => {\r\n this._mouseDownOperation = null;\r\n });\r\n }\r\n }\r\n }\r\n\r\n private _commitMultiSelection(x: number, y: number) {\r\n const selection = this._checkMultiSelection(x,y);\r\n const newState = {\r\n ...this.state,\r\n selectedObjects: selection\r\n };\r\n super.setState(newState, () => {\r\n this._mouseDownOperation = null;\r\n if (this.svg) {\r\n const selectionEl = document.querySelector('#selectionRect');\r\n if (selectionEl) selectionEl.remove();\r\n }\r\n });\r\n }\r\n\r\n /** Updates zoom level */\r\n private _setZoom(zoom: number) {\r\n super.setState({\r\n ...this.state,\r\n zoom\r\n });\r\n }\r\n\r\n /** Handles selection of editor tools */\r\n private _toolSelection(tool: ToolType) {\r\n return (e: any) => {\r\n this._mouseDownOperation = null;\r\n const cursor = document.querySelector('#cursor');\r\n if (cursor) {\r\n cursor.remove();\r\n }\r\n super.setState({\r\n ...this.state,\r\n selectedDeskIdx: undefined,\r\n selectedDoorIdx: undefined,\r\n selectedTool: tool\r\n }, () => {\r\n if (this.svg) {\r\n this.svg.classList.remove(\"pointerTool\");\r\n this.svg.classList.remove(\"penTool\");\r\n this.svg.classList.remove(\"deskTool\");\r\n this.svg.classList.remove(\"floorTool\");\r\n this.svg.classList.remove(\"roomTool\");\r\n this.svg.classList.remove(\"doorTool\");\r\n this.svg.classList.remove(\"eraserTool\")\r\n this.svg.classList.add(tool.toLowerCase() + \"Tool\");\r\n this._triggerMouseMove();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Inverts boolean properties in state */\r\n private _toggleStateBool(bool: string) {\r\n return () => {\r\n const newState = {...this.state};\r\n (newState as any)[bool] = !(newState as any)[bool];\r\n super.setState(newState);\r\n };\r\n }\r\n\r\n /** Uses getBoundingClientRect to attempt to fit all added desks to the current view */\r\n private _fitDesksToScreen() {\r\n super.setState({\r\n ...this.state,\r\n zoom: 0.5,\r\n }, () => {\r\n const desks = document.querySelector('#desks') as SVGGElement;\r\n const drawing = document.querySelector('#drawing > div') as HTMLDivElement;\r\n if (this.svg && desks && drawing) {\r\n let bounds = desks.getBoundingClientRect();\r\n let ratio = 0.5;\r\n if (window.innerWidth > window.innerHeight) {\r\n ratio = bounds.height / window.innerHeight;\r\n } else {\r\n ratio = bounds.width / window.innerWidth;\r\n }\r\n super.setState({\r\n ...this.state,\r\n zoom: ratio\r\n }, () => {\r\n bounds = desks.getBoundingClientRect();\r\n const wDiff = (window.innerWidth - bounds.width) / 2;\r\n const hDiff = (window.innerHeight - bounds.height) / 2;\r\n drawing.scrollLeft = bounds.left - wDiff;\r\n drawing.scrollTop = bounds.top - hDiff;\r\n });\r\n }\r\n });\r\n }\r\n\r\n /** Initialises Office UI Icons and adds custom icon registrations */\r\n private _setupIcons() {\r\n initializeIcons();\r\n registerIcons({\r\n icons: {\r\n 'pointer-svg': (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n 'pen-svg': (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n 'desk-svg': (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n });\r\n }\r\n\r\n /** Given a reference to the editor's SVG Canvas and a MouseEvent - converts the mouse coordinates of the event to coordinates in SVG space */\r\n private _getSvgMousePosition(e: React.MouseEvent, svg: SVGSVGElement | null) {\r\n let x, y; \r\n if (svg) {\r\n const ctm = svg.getScreenCTM();\r\n if (ctm) {\r\n x = (e.clientX - ctm.e) / ctm.a;\r\n y = (e.clientY - ctm.f) / ctm.d;\r\n }\r\n }\r\n return {x,y};\r\n }\r\n\r\n /** Given SVG coordinates x/y, determines any selections the user may have made */\r\n private _checkSelection(xSvg: number, ySvg: number, xMouse: number, yMouse: number) {\r\n const { desks, doors, roomRectangles, floorplanRectangles, floorplanShapes } = this.state.drawing;\r\n let returnObj: Record = {\r\n clickedDeskIdx: undefined,\r\n clickedDoorIdx: undefined,\r\n clickedTextIdx: undefined,\r\n clickedFloorIdx: undefined,\r\n clickedRoomIdx: undefined,\r\n clickedShapeIdx: undefined\r\n };\r\n const boundsChecker: Record = { Floor: floorplanRectangles, Shape: floorplanShapes, Room: roomRectangles, Door: doors, Desk: desks };\r\n for (let key in boundsChecker) {\r\n boundsChecker[key].forEach((item, idx) => {\r\n if (item.x != null && item.y != null) {\r\n let bounds: { left: number, right: number, top: number, bottom: number} | undefined = undefined;\r\n if (item.width != null && item.height != null) {\r\n bounds = { top: item.y, bottom: item.y + (item as IRoomRectangle).height, left: item.x, right: item.x + (item as IRoomRectangle).width };\r\n } else {\r\n bounds = { top: item.y, bottom: item.y + 20, left: item.x, right: item.x + 20 };\r\n }\r\n if (bounds &&\r\n xSvg >= bounds.left &&\r\n xSvg <= bounds.right &&\r\n ySvg >= bounds.top &&\r\n ySvg <= bounds.bottom\r\n ) {\r\n returnObj[`clicked${key}Idx`] = idx;\r\n }\r\n }\r\n });\r\n }\r\n if (this.svg) {\r\n const element = document.elementFromPoint(xMouse, yMouse);\r\n console.log(element);\r\n if (element && (element.nodeName === \"text\" || element.nodeName === \"tspan\")) {\r\n let parentElement: Node | null = element as SVGElement;\r\n while (parentElement !== null && parentElement.nodeName !== \"svg\") {\r\n parentElement = parentElement.parentNode;\r\n }\r\n if (parentElement) {\r\n const idxStr = (parentElement as SVGSVGElement).getAttribute(\"data-idx\");\r\n if (idxStr) {\r\n const idx = parseInt(idxStr, 10);\r\n returnObj.clickedTextIdx = idx;\r\n }\r\n }\r\n }\r\n }\r\n return returnObj;\r\n }\r\n\r\n private _checkMultiSelection(x: number, y: number): Record {\r\n const { drawing } = this.state;\r\n const { doors, desks, text, floorplanRectangles, roomRectangles, floorplanShapes } = drawing;\r\n const { initialCoords } = this._mouseDownOperation!;\r\n const x1 = Math.min(x, initialCoords[0]);\r\n const x2 = Math.max(x, initialCoords[0]);\r\n const y1 = Math.min(y, initialCoords[1]);\r\n const y2 = Math.max(y, initialCoords[1]);\r\n let multiSelection: Record = {\r\n desks: [],\r\n doors: [],\r\n text: [],\r\n floorplanRectangles: [],\r\n roomRectangles: [],\r\n floorplanShapes: []\r\n };\r\n const drawingObjs = { doors, desks, text, floorplanRectangles, roomRectangles, floorplanShapes };\r\n for (let key in drawingObjs) {\r\n (drawingObjs as any)[key].forEach((obj: any, idx: number) => {\r\n if (/shapes/.test(key)) {\r\n let shape = obj as ISvgShape;\r\n let bounds = { left: shape.x, right: shape.x + shape.width!, top: shape.y, bottom: shape.y + shape.height! };\r\n if (\r\n (bounds.left >= x1 && bounds.left <= x2 && bounds.top >= y1 && bounds.top <= y2) ||\r\n (bounds.right >= x1 && bounds.right <= x2 && bounds.bottom >= y1 && bounds.bottom <= y2) ||\r\n (bounds.left >= x1 && bounds.left <= x2 && bounds.bottom >= y1 && bounds.bottom <= y2) ||\r\n (bounds.right >= x1 && bounds.right <= x2 && bounds.top >= y1 && bounds.top <= y2)\r\n ) {\r\n multiSelection[key].push(idx);\r\n }\r\n } else {\r\n if (obj.x != null && obj.y != null) {\r\n let bounds: { left: number, right: number, top: number, bottom: number} | undefined = undefined;\r\n if (obj.width != null && obj.height != null) {\r\n bounds = { top: obj.y, bottom: obj.y + (obj as IRoomRectangle).height, left: obj.x, right: obj.x + (obj as IRoomRectangle).width };\r\n } else {\r\n bounds = { top: obj.y, bottom: obj.y + 20, left: obj.x, right: obj.x + 20 };\r\n }\r\n if (\r\n (bounds.left >= x1 && bounds.left <= x2 && bounds.top >= y1 && bounds.top <= y2) ||\r\n (bounds.right >= x1 && bounds.right <= x2 && bounds.bottom >= y1 && bounds.bottom <= y2) ||\r\n (bounds.left >= x1 && bounds.left <= x2 && bounds.bottom >= y1 && bounds.bottom <= y2) ||\r\n (bounds.right >= x1 && bounds.right <= x2 && bounds.top >= y1 && bounds.top <= y2)\r\n ) {\r\n multiSelection[key].push(idx);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n return multiSelection;\r\n }\r\n\r\n /** Given proposed desk coordinates x/y, determines if this new desk would intersect with another. \r\n * Collision detection algorithm used to prevent users from putting desks on top of one another. */\r\n private _checkDeskCollision(x: number, y: number) {\r\n const { desks } = this.state.drawing;\r\n let boundsA = { top: y, bottom: y + 20, left: x, right: x + 20 };\r\n let collision = false;\r\n desks.forEach((desk) => {\r\n let boundsB = { top: desk.y, bottom: desk.y + 20, left: desk.x, right: desk.x + 20 };\r\n if (\r\n boundsA.top < boundsB.bottom && \r\n boundsA.bottom > boundsB.top &&\r\n boundsA.left < boundsB.right && \r\n boundsA.right > boundsB.left\r\n ) {\r\n collision = true;\r\n }\r\n });\r\n return collision;\r\n }\r\n\r\n /** Performs previously undone state changes */\r\n private redo() {\r\n const { floorplanId, layoutId } = this.props;\r\n const { undoStates, redoStates } = this.state;\r\n const redos = [...redoStates];\r\n if (redos.length >= 1) {\r\n const newUndoState: IRoomEditorDrawingState = {...this.state.drawing};\r\n const newDrawingState = redos.pop();\r\n if (newDrawingState) {\r\n newDrawingState.lastUpdate = new Date().toISOString();\r\n localStorage.setItem(`draft_${floorplanId}_${layoutId}`, JSON.stringify(newDrawingState));\r\n super.setState({\r\n ...this.state,\r\n drawing: newDrawingState ? {...newDrawingState, tempShape: []} : this._initialDrawingState,\r\n undoStates: [...undoStates, newUndoState],\r\n redoStates: redos,\r\n }, () => {\r\n this._mouseDownOperation = null;\r\n if (this.svg) {\r\n const room = this.svg.querySelector('#roomDrawing');\r\n if (room) room.remove();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n /** Rewinds recently completed state changes */\r\n private undo() {\r\n const { floorplanId, layoutId } = this.props;\r\n const { undoStates, redoStates } = this.state;\r\n const undos = [...undoStates];\r\n if (this._penInUse) {\r\n super.setState({\r\n ...this.state,\r\n drawing: {\r\n ...this.state.drawing,\r\n tempShape: []\r\n }\r\n }, () => {\r\n this._penInUse = false;\r\n this._mouseDownOperation = null;\r\n });\r\n return;\r\n }\r\n if (undos.length >= 1) {\r\n const newRedoState: IRoomEditorDrawingState = {...this.state.drawing};\r\n const newDrawingState = undos.pop();\r\n if (newDrawingState) {\r\n newDrawingState.lastUpdate = new Date().toISOString();\r\n localStorage.setItem(`draft_${floorplanId}_${layoutId}`, JSON.stringify(newDrawingState));\r\n super.setState({\r\n ...this.state,\r\n drawing: newDrawingState ? {...newDrawingState, tempShape: [] } : this._initialDrawingState,\r\n undoStates: undos,\r\n redoStates: [...redoStates, newRedoState]\r\n }, () => {\r\n this._mouseDownOperation = null;\r\n if (this.svg) {\r\n const room = this.svg.querySelector('#roomDrawing');\r\n if (room) room.remove();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n /** Handles keyboard input for the editor, capturing combination key presses */\r\n private _handleKeyDown(e: KeyboardEvent) {\r\n if (e.key === \"Escape\" && this._penInUse) {\r\n super.setState({\r\n ...this.state,\r\n drawing: {\r\n ...this.state.drawing,\r\n tempShape: []\r\n }\r\n }, () => {\r\n this._penInUse = false;\r\n this._mouseDownOperation = null;\r\n });\r\n return;\r\n }\r\n if (e.ctrlKey && e.key === \"z\") {\r\n this.undo();\r\n }\r\n if (e.ctrlKey && e.key === \"y\") {\r\n this.redo();\r\n }\r\n }\r\n\r\n /** Handles keyboard input for the editor */\r\n private _handleKeyUp(e: KeyboardEvent) {\r\n if (this.svg && this.state.selectedTextIdx !== undefined) {\r\n // const activeTextBox = this.svg.querySelector('.draggableText-' + this.state.selectedTextIdx);\r\n // if (activeTextBox) {\r\n // const textElement = activeTextBox.querySelector('text');\r\n // if (textElement) {\r\n // let text = textElement.textContent;\r\n // if (e.key === \"Backspace\") {\r\n // text = text ? text.substr(0,text.length - 1) : \"\";\r\n // } else if (e.key === \"Enter\") {\r\n // text += \"\\n\";\r\n // } else if (e. /[a-zA-Z0-9:-\\s]/.test(e.key)) {\r\n // text += e.key;\r\n // }\r\n // textElement.textContent = text;\r\n // }\r\n // }\r\n } else {\r\n if (e.key === \"v\") {\r\n this._toolSelection(\"Pointer\")(null);\r\n }\r\n if (e.key === \"d\") {\r\n this._toolSelection(\"Desk\")(null);\r\n }\r\n if (e.key === \"t\") {\r\n super.setState({\r\n ...this.state,\r\n availability: !this.state.availability\r\n }, this._triggerMouseMove);\r\n }\r\n if (e.key === \"i\") {\r\n if (this.state.selectedTool === \"Room\" || this.state.selectedTool === \"Floor\") {\r\n super.setState({\r\n ...this.state,\r\n selectedTool: this.state.selectedTool === \"Room\" ? \"Floor\" : \"Room\"\r\n }, this._triggerMouseMove);\r\n }\r\n }\r\n if (e.key === \"g\") {\r\n super.setState({\r\n ...this.state,\r\n showGrid: !this.state.showGrid\r\n }, this._triggerMouseMove);\r\n }\r\n if (e.key === \"s\") {\r\n super.setState({\r\n ...this.state,\r\n snapToGrid: !this.state.snapToGrid\r\n }, this._triggerMouseMove);\r\n }\r\n if (e.key === \"r\") {\r\n let { defaultDeskRotation } = this.state;\r\n defaultDeskRotation += 45;\r\n if (defaultDeskRotation >= 360) defaultDeskRotation = 0;\r\n super.setState({\r\n ...this.state,\r\n defaultDeskRotation,\r\n }, this._triggerMouseMove);\r\n }\r\n }\r\n }\r\n\r\n /** Synthetically triggers a mousemove event on the SVG Canvas. \r\n * Used to programatically update mouseover previews when tools and other settings change. */\r\n private _triggerMouseMove() {\r\n if (this.svg) {\r\n this.svg.dispatchEvent(new MouseEvent(\"mousemove\", {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true,\r\n clientX: this._liveX || 0,\r\n clientY: this._liveY || 0\r\n }));\r\n }\r\n }\r\n}\r\n\r\nexport default withRouter(RoomEditor);","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","export default __webpack_public_path__ + \"static/media/undraw_Hello_re_3evm.79549688.svg\";","export default __webpack_public_path__ + \"static/media/undraw_date_picker_gorr.81df552e.svg\";","export default __webpack_public_path__ + \"static/media/undraw_Profile_re_4a55.95e6db37.svg\";","export default __webpack_public_path__ + \"static/media/undraw_Setup_re_y9w8.2e78ce80.svg\";","export default __webpack_public_path__ + \"static/media/undraw_in_the_office_re_jtgc.2024e9bb.svg\";","export default __webpack_public_path__ + \"static/media/undraw_accept_request_re_d81h.a6a42a51.svg\";","export default __webpack_public_path__ + \"static/media/undraw_schedule_re_2vro.bb92fbfc.svg\";","export default __webpack_public_path__ + \"static/media/undraw_medicine_b-1-ol.9d500013.svg\";","import { DefaultButton, MessageBar, MessageBarType, Panel, PanelType, PersonaCoin, PersonaSize, PrimaryButton, Stack, TextField, Toggle } from \"office-ui-fabric-react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { updateMyProfile } from \"../../api/userInfo\";\r\nimport { IUserWithPhoto } from \"../../types/User.types\";\r\n\r\nexport interface IProfileEditorPanelProps {\r\n profile: IUserWithPhoto; \r\n onDismiss: () => void;\r\n onSaved: (profile: IUserWithPhoto) => void;\r\n}\r\n\r\nexport const ProfileEditorPanel = (props: IProfileEditorPanelProps) => {\r\n const { profile } = props;\r\n\r\n const validForm = (fullName: string | undefined, org: string | undefined, phone: string | undefined, useTeams: boolean | undefined) => {\r\n if (!fullName || fullName.trim() === \"\") return false;\r\n if (!org || org.trim() === \"\") return false;\r\n if (!phone || phone.trim() === \"\") return false;\r\n if (useTeams === undefined) return false;\r\n return true;\r\n };\r\n\r\n const [ fullName, setFullName ] = useState(profile.FullName);\r\n const [ organisation, setOrganisation ] = useState(profile.Organisation);\r\n const [ phone, setPhone ] = useState(profile.Phone);\r\n const [ useTeams, setTeams ] = useState(profile.UseTeams);\r\n const [ error, setError ] = useState();\r\n const [ formValid, setFormValid ] = useState(validForm(fullName, organisation, phone, useTeams));\r\n \r\n useEffect(() => {\r\n setFormValid(validForm(fullName, organisation, phone, useTeams));\r\n }, [fullName, organisation, phone, useTeams]);\r\n\r\n const updateProfile = async (profile: IUserWithPhoto) => {\r\n const response = await updateMyProfile(profile);\r\n if (response.Success) {\r\n props.onSaved(profile);\r\n props.onDismiss();\r\n } else {\r\n setError(response.Error);\r\n }\r\n };\r\n\r\n return {\r\n return \r\n {\r\n const profile = {...props.profile};\r\n if (fullName) profile.FullName = fullName;\r\n if (organisation) profile.Organisation = organisation;\r\n if (phone) profile.Phone = phone;\r\n if (useTeams !== undefined) profile.UseTeams = useTeams;\r\n updateProfile(profile);\r\n }} />\r\n \r\n \r\n }}\r\n headerText=\"Edit Desk Booking Profile\"\r\n type={PanelType.medium} \r\n >\r\n { error !== undefined && (\r\n {error}\r\n )}\r\n \r\n setFullName(newValue)}>\r\n setOrganisation(newValue)}>\r\n setPhone(newValue)}>\r\n \r\n setTeams(checked)} onText=\"I can be contacted on Microsoft Teams\" offText=\"I cannot be contacted on Microsoft Teams\" />\r\n \r\n}\r\n","import { IGlobalSettings, ISettingsAndProfile } from \"../types/Settings.types\";\r\nimport apiFetch from './index';\r\n\r\nexport async function getSettings(abortController: AbortController) {\r\n const response = await apiFetch(`/api/settings`, {\r\n headers: {\r\n Accept: 'application/json'\r\n },\r\n credentials: 'include',\r\n signal: abortController.signal\r\n });\r\n if (response.ok) {\r\n return await response.json() as ISettingsAndProfile;\r\n }\r\n}\r\n\r\nexport async function saveSettings(settings: IGlobalSettings) {\r\n const response = await apiFetch(`/api/settings`, {\r\n headers: {\r\n Accept: 'application/json',\r\n \"Content-Type\": 'application/json'\r\n },\r\n body: JSON.stringify(settings),\r\n credentials: 'include',\r\n method: 'POST'\r\n });\r\n if (response.ok) {\r\n return true;\r\n } else {\r\n return new Error(\"Unable to load settings: \" + response.statusText);\r\n }\r\n}","import { IDropdownOption } from \"office-ui-fabric-react\";\r\n\r\nexport namespace Constants {\r\n export const ConstraintTypeOptions: IDropdownOption[] = [\r\n {\r\n key: 1,\r\n text: \"Week\",\r\n },\r\n {\r\n key: 2,\r\n text: \"Month\",\r\n },\r\n {\r\n key: 3,\r\n text: \"Year\",\r\n },\r\n ];\r\n}","import * as React from \"react\";\r\nimport { Dropdown, MessageBar, MessageBarType, Stack, TextField, Toggle } from \"office-ui-fabric-react\";\r\nimport Utils from \"../../../utils\";\r\nimport { Constants } from \"../../../utils/constants\";\r\nimport { ConstraintType, IBookingConstraint, ResourceType } from \"../../../types/Booking.types\";\r\nimport { Label } from \"@fluentui/react\";\r\n\r\nexport enum RestrictionUpdate {\r\n Site = 1,\r\n Location = 2,\r\n Room = 3,\r\n Global = 4\r\n}\r\n\r\nexport interface IRestrictionsSectionProps {\r\n resourceId: number;\r\n updateType: RestrictionUpdate;\r\n deskBookingConstraint?: IBookingConstraint;\r\n roomBookingConstraint?: IBookingConstraint;\r\n roomCheckIn?: boolean;\r\n onChange: (constraints:{ deskBookingConstraint?: IBookingConstraint, roomBookingConstraint?: IBookingConstraint }, roomCheckIn?: boolean) => void;\r\n}\r\n\r\nexport const RestrictionsSection = (props: IRestrictionsSectionProps) => {\r\n\r\n // Booking constraints\r\n const [ deskConstraint, setDeskConstraint ] = React.useState(props.deskBookingConstraint);\r\n const [ useDeskConstraint, setUseDeskConstraint ] = React.useState(Boolean(props.deskBookingConstraint));\r\n const [ roomConstraint, setRoomConstraint ] = React.useState(props.roomBookingConstraint);\r\n const [useRoomConstraint, setUseRoomConstraint] = React.useState(Boolean(props.roomBookingConstraint));\r\n const [enableCheckIn, setEnableCheckIn] = React.useState(props.roomCheckIn);\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const getDefaultConstraint = React.useCallback(Utils.getDefaultConstraint, []);\r\n const constraintParams: (number|null)[] = [null, null, null];\r\n // const constraintProps = [\"SiteId\", \"LocationId\", \"RoomId\"];\r\n constraintParams[props.updateType - 1] = props.resourceId;\r\n // const constraintUpdateProp = constraintProps[props.updateType - 1];\r\n\r\n const constraintOptions = React.useMemo(() => (Constants.ConstraintTypeOptions), []);\r\n\r\n // On Update\r\n React.useEffect(() => {\r\n props.onChange({ deskBookingConstraint: deskConstraint, roomBookingConstraint: roomConstraint}, enableCheckIn);\r\n }, [deskConstraint, roomConstraint, enableCheckIn]);\r\n\r\n return (\r\n <>\r\n \r\n Time constraints be set Globally, or at Site, Location or Room level. \r\n \r\n { props.updateType !== RestrictionUpdate.Room && (\r\n <>\r\n {\r\n if (!checked) {\r\n setDeskConstraint(undefined);\r\n } else {\r\n setDeskConstraint(deskConstraint || getDefaultConstraint(ResourceType.Desk));\r\n }\r\n setUseDeskConstraint(checked || false)\r\n }} />\r\n { useDeskConstraint === true && (\r\n \r\n {\r\n const constraint = {...deskConstraint} || getDefaultConstraint(ResourceType.Desk, ...constraintParams);\r\n if (newValue) {\r\n const numVal = parseInt(newValue, 10);\r\n constraint.Number = numVal;\r\n } else {\r\n constraint.Number = 0;\r\n }\r\n setDeskConstraint(constraint);\r\n }} />\r\n {\r\n const constraint = {...deskConstraint} || getDefaultConstraint(ResourceType.Desk, ...constraintParams);\r\n constraint.Type = option?.key as ConstraintType;\r\n setDeskConstraint(constraint);\r\n }} />\r\n \r\n )}\r\n \r\n )}\r\n {\r\n if (!checked) {\r\n setRoomConstraint(undefined);\r\n } else {\r\n setRoomConstraint(roomConstraint || getDefaultConstraint(ResourceType.Room, ...constraintParams));\r\n }\r\n setUseRoomConstraint(checked || false)\r\n }} />\r\n { useRoomConstraint === true && (\r\n \r\n {\r\n const constraint = {...roomConstraint} || getDefaultConstraint(ResourceType.Room, ...constraintParams);\r\n if (newValue) {\r\n const numVal = parseInt(newValue, 10);\r\n constraint.Number = numVal;\r\n } else {\r\n constraint.Number = 0;\r\n }\r\n setRoomConstraint(constraint);\r\n }} />\r\n {\r\n const constraint = {...roomConstraint} || getDefaultConstraint(ResourceType.Room, ...constraintParams);\r\n constraint.Type = option?.key as ConstraintType;\r\n setRoomConstraint(constraint);\r\n }} />\r\n \r\n )}\r\n {props.updateType != RestrictionUpdate.Global && (<>\r\n \r\n \r\n You can require that users check-in to meeting rooms via the app (or using QR codes). When enabled, if users do not check-in, their meeting will be automatically cancelled. Users have 15 minutes before and after their meeting during which they can check-in.\r\n \r\n setEnableCheckIn(checked)} />\r\n )}\r\n \r\n );\r\n};","import { DefaultButton, Label, MessageBar, MessageBarType, Panel, PanelType, PrimaryButton, Stack, Toggle } from \"office-ui-fabric-react\";\r\nimport * as React from \"react\";\r\nimport { saveSettings } from \"../../../api/settings\";\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport { IBookingConstraint } from \"../../../types/Booking.types\"\r\nimport { IGlobalSettings } from \"../../../types/Settings.types\";\r\nimport { RestrictionsSection, RestrictionUpdate } from \"./RestrictionsSection\";\r\n\r\nexport interface IGlobalSettingsFormProps {\r\n onDismiss: () => void;\r\n}\r\n\r\nexport const GlobalSettingsForm = (props: IGlobalSettingsFormProps) => {\r\n\r\n const profileContext = React.useContext(ProfileContext);\r\n\r\n const [ maintenanceMode, setMaintenanceMode ] = React.useState(profileContext?.Settings.MaintenanceMode || false);\r\n const [ roomBookingEnabled, setRbEnabled ] = React.useState(profileContext?.Settings.RoomBookingEnabled || false);\r\n const [ deskBookingEnabled, setDbEnabled ] = React.useState(profileContext?.Settings.DeskBookingEnabled || false);\r\n const [ deskConstraint, setDeskConstraint ] = React.useState(profileContext?.Settings.GlobalDeskConstraint);\r\n const [ roomConstraint, setRoomConstraint ] = React.useState(profileContext?.Settings.GlobalRoomConstraint);\r\n const [ error, setError ] = React.useState();\r\n\r\n const _saveSettings = React.useCallback(async () => {\r\n const saveObj = {\r\n MaintenanceMode: maintenanceMode,\r\n RoomBookingEnabled: roomBookingEnabled,\r\n DeskBookingEnabled: deskBookingEnabled,\r\n GlobalDeskConstraint: deskConstraint,\r\n GlobalRoomConstraint: roomConstraint,\r\n } as IGlobalSettings;\r\n const response = await saveSettings(saveObj);\r\n if (response instanceof Error) {\r\n setError(response.message);\r\n } else {\r\n profileContext?.onProfileUpdated(new AbortController());\r\n props.onDismiss();\r\n }\r\n }, [deskConstraint, roomConstraint, maintenanceMode, deskBookingEnabled, roomBookingEnabled, props, profileContext]);\r\n\r\n return (\r\n (\r\n \r\n props.onDismiss() }/>\r\n _saveSettings()} />\r\n \r\n )}\r\n >\r\n { Boolean(error) === true && (\r\n \r\n { error }\r\n \r\n ) }\r\n { Boolean(error) === false && (\r\n <>\r\n \r\n When the site is in Maintenance Mode, users will still be able to access the site - but they will be prevented from making any further bookings.\r\n \r\n setMaintenanceMode(checked || false)} />\r\n \r\n setRbEnabled(checked !== undefined ? checked : true)} />\r\n setDbEnabled(checked !== undefined ? checked : true)} />\r\n {\r\n setDeskConstraint(constraints.deskBookingConstraint);\r\n setRoomConstraint(constraints.roomBookingConstraint);\r\n }}\r\n updateType={RestrictionUpdate.Global}\r\n deskBookingConstraint={deskConstraint}\r\n roomBookingConstraint={roomConstraint}\r\n />\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from \"react\";\r\nimport { Checkbox, DefaultButton, Dialog, DialogFooter, PrimaryButton, Spinner } from \"office-ui-fabric-react\";\r\nimport { useContext, useState } from \"react\";\r\nimport { IRole, IUserWithPhoto } from \"../../../types/User.types\";\r\nimport { getRoles, saveRoles } from \"../../../api/userInfo\";\r\nimport { ICheckboxStyles } from \"@fluentui/react\";\r\nimport { ProfileContext } from \"../../../Home\";\r\n\r\nexport interface IRoleAssignmentDialogProps {\r\n user: IUserWithPhoto;\r\n onDismiss: (saved: boolean) => void;\r\n}\r\n\r\nexport const RoleAssignmentDialog = (props: IRoleAssignmentDialogProps) => {\r\n const userContext = useContext(ProfileContext);\r\n const [ loading, setLoading ] = useState(true);\r\n const [ roles, setRoles ] = useState();\r\n const [ selectedRoles, setSelectedRoles ] = useState([]);\r\n\r\n const loadRoles = async () => {\r\n const results = await getRoles();\r\n if (!(results instanceof Error)) {\r\n setLoading(false);\r\n setRoles(results);\r\n if (props.user.Roles) {\r\n setSelectedRoles(props.user.Roles.map(r => r.Id));\r\n }\r\n }\r\n }\r\n\r\n const submitNewRoles = async () => {\r\n const result = await saveRoles(props.user.Email, selectedRoles);\r\n if (result) {\r\n if (userContext && userContext.Profile.Email.toLowerCase() === props.user.Email) {\r\n userContext.onProfileUpdated(new AbortController());\r\n }\r\n props.onDismiss(true);\r\n } else {\r\n alert('Unable to save assigned roles. Please check the console for errors.');\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n loadRoles();\r\n }, []);\r\n\r\n const checkboxStyle: ICheckboxStyles = {\r\n root: {\r\n paddingBottom: \"10px\"\r\n }\r\n } \r\n\r\n return (\r\n \r\n { loading === true && (\r\n \r\n )}\r\n { loading === false && roles && roles.length > 0 && roles.map((role) => (\r\n = 0} onChange={(e, checked) => {\r\n if (selectedRoles.indexOf(role.Id) >= 0) {\r\n setSelectedRoles(selectedRoles.filter((r) => r !== role.Id));\r\n } else {\r\n setSelectedRoles([...selectedRoles, role.Id]);\r\n }\r\n }} />\r\n ))}\r\n \r\n {\r\n submitNewRoles();\r\n }} />\r\n {\r\n props.onDismiss(false);\r\n }} />\r\n \r\n \r\n )\r\n};\r\n","import { DetailsList, Panel, PanelType, Persona, TextField, Selection, CommandBar, SelectionMode, Icon, TooltipHost, Dialog } from \"office-ui-fabric-react\";\r\nimport { useCallback, useEffect, useState } from \"react\";\r\nimport { debounce } from \"lodash\";\r\nimport { searchUsers } from \"../../../api/userInfo\";\r\nimport { IUserWithPhoto } from \"../../../types/User.types\";\r\n\r\nimport styles from \"./AdministratorsPanel.module.scss\";\r\nimport { Spinner } from \"@fluentui/react\";\r\nimport { RoleAssignmentDialog } from \"./RoleAssignment\";\r\nimport { TagPicker } from \"../../TagPicker\";\r\nimport { TagType } from \"../../../types/Tagging.types\";\r\nimport { assignTags } from \"../../../api/tagging\";\r\n\r\nexport interface IUserManagementPanelProps {\r\n onDismiss: () => void;\r\n}\r\n\r\nexport const UserManagementPanel = (props: IUserManagementPanelProps) => {\r\n\r\n const [ waiting, setWaiting ] = useState(false);\r\n const [ userSearch, setUserSearch ] = useState();\r\n const [ searchResults, setSearchResults ] = useState([]);\r\n const [ itemsSelected, setItemsSelected ] = useState(false);\r\n const [ assignRolesToUser, setAssignRolesToUser ] = useState();\r\n const [ assignTagsToUserIdx, setAssignTagsToUserIdx ] = useState();\r\n const [ tagReady, setTagReady ] = useState(false);\r\n\r\n const onSelectionChanged = () => {\r\n const selectedItems = selection.getSelection() as IUserWithPhoto[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n setItemsSelected(true);\r\n } else {\r\n setItemsSelected(false);\r\n }\r\n };\r\n \r\n const [ selection ] = useState(new Selection({ onSelectionChanged }));\r\n\r\n const updateSearch = useCallback(debounce(async (searchStr: string | undefined) => {// eslint-disable-line react-hooks/exhaustive-deps\r\n setWaiting(true);\r\n const results = await searchUsers(searchStr);\r\n setSearchResults(results);\r\n setWaiting(false);\r\n }, 500), []);\r\n\r\n useEffect(() => {\r\n updateSearch(userSearch);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userSearch])\r\n\r\n const getIconOrRoleName = (roleName: string) => {\r\n const icons: Record = {\r\n \"Admin\": \"PlayerSettings\",\r\n \"Reporting\": \"PowerBILogo16\",\r\n \"Booking Manager\": \"Calendar\",\r\n \"Not Restricted\": \"Unlock\"\r\n };\r\n if (icons[roleName]) {\r\n return \r\n \r\n ;\r\n } else {\r\n return
{roleName}
\r\n }\r\n };\r\n\r\n let assignTagsToUser: IUserWithPhoto | undefined = undefined;\r\n if (assignTagsToUserIdx !== undefined) {\r\n assignTagsToUser = searchResults[assignTagsToUserIdx];\r\n }\r\n\r\n return (\r\n \r\n setUserSearch(newValue)} />\r\n { setAssignRolesToUser(selection.getItems()[0] as IUserWithPhoto) }\r\n },\r\n {\r\n key: \"assignTags\",\r\n disabled: waiting === true || !itemsSelected,\r\n text: \"Tag User\",\r\n onClick: () => { setAssignTagsToUserIdx(selection.getSelectedIndices()[0])}\r\n }\r\n ]}\r\n farItems={[\r\n {\r\n disabled: waiting === true,\r\n key: \"export\",\r\n iconOnly: true,\r\n iconProps: {\r\n iconName: \"Export\"\r\n },\r\n title: \"Export list of administrators\",\r\n href: \"/api/users/admins/export\",\r\n target: \"_blank\"\r\n }\r\n ]}\r\n />\r\n { waiting === true && (\r\n \r\n )}\r\n { waiting === false && searchResults.length > 0 && (\r\n {\r\n let photo: string | undefined = undefined;\r\n if (item.Photo) {\r\n photo = `data:${item.Photo.Type};base64,${item.Photo.Data}`;\r\n }\r\n return (\r\n \r\n )\r\n }\r\n },\r\n {\r\n key: \"roles\",\r\n isIconOnly: true,\r\n name: \"Roles\",\r\n minWidth: 80,\r\n className: styles.isAdminColumn,\r\n onRender: (item: IUserWithPhoto, index, column) => {\r\n if (item.Roles && item.Roles.length > 0) {\r\n return item.Roles.map((role) => getIconOrRoleName(role.Name));\r\n }\r\n }\r\n },\r\n {\r\n key: \"tags\",\r\n isIconOnly: true,\r\n name: \"Tags\",\r\n minWidth: 80,\r\n className: styles.isAdminColumn,\r\n onRender: (item: IUserWithPhoto, index, column) => {\r\n if (item.Tags && item.Tags.length > 0) {\r\n return (\r\n <>\r\n { item.Tags?.map(t =>
{t.Label}
) }\r\n }}>\r\n \r\n
\r\n )\r\n }\r\n }\r\n }\r\n ]}\r\n selection={selection}\r\n selectionMode={SelectionMode.single}\r\n />\r\n )}\r\n { assignRolesToUser !== undefined && (\r\n {\r\n setAssignRolesToUser(undefined);\r\n if (saved) updateSearch(userSearch);\r\n }}\r\n />\r\n )}\r\n { assignTagsToUser !== undefined && (\r\n \r\n )}\r\n
\r\n );\r\n}","import { ILocation, ISite } from \"../types/SiteLocation.types\";\r\nimport apiFetch from './index';\r\n\r\nexport async function saveSite(site: ISite) {\r\n let url = '/api/sites';\r\n if (site.Id !== undefined && site.Id !== -1) {\r\n url += '/' + site.Id;\r\n }\r\n return await apiFetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(site),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function deleteSite(id: number) {\r\n return await apiFetch(`/api/sites/${id}`, {\r\n method: 'DELETE',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getSite(id: number) {\r\n return await apiFetch(`/api/sites/${id}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getDeskSites(abortController?: AbortController) {\r\n const response = await apiFetch('/api/sites/desks', {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n signal: abortController?.signal\r\n });\r\n return response;\r\n}\r\n\r\nexport async function getSites(abortController?: AbortController) {\r\n const response = await apiFetch('/api/sites', {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n signal: abortController?.signal\r\n });\r\n return response;\r\n}\r\n\r\nexport async function getMySites(abortController?: AbortController) {\r\n const response = await apiFetch(`/api/sites/my`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n signal: abortController?.signal\r\n });\r\n return response;\r\n}\r\n\r\nexport async function saveLocation(location: ILocation) {\r\n let url: string;\r\n if (location.Id !== undefined && location.Id !== -1) {\r\n url = `/api/locations/${location.Id}`;\r\n } else {\r\n url = `/api/locations/site/${location.SiteId}`;\r\n }\r\n return await apiFetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(location),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function deleteLocation(id: number) {\r\n return await apiFetch(`/api/locations/${id}`, {\r\n method: 'DELETE',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getLocation(id: number) {\r\n return await apiFetch(`/api/locations/${id}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function loadLocations(id: number, deskCheck?: boolean) {\r\n const response = await apiFetch(`/api/locations/site/${id}${deskCheck ? '/desks' : ''}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n return response;\r\n}","import { ICommandBarStyles, ILabelStyles } from \"@fluentui/react\";\r\nimport { debounce, forEach } from \"lodash\";\r\nimport { CommandBar, DetailsList, Selection, Icon, Panel, PanelType, SelectionMode, TooltipHost, MessageBar, MessageBarType, Spinner, IconButton, Stack, PrimaryButton, Label, DatePicker, Dropdown, IDropdownOption, TextField, TagPicker, ITag, IStackTokens, IBasePickerStyles } from \"office-ui-fabric-react\";\r\nimport { useCallback, useEffect, useState } from \"react\";\r\nimport { cancelBooking, getMyBookings, searchDeskBookings } from \"../../../api/bookings\";\r\nimport { loadLocations, getSites } from \"../../../api/siteslocations\";\r\nimport { searchUsers } from \"../../../api/userInfo\";\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport { IBooking, IBookingSearchParams, IMyBooking } from \"../../../types/Booking.types\";\r\nimport { ILocation, ISite } from \"../../../types/SiteLocation.types\";\r\nimport { IUserWithPhoto } from \"../../../types/User.types\";\r\nimport { CancelReasonDialog } from \"./CancelReasonDialog\";\r\n\r\nexport interface IManageBookingsPanelProps {\r\n onDismiss: () => void;\r\n}\r\n\r\nexport const ManageBookingsPanel = (props: IManageBookingsPanelProps) => {\r\n const { onDismiss } = props;\r\n \r\n const [ waiting, setWaiting ] = useState(false);\r\n const [ cancelling, setCancelling ] = useState(false);\r\n const [ bookings, setBookings ] = useState();\r\n const [ bookingSelected, setBookingSelected ] = useState();\r\n const [ selectedBookings, setSelectedBookings ] = useState([]);\r\n const today = new Date();\r\n const defaultFrom = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0);\r\n const defaultTo = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59);\r\n defaultTo.setDate(defaultTo.getDate() + 7);\r\n const [ fromDate, setFromDate ] = useState(defaultFrom);\r\n const [ toDate, setToDate ] = useState(defaultTo);\r\n const [ siteOptions, setSites ] = useState([]);\r\n const [ chosenSite, setChosenSite ] = useState();\r\n const [ locationOptions, setLocations ] = useState([]);\r\n const [ chosenLocation, setChosenLocation ] = useState();\r\n const [ chosenUser, setChosenUser ] = useState();\r\n const [ showDialog, setShowDialog ] = useState(false); \r\n\r\n const onSelectionChanged = () => {\r\n const selectedItems = selection.getSelection() as IMyBooking[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n setBookingSelected(true);\r\n setSelectedBookings(selectedItems);\r\n } else {\r\n setBookingSelected(false);\r\n setSelectedBookings([]);\r\n }\r\n }; \r\n \r\n const [ selection ] = useState(new Selection({ onSelectionChanged }));\r\n\r\n const search = async () => {\r\n let searchParams: IBookingSearchParams = {\r\n FromDate: fromDate.toISOString(),\r\n ToDate: toDate.toISOString(),\r\n SiteId: chosenSite,\r\n LocationId: chosenLocation,\r\n UserId: chosenUser \r\n };\r\n const response = await searchDeskBookings(searchParams);\r\n if (response.ok) {\r\n const bookings = await response.json() as IMyBooking[];\r\n setBookings(bookings);\r\n }\r\n };\r\n \r\n const _onUserSearchChanged = async (filter: string, selectedItems?: ITag[]): Promise => {\r\n return new Promise((resolve, reject) => {\r\n if (!Boolean(filter) || !Boolean(filter.trim())) resolve([]);\r\n searchUsers(filter).then((response) => {\r\n if (response instanceof Error) {\r\n reject(response);\r\n } else {\r\n resolve(response.map((c) => ({\r\n key: c.Id,\r\n name: c.FullName + \" (\" + c.Email + \")\",\r\n data: c\r\n } as ITag)));\r\n }\r\n }).catch((err) => reject(err));\r\n });\r\n } \r\n\r\n const _load = async () => {\r\n const siteResponse = await getSites();\r\n if (siteResponse.ok) {\r\n const sites = await siteResponse.json() as ISite[];\r\n const siteOptions:IDropdownOption[] = sites.map((s) => {\r\n return {\r\n key: s.Id,\r\n text: s.Title\r\n }\r\n });\r\n setSites(siteOptions);\r\n }\r\n const response = await searchDeskBookings({\r\n FromDate: fromDate.toISOString(),\r\n ToDate: toDate.toISOString()\r\n });\r\n if (response.ok) {\r\n const bookings = await response.json() as IMyBooking[];\r\n setBookings(bookings);\r\n }\r\n }\r\n\r\n const _cancelBulkBookings = async (bookings: IMyBooking[], cancelReason: string | undefined) => {\r\n setCancelling(true);\r\n let cancelSuccess = 0;\r\n for (let index = 0; index < bookings.length; index++) {\r\n const booking = bookings[index];\r\n booking.CancelledByAdmin = true;\r\n booking.CancellationReason = cancelReason; \r\n const response = await cancelBooking(booking);\r\n if (response.ok) {\r\n cancelSuccess++;\r\n }\r\n }\r\n\r\n if (bookings.length == cancelSuccess) {\r\n alert('All selected bookings cancelled.');\r\n setCancelling(false);\r\n setSelectedBookings([]);\r\n _load();\r\n } else { \r\n if (cancelSuccess == 0) {\r\n alert('Unable to cancel bookings');\r\n setCancelling(false);\r\n setSelectedBookings([]);\r\n } else {\r\n alert(cancelSuccess + ' out of ' + bookings.length + ' bookings cancelled. There were issues cancelling the remaining bookings')\r\n setCancelling(false);\r\n setSelectedBookings([]);\r\n _load();\r\n }\r\n }\r\n }\r\n\r\n const _setSite = async (siteId: number) => {\r\n setChosenSite(siteId);\r\n const locationResponse = await loadLocations(siteId);\r\n if (locationResponse.ok) {\r\n const locations = await locationResponse.json() as ILocation[];\r\n const locationOptions:IDropdownOption[] = locations.map((s) => {\r\n return {\r\n key: s.Id,\r\n text: s.Title\r\n }\r\n });\r\n setLocations(locationOptions);\r\n }\r\n }\r\n\r\n const _getTextFromItem = (item: ITag) => {\r\n return item.name;\r\n }\r\n\r\n useEffect(() => {\r\n _load();\r\n }, []);\r\n\r\n const numericalSpacingStackTokens: IStackTokens = {\r\n childrenGap: 10\r\n };\r\n\r\n const tagPickerStyle: Partial = {\r\n root: { marginTop: 0 },\r\n input: { marginTop: 0 }\r\n }\r\n\r\n const cmdBarStyle: ICommandBarStyles = {\r\n root: {\r\n margin: \"20px 0px\"\r\n }\r\n }\r\n\r\n // Validate changes to dates\r\n useEffect(() => {\r\n if (fromDate && toDate && fromDate > toDate) {\r\n setToDate(new Date(fromDate));\r\n }\r\n if (fromDate && toDate && toDate < fromDate) {\r\n const newDate = new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate(), Math.max(fromDate.getHours(), toDate.getHours()), Math.max(fromDate.getMinutes(), toDate.getMinutes()), 0);\r\n setToDate(newDate);\r\n }\r\n }, [fromDate, toDate]);\r\n \r\n const setBeginningDate = useCallback((date) => {\r\n const newDate = new Date(date);\r\n newDate.setHours(0); newDate.setMinutes(0); newDate.setSeconds(0);\r\n setFromDate(newDate);\r\n }, []);\r\n \r\n const setEndDate = useCallback((date) => {\r\n const newDate = new Date(date);\r\n newDate.setHours(23); newDate.setMinutes(59); newDate.setSeconds(59);\r\n setToDate(newDate);\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n \r\n { if (date) setBeginningDate(date)}} />\r\n { if (date) setEndDate(date)}} />\r\n { if (option) _setSite(option.key as number)}} />\r\n { if (option) setChosenLocation(option.key as number)}} />\r\n {/* { if (option) setChosenDesk(option.key as number)}} /> */}\r\n \r\n \r\n {\r\n if (items && items.length > 0) {\r\n setChosenUser(items[0].key as number);\r\n } else {\r\n setChosenUser(undefined);\r\n }\r\n }}\r\n styles={tagPickerStyle}\r\n /> \r\n \r\n \r\n { window.innerWidth < 640 && (\r\n You can scroll the table below with the mouse or your finger\r\n )}\r\n {\r\n // const selectedItems = selection.getSelection() as IMyBooking[];\r\n // if (selectedItems) {\r\n // const selectedItem = selectedItems[0];\r\n // setViewBooking(selectedItem);\r\n // }\r\n // }\r\n // },\r\n {\r\n disabled: !bookingSelected || cancelling,\r\n key: \"cancel\",\r\n text: window.innerWidth < 640 ? \"Cancel\" : \"Cancel Booking\",\r\n onRender: cancelling ? () => : undefined,\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as IMyBooking[];\r\n if (selectedItems) {\r\n setSelectedBookings(selectedItems);\r\n setShowDialog(true);\r\n }\r\n }\r\n }\r\n ]}\r\n styles={cmdBarStyle}\r\n />\r\n { bookings !== undefined && bookings.length > 0 && [\r\n {\r\n // For other orgs or if sites expand may want to list location and floorplan here too \r\n let deskName = item.DeskName;\r\n if (!deskName || deskName.trim().length === 0) deskName = \"Desk (Id: \" + item.DeskId + \")\";\r\n return (\r\n
\r\n {deskName}\r\n
\r\n {item.SiteName}\r\n
\r\n
\r\n )\r\n }\r\n },\r\n {\r\n key: \"bookedBy\",\r\n name: \"Booked By\",\r\n fieldName: \"BookedByUserName\",\r\n minWidth: 80,\r\n maxWidth: 100\r\n }, \r\n {\r\n key: \"onBehalf\",\r\n name: \"On Behalf Of\",\r\n fieldName: \"OnBehalfOfEmail\",\r\n minWidth: 80,\r\n maxWidth: 100,\r\n onRender: (item: IMyBooking) => {\r\n return item.OnBehalfOfEmail ? item.OnBehalfOfEmail : \"Self\";\r\n },\r\n },\r\n {\r\n key: \"start\",\r\n name: \"Start\",\r\n fieldName: \"Start\",\r\n minWidth: 80,\r\n maxWidth: 150,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.Start) {\r\n const date = new Date(item.Start);\r\n let dateStr = date.toLocaleDateString();\r\n if (window.innerWidth < 768) dateStr = dateStr.substr(0, 5);\r\n return dateStr + \" \" + date.toLocaleTimeString().substr(0,5);\r\n }\r\n }\r\n },\r\n {\r\n key: \"finish\",\r\n name: \"Finish\",\r\n fieldName: \"Finish\",\r\n minWidth: 80,\r\n maxWidth: 150,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.Finish) {\r\n const date = new Date(item.Finish);\r\n let dateStr = date.toLocaleDateString();\r\n if (window.innerWidth < 768) dateStr = dateStr.substr(0, 5);\r\n return dateStr + \" \" + date.toLocaleTimeString().substr(0,5);\r\n }\r\n }\r\n },\r\n {\r\n key: \"parking\",\r\n name: \"Parking\",\r\n fieldName: \"IncludeParking\",\r\n iconName: \"ParkingSolid\",\r\n isIconOnly: true,\r\n minWidth: 40,\r\n maxWidth: 40,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.IncludeParking) {\r\n return \r\n \r\n ;\r\n }\r\n }\r\n },\r\n {\r\n key: \"directions\",\r\n name: \"Directions\",\r\n fieldName: \"PostCode\",\r\n iconName: \"MapDirections\",\r\n isIconOnly: true,\r\n minWidth: 40,\r\n maxWidth: 40,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.PostCode) {\r\n return \r\n \r\n \r\n }\r\n }\r\n }\r\n ]}\r\n selection={selection}\r\n selectionMode={SelectionMode.multiple}\r\n />\r\n // \r\n // \r\n // \r\n ]}\r\n { (bookings === undefined || bookings.length === 0) &&(\r\n No bookings found for the search options chosen above.\r\n )}\r\n { showDialog && (\r\n {\r\n if (cancel) {\r\n _cancelBulkBookings(selectedBookings, cancelReason);\r\n setShowDialog(false);\r\n } else {\r\n setShowDialog(false);\r\n }\r\n }}\r\n />\r\n )} \r\n
\r\n );\r\n}\r\n","import { DatePicker, DefaultButton, Dropdown, IDropdownOption, IDropdownStyles, IconButton, Panel, PanelType, PrimaryButton, Spinner, Stack } from \"office-ui-fabric-react\";\r\nimport { useEffect } from \"react\";\r\nimport { useState } from \"react\";\r\nimport { Line } from \"react-chartjs-2\";\r\nimport { getTagsByType } from \"../../../api/tagging\";\r\nimport { TagType } from \"../../../types/Tagging.types\";\r\n\r\nexport interface IReportingProps {\r\n onDismiss: () => void;\r\n}\r\n\r\nconst tagDropdownStyles: Partial = { dropdown: { width: 200 } };\r\n\r\nconst defaultStartDate = new Date();\r\ndefaultStartDate.setDate(1);\r\ndefaultStartDate.setHours(0);\r\ndefaultStartDate.setMinutes(0);\r\ndefaultStartDate.setSeconds(0);\r\ndefaultStartDate.setMilliseconds(0);\r\nconst defaultEndDate = new Date(defaultStartDate.getTime());\r\ndefaultEndDate.setMonth(defaultStartDate.getMonth() + 1);\r\ndefaultEndDate.setDate(defaultEndDate.getDate() - 1);\r\n\r\nexport const Reporting = (props: IReportingProps) => {\r\n\r\n const [ startDate, setStartDate ] = useState(defaultStartDate);\r\n const [ endDate, setEndDate ] = useState(defaultEndDate);\r\n const [ filterType, setFilterType ] = useState(\"all\");\r\n const [ chartTitle, setChartTitle ] = useState(\"All Desk and Room Bookings\");\r\n const [ tagOptions, setTagOptions ] = useState([]);\r\n const [ selectedTag, setSelectedTag ] = useState();\r\n const [ loading, setLoading ] = useState(false);\r\n \r\n const [ chartData, setChartData ] = useState();\r\n\r\n const _load = async () => {\r\n const tagResponse = await getTagsByType(TagType.User);\r\n if (tagResponse.length) {\r\n const tagOptions:IDropdownOption[] = tagResponse.map((s) => {\r\n return {\r\n key: s.Id,\r\n text: s.Label\r\n }\r\n });\r\n setTagOptions(tagOptions);\r\n }\r\n } \r\n\r\n const _loadCountStats = async () => {\r\n setLoading(true);\r\n if (startDate && endDate) {\r\n let url = '';\r\n if (filterType == \"tag\" && selectedTag) {\r\n url = `/api/bookings/stats/filter/${filterType}/${selectedTag}/from/${encodeURIComponent(startDate.toISOString())}/to/${encodeURIComponent(endDate.toISOString())}`;\r\n } else {\r\n url = `/api/bookings/stats/filter/${filterType}/0/from/${encodeURIComponent(startDate.toISOString())}/to/${encodeURIComponent(endDate.toISOString())}`;\r\n }\r\n\r\n const response = await fetch(url);\r\n if (response.ok) {\r\n const bookingCounts = await response.json() as Record;\r\n const labels = Object.keys(bookingCounts);\r\n const counts = Object.entries(bookingCounts).map((e) => e[1]);\r\n const cData = {\r\n labels,\r\n datasets: [\r\n {\r\n label: '# of bookings',\r\n data: counts,\r\n fill: false,\r\n backgroundColor: 'rgb(255, 99, 132)',\r\n borderColor: 'rgba(255, 99, 132, 0.2)',\r\n }\r\n ]\r\n };\r\n setChartData(cData);\r\n setLoading(false);\r\n } else {\r\n setLoading(false);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n _load();\r\n _loadCountStats();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n _loadCountStats();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [startDate, endDate, filterType, selectedTag]);\r\n\r\n return (\r\n \r\n

Select a date range below to see a booking count for the period, use the export button to export booking data for the period as a .CSV file.

\r\n { if (date) setStartDate(date) }} />\r\n { if (date) setEndDate(date) }} />\r\n
\r\n
Filters:
\r\n {\r\n setFilterType(\"all\")\r\n setChartTitle(\"All Desk and Room Bookings\")\r\n setSelectedTag(null);\r\n }} />\r\n {\r\n setFilterType(\"desk\")\r\n setChartTitle(\"All Desk Bookings\")\r\n setSelectedTag(null);\r\n }} />\r\n {\r\n setFilterType(\"room\")\r\n setChartTitle(\"All Room Bookings\")\r\n setSelectedTag(null);\r\n }} />\r\n { \r\n if (option) {\r\n setFilterType(\"tag\")\r\n setChartTitle(\"All Bookings by \" + option.text)\r\n setSelectedTag(option.key as number)\r\n }\r\n }} /> \r\n
\r\n { loading === true && (\r\n \r\n )}\r\n

{chartTitle}

\r\n { loading === false && Boolean(chartData) === true && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}","import { DefaultButton, Dialog, PrimaryButton, Stack, TextField } from \"office-ui-fabric-react\";\r\nimport { useState } from \"react\";\r\nimport { editFloorplanMetadata } from \"../../../api/floorplans\";\r\nimport { IFloorplan } from \"../../../types/SiteLocation.types\";\r\n\r\nexport interface IFloorplanFormProps {\r\n floorplan: Partial;\r\n onDismiss: (reloadFloorplans?: boolean) => void;\r\n}\r\n\r\nexport const FloorplanForm = (props: IFloorplanFormProps) => {\r\n const [ name, setName ] = useState(props.floorplan.Name);\r\n\r\n const _editFloorplanData = async (floorplan: IFloorplan) => {\r\n const response = await editFloorplanMetadata(floorplan);\r\n if (response instanceof Error) {\r\n console.error(response);\r\n } else if (response.ok) {\r\n props.onDismiss(true);\r\n } \r\n };\r\n\r\n return (\r\n \r\n )\r\n}","import { DefaultButton, Dialog, PrimaryButton, Stack } from \"office-ui-fabric-react\"\r\nimport { useHistory } from \"react-router\"\r\nimport { newFloorplanLayoutFromBlank, newFloorplanLayoutFromPrevious } from \"../../../api/floorplans\";\r\nimport { IFloorplan, IFloorplanAddResult } from \"../../../types/SiteLocation.types\";\r\n\r\nexport interface INewLayoutDialogProps {\r\n floorplan: Partial;\r\n onDismiss: () => void;\r\n onError: (error: string) => void;\r\n}\r\n\r\nexport const NewLayoutDialog = (props: INewLayoutDialogProps) => {\r\n const history = useHistory();\r\n\r\n const _newLayout = async (floorplan: Partial, fromBlank: boolean) => {\r\n if (floorplan.Id) {\r\n const response = fromBlank ? await newFloorplanLayoutFromBlank(floorplan.Id) :\r\n await newFloorplanLayoutFromPrevious(floorplan.Id);\r\n if (response.ok) {\r\n const info = await response.json() as IFloorplanAddResult;\r\n history.push(`/admin/layoutEditor/floorplan/${info.floorplanId}/${info.layoutId}`);\r\n } else {\r\n props.onError(\"Unable to create new floorplan layout: \" + response.statusText);\r\n props.onDismiss();\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n )\r\n}","import { CommandBar, DetailsList, Panel, PanelType, Spinner, Selection, SelectionMode, MessageBar, MessageBarType } from \"office-ui-fabric-react\"\r\nimport { useEffect, useState } from \"react\";\r\nimport { createNewFloorplan, deleteFloorplan, loadFloorplansForLocation } from \"../../../api/floorplans\";\r\n// import { LocationFormPanel } from \"./LocationFormPanel\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { IFloorplan, IFloorplanAddResult } from \"../../../types/SiteLocation.types\"\r\nimport { FloorplanForm } from \"../forms/FloorplanForm\";\r\nimport { NewLayoutDialog } from \"./NewLayoutDialog\";\r\n\r\nexport interface IFloorplansPanelProps {\r\n onDismiss: () => void;\r\n locationId: number;\r\n}\r\n\r\nexport const FloorplansPanel = (props: IFloorplansPanelProps) => {\r\n const history = useHistory();\r\n\r\n const [ formData, setFormData ] = useState>();\r\n const [ floorplans, setFloorplans ] = useState[]>();\r\n const [ error, setError ] = useState();\r\n const [ loading, setLoading ] = useState(false);\r\n const [ floorplanSelected, setFloorplanSelected ] = useState(false);\r\n const [ showNewLayoutDialog, setShowNewLayoutDialog ] = useState>();\r\n\r\n const onSelectionChanged = () => {\r\n const selectedItems = selection.getSelection() as IFloorplan[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n setFloorplanSelected(true);\r\n } else {\r\n setFloorplanSelected(false);\r\n }\r\n };\r\n \r\n const [ selection ] = useState(new Selection({ onSelectionChanged }));\r\n\r\n const _loadFloorplans = async () => {\r\n setLoading(true);\r\n selection.setAllSelected(false);\r\n setFloorplanSelected(false);\r\n const locationsResponse = await loadFloorplansForLocation(props.locationId);\r\n if (locationsResponse.ok) {\r\n setFloorplans(await locationsResponse.json());\r\n } else {\r\n setError(\"Unable to load floorplans: \" + locationsResponse.statusText);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n const _newFloorplan = async () => {\r\n const response = await createNewFloorplan(props.locationId);\r\n if (response.ok) {\r\n const info = await response.json() as IFloorplanAddResult;\r\n history.push(`/admin/layoutEditor/floorplan/${info.floorplanId}/${info.layoutId}`);\r\n } else {\r\n setError(\"Unable to create new floorplan: \" + response.statusText);\r\n }\r\n };\r\n\r\n const _editFloorplanLayout = async (floorplan: IFloorplan) => {\r\n if (floorplan.FloorplanLayout) {\r\n const layout = floorplan.FloorplanLayout;\r\n if (layout.Published) {\r\n setShowNewLayoutDialog(floorplan);\r\n return;\r\n } else {\r\n history.push(`/admin/layoutEditor/floorplan/${floorplan.Id}/${layout.Id}`);\r\n }\r\n }\r\n };\r\n\r\n const _deleteFloorplan = async (id: string) => {\r\n const deleteResponse = await deleteFloorplan(id);\r\n if (deleteResponse.ok) {\r\n _loadFloorplans();\r\n } else {\r\n setError(\"Unable to delete floorplan: \" + deleteResponse.statusText)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n _loadFloorplans();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n { error !== undefined && (\r\n {error}\r\n )}\r\n

Maintain floorplans

\r\n

\r\n You can use this menu to work on draft floorplans, and use the floorplan editor to publish them.\r\n Published floorplans define visual layouts and desks that users can book using the system.\r\n

\r\n {\r\n _newFloorplan();\r\n }\r\n },\r\n {\r\n disabled: !floorplanSelected,\r\n key: \"rename\",\r\n text: \"Rename\",\r\n iconProps: { iconName: \"Rename\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as IFloorplan[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n setFormData(selectedItem as IFloorplan);\r\n }\r\n }\r\n },\r\n {\r\n disabled: !floorplanSelected,\r\n key: \"edit\",\r\n text: \"Edit Layout\",\r\n iconProps: { iconName: \"Edit\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as IFloorplan[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n _editFloorplanLayout(selectedItem);\r\n }\r\n }\r\n },\r\n {\r\n disabled: !floorplanSelected,\r\n key: \"delete\",\r\n text: \"Delete\",\r\n iconProps: { iconName: \"Delete\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as IFloorplan[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n if (window.confirm(\"Are you sure? Note: Please make sure there are no bookings active for this floor plan before deleting.\")) {\r\n _deleteFloorplan(selectedItem.Id);\r\n }\r\n }\r\n }\r\n }\r\n ]}\r\n />\r\n { loading === true && (\r\n \r\n )}\r\n { loading === false && floorplans !== undefined && floorplans.length > 0 && (\r\n {\r\n if (item.FloorplanLayout) {\r\n const layout = item.FloorplanLayout;\r\n if (!layout.Published) {\r\n return
Draft
\r\n }\r\n }\r\n }\r\n }\r\n ]}\r\n selection={selection}\r\n selectionMode={SelectionMode.single}\r\n />\r\n )}\r\n { formData !== undefined && (\r\n {\r\n setFormData(undefined);\r\n if (reloadFloorplans) {\r\n _loadFloorplans();\r\n }\r\n }} />\r\n )}\r\n { showNewLayoutDialog !== undefined && (\r\n setShowNewLayoutDialog(undefined)} onError={(err) => setError(err)} />\r\n )}\r\n
\r\n )\r\n}","import { PivotItem } from \"@fluentui/react\";\r\nimport { Checkbox, DefaultButton, IPersonaProps, MessageBar, MessageBarType, NormalPeoplePicker, Panel, PanelType, Pivot, PrimaryButton, Stack, TextField, Toggle } from \"office-ui-fabric-react\"\r\nimport { useCallback, useEffect, useState, useContext } from \"react\";\r\nimport { saveLocation } from \"../../../api/siteslocations\";\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport { IBookingConstraint } from \"../../../types/Booking.types\";\r\nimport { ILocation } from \"../../../types/SiteLocation.types\"\r\nimport Utils from \"../../../utils\";\r\nimport { RestrictionsSection, RestrictionUpdate } from \"./RestrictionsSection\";\r\n\r\nexport interface ILocationFormPanelProps {\r\n onDismiss: (reloadLocations?: boolean) => void;\r\n location: Partial;\r\n}\r\n\r\nexport const LocationFormPanel = (props: ILocationFormPanelProps) => {\r\n const { location } = props;\r\n\r\n const userContext = useContext(ProfileContext);\r\n\r\n const validForm = (title: string|undefined) => {\r\n return !(!title || title.trim() === \"\");\r\n };\r\n\r\n let initialLocationAdminUsers: IPersonaProps[] = [], initialLocationDeskAccessUsers: IPersonaProps[] = [];\r\n if (props.location.ResourceAdminUsers) {\r\n initialLocationAdminUsers = props.location.ResourceAdminUsers.filter((sau) => sau.AccessType === 1).map((user) => ({\r\n text: user.FullName,\r\n secondaryText: user.Email,\r\n data: {\r\n userId: user.Id\r\n }\r\n } as IPersonaProps));\r\n initialLocationDeskAccessUsers = props.location.ResourceAdminUsers.filter((sau) => sau.AccessType === 2).map((user) => ({\r\n text: user.FullName,\r\n secondaryText: user.Email,\r\n data: {\r\n userId: user.Id\r\n }\r\n } as IPersonaProps));\r\n }\r\n\r\n // Form variables\r\n const [ title, setTitle ] = useState(location.Title);\r\n const [ buildingNameNo, setBuildingNameNo ] = useState(location.BuildingNameNo);\r\n // const [ floor, setFloor ] = useState(location.Floor);\r\n\r\n // Booking constraints\r\n const [ deskConstraint, setDeskConstraint ] = useState(location.DeskBookingConstraint);\r\n const [ roomConstraint, setRoomConstraint ] = useState(location.RoomBookingConstraint);\r\n const [enableCheckIn, setEnableCheckIn] = useState(location.RoomCheckIns);\r\n\r\n // Booking approval / access\r\n const [ restrictRoomAccess, setRestrictRoomAccess ] = useState(location.RestrictRoomAccess);\r\n const [ restrictDeskAccess, setRestrictDeskAccess ] = useState(location.RestrictDeskAccess);\r\n const [ locationAdmins, setLocationAdmins ] = useState(initialLocationAdminUsers);\r\n const [ deskAccess, setDeskAccess ] = useState(initialLocationDeskAccessUsers);\r\n\r\n // Include teams in user searches\r\n const [roomIncludeTeams, setRoomIncludeTeams] = useState(false);\r\n const [deskIncludeTeams, setDeskIncludeTeams] = useState(false);\r\n\r\n // Form validation\r\n const [ error, setError ] = useState();\r\n const [ formValid, setFormValid ] = useState(validForm(title));\r\n\r\n const getTitleCasedValues = (obj: {[index: string]: any}) => {\r\n const returnObj: {[index: string]: any} = {};\r\n for (let key in obj) {\r\n const titleCasedKey = key.charAt(0).toUpperCase() + key.substr(1);\r\n returnObj[titleCasedKey] = obj[key]\r\n }\r\n return returnObj;\r\n };\r\n\r\n const _saveForm = async () => {\r\n const formValues = getTitleCasedValues({ title, buildingNameNo, restrictDeskAccess, restrictRoomAccess /*, floor*/ });\r\n const siteAdminUserIds = locationAdmins?.filter((sa) => Boolean((sa as any).data?.userId))?.map((sa: any) => sa.data.userId);\r\n const roomAdminTeamIds = locationAdmins?.filter((sa) => Boolean((sa as any).data?.teamId))?.map((sa: any) => sa.data.teamId);\r\n const deskAccessUserIds = deskAccess?.filter((da) => Boolean((da as any).data?.userId))?.map((sa: any) => sa.data.userId);\r\n const deskAccessTeamIds = deskAccess?.filter((da) => Boolean((da as any).data?.teamId))?.map((sa: any) => sa.data.teamId);\r\n const response = await saveLocation({\r\n ...location, \r\n ...formValues,\r\n RoomAdminUsers: siteAdminUserIds || [],\r\n DeskAccessUsers: deskAccessUserIds || [],\r\n RoomAdminTeams: roomAdminTeamIds || [],\r\n DeskAccessTeams: deskAccessTeamIds || [],\r\n BookingConstraints: [deskConstraint, roomConstraint].filter((bc) => Boolean(bc)),\r\n RoomCheckIns: enableCheckIn\r\n } as ILocation);\r\n if (response.ok) {\r\n if (userContext) {\r\n if (\r\n (siteAdminUserIds && siteAdminUserIds.find((sa) => sa === userContext.Profile.Id)) ||\r\n (deskAccessUserIds && deskAccessUserIds.find((sa) => sa === userContext.Profile.Id))\r\n ) {\r\n const abortController = new AbortController();\r\n userContext.onProfileUpdated(abortController);\r\n }\r\n }\r\n props.onDismiss(true);\r\n } else {\r\n setError(\"Unable to save location: \" + response.statusText);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n setFormValid(validForm(title));\r\n }, [title]);\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const mapUserToPersona = useCallback(Utils.mapToPersona, []);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const roomUserSearch = useCallback(Utils.userSearch(roomIncludeTeams), [mapUserToPersona, roomIncludeTeams]);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const deskUserSearch = useCallback(Utils.userSearch(deskIncludeTeams), [mapUserToPersona, deskIncludeTeams]);\r\n\r\n return (\r\n props.onDismiss()}\r\n headerText={location.Id === undefined ? 'New Location' : `Edit Location: ${props.location.Title || \"\"}`}\r\n onRenderFooter={() => \r\n { _saveForm() }} style={{marginRight: 20}} />\r\n { props.onDismiss(false) }} />\r\n }\r\n >\r\n \r\n \r\n { error !== undefined && (\r\n {error}\r\n )}\r\n setTitle(newValue)} errorMessage={!formValid ? \"Title is mandatory\" : undefined} />\r\n setBuildingNameNo(newValue)} />\r\n {/* setFloor(newValue)} /> */}\r\n \r\n \r\n {\r\n setDeskConstraint(constraints.deskBookingConstraint);\r\n setRoomConstraint(constraints.roomBookingConstraint);\r\n setEnableCheckIn(checkIn);\r\n }}\r\n updateType={RestrictionUpdate.Location}\r\n deskBookingConstraint={deskConstraint}\r\n roomBookingConstraint={roomConstraint}\r\n roomCheckIn={enableCheckIn}\r\n />\r\n \r\n \r\n {\r\n if (!checked && window.confirm('This will remove all room booking restrictions, allowing all users to book rooms. Restriction settings saved for individual users will be lost. Are you sure?')) setRestrictRoomAccess(checked);\r\n if (checked) setRestrictRoomAccess(checked);\r\n }} />\r\n { restrictRoomAccess === true && (\r\n \r\n setLocationAdmins(items)}\r\n />\r\n setRoomIncludeTeams(checked)}/>\r\n \r\n )}\r\n {\r\n if (!checked && window.confirm('This will remove all desk access restrictions, allowing all users to book desks. Restriction settings saved for individual users will be lost. Are you sure?')) setRestrictDeskAccess(checked);\r\n if (checked) setRestrictDeskAccess(checked);\r\n }} />\r\n { restrictDeskAccess === true && (\r\n \r\n setDeskAccess(items)}\r\n />\r\n setDeskIncludeTeams(checked)}/>\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n}","import { IRoom, RoomType } from \"../types/SiteLocation.types\";\r\nimport apiFetch from './index';\r\n\r\nexport async function saveRoom(room: IRoom) {\r\n let url = '/api/rooms';\r\n if (room.Id !== undefined && room.Id !== -1) {\r\n url += `/${room.Id}`;\r\n }\r\n return await apiFetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(room),\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type' : 'application/json'\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function deleteRoom(id: number) {\r\n return await apiFetch(`/api/rooms/${id}`, {\r\n method: 'DELETE',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getRoom(id: number) {\r\n return await apiFetch(`/api/rooms/${id}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getCheckInRoomInfo(id: number) {\r\n return await apiFetch(`/api/rooms/${id}/check-in-info`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function getRoomInfo(id: number) {\r\n return await apiFetch(`/api/rooms/${id}/info`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n}\r\n\r\nexport async function loadRooms() {\r\n const response = await apiFetch('/api/rooms', {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n return response;\r\n}\r\n\r\nexport async function loadRoomsByApprover() {\r\n const response = await apiFetch(`/api/rooms/byApprover`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include'\r\n });\r\n return response;\r\n}\r\n\r\nexport async function loadRoomsBySite(roomType: RoomType, id: number, abortController?: AbortController) {\r\n const response = await apiFetch(`/api/rooms/site/${id}/${roomType}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n signal: abortController?.signal\r\n });\r\n return response;\r\n}\r\n\r\nexport async function loadRoomsByLocation(roomType: RoomType, id: number, abortController?: AbortController) {\r\n const response = await apiFetch(`/api/rooms/location/${id}/${roomType}`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n signal: abortController?.signal\r\n });\r\n return response;\r\n}\r\n\r\nexport async function loadRoomsByLocationInclDisabled(id: number, abortController?: AbortController) {\r\n const response = await apiFetch(`/api/rooms/location/${id}/includeDisabled`, {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n credentials: 'include',\r\n signal: abortController?.signal\r\n });\r\n return response;\r\n}\r\n\r\nexport async function getRoomAvailability(params: {\r\n fromDate: Date, toDate: Date, roomType: RoomType, siteId?: number; locationId?: number; minCapacity?: number;\r\n}, abortController: AbortController) {\r\n const response = await apiFetch(`/api/rooms/availability`, {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(params),\r\n credentials: 'include',\r\n method: 'POST',\r\n signal: abortController.signal\r\n });\r\n return response;\r\n}\r\n\r\nexport async function getRoomBookings(params: {\r\n roomId: number, fromDate: Date, toDate: Date\r\n}, abortController: AbortController) {\r\n const response = await apiFetch(`/api/bookings/searchRooms`, {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(params),\r\n credentials: 'include',\r\n method: 'POST',\r\n signal: abortController.signal\r\n });\r\n return response;\r\n}\r\n\r\nexport async function getSiteRoomBookings(params: {\r\n siteId: number, fromDate: Date, toDate: Date\r\n}, abortController: AbortController) {\r\n const response = await apiFetch(`/api/bookings/searchRooms`, {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(params),\r\n credentials: 'include',\r\n method: 'POST',\r\n signal: abortController.signal\r\n });\r\n return response;\r\n}","import { Checkbox, DefaultButton, IPersonaProps, MessageBar, MessageBarType, NormalPeoplePicker, Panel, PanelType, Pivot, PivotItem, PrimaryButton, Stack, TextField, Toggle } from \"office-ui-fabric-react\"\r\nimport { useCallback, useContext, useEffect, useMemo, useState } from \"react\";\r\nimport { saveRoom } from \"../../../api/rooms\";\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport { IBookingConstraint } from \"../../../types/Booking.types\";\r\nimport { IRoom } from \"../../../types/SiteLocation.types\"\r\nimport Utils from \"../../../utils\";\r\nimport { RestrictionsSection, RestrictionUpdate } from \"./RestrictionsSection\";\r\nimport QRCode from \"qrcode\";\r\nimport { Dropdown } from \"@fluentui/react\";\r\n\r\nexport interface IRoomFormPanelProps {\r\n onDismiss: (reloadLocations?: boolean) => void;\r\n room: Partial;\r\n asRoomApprover?: boolean;\r\n}\r\n\r\nexport const RoomFormPanel = (props: IRoomFormPanelProps) => {\r\n const { room, asRoomApprover } = props;\r\n\r\n const userContext = useContext(ProfileContext);\r\n\r\n const validForm = (title: string|undefined) => {\r\n return !(!title || title.trim() === \"\");\r\n };\r\n\r\n let initialSiteAdminUsers: IPersonaProps[] = [];\r\n if (room.ResourceAdminUsers) {\r\n initialSiteAdminUsers = room.ResourceAdminUsers.filter((sau) => sau.AccessType === 1).map((user) => ({\r\n text: user.FullName,\r\n secondaryText: user.Email,\r\n data: {\r\n userId: user.Id\r\n }\r\n } as IPersonaProps));\r\n }\r\n\r\n // Form variables\r\n const [ name, setName ] = useState(room.Name);\r\n const [ capacity, setCapacity ] = useState(room.Capacity);\r\n const [ equipment, setEquipment ] = useState(room.Equipment);\r\n const [ disabled, setDisabled ] = useState(room.Disabled);\r\n const [hidden, setHidden] = useState(room.Hidden);\r\n const [roomType, setRoomType] = useState(room.RoomType);\r\n\r\n // Include teams in user searches\r\n const [roomIncludeTeams, setRoomIncludeTeams] = useState(false);\r\n\r\n // Booking constraints\r\n const [roomConstraint, setRoomConstraint] = useState(room.RoomBookingConstraint);\r\n const [enableCheckIn, setEnableCheckIn] = useState(room.RoomCheckIns);\r\n\r\n // Booking approval / access\r\n const [ restrictRoomAccess, setRestrictRoomAccess ] = useState(room.RestrictRoomAccess);\r\n const [ roomAdmins, setRoomAdmins ] = useState(initialSiteAdminUsers);\r\n\r\n // Validation\r\n const [ error, setError ] = useState();\r\n const [ formValid, setFormValid ] = useState(validForm(name));\r\n\r\n // QR Code\r\n const [ qrCode, setQrCode ] = useState();\r\n\r\n const getTitleCasedValues = (obj: {[index: string]: any}) => {\r\n const returnObj: {[index: string]: any} = {};\r\n for (let key in obj) {\r\n const titleCasedKey = key.charAt(0).toUpperCase() + key.substr(1);\r\n returnObj[titleCasedKey] = obj[key]\r\n }\r\n return returnObj;\r\n };\r\n\r\n const _saveForm = async () => {\r\n const formValues = getTitleCasedValues({ name, roomType, capacity, equipment, hidden, disabled, restrictRoomAccess });\r\n const roomAdminUserIds = roomAdmins?.filter((sa) => Boolean((sa as any).data?.userId))?.map((sa: any) => sa.data.userId);\r\n const roomAdminTeamIds = roomAdmins?.filter((sa) => Boolean((sa as any).data?.teamId))?.map((sa: any) => sa.data.teamId);\r\n const response = await saveRoom({\r\n ...room, \r\n ...formValues,\r\n RoomAdminUsers: roomAdminUserIds || [],\r\n RoomAdminTeams: roomAdminTeamIds || [],\r\n BookingConstraints: [roomConstraint].filter((bc) => Boolean(bc)),\r\n RoomCheckIns: enableCheckIn\r\n } as IRoom);\r\n if (response.ok) {\r\n if (userContext) {\r\n if (\r\n roomAdminUserIds && roomAdminUserIds.find((sa) => sa === userContext.Profile.Id)\r\n ) {\r\n const abortController = new AbortController();\r\n userContext.onProfileUpdated(abortController);\r\n }\r\n }\r\n props.onDismiss(true);\r\n } else {\r\n setError(\"Unable to save room: \" + response.statusText);\r\n }\r\n };\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const mapUserToPersona = useCallback(Utils.mapToPersona, []);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const roomUserSearch = useCallback(Utils.userSearch(roomIncludeTeams), [mapUserToPersona, roomIncludeTeams]);\r\n\r\n useEffect(() => {\r\n setFormValid(validForm(name));\r\n }, [name]);\r\n\r\n useEffect(() => {\r\n const roomName = room.Name?.replace(/[^a-zA-Z0-9\\s]/g, '').replace(/\\s+/g, '-');\r\n QRCode.toDataURL(`${window.location.protocol}//${window.location.host}/check-in/${room.SiteId}/${room.LocationId}/${room.Id}?rn=${roomName}`).then((code) => {\r\n setQrCode(code);\r\n });\r\n }, [room.Id, room.Name, room.LocationId, room.SiteId]);\r\n\r\n return (\r\n props.onDismiss()}\r\n headerText={room.Id === undefined ? 'New Room' : `Edit Room: ${props.room.Name || \"\"}`}\r\n onRenderFooter={() => \r\n { _saveForm() }} style={{marginRight: 20}} />\r\n { props.onDismiss(false) }} />\r\n }\r\n >\r\n \r\n \r\n { error !== undefined && (\r\n {error}\r\n )}\r\n setName(newValue)} errorMessage={!formValid ? \"Room Name is mandatory\" : undefined} />\r\n {\r\n if (option) {\r\n setRoomType(option.key as number);\r\n } else {\r\n setRoomType(undefined);\r\n }\r\n }} />\r\n {\r\n if (newValue) {\r\n const numVal = parseInt(newValue, 10);\r\n setCapacity(numVal);\r\n } else if (newValue === undefined || newValue.trim() === \"\") {\r\n setCapacity(undefined);\r\n }\r\n }} />\r\n setEquipment(newValue)} />\r\n setDisabled(checked)} />\r\n setHidden(checked)} />\r\n \r\n \r\n {\r\n setRoomConstraint(constraints.roomBookingConstraint);\r\n setEnableCheckIn(checkIn);\r\n }}\r\n updateType={RestrictionUpdate.Site}\r\n roomBookingConstraint={roomConstraint}\r\n roomCheckIn={enableCheckIn}\r\n />\r\n \r\n \r\n {\r\n if (!checked && window.confirm('This will remove all room booking restrictions, allowing all users to book rooms. Restriction settings saved for individual users will be lost. Are you sure?')) setRestrictRoomAccess(checked);\r\n if (checked) setRestrictRoomAccess(checked);\r\n }} />\r\n { restrictRoomAccess === true && (\r\n \r\n {\r\n if (userContext?.Profile.Id) {\r\n if (\r\n roomAdmins?.find((sa: any) => sa.data.userId === userContext.Profile.Id) && \r\n !items?.find((sa: any) => sa.data.userId === userContext.Profile.Id)\r\n ) {\r\n alert('You cannot remove yourself from the room approval role. Please contact the system administrator if you should no longer be a room approver');\r\n return;\r\n }\r\n }\r\n setRoomAdmins(items);\r\n }}\r\n />\r\n setRoomIncludeTeams(checked)}/>\r\n \r\n )}\r\n \r\n \r\n { room.Id === undefined && (\r\n Save the room details to generate a QR code\r\n )}\r\n { room.Id !== undefined && (\r\n \r\n
\"QR
\r\n
\r\n

QR Code:

\r\n

This QR code can be used to check in to this room.

\r\n

Download it for use in print:

\r\n {\r\n if (qrCode) {\r\n const a = document.createElement('a');\r\n a.href = qrCode;\r\n const name = `${room.SiteName?.replace(/\\s/,'-')}_${room.LocationName?.replace(/\\s/,'-')}_${room.Name?.replace(/\\s/,'-')}_qr_code.png`\r\n a.download = `${name || \"room\"}-qr-code.png`;\r\n a.click();\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 { IRoom } from \"../../../types/SiteLocation.types\";\r\nimport { DefaultButton, Dialog, DialogFooter, PrimaryButton, Stack } from \"office-ui-fabric-react\";\r\nimport QRCode from \"qrcode\";\r\n\r\nexport interface IRoomQRCodeDialogProps {\r\n room: Partial;\r\n onDismiss: () => void;\r\n}\r\n\r\nconst RoomQRCodeDialog = (props: IRoomQRCodeDialogProps) => {\r\n const { room, onDismiss } = props;\r\n const [ qrCode, setQrCode ] = React.useState();\r\n\r\n React.useEffect(() => {\r\n const roomName = room.Name?.replace(/[^a-zA-Z0-9\\s]/g, '').replace(/\\s+/g, '-');\r\n QRCode.toDataURL(`${window.location.protocol}//${window.location.host}/check-in/${room.SiteId}/${room.LocationId}/${room.Id}?rn=${roomName}`).then((code) => {\r\n setQrCode(code);\r\n });\r\n }, [room.Id, room.Name, room.LocationId, room.SiteId]);\r\n\r\n if (!room) return null;\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default RoomQRCodeDialog;","import { CommandBar, DetailsList, Panel, PanelType, Spinner, Selection, SelectionMode, MessageBar, MessageBarType, ActionButton, IColumn, IconButton, TooltipHost, IDetailsColumnProps, Dialog } from \"office-ui-fabric-react\"\r\nimport { useEffect, useState } from \"react\";\r\nimport { Route, RouteComponentProps, useHistory } from \"react-router\";\r\nimport { deleteRoom, loadRoomsByLocationInclDisabled } from \"../../../api/rooms\";\r\nimport { FloorplansPanel } from \"./FloorplansPanel\";\r\nimport { RoomFormPanel } from \"../forms/RoomFormPanel\";\r\nimport { IRoom } from \"../../../types/SiteLocation.types\"\r\nimport RoomQRCodeDialog from \"./RoomQRCodeDialog\";\r\n\r\nexport interface IRoomsPanelProps {\r\n onDismiss: () => void;\r\n siteId: number;\r\n locationId: number;\r\n}\r\n\r\nexport const RoomsPanel = (props: IRoomsPanelProps) => {\r\n const { siteId, locationId, onDismiss } = props;\r\n const history = useHistory();\r\n\r\n const [ rooms, setRooms ] = useState[]>();\r\n const [ error, setError ] = useState();\r\n const [ loading, setLoading ] = useState(false);\r\n const [ locationSelected, setLocationSelected ] = useState(false);\r\n const [ showQR, setShowQR ] = useState>();\r\n\r\n const onSelectionChanged = () => {\r\n const selectedItems = selection.getSelection() as IRoom[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n setLocationSelected(true);\r\n } else {\r\n setLocationSelected(false);\r\n }\r\n };\r\n \r\n const [ selection ] = useState(new Selection({ onSelectionChanged }));\r\n\r\n const _loadRooms = async () => {\r\n setLoading(true);\r\n selection.setAllSelected(false);\r\n setLocationSelected(false);\r\n const locationsResponse = await loadRoomsByLocationInclDisabled(props.locationId);\r\n if (locationsResponse.ok) {\r\n setRooms(await locationsResponse.json());\r\n } else {\r\n setError(\"Unable to load rooms: \" + locationsResponse.statusText);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n const _deleteRoom = async (id: number) => {\r\n const deleteResponse = await deleteRoom(id);\r\n if (deleteResponse.ok) {\r\n _loadRooms();\r\n } else {\r\n setError(\"Unable to delete room: \" + deleteResponse.statusText)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n _loadRooms();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n { error !== undefined && (\r\n {error}\r\n )}\r\n

Create or edit rooms

\r\n

\r\n Using the interface below - you can create, edit and enable/disable meeting rooms\r\n

\r\n history.push(`/menu/settings/sites/${siteId}/locations/${locationId}/rooms/new`)\r\n },\r\n {\r\n disabled: !locationSelected,\r\n key: \"edit\",\r\n text: \"Edit\",\r\n iconProps: { iconName: \"Edit\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as IRoom[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n history.push(`/menu/settings/sites/${siteId}/locations/${locationId}/rooms/${selectedItem.Id}/edit`);\r\n }\r\n }\r\n },\r\n {\r\n disabled: !locationSelected,\r\n key: \"delete\",\r\n text: \"Delete\",\r\n iconProps: { iconName: \"Delete\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as IRoom[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n if (window.confirm(\"Are you sure? Note: Please make sure there are no bookings active for this room before deleting.\")) {\r\n _deleteRoom(selectedItem.Id);\r\n }\r\n }\r\n }\r\n }\r\n ]}\r\n />\r\n { loading === true && (\r\n \r\n )}\r\n { loading === false && rooms !== undefined && rooms.length > 0 && (\r\n (a?.Name || \"\") < (b?.Name || \"\") ? -1 : 1)}\r\n columns={[\r\n {\r\n key: \"name\",\r\n fieldName: \"Name\",\r\n name: \"Name\",\r\n minWidth: 40\r\n },\r\n {\r\n key: \"qrCode\",\r\n fieldName: \"ID\",\r\n name: \"QR\",\r\n onRenderHeader: (colProps, defaultRenderer): JSX.Element => {\r\n return (\r\n \r\n {defaultRenderer ? defaultRenderer(colProps) : {colProps?.column.name}}\r\n \r\n )\r\n },\r\n minWidth: 40,\r\n maxWidth: 40,\r\n onRender: (item: IRoom, index?: number, column?: IColumn) => {\r\n return (\r\n \r\n {\r\n setShowQR(item);\r\n }} />\r\n \r\n )\r\n }\r\n },\r\n {\r\n key: \"disabled\",\r\n fieldName: \"Disabled\",\r\n name: \"Disabled\",\r\n isIconOnly: true,\r\n iconName: \"AlertSettings\",\r\n minWidth: 40,\r\n onRender: (item: IRoom, index?: number, column?: IColumn) => {\r\n if (!item.Disabled) return null;\r\n return (\r\n \r\n {\r\n history.push(`/menu/settings/sites/${item.SiteId}/locations/${item.LocationId}/rooms/${item.Id}/edit`);\r\n }} />\r\n \r\n )\r\n }\r\n }\r\n ]}\r\n selection={selection}\r\n selectionMode={SelectionMode.single}\r\n />\r\n )}\r\n { showQR !== undefined && (\r\n setShowQR(undefined)} />\r\n )}\r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.siteId) && !Number.isNaN(Number(route.match.params.locationId)))) {\r\n return {\r\n history.goBack();\r\n if (reloadLocations) {\r\n _loadRooms();\r\n }\r\n }} />;\r\n }\r\n return null;\r\n }} />\r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.roomId))) {\r\n const matchingRoom = rooms?.filter((l) => l.Id === Number(route.match.params.roomId))[0];\r\n if (matchingRoom) {\r\n return {\r\n history.goBack();\r\n if (reloadLocations) {\r\n _loadRooms();\r\n }\r\n }} />\r\n }\r\n }\r\n return null;\r\n }} />\r\n
\r\n )\r\n}","import { CommandBar, DetailsList, Panel, PanelType, Spinner, Selection, SelectionMode, MessageBar, MessageBarType, ActionButton, IColumn } from \"office-ui-fabric-react\"\r\nimport { useEffect, useState } from \"react\";\r\nimport { Route, RouteComponentProps, useHistory } from \"react-router\";\r\nimport { deleteLocation, loadLocations } from \"../../../api/siteslocations\";\r\nimport { FloorplansPanel } from \"./FloorplansPanel\";\r\nimport { LocationFormPanel } from \"../forms/LocationFormPanel\";\r\nimport { ILocation } from \"../../../types/SiteLocation.types\"\r\nimport { RoomsPanel } from \"./RoomsPanel\";\r\n\r\nexport interface ILocationsPanelProps {\r\n onDismiss: () => void;\r\n siteId: number;\r\n}\r\n\r\nexport const LocationsPanel = (props: ILocationsPanelProps) => {\r\n const { siteId, onDismiss } = props;\r\n const history = useHistory();\r\n\r\n const [ locations, setLocations ] = useState[]>();\r\n const [ error, setError ] = useState();\r\n const [ loading, setLoading ] = useState(false);\r\n const [ locationSelected, setLocationSelected ] = useState(false);\r\n\r\n const onSelectionChanged = () => {\r\n const selectedItems = selection.getSelection() as ILocation[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n setLocationSelected(true);\r\n } else {\r\n setLocationSelected(false);\r\n }\r\n };\r\n \r\n const [ selection ] = useState(new Selection({ onSelectionChanged }));\r\n\r\n const _loadLocations = async () => {\r\n setLoading(true);\r\n selection.setAllSelected(false);\r\n setLocationSelected(false);\r\n const locationsResponse = await loadLocations(props.siteId);\r\n if (locationsResponse.ok) {\r\n setLocations(await locationsResponse.json());\r\n } else {\r\n setError(\"Unable to load locations: \" + locationsResponse.statusText);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n const _deleteLocation = async (id: number) => {\r\n const deleteResponse = await deleteLocation(id);\r\n if (deleteResponse.ok) {\r\n _loadLocations();\r\n } else {\r\n setError(\"Unable to delete location: \" + deleteResponse.statusText)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n _loadLocations();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n { error !== undefined && (\r\n {error}\r\n )}\r\n

Create or edit on-site locations

\r\n

\r\n Locations might be buildings, annexes or floors within buildings; any area you can create a floorplan for.\r\n

\r\n history.push(`/menu/settings/sites/${siteId}/locations/new`)\r\n },\r\n {\r\n disabled: !locationSelected,\r\n key: \"edit\",\r\n text: \"Edit\",\r\n iconProps: { iconName: \"Edit\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as ILocation[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n history.push(`/menu/settings/sites/${siteId}/locations/${selectedItem.Id}/edit`);\r\n }\r\n }\r\n },\r\n {\r\n disabled: !locationSelected,\r\n key: \"delete\",\r\n text: \"Delete\",\r\n iconProps: { iconName: \"Delete\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as ILocation[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n if (window.confirm(\"Are you sure? Note: Please make sure there are no bookings active for this location before deleting.\")) {\r\n _deleteLocation(selectedItem.Id);\r\n }\r\n }\r\n }\r\n }\r\n ]}\r\n />\r\n { loading === true && (\r\n \r\n )}\r\n { loading === false && locations !== undefined && locations.length > 0 && (\r\n {\r\n return {\r\n history.push(`/menu/settings/sites/${item.SiteId}/locations/${item.Id}/rooms`);\r\n }} />\r\n }\r\n },\r\n {\r\n key: \"editFloorplans\",\r\n fieldName: \"ID\",\r\n name: \"Floorplans\",\r\n minWidth: 130,\r\n onRender: (item: ILocation, index?: number, column?: IColumn) => {\r\n return {\r\n history.push(`/menu/settings/sites/${item.SiteId}/locations/${item.Id}/floorplans`);\r\n }} />\r\n }\r\n },\r\n \r\n ]}\r\n selection={selection}\r\n selectionMode={SelectionMode.single}\r\n />\r\n )}\r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.siteId)) && !Number.isNaN(Number(route.match.params.locationId))) {\r\n return history.goBack()} />;\r\n }\r\n return null;\r\n }} />\r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.locationId))) {\r\n return history.goBack()} />;\r\n }\r\n return null;\r\n }} />\r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.siteId))) {\r\n return {\r\n history.goBack();\r\n if (reloadLocations) {\r\n _loadLocations();\r\n }\r\n }} />;\r\n }\r\n return null;\r\n }} />\r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.locationId))) {\r\n const matchingSite = locations?.filter((l) => l.Id === Number(route.match.params.locationId))[0];\r\n if (matchingSite) {\r\n return {\r\n history.goBack();\r\n if (reloadLocations) {\r\n _loadLocations();\r\n }\r\n }} />\r\n }\r\n }\r\n return null;\r\n }} />\r\n
\r\n )\r\n}","import { Checkbox, ChoiceGroup, DefaultButton, IPersonaProps, Label, MessageBar, MessageBarType, NormalPeoplePicker, Panel, PanelType, Pivot, PivotItem, PrimaryButton, Stack, TextField, Toggle } from \"office-ui-fabric-react\"\r\nimport { useCallback, useContext, useEffect, useState } from \"react\";\r\nimport { saveSite } from \"../../../api/siteslocations\";\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport { IBookingConstraint } from \"../../../types/Booking.types\";\r\nimport { ISite } from \"../../../types/SiteLocation.types\"\r\nimport Utils from \"../../../utils\";\r\nimport { RestrictionsSection, RestrictionUpdate } from \"./RestrictionsSection\";\r\n\r\nexport interface ISiteFormPanelProps {\r\n onDismiss: (reloadSites?: boolean) => void;\r\n site: Partial;\r\n}\r\n\r\nexport const SiteFormPanel = (props: ISiteFormPanelProps) => {\r\n const { site } = props;\r\n\r\n const userContext = useContext(ProfileContext);\r\n\r\n const validForm = (title: string|undefined) => {\r\n return !(!title || title.trim() === \"\");\r\n };\r\n\r\n let initialSiteAdminUsers: IPersonaProps[] = [], initialDeskAccessUsers: IPersonaProps[] = [];\r\n if (props.site.ResourceAdminUsers && props.site.ResourceAdminTeams) {\r\n initialSiteAdminUsers.push(...props.site.ResourceAdminUsers.filter((sau) => sau.AccessType === 1).map((user) => ({\r\n text: user.FullName,\r\n secondaryText: user.Email,\r\n data: {\r\n userId: user.Id\r\n }\r\n } as IPersonaProps)));\r\n initialSiteAdminUsers.push(...props.site.ResourceAdminTeams.filter((sau) => sau.AccessType === 1).map((team) => ({\r\n text: team.Name,\r\n secondaryText: \"(Team)\",\r\n data: {\r\n teamId: team.Id\r\n }\r\n } as IPersonaProps)));\r\n initialDeskAccessUsers.push(...props.site.ResourceAdminUsers.filter((sau) => sau.AccessType === 2).map((user) => ({\r\n text: user.FullName,\r\n secondaryText: user.Email,\r\n data: {\r\n userId: user.Id\r\n }\r\n } as IPersonaProps)));\r\n initialDeskAccessUsers.push(...props.site.ResourceAdminTeams.filter((sau) => sau.AccessType === 2).map((team) => ({\r\n text: team.Name,\r\n secondaryText: \"(Team)\",\r\n data: {\r\n teamId: team.Id\r\n }\r\n } as IPersonaProps)));\r\n }\r\n\r\n // Form variables\r\n const [ title, setTitle ] = useState(site.Title);\r\n const [ address, setAddress ] = useState(site.Address);\r\n const [ description, setDescription ] = useState(site.Description);\r\n const [ postCode, setPostCode ] = useState(site.PostCode);\r\n const [ siteLevelParking, setSiteLevelParking ] = useState(site.SiteLevelParking);\r\n const [ parkingSpaces, setParkingSpaces ] = useState(site.ParkingSpaces);\r\n const [ notes, setNotes ] = useState(site.Notes);\r\n const [ notificationEmail, setNotificationEmail ] = useState(site.NotificationEmail);\r\n const [ roomBookingEnabled, setRbEnabled ] = useState(site.RoomBookingEnabled);\r\n const [ deskBookingEnabled, setDbEnabled ] = useState(site.DeskBookingEnabled);\r\n const [ workWeekOnly, setWorkWeekOnly ] = useState(site.WorkWeekOnly);\r\n\r\n // Include teams in user searches\r\n const [roomIncludeTeams, setRoomIncludeTeams] = useState(false);\r\n const [deskIncludeTeams, setDeskIncludeTeams] = useState(false);\r\n\r\n // Booking constraints\r\n const [ deskConstraint, setDeskConstraint ] = useState(site.DeskBookingConstraint);\r\n const [ roomConstraint, setRoomConstraint ] = useState(site.RoomBookingConstraint);\r\n const [ enableCheckIn, setEnableCheckIn ] = useState(site.RoomCheckIns);\r\n\r\n // Booking approval / access\r\n const [ restrictRoomAccess, setRestrictRoomAccess ] = useState(site.RestrictRoomAccess);\r\n const [ restrictDeskAccess, setRestrictDeskAccess ] = useState(site.RestrictDeskAccess);\r\n const [ siteAdmins, setSiteAdmins ] = useState(initialSiteAdminUsers);\r\n const [ deskAccess, setDeskAccess ] = useState(initialDeskAccessUsers);\r\n\r\n // Validation\r\n const [ error, setError ] = useState();\r\n const [ formValid, setFormValid ] = useState(validForm(title));\r\n\r\n const getTitleCasedValues = (obj: {[index: string]: any}) => {\r\n const returnObj: {[index: string]: any} = {};\r\n for (let key in obj) {\r\n const titleCasedKey = key.charAt(0).toUpperCase() + key.substr(1);\r\n returnObj[titleCasedKey] = obj[key]\r\n }\r\n return returnObj;\r\n };\r\n\r\n const _saveForm = async () => {\r\n const formValues = getTitleCasedValues({ title, address, description, postCode, siteLevelParking, parkingSpaces, restrictDeskAccess, restrictRoomAccess, notes, notificationEmail, workWeekOnly, roomBookingEnabled, deskBookingEnabled });\r\n const siteAdminUserIds = siteAdmins?.filter((sa) => Boolean((sa as any).data?.userId))?.map((sa: any) => sa.data.userId);\r\n const roomAdminTeamIds = siteAdmins?.filter((sa) => Boolean((sa as any).data?.teamId))?.map((sa: any) => sa.data.teamId);\r\n const deskAccessUserIds = deskAccess?.filter((da) => Boolean((da as any).data?.userId))?.map((sa: any) => sa.data.userId);\r\n const deskAccessTeamIds = deskAccess?.filter((da) => Boolean((da as any).data?.teamId))?.map((sa: any) => sa.data.teamId);\r\n let emailSetting: string | undefined;\r\n if (Utils.isValidEmail(notificationEmail)) emailSetting = notificationEmail;\r\n\r\n const response = await saveSite({\r\n ...site, \r\n ...formValues, \r\n NotificationEmail: emailSetting,\r\n RoomAdminUsers: siteAdminUserIds || [],\r\n DeskAccessUsers: deskAccessUserIds || [],\r\n RoomAdminTeams: roomAdminTeamIds || [],\r\n DeskAccessTeams: deskAccessTeamIds || [],\r\n BookingConstraints: [deskConstraint, roomConstraint].filter((bc) => Boolean(bc)),\r\n RoomCheckIns: enableCheckIn\r\n } as ISite);\r\n if (response.ok) {\r\n if (userContext) {\r\n if (\r\n (siteAdminUserIds && siteAdminUserIds.find((sa) => sa === userContext.Profile.Id)) ||\r\n (deskAccessUserIds && deskAccessUserIds.find((sa) => sa === userContext.Profile.Id))\r\n ) {\r\n const abortController = new AbortController();\r\n userContext.onProfileUpdated(abortController);\r\n }\r\n }\r\n props.onDismiss(true);\r\n } else {\r\n setError(\"Unable to save site: \" + response.statusText);\r\n }\r\n };\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const mapUserToPersona = useCallback(Utils.mapToPersona, []);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const roomUserSearch = useCallback(Utils.userSearch(roomIncludeTeams), [mapUserToPersona, roomIncludeTeams]);\r\n const deskUserSearch = useCallback(Utils.userSearch(deskIncludeTeams), [mapUserToPersona, deskIncludeTeams]);\r\n \r\n\r\n useEffect(() => {\r\n setFormValid(validForm(title));\r\n }, [title]);\r\n\r\n return (\r\n props.onDismiss()}\r\n headerText={site.Id === undefined ? 'New Site' : `Edit Site: ${props.site.Title || \"\"}`}\r\n isFooterAtBottom={true}\r\n onRenderFooter={() => \r\n { _saveForm() }} style={{marginRight: 20}} />\r\n { props.onDismiss(false) }} />\r\n }\r\n >\r\n \r\n \r\n { error !== undefined && (\r\n {error}\r\n )}\r\n setTitle(newValue)} errorMessage={!formValid ? \"Title is mandatory\" : undefined} />\r\n setDescription(newValue)} />\r\n setAddress(newValue)} />\r\n setPostCode(newValue)} />\r\n { postCode !== undefined && postCode !== null && postCode.length >= 6 && (\r\n \r\n )}\r\n \r\n

If this entire site shares a single car park, enable Site Level Parking below.

\r\n setSiteLevelParking(checked)} />\r\n { siteLevelParking === true && (\r\n <>\r\n \r\n

Do not include reserved spaces - ie. for execs or other companies

\r\n {\r\n if (!newValue) { setParkingSpaces(0); return }\r\n const parsed = parseInt(newValue, 10);\r\n if (Number.isNaN(parsed)) { setParkingSpaces(0); return } \r\n setParkingSpaces(parsed);\r\n }} />\r\n \r\n )}\r\n
\r\n \r\n \r\n setRbEnabled(checked)} />\r\n setDbEnabled(checked)} />\r\n \r\n

If you need to notify users of any important information regarding the site, please enter the details here. This information will be presented to users when booking a desk/room:

\r\n setNotes(newVal)} />\r\n
\r\n \r\n {\r\n if (option) {\r\n setWorkWeekOnly(option.key === \"workWeekOnly\");\r\n }\r\n }}\r\n />\r\n {\r\n setDeskConstraint(constraints.deskBookingConstraint);\r\n setRoomConstraint(constraints.roomBookingConstraint);\r\n setEnableCheckIn(checkIn);\r\n }}\r\n updateType={RestrictionUpdate.Site}\r\n deskBookingConstraint={deskConstraint}\r\n roomBookingConstraint={roomConstraint}\r\n roomCheckIn={enableCheckIn}\r\n />\r\n \r\n \r\n {\r\n if (!checked && window.confirm('This will remove all room booking restrictions, allowing all users to book rooms. Restriction settings saved for individual users will be lost. Are you sure?')) {\r\n setRestrictRoomAccess(checked);\r\n setNotificationEmail(undefined);\r\n }\r\n if (checked) setRestrictRoomAccess(checked);\r\n }} />\r\n { restrictRoomAccess === true && (\r\n <>\r\n \r\n setSiteAdmins(items)}\r\n />\r\n setRoomIncludeTeams(checked)}/>\r\n \r\n \r\n )}\r\n {\r\n if (!checked && window.confirm('This will remove all desk access restrictions, allowing all users to book desks. Restriction settings saved for individual users will be lost. Are you sure?')) setRestrictDeskAccess(checked);\r\n if (checked) setRestrictDeskAccess(checked);\r\n }} />\r\n { restrictDeskAccess === true && (\r\n <>\r\n \r\n setDeskAccess(items)}\r\n />\r\n setDeskIncludeTeams(checked)}/>\r\n \r\n \r\n )}\r\n\r\n { restrictRoomAccess === true && (\r\n <>\r\n { Boolean(notificationEmail) === false && (\r\n Notifications for pending approvals can be sent to all users in the Restrict Room Booking setting above. To send to a single mailbox, enter the email address below:\r\n ) }\r\n setNotificationEmail(newVal)}\r\n errorMessage={Utils.isValidEmail(notificationEmail) ? undefined : 'Please enter a valid email'}\r\n />\r\n \r\n )}\r\n \r\n
\r\n
\r\n )\r\n}","import { CommandBar, DetailsList, Panel, PanelType, Spinner, Selection, SelectionMode, MessageBar, MessageBarType, ActionButton, IColumn } from \"office-ui-fabric-react\"\r\nimport { useEffect, useState } from \"react\";\r\nimport { Route, RouteComponentProps, useHistory } from \"react-router-dom\";\r\nimport { deleteSite, getSites } from \"../../../api/siteslocations\";\r\nimport { LocationsPanel } from \"./LocationsPanel\";\r\nimport { SiteFormPanel } from \"../forms/SiteFormPanel\";\r\nimport { ISite } from \"../../../types/SiteLocation.types\"\r\n\r\nexport interface ISitesPanelProps {\r\n onDismiss: () => void;\r\n}\r\n\r\nexport const SitesPanel = (props: ISitesPanelProps) => {\r\n const history = useHistory();\r\n\r\n const [ sites, setSites ] = useState[]>();\r\n const [ error, setError ] = useState();\r\n const [ loading, setLoading ] = useState(false);\r\n const [ siteSelected, setSiteSelected ] = useState(false);\r\n\r\n const onSelectionChanged = () => {\r\n const selectedItems = selection.getSelection() as ISite[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n setSiteSelected(true);\r\n } else {\r\n setSiteSelected(false);\r\n }\r\n };\r\n \r\n const [ selection ] = useState(new Selection({ onSelectionChanged }));\r\n\r\n const _loadSites = async () => {\r\n setLoading(true);\r\n selection.setAllSelected(false);\r\n setSiteSelected(false);\r\n const sitesResponse = await getSites();\r\n if (sitesResponse.ok) {\r\n setSites(await sitesResponse.json());\r\n } else {\r\n setError(\"Unable to load sites: \" + sitesResponse.statusText);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n const _deleteSite = async (id: number) => {\r\n const deleteResponse = await deleteSite(id);\r\n if (deleteResponse.ok) {\r\n _loadSites();\r\n } else {\r\n setError(\"Unable to delete site: \" + deleteResponse.statusText)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n _loadSites();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n { error !== undefined && (\r\n {error}\r\n )}\r\n

Create or edit new sites

\r\n

\r\n Sites are geographically disparate locations like Hospitals, Offices and other places that host desks \r\n or meeting rooms. Using this menu, you can create sites, on-site locations (such as buildings) and \r\n within those - floorplan layouts for desk booking.\r\n

\r\n history.push(\"/menu/settings/sites/new\")\r\n },\r\n {\r\n disabled: !siteSelected,\r\n key: \"edit\",\r\n text: \"Edit\",\r\n iconProps: { iconName: \"Edit\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as ISite[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n history.push(`/menu/settings/sites/${selectedItem.Id}/edit`);\r\n }\r\n }\r\n },\r\n {\r\n disabled: !siteSelected,\r\n key: \"delete\",\r\n text: \"Delete\",\r\n iconProps: { iconName: \"Delete\" },\r\n onClick: () => {\r\n const selectedItems = selection.getSelection() as ISite[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n const selectedItem = selectedItems[0];\r\n if (window.confirm(\"Are you sure? Note: Please make sure there are no bookings active for this site before deleting.\")) {\r\n _deleteSite(selectedItem.Id);\r\n }\r\n }\r\n }\r\n }\r\n ]}\r\n />\r\n { loading === true && (\r\n \r\n )}\r\n { loading === false && sites !== undefined && sites.length > 0 && (\r\n {\r\n return {\r\n history.push(`/menu/settings/sites/${item.Id}/locations`);\r\n }} />\r\n }\r\n }\r\n ]}\r\n selection={selection}\r\n selectionMode={SelectionMode.single}\r\n />\r\n )}\r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.id))) {\r\n return history.goBack()} />;\r\n }\r\n return null;\r\n }} />\r\n \r\n {\r\n history.goBack();\r\n if (reloadSites) {\r\n _loadSites();\r\n }\r\n }} />\r\n \r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.id))) {\r\n const matchingSite = sites?.filter((s) => s.Id === Number(route.match.params.id))[0];\r\n if (matchingSite) {\r\n return {\r\n history.goBack();\r\n if (reloadSites) {\r\n _loadSites();\r\n }\r\n }} />\r\n }\r\n }\r\n return null;\r\n }} />\r\n
\r\n )\r\n}","import { DetailsList, Panel, PanelType, Spinner, SelectionMode, MessageBar, MessageBarType, IColumn, PrimaryButton } from \"office-ui-fabric-react\"\r\nimport { useEffect, useState } from \"react\";\r\nimport { Route, RouteComponentProps, useHistory } from \"react-router\";\r\nimport { loadRoomsByApprover } from \"../../../api/rooms\";\r\nimport { RoomFormPanel } from \"../forms/RoomFormPanel\";\r\nimport { IRoom } from \"../../../types/SiteLocation.types\"\r\n\r\nexport interface IUpdateRoomDetailsProps {\r\n onDismiss: () => void;\r\n}\r\n\r\nexport const UpdateRoomDetails = (props: IUpdateRoomDetailsProps) => {\r\n const { onDismiss } = props;\r\n const history = useHistory();\r\n\r\n const [ rooms, setRooms ] = useState[]>();\r\n const [ error, setError ] = useState();\r\n const [ loading, setLoading ] = useState(false);\r\n\r\n const _loadRooms = async () => {\r\n setLoading(true);\r\n const locationsResponse = await loadRoomsByApprover();\r\n if (locationsResponse.ok) {\r\n setRooms(await locationsResponse.json());\r\n } else {\r\n setError(\"Unable to load rooms: \" + locationsResponse.statusText);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n \r\n\r\n useEffect(() => {\r\n _loadRooms();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n { error !== undefined && (\r\n {error}\r\n )}\r\n

Update room details

\r\n

\r\n Manage room details - like Capacity, Equipment, Notes/Messages\r\n

\r\n { loading === true && (\r\n \r\n )}\r\n { loading === false && rooms !== undefined && rooms.length > 0 && (\r\n (a?.Name || \"\") < (b?.Name || \"\") ? -1 : 1)}\r\n columns={[\r\n {\r\n key: \"name\",\r\n fieldName: \"Name\",\r\n name: \"Name\",\r\n minWidth: 40\r\n },\r\n {\r\n key: \"site\",\r\n fieldName: \"SiteName\",\r\n name: \"Site / Location\",\r\n minWidth: 40,\r\n onRender: (item: IRoom, column, index) => {\r\n if (!(Boolean(item.SiteName) && Boolean(item.LocationName))) return null;\r\n return (\r\n <>\r\n { item.SiteName }
\r\n { item.LocationName }\r\n \r\n );\r\n }\r\n },\r\n {\r\n key: \"edit\",\r\n fieldName: \"Id\",\r\n name: \"Edit\",\r\n minWidth: 80,\r\n onRender: (item: IRoom) => {\r\n return (\r\n {\r\n history.push(`/menu/settings/updateroomdetails/${item.Id}/edit`);\r\n }} />\r\n )\r\n }\r\n }\r\n ]}\r\n selectionMode={SelectionMode.none}\r\n />\r\n )}\r\n ) => {\r\n if (!Number.isNaN(Number(route.match.params.roomId))) {\r\n const roomId = parseInt(route.match.params.roomId as string, 10);\r\n const room = rooms?.find((r) => r.Id === roomId);\r\n if (room) {\r\n return {\r\n history.goBack();\r\n if (reloadLocations) {\r\n _loadRooms();\r\n }\r\n }} />;\r\n } else {\r\n return null;\r\n }\r\n }\r\n return null;\r\n }} />\r\n
\r\n )\r\n}","import { IButtonStyles, Panel, PanelType, PrimaryButton, Stack } from \"office-ui-fabric-react\";\r\nimport { useContext } from \"react\";\r\nimport { Route, useHistory } from \"react-router\";\r\nimport { ProfileContext } from \"../../Home\";\r\nimport { IUserWithPhoto } from \"../../types/User.types\";\r\nimport { GlobalSettingsForm } from \"./forms/GlobalSettingsForm\";\r\nimport { UserManagementPanel } from \"./menus/AdministratorsPanel\";\r\nimport { ManageBookingsPanel } from \"./menus/ManageBookings\";\r\nimport { Reporting } from \"./menus/Reporting\";\r\nimport { SitesPanel } from \"./menus/SitesPanel\";\r\nimport { UpdateRoomDetails } from \"./menus/UpdateRoomDetails\";\r\n\r\nexport interface ISettingsPanelProps {\r\n profile?: IUserWithPhoto;\r\n onDismiss: () => void;\r\n}\r\n\r\nexport const SettingsPanel = (props: ISettingsPanelProps) => {\r\n\r\n const userContext = useContext(ProfileContext);\r\n const history = useHistory();\r\n \r\n const buttonStyles: IButtonStyles = {\r\n root: { width: 250 },\r\n flexContainer: { justifyContent: \"flex-start\" },\r\n label: { textAlign: \"left\", paddingLeft: 5 }\r\n };\r\n\r\n const hasRoles = props.profile && props.profile.Roles;\r\n //@ts-ignore\r\n const isAdmin = hasRoles && props.profile.Roles.filter((r) => r.Name === \"Admin\").length > 0;\r\n //@ts-ignore\r\n const accessReporting = hasRoles && props.profile.Roles.filter((r) => r.Name === \"Reporting\" || r.Name === \"Admin\").length > 0;\r\n //@ts-ignore\r\n const accessBookingMgmt = hasRoles && props.profile.Roles.filter((r) => r.Name === \"Booking Manager\" || r.Name === \"Admin\").length > 0;\r\n const isRoomApprover = userContext?.Profile.RoomApprover\r\n\r\n return (\r\n v1.0.1}\r\n styles={{\r\n scrollableContent: {\r\n height: \"100%\",\r\n overflow: \"hidden\"\r\n },\r\n content: {\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n \" .ms-Button\": {\r\n marginBottom: 20\r\n }\r\n }\r\n }}\r\n >\r\n { isAdmin && (\r\n <>\r\n history.push(\"/menu/settings/sites\")} />\r\n history.push(\"/menu/settings/usermanagement\")} />\r\n \r\n )}\r\n { isRoomApprover && (\r\n history.push(\"/menu/settings/updateroomdetails\")} />\r\n )}\r\n { accessBookingMgmt && (\r\n history.push(\"/menu/settings/manageBookings\")} />\r\n )}\r\n { accessReporting && (\r\n history.push(\"/menu/settings/reporting\")} />\r\n )}\r\n { isAdmin && (\r\n history.push(\"/menu/settings/global\")} />\r\n )}\r\n { isAdmin && (\r\n <>\r\n \r\n history.goBack()} />\r\n \r\n \r\n history.goBack()} />\r\n \r\n \r\n history.goBack()} />\r\n \r\n \r\n )}\r\n { accessBookingMgmt && (\r\n \r\n history.goBack()} />\r\n \r\n )}\r\n { accessReporting && (\r\n \r\n history.goBack()} />\r\n \r\n )}\r\n { isRoomApprover && (\r\n \r\n history.goBack()} />\r\n \r\n )}\r\n \r\n );\r\n}","import { DatePicker, Dropdown, IDropdownOption, Label, Panel, PanelType, PrimaryButton, Stack } from \"office-ui-fabric-react\";\r\nimport { useContext, useEffect, useState } from \"react\";\r\nimport { useHistory } from \"react-router-dom\"\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport { ConstraintType } from \"../../../types/Booking.types\";\r\nimport Utils from \"../../../utils\";\r\n\r\nexport interface IBookingDatePanelProps {\r\n onDismiss: () => void;\r\n}\r\n\r\nconst getNearestTime = () => {\r\n const date = new Date();\r\n let mins = Math.round(date.getMinutes() / 15) * 15;\r\n let hours = date.getHours();\r\n if (mins >= 60) {\r\n mins = 0;\r\n hours++;\r\n }\r\n return { hours, mins };\r\n}\r\n\r\nconst today = new Date();\r\ntoday.setSeconds(0); today.setMilliseconds(0);\r\nlet { hours: initialStartHours, mins: initialMins } = getNearestTime();\r\nlet initialEndHours = initialStartHours + 3; \r\nif (initialEndHours >= 23) {\r\n initialEndHours = 23;\r\n}\r\n\r\nexport const BookingDatePanel = (props: IBookingDatePanelProps) => {\r\n\r\n const profileContext = useContext(ProfileContext);\r\n\r\n const { onDismiss } = props;\r\n\r\n const history = useHistory();\r\n\r\n const [ date, setDate ] = useState(today);\r\n const [ startHours, setStartHours ] = useState(initialStartHours);\r\n const [ startMins, setStartMins ] = useState(initialMins);\r\n const [ endHours, setEndHours ] = useState(initialEndHours);\r\n const [ endMins, setEndMins ] = useState(initialMins);\r\n\r\n // If no dates in state, initialise as current time to cur time + 30 mins\r\n useEffect(() => {\r\n if (startHours !== undefined && startMins !== undefined && \r\n endHours !== undefined && endMins !== undefined) {\r\n const dateA = new Date();\r\n dateA.setHours(startHours); dateA.setMinutes(startMins);\r\n const dateB = new Date(dateA.getTime());\r\n dateB.setHours(endHours); dateB.setMinutes(endMins);\r\n let nextDay = false;\r\n let endTimeChanged = false;\r\n if (dateA > dateB) {\r\n endTimeChanged = true;\r\n while (dateA >= dateB) {\r\n dateB.setMinutes(dateB.getMinutes() + 30);\r\n if (dateB.getDate() > dateA.getDate()) {\r\n dateA.setTime(dateB.getTime());\r\n dateB.setMinutes(dateB.getMinutes() + 30);\r\n nextDay = true;\r\n }\r\n }\r\n }\r\n if (endTimeChanged) {\r\n setStartHours(dateA.getHours());\r\n setStartMins(dateA.getMinutes());\r\n setEndHours(dateB.getHours());\r\n setEndMins(dateB.getMinutes());\r\n }\r\n if (nextDay) {\r\n setDate(dateA);\r\n }\r\n }\r\n }, [startHours, startMins, endHours, endMins]);\r\n\r\n // If changed date / time is less than current date / time, update to now\r\n useEffect(() => {\r\n if (date && date.toLocaleDateString() === new Date().toLocaleDateString()) {\r\n const currentTime = new Date();\r\n if (startHours && startHours < currentTime.getHours()) {\r\n setStartHours(currentTime.getHours());\r\n }\r\n }\r\n }, [date, startHours]);\r\n\r\n // Dropdown options for hours and minutes\r\n let hourOptions: IDropdownOption[] = [], minOptions: IDropdownOption[] = [], startHourOption = 8;\r\n if (date?.toLocaleDateString() === new Date().toLocaleDateString()) {\r\n startHourOption = new Date().getHours();\r\n }\r\n for (let i = startHourOption; i < 24; i++) {\r\n const dropdownOption = {\r\n key: i,\r\n text: (\"0\" + i).slice(-2)\r\n } as IDropdownOption;\r\n hourOptions.push(dropdownOption);\r\n }\r\n for (let i = 0; i < 60; i += 15) {\r\n const dropdownOption = {\r\n key: i,\r\n text: (\"0\" + i).slice(-2)\r\n } as IDropdownOption;\r\n minOptions.push(dropdownOption);\r\n } \r\n\r\n // If Desk Booking Time Constraint set globally, set maximum date on the date picker\r\n let maxDate: Date | undefined;\r\n if (profileContext?.Settings.GlobalDeskConstraint != null) {\r\n const num = profileContext.Settings.GlobalDeskConstraint.Number;\r\n const type = profileContext.Settings.GlobalDeskConstraint.Type as ConstraintType;\r\n if (num) {\r\n maxDate = new Date();\r\n switch (type) {\r\n case ConstraintType.Week:\r\n maxDate.setDate(maxDate.getDate() + (7 * num));\r\n break;\r\n case ConstraintType.Month:\r\n maxDate.setMonth(maxDate.getMonth() + num);\r\n break;\r\n case ConstraintType.Year:\r\n maxDate.setFullYear(maxDate.getFullYear() + num);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n date ? date.toLocaleDateString() : \"\"} \r\n onSelectDate={(newDate) => setDate(newDate || undefined)} \r\n />\r\n \r\n \r\n {\r\n if (option) setStartHours(option.key as number);\r\n }} />\r\n {\r\n if (option) setStartMins(option.key as number);\r\n }} />\r\n \r\n \r\n \r\n {\r\n if (option) setEndHours(option.key as number);\r\n }} />\r\n {\r\n if (option) setEndMins(option.key as number);\r\n }}/>\r\n \r\n \r\n {\r\n if (\r\n date && \r\n startHours !== undefined && startMins !== undefined && \r\n endHours !== undefined && endMins !== undefined\r\n ) {\r\n const dateA = new Date(date.getTime());\r\n const dateB = new Date(date.getTime());\r\n dateA.setHours(startHours); dateA.setMinutes(startMins);\r\n dateB.setHours(endHours); dateB.setMinutes(endMins);\r\n history.push(`/menu/book/desk/${encodeURIComponent(Utils.dateToLocalISO(dateA))}/${encodeURIComponent(Utils.dateToLocalISO(dateB))}`);\r\n }\r\n }} />\r\n \r\n \r\n )\r\n}","import { IBookingConstraint } from \"./Booking.types\";\r\nimport { ISiteAdminTeam, ISiteAdminUser } from \"./User.types\";\r\n\r\nexport interface ISite {\r\n Id: number;\r\n Title: string;\r\n Address: string;\r\n PostCode: string;\r\n Description: string;\r\n SiteLevelParking: boolean;\r\n ParkingSpaces?: number;\r\n RestrictRoomAccess?: boolean;\r\n RestrictDeskAccess?: boolean;\r\n RoomAdminUsers?: number[];\r\n DeskAccessUsers?: number[];\r\n RoomAdminTeams?: number[];\r\n DeskAccessTeams?: number[];\r\n ResourceAdminUsers?: ISiteAdminUser[];\r\n ResourceAdminTeams?: ISiteAdminTeam[];\r\n DeskBookingConstraint?: IBookingConstraint;\r\n RoomBookingConstraint?: IBookingConstraint;\r\n Notes?: string;\r\n NotificationEmail?: string;\r\n RoomBookingEnabled?: boolean;\r\n DeskBookingEnabled?: boolean;\r\n WorkWeekOnly?: boolean;\r\n RoomCheckIns?: boolean;\r\n}\r\n\r\nexport interface ILocation {\r\n Id: number;\r\n Title: string;\r\n BuildingNameNo: string;\r\n Floor: string;\r\n SiteId: number;\r\n RestrictRoomAccess?: boolean;\r\n RestrictDeskAccess?: boolean;\r\n ResourceAdminUsers?: ISiteAdminUser[];\r\n DeskBookingConstraint?: IBookingConstraint;\r\n RoomBookingConstraint?: IBookingConstraint;\r\n RoomCheckIns?: boolean;\r\n}\r\n\r\nexport interface IRoom {\r\n Id: number;\r\n Name: string;\r\n Capacity?: number;\r\n Equipment?: string;\r\n SiteId: number;\r\n LocationId: number;\r\n SiteName: string;\r\n LocationName: string;\r\n IsRestricted?: boolean;\r\n IsRoomAdmin?: boolean;\r\n Disabled?: boolean;\r\n Hidden?: boolean;\r\n RestrictRoomAccess?: boolean;\r\n ResourceAdminUsers?: ISiteAdminUser[];\r\n RoomBookingConstraint?: IBookingConstraint;\r\n RoomCheckIns?: boolean;\r\n RoomType?: RoomType;\r\n}\r\n\r\nexport enum RoomType {\r\n MeetingRoom = 0,\r\n Clinical = 1\r\n}\r\n\r\nexport interface IFloorplan {\r\n Id: string;\r\n LocationId: number;\r\n Name: string;\r\n LoadAsDefault: boolean;\r\n FloorplanLayout?: IFloorplanLayout;\r\n}\r\n\r\nexport interface IFloorplanLayout {\r\n Id: number;\r\n FloorplanId: string;\r\n Json: string;\r\n Published: boolean;\r\n DateValid: string;\r\n DateAdded: string;\r\n DateModified: string;\r\n}\r\n\r\nexport interface IPublishedFloorplanLayout extends IFloorplanLayout {\r\n HasParking: boolean;\r\n ParkingLimit: number;\r\n FloorplanName: string;\r\n LocationBuildingNo: string;\r\n LocationName: string;\r\n SiteNotes: string;\r\n}\r\n\r\nexport interface IFloorplanAddResult {\r\n floorplanId: string;\r\n layoutId: number;\r\n}\r\n\r\n","import { Icon, MessageBar, MessageBarType, Panel, PanelType, Stack } from \"office-ui-fabric-react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { getDeskSites } from \"../../../api/siteslocations\";\r\nimport { ISite } from \"../../../types/SiteLocation.types\";\r\n\r\nexport interface IBookingSitePanelProps {\r\n onDismiss: () => void;\r\n startDateStr: string;\r\n endDateStr: string;\r\n}\r\n\r\nexport const BookingSitePanel = (props: IBookingSitePanelProps) => {\r\n const {startDateStr, endDateStr, onDismiss} = props;\r\n const history = useHistory();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [ loading, setLoading ] = useState(true);\r\n const [ sites, setSites ] = useState();\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [ error, setError ] = useState();\r\n\r\n const _loadSites = async () => {\r\n setLoading(true);\r\n const sitesResponse = await getDeskSites();\r\n if (sitesResponse.ok) {\r\n setSites((await sitesResponse.json()).filter((s: ISite) => s.DeskBookingEnabled));\r\n } else {\r\n setError(\"Unable to load sites: \" + sitesResponse.statusText);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n useEffect(() => {\r\n _loadSites();\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n { sites !== undefined && sites.length > 0 && sites.map((site) => (\r\n \r\n ))}\r\n { sites !== undefined && sites.length === 0 && (\r\n No desk booking available\r\n )}\r\n \r\n \r\n );\r\n}","import { Icon, MessageBar, MessageBarType, Panel, PanelType, Stack } from \"office-ui-fabric-react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { Redirect, useHistory } from \"react-router\";\r\nimport { getSite, loadLocations } from \"../../../api/siteslocations\";\r\nimport { ILocation, ISite } from \"../../../types/SiteLocation.types\";\r\n\r\nexport interface IBookingLocationPanelProps {\r\n onDismiss: () => void;\r\n startDateStr: string;\r\n endDateStr: string;\r\n siteId: number;\r\n}\r\n\r\nexport const BookingLocationPanel = (props: IBookingLocationPanelProps) => {\r\n const {startDateStr, endDateStr, siteId, onDismiss} = props;\r\n const history = useHistory();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [ loading, setLoading ] = useState(true);\r\n const [ locations, setLocations ] = useState();\r\n const [ siteNotes, setSiteNotes ] = useState();\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [ error, setError ] = useState();\r\n\r\n const _load = async () => {\r\n setLoading(true);\r\n await _loadSiteInfo();\r\n await _loadLocations();\r\n setLoading(false);\r\n };\r\n\r\n const _loadSiteInfo = async () => {\r\n const siteResponse = await getSite(props.siteId);\r\n if (siteResponse.ok) {\r\n const site = await siteResponse.json() as ISite;\r\n if (site && site.Notes) setSiteNotes(site.Notes);\r\n }\r\n };\r\n\r\n const _loadLocations = async () => {\r\n setLoading(true);\r\n const locationsResponse = await loadLocations(siteId, true);\r\n if (locationsResponse.ok) {\r\n setLocations(await locationsResponse.json());\r\n } else {\r\n setError(\"Unable to load locations: \" + locationsResponse.statusText);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n useEffect(() => {\r\n _load();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n if (locations && locations.length === 1) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n { Boolean(siteNotes) === true && (\r\n {siteNotes}\r\n )}\r\n \r\n { locations !== undefined && locations.map((location) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n}","import { Icon, Panel, PanelType, Stack } from \"office-ui-fabric-react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { Redirect, useHistory } from \"react-router\";\r\nimport { loadFloorplansForLocation } from \"../../../api/floorplans\";\r\nimport { IFloorplan } from \"../../../types/SiteLocation.types\";\r\n\r\nexport interface IBookingFloorplanPanelProps {\r\n onDismiss: () => void;\r\n startDateStr: string;\r\n endDateStr: string;\r\n siteId: number;\r\n locationId: number;\r\n}\r\n\r\nexport const BookingFloorplanPanel = (props: IBookingFloorplanPanelProps) => {\r\n const {startDateStr, endDateStr, siteId, locationId, onDismiss} = props;\r\n const history = useHistory();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [ loading, setLoading ] = useState(true);\r\n const [ floorplans, setFloorplans ] = useState();\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [ error, setError ] = useState();\r\n\r\n const _loadFloorplans = async () => {\r\n setLoading(true);\r\n const floorplansResponse = await loadFloorplansForLocation(locationId);\r\n if (floorplansResponse.ok) {\r\n setFloorplans(await floorplansResponse.json());\r\n } else {\r\n setError(\"Unable to load floorplans: \" + floorplansResponse.statusText);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n useEffect(() => {\r\n _loadFloorplans();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n if (floorplans && floorplans.length === 1) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n

Choose an area in which to book a desk:

\r\n \r\n { floorplans !== undefined && floorplans.map((floorplan) => (\r\n \r\n ))}\r\n \r\n
\r\n );\r\n}","import { Callout } from \"@fluentui/react\";\r\nimport { css, DefaultButton, IconButton, IPanelHeaderRenderer, IPanelProps, IRenderFunction, Label, MessageBar, MessageBarType, Panel, PanelType, Persona, PrimaryButton, Spinner, Stack, TextField, Toggle, TooltipHost } from \"office-ui-fabric-react\";\r\nimport React, { useCallback, useContext, useEffect, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { getBookingsForLayoutAndTime, saveNewBooking } from \"../../../api/bookings\";\r\nimport { loadLatestPublishedFloorplan } from \"../../../api/floorplans\";\r\nimport { getUserProfile } from \"../../../api/userInfo\";\r\nimport { IBooking } from \"../../../types/Booking.types\";\r\nimport Doors from \"../../drawing/Doors\";\r\nimport { IDesk, IRoomRectangle, IStampable, ISvgCurve, SvgShapeComponent } from \"../../../types/Floorplan.types\";\r\nimport { IRoomEditorDrawingState } from \"../../drawing/editor/FloorplanEditor\";\r\nimport { IPublishedFloorplanLayout } from \"../../../types/SiteLocation.types\";\r\nimport { createDeskSvg } from \"../../drawing/SvgElements\";\r\nimport TextElements from \"../../drawing/TextElements\";\r\nimport { IUserWithPhoto } from \"../../../types/User.types\";\r\nimport ZoomControls from \"../../drawing/ZoomControls\";\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport { constant } from \"lodash\";\r\nimport { Tag } from \"../../../types/Tagging.types\";\r\n\r\nimport styles from \"./DeskBookingForm.module.scss\";\r\nimport FloorRects from \"../../drawing/FloorRects\";\r\nimport SvgShapes from \"../../drawing/CustomShapes\";\r\nimport RoomRects from \"../../drawing/RoomRects\";\r\n\r\nexport interface IBookingFormProps {\r\n onDismiss: () => void;\r\n startDateStr: string;\r\n endDateStr: string;\r\n siteId?: number;\r\n locationId: number;\r\n floorplanId: string;\r\n booking?: IBooking;\r\n readOnly?: boolean;\r\n postCode?: string;\r\n}\r\n\r\ninterface ISVGDimensions {\r\n width: number; height: number; x: number; y: number;\r\n}\r\n\r\nconst calculateCurvePoints = (curve: ISvgCurve, arg1: SvgShapeComponent, shapeOriginX: number, shapeOriginY: number): [any, any] => {\r\n // Given points: start, control, and end\r\n const x0 = (arg1 as any).x + shapeOriginX, y0 = (arg1 as any).y + shapeOriginY; // Start point\r\n const x1 = curve.x1 + shapeOriginX, y1 = curve.y1 + shapeOriginY; // Control point\r\n const x2 = curve.x + shapeOriginX, y2 = curve.y + shapeOriginY; // End point\r\n\r\n // Compute tx and ty\r\n const denom_x = (x0 - 2 * x1 + x2);\r\n const denom_y = (y0 - 2 * y1 + y2);\r\n const tx = denom_x !== 0 ? (x0 - x1) / denom_x : null;\r\n const ty = denom_y !== 0 ? (y0 - y1) / denom_y : null;\r\n\r\n // Parametric functions for x and y\r\n function bezier_x(t: number): number {\r\n return (1 - t) ** 2 * x0 + 2 * (1 - t) * t * x1 + t ** 2 * x2;\r\n }\r\n\r\n function bezier_y(t: number): number {\r\n return (1 - t) ** 2 * y0 + 2 * (1 - t) * t * y1 + t ** 2 * y2;\r\n }\r\n\r\n // Evaluate critical points and endpoints\r\n const x_values: number[] = [bezier_x(0), bezier_x(1)];\r\n const y_values: number[] = [bezier_y(0), bezier_y(1)];\r\n\r\n if (tx !== null && tx >= 0 && tx <= 1) {\r\n x_values.push(bezier_x(tx));\r\n }\r\n if (ty !== null && ty >= 0 && ty <= 1) {\r\n y_values.push(bezier_y(ty));\r\n }\r\n\r\n return [x_values, y_values];\r\n}\r\n\r\nconst calculateSvgDimensions = (drawing: IRoomEditorDrawingState) => {\r\n let leftMostPoint = Number.MAX_SAFE_INTEGER, rightMostPoint = 0, topMostPoint = Number.MAX_SAFE_INTEGER, bottomMostPoint = 0;\r\n [drawing.desks, drawing.doors, drawing.text].forEach((stampables: IStampable[]) => {\r\n const minX = Math.min(...stampables.map((s) => s.x));\r\n const maxX = Math.max(...stampables.map((s) => s.x));\r\n const minY = Math.min(...stampables.map((s) => s.y));\r\n const maxY = Math.max(...stampables.map((s) => s.y));\r\n if (minX < leftMostPoint) leftMostPoint = minX;\r\n if (maxX > rightMostPoint) rightMostPoint = maxX;\r\n if (minY < topMostPoint) topMostPoint = minY;\r\n if (maxY > bottomMostPoint) bottomMostPoint = maxY;\r\n });\r\n [drawing.roomRectangles, drawing.floorplanRectangles].forEach((rectangles: IRoomRectangle[]) => {\r\n const minX = Math.min(...rectangles.map((s) => s.x));\r\n const maxX = Math.max(...rectangles.map((s) => s.x + s.width));\r\n const minY = Math.min(...rectangles.map((s) => s.y));\r\n const maxY = Math.max(...rectangles.map((s) => s.y + s.height));\r\n if (minX < leftMostPoint) leftMostPoint = minX;\r\n if (maxX > rightMostPoint) rightMostPoint = maxX;\r\n if (minY < topMostPoint) topMostPoint = minY;\r\n if (maxY > bottomMostPoint) bottomMostPoint = maxY;\r\n });\r\n drawing.floorplanShapes.forEach((shape) => {\r\n const fallback = Number.MAX_SAFE_INTEGER;\r\n let [ minX, minY, maxX, maxY ] = shape.path.reduce((prev, cur, idx, arr) => {\r\n let minx = (cur as any).x + shape.x || fallback;\r\n let miny = (cur as any).y + shape.y || fallback;\r\n let maxx = (cur as any).x + shape.x || 0;\r\n let maxy = (cur as any).y + shape.y || 0;\r\n if (cur.type === \"Curve\") {\r\n const curve = cur as ISvgCurve;\r\n const [ xVals, yVals ] = calculateCurvePoints(curve, arr[idx - 1], shape.x, shape.y);\r\n const curveMin = [ Math.min(...xVals), Math.min(...yVals) ];\r\n const curveMax = [ Math.max(...xVals), Math.max(...yVals) ];\r\n if (curveMin[0] < minx) minx = curveMin[0];\r\n if (curveMin[1] < miny) miny = curveMin[1];\r\n if (curveMax[0] > maxx) maxx = curveMax[0];\r\n if (curveMax[1] > maxy) maxy = curveMax[1];\r\n }\r\n return [ Math.min(prev[0], minx), Math.min(prev[1], miny), Math.max(prev[2], maxx), Math.max(prev[3], maxy) ];\r\n }, [fallback, fallback, 0, 0]);\r\n if (minX < leftMostPoint) leftMostPoint = minX;\r\n if (maxX > rightMostPoint) rightMostPoint = maxX;\r\n if (minY < topMostPoint) topMostPoint = minY;\r\n if (maxY > bottomMostPoint) bottomMostPoint = maxY;\r\n });\r\n // padding\r\n leftMostPoint -= 10; rightMostPoint += 10;\r\n topMostPoint -= 10; bottomMostPoint += 10;\r\n // constraint\r\n leftMostPoint = Math.max(0, leftMostPoint);\r\n rightMostPoint = Math.min(20000, rightMostPoint);\r\n topMostPoint = Math.max(0, topMostPoint);\r\n bottomMostPoint = Math.min(20000, bottomMostPoint);\r\n return {\r\n width: rightMostPoint - leftMostPoint,\r\n height: bottomMostPoint - topMostPoint,\r\n x: leftMostPoint, y: topMostPoint\r\n } as ISVGDimensions;\r\n};\r\n\r\ninterface IDrawingProps {\r\n disableInteraction: boolean;\r\n layoutDrawing: IRoomEditorDrawingState;\r\n bookings: IBooking[];\r\n bookingFormValues: IBooking;\r\n handleHover: (clientX: number, clientY: number) => void;\r\n handleInteraction: (disabled: boolean, clientX: number, clientY: number, isTouch?: boolean) => void;\r\n svgDimensions: ISVGDimensions;\r\n zoom: number;\r\n filterTags?: number[];\r\n}\r\n\r\nconst svgCss = `\r\n.nonAvailableDesk .notAvailableIcon, .nonAvailableDesk .availability {\r\n display: none;\r\n}\r\n.freeDesk .notAvailableIcon {\r\n display: none;\r\n}\r\n.selectedDesk .deskRect {\r\n fill: green;\r\n}\r\n#floorplan {\r\n filter: url(#addborder);\r\n}\r\n#shapes {\r\n fill: white;\r\n}\r\n.safari #floorplan {\r\n filter: none;\r\n}\r\n.safari #floorplan rect {\r\n stroke: none;\r\n}\r\n`;\r\n\r\nconst Drawing = (props: IDrawingProps) => {\r\n const { disableInteraction, filterTags, layoutDrawing, svgDimensions, zoom, handleHover, handleInteraction, bookingFormValues } = props;\r\n const { desks, doors, roomRectangles, floorplanRectangles, floorplanShapes, text } = layoutDrawing;\r\n const context = useContext(ProfileContext);\r\n \r\n let className: string | undefined = undefined;\r\n if (/(Macintosh|iPhone|iPad|iPod).*Safari.*/i.test(navigator.userAgent)) className = \"safari\";\r\n\r\n let width = svgDimensions.width, height = svgDimensions.height;\r\n const scaleFactor = 1 / zoom;\r\n if (scaleFactor !== 1) {\r\n width = svgDimensions.width * scaleFactor;\r\n height = svgDimensions.height * scaleFactor;\r\n }\r\n const viewBox = `${svgDimensions.x} ${svgDimensions.y} ${svgDimensions.width} ${svgDimensions.height}`;\r\n\r\n let filteredDesks = desks;\r\n if (filterTags !== undefined && filterTags.length) {\r\n filteredDesks = desks.filter(desk => (desk.tags || []).map(d => d.Id).filter(id => filterTags.includes(id)).length === filterTags.length)\r\n }\r\n\r\n return (\r\n handleHover(e.clientX, e.clientY)}\r\n onMouseUp={(e) => handleInteraction(disableInteraction, e.clientX, e.clientY)}\r\n onTouchStart={(e) => handleInteraction(disableInteraction, e.touches[0].clientX, e.touches[0].clientY, true)}\r\n viewBox={viewBox}\r\n >\r\n \r\n \r\n \r\n\r\n { /* Mask for red x on non-available desks */ }\r\n \r\n \r\n \r\n\r\n { /* Thick floorplan outline */ }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* { floorplanRectangles && floorplanRectangles.length > 0 && floorplanRectangles.map((room,idx) => (\r\n \r\n ))} */}\r\n \r\n\r\n { /* Door template */}\r\n \r\n \r\n \r\n \r\n \r\n\r\n { /* Background */ }\r\n \r\n\r\n { /* Floorplan layout */ }\r\n \r\n \r\n \r\n {/* { roomRectangles && roomRectangles.length > 0 && roomRectangles.map((room,idx) => (\r\n \r\n ))} */}\r\n \r\n\r\n { /* Doorways */ }\r\n \r\n\r\n { /* Text Labels */ }\r\n \r\n\r\n { /* Desks */ }\r\n \r\n { filteredDesks.map((desk, idx) => {\r\n const svg = createDeskSvg();\r\n const html = svg.innerHTML;\r\n let cursor: string | undefined = undefined, transform: string | undefined = undefined;\r\n let className = \"desk desk-\" + idx + \"-\" + desk.id;\r\n \r\n if (desk.rotation !== 0) {\r\n transform = `rotate(${desk.rotation}, 10, 12)`;\r\n }\r\n const today = new Date();\r\n const startDate = new Date(props.bookingFormValues.Start);\r\n const diff = Math.abs(startDate.getTime() - today.getTime()) / 3600000;\r\n\r\n let permitted = true;\r\n if (diff > 48 && desk.bookable && desk.assignedTeams && desk.assignedTeams.length && context && context?.Profile?.Teams) {\r\n permitted = false;\r\n const userTeamIds = context?.Profile?.Teams?.map((t) => t.Id);\r\n const deskTeams = desk.assignedTeams;\r\n if (userTeamIds && deskTeams.some((val, idx, arr) => userTeamIds.indexOf(val) >= 0)) {\r\n permitted = true;\r\n }\r\n }\r\n if (!desk.bookable || !permitted) className += \" nonAvailableDesk\";\r\n\r\n if (desk.id && props.bookings.filter((b) => b.DeskId === desk.id).length === 0) {\r\n className += \" freeDesk\";\r\n }\r\n if (bookingFormValues && bookingFormValues.DeskId === desk.id) {\r\n className += \" selectedDesk\";\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\nconst getDeskFromPoint = (x: number, y: number) => {\r\n let deskEl: SVGSVGElement|undefined;\r\n const childEls = document.elementsFromPoint(x, y).filter(el => el.classList.contains(\"desk\") || el.classList.contains(\"availability\"));\r\n if (childEls.length) {\r\n const g = childEls[0].parentNode as SVGGElement;\r\n if (g) {\r\n deskEl = g.parentNode as SVGSVGElement;\r\n }\r\n }\r\n return deskEl\r\n};\r\n\r\ninterface IDeskCalloutProps {\r\n bookings?: IBooking[];\r\n hoveredBooking?: { booking: IBooking, htmlId: string, deskId: number };\r\n desks?: IDesk[];\r\n onDismiss: () => void;\r\n}\r\n\r\nconst DeskCallout = (props: IDeskCalloutProps) => {\r\n const { hoveredBooking, desks, onDismiss } = props;\r\n const [ loading, setLoading ] = useState(true);\r\n const [ user, setUser ] = useState();\r\n\r\n const loadUserInfo = async (id: number) => {\r\n const response = await getUserProfile(id);\r\n if (response.ok && response.status === 200) {\r\n const userData = await response.json() as IUserWithPhoto;\r\n setUser(userData);\r\n } else {\r\n setUser(undefined);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (hoveredBooking && hoveredBooking.booking !== undefined) {\r\n if (!user || user.Id !== hoveredBooking.booking.BookedByUserId) {\r\n setLoading(true);\r\n loadUserInfo(hoveredBooking.booking.BookedByUserId);\r\n } else {\r\n if (loading) setLoading(false);\r\n }\r\n } else {\r\n if (user !== undefined) {\r\n setUser(undefined);\r\n }\r\n if (loading === true) {\r\n setLoading(false);\r\n }\r\n }\r\n }, [hoveredBooking, user, loading]);\r\n\r\n if (!hoveredBooking) return null;\r\n\r\n const { booking } = hoveredBooking;\r\n const desk = desks?.find(d => d.id === hoveredBooking.deskId);\r\n\r\n if (!desk) return null;\r\n\r\n let start, end, onBehalfOf;\r\n if (booking !== undefined) {\r\n const startDt = new Date(booking.Start);\r\n start = startDt.toLocaleTimeString().substr(0,5);\r\n const endDt = new Date(booking.Finish);\r\n end = endDt.toLocaleTimeString().substr(0,5);\r\n onBehalfOf = booking.OnBehalfOfEmail;\r\n } \r\n\r\n return \r\n { desk !== undefined && (\r\n
\r\n
{(desk.alias || \"Un-named desk (id: \" + desk.id + \")\")}
\r\n \r\n
\r\n )}\r\n { loading === true && (\r\n \r\n )}\r\n { user !== undefined && (\r\n
\r\n Booked by:\r\n
\r\n \r\n
\r\n { user.UseTeams === true && (\r\n \r\n Contact on Teams\r\n \r\n )}\r\n { booking !== undefined && Boolean(onBehalfOf) === true && (\r\n
Booked on behalf of: {onBehalfOf}
\r\n )}\r\n
\r\n )}\r\n { booking !== undefined && start !== undefined && end !== undefined && (\r\n
\r\n Start: {start}
\r\n End: {end}\r\n
\r\n )}\r\n
;\r\n}\r\n\r\nexport const DeskBookingForm = (props: IBookingFormProps) => {\r\n const { floorplanId, onDismiss, readOnly } = props;\r\n const history = useHistory();\r\n const context = useContext(ProfileContext);\r\n\r\n const [ loading, setLoading ] = useState(true);\r\n const [ saving, setSaving ] = useState(false);\r\n const [ layoutDrawing, setLayoutDrawing ] = useState();\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [ parkingEnabled, setParkingEnabled ] = useState();\r\n const [ availableParking, setAvailableParking ] = useState();\r\n const [ bookings, setBookings ] = useState();\r\n const [ hoveredBooking, setHoveredBooking ] = useState<{booking: IBooking, htmlId: string, deskId: number}>();\r\n const [ bookingFormValues, setBookingFormValues ] = useState({\r\n Start: new Date(decodeURIComponent(props.startDateStr)).toISOString(),\r\n Finish: new Date(decodeURIComponent(props.endDateStr)).toISOString(),\r\n FloorplanId: props.floorplanId,\r\n DeskId: props.booking?.DeskId\r\n } as IBooking);\r\n const [ locationName, setLocationName ] = React.useState();\r\n const [ locationBuildingNo, setLocationBuildingNo ] = React.useState();\r\n const [ siteNotes, setSiteNotes ] = React.useState();\r\n const [ zoom, setZoom ] = useState(1);\r\n const [ error, setError ] = useState();\r\n const [ formValid, setFormValid ] = useState(false);\r\n const [ tags, setTags ] = useState();\r\n const [ tagFilter, setTagFilter ] = useState([]);\r\n\r\n const toggleTag = useCallback((tagId: number) => {\r\n if (tagFilter.indexOf(tagId) < 0) {\r\n setTagFilter([...tagFilter, tagId]);\r\n } else {\r\n setTagFilter(tagFilter.filter(t => t !== tagId));\r\n }\r\n }, [tagFilter]);\r\n\r\n const _load = async () => {\r\n const response = await loadLatestPublishedFloorplan(floorplanId);\r\n if (response.ok) {\r\n const layout = await response.json() as IPublishedFloorplanLayout;\r\n setLocationName(layout.LocationName);\r\n setLocationBuildingNo(layout.LocationBuildingNo);\r\n setSiteNotes(layout.SiteNotes);\r\n const drawing = JSON.parse(layout.Json) as IRoomEditorDrawingState;\r\n if (drawing) {\r\n if (!drawing.floorplanShapes) drawing.floorplanShapes = [];\r\n const deskTags = drawing.desks.reduce((prev: Tag[], cur: IDesk, idx: number, arr: IDesk[]) => {\r\n if (cur.tags && cur.tags.length) {\r\n cur.tags.forEach(tag => {\r\n if (prev.map(p => p.Id).indexOf(tag.Id) < 0) {\r\n prev.push(tag);\r\n }\r\n });\r\n }\r\n return prev;\r\n }, [] as Tag[]);\r\n setTags(deskTags);\r\n if (layout.HasParking) setParkingEnabled(true);\r\n let totalSpaces = layout.ParkingLimit;\r\n setLayoutDrawing(drawing);\r\n setBookingFormValues({...bookingFormValues, FloorplanId: props.floorplanId, LayoutId: layout.Id});\r\n\r\n const bookingsResponse = await getBookingsForLayoutAndTime(props.floorplanId, decodeURIComponent(props.startDateStr), decodeURIComponent(props.endDateStr));\r\n if (bookingsResponse.ok) {\r\n const bookings = await bookingsResponse.json() as IBooking[];\r\n if (bookings) {\r\n let parkingBooked = bookings.filter((b) => b.IncludeParking).length;\r\n if (layout.HasParking && totalSpaces > 0) setAvailableParking(totalSpaces - parkingBooked);\r\n setBookingFormValues({...bookingFormValues, IncludeParking: layout.HasParking && (totalSpaces - parkingBooked > 0)});\r\n setBookings(bookings);\r\n setLoading(false);\r\n } else {\r\n setError(\"Unable to load bookings for this floorplan and time\");\r\n }\r\n } else {\r\n setError(\"An error occured while loading booking information: \" + bookingsResponse.statusText);\r\n }\r\n } else {\r\n setError(\"Unable to load the layout drawing for the selected floorplan\");\r\n }\r\n } else {\r\n setError(\"An error occured while loading the layout drawing: \" + response.statusText);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (props.booking) setBookingFormValues({...props.booking})\r\n _load();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n setFormValid(bookingFormValues.DeskId !== undefined);\r\n }, [ bookingFormValues ]);\r\n\r\n if (error !== undefined) {\r\n return (\r\n \r\n {error}\r\n \r\n );\r\n }\r\n\r\n const _save = async () => {\r\n setSaving(true);\r\n const booking = { ...bookingFormValues };\r\n const response = await saveNewBooking(\"desk\", booking);\r\n if (response.ok && response.status === 200) {\r\n setSaving(false);\r\n history.push(\"/menu\");\r\n } else {\r\n const responseText = await response.text();\r\n alert('Unable to complete booking: ' + responseText);\r\n if (/desk has already been booked/i.test(responseText)) {\r\n setBookingFormValues({...bookingFormValues, DeskId: undefined as any as number});\r\n _load();\r\n }\r\n setSaving(false);\r\n }\r\n };\r\n\r\n let svgDimensions: ISVGDimensions|undefined;\r\n if (layoutDrawing) svgDimensions = calculateSvgDimensions(layoutDrawing);\r\n\r\n let deskName;\r\n if (layoutDrawing && bookingFormValues && bookingFormValues.DeskId) {\r\n const desk = layoutDrawing.desks.filter((d) => d.id === bookingFormValues.DeskId)[0];\r\n deskName = desk.alias || `Un-named Desk (Id: ${desk.id})`;\r\n }\r\n\r\n let startDate = \"\", endDate = \"\";\r\n if (bookingFormValues.Start) {\r\n const dt = new Date(bookingFormValues.Start)\r\n startDate = dt.toLocaleDateString() + \" \" + dt.toLocaleTimeString().substr(0,5);\r\n }\r\n if (bookingFormValues.Finish) {\r\n const dt = new Date(bookingFormValues.Finish)\r\n endDate = dt.toLocaleDateString() + \" \" + dt.toLocaleTimeString().substr(0,5);\r\n }\r\n\r\n return (\r\n ) => (\r\n \r\n { defaultRender !== undefined ? defaultRender(panelProps) : null }\r\n \r\n
Location: { locationName }
\r\n
Where: { locationBuildingNo }
\r\n
\r\n { Boolean(siteNotes) === true && (\r\n {siteNotes}\r\n )}\r\n
\r\n )}\r\n onRenderFooter={(panelProps) => {\r\n let closeLabel = readOnly ? \"Close\" : \"Cancel\";\r\n return \r\n { !readOnly && (\r\n { _save() }} style={{marginRight: 20}}>\r\n Save \r\n { saving === true && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n ;\r\n }}\r\n >\r\n { loading === true && (\r\n \r\n )}\r\n { loading === false && props.postCode !== undefined && (\r\n \r\n )}\r\n { loading === false && layoutDrawing !== undefined && bookings !== undefined && svgDimensions !== undefined && (\r\n
\r\n
setHoveredBooking(undefined)} style={{width: \"calc(100% - 20px)\", height: svgDimensions.height + 20, overflow: \"auto\", border: \"1px solid #e3e3e3\", padding: 10, maxHeight: \"60vh\"}}>\r\n {\r\n const deskEl = getDeskFromPoint(clientX, clientY);\r\n if (deskEl) {\r\n const idxAttr = deskEl.getAttribute(\"data-idx\");\r\n if (idxAttr) {\r\n const idxAttrSplit = idxAttr.split('_');\r\n const id = parseInt(idxAttrSplit[idxAttrSplit.length-1], 10);\r\n const desk = layoutDrawing.desks.find(d => d.id === id);\r\n if (desk?.id) {\r\n const booking = bookings.filter((b) => b.DeskId === desk.id)[0];\r\n setHoveredBooking({ booking, htmlId: idxAttr, deskId: desk.id });\r\n }\r\n }\r\n }\r\n }}\r\n handleInteraction={(disabled, clientX, clientY, isTouch) => {\r\n if (disabled) return;\r\n const deskEl = getDeskFromPoint(clientX, clientY);\r\n if (deskEl) {\r\n const idxAttr = deskEl.getAttribute(\"data-idx\");\r\n const idxAttrSplit = idxAttr?.split('_');\r\n const isFree = deskEl.classList.contains(\"freeDesk\");\r\n if (idxAttr && idxAttrSplit?.length && isFree) {\r\n const id = parseInt(idxAttrSplit[idxAttrSplit.length-1], 10);\r\n const desk = layoutDrawing.desks.find(d => d.id === id);\r\n if (desk?.id) {\r\n if (isTouch && (!hoveredBooking || hoveredBooking.deskId !== id)) {\r\n const booking = bookings.filter((b) => b.DeskId === desk.id)[0];\r\n setHoveredBooking({ booking, htmlId: idxAttr, deskId: desk.id });\r\n } else {\r\n setBookingFormValues({\r\n ...bookingFormValues,\r\n DeskId: desk.id as number\r\n });\r\n }\r\n }\r\n\r\n }\r\n }\r\n }}\r\n />\r\n
\r\n setZoom(newZoom)} min={0.1} max={1} />\r\n
\r\n )}\r\n { tags !== undefined && tags.length > 0 && (\r\n <>\r\n \r\n \r\n { tags?.map(tag =>
toggleTag(tag.Id)}>{tag.Label}
) }\r\n
\r\n \r\n )}\r\n { !readOnly && bookingFormValues.DeskId === undefined && (\r\n \r\n )}\r\n { layoutDrawing && layoutDrawing.desks && bookingFormValues.DeskId !== undefined && (\r\n \r\n )}\r\n { bookingFormValues && bookingFormValues.Start && (\r\n \r\n )}\r\n { bookingFormValues && bookingFormValues.Finish && (\r\n \r\n )}\r\n {\r\n setBookingFormValues({...bookingFormValues, IncludeParking: checked !== undefined ? checked : false});\r\n }}\r\n />\r\n {\r\n setBookingFormValues({...bookingFormValues, Description: newValue || \"\"});\r\n }} />\r\n \r\n

To book on behalf of someone else, just enter their email below.

\r\n {\r\n setBookingFormValues({...bookingFormValues, OnBehalfOfEmail: newValue || \"\"});\r\n }} />\r\n { hoveredBooking !== undefined && (\r\n setHoveredBooking(undefined)} />\r\n )}\r\n
\r\n );\r\n}","import { DefaultButton, Dialog, DialogFooter, MessageBar, MessageBarType, Panel, PanelType, PrimaryButton, Spinner, Stack, TextField } from \"office-ui-fabric-react\";\r\nimport * as React from \"react\";\r\nimport { cancelBooking, saveNewBooking } from \"../../../api/bookings\";\r\nimport { getRoomInfo } from \"../../../api/rooms\";\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport { IBooking } from \"../../../types/Booking.types\";\r\nimport { IRoom } from \"../../../types/SiteLocation.types\";\r\n\r\nexport interface IRoomBookingFormProps {\r\n readOnly?: boolean;\r\n roomId: number;\r\n start: Date;\r\n finish: Date;\r\n booking?: IBooking;\r\n roomInfo?: string;\r\n onDismiss: (changesMade?: boolean) => void;\r\n}\r\n\r\nconst validateEmail = (str?: string) => {\r\n // eslint-disable-next-line no-control-regex\r\n const regex = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])/;\r\n return str && !regex.test(str) ? 'Please enter a valid email' : undefined;\r\n};\r\n\r\nexport const RoomBookingForm = (props: IRoomBookingFormProps) => {\r\n const userContext = React.useContext(ProfileContext);\r\n\r\n const [ roomInfo, setRoomInfo ] = React.useState();\r\n const [ isOwner, setIsOwner ] = React.useState(false);\r\n const [ newBooking, setNewBooking ] = React.useState(false);\r\n const [ loading, setLoading ] = React.useState(false);\r\n const [ saving, setSaving ] = React.useState(false);\r\n const [ error, setError ] = React.useState();\r\n const [ showReasonDialog, setShowReasonDialog ] = React.useState(false);\r\n const [ reason, setReason ] = React.useState();\r\n\r\n const [ onBehalfOf, setOnBehalfOf ] = React.useState(props.booking?.OnBehalfOfEmail);\r\n const [ comments, setComments ] = React.useState(props.booking?.Description)\r\n\r\n // Cancellation Callback\r\n const onCancelClick = React.useCallback(async () => {\r\n let cancel = false, cancelledByAdmin = false;\r\n if (!isOwner && roomInfo?.IsRoomAdmin) {\r\n if (!showReasonDialog && !Boolean(reason)) {\r\n setShowReasonDialog(true);\r\n } else {\r\n cancel = true;\r\n cancelledByAdmin = true;\r\n }\r\n } else {\r\n cancel = window.confirm('Are you sure?');\r\n }\r\n if (props.booking && cancel) {\r\n const response = await cancelBooking({...props.booking, CancellationReason: reason, CancelledByAdmin: cancelledByAdmin });\r\n if (response.ok) {\r\n props.onDismiss(true);\r\n } else {\r\n setError(\"Unable to cancel booking\");\r\n }\r\n }\r\n }, [ props, isOwner, reason, roomInfo, showReasonDialog ]);\r\n\r\n // Save Callback\r\n const save = React.useCallback(async () => {\r\n setSaving(true);\r\n const booking: Partial = {};\r\n if (userContext) booking.BookedByUserId = userContext.Profile.Id;\r\n booking.Description = comments;\r\n booking.Start = props.start.toISOString();\r\n booking.Finish = props.finish.toISOString();\r\n if (props.booking && props.booking.Id) booking.Id = props.booking.Id;\r\n booking.OnBehalfOfEmail = onBehalfOf;\r\n booking.RoomId = props.roomId;\r\n const response = await saveNewBooking(\"room\", booking as IBooking);\r\n if (response.ok) {\r\n props.onDismiss(true);\r\n } else {\r\n setSaving(false);\r\n setError(\"Unable to save booking\");\r\n }\r\n }, [ props, onBehalfOf, comments, userContext ]);\r\n\r\n // Callback to check if user is a room admin\r\n const checkIsAdmin = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await getRoomInfo(props.roomId);\r\n if (response.ok) {\r\n setRoomInfo(await response.json() as IRoom);\r\n } else {\r\n setError(\"Unable to load room information\");\r\n }\r\n setLoading(false);\r\n }, [ props.roomId ]);\r\n\r\n // On mount\r\n React.useEffect(() => {\r\n checkIsAdmin().then(() => {\r\n if (userContext && props.booking && (\r\n props.booking.BookedByUserId === userContext.Profile.Id ||\r\n (props.booking.OnBehalfOfEmail && userContext.Profile.Email && props.booking.OnBehalfOfEmail.toLowerCase() === userContext.Profile.Email.toLowerCase())\r\n )) {\r\n setIsOwner(true);\r\n } else if (!props.booking) {\r\n setNewBooking(true);\r\n setOnBehalfOf(userContext?.Profile?.Email);\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n let title: string = \"\";\r\n if (newBooking) title = roomInfo?.IsRestricted && roomInfo?.IsRoomAdmin === false ? \"Request Room\" : \"New Booking\";\r\n if (props.booking) title = roomInfo?.IsRoomAdmin === true || isOwner ? \"Edit Booking\" : \"View Booking\";\r\n\r\n return (\r\n props.onDismiss()}\r\n isFooterAtBottom={true}\r\n onRenderFooter={() => (\r\n \r\n
\r\n { !newBooking && !props.readOnly && (isOwner || roomInfo?.IsRoomAdmin) && (\r\n \r\n )}\r\n
\r\n
\r\n { newBooking && (roomInfo?.IsRestricted === false || (roomInfo?.IsRestricted && roomInfo?.IsRoomAdmin)) && (\r\n \r\n {saving === true && <> }\r\n Save\r\n \r\n )}\r\n { newBooking && roomInfo?.IsRestricted && roomInfo?.IsRoomAdmin === false && (\r\n \r\n {saving === true && <> }\r\n Request\r\n \r\n )}\r\n
\r\n
\r\n )}\r\n >\r\n { roomInfo !== undefined && (\r\n \r\n Room: {roomInfo.Name} \r\n Location: {roomInfo.LocationName} \r\n Site: {roomInfo.SiteName}\r\n {roomInfo.RoomCheckIns === true && (\r\n
\r\n

Please Note: This room requires check-in on arrival.

\r\n

\r\n You will be able to check-in during the first 15 minutes of the meeting, and 15 minutes before.\r\n Failure to check-in will mean that the booking is automatically cancelled and the resource made available for others.\r\n

\r\n
\r\n )}\r\n
\r\n )}\r\n { error !== undefined && (\r\n {error}\r\n )}\r\n \r\n \r\n \r\n \r\n {\r\n setOnBehalfOf(newValue);\r\n }} \r\n errorMessage={validateEmail(onBehalfOf)}\r\n />\r\n setComments(newValue)}\r\n errorMessage={newBooking && (!Boolean(comments) || comments?.trim() === '') ? 'Please provide a meeting name or reason for booking.' : undefined}\r\n multiline\r\n />\r\n { showReasonDialog && (\r\n \r\n )}\r\n { loading === true && }\r\n {/* { roomInfo?.IsRoomAdmin === true && (<>Is Admin)}\r\n { isOwner === true && (<>Is Owner)}\r\n { newBooking === true && (<>New Booking)} */}\r\n
\r\n );\r\n}","import { DefaultButton, DetailsList, Dialog, DialogFooter, IColumn, Icon, IconButton, Label, PrimaryButton, Selection, SelectionMode, Stack, TextField, TooltipHost } from \"office-ui-fabric-react\";\r\nimport * as React from \"react\";\r\nimport { approveBooking, rejectBooking } from \"../../../api/bookings\";\r\nimport { getRoomInfo } from \"../../../api/rooms\";\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport { BookingStatus, IBooking, IMyBooking } from \"../../../types/Booking.types\";\r\nimport { IRoom, RoomType } from \"../../../types/SiteLocation.types\";\r\n\r\nimport styles from \"./MyBookings.module.scss\";\r\nimport { useHistory } from \"react-router\";\r\n\r\nexport interface IBookingListProps {\r\n isApprovalMode?: boolean;\r\n bookings?: IMyBooking[] | IBooking[];\r\n label: string;\r\n listKey: string;\r\n selection: Selection;\r\n showStatus?: boolean;\r\n tooltip?: string;\r\n onChange?: (reload?: boolean, error?: Error) => void;\r\n}\r\n\r\nexport const BookingList = (props: IBookingListProps) => {\r\n const { bookings, label, listKey, selection, tooltip } = props;\r\n\r\n const userContext = React.useContext(ProfileContext);\r\n const history = useHistory();\r\n\r\n const [ reason, setReason ] = React.useState();\r\n const [ showReasonDialog, setShowReasonDialog ] = React.useState();\r\n\r\n // Cancellation Callback\r\n const _onRejectClick = React.useCallback((bookingId: number) => {\r\n return async () => {\r\n let cancel = false, cancelledByAdmin = false;\r\n const booking = bookings?.find((b) => b.Id === bookingId);\r\n let isOwner = false;\r\n if (userContext && booking && (\r\n booking.BookedByUserId === userContext.Profile.Id ||\r\n (booking.OnBehalfOfEmail && userContext.Profile.Email && booking.OnBehalfOfEmail.toLowerCase() === userContext.Profile.Email.toLowerCase())\r\n )) {\r\n isOwner = true;\r\n }\r\n if (booking) {\r\n const roomInfoResponse = await getRoomInfo(booking.RoomId as number);\r\n if (roomInfoResponse.ok) {\r\n let roomInfo: IRoom = await roomInfoResponse.json();\r\n if (!isOwner && roomInfo?.IsRoomAdmin) {\r\n if (!showReasonDialog && !Boolean(reason)) {\r\n setShowReasonDialog(bookingId);\r\n } else {\r\n cancel = true;\r\n cancelledByAdmin = true;\r\n }\r\n } else {\r\n cancel = window.confirm('Are you sure?');\r\n }\r\n if (cancel) {\r\n const response = await rejectBooking(bookingId, {CancellationReason: reason, CancelledByAdmin: cancelledByAdmin });\r\n if (props.onChange) {\r\n if (response === true) {\r\n props.onChange(true);\r\n } else {\r\n props.onChange(false, response);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (props.onChange) props.onChange(false, new Error(\"Unable to reject booking - issue with booking data\"));\r\n }\r\n };\r\n }, [ bookings, props, reason, showReasonDialog, userContext ]);\r\n\r\n const _approveBooking = React.useCallback(async (bookingId: number) => {\r\n if (window.confirm(`Approve this booking? Are you sure?`)) {\r\n let response = await approveBooking(bookingId);\r\n if (props.onChange) {\r\n if (response instanceof Error) {\r\n props.onChange(false, response);\r\n } else {\r\n props.onChange(true);\r\n }\r\n } \r\n }\r\n }, [props]);\r\n\r\n\r\n const columns = React.useMemo(() => {\r\n const fmh = new Date();\r\n const fma = new Date();\r\n fma.setMinutes(fmh.getMinutes() - 15);\r\n fmh.setMinutes(fmh.getMinutes() + 15);\r\n const rtn = [\r\n {\r\n key: \"deskName\",\r\n name: props.isApprovalMode ? \"Room\" : \"Desk / Room\",\r\n fieldName: \"DeskName\",\r\n minWidth: 80,\r\n maxWidth: 100,\r\n onRender: (item: IMyBooking, index, column) => {\r\n // For other orgs or if sites expand may want to list location and floorplan here too \r\n const isDesk = Boolean(item.DeskId);\r\n let resourceName = isDesk ? item.DeskName : item.RoomName;\r\n if (!resourceName || resourceName.trim().length === 0) resourceName = `${isDesk ? `Desk` : `Room`} (Id: ${isDesk ? item.DeskId : item.RoomId}`;\r\n return (\r\n \r\n {resourceName}\r\n
\r\n {item.SiteName}\r\n
\r\n
\r\n )\r\n }\r\n },\r\n {\r\n key: \"onBehalf\",\r\n name: \"On Behalf Of\",\r\n fieldName: \"OnBehalfOfEmail\",\r\n minWidth: 80,\r\n maxWidth: 100,\r\n onRender: (item: IMyBooking) => {\r\n return item.OnBehalfOfEmail ? item.OnBehalfOfEmail : \"Self\";\r\n },\r\n },\r\n {\r\n key: \"start\",\r\n name: \"Start\",\r\n fieldName: \"Start\",\r\n minWidth: 80,\r\n maxWidth: 150,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.Start) {\r\n const date = new Date(item.Start);\r\n let dateStr = date.toLocaleDateString();\r\n if (window.innerWidth < 768) dateStr = dateStr.substr(0, 5);\r\n return dateStr + \" \" + date.toLocaleTimeString().substr(0,5);\r\n }\r\n }\r\n },\r\n {\r\n key: \"finish\",\r\n name: \"Finish\",\r\n fieldName: \"Finish\",\r\n minWidth: 80,\r\n maxWidth: 150,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.Finish) {\r\n const date = new Date(item.Finish);\r\n let dateStr = date.toLocaleDateString();\r\n if (window.innerWidth < 768) dateStr = dateStr.substr(0, 5);\r\n return dateStr + \" \" + date.toLocaleTimeString().substr(0,5);\r\n }\r\n }\r\n },\r\n ] as IColumn[];\r\n if (!props.isApprovalMode) {\r\n rtn.push({\r\n key: \"parking\",\r\n name: \"Parking\",\r\n fieldName: \"IncludeParking\",\r\n iconName: \"ParkingSolid\",\r\n isIconOnly: true,\r\n minWidth: 40,\r\n maxWidth: 40,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.IncludeParking) {\r\n return \r\n \r\n ;\r\n }\r\n }\r\n },\r\n {\r\n key: \"directions\",\r\n name: \"Directions\",\r\n fieldName: \"PostCode\",\r\n iconName: \"MapDirections\",\r\n isIconOnly: true,\r\n minWidth: 40,\r\n maxWidth: 40,\r\n onRender: (item: IMyBooking, index, column) => {\r\n if (item.PostCode) {\r\n return \r\n \r\n \r\n }\r\n }\r\n });\r\n } else {\r\n rtn.push({\r\n key: \"description\",\r\n name: \"Description\",\r\n fieldName: \"Description\",\r\n minWidth: 150,\r\n maxWidth: 200\r\n },\r\n {\r\n key: \"approve\",\r\n name: \"Approve / Reject\",\r\n fieldName: \"Id\",\r\n minWidth: 150,\r\n maxWidth: 200,\r\n onRender: (item: IMyBooking, index, column) => {\r\n return (\r\n \r\n _approveBooking(item.Id)} />\r\n \r\n \r\n )\r\n }\r\n });\r\n }\r\n if (props.bookings?.some((b) => {\r\n const dt = new Date(b.Start);\r\n return b.Status === 1 && dt > fma && dt < fmh;\r\n })) {\r\n rtn.push({\r\n key: \"check-in\",\r\n name: \"Check In\",\r\n fieldName: \"ID\",\r\n minWidth: 100,\r\n onRender: (item: IMyBooking, index, column) => {\r\n const itemDt = new Date(item.Start);\r\n if (!(item.Status === 1 && itemDt > fma && itemDt < fmh)) return null;\r\n return (\r\n {\r\n history.push(`/check-in/${item.SiteId}/${item.LocationId}/${item.RoomId}`);\r\n }} />\r\n );\r\n }\r\n });\r\n }\r\n if (props.showStatus) {\r\n rtn.push({\r\n key: \"status\",\r\n name: \"Status\",\r\n fieldName: \"Status\",\r\n minWidth: 80,\r\n onRender: (item: IMyBooking, index, column) => {\r\n let status: string | JSX.Element | null = null;\r\n switch (item.Status) {\r\n case 0: {\r\n status = \"Pending\";\r\n break;\r\n }\r\n case 1: {\r\n status = \"Approved\";\r\n break;\r\n }\r\n case 2: {\r\n status = \"Rejected\";\r\n break;\r\n }\r\n case 3: {\r\n status = \"Cancelled\";\r\n break;\r\n }\r\n case 4: {\r\n status = \"Auto-Cancelled (No Check-In)\";\r\n }\r\n } \r\n if (item.Status as number > 1) {\r\n let reason = \"\";\r\n if (Boolean(item.CancellationReason)) reason += `${item.CancellationReason} `;\r\n if (Boolean(item.CancelledByUserName)) reason += `(${item.Status === BookingStatus.Rejected ? 'Rejected' : 'Cancelled'} by: ${item.CancelledByUserName})`;\r\n status = \r\n { status } {Boolean(reason.trim()) && }\r\n \r\n }\r\n return status;\r\n }\r\n })\r\n }\r\n return rtn;\r\n }, [_approveBooking, _onRejectClick, props]);\r\n\r\n if (!bookings || !bookings.length) return null;\r\n\r\n let labelJsx = ;\r\n if (tooltip) labelJsx = {labelJsx};\r\n\r\n return (\r\n <>\r\n {labelJsx}\r\n
\r\n `${listKey}_${item.Id}`}\r\n items={bookings}\r\n columns={columns}\r\n selection={selection}\r\n selectionMode={SelectionMode.single}\r\n />\r\n
\r\n { showReasonDialog !== undefined && (\r\n \r\n )}\r\n \r\n );\r\n};","import { CommandBar, DetailsList, Icon, Panel, PanelType, SelectionMode, TooltipHost, MessageBar, MessageBarType, Selection, Spinner, IconButton, Stack, PrimaryButton, Label } from \"office-ui-fabric-react\";\r\nimport { useCallback, useEffect, useState } from \"react\";\r\nimport { cancelBooking, getMyBookings } from \"../../../api/bookings\";\r\nimport { IBooking, IMyBooking } from \"../../../types/Booking.types\";\r\nimport { DeskBookingForm } from \"../forms/DeskBookingForm\";\r\nimport { RoomBookingForm } from \"../forms/RoomBookingForm\";\r\nimport { BookingList } from \"./MyBookingList\";\r\n\r\nimport styles from \"./MyBookings.module.scss\";\r\n\r\nexport interface IMyBookingsPanelProps {\r\n onDismiss: () => void;\r\n}\r\n\r\nexport const MyBookingsPanel = (props: IMyBookingsPanelProps) => {\r\n const { onDismiss } = props;\r\n\r\n const [ cancelling, setCancelling ] = useState(false);\r\n const [ bookings, setBookings ] = useState();\r\n const [ bookingSelected, setBookingSelected ] = useState();\r\n const [ viewDeskBooking, setViewDeskBooking ] = useState();\r\n const [ viewRoomBooking, setViewRoomBooking ] = useState();\r\n\r\n const onSelectionChanged = useCallback(function (table: string) {\r\n return function (this: Selection) {\r\n const selectedItems = this.getSelection() as IMyBooking[];\r\n if (selectedItems !== undefined && selectedItems.length > 0) {\r\n setBookingSelected(selectedItems[0] as IMyBooking);\r\n } else {\r\n setBookingSelected(undefined);\r\n }\r\n if (table === \"approvedBookings\") {\r\n selectionPending.setAllSelected(false);\r\n } else {\r\n selection.setAllSelected(false);\r\n }\r\n };\r\n }, []);\r\n \r\n const [ selection ] = useState(new Selection({ onSelectionChanged: onSelectionChanged(\"approvedBookings\") }));\r\n const [ selectionPending ] = useState(new Selection({ onSelectionChanged: onSelectionChanged(\"pendingBookings\") }));\r\n\r\n const _load = async () => {\r\n const response = await getMyBookings();\r\n if (response.ok) {\r\n const bookings = await response.json() as IMyBooking[];\r\n setBookings(bookings);\r\n }\r\n }\r\n\r\n const _cancelBooking = async (booking: IMyBooking) => {\r\n setCancelling(true);\r\n booking.CancelledByAdmin = false;\r\n const response = await cancelBooking(booking);\r\n if (response.ok) {\r\n setCancelling(false);\r\n _load();\r\n } else {\r\n alert('Unable to cancel booking');\r\n setCancelling(false);\r\n }\r\n selection.setAllSelected(false);\r\n selectionPending.setAllSelected(false);\r\n }\r\n\r\n useEffect(() => {\r\n _load();\r\n }, []);\r\n\r\n return (\r\n \r\n

Bookings that you make - for you and on behalf of others - will appear here:

\r\n { window.innerWidth < 640 && (\r\n You can scroll the table below with the mouse or your finger\r\n )}\r\n {\r\n if (bookingSelected) {\r\n if (bookingSelected.DeskId) {\r\n setViewDeskBooking(bookingSelected);\r\n } else {\r\n setViewRoomBooking(bookingSelected);\r\n }\r\n }\r\n }\r\n },\r\n {\r\n disabled: !bookingSelected || cancelling,\r\n key: \"cancel\",\r\n text: window.innerWidth < 640 ? \"Cancel\" : \"Cancel Booking\",\r\n onRender: cancelling ? () => : undefined,\r\n onClick: () => {\r\n if (bookingSelected) {\r\n _cancelBooking(bookingSelected);\r\n }\r\n }\r\n }\r\n ]}\r\n />\r\n { bookings !== undefined && bookings.length > 0 && (\r\n <>\r\n Boolean(b.DeskId) || (Boolean(b.RoomId) && b.Status === 1))}\r\n />\r\n { bookings.filter((b) => (Boolean(b.RoomId) && b.Status !== 1)).length > 0 && (\r\n <>\r\n (Boolean(b.RoomId) && b.Status !== 1))}\r\n tooltip=\"These bookings require approval\"\r\n showStatus={true}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n { viewDeskBooking !== undefined && (\r\n setViewDeskBooking(undefined)}\r\n booking={viewDeskBooking}\r\n readOnly={true}\r\n postCode={viewDeskBooking.PostCode}\r\n />\r\n )}\r\n { viewRoomBooking !== undefined && (\r\n {\r\n setViewRoomBooking(undefined);\r\n if (changesMade) {\r\n _load();\r\n }\r\n }}\r\n booking={viewRoomBooking}\r\n roomId={viewRoomBooking.RoomId as number}\r\n start={new Date(viewRoomBooking.Start)}\r\n />\r\n )}\r\n
\r\n );\r\n}","import * as React from \"react\";\r\nimport { Panel, PanelType, Stack, DatePicker, Dropdown, IDropdownOption, Spinner, MessageBar, DetailsList, TooltipHost, Icon, MessageBarType, SelectionMode, IColumn, TextField, Checkbox, ContextualMenu, IContextualMenuProps, ActionButton, DefaultButton } from \"office-ui-fabric-react\";\r\nimport { loadLocations, getSites } from \"../../../api/siteslocations\";\r\nimport { ILocation, IRoom, ISite, RoomType } from \"../../../types/SiteLocation.types\";\r\nimport { getRoomAvailability } from \"../../../api/rooms\";\r\nimport { ConstraintType, IAvailableRoomSlot, IBookingConstraint, IRoomAvailability } from \"../../../types/Booking.types\";\r\nimport { RoomBookingForm } from \"../forms/RoomBookingForm\";\r\nimport { ProfileContext } from \"../../../Home\";\r\nimport Utils from \"../../../utils\";\r\n\r\nexport interface IRoomBookingSearchProps {\r\n roomType: RoomType;\r\n}\r\n\r\nconst columns: IColumn[] = [\r\n {\r\n key: \"name\",\r\n fieldName: \"Name\",\r\n name: \"Room\",\r\n minWidth: 180,\r\n maxWidth: 200,\r\n },\r\n {\r\n key: \"capacity\",\r\n fieldName: \"Capacity\",\r\n name: \"Capacity\",\r\n minWidth: 80,\r\n maxWidth: 100,\r\n },\r\n {\r\n key: \"equipment\",\r\n fieldName: \"Equipment\",\r\n name: \"Equipment\",\r\n isIconOnly: true,\r\n iconName: \"Info\",\r\n minWidth: 30,\r\n maxWidth: 50,\r\n onRender: (item: IRoom) => {\r\n if (item.Equipment) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n }\r\n },\r\n ];\r\n\r\nconst initialFromDate = () => {\r\n const date = new Date();\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 9, 0 ,0);\r\n}\r\n\r\nconst initialToDate = () => {\r\n const date = new Date();\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 17, 0 ,0);\r\n}\r\n\r\nexport const RoomBookingSearch = (props:IRoomBookingSearchProps) => {\r\n\r\n const profileContext = React.useContext(ProfileContext);\r\n\r\n const [fromDate, setFromDate] = React.useState(initialFromDate());\r\n const [toDate, setToDate] = React.useState(initialToDate());\r\n const [slotFromDate, setSlotFromDate] = React.useState(undefined);\r\n const [slotToDate, setSlotToDate] = React.useState(undefined);\r\n const [sites, setSites] = React.useState();\r\n const [siteOptions, setSiteOptions] = React.useState([]);\r\n const [locations, setLocations] = React.useState();\r\n const [locationOptions, setLocationOptions] = React.useState([]);\r\n const [selectedSite, setSelectedSite] = React.useState();\r\n const [selectedLocation, setSelectedLocation] = React.useState();\r\n const [availability, setAvailability] = React.useState();\r\n const [availabilityError, setAvailabilityError] = React.useState();\r\n const [resultsLoading, setResultsLoading] = React.useState(false);\r\n const [multiDay, setMultiDay] = React.useState(false);\r\n const [pickRoom, setPickRoom] = React.useState();\r\n const [bookRoom, setBookRoom] = React.useState();\r\n\r\n // Runs on mount - loads a list of sites from the system\r\n const _loadSites = async (abortController: AbortController) => {\r\n const siteResponse = await getSites(abortController);\r\n if (siteResponse.ok) {\r\n const sites = await siteResponse.json() as ISite[];\r\n const siteDropdownOptions:IDropdownOption[] = sites.filter((s) => s.RoomBookingEnabled).map((s) => {\r\n return {\r\n key: s.Id,\r\n text: s.Title\r\n }\r\n });\r\n setSites(sites);\r\n setSiteOptions(siteDropdownOptions);\r\n }\r\n }\r\n\r\n // Runs when a new site is selected in the UI - loads a list of locations\r\n const _getLocations = React.useCallback(async (abortController: AbortController) => {\r\n if (selectedSite === undefined) return;\r\n setSelectedLocation(undefined);\r\n const locationResponse = await loadLocations(selectedSite);\r\n if (locationResponse.ok) {\r\n const locations = await locationResponse.json() as ILocation[];\r\n const locationDropdownOptions:IDropdownOption[] = locations.map((s) => {\r\n return {\r\n key: s.Id,\r\n text: s.Title\r\n }\r\n });\r\n setLocations(locations);\r\n setLocationOptions(locationDropdownOptions);\r\n }\r\n }, [selectedSite]);\r\n\r\n // When enough parameters are selected, this callback checks the room availability on a given date / time / site\r\n const _getAvailability = React.useCallback(async (abortController: AbortController) => {\r\n if (selectedSite && fromDate && toDate) {\r\n setResultsLoading(true);\r\n const response = await getRoomAvailability({\r\n fromDate, toDate, \r\n roomType: props.roomType,\r\n locationId: selectedLocation,\r\n siteId: selectedSite,\r\n }, abortController);\r\n if (response.ok) {\r\n setAvailability(await response.json() as IAvailableRoomSlot[]);\r\n }\r\n setResultsLoading(false);\r\n }\r\n }, [selectedSite, selectedLocation, fromDate, toDate]);\r\n\r\n // This effect runs the above callback\r\n React.useEffect(() => {\r\n const abortController = new AbortController();\r\n _getAvailability(abortController);\r\n\r\n return () => {\r\n abortController.abort();\r\n };\r\n }, [_getAvailability]);\r\n\r\n // This effect runs when the selected site is changed\r\n React.useEffect(() => {\r\n const abortController = new AbortController();\r\n _getLocations(abortController);\r\n\r\n return () => {\r\n abortController.abort();\r\n };\r\n }, [_getLocations]);\r\n\r\n // On Mount - Load Sites\r\n React.useEffect(() => {\r\n const abortController = new AbortController();\r\n _loadSites(abortController);\r\n\r\n // If unmounting, cancel any async queries\r\n return () => {\r\n abortController.abort();\r\n };\r\n }, []);\r\n\r\n // Validate changes to date selections\r\n React.useEffect(() => {\r\n if (fromDate && toDate && fromDate > toDate) {\r\n setToDate(new Date(fromDate));\r\n }\r\n if (fromDate && toDate && toDate < fromDate) {\r\n const newDate = new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate(), Math.max(fromDate.getHours(), toDate.getHours()), Math.max(fromDate.getMinutes(), toDate.getMinutes()), 0);\r\n setToDate(newDate);\r\n }\r\n if (`${toDate.getHours()}:${toDate.getMinutes()}` === `${fromDate.getHours()}:${fromDate.getMinutes()}`) {\r\n const newDate = new Date(toDate);\r\n newDate.setMinutes(newDate.getMinutes() + 15);\r\n setToDate(newDate);\r\n }\r\n }, [fromDate, toDate]);\r\n\r\n // on Time Change\r\n const _onTimeChange = React.useCallback((e: React.FormEvent, option?: IDropdownOption) => {\r\n const id = (e.target as HTMLDivElement).id;\r\n if (fromDate && toDate && option) {\r\n const itemKey = option.key as string;\r\n const timeElements = itemKey.split(\":\");\r\n if (timeElements && timeElements.length) {\r\n const hours = parseInt(timeElements[0], 10);\r\n const mins = parseInt(timeElements[1], 10);\r\n if (id === \"fromTime\") {\r\n const newFromDate = new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate(), hours, mins);\r\n setFromDate(newFromDate);\r\n } else {\r\n const newToDate = new Date(toDate.getFullYear(), toDate.getMonth(), toDate.getDate(), hours, mins);\r\n setToDate(newToDate);\r\n }\r\n }\r\n }\r\n }, [fromDate, toDate]);\r\n\r\n // If Desk Booking Time Constraint set globally, set maximum date on the date picker\r\n let maxDate: Date | undefined;\r\n let activeConstraint: IBookingConstraint | undefined = \r\n locations?.find((l) => l.Id === selectedLocation)?.RoomBookingConstraint ||\r\n sites?.find((s) => s.Id === selectedSite)?.RoomBookingConstraint ||\r\n profileContext?.Settings.GlobalRoomConstraint;\r\n if (activeConstraint) {\r\n const num = activeConstraint.Number;\r\n const type = activeConstraint.Type as ConstraintType;\r\n if (num) {\r\n maxDate = new Date();\r\n switch (type) {\r\n case ConstraintType.Week:\r\n maxDate.setDate(maxDate.getDate() + (7 * num));\r\n break;\r\n case ConstraintType.Month:\r\n maxDate.setMonth(maxDate.getMonth() + num);\r\n break;\r\n case ConstraintType.Year:\r\n maxDate.setFullYear(maxDate.getFullYear() + num);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let selectedSiteInfo: JSX.Element | null = null;\r\n if (selectedSite) {\r\n const site = sites?.find((s) => s.Id === selectedSite);\r\n if (site && site.Notes) {\r\n selectedSiteInfo = {site.Notes};\r\n }\r\n }\r\n\r\n let availableRooms: IAvailableRoomSlot[] = [];\r\n if (availability && availability.length > 0) {\r\n availableRooms = availability.reduce((prev, cur, idx, arr) => {\r\n if (!prev.find(slot => slot.ID === cur.ID)) {\r\n prev.push(cur);\r\n }\r\n return prev;\r\n }, [] as IAvailableRoomSlot[]);\r\n }\r\n\r\n let timeSlotChoices: IAvailableRoomSlot[] = [];\r\n if (pickRoom !== undefined && availability && availability.length) {\r\n timeSlotChoices = availability.filter(a => a.ID == pickRoom);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n { \r\n if (date) {\r\n const newFromDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 9, 0);\r\n setFromDate(newFromDate);\r\n if (!multiDay) {\r\n const newToDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 17, 0);\r\n setToDate(newToDate);\r\n } \r\n }\r\n }} \r\n />\r\n { multiDay === true && (\r\n { \r\n if (date) {\r\n let newDate = new Date(date);\r\n if (toDate) {\r\n newDate.setHours(toDate.getHours());\r\n newDate.setMinutes(toDate.getMinutes());\r\n }\r\n setToDate(newDate);\r\n }\r\n }}\r\n />\r\n )}\r\n setMultiDay(checked || false)} />\r\n \r\n { Boolean(!fromDate) && Boolean(selectedSite) && (\r\n
Please select a date
\r\n )}\r\n { Boolean(fromDate) === true && (\r\n \r\n ({\r\n key: (\"0\" + (Math.floor(idx / 4) + 8)).slice(-2) + \":\" + (\"0\" + (idx % 4 * 15)).slice(-2),\r\n text: (\"0\" + (Math.floor(idx / 4) + 8)).slice(-2) + \":\" + (\"0\" + (idx % 4 * 15)).slice(-2)\r\n } as IDropdownOption))}\r\n selectedKey={fromDate ? (\"0\" + fromDate.getHours()).slice(-2) + \":\" + (\"0\" + fromDate.getMinutes()).slice(-2) : undefined}\r\n onChange={_onTimeChange}\r\n />\r\n ({\r\n key: (\"0\" + (Math.floor(idx / 4) + 8)).slice(-2) + \":\" + (\"0\" + (idx % 4 * 15)).slice(-2),\r\n text: (\"0\" + (Math.floor(idx / 4) + 8)).slice(-2) + \":\" + (\"0\" + (idx % 4 * 15)).slice(-2)\r\n } as IDropdownOption))}\r\n selectedKey={toDate ? (\"0\" + toDate.getHours()).slice(-2) + \":\" + (\"0\" + toDate.getMinutes()).slice(-2) : undefined}\r\n onChange={_onTimeChange}\r\n />\r\n \r\n )}\r\n \r\n { if (option) setSelectedSite(option.key as number)}} />\r\n { if (option) setSelectedLocation(option.key as number)}} />\r\n {/* { if (option) setChosenDesk(option.key as number)}} /> */}\r\n \r\n
\r\n { selectedSiteInfo }\r\n { resultsLoading === true && (\r\n \r\n )}\r\n { (availableRooms.length > 0 || availabilityError != null) && (\r\n <>\r\n

Available Rooms

\r\n { availabilityError != null && (\r\n \r\n No availability for the date selected\r\n \r\n )}\r\n { availableRooms.length > 0 && (\r\n {\r\n return (\r\n setPickRoom(item.ID)} />\r\n );\r\n }\r\n }]}\r\n selectionMode={SelectionMode.none}\r\n />\r\n )}\r\n \r\n )}\r\n { timeSlotChoices.length > 0 && (\r\n