webstaff: browser client local admin re-org 2
authorBill Erickson <berickxx@gmail.com>
Sat, 25 Jul 2015 18:11:00 +0000 (14:11 -0400)
committerKathy Lussier <klussier@masslnc.org>
Tue, 2 Feb 2016 19:58:52 +0000 (14:58 -0500)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Signed-off-by: Kathy Lussier <klussier@masslnc.org>

Open-ILS/src/templates/staff/admin/local/circ/age_to_lost.tt2 [new file with mode: 0644]
Open-ILS/src/templates/staff/admin/local/index.tt2 [new file with mode: 0644]
Open-ILS/src/templates/staff/admin/local/t_splash.tt2 [new file with mode: 0644]
Open-ILS/web/js/ui/default/staff/admin/local/app.js [new file with mode: 0644]
Open-ILS/web/js/ui/default/staff/admin/local/circ/age_to_lost.js [new file with mode: 0644]

diff --git a/Open-ILS/src/templates/staff/admin/local/circ/age_to_lost.tt2 b/Open-ILS/src/templates/staff/admin/local/circ/age_to_lost.tt2
new file mode 100644 (file)
index 0000000..66bc9b4
--- /dev/null
@@ -0,0 +1,91 @@
+[%
+  WRAPPER "staff/base.tt2";
+  ctx.page_title = l("Age Circs to Lost"); 
+  ctx.page_app = "egAdminCirc";
+  ctx.page_ctrl = 'AgeToLostCtl';
+%]
+
+[% BLOCK APP_JS %]
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/admin/local/circ/age_to_lost.js"></script>
+<link rel="stylesheet" href="[% ctx.base_path %]/staff/css/admin.css" />
+[% END %]
+
+<div class="container-fluid" style="text-align:center">
+  <div class="alert alert-info alert-less-pad strong-text-2">
+    [% l('Age Circulations to Lost') %]
+  </div>
+</div>
+
+<span>
+[% | l %]
+Choose the user profile and circulation library for the overdue circulations
+you wish to age to a Lost status.  Note the descendants of these values 
+(sub-groups, sub-libraries) will also be affected.
+[% END %]
+</span>
+
+<div id='age-to-lost-container'>
+  <div xclass="form-inline">
+    <div class="form-group">
+      <label class="col-md-2">[% l('User Profile') %]</label>
+      <div class="btn-group" dropdown>
+        <button type="button" class="btn btn-default dropdown-toggle">
+          <span style="padding-right: 5px;">{{selected_profile.name()}}</span>
+          <span class="caret"></span>
+        </button>
+        <ul class="dropdown-menu">
+          <li ng-repeat="grp in profiles">
+            <a href
+              style="padding-left: {{pgt_depth(grp) * 10 + 5}}px"
+              ng-click="set_profile(grp)">{{grp.name()}}</a>
+          </li>
+        </ul>
+      </div>
+    </div>
+    <div class="form-group">
+      <label class="col-md-2">[% l('Circulation Library') %]</label>
+      <eg-org-selector selected="context_org"></eg-org-selector>
+    </div>
+    <div class="form-group">
+      <label class="col-md-2">[% l('Are you sure?') %]</label>
+      <input type="checkbox" ng-model="i_am_sure"/>
+    </div>
+  </div>
+    <div class="form-group">
+      <button class="btn btn-default" 
+        ng-class="{disabled : !i_am_sure}" ng-click="age_to_lost()">
+        [% l('Queue for Aging') %]</button>
+    </div>
+  </div>
+
+  <div class="row" ng-show="in_progress">
+    <div class="col-md-3"></div>
+    <div class="progress progress-striped active col-md-6">
+      <div class="progress-bar" role="progressbar" aria-valuenow="100" 
+        aria-valuemin="0" aria-valuemax="100" style="width: 100%">
+        <span class="sr-only">[% l('Processing...') %]</span>
+      </div>
+    </div>
+  </div>
+
+  <div class="row" ng-show="in_progress || all_done">
+    <div class="col-md-3"></div>
+    <div class="col-md-3">
+      [% l('Chunks Processed: [_1]', '{{chunks_processed}}') %]</div>
+    <div class="col-md-3">
+      [% l('Events Created: [_1]', '{{events_created}}') %]</div>
+    </div>
+  </div>
+
+  <div class="row" ng-show="all_done">
+    <div class="col-md-3"></div>
+    <div class="col-md-6">
+     <div class="alert alert-success" role="alert">
+      [% l('Processing Complete') %]</div>
+    </div>
+  </div>
+
+</div>
+   
+
+[% END %]
diff --git a/Open-ILS/src/templates/staff/admin/local/index.tt2 b/Open-ILS/src/templates/staff/admin/local/index.tt2
new file mode 100644 (file)
index 0000000..02d604f
--- /dev/null
@@ -0,0 +1,16 @@
+[%
+  WRAPPER "staff/base.tt2";
+  ctx.page_title = l("Local Administration"); 
+  ctx.page_app = "egLocalAdmin";
+  #ctx.page_ctrl = "LocalAdminCtl";
+%]
+
+[% BLOCK APP_JS %]
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/eframe.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/admin/local/app.js"></script>
+<link rel="stylesheet" href="[% ctx.base_path %]/staff/css/admin.css" />
+[% END %]
+
+<div ng-view></div>
+
+[% END %]
diff --git a/Open-ILS/src/templates/staff/admin/local/t_splash.tt2 b/Open-ILS/src/templates/staff/admin/local/t_splash.tt2
new file mode 100644 (file)
index 0000000..9505bc3
--- /dev/null
@@ -0,0 +1,60 @@
+
+<div class="container-fluid" style="text-align:center">
+  <div class="alert alert-info alert-less-pad strong-text-2">
+    <span>[% l('Local Administration') %]</span>
+  </div>
+</div>
+
+<div class="container admin-splash-container">
+
+  <div class="row new-entry">
+    <div class="col-md-3">
+      <span class="glyphicon glyphicon-pencil"></span>
+      <a target="_self" href="./admin/local/actor/address_alert">
+        [% l('Address Alerts') %]
+      </a>
+    </div>
+  </div>
+  <div class="row new-entry">
+    <div class="col-md-3">
+      <span class="glyphicon glyphicon-pencil"></span>
+      <a target="_self" href="./admin/local/circ/age_to_lost">
+        [% l('Age Overdue Circs to Lost') %]
+      </a>
+    </div>
+  </div>
+  <div class="row new-entry">
+    <div class="col-md-3">
+      <span class="glyphicon glyphicon-pencil"></span>
+      <a target="_self" href="./admin/local/config/barcode_completion">
+        [% l('Barcode Completion') %]
+      </a>
+    </div>
+  </div>
+  <div class="row new-entry">
+    <div class="col-md-3">
+      <span class="glyphicon glyphicon-pencil"></span>
+      <a target="_self" href="./admin/local/money/cash_reports">
+        [% l('Cash Reports') %]
+      </a>
+    </div>
+  </div>
+  <div class="row new-entry">
+    <div class="col-md-3">
+      <span class="glyphicon glyphicon-pencil"></span>
+      <a target="_self" href="./admin/local/config/circ_limit_set">
+        [% l('Circ Limit Sets') %]
+      </a>
+    </div>
+  </div>
+  <div class="row new-entry">
+    <div class="col-md-3">
+      <span class="glyphicon glyphicon-pencil"></span>
+      <a target="_self" href="./admin/local/config/circ_matrix_matchpoint">
+        [% l('Circulation Policies') %]
+      </a>
+    </div>
+  </div>
+
+</div>
+
diff --git a/Open-ILS/web/js/ui/default/staff/admin/local/app.js b/Open-ILS/web/js/ui/default/staff/admin/local/app.js
new file mode 100644 (file)
index 0000000..e2ecfa8
--- /dev/null
@@ -0,0 +1,66 @@
+angular.module('egLocalAdmin',
+    ['ngRoute', 'ui.bootstrap', 'egCoreMod','egUiMod'])
+
+.config(['$routeProvider','$locationProvider','$compileProvider', 
+ function($routeProvider , $locationProvider , $compileProvider) {
+
+    $locationProvider.html5Mode(true);
+    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|blob):/); 
+    var resolver = {delay : function(egStartup) {return egStartup.go()}};
+
+    var eframe_template = 
+        '<eg-embed-frame url="local_admin_url" handlers="funcs"></eg-embed-frame>';
+
+    // non-conify routes come first
+    $routeProvider.when('/admin/local/money/cash_reports', {
+        template: eframe_template,
+        controller: 'CashReportsCtl', // non-conify
+        resolve : resolver
+    });
+
+    // Conify page handler
+    $routeProvider.when('/admin/local/:schema/:page', {
+        template: eframe_template,
+        controller: 'EmbedConifyCtl',
+        resolve : resolver
+    });
+
+    // default page 
+    $routeProvider.otherwise({
+        templateUrl : './admin/local/t_splash',
+        resolve : resolver
+    });
+}])
+
+.controller('EmbedConifyCtl', 
+       ['$scope','$routeParams','$location','egCore',
+function($scope , $routeParams , $location , egCore) {
+
+    $scope.funcs = {
+        ses : egCore.auth.token(),
+    }
+
+    var conify_path = '/eg/conify/global/' + 
+        $routeParams.schema + '/' + $routeParams.page;
+
+    // embed URL must include protocol/domain or it will be loaded via
+    // push-state, resulting in an infinitely nested pages.
+    $scope.local_admin_url = 
+        $location.absUrl().replace(/\/eg\/staff.*/, conify_path);
+
+    console.log('Loading local admin URL: ' + $scope.local_admin_url);
+
+}])
+
+.controller('CashReportsCtl', 
+       ['$scope','$location','egCore',
+function($scope , $location , egCore) {
+    $scope.local_admin_url = $location.absUrl().replace(
+        /\/.*/, '/xul/server/admin/cash_reports.xhtml');
+
+    // old-school XUL admin UI's only want CGI ses values.
+    $scope.local_admin_url += '?ses=' + egCore.auth.token();
+
+    console.log('Loading local admin URL: ' + $scope.local_admin_url);
+}])
+
diff --git a/Open-ILS/web/js/ui/default/staff/admin/local/circ/age_to_lost.js b/Open-ILS/web/js/ui/default/staff/admin/local/circ/age_to_lost.js
new file mode 100644 (file)
index 0000000..5d68c76
--- /dev/null
@@ -0,0 +1,67 @@
+
+angular.module('egAdminCirc',
+    ['ngRoute', 'ui.bootstrap', 'egCoreMod','egUiMod'])
+
+.controller('AgeToLostCtl',
+       ['$scope','egCore',
+function($scope , egCore) {
+    $scope.i_am_sure = false;
+    $scope.chunks_processed = 0;
+    $scope.events_created = 0;
+
+    function fetch_data() {
+
+        // fetch groups for the profile selector
+        egCore.pcrud.search('pgt', {parent : null}, 
+            {flesh : -1, flesh_fields : {pgt : ['children']}}
+        ).then(
+            function(tree) {
+                egCore.env.absorbTree(tree, 'pgt')
+                $scope.profiles = egCore.env.pgt.list;
+                $scope.selected_profile = tree;
+            }
+        );
+
+        // determine the tree depth of the profile group
+        $scope.pgt_depth = function(grp) {
+            var d = 0;
+            while (grp = egCore.env.pgt.map[grp.parent()]) d++;
+            return d;
+        }
+    }
+
+    // This is a standalone with page w/ no startup resolve.
+    // Run (well, attach to) startup locally then kick off the needed
+    // network calls.
+    egCore.startup.go().then(fetch_data);
+
+    $scope.set_profile = function(g) {$scope.selected_profile = g}
+
+    $scope.age_to_lost = function() {
+        $scope.in_progress = true;
+        $scope.i_am_sure = false; // reset
+        $scope.all_done = false;
+
+        egCore.net.request(
+            'open-ils.circ',
+            'open-ils.circ.circulation.age_to_lost',
+            egCore.auth.token(), {
+                user_profile : $scope.selected_profile.id(),
+                circ_lib : $scope.context_org.id()
+            }
+        ).then(
+            function() {
+                $scope.in_progress = false;
+                $scope.all_done = true;
+            },
+            null, // on-error
+            function(response) {
+                if (!response) return;
+                if (response.progress)
+                    $scope.chunks_processed = response.progress;
+                if (response.created)
+                    $scope.events_created = response.created;
+            }
+        );
+    }
+}])