Giter Site home page Giter Site logo

danxfisher / meeteasier Goto Github PK

View Code? Open in Web Editor NEW
274.0 22.0 74.0 1.56 MB

MeetEasier is a web application that visualizes meeting room availability. It works using Exchange Web Services (EWS) with Exchange room lists in Office 365.

License: GNU General Public License v3.0

JavaScript 82.29% CSS 16.17% HTML 1.53%
meeting meetingroom meeting-room meeting-board conference conference-room-displays conference-room office365 reactjs exchange-web-services

meeteasier's Introduction

MeetEasier

Because why pay money for something you can do yourself?

Description

MeetEasier is a web application that visualizes meeting room availability. It works using Exchange Web Services (EWS) with Exchange room lists in Office 365.

Mockup 1


License

MeetEasier is licensed under the open source GNU General Public License (GPL 3.0).

In the event of wanting to commercially distribute a closed source modification of this code, please contact me.


Updates

  • v0.3.4
    • #34 - bug fix for 'Next up:' displaying incorrectly
  • v0.3.3
    • #18 - use localized sort for rooms
  • v0.3.2
    • Added additional error handling for incorrect credentials. The error will now be shown on the front end.
    • Updated the socket component to stop most ERR_CONNECTION_REFSUED errors from happening.
  • v0.3.1
    • Removed skipped rooms/room blacklist filtering from front end and added to back end.
  • v0.3
    • Cleaned up unnecessarily nested component folder structure
    • #8 - add script-shortcuts to package.json in root
    • #9 - support environment-variables for authentication and port configuration
    • #10 - create shrinkwraps for npm-dependencies
    • #11 - add .editorconfig
    • #12 - pass error (while fetching appointments), to frontend
    • #13 - set engine-requirements
    • #14 - add heartbeat-endpoint, to check if server is alive (for monitoring)
    • #15 - add '.nvmrc'
  • v0.2
    • Changed domain to accept more than just ".com" extension
    • Changed ui-react/config/flightboard.config.js to handle all text so that the application can be multilingual
    • Added ui-react/config/singleRoom.config.js to do the same for the single-room component
    • Added console.log to server.js to know when the server is running correctly
    • Updated styles slightly
  • v0.1
    • Initial release

Assumptions

This application assumes you have:

  • Exchange Online (Office 365)
  • Conference room mailboxes organized in room lists
  • Exchange Web Services (EWS) enabled
  • A service account with access to all conference room mailboxes and EWS
  • A web server with Node.js installed to run the application

Please Note: This application uses Basic Authentication which, by its very nature, is insecure. I would strongly suggest using SSL where ever you decide to run this.


Installation

  1. Optional: Install IISNode
    • I've also included a web.config file for an IIS install
  2. In root directory, open a terminal or cmd:
    $ npm install
    
  3. In the root directory, open a terminal or cmd:
    $ npm run build
    
  4. In the root directory, open a terminal or cmd:
    $ npm start
    
  5. If you want to start the react development server, in the root directory run:
    $ npm start-ui-dev
    

Root Folder Structure Explained

  • app/ : Routes for EWS APIs
  • app/ews/ : All EWS functionality
  • confg/ : All server side configuration settings
  • scss/ : All styles
  • static/ : All global static files
  • ui-react/ : Front end React routes and components

React /src Folder Structure Explained

There are three main directories in the ui-react/src/ folder:

  • components/ : Components separated in folders by function
  • config/ : Customizable config file (see defails below in Customization section)
  • layouts/ : Layout components for the two different layouts used.

Components

  • flightboard/ : All components related to the flightboard or "all meeting" layout
  • global : Components that will be used by both layouts
  • single-room : All components related to the Single Room layout

components/flightboard/

  • Board : Actual flightboard component itself
  • Clock : Clock component for the upper right hand of the display
  • Navbar : Top navigation/title bar piece
  • RoomFilter : Room list filter in the navbar

components/global/

  • NotFound : A "not found" page if an error or "404" occurs
  • Socket : A service component to run the web socket connection for updating the flightboard and single room display

components/single-room/

  • Clock : Clock component for the upper right hand of the display
  • Display : All other features of the single room display

Config

  • flightboard.config.js : Simple customization config explained in the Customization section

Layouts

  • flightboard/ : Layout for flightboard display
  • single-room/ : Layout for single room display

Customization

Simple

  • In /config/auth.js, enter your credentials and domain:

    module.exports = {
      // this user MUST have full access to all the room accounts
      'exchange' : {
        'username'  : '[email protected]',
        'password'  : 'PASSWORD',
        'uri'       : 'https://outlook.office365.com/EWS/Exchange.asmx'
      },
      'domain' : 'DOMAIN'
    };
  • Alternatively, username, password and domain can be set as environment variable

    export [email protected]
    export PASSWORD=password
    export DOMAIN=domain.com
  • In /config/room-blacklist.js, add any room by email to exclude it from the list of rooms:

      module.exports = {
        'roomEmails' : [
          '[email protected]'
        ]
      };
  • In /ui-react/src/config/flightboard.config.js, manage your customizations:

    module.exports = {
      'board' : {
        'nextUp' : 'Next Up',
        'statusAvailable' : 'Open',
        'statusBusy' : 'Busy',
        'statusError' : 'Error'
      },
    
      'navbar' : {
        'title' : 'Conference Room Availability',
      },
    
      'roomFilter' : {
        'filterTitle' : 'Locations',
        'filterAllTitle' : 'All Conference Rooms',
      },
    };
  • Upload your logo to /static/img/logo.png

Advanced

  • All EWS functionality is located in app/ews.
  • To change the interval in which the web socket emits, edit the interval time in app/socket-controller.js. By default, it is set to 1 minute.
  • To update styles, make sure you install grunt first with npm install -g grunt-cli. Then run grunt in the root directory to watch for SCSS changes. Use the .scss files located in the /scss folder.
    • All React components can be locally styled by adding a new .css file and importing it into the component itself if you'd prefer to do it that way.
  • In app/ews/rooms.js, there is a block of code that may not be necessary but were added as a convenience. Feel free to use it, comment it out, or remove it completely. It was designed for a use case where the email addresses (ex: [email protected]) do not match the corporate domain (ex: jsmith-enterprise).
    // if the email domain != your corporate domain,
    // replace email domain with domain from auth config
    var email = roomItem.Address;
    email = email.substring(0, email.indexOf('@'));
    email = email + '@' + auth.domain + '.com';

Flightboard Layout Mockup

Mockup 3

Single Room Layout Mockup

Mockup 2


Resources & Attributions

meeteasier's People

Contributors

am-jo-zt avatar danxfisher avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

meeteasier's Issues

no data

Hi,

cool project!!! But I seem to be failing somewhere. I'm a sysadm, not a dev guy :)
The webserver runs and I can see the room lists. I've created a user and gave this user full access to ALL room mailboxes in our office365 tenant.
In the nodejs logging it finds the room mailboxes but I keep getting the loading button? Any ideas?

Thx
Koen

Invariant Violation: Minified React error #31

Hi

We have had the dashboard running perfectly at the office yesterday. But today it started to fail.

im getting the error
Invariant Violation: Minified React error #31;
Uncaught (in promise) Invariant Violation: Minified React error #31;

I tried again with a clean git clone version of the project, and im getting the same error again.

Any ideas?

MeetEasier unusable: Update ews-javascript-api to latest version

This is basically a duplicate of #42 so please read it first...

I think it has something to do with a 3 year old version of the ews-javascript-api. I tried using the latest version (0.10.0 instead of 0.8.0 used in this repo) but it seems like something has fundamentally changed in the newer version.

I have absolutely nothing to do with nodejs and can't fix it myself but if anyone wants to look into it, i'd send you a couple of original bavarian beers ;)

Issue installing on a Pi

Does anyone have a fix for this?

pi@raspberrypi:~/MeetEasier $ sudo "/usr/bin/node" "/usr/bin/npm" "install"
(node:23170) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
npm WARN package.json meet-easier@ No repository field.
npm WARN package.json meet-easier@ No license field.
npm ERR! Error: Invalid Package: expected types/moment-timezone but found @types/moment-timezone
npm ERR!     at /usr/share/npm/lib/cache/add-local-tarball.js:161:14
npm ERR!     at _combinedTickCallback (internal/process/next_tick.js:131:7)
npm ERR!     at process._tickCallback (internal/process/next_tick.js:180:9)
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/npm/npm/issues>

npm ERR! System Linux 4.14.98-v7+
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install"
npm ERR! cwd /home/pi/MeetEasier
npm ERR! node -v v8.11.1
npm ERR! npm -v 1.4.21
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/pi/MeetEasier/npm-debug.log
npm ERR! not ok code 0
pi@raspberrypi:~/MeetEasier $ 

Error in calling service, error code:401

So I've been trying to troubleshoot this issue and hoping maybe someone can help ๐Ÿ˜‚. Here's the terminal output:

PS C:\TestSite\MeetEasier-master> npm start

> meet-easier@ start C:\TestSite\MeetEasier-master
> node server

now we're cooking.
sending ews request
{ url: 'https://outlook.office365.com/EWS/Exchange.asmx',
  headers:
   { 'Content-Type': 'text/xml; charset=utf-8',
     Accept: 'text/xml',
     Authorization: 'Basic ZXRlbXBsaW46SWxvdmVlbTEx' },
  type: 'POST',
  data: '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><soap:Header><t:RequestServerVersion Version="Exchange2016"></t:RequestServerVersion></soap:Header><soap:Body><m:GetRoomLists></m:GetRoomLists></soap:Body></soap:Envelope>' }
Error in calling service, error code:401
server: Microsoft-IIS/10.0
request-id: 12e5e5ed-f146-4dab-8d9f-1485968d4583
x-powered-by: ASP.NET
x-feserver: BN6PR1201CA0008
www-authenticate: Basic Realm=""
date: Tue, 02 Oct 2018 19:04:26 GMT
content-length: 0

I'm wondering if it's because of the Realm="" but I'm not sure where the code grabs the realm?
Any other thoughts would be greatly appreciated!

Cheers!

Meeting Title not displaying

I think I have everything set up correctly as everything is working great. Except that the title of the meeting does not display. Instead it displays the meeting organizers name. The issue is the same under Upcoming. Where can I edit what elements are displayed? Thanks

back button on display page

Hello, i have added a back button on display page but the nav bar gets stuck and not update! If i refresh the page it works:
<Link to={''}> <i className="fi-arrow-left"></i> </Link>

Flightboard and Single Room display (Field for Meeting Subject)

Hi, I managed to get the system up and running. Thanks to developers and contributors. I have some questions:

  1. How do I change (in my flightboard and single room display) the meeting subject? At the moment, the field is populated with the name of the person doing the booking (marked in red). It is different as in mockup display.
    Meeteasier singleroom
    Meeteasier flightboard

  2. In the installation guide, the default is at port 8080. In order to change the port (eg port 80), the guide mentioned that we must change in 3 locations. What are the locations?

Thank you.

ERR_CONNECTION_REFUSED

Hello,
I'm having this problem.

Failed to load resource: net::ERR_CONNECTION_REFUSED
polling-xhr.js:263 GET http://localhost:8080/socket.io/?EIO=3&transport=polling&t=MD5IkiX 0 ()
i.create @ polling-xhr.js:263
i @ polling-xhr.js:165
o.request @ polling-xhr.js:92
o.doPoll @ polling-xhr.js:122
r.poll @ polling.js:118
r.doOpen @ polling.js:63
r.open @ transport.js:80
r.open @ socket.js:245
r @ socket.js:119
r @ socket.js:28
r.open.r.connect @ manager.js:226
(anonymous) @ manager.js:540
setTimeout (async)
r.reconnect @ manager.js:530
r.maybeReconnectOnOpen @ manager.js:208
(anonymous) @ manager.js:250
r.emit @ index.js:133
r.onError @ socket.js:685
(anonymous) @ socket.js:276
r.emit @ index.js:133
r.onError @ transport.js:67
(anonymous) @ polling-xhr.js:128
r.emit @ index.js:133
i.onError @ polling-xhr.js:309
(anonymous) @ polling-xhr.js:256
setTimeout (async)
hasXDR.n.onreadystatechange @ polling-xhr.js:255
polling-xhr.js:263 GET http://localhost:8080/socket.io/?EIO=3&transport=polling&t=MD5Ilt1 0 ()

Where can I check to find the solution?
My installation runs on Ubuntu 16.04.
Thank you

OAuth for MeetEasier

Hi! We are using an 2F Authentication on our 365 Account, do you have an update in relation to this? Thanks!

Error Running npm run build

Following the installation steps, I got this error while running "npm run build"

"23 error Failed at the meet-easier@ build script 'cd ui-react && npm run build'."

Does anyone have any idea?

On-prem exchange

I took the advise of the reddit post and attempted this with our on-prem exchange (both 2013 and 2016 servers) just to see if it works (and for fun).
Changing "var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2016);" to accommodate either 2013 or 2016 EWS setups did seem to get it to work somewhat. I tried both 2013 and 2016 server EWS uri's. It works "up to a point".

The terminal console of my ubuntu server starts showing all the rooms and roomlists as I refresh the website in a browser.
And I can see the room lists show up in the website. But that's all I get. The roomlists aren't clickable. No information is shown. I just get a page with a drop down of all my room lists.

Figured I'd put this here in case someone else was chancing it with on-prem servers or had similar issues.

Auth all seems in order, and I can't see any errors to report. shrug

โœจ docker image

How about creating an docker image with base images from https://hub.docker.com/_/node/
no problems with creating the right environment, or setting up an nginx for redirect to port 80 etc.

I will Contribute and could create a docker build file.

Grey page

Hello,

When browsing to http://localhost:8080 the page loads for a second and in the list I can see all our offices but then the page quickly clears and I'm left with just a grey blank page.

I noticed I keep getting the below error as well.

image

Any suggestions?

Cheers,
Ryan

Make groups accessible via url

Hi,

we use the program in different production facilities. Would it be possible to access the different groups directly via url, without using the dropdown menu? That would make automating a lot easier.

Limit connections used?

I keep getting "You have exceeded the available concurrent connections for your account" in my logs and the web-page never finish loading. Is there support for limit the number of the connections used? Either in MeetEasier or ews-javascript-api?

/BS

loading forever but i see good logs

Hello

I installed MeetEasier without any problems, i can see all locations, but cannot press on it and see what in there.
On main screen loading forever :D

Any ideas?

image
image

how to bind local data not ews

hi, because my exchange server was a little bit out of style. so i used some special way to get the data from exchange and stored them in my sqlserver. sqlserver data will be updated automatically every 5 mins.
so, i want to know how i can bind my data with this project? because i love this UI and design so much
thanks!

Feature Request - Month View

I think a month view would be a great feature. Many users like to view all events overlayed on one monthly calendar view.

Error in calling service, error code:0

image

Mmm, I can make the company that has the firewall of us accept a link so that the firewall does not block the execution of the App, the problem is that the request of the room and roomList lasts a long time. Sometimes it works or others do not (when I am connected to the network of the company that provides the proxy).

I tried to implement what you told me but it gave me a token error when I try to use the import

Mmm, I can make the company that has the firewall of us accept a link so that the firewall does not block the execution of the App, the problem is that the request of the room and roomList lasts a long time. Sometimes it works or others do not (when I am connected to the network of the company that provides the proxy).

I tried to implement what you told me but it gave me a token error when I try to use the import

Do you have any idea of the link that may be blocked when I use the firewall? And I know that it is ews-javascript-api because when I put in the address bar: root / api / room.js then it loads a lot

npm run build - Compiled with warnings.

Hi danxfisher,
I really interesting on your project and I try build one for my company.
But I got this while complied it as the picture below!
image
Sorry I not good at coder so I cannot fix it.
Can you help me?
Thanks so much!

Meeting Subject

It seems to have a GET "Meeting Subject" error. Has anyone made the same issues as me? Organizer and Subject are now displayed in the same way :|

Question: Exchange Server 2013

Hi, is there any change that its possible to modify the code so it works with Exchange Server 2013? Or is that just not possible?

At the moment im getting

{ 
  ResponseCode: 'ErrorInvalidServerVersion',
  Message: 'The specified server version is invalid.' 
}

No Longer Working

Since this uses Basic Authentication, the tool is no longer working

WebPage not updated auto

Hello,

First at all, a big thanks for your works.

I have a small issue and I don't know why.
On the page, I can see all the room but it's not refresh automatically.
The config/controller.js.,it is set to 1 minute (the default value).

Regards

process.env.USERNAME won't work in WINDOWS

The choice of using an environment var with this name makes a lot of 401 auth erros simply because no mater what you put on auth.js, the code will always revert the the logged in windows USERNAME and the authentication in Office365 will only work if the developer is testing with his own corporate account.
Related issues:
#32
#4
#43
Using another convention solves this: e.g. USRNAME

UnhandledPromiseRejectionWarning

I created 3 room mailboxes in an demo azure tenant.
MeetingRoom1
MeetingRoom2
MeetingRoom3

Created a test meeting in all 3 room's which was automatically accepted.
Created a Distribution List named "Rooms" and added all 3 meetingrooms in it
New-DistributionGroup -Name "Rooms" -DisplayName "Rooms" -PrimarySmtpAddress "[email protected]" -RoomList
Add-DistributionGroupMember -Identity "Rooms" -Member "Meetingroom1"

Added admin at xxx.onmicrosoft com with password and domain in the auth.js
Added "Meetingroom1 @ xxx.onmicrosoft.com" to room-blacklist.js.

Creating some meetings in the meeting rooms and adding 1 meeting room to the blacklist should solve some issues according to other github issues/reply's

pi@raspberrypi:~/MeetEasier $ npm start

> meet-easier@ start /home/pi/MeetEasier
> node server

now we're cooking.
(node:24337) UnhandledPromiseRejectionWarning: TypeError: ews.TimeSpan.FromHours(...).asMilliseconds is not a function
    at /home/pi/MeetEasier/app/ews/rooms.js:118:141
    at Array.forEach (<anonymous>)
    at /home/pi/MeetEasier/app/ews/rooms.js:116:21
    at new Promise (<anonymous>)
    at getAppointmentsForRooms (/home/pi/MeetEasier/app/ews/rooms.js:109:19)
(node:24337) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:24337) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:24337) UnhandledPromiseRejectionWarning: TypeError: ews.TimeSpan.FromHours(...).asMilliseconds is not a function
    at /home/pi/MeetEasier/app/ews/rooms.js:118:141
    at Array.forEach (<anonymous>)
    at /home/pi/MeetEasier/app/ews/rooms.js:116:21
    at new Promise (<anonymous>)
    at getAppointmentsForRooms (/home/pi/MeetEasier/app/ews/rooms.js:109:19)
(node:24337) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 4)

While this is in the console, the webpage does show the "Rooms" under Locations but it keeps spinning.

24 hour clock?

Is it possible to display a 24 hour clock instead of AM/PM?

Issue with IIS without IISNode

Error in calling service, error code:401
server: Microsoft-IIS/8.5
request-id: d08231b1-6531-4218-88b4-0f4f1cbb6a9d
www-authenticate: Negotiate, NTLM
x-powered-by: ASP.NET
x-feserver: EXCHANGESERVERNAME
date: Fri, 17 Nov 2017 22:47:08 GMT
content-length: 0

@Gavinr98 we can continue conversation here.

Error in calling service, error code: 0

Hello, first of all thanks for this awsome app.

Secondly, i cant handle a recurrent error that is driving me crazy.
The console sends nonerratics outputs until it shows up the "Error in calling service, error code:0" for each display connected and then repeats the "sending ews request" with result "Error 0" for hours until eventualy returns to the normal activity by itself.

Idk if i missed something or where to look. Since it worked well and still periodicaly "works" and the credentials are corrects, im lost.

The platform is O365.

Any advice?

Book Now button

Awesome work by the way. How easy/hard/complicated would it be to incorporate a book now button on the single-room screen for impromptu meetings. I'm a novice with JS and totally new to node, but I'm giving it a go nonetheless.

What I'm trying is :

  1. to check is if the room is free display the button to book now.
  2. If its busy and there is no concurrent meeting display another button to extend the booking.

for both of those the buttons should be relatively the same
a. check how long the room is free for (if 2 then check after the current booking) and display blocks of 15 minutes up to 2 hours.
b. if one of the buttons is clicked book the room for that block of time selected.

The specified folder could not be found in the store ?

I'm succesfully retrieving room lists and I can see it finds all the rooms but after that I get following error:

The specified folder could not be found in the store

XMLHttpRequest {
  onloadstart: null,
  onprogress: null,
  onabort: null,
  onerror: null,
  onload: null,
  ontimeout: null,
  onloadend: null,
  _listeners: {},
  onreadystatechange: [Function: noop],
  _anonymous: undefined,
  readyState: 4,
  response: '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:ServerVersionInfo MajorVersion="15" MinorVersion="20" MajorBuildNumber="239" MinorBuildNumber="10" Version="V2017_10_09" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/></s:Header><s:Body><m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><m:ResponseMessages><m:FindItemResponseMessage ResponseClass="Error"><m:MessageText>The specified folder could not be found in the store.</m:MessageText><m:ResponseCode>ErrorFolderNotFound</m:ResponseCode><m:DescriptiveLinkKey>0</m:DescriptiveLinkKey></m:FindItemResponseMessage></m:ResponseMessages></m:FindItemResponse></s:Body></s:Envelope>',
  responseText: '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:ServerVersionInfo MajorVersion="15" MinorVersion="20" MajorBuildNumber="239" MinorBuildNumber="10" Version="V2017_10_09" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/></s:Header><s:Body><m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><m:ResponseMessages><m:FindItemResponseMessage ResponseClass="Error"><m:MessageText>The specified folder could not be found in the store.</m:MessageText><m:ResponseCode>ErrorFolderNotFound</m:ResponseCode><m:DescriptiveLinkKey>0</m:DescriptiveLinkKey></m:FindItemResponseMessage></m:ResponseMessages></m:FindItemResponse></s:Body></s:Envelope>',
  responseType: '',
  responseURL: 'https://outlook.office365.com/EWS/Exchange.asmx',
  status: 200,
  statusText: 'OK',
  timeout: 0,
  upload:
   XMLHttpRequestUpload {
     onloadstart: null,
     onprogress: null,
     onabort: null,
     onerror: null,
     onload: null,
     ontimeout: null,
     onloadend: null,
     _listeners: {},
     _request: [Circular],
     _contentType: 'text/plain;charset=UTF-8',
     _body: <Buffer 3c 73 6f 61 70 3a 45 6e 76 65 6c 6f 70 65 20 78 6d 6c 6e 73 3a 73 6f 61 70 3d 22 68 74 74 70 3a 2f 2f 73 63 68 65 6d 61 73 2e 78 6d 6c 73 6f 61 70 2e ... > },
  _method: 'POST',
  _url:
   Url {
     protocol: 'https:',
     slashes: true,
     auth: null,
     host: 'outlook.office365.com',
     port: null,
     hostname: 'outlook.office365.com',
     hash: null,
     search: null,
     query: null,
     pathname: '/EWS/Exchange.asmx',
     path: '/EWS/Exchange.asmx',
     href: 'https://outlook.office365.com/EWS/Exchange.asmx' },
  _sync: false,
  _headers:
   { 'Content-Type': 'text/xml; charset=utf-8',
     Accept: 'text/xml',
     Authorization: 'Basic b3NrYXJpLmthbnRvbmllbWlAc29mb2t1cy5jb206ejloa25zdiEh',
     Connection: 'keep-alive',
     Host: 'outlook.office365.com',
     'User-Agent': 'Mozilla/5.0 (Darwin x64) node.js/8.9.1 v8/6.1.534.47',
     'Content-Length': '824' },
  _loweredHeaders:
   { 'content-type': 'Content-Type',
     accept: 'Accept',
     authorization: 'Authorization' },
  _mimeOverride: null,
  _request: null,
  _response: null,
  _responseParts: null,
  _responseHeaders:
   { 'cache-control': 'private',
     'transfer-encoding': 'chunked',
     'content-type': 'text/xml; charset=utf-8',
     server: 'Microsoft-IIS/10.0',
     'request-id': '3dfe23c3-1f1f-4fa5-8c4c-3791262ef4bf',
     'x-calculatedfetarget': 'AM0PR0102CU001.internal.outlook.com',
     'x-backendhttpstatus': '200, 200',
     'x-feproxyinfo': 'AM0PR0102CA0036.EURPRD01.PROD.EXCHANGELABS.COM',
     'x-calculatedbetarget': 'DB5PR0201MB1542.eurprd02.prod.outlook.com',
     'x-ewshandler': 'FindItem',
     'x-aspnet-version': '4.0.30319',
     'x-diaginfo': 'DB5PR0201MB1542',
     'x-beserver': 'DB5PR0201MB1542',
     'x-feserver': 'AM0PR0102CA0036, DB6PR0301CA0049',
     'x-powered-by': 'ASP.NET',
     date: 'Tue, 21 Nov 2017 11:38:50 GMT' },
  _aborting: null,
  _error: null,
  _loadedBytes: 1024,
  _totalBytes: 0,
  _lengthComputable: false }
{ __prefix: 's',
  __xmlns:
   { s: 'http://schemas.xmlsoap.org/soap/envelope/',
     h: 'http://schemas.microsoft.com/exchange/services/2006/types',
     xsd: 'http://www.w3.org/2001/XMLSchema',
     xsi: 'http://www.w3.org/2001/XMLSchema-instance',
     m: 'http://schemas.microsoft.com/exchange/services/2006/messages',
     t: 'http://schemas.microsoft.com/exchange/services/2006/types' },
  Header:
   { __prefix: 's',
     ServerVersionInfo:
      { __prefix: 'h',
        __type: 'ServerVersionInfo',
        MajorVersion: '15',
        MinorVersion: '20',
        MajorBuildNumber: '239',
        MinorBuildNumber: '10',
        Version: 'V2017_10_09' } },
  Body:
   { __prefix: 's',
     FindItemResponse:
      { __prefix: 'm',
        __type: 'FindItemResponse',
        ResponseMessages:
         { __prefix: 'm',
           __type: 'ResponseMessages',
           FindItemResponseMessage:
            { __prefix: 'm',
              __type: 'FindItemResponseMessage',
              ResponseClass: 'Error',
              MessageText: 'The specified folder could not be found in the store.',
              ResponseCode: 'ErrorFolderNotFound',
              DescriptiveLinkKey: '0' } } } } }
{ __prefix: 'soap',
  __xmlns:
   { soap: 'http://schemas.xmlsoap.org/soap/envelope/',
     xsi: 'http://www.w3.org/2001/XMLSchema-instance',
     m: 'http://schemas.microsoft.com/exchange/services/2006/messages',
     t: 'http://schemas.microsoft.com/exchange/services/2006/types' },
  Header:
   { __prefix: 'soap',
     RequestServerVersion:
      { __prefix: 't',
        __type: 'RequestServerVersion',
        Version: 'Exchange2016' } },
  Body:
   { __prefix: 'soap',
     FindItem:
      { __prefix: 'm',
        __type: 'FindItem',
        Traversal: 'Shallow',
        ItemShape:
         { __prefix: 'm',
           __type: 'ItemShape',
           BaseShape: 'AllProperties' },
        CalendarView:
         { __prefix: 'm',
           __type: 'CalendarView',
           MaxEntriesReturned: '6',
           StartDate: '2017-11-21T11:38:51.243Z',
           EndDate: '2017-12-01T11:38:51.244Z' },
        ParentFolderIds:
         { __prefix: 'm',
           __type: 'ParentFolderIds',
           DistinguishedFolderId:
            { __prefix: 't',
              __type: 'DistinguishedFolderId',
              Id: 'calendar',
              Mailbox:
               { __prefix: 't',
                 __type: 'Mailbox',
                 EmailAddress: '[email protected]' } } } } } }
XMLHttpRequest {
  onloadstart: null,
  onprogress: null,
  onabort: null,
  onerror: null,
  onload: null,
  ontimeout: null,
  onloadend: null,
  _listeners: {},
  onreadystatechange: [Function: noop],
  _anonymous: undefined,
  readyState: 4,
  response: '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:ServerVersionInfo MajorVersion="15" MinorVersion="20" MajorBuildNumber="239" MinorBuildNumber="10" Version="V2017_10_09" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/></s:Header><s:Body><m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><m:ResponseMessages><m:FindItemResponseMessage ResponseClass="Error"><m:MessageText>The specified folder could not be found in the store.</m:MessageText><m:ResponseCode>ErrorFolderNotFound</m:ResponseCode><m:DescriptiveLinkKey>0</m:DescriptiveLinkKey></m:FindItemResponseMessage></m:ResponseMessages></m:FindItemResponse></s:Body></s:Envelope>',
  responseText: '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:ServerVersionInfo MajorVersion="15" MinorVersion="20" MajorBuildNumber="239" MinorBuildNumber="10" Version="V2017_10_09" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/></s:Header><s:Body><m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><m:ResponseMessages><m:FindItemResponseMessage ResponseClass="Error"><m:MessageText>The specified folder could not be found in the store.</m:MessageText><m:ResponseCode>ErrorFolderNotFound</m:ResponseCode><m:DescriptiveLinkKey>0</m:DescriptiveLinkKey></m:FindItemResponseMessage></m:ResponseMessages></m:FindItemResponse></s:Body></s:Envelope>',
  responseType: '',
  responseURL: 'https://outlook.office365.com/EWS/Exchange.asmx',
  status: 200,
  statusText: 'OK',
  timeout: 0,
  upload:
   XMLHttpRequestUpload {
     onloadstart: null,
     onprogress: null,
     onabort: null,
     onerror: null,
     onload: null,
     ontimeout: null,
     onloadend: null,
     _listeners: {},
     _request: [Circular],
     _contentType: 'text/plain;charset=UTF-8',
     _body: <Buffer 3c 73 6f 61 70 3a 45 6e 76 65 6c 6f 70 65 20 78 6d 6c 6e 73 3a 73 6f 61 70 3d 22 68 74 74 70 3a 2f 2f 73 63 68 65 6d 61 73 2e 78 6d 6c 73 6f 61 70 2e ... > },
  _method: 'POST',
  _url:
   Url {
     protocol: 'https:',
     slashes: true,
     auth: null,
     host: 'outlook.office365.com',
     port: null,
     hostname: 'outlook.office365.com',
     hash: null,
     search: null,
     query: null,
     pathname: '/EWS/Exchange.asmx',
     path: '/EWS/Exchange.asmx',
     href: 'https://outlook.office365.com/EWS/Exchange.asmx' },
  _sync: false,
  _headers:
   { 'Content-Type': 'text/xml; charset=utf-8',
     Accept: 'text/xml',
     Authorization: 'Basic b3NrYXJpLmthbnRvbmllbWlAc29mb2t1cy5jb206ejloa25zdiEh',
     Connection: 'keep-alive',
     Host: 'outlook.office365.com',
     'User-Agent': 'Mozilla/5.0 (Darwin x64) node.js/8.9.1 v8/6.1.534.47',
     'Content-Length': '820' },
  _loweredHeaders:
   { 'content-type': 'Content-Type',
     accept: 'Accept',
     authorization: 'Authorization' },
  _mimeOverride: null,
  _request: null,
  _response: null,
  _responseParts: null,
  _responseHeaders:
   { 'cache-control': 'private',
     'transfer-encoding': 'chunked',
     'content-type': 'text/xml; charset=utf-8',
     server: 'Microsoft-IIS/10.0',
     'request-id': 'b36a057c-ddc3-40fc-b87d-fe3798fd6a62',
     'x-calculatedfetarget': 'AM0PR0102CU001.internal.outlook.com',
     'x-backendhttpstatus': '200, 200',
     'x-feproxyinfo': 'AM0PR0102CA0027.EURPRD01.PROD.EXCHANGELABS.COM',
     'x-calculatedbetarget': 'DB5PR0201MB1542.eurprd02.prod.outlook.com',
     'x-ewshandler': 'FindItem',
     'x-aspnet-version': '4.0.30319',
     'x-diaginfo': 'DB5PR0201MB1542',
     'x-beserver': 'DB5PR0201MB1542',
     'x-feserver': 'AM0PR0102CA0027, DB6PR0301CA0046',
     'x-powered-by': 'ASP.NET',
     date: 'Tue, 21 Nov 2017 11:38:51 GMT' },
  _aborting: null,
  _error: null,
  _loadedBytes: 1024,
  _totalBytes: 0,
  _lengthComputable: false }
{ __prefix: 's',
  __xmlns:
   { s: 'http://schemas.xmlsoap.org/soap/envelope/',
     h: 'http://schemas.microsoft.com/exchange/services/2006/types',
     xsd: 'http://www.w3.org/2001/XMLSchema',
     xsi: 'http://www.w3.org/2001/XMLSchema-instance',
     m: 'http://schemas.microsoft.com/exchange/services/2006/messages',
     t: 'http://schemas.microsoft.com/exchange/services/2006/types' },
  Header:
   { __prefix: 's',
     ServerVersionInfo:
      { __prefix: 'h',
        __type: 'ServerVersionInfo',
        MajorVersion: '15',
        MinorVersion: '20',
        MajorBuildNumber: '239',
        MinorBuildNumber: '10',
        Version: 'V2017_10_09' } },
  Body:
   { __prefix: 's',
     FindItemResponse:
      { __prefix: 'm',
        __type: 'FindItemResponse',
        ResponseMessages:
         { __prefix: 'm',
           __type: 'ResponseMessages',
           FindItemResponseMessage:
            { __prefix: 'm',
              __type: 'FindItemResponseMessage',
              ResponseClass: 'Error',
              MessageText: 'The specified folder could not be found in the store.',
              ResponseCode: 'ErrorFolderNotFound',
              DescriptiveLinkKey: '0' } } } } }

Roomlist requirement?

Could this made to work without rooms being organized to room lists? As in, why is there such a requirement? I'm not familiar with the O365 Api but for my use I would just be fine with it fetching all rooms and having a black/whitelist feature for showing / hiding them.

Issue with the credentials you have supplied

I can't seem to get it to work, I keep getting the following "Oops, there seems to be an issue with the credentials you have supplied. Make sure you typed them correctly and that you have access to Exchange Roomlists". I've tested it out with EWSEditor (https://github.com/dseph/EwsEditor ) and it all works fine. I've even written some .net scripts to test and I can pull down the rooms that way too. Is there any way to troubleshoot or any logging information outputted somewhere?

Thanks

Empty calendar causes blank screen error on return to free status

Hi,

We have a single meeting room calendar on the display and everything seems to work ok. When a meeting is in progress and the screen shows busy and when the meeting is over and the screen should return to open (green) the screen goes blank and looking at the console I see the following error:

TypeError: Cannot read property 'Subject' of undefined at s (main.d06b06f7.js:1) at beginWork (main.d06b06f7.js:1) at i (main.d06b06f7.js:1) at c (main.d06b06f7.js:1) at l (main.d06b06f7.js:1) at m (main.d06b06f7.js:1) at h (main.d06b06f7.js:1) at Object.enqueueSetState (main.d06b06f7.js:1) at t.o.setState (main.d06b06f7.js:1) at Object.n.handleSocket [as response] (main.d06b06f7.js:1) p @ main.d06b06f7.js:1 main.d06b06f7.js:1 Uncaught TypeError: Cannot read property 'Subject' of undefined at s (main.d06b06f7.js:1) at beginWork (main.d06b06f7.js:1) at i (main.d06b06f7.js:1) at c (main.d06b06f7.js:1) at l (main.d06b06f7.js:1) at m (main.d06b06f7.js:1) at h (main.d06b06f7.js:1) at Object.enqueueSetState (main.d06b06f7.js:1) at t.o.setState (main.d06b06f7.js:1) at Object.n.handleSocket [as response] (main.d06b06f7.js:1)

There are no upcoming appointments so this seems to be the issue. When I create two upcoming meetings, the first one works correctly and the second one has the same issue returning to open, goes blank as there are no upcoming appointments.

Error in calling service, error code:401

Hello there!
When I run the application but the website just loads the navbar:
captura de pantalla de 2018-07-25 12-37-56

and the console returns:
captura de pantalla de 2018-07-25 12-41-21

I've also checked the exchange organization config and EWS parameters are:
captura de pantalla de 2018-07-25 12-44-13

I checked my credentials as well, I don't know what happens... I've spent one week with this problem. Any idea??

Thanks a lot!!

No Data to display

Hi, After successful install in page browser not showing rooms list, only spinning with in console log got: :8080/api/rooms net::ERR_EMPTY_RESPONSE anyone faced this issue?

Thanks,

How to increase font size under upcoming events?

Love the implementation. We are operating with a smaller display screen and the font under the "upcoming" scheduled events section is too small to be readable. We tried editing the global scss file, specifically the td.up_meeting-time font size to 1.7 vw, however the changes seem to not be applying to the displayed content. Any suggestions? Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.