--- /dev/null
+[%
+ WRAPPER "staff/base.tt2";
+ ctx.page_title = l("Evergreen Configuration");
+ ctx.page_app = "egAdminCirc";
+%]
+
+[% 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/circ/app.js"></script>
+<link rel="stylesheet" href="[% ctx.base_path %]/staff/css/admin.css" />
+[% END %]
+
+<div ng-view></div>
+
+[% END %]
--- /dev/null
+<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>
+
+
+
+
--- /dev/null
+
+#age-to-lost-container {
+ margin-top: 20px;
+}
+
+#age-to-lost-container .row {
+ margin-top: 20px;
+}
+
+#age-to-lost-container .form-group {
+ padding-right: 10px;
+}
--- /dev/null
+/**
+ * App to drive the base page.
+ * Login Form
+ * Splash Page
+ */
+
+angular.module('egAdminCirc',
+ ['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()}};
+
+ $routeProvider.when('/admin/circ/age_to_lost', {
+ templateUrl: './admin/circ/t_age_to_lost',
+ controller: 'AgeToLostCtl',
+ resolve : resolver
+ });
+
+ // default page
+ /*
+ $routeProvider.otherwise({
+ templateUrl : 'user-perms-template',
+ controller: 'UserPermsCtrl',
+ resolve : resolver
+ });
+ */
+}])
+
+.controller('AgeToLostCtl',
+ ['$scope','egCore',
+function($scope , egCore) {
+ $scope.i_am_sure = false;
+ $scope.chunks_processed = 0;
+ $scope.events_created = 0;
+
+ 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;
+ }
+ );
+
+ $scope.set_profile = function(g) {$scope.selected_profile = g}
+
+ // 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;
+ }
+
+ $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;
+ }
+ );
+ }
+}])