webstaff: add support for editing authority records
[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.marcRecordType = service.normalizeRecordType(args.marcRecordType);
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         var hatch_pos_key = 'FFPosTable_'+rtype;
57
58         egCore.hatch.getItem(hatch_pos_key).then(function(cached_table) {
59             if (cached_table) {
60                 service.ff_pos_map[rtype] = cached_table;
61                 deferred.resolve(cached_table);
62
63             } else {
64
65                 egCore.net.request( // First, get the list of FFs (minus 006)
66                     'open-ils.fielder',
67                     'open-ils.fielder.cmfpm.atomic',
68                     { query : { tag : { '!=' : '006' } } }
69                 ).then(function (data)  {
70                     service.ff_pos_map[rtype] = data;
71                     egCore.hatch.setItem(hatch_pos_key, data);
72                     deferred.resolve(data);
73                 });
74             }
75         });
76
77         return deferred.promise;
78     };
79
80     service.fetchFFValueTable = function(rtype) {
81         var deferred = $q.defer();
82
83         var hatch_value_key = 'FFValueTable_'+rtype;
84
85         egCore.hatch.getItem(hatch_value_key).then(function(cached_table) {
86             if (cached_table) {
87                 service.ff_value_map[rtype] = cached_table;
88                 deferred.resolve(cached_table);
89
90             } else {
91
92                 egCore.net.request(
93                         'open-ils.cat',
94                         'open-ils.cat.biblio.fixed_field_values.by_rec_type',
95                         rtype
96                 ).then(function (data)  {
97                     service.ff_value_map[rtype] = data;
98                     egCore.hatch.setItem(hatch_value_key, data);
99                     deferred.resolve(data);
100                 });
101             }
102         });
103
104         return deferred.promise;
105     };
106
107     service.loadRemoteTagTable = function(fields, tt_key) {
108         egCore.net.request(
109             'open-ils.cat',
110             'open-ils.cat.tag_table.all.retrieve.local',
111             egAuth.token(), fields.marcFormat, fields.marcRecordType
112         ).then(
113             function (data)  {
114                 egCore.hatch.setItem(tt_key, service.fields);
115             },
116             function (err)   { console.err('error fetch tag table: ' + err) }, 
117             function (field) {
118                 if (!field) return;
119                 service.fields[field.tag] = field;
120             }
121         );
122     };
123
124     service.getFieldTags = function() {
125         var list = [];
126         angular.forEach(service.fields, function(value, key) {
127             this.push({ 
128                 value: key,
129                 label: key + ': ' + value.name
130             });
131         }, list);
132         return list;
133     }
134
135     service.getSubfieldCodes = function(tag) {
136         var list = [];
137         if (!tag) return;
138         if (!service.fields[tag]) return;
139         angular.forEach(service.fields[tag].subfields, function(value) {
140             this.push({
141                 value: value.code,
142                 label: value.code + ': ' + value.description
143             });
144         }, list);
145         return list;
146     }
147
148     service.getSubfieldValues = function(tag, sf_code) {
149         var list = [];
150         if (!tag) return list;
151         if (!service.fields[tag]) return;
152         if (!service.fields[tag]) return;
153         angular.forEach(service.fields[tag].subfields, function(sf) {
154             if (sf.code == sf_code && sf.hasOwnProperty('value_list')) {
155                 angular.forEach(sf.value_list, function(value) {
156                     var label = (value.code == value.description) ?
157                                 value.code :
158                                 value.code + ': ' + value.description;
159                     this.push({
160                         value: value.code,
161                         label: label
162                     });
163                 }, this);
164             }
165         }, list);
166         return list;
167     }
168
169     service.getIndicatorValues = function(tag, pos) {
170         var list = [];
171         if (!tag) return list;
172         if (!service.fields[tag]) return;
173         if (!service.fields[tag]["ind" + pos]) return;
174         angular.forEach(service.fields[tag]["ind" + pos], function(value) {
175             this.push({
176                 value: value.code,
177                 label: value.code + ': ' + value.description
178             });
179         }, list);
180         return list;
181     }
182
183     return service;
184 }]);