Bug 8064: Change the way target record is built.
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / merge-record.js
1 /*
2  * Merging 2 source records into a destination record
3  */
4
5 function build_target_record($sources) {
6   var target_record = {};
7
8   $sources.find('.record input[type="checkbox"].fieldpick:checked').each(function() {
9     var $checkbox = $(this);
10     var $li = $checkbox.parent();
11     var field = $checkbox.parent().find("span.field").text();
12
13     if (!(field in target_record)) {
14       target_record[field] = [];
15     }
16     target_record[field].push({
17       'id' : $li.attr('id'),
18       'tag' : field,
19       'subfields' : []
20     });
21   });
22
23   $sources.find('.record input[type="checkbox"].subfieldpick:checked').each(function() {
24     var $checkbox = $(this);
25     var $li = $checkbox.parent();
26     var $field_li = $li.parents('li');
27     var field = $field_li.find('span.field').text();
28     var subfield = $li.find('span.subfield').text();
29
30     var target_field;
31     if (field in target_record) {
32       for (i in target_record[field]) {
33         if (target_record[field][i].id == $field_li.attr('id')) {
34           target_field = target_record[field][i];
35         }
36       }
37       if (!target_field) {
38         target_field = target_record[field][0];
39       }
40     }
41     if (target_field) {
42       target_field.subfields.push({
43         'id' : $li.attr('id'),
44         'code' : subfield
45       });
46     } else {
47       $field_li.find('input.fieldpick').attr('checked', true);
48       target_record[field] = [{
49         'id' : $field_li.attr('id'),
50         'tag' : field,
51         'subfields' : [{
52           'id' : $li.attr('id'),
53           'code' : subfield
54         }]
55       }];
56     }
57   });
58
59   return target_record;
60 }
61
62 function field_can_be_added($sources, $li) {
63   target_record = build_target_record($sources);
64
65   var tag = $li.find('span.field').text();
66   var repeatable = true;
67   if (tag in tagslib) {
68     repeatable = (tagslib[tag].repeatable != 0) ? true : false;
69   }
70
71   if ((!repeatable) && (tag in target_record)) {
72     alert(MSG_MERGEREC_ALREADY_EXISTS);
73     return false;
74   }
75
76   return true;
77 }
78
79 function subfield_can_be_added($sources, $li) {
80   target_record = build_target_record($sources);
81
82   var $field_li = $li.parents('li');
83   var tag = $field_li.find('span.field').text();
84   var code = $li.find('span.subfield').text();
85
86   var repeatable = true;
87   if (tag in tagslib && code in tagslib[tag]) {
88     repeatable = (tagslib[tag][code].repeatable != 0) ? true : false;
89   }
90
91   if (!repeatable) {
92     var target_field;
93     if (tag in target_record) {
94       for (i in target_record[tag]) {
95         if (target_record[tag][i].id == $field_li.attr('id')) {
96           target_field = target_record[tag][i];
97         }
98       }
99       if (!target_field) {
100         target_field = target_record[tag][0];
101       }
102     }
103     if (target_field) {
104       for (i in target_field.subfields) {
105         var subfield = target_field.subfields[i];
106         if (code == subfield.code) {
107           alert(MSG_MERGEREC_SUBFIELD_ALREADY_EXISTS);
108           return false;
109         }
110       }
111     }
112   }
113
114   return true;
115 }
116
117 function rebuild_target($sources, $target) {
118   target_record = build_target_record($sources);
119
120   $target.empty();
121   var keys = $.map(target_record, function(elem, idx) { return idx }).sort();
122   for (k in keys) {
123     var tag = keys[k];
124     var fields = target_record[tag];
125     for (i in fields) {
126       var field = fields[i];
127       if (field.subfields.length > 0) {
128         var $field_clone = $('#' + field.id).clone();
129         $field_clone.find('ul').empty();
130         $field_clone.find('.fieldpick').remove();
131         $target.append($field_clone);
132
133         for (j in field.subfields) {
134           var subfield = field.subfields[j];
135           var $subfield_clone = $('#' + subfield.id).clone();
136           $subfield_clone.find('.subfieldpick').remove();
137           $field_clone.find('ul').append($subfield_clone);
138         }
139       } else {
140         $('#' + field.id).find('input.fieldpick').attr('checked', false);
141       }
142     }
143   }
144 }
145
146 /*
147  * Add actions on field and subfields checkboxes
148  */
149 $(document).ready(function(){
150     // When a field is checked / unchecked
151     $('input.fieldpick').click(function() {
152         // (un)check all subfields
153         var ischecked = this.checked;
154         if (ischecked && !field_can_be_added($('#tabs'), $(this).parent())) {
155           return false;
156         }
157
158         $(this).parent().find("input.subfieldpick").each(function() {
159             this.checked = ischecked;
160         });
161         rebuild_target($('#tabs'), $('#resultul'));
162     });
163
164     // When a field or subfield is checked / unchecked
165     $("input.subfieldpick").click(function() {
166       var ischecked = this.checked;
167       if (ischecked && !subfield_can_be_added($('#tabs'), $(this).parent())) {
168         return false;
169       }
170       rebuild_target($('#tabs'), $('#resultul'));
171     });
172 });