]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/conify/global/config/floating_groups.js
LP 2061136 follow-up: ng lint --fix
[working/Evergreen.git] / Open-ILS / web / js / ui / default / conify / global / config / floating_groups.js
1 dojo.require('dijit.layout.ContentPane');
2 dojo.require('dijit.form.Button');
3 dojo.require('openils.widget.AutoGrid');
4 dojo.require('openils.widget.AutoFieldWidget');
5 dojo.require('openils.PermaCrud');
6 dojo.require('openils.widget.ProgressDialog');
7
8 var groupMemberEditor = null;
9 var groupMemberEntryCache = [];
10 var orgUnitCache = {};
11
12 function load(){
13     cfgGrid.loadAll({order_by:{cfg:'name'}});
14     cfgGrid.onEditPane = buildEditPaneAdditions;
15     cfgGrid.onPostUpdate = updateLinked;
16     cfgGrid.onPostCreate = updateLinked;
17     groupMemberEditor = dojo.byId('group-member-editor').parentNode.removeChild(dojo.byId('group-member-editor'));
18
19     // Cache org unit info for later display
20     var pcrud = new openils.PermaCrud();
21     var temp = pcrud.retrieveAll('aou');
22     dojo.forEach(temp, function(g) { orgUnitCache[g.id()] = g; } );
23 }
24
25 function byName(name, ctxt) {
26     return dojo.query('[name=' + name + ']', ctxt)[0];
27 }
28
29 function buildEditPaneAdditions(editPane) {
30     groupMemberEntryCache = [];
31     var tr = document.createElement('tr');
32     var td = document.createElement('td');
33     td.setAttribute('colspan','2');
34     // Explanation....
35     // editPane.domNode.lastChild = Table
36     // .lastChild = Table Body
37     // .lastChild = Table Row containing Action Buttons
38     editPane.domNode.lastChild.lastChild.insertBefore(tr, editPane.domNode.lastChild.lastChild.lastChild);
39     tr.appendChild(td);
40     curGroupMemberEditor = groupMemberEditor.cloneNode(true);
41     td.appendChild(curGroupMemberEditor);
42     var groupMemberTmpl = byName('group-member-entry-tbody', curGroupMemberEditor).removeChild(byName('group-member-entry-row', curGroupMemberEditor));
43
44     var selector = new openils.widget.AutoFieldWidget({
45         fmClass : 'cfgm',
46         fmField : 'org_unit',
47         parentNode : byName('org-unit-selector', curGroupMemberEditor)
48     });
49     selector.build();
50
51     function addMember(ounit) {
52         var row = groupMemberTmpl.cloneNode(true);
53         row.setAttribute('org_unit', ounit);
54         byName('org-unit', row).innerHTML = orgUnitCache[ounit].shortname();
55         byName('remove-group-member', row).onclick = function() {
56             byName('group-member-entry-tbody', cfgGrid.editPane.domNode).removeChild(row);
57         }
58         byName('group-member-entry-tbody', editPane.domNode).appendChild(row);
59     }
60
61     byName('add-group-member', editPane.domNode).onclick = function() {
62         addMember(selector.widget.attr('value'));
63     }
64
65     // On edit we need to load existing entries.
66     // On create, not so much.
67     if(!editPane.fmObject) return; 
68
69     if(editPane.mode == 'update') {
70         var pcrud = new openils.PermaCrud();
71         groupMemberEntryCache = pcrud.search('cfgm', {floating_group: editPane.fmObject.id()});
72         dojo.forEach(groupMemberEntryCache, function(g) { addGroupMember(groupMemberTmpl, g); } );
73     } 
74 }
75
76 function addGroupMember(tmpl, group_member_entry) {
77     var row = tmpl.cloneNode(true);
78     row.setAttribute('group_member', group_member_entry.id());
79     byName('org-unit', row).innerHTML = orgUnitCache[group_member_entry.org_unit()].shortname();
80     byName('group-member-stop-depth', row).value = group_member_entry.stop_depth();
81     if(group_member_entry.max_depth() != null) {
82         byName('group-member-max-depth', row).value = group_member_entry.max_depth();
83     }
84     if(group_member_entry.exclude() == 't') {
85         byName('group-member-exclude', row).setAttribute('checked', 'true');
86     }
87     byName('remove-group-member', row).onclick = function() {
88         byName('group-member-entry-tbody', cfgGrid.editPane.domNode).removeChild(row);
89     }
90     byName('group-member-entry-tbody', cfgGrid.editPane.domNode).appendChild(row);
91 }
92
93 function updateLinked(fmObject, rowindex) {
94     var id = null;
95     if(rowindex != undefined && this.editPane && this.editPane.fmObject) {
96         // Edit, grab existing ID
97         id = this.editPane.fmObject.id();
98     } else if(fmObject.id) {
99         // Create, grab new ID
100         id = fmObject.id();
101     }
102     // If we don't have an ID, drop out.
103     if(id == null) return;
104     var pcrud = new openils.PermaCrud();
105     progressDialog.show(true);
106
107     var add = [];
108     var remove = [];
109     var update = [];
110
111     var group_members = [];
112     dojo.query('[name=group-member-entry-row]', this.editPane.domNode).forEach(
113         function(row) {
114             var member_id = row.getAttribute('group_member');
115             var cached;
116             if (member_id)
117                 cached = groupMemberEntryCache.filter(function(i) { return (i.id() == member_id); })[0];
118             var stop_depth = byName('group-member-stop-depth', row).value;
119             var max_depth = byName('group-member-max-depth', row).value;
120             if (max_depth === '') max_depth = null;
121             var exclude = byName('group-member-exclude', row).checked;
122             if (cached) {
123                 group_members.push(member_id);
124                 if((stop_depth != cached.stop_depth()) || (max_depth !== cached.max_depth()) || (exclude != (cached.exclude() == 't'))) {
125                     cached.stop_depth(stop_depth);
126                     cached.max_depth(max_depth);
127                     cached.exclude(exclude ? 't' : 'f');
128                     cached.ischanged(true);
129                     update.push(cached);
130                 }
131             } else {
132                 var entry = new fieldmapper.cfgm();
133                 var org_unit = row.getAttribute('org_unit');
134                 entry.isnew(true);
135                 entry.floating_group(id);
136                 entry.org_unit(org_unit);
137                 entry.stop_depth(stop_depth);
138                 entry.max_depth(max_depth);
139                 entry.exclude(exclude ? 't' : 'f');
140                 add.push(entry);
141             }
142         }
143     );
144     dojo.forEach(groupMemberEntryCache, function(eMember) {
145             if(!group_members.filter(function(i) { return (i == eMember.id()); })[0]) {
146                 eMember.isdeleted(true);
147                 remove.push(eMember);
148             }
149         }
150     );
151
152     function updateEntries() {
153         pcrud.update(update, {
154             oncomplete : function () {
155                 progressDialog.hide();
156             }
157         });
158     }
159
160     function removeEntries() {
161         pcrud.eliminate(remove, {
162             oncomplete : function () {
163                 if(update.length) {
164                     updateEntries();
165                 } else {
166                     progressDialog.hide();
167                 }
168             }
169         });
170     }
171
172     function addEntries() {
173         pcrud.create(add, {
174             oncomplete : function () {
175                 if(remove.length) {
176                     removeEntries();
177                 } else if (update.length) {
178                     updateEntries();
179                 } else {
180                     progressDialog.hide();
181                 }
182             }
183         });
184     }
185
186     if(add.length)
187         addEntries();
188     else if (remove.length)
189         removeEntries();
190     else if (update.length)
191         updateEntries();
192     else
193         progressDialog.hide();
194 }
195
196 openils.Util.addOnLoad(load);
197