From 529745fec0f30800982131dc265e02dc0c0f420f Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Mon, 16 Mar 2015 18:48:39 +0000 Subject: [PATCH] webstaff: MARC editor - AngularJS egTagTable service This also adds context menus for tags, subfield codes, and indicator values Signed-off-by: Galen Charlton --- Open-ILS/src/templates/staff/cat/catalog/index.tt2 | 1 + .../js/ui/default/staff/cat/services/marcedit.js | 33 ++++--- .../js/ui/default/staff/cat/services/tagtable.js | 107 +++++++++++++++++++++ 3 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js diff --git a/Open-ILS/src/templates/staff/cat/catalog/index.tt2 b/Open-ILS/src/templates/staff/cat/catalog/index.tt2 index 56a4ea9e24..26c450f000 100644 --- a/Open-ILS/src/templates/staff/cat/catalog/index.tt2 +++ b/Open-ILS/src/templates/staff/cat/catalog/index.tt2 @@ -9,6 +9,7 @@ + [% INCLUDE 'staff/circ/share/circ_strings.tt2' %] diff --git a/Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js b/Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js index 65c36a1f69..34fc9fe7fa 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js +++ b/Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js @@ -54,22 +54,25 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap']) max: '@', itype: '@' }, - controller : ['$scope', - function ( $scope ) { + controller : ['$scope', 'egTagTable', + function ( $scope , egTagTable) { -/* XXX Example, for testing. We'll get this from the tag-table services for realz - * if (!$scope.contextItemContainer) { - $scope.contextItemContainer = "default_context"; - $scope.$parent[$scope.contextItemContainer] = [ - { value: 'a' }, - { value: 'b' }, - { value: 'c' }, - ]; + if ($scope.itype === 'tag') { + $scope.contextItemContainer = "default_context"; + // FIXME use contextItemGenerator + $scope.$parent[$scope.contextItemContainer] = egTagTable.getFieldTags(); + } else if ($scope.itype === 'sfc') { + $scope.contextItemContainer = "default_context"; + $scope.$parent[$scope.contextItemContainer] = + egTagTable.getSubfieldCodes($scope.$parent.field.tag); + } else if ($scope.itype === 'ind') { + $scope.contextItemContainer = "default_context"; + $scope.$parent[$scope.contextItemContainer] = + egTagTable.getIndicatorValues($scope.$parent.field.tag, $scope.$parent.indNumber); + } } - * - */ if ($scope.contextItemContainer && angular.isArray($scope.$parent[$scope.contextItemContainer])) $scope.item_container = $scope.$parent[$scope.contextItemContainer]; @@ -294,8 +297,8 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap']) }); }, - controller : ['$timeout','$scope','egCore', - function ( $timeout , $scope , egCore ) { + controller : ['$timeout','$scope','egCore', 'egTagTable', + function ( $timeout , $scope , egCore , egTagTable ) { $scope.bib_source = null; $scope.record_type = $scope.recordType || 'bre'; @@ -309,6 +312,8 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap']) $scope.controlfields = []; $scope.datafields = []; + egTagTable.loadTagTable(); + $scope.onKeydown = function (event) { var event_return = true; diff --git a/Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js b/Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js new file mode 100644 index 0000000000..22a715cc7a --- /dev/null +++ b/Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js @@ -0,0 +1,107 @@ +/* + * Retrieve, cache, and query MARC tag tables + */ +angular.module('egCoreMod') +.factory('egTagTable', + ['$q', 'egCore', 'egAuth', +function($q, egCore, egAuth) { + + var service = { + defaultTagTableSelector : { + marcFormat : 'marc21', + marcRecordType : 'biblio', + }, + fields : { } + }; + + // allow 'bre' and 'biblio' to be synonyms, etc. + service.normalizeRecordType = function(recordType) { + if (recordType === 'sre') { + return 'serial'; + } else if (recordType === 'bre') { + return 'biblio'; + } else if (recordType === 'are') { + return 'authority'; + } else { + return recordType; + } + }; + + service.loadTagTable = function(args) { + var fields = service.defaultTagTableSelector; + if (args) { + if (args.marcFormat) { + fields.marcFormat = args.marcFormat; + } + if (args.marcRecordType) { + fields.marcFormat = service.normalizeRecordType(args.marcFormat); + } + } + var tt_key = 'current_tag_table_' + fields.marcFormat + '_' + + fields.marcRecordType; + egCore.hatch.getItem(tt_key).then(function(tt) { + if (tt) { + service.fields = tt; + } else { + service.loadRemoteTagTable(fields, tt_key); + } + }); + }; + + service.loadRemoteTagTable = function(fields, tt_key) { + egCore.net.request( + 'open-ils.cat', + 'open-ils.cat.tag_table.all.retrieve.local', + egAuth.token(), fields.marcFormat, fields.marcRecordType + ).then( + function (data) { + egCore.hatch.setItem(tt_key, service.fields); + }, + function (err) { console.err('error fetch tag table: ' + err) }, + function (field) { + if (!field) return; + service.fields[field.tag] = field; + } + ); + }; + + service.getFieldTags = function() { + var list = []; + angular.forEach(service.fields, function(value, key) { + this.push({ + value: key, + label: key + ': ' + value.name + }); + }, list); + return list; + } + + service.getSubfieldCodes = function(tag) { + var list = []; + if (!tag) return; + if (!service.fields[tag]) return; + angular.forEach(service.fields[tag].subfields, function(value) { + this.push({ + value: value.code, + label: value.code + ': ' + value.description + }); + }, list); + return list; + } + + service.getIndicatorValues = function(tag, pos) { + var list = []; + if (!tag) return list; + if (!service.fields[tag]) return; + if (!service.fields[tag]["ind" + pos]) return; + angular.forEach(service.fields[tag]["ind" + pos], function(value) { + this.push({ + value: value.code, + label: value.code + ': ' + value.value + }); + }, list); + return list; + } + + return service; +}]); -- 2.11.0