webstaff: add admin interface for managing serial pattern templates
authorGalen Charlton <gmc@equinoxinitiative.org>
Wed, 10 May 2017 21:37:21 +0000 (17:37 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Wed, 10 May 2017 21:38:01 +0000 (17:38 -0400)
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/templates/staff/admin/serials/pattern_template.tt2 [new file with mode: 0644]
Open-ILS/src/templates/staff/admin/serials/t_splash.tt2
Open-ILS/web/js/ui/default/staff/admin/serials/pattern_template.js [new file with mode: 0644]

diff --git a/Open-ILS/src/templates/staff/admin/serials/pattern_template.tt2 b/Open-ILS/src/templates/staff/admin/serials/pattern_template.tt2
new file mode 100644 (file)
index 0000000..aab2258
--- /dev/null
@@ -0,0 +1,44 @@
+[%
+  WRAPPER "staff/base.tt2";
+  ctx.page_title = l("Prediction Pattern Templates");
+  ctx.page_app = "egAdminConfig";
+  ctx.page_ctrl = 'PatternTemplate';
+%]
+
+[% BLOCK APP_JS %]
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/grid.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/fm_record_editor.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/ui.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/app.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/services/core.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/directives/prediction_wizard.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/admin/serials/pattern_template.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('Prediction Templates') %]
+  </div>
+</div>
+
+<eg-grid
+    id-field="id"
+    idl-class="spt"
+    grid-controls="gridControls"
+    features="-multiselect"
+    persist-key="admin.serials.pattern_template">
+
+    <eg-grid-menu-item handler="new_record" label="[% l('New Record') %]"></eg-grid-menu-item>
+    <eg-grid-action handler="edit_record" label="[% l('Edit Record') %]"></eg-grid-action>
+    <eg-grid-action handler="delete_record" label="[% l('Delete Record') %]"></eg-grid-action>
+
+    <eg-grid-field label="[% l('Name') %]"           path="name"></eg-grid-field>
+    <eg-grid-field label="[% l('Pattern Code') %]"   path="pattern_code"></eg-grid-field>
+    <eg-grid-field label="[% l('Owning Library') %]" path="owning_lib.name"></eg-grid-field>
+    <eg-grid-field label="[% l('Sharing Depth') %]"  path="share_depth"></eg-grid-field>
+    <eg-grid-field label="[% l('ID') %]" path='id' required hidden></eg-grid-field>
+    <eg-grid-field path='*' hidden></eg-grid-field>
+</eg-grid>
+
+[% END %]
index f5060fa..ad9f63f 100644 (file)
@@ -9,7 +9,8 @@
 
 [%
     interfaces = [
-     [ l('Serial Templates'), "./admin/serials/templates" ]
+     [ l('Serial Copy Templates'), "./admin/serials/templates" ]
+     [ l('Pattern Templates'), "./admin/serials/pattern_template" ]
    ];
 
    USE table(interfaces, cols=3);
diff --git a/Open-ILS/web/js/ui/default/staff/admin/serials/pattern_template.js b/Open-ILS/web/js/ui/default/staff/admin/serials/pattern_template.js
new file mode 100644 (file)
index 0000000..3b9c528
--- /dev/null
@@ -0,0 +1,111 @@
+angular.module('egAdminConfig',
+    ['ngRoute','ui.bootstrap','egCoreMod','egUiMod','egGridMod','egFmRecordEditorMod','egSerialsMod','egSerialsAppDep'])
+
+.controller('PatternTemplate',
+       ['$scope','$q','$timeout','$location','$window','$uibModal','egCore','egGridDataProvider',
+        'egConfirmDialog',
+function($scope , $q , $timeout , $location , $window , $uibModal , egCore , egGridDataProvider ,
+         egConfirmDialog) {
+
+    egCore.startup.go(); // standalone mode requires manual startup
+
+    $scope.new_record = function() {
+        spawn_editor();
+    }
+
+    $scope.edit_record = function(items) {
+        if (items.length != 1) return;
+        spawn_editor(items[0].id);
+    }
+
+    spawn_editor = function(id) {
+        var templ;
+        if (arguments.length == 1) {
+            templ = '<eg-edit-fm-record idl-class="spt" mode="update" record-id="id" on-save="ok" on-cancel="cancel" custom-field-templates="customFieldTemplates"></eg-edit-fm-record>';
+        } else {
+            templ = '<eg-edit-fm-record idl-class="spt" mode="create" on-save="ok" on-cancel="cancel" custom-field-templates="customFieldTemplates"></eg-edit-fm-record>';
+        }
+        gridControls = $scope.gridControls;
+        $uibModal.open({
+            template : templ,
+            controller : [
+                        '$scope', '$uibModalInstance',
+                function($scope ,  $uibModalInstance) {
+                    $scope.id = id;
+
+                    $scope.openPatternEditorDialog = function(pred) {
+                        $uibModal.open({
+                            templateUrl: './serials/t_pattern_editor_dialog',
+                            size: 'lg',
+                            windowClass: 'eg-wide-modal',
+                            backdrop: 'static',
+                            controller:
+                                ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) {
+                                $scope.focusMe = true;
+                                $scope.patternCode = pred.pattern_code;
+                                $scope.ok = function(patternCode) { $uibModalInstance.close(patternCode) }
+                                $scope.cancel = function () { $uibModalInstance.dismiss() }
+                            }]
+                        }).result.then(function (patternCode) {
+                            if (pred.pattern_code !== patternCode) {
+                                pred.pattern_code = patternCode;
+                            }
+                        });
+                    }
+
+                    $scope.customFieldTemplates = {
+                        share_depth : {
+                            template : '<eg-share-depth-selector ng-model="rec_flat[field.name]">'
+                        },
+                        pattern_code : {
+                            handlers : {
+                                openPatternEditorDialog : $scope.openPatternEditorDialog
+                            },
+                            template : '<button class="btn btn-default" ng-click="field.handlers.openPatternEditorDialog(rec_flat)">Pattern Wizard</button>' // FIXME i18n
+                        }
+                    }
+
+                    $scope.ok = function($event) {
+                        $uibModalInstance.close();
+                        gridControls.refresh();
+                    }
+    
+                    $scope.cancel = function($event) {
+                        $uibModalInstance.dismiss();
+                    }
+                }
+            ]
+        });
+    }
+
+    $scope.delete_record = function(selected) {
+        if (!selected || !selected.length) return;
+
+        egCore.pcrud.retrieve('spt', selected[0].id).then(function(rec) {
+            egConfirmDialog.open(
+                egCore.strings.EG_CONFIRM_DELETE_RECORD_TITLE,
+                egCore.strings.EG_CONFIRM_DELETE_RECORD_BODY,
+                { id : rec.id() } // TODO replace with selector if available?
+            ).result.then(function() {
+                egCore.pcrud.remove(rec).then(function() {
+                    $scope.gridControls.refresh();
+                });
+            });
+        });
+    }
+
+    function generateQuery() {
+        return {
+            'id' : { '!=' : null },
+        }
+    }
+
+    $scope.gridControls = {
+        setQuery : function() {
+            return generateQuery();
+        },
+        setSort : function() {
+            return ['owning_lib.name','name'];
+        }
+    }
+}])