Repository: incubator-trafficcontrol
Updated Branches:
  refs/heads/master a42629673 -> 33fa72c4a


adds ds invalidate content views


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/aad190ac
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/aad190ac
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/aad190ac

Branch: refs/heads/master
Commit: aad190ac8a5e0814a328b8253e2d1643fa5505fc
Parents: 3e6baf3
Author: Jeremy Mitchell <[email protected]>
Authored: Tue Apr 11 16:04:18 2017 -0600
Committer: Dan Kirkwood <[email protected]>
Committed: Wed Apr 12 15:07:35 2017 -0600

----------------------------------------------------------------------
 traffic_ops/experimental/ui/app/src/app.js      | 12 ++++
 .../ui/app/src/common/api/JobService.js         | 33 ++++++++++
 .../experimental/ui/app/src/common/api/index.js |  1 +
 .../FormDeliveryServiceController.js            |  4 +-
 .../form.deliveryService.tpl.html               |  2 +-
 .../FormDeliveryServiceJobController.js         | 35 +++++++++++
 .../form.deliveryServiceJob.tpl.html            | 58 +++++++++++++++++
 .../modules/form/deliveryServiceJob/index.js    | 21 +++++++
 .../new/FormNewDeliveryServiceJobController.js  | 48 +++++++++++++++
 .../form/deliveryServiceJob/new/index.js        | 21 +++++++
 .../modules/form/job/FormJobController.js       | 45 ++++++++++++++
 .../common/modules/form/job/form.job.tpl.html   | 65 ++++++++++++++++++++
 .../ui/app/src/common/modules/form/job/index.js | 21 +++++++
 .../form/job/new/FormNewJobController.js        | 48 +++++++++++++++
 .../src/common/modules/form/job/new/index.js    | 21 +++++++
 .../modules/navigation/navigation.tpl.html      |  1 +
 .../TableDeliveryServiceJobsController.js       | 46 ++++++++++++++
 .../modules/table/deliveryServiceJobs/index.js  | 21 +++++++
 .../table.deliveryServiceJobs.tpl.html          | 55 +++++++++++++++++
 .../modules/table/jobs/TableJobsController.js   | 42 +++++++++++++
 .../app/src/common/modules/table/jobs/index.js  | 21 +++++++
 .../modules/table/jobs/table.jobs.tpl.html      | 55 +++++++++++++++++
 traffic_ops/experimental/ui/app/src/index.html  |  2 +
 .../private/admin/jobs/JobsController.js        | 24 ++++++++
 .../app/src/modules/private/admin/jobs/index.js | 36 +++++++++++
 .../modules/private/admin/jobs/jobs.tpl.html    | 22 +++++++
 .../modules/private/admin/jobs/list/index.js    | 39 ++++++++++++
 .../src/modules/private/admin/jobs/new/index.js | 39 ++++++++++++
 .../jobs/DeliveryServiceJobsController.js       | 24 ++++++++
 .../jobs/deliveryServiceJobs.tpl.html           | 22 +++++++
 .../configure/deliveryServices/jobs/index.js    | 36 +++++++++++
 .../deliveryServices/jobs/list/index.js         | 42 +++++++++++++
 .../deliveryServices/jobs/new/index.js          | 42 +++++++++++++
 33 files changed, 1001 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/app.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/app.js 
b/traffic_ops/experimental/ui/app/src/app.js
index 20461f3..d61b659 100644
--- a/traffic_ops/experimental/ui/app/src/app.js
+++ b/traffic_ops/experimental/ui/app/src/app.js
@@ -69,6 +69,9 @@ var trafficOps = angular.module('trafficOps', [
         require('./modules/private/admin/divisions/list').name,
         require('./modules/private/admin/divisions/new').name,
         require('./modules/private/admin/divisions/regions').name,
+        require('./modules/private/admin/jobs').name,
+        require('./modules/private/admin/jobs/list').name,
+        require('./modules/private/admin/jobs/new').name,
         require('./modules/private/admin/physLocations').name,
         require('./modules/private/admin/physLocations/edit').name,
         require('./modules/private/admin/physLocations/list').name,
@@ -129,6 +132,9 @@ var trafficOps = angular.module('trafficOps', [
         require('./modules/private/configure/deliveryServices/edit').name,
         require('./modules/private/configure/deliveryServices/list').name,
         require('./modules/private/configure/deliveryServices/new').name,
+        require('./modules/private/configure/deliveryServices/jobs').name,
+        require('./modules/private/configure/deliveryServices/jobs/list').name,
+        require('./modules/private/configure/deliveryServices/jobs/new').name,
         require('./modules/private/configure/deliveryServices/regexes').name,
         
require('./modules/private/configure/deliveryServices/regexes/edit').name,
         
require('./modules/private/configure/deliveryServices/regexes/list').name,
@@ -177,9 +183,13 @@ var trafficOps = angular.module('trafficOps', [
         require('./common/modules/form/deliveryServiceRegex').name,
         require('./common/modules/form/deliveryServiceRegex/edit').name,
         require('./common/modules/form/deliveryServiceRegex/new').name,
+        require('./common/modules/form/deliveryServiceJob').name,
+        require('./common/modules/form/deliveryServiceJob/new').name,
         require('./common/modules/form/division').name,
         require('./common/modules/form/division/edit').name,
         require('./common/modules/form/division/new').name,
+        require('./common/modules/form/job').name,
+        require('./common/modules/form/job/new').name,
         require('./common/modules/form/physLocation').name,
         require('./common/modules/form/physLocation/edit').name,
         require('./common/modules/form/physLocation/new').name,
@@ -220,12 +230,14 @@ var trafficOps = angular.module('trafficOps', [
         require('./common/modules/table/cdnProfiles').name,
         require('./common/modules/table/cdnServers').name,
         require('./common/modules/table/deliveryServices').name,
+        require('./common/modules/table/deliveryServiceJobs').name,
         require('./common/modules/table/deliveryServiceRegexes').name,
         require('./common/modules/table/deliveryServiceServers').name,
         require('./common/modules/table/deliveryServiceStaticDnsEntries').name,
         require('./common/modules/table/deliveryServiceUsers').name,
         require('./common/modules/table/divisions').name,
         require('./common/modules/table/divisionRegions').name,
+        require('./common/modules/table/jobs').name,
         require('./common/modules/table/physLocations').name,
         require('./common/modules/table/physLocationServers').name,
         require('./common/modules/table/parameters').name,

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/api/JobService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/JobService.js 
b/traffic_ops/experimental/ui/app/src/common/api/JobService.js
new file mode 100644
index 0000000..ab05d30
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/api/JobService.js
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var JobService = function(Restangular) {
+
+       this.getJobs = function(queryParams) {
+               return Restangular.all('jobs').getList(queryParams);
+       };
+
+       this.createJob = function(job) {
+               return Restangular.service('user/current/jobs').post(job);
+       };
+
+};
+
+JobService.$inject = ['Restangular'];
+module.exports = JobService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/api/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/index.js 
b/traffic_ops/experimental/ui/app/src/common/api/index.js
index 0dd26b6..4099199 100644
--- a/traffic_ops/experimental/ui/app/src/common/api/index.js
+++ b/traffic_ops/experimental/ui/app/src/common/api/index.js
@@ -27,6 +27,7 @@ module.exports = angular.module('trafficOps.api', [])
        .service('deliveryServiceRegexService', 
require('./DeliveryServiceRegexService'))
        .service('divisionService', require('./DivisionService'))
     .service('httpService', require('./HttpService'))
+    .service('jobService', require('./JobService'))
     .service('physLocationService', require('./PhysLocationService'))
     .service('parameterService', require('./ParameterService'))
     .service('profileService', require('./ProfileService'))

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
index d3eaec7..30a2378 100644
--- 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
@@ -134,8 +134,8 @@ var FormDeliveryServiceController = 
function(deliveryService, $scope, $location,
         alert('not hooked up yet: cachegroupHealth for DS');
     };
 
-    $scope.invalidateContent = function() {
-        alert('not hooked up yet: invalidateContent for DS');
+    $scope.viewJobs = function() {
+        $location.path($location.path() + '/jobs');
     };
 
     $scope.manageSslKeys = function() {

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
index d13dab4..3cddf16 100644
--- 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
@@ -33,7 +33,7 @@ under the License.
                 <ul class="dropdown-menu-right dropdown-menu" 
uib-dropdown-menu>
                     <li role="menuitem"><a ng-click="viewRegexes()">Edit 
Delivery Service Regexes</a></li>
                     <li class="divider"></li>
-                    <li role="menuitem"><a 
ng-click="invalidateContent()">Invalidate Content</a></li>
+                    <li role="menuitem"><a ng-click="viewJobs()">View 
Invalidate Content Jobs</a></li>
                     <li class="divider"></li>
                     <li role="menuitem"><a ng-click="manageSslKeys()">Manage 
SSL Keys</a></li>
                     <li role="menuitem"><a 
ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
new file mode 100644
index 0000000..a672874
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var FormDeliveryServiceJobController = function(deliveryService, job, $scope, 
formUtils, locationUtils) {
+
+       $scope.deliveryService = deliveryService;
+
+       $scope.job = job;
+
+       $scope.navigateToPath = locationUtils.navigateToPath;
+
+       $scope.hasError = formUtils.hasError;
+
+       $scope.hasPropertyError = formUtils.hasPropertyError;
+
+};
+
+FormDeliveryServiceJobController.$inject = ['deliveryService', 'job', 
'$scope', 'formUtils', 'locationUtils'];
+module.exports = FormDeliveryServiceJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
new file mode 100644
index 0000000..1ae3f56
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
@@ -0,0 +1,58 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a 
ng-click="navigateToPath('/configure/delivery-services')">Delivery 
Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + 
deliveryService.id)">{{deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + 
deliveryService.id + '/jobs')">Invalidate Content Jobs</a></li>
+            <li class="active">{{jobName}}</li>
+        </ol>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="jobForm" class="form-horizontal form-label-left" 
novalidate>
+            <div class="form-group" ng-class="{'has-error': 
hasError(jobForm.regex), 'has-feedback': hasError(jobForm.regex)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Path 
Regex *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="regex" name="regex" type="text" 
class="form-control" placeholder="eg. /path/to/content/.*\.jpg" 
ng-model="job.regex" ng-required="true" ng-maxlength="255" ng-pattern="/^\//" 
autofocus>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.regex, 'required')">Required</small>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.regex, 'maxlength')">Too Long</small>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.regex, 'pattern')">Must Start with /</small>
+                    <span ng-show="hasError(jobForm.regex)" 
class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': 
hasError(jobForm.ttl), 'has-feedback': hasError(jobForm.ttl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">TTL 
(hours) *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ttl" name="ttl" type="text" 
class="form-control" ng-model="job.ttl" ng-required="true" ng-maxlength="1000" 
ng-pattern="/^\d+$/" autofocus>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.ttl, 'required')">Required</small>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.ttl, 'maxlength')">Too Long</small>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.ttl, 'pattern')">Number</small>
+                    <span ng-show="hasError(jobForm.ttl)" 
class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" 
ng-disabled="jobForm.$pristine || jobForm.$invalid" 
ng-click="save(job)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/index.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/index.js
new file mode 100644
index 0000000..af4fdf4
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/index.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.form.deliveryServiceJob', [])
+       .controller('FormDeliveryServiceJobController', 
require('./FormDeliveryServiceJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
new file mode 100644
index 0000000..bace310
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var FormNewDeliveryServiceJobController = function(deliveryService, job, 
$scope, $controller, jobService, messageModel, locationUtils) {
+
+       // extends the FormDeliveryServiceJobController to inherit common 
methods
+       angular.extend(this, $controller('FormDeliveryServiceJobController', { 
deliveryService: deliveryService, job: job, $scope: $scope }));
+
+       $scope.jobName = 'New';
+
+       $scope.settings = {
+               isNew: true,
+               saveLabel: 'Create'
+       };
+
+       $scope.save = function(job) {
+               jobService.createJob(job)
+                       .then(
+                               function() {
+                                       messageModel.setMessages([ { level: 
'success', text: 'Delivery Service Invalidate Content Job Created' } ], true);
+                                       
locationUtils.navigateToPath('/configure/delivery-services/' + 
deliveryService.id + '/jobs');
+                               },
+                               function(fault) {
+                                       
messageModel.setMessages(fault.data.alerts, false);
+                               }
+                       );
+       };
+
+};
+
+FormNewDeliveryServiceJobController.$inject = ['deliveryService', 'job', 
'$scope', '$controller', 'jobService', 'messageModel', 'locationUtils'];
+module.exports = FormNewDeliveryServiceJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/index.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/index.js
new file mode 100644
index 0000000..9b3b50a
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.form.deliveryServiceJob.new', [])
+       .controller('FormNewDeliveryServiceJobController', 
require('./FormNewDeliveryServiceJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/job/FormJobController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/job/FormJobController.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/job/FormJobController.js
new file mode 100644
index 0000000..7bf157b
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/job/FormJobController.js
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var FormJobController = function(job, $scope, formUtils, locationUtils, 
deliveryServiceService) {
+
+       var getDeliveryServices = function() {
+               deliveryServiceService.getDeliveryServices()
+                       .then(function(result) {
+                               $scope.deliveryservices = result;
+                       });
+       };
+
+       $scope.job = job;
+
+       $scope.navigateToPath = locationUtils.navigateToPath;
+
+       $scope.hasError = formUtils.hasError;
+
+       $scope.hasPropertyError = formUtils.hasPropertyError;
+
+       var init = function () {
+               getDeliveryServices();
+       };
+       init();
+
+};
+
+FormJobController.$inject = ['job', '$scope', 'formUtils', 'locationUtils', 
'deliveryServiceService'];
+module.exports = FormJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/job/form.job.tpl.html
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/job/form.job.tpl.html 
b/traffic_ops/experimental/ui/app/src/common/modules/form/job/form.job.tpl.html
new file mode 100644
index 0000000..4839aeb
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/job/form.job.tpl.html
@@ -0,0 +1,65 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb">
+            <li><a ng-click="navigateToPath('/admin/jobs')">Invalidate Content 
Jobs</a></li>
+            <li class="active">{{jobName}}</li>
+        </ol>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="jobForm" class="form-horizontal form-label-left" 
novalidate>
+            <div class="form-group" ng-class="{'has-error': 
hasError(jobForm.deliveryservice), 'has-feedback': 
hasError(jobForm.deliveryservice)}">
+                <label class="control-label col-md-2 col-sm-2 
col-xs-12">Delivery Service *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="deliveryservice" name="deliveryservice" 
class="form-control" ng-model="job.dsId" ng-options="deliveryservice.id as 
deliveryservice.xmlId for deliveryservice in deliveryservices" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.deliveryservice, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': 
hasError(jobForm.regex), 'has-feedback': hasError(jobForm.regex)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Path 
Regex *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="regex" name="regex" type="text" 
class="form-control" placeholder="eg. /path/to/content/.*\.jpg" 
ng-model="job.regex" ng-required="true" ng-maxlength="255" ng-pattern="/^\//" 
autofocus>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.regex, 'required')">Required</small>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.regex, 'maxlength')">Too Long</small>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.regex, 'pattern')">Must Start with /</small>
+                    <span ng-show="hasError(jobForm.regex)" 
class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': 
hasError(jobForm.ttl), 'has-feedback': hasError(jobForm.ttl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">TTL 
(hours) *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ttl" name="ttl" type="text" 
class="form-control" ng-model="job.ttl" ng-required="true" ng-maxlength="1000" 
ng-pattern="/^\d+$/" autofocus>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.ttl, 'required')">Required</small>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.ttl, 'maxlength')">Too Long</small>
+                    <small class="input-error" 
ng-show="hasPropertyError(jobForm.ttl, 'pattern')">Number</small>
+                    <span ng-show="hasError(jobForm.ttl)" 
class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" 
ng-disabled="jobForm.$pristine || jobForm.$invalid" 
ng-click="save(job)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/job/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/job/index.js 
b/traffic_ops/experimental/ui/app/src/common/modules/form/job/index.js
new file mode 100644
index 0000000..9f5aebf
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/job/index.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.form.job', [])
+       .controller('FormJobController', require('./FormJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/FormNewJobController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/FormNewJobController.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/FormNewJobController.js
new file mode 100644
index 0000000..4ecde31
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/FormNewJobController.js
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var FormNewJobController = function(job, $scope, $controller, jobService, 
messageModel, locationUtils) {
+
+       // extends the FormJobController to inherit common methods
+       angular.extend(this, $controller('FormJobController', { job: job, 
$scope: $scope }));
+
+       $scope.jobName = 'New';
+
+       $scope.settings = {
+               isNew: true,
+               saveLabel: 'Create'
+       };
+
+       $scope.save = function(job) {
+               jobService.createJob(job)
+                       .then(
+                               function() {
+                                       messageModel.setMessages([ { level: 
'success', text: 'Invalidate Content Job Created' } ], true);
+                                       
locationUtils.navigateToPath('/admin/jobs');
+                               },
+                               function(fault) {
+                                       
messageModel.setMessages(fault.data.alerts, false);
+                               }
+                       );
+       };
+
+};
+
+FormNewJobController.$inject = ['job', '$scope', '$controller', 'jobService', 
'messageModel', 'locationUtils'];
+module.exports = FormNewJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/index.js 
b/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/index.js
new file mode 100644
index 0000000..4d1ec76
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.form.job.new', [])
+       .controller('FormNewJobController', require('./FormNewJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html
 
b/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html
index 6814241..f535a35 100644
--- 
a/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html
@@ -44,6 +44,7 @@ under the License.
                         <li class="side-menu-category-item" 
ng-class="{'current-page': isState('trafficOps.private.admin.asns')}"><a 
ng-click="navigateToPath('/admin/asns')">ASNs</a></li>
                         <li class="side-menu-category-item" 
ng-class="{'current-page': isState('trafficOps.private.admin.cdns')}"><a 
ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
                         <li class="side-menu-category-item" 
ng-class="{'current-page': isState('trafficOps.private.admin.divisions')}"><a 
ng-click="navigateToPath('/admin/divisions')">Divisions</a></li>
+                        <li class="side-menu-category-item" 
ng-class="{'current-page': isState('trafficOps.private.admin.jobs')}"><a 
ng-click="navigateToPath('/admin/jobs')">Jobs</a></li>
                         <li class="side-menu-category-item" 
ng-class="{'current-page': 
isState('trafficOps.private.admin.physLocations')}"><a 
ng-click="navigateToPath('/admin/phys-locations')">Phys Locations</a></li>
                         <li class="side-menu-category-item" 
ng-class="{'current-page': isState('trafficOps.private.admin.parameters')}"><a 
ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
                         <li class="side-menu-category-item" 
ng-class="{'current-page': isState('trafficOps.private.admin.profiles')}"><a 
ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
new file mode 100644
index 0000000..93e263e
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var TableDeliveryServiceJobsController = function(deliveryService, jobs, 
$scope, $state, $location, locationUtils) {
+
+       $scope.deliveryService = deliveryService;
+
+       $scope.dsJobs = jobs;
+
+       $scope.createJob = function() {
+               $location.path($location.path() + '/new');
+       };
+
+       $scope.refresh = function() {
+               $state.reload(); // reloads all the resolves for the view
+       };
+
+       $scope.navigateToPath = locationUtils.navigateToPath;
+
+       angular.element(document).ready(function () {
+               $('#dsJobsTable').dataTable({
+                       "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, 
"All"]],
+                       "iDisplayLength": -1
+               });
+       });
+
+};
+
+TableDeliveryServiceJobsController.$inject = ['deliveryService', 'jobs', 
'$scope', '$state', '$location', 'locationUtils'];
+module.exports = TableDeliveryServiceJobsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/index.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/index.js
new file mode 100644
index 0000000..086882a
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/index.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.table.deliveryServiceJobs', [])
+       .controller('TableDeliveryServiceJobsController', 
require('./TableDeliveryServiceJobsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
 
b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
new file mode 100644
index 0000000..237fc8e
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
@@ -0,0 +1,55 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a 
ng-click="navigateToPath('/configure/delivery-services')">Delivery 
Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + 
deliveryService.id)">{{deliveryService.displayName}}</a></li>
+            <li class="active">Invalidate Content Jobs</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Invalidate Content 
Job" ng-click="createJob(deliveryService.id)"><i class="fa 
fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" 
ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="dsJobsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>assetUrl</th>
+                <th>parameters</th>
+                <th>start</th>
+                <th>createdBy</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="dsJob in dsJobs">
+                <td>{{dsJob.assetUrl}}</td>
+                <td>{{dsJob.parameters}}</td>
+                <td>{{dsJob.startTime}}</td>
+                <td>{{dsJob.createdBy}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/TableJobsController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/TableJobsController.js
 
b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/TableJobsController.js
new file mode 100644
index 0000000..f9edec3
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/TableJobsController.js
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var TableJobsController = function(jobs, $scope, $state, locationUtils) {
+
+       $scope.jobs = jobs;
+
+       $scope.createJob = function() {
+               locationUtils.navigateToPath('/admin/jobs/new');
+       };
+
+       $scope.refresh = function() {
+               $state.reload(); // reloads all the resolves for the view
+       };
+
+       angular.element(document).ready(function () {
+               $('#jobsTable').dataTable({
+                       "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, 
"All"]],
+                       "iDisplayLength": 25
+               });
+       });
+
+};
+
+TableJobsController.$inject = ['jobs', '$scope', '$state', 'locationUtils'];
+module.exports = TableJobsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/index.js 
b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/index.js
new file mode 100644
index 0000000..e95ab6a
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/index.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.table.jobs', [])
+       .controller('TableJobsController', require('./TableJobsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/table.jobs.tpl.html
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/table.jobs.tpl.html
 
b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/table.jobs.tpl.html
new file mode 100644
index 0000000..9b9dcb4
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/table.jobs.tpl.html
@@ -0,0 +1,55 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Invalidate Content Jobs</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="Create Invalidate Content 
Job" ng-click="createJob()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" 
ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="jobsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>deliveryService</th>
+                <th>assetUrl</th>
+                <th>parameters</th>
+                <th>start</th>
+                <th>createdBy</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="job in jobs">
+                <td>{{job.deliveryService}}</td>
+                <td>{{job.assetUrl}}</td>
+                <td>{{job.parameters}}</td>
+                <td>{{job.startTime}}</td>
+                <td>{{job.createdBy}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/index.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/index.html 
b/traffic_ops/experimental/ui/app/src/index.html
index ac22f1d..7c5b598 100644
--- a/traffic_ops/experimental/ui/app/src/index.html
+++ b/traffic_ops/experimental/ui/app/src/index.html
@@ -43,6 +43,8 @@ under the License.
 
         <div class="app container body" ui-view></div>
 
+        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js";></script>
+
         <script src="resources/assets/js/shared-libs.js"></script>
         <script src="resources/assets/js/app.js"></script>
         <script src="resources/assets/js/config.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/JobsController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/JobsController.js
 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/JobsController.js
new file mode 100644
index 0000000..5a08d47
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/JobsController.js
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var JobsController = function() {
+};
+
+JobsController.$inject = [];
+module.exports = JobsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/index.js 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/index.js
new file mode 100644
index 0000000..a353511
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/index.js
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.private.admin.jobs', [])
+       .controller('JobsController', require('./JobsController'))
+       .config(function($stateProvider, $urlRouterProvider) {
+               $stateProvider
+                       .state('trafficOps.private.admin.jobs', {
+                               url: '/jobs',
+                               abstract: true,
+                               views: {
+                                       adminContent: {
+                                               templateUrl: 
'modules/private/admin/jobs/jobs.tpl.html',
+                                               controller: 'JobsController'
+                                       }
+                               }
+                       })
+               ;
+               $urlRouterProvider.otherwise('/');
+       });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/jobs.tpl.html
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/jobs.tpl.html 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/jobs.tpl.html
new file mode 100644
index 0000000..3597900
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/jobs.tpl.html
@@ -0,0 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<div id="jobsContainer">
+    <div ui-view="jobsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/list/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/list/index.js 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/list/index.js
new file mode 100644
index 0000000..076a102
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.private.admin.jobs.list', [])
+       .config(function($stateProvider, $urlRouterProvider) {
+               $stateProvider
+                       .state('trafficOps.private.admin.jobs.list', {
+                               url: '',
+                               views: {
+                                       jobsContent: {
+                                               templateUrl: 
'common/modules/table/jobs/table.jobs.tpl.html',
+                                               controller: 
'TableJobsController',
+                                               resolve: {
+                                                       jobs: 
function(jobService) {
+                                                               return 
jobService.getJobs();
+                                                       }
+                                               }
+                                       }
+                               }
+                       })
+               ;
+               $urlRouterProvider.otherwise('/');
+       });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/new/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/new/index.js 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/new/index.js
new file mode 100644
index 0000000..abc007f
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = angular.module('trafficOps.private.admin.jobs.new', [])
+       .config(function($stateProvider, $urlRouterProvider) {
+               $stateProvider
+                       .state('trafficOps.private.admin.jobs.new', {
+                               url: '/new',
+                               views: {
+                                       jobsContent: {
+                                               templateUrl: 
'common/modules/form/job/form.job.tpl.html',
+                                               controller: 
'FormNewJobController',
+                                               resolve: {
+                                                       job: function() {
+                                                               return { 
startTime: moment().format('YYYY-MM-DD HH:mm:ss') };
+                                                       }
+                                               }
+                                       }
+                               }
+                       })
+               ;
+               $urlRouterProvider.otherwise('/');
+       });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/DeliveryServiceJobsController.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/DeliveryServiceJobsController.js
 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/DeliveryServiceJobsController.js
new file mode 100644
index 0000000..f4d085d
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/DeliveryServiceJobsController.js
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var DeliveryServiceJobsController = function() {
+};
+
+DeliveryServiceJobsController.$inject = [];
+module.exports = DeliveryServiceJobsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html
 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html
new file mode 100644
index 0000000..b941e55
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html
@@ -0,0 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<div id="deliveryServiceJobsContainer">
+    <div ui-view="deliveryServiceJobsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/index.js
 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/index.js
new file mode 100644
index 0000000..cfa4c92
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/index.js
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = 
angular.module('trafficOps.private.configure.deliveryServices.jobs', [])
+       .controller('DeliveryServiceJobsController', 
require('./DeliveryServiceJobsController'))
+       .config(function($stateProvider, $urlRouterProvider) {
+               $stateProvider
+                       
.state('trafficOps.private.configure.deliveryServices.jobs', {
+                               url: '/{deliveryServiceId}/jobs',
+                               abstract: true,
+                               views: {
+                                       deliveryServicesContent: {
+                                               templateUrl: 
'modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html',
+                                               controller: 
'DeliveryServiceJobsController'
+                                       }
+                               }
+                       })
+               ;
+               $urlRouterProvider.otherwise('/');
+       });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
new file mode 100644
index 0000000..2ca812a
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = 
angular.module('trafficOps.private.configure.deliveryServices.jobs.list', [])
+       .config(function($stateProvider, $urlRouterProvider) {
+               $stateProvider
+                       
.state('trafficOps.private.configure.deliveryServices.jobs.list', {
+                               url: '',
+                               views: {
+                                       deliveryServiceJobsContent: {
+                                               templateUrl: 
'common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html',
+                                               controller: 
'TableDeliveryServiceJobsController',
+                                               resolve: {
+                                                       deliveryService: 
function($stateParams, deliveryServiceService) {
+                                                               return 
deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+                                                       },
+                                                       jobs: 
function($stateParams, jobService) {
+                                                               return 
jobService.getJobs({ dsId: $stateParams.deliveryServiceId });
+                                                       }
+                                               }
+                                       }
+                               }
+                       })
+               ;
+               $urlRouterProvider.otherwise('/');
+       });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/aad190ac/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
----------------------------------------------------------------------
diff --git 
a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
new file mode 100644
index 0000000..5146fbd
--- /dev/null
+++ 
b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = 
angular.module('trafficOps.private.configure.deliveryServices.jobs.new', [])
+       .config(function($stateProvider, $urlRouterProvider) {
+               $stateProvider
+                       
.state('trafficOps.private.configure.deliveryServices.jobs.new', {
+                               url: '/new',
+                               views: {
+                                       deliveryServiceJobsContent: {
+                                               templateUrl: 
'common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html',
+                                               controller: 
'FormNewDeliveryServiceJobController',
+                                               resolve: {
+                                                       deliveryService: 
function($stateParams, deliveryServiceService) {
+                                                               return 
deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+                                                       },
+                                                       job: 
function($stateParams) {
+                                                               return { dsId: 
$stateParams.deliveryServiceId, startTime: moment().format('YYYY-MM-DD 
HH:mm:ss') };
+                                                       }
+                                               }
+                                       }
+                               }
+                       })
+               ;
+               $urlRouterProvider.otherwise('/');
+       });

Reply via email to