2 * Retrieve, cache, and query MARC tag tables
4 angular.module('egCoreMod')
6 ['$q', 'egCore', 'egAuth',
7 function($q, egCore, egAuth) {
10 defaultTagTableSelector : {
11 marcFormat : 'marc21',
12 marcRecordType : 'biblio',
19 // allow 'bre' and 'biblio' to be synonyms, etc.
20 service.normalizeRecordType = function(recordType) {
21 if (recordType === 'sre') {
23 } else if (recordType === 'bre') {
25 } else if (recordType === 'are') {
32 service.loadTagTable = function(args) {
33 var fields = service.defaultTagTableSelector;
35 if (args.marcFormat) {
36 fields.marcFormat = args.marcFormat;
38 if (args.marcRecordType) {
39 fields.marcFormat = service.normalizeRecordType(args.marcFormat);
42 var tt_key = 'current_tag_table_' + fields.marcFormat + '_' +
43 fields.marcRecordType;
44 egCore.hatch.getItem(tt_key).then(function(tt) {
48 service.loadRemoteTagTable(fields, tt_key);
53 service.fetchFFPosTable = function(rtype) {
54 var deferred = $q.defer();
56 if (service.ff_pos_map[rtype]) {
57 deferred.resolve(service.ff_pos_map[rtype]);
58 return deferred.promise;
61 egCore.net.request( // First, get the list of FFs (minus 006)
63 'open-ils.fielder.cmfpm.atomic',
64 { query : { tag : { '!=' : '006' } } }
65 ).then(function (data) {
66 service.ff_pos_map[rtype] = data;
67 }).then(function() { // Then, get the value maps
68 return egCore.net.request(
70 'open-ils.cat.biblio.fixed_field_values.by_rec_type',
73 }).then(function (data) {
74 service.ff_value_map[rtype] = data;
75 deferred.resolve(service.ff_pos_map[rtype]);
78 return deferred.promise;
81 service.loadRemoteTagTable = function(fields, tt_key) {
84 'open-ils.cat.tag_table.all.retrieve.local',
85 egAuth.token(), fields.marcFormat, fields.marcRecordType
88 egCore.hatch.setItem(tt_key, service.fields);
90 function (err) { console.err('error fetch tag table: ' + err) },
93 service.fields[field.tag] = field;
98 service.getFieldTags = function() {
100 angular.forEach(service.fields, function(value, key) {
103 label: key + ': ' + value.name
109 service.getSubfieldCodes = function(tag) {
112 if (!service.fields[tag]) return;
113 angular.forEach(service.fields[tag].subfields, function(value) {
116 label: value.code + ': ' + value.description
122 service.getIndicatorValues = function(tag, pos) {
124 if (!tag) return list;
125 if (!service.fields[tag]) return;
126 if (!service.fields[tag]["ind" + pos]) return;
127 angular.forEach(service.fields[tag]["ind" + pos], function(value) {
130 label: value.code + ': ' + value.description