]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js
webstaff: Fetch FF pos map and value map, per record type
[working/Evergreen.git] / Open-ILS / web / js / ui / default / staff / cat / services / tagtable.js
1 /*
2  * Retrieve, cache, and query MARC tag tables
3  */
4 angular.module('egCoreMod')
5 .factory('egTagTable', 
6        ['$q', 'egCore', 'egAuth',
7 function($q,   egCore,   egAuth) {
8
9     var service = {
10         defaultTagTableSelector : {
11             marcFormat     : 'marc21',
12             marcRecordType : 'biblio',
13         },
14         fields : { },
15         ff_pos_map : { },
16         ff_value_map : { }
17     };
18
19     // allow 'bre' and 'biblio' to be synonyms, etc.
20     service.normalizeRecordType = function(recordType) {
21         if (recordType === 'sre') {
22             return 'serial';
23         } else if (recordType === 'bre') {
24             return 'biblio';
25         } else if (recordType === 'are') {
26             return 'authority';
27         } else {
28             return recordType;
29         }
30     };
31
32     service.loadTagTable = function(args) {
33         var fields = service.defaultTagTableSelector;
34         if (args) {
35             if (args.marcFormat) {
36                 fields.marcFormat = args.marcFormat;
37             }
38             if (args.marcRecordType) {
39                 fields.marcFormat = service.normalizeRecordType(args.marcFormat);
40             }
41         }
42         var tt_key = 'current_tag_table_' + fields.marcFormat + '_' +
43                      fields.marcRecordType;
44         egCore.hatch.getItem(tt_key).then(function(tt) {
45             if (tt) {
46                 service.fields = tt;
47             } else {
48                 service.loadRemoteTagTable(fields, tt_key);
49             }
50         });
51     };
52
53     service.fetchFFPosTable = function(rtype) {
54         var deferred = $q.defer();
55
56         if (service.ff_pos_map[rtype]) {
57             deferred.resolve(service.ff_pos_map[rtype]);
58             return deferred.promise;
59         }
60
61         egCore.net.request( // First, get the list of FFs (minus 006)
62             'open-ils.fielder',
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(
69                 'open-ils.cat',
70                 'open-ils.cat.biblio.fixed_field_values.by_rec_type',
71                 rtype
72             );
73         }).then(function (data)  {
74             service.ff_value_map[rtype] = data;
75             deferred.resolve(service.ff_pos_map[rtype]);
76         });
77
78         return deferred.promise;
79     };
80
81     service.loadRemoteTagTable = function(fields, tt_key) {
82         egCore.net.request(
83             'open-ils.cat',
84             'open-ils.cat.tag_table.all.retrieve.local',
85             egAuth.token(), fields.marcFormat, fields.marcRecordType
86         ).then(
87             function (data)  {
88                 egCore.hatch.setItem(tt_key, service.fields);
89             },
90             function (err)   { console.err('error fetch tag table: ' + err) }, 
91             function (field) {
92                 if (!field) return;
93                 service.fields[field.tag] = field;
94             }
95         );
96     };
97
98     service.getFieldTags = function() {
99         var list = [];
100         angular.forEach(service.fields, function(value, key) {
101             this.push({ 
102                 value: key,
103                 label: key + ': ' + value.name
104             });
105         }, list);
106         return list;
107     }
108
109     service.getSubfieldCodes = function(tag) {
110         var list = [];
111         if (!tag) return;
112         if (!service.fields[tag]) return;
113         angular.forEach(service.fields[tag].subfields, function(value) {
114             this.push({
115                 value: value.code,
116                 label: value.code + ': ' + value.description
117             });
118         }, list);
119         return list;
120     }
121
122     service.getIndicatorValues = function(tag, pos) {
123         var list = [];
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) {
128             this.push({
129                 value: value.code,
130                 label: value.code + ': ' + value.description
131             });
132         }, list);
133         return list;
134     }
135
136     return service;
137 }]);