1 if(!dojo._hasResource['openils.widget.EditPane']) {
2 dojo.provide('openils.widget.EditPane');
3 dojo.require('openils.widget.AutoWidget');
4 dojo.require('openils.widget.AutoFieldWidget');
5 dojo.require('fieldmapper.Fieldmapper');
6 dojo.require('dijit.layout.ContentPane');
7 dojo.require('openils.Util');
8 dojo.require('openils.PermaCrud');
9 dojo.require('dijit.form.Button');
12 'openils.widget.EditPane',
13 [dijit.layout.ContentPane, openils.widget.AutoWidget],
16 onPostSubmit : null, // apply callback
17 onCancel : null, // cancel callback
18 hideActionButtons : false,
21 suppressFields : null,
22 requiredFields : null,
23 paneStackCount : 1, // how many fields to add to each row, for compressing display
25 constructor : function(args) {
32 * Builds a basic table of key / value pairs. Keys are IDL display labels.
33 * Values are dijit's, when values set
35 startup : function() {
36 this.inherited(arguments);
39 this.hideSaveButton = true;
41 // grab any field-level docs
43 var pcrud = new openils.PermaCrud();
44 this.fieldDocs = pcrud.search('fdoc', {fm_class:this.fmClass});
47 var table = this.existingTable;
49 var table = this.table = document.createElement('table');
50 this.domNode.appendChild(table);
52 var tbody = document.createElement('tbody');
53 table.appendChild(tbody);
56 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
57 this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
59 if(!this.overrideWidgets)
60 this.overrideWidgets = {};
62 if(!this.overrideWidgetClass)
63 this.overrideWidgetClass = {};
65 if(!this.overrideWidgetArgs)
66 this.overrideWidgetArgs = {};
70 for(var f in this.sortedFieldList) {
71 var field = this.sortedFieldList[f];
72 if(!field || field.virtual || field.nonIdl) continue;
74 if(this.suppressFields && this.suppressFields.indexOf(field.name) > -1)
77 if(field.name == this.fmIDL.pkey && this.mode == 'create' && this.fmIDL.pkey_sequence)
78 continue; /* don't show auto-generated fields on create */
80 if(!this.overrideWidgetArgs[field.name])
81 this.overrideWidgetArgs[field.name] = {};
83 if(this.overrideWidgetArgs[field.name].hrbefore && this.paneStackCount <= 1) {
84 var hrTr = document.createElement('tr');
85 var hrTd = document.createElement('td');
86 var hr = document.createElement('hr');
88 dojo.addClass(hrTd, 'openils-widget-editpane-hr-cell');
90 hrTr.appendChild(hrTd);
91 tbody.appendChild(hrTr);
94 if((idx++ % this.paneStackCount) == 0 || !currentRow) {
95 // time to start a new row
96 currentRow = document.createElement('tr');
97 tbody.appendChild(currentRow);
100 //var docTd = document.createElement('td');
101 var nameTd = document.createElement('td');
102 var valTd = document.createElement('td');
103 var valSpan = document.createElement('span');
104 valTd.appendChild(valSpan);
105 dojo.addClass(nameTd, 'openils-widget-editpane-name-cell');
106 dojo.addClass(valTd, 'openils-widget-editpane-value-cell');
109 if(this.fieldDocs[field]) {
110 var helpLink = dojo.create('a');
111 var helpImg = dojo.create('img', {src:'/opac/images/advancedsearch-icon.png'}); // TODO Config
112 helpLink.appendChild(helpImg);
113 docTd.appendChild(helpLink);
117 nameTd.appendChild(document.createTextNode(field.label));
118 currentRow.setAttribute('fmfield', field.name);
119 //currentRow.appendChild(docTd);
120 currentRow.appendChild(nameTd);
121 currentRow.appendChild(valTd);
122 //dojo.addClass(docTd, 'oils-fm-edit-pane-help');
124 var args = dojo.mixin(
127 fmObject : this.fmObject,
128 fmClass : this.fmClass,
129 parentNode : valSpan,
130 orgLimitPerms : this.limitPerms,
131 readOnly : this.readOnly,
132 widget : this.overrideWidgets[field.name],
133 widgetClass : this.overrideWidgetClass[field.name],
134 disableWidgetTest : this.disableWidgetTest
136 this.overrideWidgetArgs[field.name] // per-field overrides
139 if (this.overrideWidgets[field.name]) {
140 if (this.overrideWidgets[field.name].shove) {
141 args.shove = dojo.mixin(
143 this.overrideWidgets[field.name].shove
149 dojo.addClass(nameTd, 'openils-widget-editpane-ro-name-cell');
150 dojo.addClass(valTd, 'openils-widget-editpane-ro-value-cell');
153 if(this.requiredFields && this.requiredFields.indexOf(field.name) >= 0) {
154 if(!args.dijitArgs) args.dijitArgs = {};
155 args.dijitArgs.required = true;
158 var widget = new openils.widget.AutoFieldWidget(args);
161 this.fieldList.push({name:field.name, widget:widget});
163 if(!this.hideActionButtons)
164 this.buildActionButtons(tbody);
166 openils.Util.addCSSClass(table, 'oils-fm-edit-pane');
169 applySaveOnEnter : function(widget) {
171 dojo.connect(this, 'onKeyDown',
173 if(e.keyCode == dojo.keys.ENTER)
174 self.performAutoEditAction();
179 buildActionButtons : function(tbody) {
180 var row = document.createElement('tr');
181 var cancelTd = document.createElement('td');
182 var applyTd = document.createElement('td');
183 var cancelSpan = document.createElement('span');
184 var applySpan = document.createElement('span');
185 row.appendChild(cancelTd);
186 row.appendChild(applyTd);
187 cancelTd.appendChild(cancelSpan);
188 applyTd.appendChild(applySpan);
189 tbody.appendChild(row);
192 new dijit.form.Button({
193 label:'Cancel', // XXX
194 onClick : this.onCancel
197 if(this.hideSaveButton) return;
199 new dijit.form.Button({
201 onClick: function() {self.performAutoEditAction();}
205 getFields : function() {
206 return this.fieldList.map(function(a) { return a.name });
209 getFieldValue : function(field) {
210 for(var i in this.fieldList) {
211 if(field == this.fieldList[i].name) {
212 var val = this.fieldList[i].widget.getFormattedValue();
213 if (val == null && /* XXX stricter check needed? */
214 this.fieldList[i].widget.isRequired()) {
215 throw new Error("req");
222 performAutoEditAction : function() {
224 self.performEditAction({
225 oncomplete:function(req, cudResults) {
226 if(self.onPostSubmit)
227 self.onPostSubmit(req, cudResults);
232 performEditAction : function(opts) {
234 var fields = this.getFields();
235 if(this.mode == 'create')
236 this.fmObject = new fieldmapper[this.fmClass]();
238 for(var idx in fields) {
239 this.fmObject[fields[idx]](
240 this.getFieldValue(fields[idx])
244 if (E.message == "req") /* req'd field set to null. bail. */
246 else /* something else went wrong? */
249 if(this.mode == 'create' && this.fmIDL.pkey_sequence)
250 this.fmObject[this.fmIDL.pkey](null);
251 if (typeof(this.onSubmit) == "function") {
252 this.onSubmit(this.fmObject, opts, self);
254 (new openils.PermaCrud())[this.mode](this.fmObject, opts);