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,
24 constructor : function(args) {
31 * Builds a basic table of key / value pairs. Keys are IDL display labels.
32 * Values are dijit's, when values set
34 startup : function() {
35 this.inherited(arguments);
38 this.hideActionButtons = true;
40 // grab any field-level docs
42 var pcrud = new openils.PermaCrud();
43 this.fieldDocs = pcrud.search('fdoc', {fm_class:this.fmClass});
46 var table = this.existingTable;
48 var table = this.table = document.createElement('table');
49 this.domNode.appendChild(table);
51 var tbody = document.createElement('tbody');
52 table.appendChild(tbody);
55 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
56 this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
58 if(!this.overrideWidgets)
59 this.overrideWidgets = {};
61 if(!this.overrideWidgetClass)
62 this.overrideWidgetClass = {};
64 if(!this.overrideWidgetArgs)
65 this.overrideWidgetArgs = {};
67 for(var f in this.sortedFieldList) {
68 var field = this.sortedFieldList[f];
69 if(!field || field.virtual || field.nonIdl) continue;
71 if(this.suppressFields && this.suppressFields.indexOf(field.name) > -1)
74 if(field.name == this.fmIDL.pkey && this.mode == 'create' && this.fmIDL.pkey_sequence)
75 continue; /* don't show auto-generated fields on create */
77 var row = document.createElement('tr');
78 //var docTd = document.createElement('td');
79 var nameTd = document.createElement('td');
80 var valTd = document.createElement('td');
81 var valSpan = document.createElement('span');
82 valTd.appendChild(valSpan);
85 if(this.fieldDocs[field]) {
86 var helpLink = dojo.create('a');
87 var helpImg = dojo.create('img', {src:'/opac/images/advancedsearch-icon.png'}); // TODO Config
88 helpLink.appendChild(helpImg);
89 docTd.appendChild(helpLink);
93 nameTd.appendChild(document.createTextNode(field.label));
94 row.setAttribute('fmfield', field.name);
95 //row.appendChild(docTd);
96 row.appendChild(nameTd);
97 row.appendChild(valTd);
98 tbody.appendChild(row);
99 //dojo.addClass(docTd, 'oils-fm-edit-pane-help');
101 if(!this.overrideWidgetArgs[field.name])
102 this.overrideWidgetArgs[field.name] = {};
104 var args = dojo.mixin(
105 this.overrideWidgetArgs[field.name], {
107 fmObject : this.fmObject,
108 fmClass : this.fmClass,
109 parentNode : valSpan,
110 orgLimitPerms : this.limitPerms,
111 readOnly : this.readOnly,
112 widget : this.overrideWidgets[field.name],
113 widgetClass : this.overrideWidgetClass[field.name],
114 disableWidgetTest : this.disableWidgetTest
118 if(this.requiredFields && this.requiredFields.indexOf(field.name) >= 0) {
119 if(!args.dijitArgs) args.dijitArgs = {};
120 args.dijitArgs.required = true;
123 var widget = new openils.widget.AutoFieldWidget(args);
126 this.fieldList.push({name:field.name, widget:widget});
128 if(!this.hideActionButtons)
129 this.buildActionButtons(tbody);
131 openils.Util.addCSSClass(table, 'oils-fm-edit-pane');
134 applySaveOnEnter : function(widget) {
136 dojo.connect(this, 'onKeyDown',
138 if(e.keyCode == dojo.keys.ENTER)
139 self.performAutoEditAction();
144 buildActionButtons : function(tbody) {
145 var row = document.createElement('tr');
146 var cancelTd = document.createElement('td');
147 var applyTd = document.createElement('td');
148 var cancelSpan = document.createElement('span');
149 var applySpan = document.createElement('span');
150 row.appendChild(cancelTd);
151 row.appendChild(applyTd);
152 cancelTd.appendChild(cancelSpan);
153 applyTd.appendChild(applySpan);
154 tbody.appendChild(row);
157 new dijit.form.Button({
158 label:'Cancel', // XXX
159 onClick : this.onCancel
162 new dijit.form.Button({
164 onClick: function() {self.performAutoEditAction();}
168 getFields : function() {
169 return this.fieldList.map(function(a) { return a.name });
172 getFieldValue : function(field) {
173 for(var i in this.fieldList) {
174 if(field == this.fieldList[i].name)
175 return this.fieldList[i].widget.getFormattedValue();
179 performAutoEditAction : function() {
181 self.performEditAction({
182 oncomplete:function(req, cudResults) {
183 if(self.onPostSubmit)
184 self.onPostSubmit(req, cudResults);
189 performEditAction : function(opts) {
190 var pcrud = new openils.PermaCrud();
191 var fields = this.getFields();
192 if(this.mode == 'create')
193 this.fmObject = new fieldmapper[this.fmClass]();
194 for(var idx in fields)
195 this.fmObject[fields[idx]](this.getFieldValue(fields[idx]));
196 if(this.mode == 'create' && this.fmIDL.pkey_sequence)
197 this.fmObject[this.fmIDL.pkey](null);
198 pcrud[this.mode](this.fmObject, opts);