1 /*jshint indent:2, curly:true, eqeqeq:true, immed:true, latedef:true,
2 newcap:true, noarg:true, regexp:true, undef:true, trailing:true,
3 white:true, strict:false*/
4 /*global enyo:true, XT:true, XV:true, Globalize:true, XM:true, _:true */
8 XT.extensions.purchasing.initRelationWidgets = function () {
10 // ..........................................................
15 This relation widget requires attribute mappings as an object for
16 `itemSource` and `vendorItemNumber`. If a vendor item number is keyed
17 in that is not found, or a null item source is passed in while a vendor
18 item number has a legitimate string, then the vendor item number will
19 be displayed. This allows use of the widget as a basic text field
20 for vendor item number in cases where there is no item source.
23 name: "XV.ItemSourceWidget",
24 kind: "XV.RelationWidget",
25 label: "_itemSource".loc(),
26 collection: "XM.ItemSourceCollection",
27 list: "XV.ItemSourceList",
28 keyAttribute: "vendorItemNumber",
29 nameAttribute: "contract.number",
32 vendorItemNumber: null,
35 {kind: "FittableColumns", components: [
36 {name: "label", content: "", fit: true, classes: "xv-flexible-label"},
37 {kind: "onyx.InputDecorator", name: "decorator",
38 classes: "xv-input-decorator", components: [
39 {name: "input", kind: "onyx.Input", classes: "xv-subinput",
40 onkeyup: "keyUp", onkeydown: "keyDown", onblur: "receiveBlur",
41 onfocus: "receiveFocus"
43 {kind: "onyx.MenuDecorator", onSelect: "itemSelected", components: [
44 {kind: "onyx.IconButton", classes: "icon-folder-open-alt"},
45 {name: "popupMenu", floating: true, kind: "onyx.Menu",
47 {kind: "XV.MenuItem", name: "searchItem", content: "_search".loc()},
48 {kind: "XV.MenuItem", name: "openItem", content: "_open".loc(),
50 {kind: "XV.MenuItem", name: "newItem", content: "_new".loc(),
54 {name: "completer", kind: "XV.Completer", onSelect: "itemSelected"}
57 {kind: "FittableColumns", name: "detailColumns", components: [
58 {name: "labels", classes: "xv-relationwidget-column left",
60 {name: "contractLabel", content: "_contract".loc() + ":",
61 classes: "xv-relationwidget-description label",
63 {name: "minimumQtyLabel", content: "_minimumOrderQuantity".loc() + ":",
64 classes: "xv-relationwidget-description label",
66 {name: "multipleQtyLabel", content: "_multipleOrderQuantity".loc() + ":",
67 classes: "xv-relationwidget-description label",
69 {name: "earliestDateLabel", content: "_earliestDate".loc() + ":",
70 classes: "xv-relationwidget-description label",
73 {name: "data", fit: true, components: [
74 {name: "name", classes: "xv-relationwidget-description hasLabel",
76 {name: "description", classes: "xv-relationwidget-description hasLabel",
78 {name: "minimumQty", classes: "xv-relationwidget-description hasLabel",
80 {name: "multipleQty", classes: "xv-relationwidget-description hasLabel",
82 {name: "earliestDate", classes: "xv-relationwidget-description hasLabel",
88 this.inherited(arguments);
89 if (!this.getShowDetail()) {
90 this.$.detailColumns.setStyle("display: none");
93 disabledChanged: function () {
94 this.inherited(arguments);
95 var disabled = this.getDisabled();
96 this.$.minimumQty.addRemoveClass("disabled", disabled);
97 this.$.multipleQty.addRemoveClass("disabled", disabled);
98 this.$.earliestDate.addRemoveClass("disabled", disabled);
101 Can accept a two property object with an item source and vendor item number
102 or a full XM.ItemSource object.
104 setValue: function (obj, options) {
105 options = options || {};
107 value = obj instanceof XM.ItemSource || _.isNull(obj) ? obj : obj.itemSource,
108 newId = value ? value.id : null,
109 oldId = this.value ? this.value.id : null,
110 oldVendorItemNumber = this.getVendorItemNumber(),
111 key = this.getFirstKey(),
112 name = this.getNameAttribute(),
115 Model = this._collection.model,
118 setPrivileges = function () {
119 if (value && newId) {
120 if (value.couldRead) {
121 that.$.openItem.setDisabled(!value.couldRead());
123 that.$.openItem.setDisabled(!value.getClass().canRead());
128 if (obj instanceof XM.ItemSource && !_.isNull(obj)) {
129 keyValue = obj.get("vendorItemNumber");
130 } else if (_.isObject(obj)) {
131 keyValue = obj.vendorItemNumber || "";
134 if (_.isString(value)) {
135 if (this.value === value || oldId === value) { return; }
137 id = _.isObject(value) ? value.id : value;
139 newValue = new Model();
142 success: function () {
144 itemSource: newValue,
145 vendorItemNumber: newValue.get("vendorItemNumber")
149 XT.log("Error setting relational widget value");
152 newValue.fetch(options);
157 if (value && value.getValue) {
158 keyValue = value.getValue(key) || "";
159 nameValue = value.getValue(name) || "";
161 this.setVendorItemNumber(keyValue);
162 this.$.input.setValue(keyValue);
163 this.$.name.setShowing(nameValue);
164 this.$.name.setContent(nameValue);
166 // Only notify if selection actually changed
167 if ((newId !== oldId || oldVendorItemNumber !== keyValue) && !options.silent) {
172 vendorItemNumber: keyValue
177 // Handle menu actions
178 that.$.openItem.setShowing(true);
179 that.$.newItem.setShowing(true);
180 that.$.openItem.setDisabled(true);
181 that.$.newItem.setDisabled(_couldNotCreate.apply(this) || this.disabled);
182 if (Model) { setPrivileges(); }
184 if (this.getShowDetail()) {
185 var contract = value ? value.getValue("contract.number") : "",
186 minimumQty = value ? value.get("minimumOrderQuantity") : 0,
187 multipleQty = value ? value.get("multipleOrderQuantity") : 0,
188 earliestDate = value ? XT.date.applyTimezoneOffset(value.get("earliestDate"), true) : null,
189 scale = XT.QTY_SCALE;
190 this.$.contractLabel.setShowing(contract);
191 this.$.minimumQtyLabel.setShowing(minimumQty);
192 this.$.minimumQty.setShowing(minimumQty);
193 this.$.minimumQty.setContent(Globalize.format(minimumQty, "n" + scale));
194 this.$.multipleQtyLabel.setShowing(multipleQty);
195 this.$.multipleQty.setShowing(multipleQty);
196 this.$.multipleQty.setContent(Globalize.format(multipleQty, "n" + scale));
197 this.$.earliestDateLabel.setShowing(earliestDate);
198 this.$.earliestDate.setShowing(earliestDate);
199 this.$.earliestDate.setContent(Globalize.format(earliestDate, "d"));
204 _fetchSuccess: function () {
205 if (this._relationSelected) { return; }
206 var value = this._collection.length ? this._collection.models[0] : null,
207 vendorItemNumber = value ? value.get("vendorItemSource") : this.$.input.getValue(),
208 target = enyo.dispatcher.captureTarget;
211 vendorItemNumber: vendorItemNumber
213 enyo.dispatcher.captureTarget = target;
218 var _couldNotCreate = function () {
219 var Workspace = this._Workspace,
220 Model = this._collection.model,
221 couldNotCreate = true;
223 if (Model && Model.couldCreate) {
224 // model is a list item or relation
225 couldNotCreate = !Model.couldCreate();
227 // model is a first-class model
228 couldNotCreate = !Model.canCreate();
230 return couldNotCreate;
233 // ..........................................................
238 name: "XV.PurchaseVendorWidget",
239 kind: "XV.VendorWidget",
240 collection: "XM.PurchaseVendorRelationCollection"
243 // ..........................................................
248 name: "XV.VendorAddressWidget",
249 kind: "XV.RelationWidget",
250 collection: "XM.VendorAddressRelationCollection",
251 list: "XV.VendorAddressList",
252 keyAttribute: "code",