Because why pay money for something you can do yourself?
MeetEasier is a web application that visualizes meeting room availability. It works using Exchange Web Services (EWS) with Exchange room lists in Office 365.
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.
package.json
in root.editorconfig
ui-react/config/flightboard.config.js
to handle all text so that the application can be multilingualui-react/config/singleRoom.config.js
to do the same for the single-room
componentconsole.log
to server.js
to know when the server is running correctlyThis application assumes you have:
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.
web.config
file for an IIS install$ npm install
$ npm run build
$ npm start
$ npm start-ui-dev
app/
: Routes for EWS APIsapp/ews/
: All EWS functionalityconfg/
: All server side configuration settingsscss/
: All stylesstatic/
: All global static filesui-react/
: Front end React routes and componentsThere are three main directories in the ui-react/src/
folder:
components/
: Components separated in folders by functionconfig/
: Customizable config file (see defails below in Customization section)layouts/
: Layout components for the two different layouts used.flightboard/
: All components related to the flightboard or "all meeting" layoutglobal
: Components that will be used by both layoutssingle-room
: All components related to the Single Room layoutBoard
: Actual flightboard component itselfClock
: Clock component for the upper right hand of the displayNavbar
: Top navigation/title bar pieceRoomFilter
: Room list filter in the navbarNotFound
: A "not found" page if an error or "404" occursSocket
: A service component to run the web socket connection for updating the flightboard and single room displayClock
: Clock component for the upper right hand of the displayDisplay
: All other features of the single room displayflightboard.config.js
: Simple customization config explained in the Customization sectionflightboard/
: Layout for flightboard displaysingle-room/
: Layout for single room displayIn /config/auth.js
, enter your credentials and domain:
module.exports = {
// this user MUST have full access to all the room accounts
'exchange' : {
'username' : 'SVCACCT_EMAIL@DOMAIN.COM',
'password' : 'PASSWORD',
'uri' : 'https://outlook.office365.com/EWS/Exchange.asmx'
},
'domain' : 'DOMAIN'
};
Alternatively, username, password and domain can be set as environment variable
export USERNAME=svcacct_email@domain.com
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' : [
'ROOM_EMAIL@DOMAIN.com'
]
};
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
app/ews
.app/socket-controller.js
. By default, it is set to 1 minute.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.
.css
file and importing it into the component itself if you'd prefer to do it that way.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: jsmith@domain.com) 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';