{"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/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/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","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","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","components/checkin.tsx","../pushNotifications.ts","components/cacheBuster.tsx","Home.tsx","components/policies/PrivacyPolicy.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","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","editFloorplanMetadata","floorplan","a","Id","fetch","method","body","JSON","stringify","headers","Accept","credentials","Error","createNewFloorplan","locationId","deleteFloorplan","floorplanId","loadLatestFloorplanEdit","loadLatestPublishedFloorplan","loadFloorplansForLocation","newFloorplanLayoutFromBlank","newFloorplanLayoutFromPrevious","updateFloorplanLayout","layoutId","drawing","publishFloorplanLayout","isAuthenticated","response","ok","getUserProfile","updateMyProfile","profile","json","searchUsers","searchStr","encodeURIComponent","searchTeams","getRoles","status","saveRoles","email","roleIds","RoleIds","catch","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","then","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","includes","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","info","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","window","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","RoomRects","roomRectangles","selectedRoomIdx","room","RoomEditor","_initialDrawingState","_autoSaveTimer","svg","_liveX","_liveY","_mouseDownOperation","_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","test","navigator","userAgent","Fabric","flex","setState","drawingState","cloneDeep","marginRight","confirm","history","maxHeight","gridTemplateColumns","gridTemplateRows","gridColumnStart","gridColumnEnd","gridRowStart","gridRowEnd","ref","version","baseProfile","onWheel","onDoubleClick","onMouseDown","onMouseMove","onMouseOut","onMouseUp","in","operator","radius","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","_startDeskRotation","_startDoorRotation","clickedDoorIdx","clickedTextIdx","clickedFloorIdx","clickedRoomIdx","_startMoveOrSelect","_startGrabCanvas","_doRoomDrawing","deskX","deskY","coordsContainer","querySelector","initialCoords","itemIdx","_performCanvasScroll","_drawRoomLayoutPreviewBox","_performDeskRotation","_performDoorRotation","_moveDraggable","collision","_checkDeskCollision","_handleStampableToolHover","mouseX","mouseY","_commitMovedObject","_commitDeskRotation","_commitDoorRotation","_releaseGrabbedCanvas","drawingStateChanged","_addNewStampable","remove","scrollTop","scrollLeft","scrollTo","top","deltaY","deltaX","firstChild","el","selectedIdx","clickedIdx","replace","rooms","rect","cursorContainer","doorPath","objectIdx","controlHandles","toString","atan2","deg","PI","deskElement","doorElement","stampables","offset","stampable","amendedDesk","amendedDoor","amendedDoors","draggableType","draggableArrName","draggableArr","amendedObject","amendedObjects","parseFloat","tool","_triggerMouseMove","bool","bounds","getBoundingClientRect","ratio","innerHeight","wDiff","hDiff","initializeIcons","registerIcons","icons","points","alignSelf","fillOpacity","strokeMiterlimit","ctm","getScreenCTM","f","xSvg","ySvg","xMouse","yMouse","returnObj","boundsChecker","Door","Floor","Room","hasOwnProperty","right","console","log","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","obj","isUser","userId","teamId","secondaryText","Email","b","nameA","nameB","numRegex","alphaOnlyA","alphaOnlyB","numberAmatches","exec","numberBmatches","numHighOrLow","numA","numB","off","getTimezoneOffset","absoff","abs","getTime","toFixed","padStart","resourceType","siteId","roomId","SiteId","LocationId","RoomId","Number","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","message","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","href","photo","Persona","isAdminColumn","roleName","getIconOrRoleName","Tags","tooltipProps","onRenderContent","single","saved","subText","User","saveSite","site","deleteSite","getSite","getDeskSites","getSites","getMySites","saveLocation","location","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","charAt","toUpperCase","_saveForm","formValues","siteAdminUserIds","sa","roomAdminTeamIds","deskAccessUserIds","da","deskAccessTeamIds","RoomAdminUsers","DeskAccessUsers","RoomAdminTeams","DeskAccessTeams","BookingConstraints","bc","find","mapUserToPersona","roomUserSearch","deskUserSearch","Pivot","PivotItem","checkIn","Location","saveRoom","deleteRoom","getRoomInfo","loadRoomsByApprover","loadRoomsBySite","loadRoomsByLocation","loadRoomsByLocationInclDisabled","getRoomAvailability","params","getRoomBookings","getSiteRoomBookings","RoomFormPanel","asRoomApprover","initialSiteAdminUsers","Capacity","capacity","setCapacity","Equipment","equipment","setEquipment","Disabled","setDisabled","Hidden","setHidden","roomAdmins","setRoomAdmins","qrCode","setQrCode","roomAdminUserIds","roomName","QRCode","toDataURL","protocol","host","code","Site","warning","createElement","LocationName","download","click","RoomQRCodeDialog","RoomsPanel","setRooms","locationSelected","setLocationSelected","showQR","setShowQR","_loadRooms","_deleteRoom","sort","onRenderHeader","colProps","defaultRenderer","ActionButton","path","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","slice","Month","Year","setFullYear","minDate","formatDate","dateToLocalISO","BookingSitePanel","color","borderRadius","BookingLocationPanel","siteNotes","setSiteNotes","_loadSiteInfo","to","BookingFloorplanPanel","floorplansResponse","Drawing","disableInteraction","filterTags","layoutDrawing","svgDimensions","handleHover","handleInteraction","bookingFormValues","context","scaleFactor","filteredDesks","onTouchStart","touches","xlinkHref","permitted","Teams","userTeamIds","deskTeams","some","val","arr","getDeskFromPoint","deskEl","childEls","elementsFromPoint","contains","g","DeskCallout","hoveredBooking","setUser","loadUserInfo","userData","BookedByUserId","start","end","onBehalfOf","Callout","rel","DeskBookingForm","readOnly","setSaving","setLayoutDrawing","setParkingEnabled","availableParking","setAvailableParking","setHoveredBooking","decodeURIComponent","FloorplanId","setBookingFormValues","locationName","setLocationName","locationBuildingNo","setLocationBuildingNo","setZoom","setTags","tagFilter","setTagFilter","toggleTag","tagId","LocationBuildingNo","SiteNotes","reduce","prev","cur","p","HasParking","totalSpaces","ParkingLimit","LayoutId","bookingsResponse","parkingBooked","_save","responseText","leftMostPoint","rightMostPoint","topMostPoint","bottomMostPoint","minX","maxX","minY","maxY","rectangles","calculateSvgDimensions","dt","defaultRender","closeLabel","onScroll","border","idxAttr","isTouch","isFree","newZoom","wrap","css","selected","RoomBookingForm","roomInfo","setRoomInfo","isOwner","setIsOwner","newBooking","setNewBooking","showReasonDialog","setShowReasonDialog","reason","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","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","sortRoomInfoAlphabetically","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","CheckIn","checkInBookings","setCheckInBookings","checkInError","setCheckInError","upcomingMeeting","UpcomingMeeting","previousMeeting","PreviousMeeting","roomDetails","RoomDetails","getData","ri","CheckedInByUserId","accept","gridColumn","gridRow","unregisteredCallback","vapidKey","serviceWorker","register","reg","CacheBuster","isLatestVersion","meta","latestVersion","versionA","versionB","versionsA","versionsB","shift","semverGreaterThan","process","prevProps","prevState","caches","names","delete","children","Home","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","approvals","SiteLvlAdmin","calendar","profileImg","settingsImg","RequestPermission","SetSnoozeCookie","PrivacyPolicy","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.d1822f3f.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;\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 {\r\n x: number; y: number;\r\n width: number; height: number;\r\n}\r\n\r\nexport type StampObj = \"Desk\" | \"Door\" | \"Text\";\r\n\r\nexport type ToolType = \"Pointer\" | \"Floor\" | \"Room\" | StampObj;\r\n\r\nexport type MouseDownOperationType = \"Scroll\" | \"MoveDesk\" | \"MoveDoor\" | \"MoveText\" | \"MoveRoom\" | \"MoveFloor\" | \"RotateDesk\" | \"RotateDoor\" | \"DrawFloorplan\" | \"DrawRoom\";\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 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) {\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 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 { 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 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) {\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 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) {\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}","import { IRoomEditorDrawingState } from \"../components/drawing/editor/FloorplanEditor\";\r\nimport { IFloorplan } from \"../types/SiteLocation.types\";\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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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\n\r\nexport async function isAuthenticated(): Promise {\r\n const response = await fetch('/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 fetch('/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 fetch('/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 fetch('/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 fetch('/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 fetch('/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 fetch(`/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 fetch(`/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 fetch('/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\n\r\nexport async function getTagsByType(type: TagType) {\r\n const tags: Tag[] = await (await fetch(`/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 fetch(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 fetch(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 fetch(`/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\n\r\nexport async function searchDeskBookings(searchParams: IBookingSearchParams) {\r\n return await fetch('/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 fetch('/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 fetch(`/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 } 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 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}\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}\r\n\r\nconst FloorRects = (props: IFloorRects) => {\r\n const { floorplanRectangles, selectedFloorIdx, selectedTool } = props;\r\n if (floorplanRectangles && floorplanRectangles.length > 0) {\r\n return (\r\n \r\n { floorplanRectangles.map((floor, idx) => {\r\n let className = \"floor floor-\" + idx;\r\n if (selectedTool === \"Pointer\" && selectedFloorIdx === idx) {\r\n className = \"draggable draggableFloor-\" + idx;\r\n }\r\n // if (!room.bookable) className += \" nonAvailableDesk\";\r\n \r\n return (\r\n \r\n );\r\n }) }\r\n \r\n );\r\n }\r\n return null;\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 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) {\r\n className = \"draggable draggableRoom-\" + idx;\r\n }\r\n // if (!room.bookable) className += \" nonAvailableDesk\";\r\n // if (room.rotation !== 0) {\r\n // transform = `rotate(${room.rotation})`;\r\n // }\r\n return (\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 { Fabric, initializeIcons, registerIcons, IconButton, Stack, PrimaryButton, Spinner } from \"office-ui-fabric-react\";\r\nimport { cloneDeep } from \"lodash\";\r\nimport * as React from \"react\";\r\nimport { createDeskSvg, createDoorSvg } from \"../SvgElements\";\r\nimport { IDesk, IMouseDownOperation, IRoomRectangle, IStampable, ITextBox, MouseDownOperationType, StampObj, 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\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 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 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 /** 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 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\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 { saving, defaultDeskRotation, drawing, selectedDeskIdx, selectedDoorIdx, selectedTextIdx, selectedFloorIdx, selectedRoomIdx, editingDeskIdx, editingTextIdx, selectedTool, showGrid, snapToGrid, zoom, undoStates, redoStates, deletingDeskId, showBookingsPanel } = this.state;\r\n const { desks, doors, text, floorplanRectangles, roomRectangles } = 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\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\"],\r\n #svgFloorplanEditor.pointerTool [class*=\"draggableRoom\"] {\r\n stroke: red !important;\r\n }\r\n #svgFloorplanEditor.pointerTool .draggable {\r\n cursor: move;\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 .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 \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 { /* 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 { 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 }, 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, snapToGrid } = this.state;\r\n const element = document.elementFromPoint(e.clientX, e.clientY);\r\n if (this.svg && element) {\r\n if (element.id === \"deskRotationHandle\") {\r\n this._startDeskRotation(e, selectedDeskIdx);\r\n return;\r\n }\r\n if (element.id === \"doorRotationHandle\") {\r\n this._startDoorRotation(e, selectedDoorIdx);\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 } = 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 {\r\n this._startGrabCanvas(e);\r\n }\r\n }\r\n if (selectedTool === \"Floor\" || selectedTool === \"Room\") {\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 (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._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 === \"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 === \"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 } 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 /** 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 (type === \"MoveDesk\") {\r\n this._commitMovedObject(type, itemIdx);\r\n }\r\n if (type === \"MoveDoor\") {\r\n this._commitMovedObject(type, itemIdx);\r\n }\r\n if (type === \"MoveText\") {\r\n this._commitMovedObject(type, itemIdx);\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 } 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.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 /** 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 /** 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 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 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 /** Desk Control Handle Operation: begins a desk rotation */\r\n private _startDeskRotation(e: React.MouseEvent, selectedDeskIdx: number | undefined) {\r\n const { x, y } = this._getSvgMousePosition(e, this.svg);\r\n if (selectedDeskIdx !== undefined && x !== undefined && y !== undefined) {\r\n this._mouseDownOperation = {\r\n initialCoords: [x, y],\r\n itemIdx: selectedDeskIdx,\r\n type: \"RotateDesk\"\r\n };\r\n }\r\n }\r\n\r\n /** Door Control Handle Operation: begins a door rotation */\r\n private _startDoorRotation(e: React.MouseEvent, selectedDoorIdx: number | undefined) {\r\n const { x, y } = this._getSvgMousePosition(e, this.svg);\r\n if (selectedDoorIdx !== undefined && x !== undefined && y !== undefined) {\r\n this._mouseDownOperation = {\r\n initialCoords: [x, y],\r\n itemIdx: selectedDoorIdx,\r\n type: \"RotateDoor\"\r\n };\r\n }\r\n }\r\n\r\n /** Room Tool: first click commences a room drawing operation, the second commits the drawn room or shape to state */\r\n private _doRoomDrawing(e: React.MouseEvent, x: number, y: number, snapToGrid: boolean) {\r\n const { roomRectangles, floorplanRectangles } = this.state.drawing;\r\n if (!this._mouseDownOperation) {\r\n this._mouseDownOperation = {\r\n initialCoords: [x, y],\r\n itemIdx: -1,\r\n type: this.state.selectedTool === \"Room\" ? \"DrawRoom\" : \"DrawFloorplan\"\r\n };\r\n return;\r\n }\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 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 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 const rect: IRoomRectangle = {\r\n x: x1, y: y1,\r\n width: (x2 - x1), height: (y2 - y1)\r\n };\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, such as a desk or door */\r\n private _moveDraggable(type: StampObj, objectIdx: number, deskX: number, deskY: 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 element.setAttribute(\"x\", deskX.toString());\r\n element.setAttribute(\"y\", deskY.toString());\r\n }\r\n if (controlHandles) {\r\n controlHandles.setAttribute(\"x\", (deskX + 10).toString());\r\n controlHandles.setAttribute(\"y\", (deskY + 12.5).toString());\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) {\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 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(${Math.round(deg)})`);\r\n }\r\n if (controlHandles) {\r\n (controlHandles.firstChild as SVGGElement).setAttribute(\"transform\", `rotate(${Math.round(deg)})`);\r\n }\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 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(${Math.round(deg)})`);\r\n }\r\n if (controlHandles) {\r\n (controlHandles.firstChild as SVGGElement).setAttribute(\"transform\", `rotate(${Math.round(deg)})`);\r\n }\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 /** Saves desk rotation to state */\r\n private _commitDeskRotation(desks: IDesk[], itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean) {\r\n const { drawing } = this.state;\r\n const desk = desks[itemIdx];\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 = a * (180 / Math.PI);\r\n const deskElement = document.querySelector('.draggableDesk-' + itemIdx);\r\n if (deskElement && deskElement.firstChild) {\r\n if (snapToGrid) {\r\n if (deg % 45 !== 0)\r\n deg = Math.round(deg / 45) * 45;\r\n }\r\n const amendedDesk = { ...desks[itemIdx] };\r\n const amendedDesks = [...desks];\r\n amendedDesk.rotation = deg;\r\n amendedDesks[itemIdx] = amendedDesk;\r\n this.setState({\r\n ...this.state,\r\n drawing: {...drawing, desks: amendedDesks},\r\n }, () => {\r\n this._mouseDownOperation = null;\r\n });\r\n }\r\n return { mouseX, mouseY };\r\n }\r\n\r\n /** Saves desk rotation to state */\r\n private _commitDoorRotation(doors: IStampable[], itemIdx: number, mouseX: number, mouseY: number, snapToGrid: boolean) {\r\n const { drawing } = this.state;\r\n const door = doors[itemIdx];\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 = a * (180 / Math.PI);\r\n const doorElement = document.querySelector('.draggableDoor-' + itemIdx);\r\n if (doorElement && doorElement.firstChild) {\r\n if (snapToGrid) {\r\n if (deg % 45 !== 0)\r\n deg = Math.round(deg / 45) * 45;\r\n }\r\n const amendedDoor = { ...doors[itemIdx] };\r\n const amendedDoors = [...doors];\r\n amendedDoor.rotation = deg;\r\n amendedDoors[itemIdx] = amendedDoor;\r\n this.setState({\r\n ...this.state,\r\n drawing: {...drawing, doors: amendedDoors},\r\n }, () => {\r\n this._mouseDownOperation = null;\r\n });\r\n }\r\n return { mouseX, mouseY };\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 draggableArrName = draggableType.toLowerCase();\r\n if (draggableArrName !== \"text\") draggableArrName += \"s\";\r\n let draggableArr: IStampable[] = [...(drawing as any)[draggableArrName]];\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)[draggableArrName] = amendedObjects;\r\n this.setState(newState, () => {\r\n this._mouseDownOperation = null;\r\n });\r\n }\r\n }\r\n }\r\n\r\n /** Saves new desk location to state */\r\n private _commitMovedDesk(itemIdx: number, desks: IDesk[]) {\r\n const { drawing } = this.state;\r\n const deskElement = document.querySelector('.draggableDesk-' + itemIdx);\r\n if (deskElement) {\r\n const x = deskElement.getAttribute(\"x\"), y = deskElement.getAttribute(\"y\");\r\n if (x && y) {\r\n const amendedDesk = { ...desks[itemIdx] };\r\n const amendedDesks = [...desks];\r\n amendedDesk.x = parseFloat(x);\r\n amendedDesk.y = parseFloat(y);\r\n amendedDesks[itemIdx] = amendedDesk;\r\n this.setState({\r\n ...this.state,\r\n drawing: {...drawing, desks: amendedDesks},\r\n }, () => {\r\n this._mouseDownOperation = null;\r\n });\r\n }\r\n }\r\n }\r\n\r\n /** Saves new door location to state */\r\n private _commitMovedDoor(itemIdx: number, doors: IStampable[]) {\r\n const { drawing } = this.state;\r\n const doorElement = document.querySelector('.draggableDoor-' + itemIdx);\r\n if (doorElement) {\r\n const x = doorElement.getAttribute(\"x\"), y = doorElement.getAttribute(\"y\");\r\n if (x && y) {\r\n const amendedDoor = { ...doors[itemIdx] };\r\n const amendedDoors = [...doors];\r\n amendedDoor.x = parseFloat(x);\r\n amendedDoor.y = parseFloat(y);\r\n amendedDoors[itemIdx] = amendedDoor;\r\n this.setState({\r\n ...this.state,\r\n drawing: {...drawing, doors: amendedDoors},\r\n }, () => {\r\n this._mouseDownOperation = null;\r\n });\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(\"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 '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 } = 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 };\r\n const boundsChecker: Record = { Desk: desks, Door: doors, Floor: floorplanRectangles, Room: roomRectangles };\r\n for (let key in boundsChecker) {\r\n boundsChecker[key].forEach((item, idx) => {\r\n if (item.x !== undefined && item.y !== undefined) {\r\n let bounds: { left: number, right: number, top: number, bottom: number} | undefined = undefined;\r\n if (item.hasOwnProperty('width')) {\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 /** 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} : 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 (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} : 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.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\";","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\n\r\nexport async function getSettings(abortController: AbortController) {\r\n const response = await fetch(`/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 fetch(`/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 };\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\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 fetch(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 fetch(`/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 fetch(`/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 fetch('/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 fetch('/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 fetch(`/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 fetch(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 fetch(`/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 fetch(`/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 fetch(`/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 } from \"../types/SiteLocation.types\";\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 fetch(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 fetch(`/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 fetch(`/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 getRoomInfo(id: number) {\r\n return await fetch(`/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 fetch('/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 fetch(`/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(id: number, abortController?: AbortController) {\r\n const response = await fetch(`/api/rooms/site/${id}`, {\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(id: number, abortController?: AbortController) {\r\n const response = await fetch(`/api/rooms/location/${id}`, {\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 fetch(`/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, siteId?: number; locationId?: number; minCapacity?: number;\r\n}, abortController: AbortController) {\r\n const response = await fetch(`/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 fetch(`/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 fetch(`/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\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\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, 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 (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 = 0;\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 !== undefined) {\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 { 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 } 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\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 calculateSvgDimensions = (drawing: IRoomEditorDrawingState) => {\r\n let leftMostPoint = 20000, rightMostPoint = 0, topMostPoint = 20000, 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 // 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.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, 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 { 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 { 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;\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, idx: 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, idx } = hoveredBooking;\r\n const desk = desks ? desks[idx] : undefined;\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, idx: 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 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 id = parseInt(idxAttr, 10);\r\n const desk = layoutDrawing.desks[id];\r\n const booking = bookings.filter((b) => b.DeskId === desk.id)[0];\r\n setHoveredBooking({ booking, idx: id });\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 isFree = deskEl.classList.contains(\"freeDesk\");\r\n if (idxAttr && isFree) {\r\n const id = parseInt(idxAttr, 10);\r\n const desk = layoutDrawing.desks[id];\r\n if (desk) {\r\n if (isTouch && (!hoveredBooking || hoveredBooking.idx !== id)) {\r\n const booking = bookings.filter((b) => b.DeskId === desk.id)[0];\r\n setHoveredBooking({ booking, idx: 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 } 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 } 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}\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 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