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');
8 var groupMemberEditor = null;
9 var groupMemberEntryCache = [];
10 var orgUnitCache = {};
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'));
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; } );
25 function byName(name, ctxt) {
26 return dojo.query('[name=' + name + ']', ctxt)[0];
29 function buildEditPaneAdditions(editPane) {
30 groupMemberEntryCache = [];
31 var tr = document.createElement('tr');
32 var td = document.createElement('td');
33 td.setAttribute('colspan','2');
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);
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));
44 var selector = new openils.widget.AutoFieldWidget({
47 parentNode : byName('org-unit-selector', curGroupMemberEditor)
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);
58 byName('group-member-entry-tbody', editPane.domNode).appendChild(row);
61 byName('add-group-member', editPane.domNode).onclick = function() {
62 addMember(selector.widget.attr('value'));
65 // On edit we need to load existing entries.
66 // On create, not so much.
67 if(!editPane.fmObject) return;
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); } );
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();
84 if(group_member_entry.exclude() == 't') {
85 byName('group-member-exclude', row).setAttribute('checked', 'true');
87 byName('remove-group-member', row).onclick = function() {
88 byName('group-member-entry-tbody', cfgGrid.editPane.domNode).removeChild(row);
90 byName('group-member-entry-tbody', cfgGrid.editPane.domNode).appendChild(row);
93 function updateLinked(fmObject, rowindex) {
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
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);
111 var group_members = [];
112 dojo.query('[name=group-member-entry-row]', this.editPane.domNode).forEach(
114 var member_id = row.getAttribute('group_member');
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;
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);
132 var entry = new fieldmapper.cfgm();
133 var org_unit = row.getAttribute('org_unit');
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');
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);
152 function updateEntries() {
153 pcrud.update(update, {
154 oncomplete : function () {
155 progressDialog.hide();
160 function removeEntries() {
161 pcrud.eliminate(remove, {
162 oncomplete : function () {
166 progressDialog.hide();
172 function addEntries() {
174 oncomplete : function () {
177 } else if (update.length) {
180 progressDialog.hide();
188 else if (remove.length)
190 else if (update.length)
193 progressDialog.hide();
196 openils.Util.addOnLoad(load);