..
..
.. Licensed under the Apache License, Version 2.0 (the "License");
.. you may not use this file except in compliance with the License.
.. You may obtain a copy of the License at
..
..     http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS,
.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
.. See the License for the specific language governing permissions and
.. limitations under the License.
..

Traffic Portal
*************

Introduction
============
Traffic Portal is an `AngularJS 1.x <https://angularjs.org/>`_ client served from a `Node.js <https://nodejs.org/en/>`_ web server designed to consume the Traffic Ops 1.x API. Traffic Portal provides a set of functionality restricted to the delivery service(s) of the authenticated user. Functionality primarily includes a set of charts / graphs designed to provide insight into the performance of a user's delivery service(s).

Software Requirements
=====================
To work on Traffic Portal you need a \*nix (MacOS and Linux are most commonly used) environment that has the following installed:

	* `Ruby 2.0.x or above <https://www.ruby-lang.org/en/>`_
	* `Compass 1.0.x or above <http://compass-style.org/>`_
	* `Node.js 6.0.x or above <https://nodejs.org/en/>`_
	* `Bower 1.7.9 or above <https://nodejs.org/en/>`_
	* `Grunt CLI 1.2.0 or above <https://github.com/gruntjs/grunt-cli>`_
	* Access to a working instance of Traffic Ops

Traffic Portal Project Tree Overview
=====================================
	* **traffic_control/traffic_portal/app/src** - contains HTML, JavaScript and Sass source files.

Installing The Traffic Portal Developer Environment
===================================================

	- Clone the traffic_control repository
	- Navigate to the traffic_control/traffic_portal of your cloned repository.
	- Run ``npm install`` to install application dependencies. Only needs to be done the first time unless traffic_portal/package.json changes.
	- Run ``bower install`` to install client-side dependencies. Only needs to be done the first time unless traffic_portal/bower.json changes.
	- Run ``grunt`` to package the application into traffic_portal/app/dist, start a local http server (Express), and start a file watcher.
	- Navigate to http://localhost:8080

Notes
=====

- The Traffic Portal consumes the Traffic Ops API. By default, Traffic Portal assumes Traffic Ops is running on http://localhost:3000. Temporarily modify conf/config.js if you need to change the location of Traffic Ops.



