1(function (window, $) { 2 "use strict"; 3 4 var virtualPageSize = 50; 5 var virtualItemHeight = 48; 6 var nonVirtualPageSizeBuffer = 20; 7 8 function getFilterValue(filter) { 9 if (!filter) { 10 return ""; 11 } 12 13 if (filter.filters && filter.filters.length) { 14 return getFilterValue(filter.filters[0]); 15 } 16 17 return filter.value || ""; 18 } 19 20 function valueMapper($input, options) { 21 var currentValue = $input.val(); 22 var currentText = $input.attr("data-selected-text"); 23 var values = $.isArray(options.value) ? options.value : [options.value]; 24 var mappedItems = []; 25 26 if (currentValue && currentText) { 27 $.each(values, function (_, value) { 28 if (String(value).toLowerCase() === String(currentValue).toLowerCase()) { 29 mappedItems.push({ 30 addressId: currentValue, 31 displayText: currentText 32 }); 33 } 34 }); 35 } 36 37 options.success(mappedItems); 38 } 39 40 function getAddressDisplayText(data) { 41 if (!data) { 42 return ""; 43 } 44 45 return typeof data === "string" ? data : data.displayText || ""; 46 } 47 48 function addressItemTemplate(data) { 49 var text = getAddressDisplayText(data); 50 var encoded = kendo.htmlEncode(text); 51 52 return '<span class="address-dropdown-item" title="' + encoded + '">' + encoded + '</span>'; 53 } 54 55 function getAvailableAddressCount($input) { 56 var availableAddressCount = parseInt($input.attr("data-available-address-count"), 10); 57 58 return availableAddressCount > 0 ? availableAddressCount : 0; 59 } 60 61 function getDropDownPageSize($input, useVirtualScroll) { 62 if (useVirtualScroll) { 63 return virtualPageSize; 64 } 65 66 var availableAddressCount = getAvailableAddressCount($input); 67 68 return availableAddressCount > 0 ? availableAddressCount + nonVirtualPageSizeBuffer : virtualPageSize; 69 } 70 71 function createDataSource(dropDownPageSize) { 72 return new kendo.data.DataSource({ 73 serverFiltering: true, 74 serverPaging: true, 75 pageSize: dropDownPageSize, 76 transport: { 77 read: { 78 url: "/checkout/searchAddresses", 79 type: "GET", 80 dataType: "json" 81 }, 82 parameterMap: function (data, type) { 83 if (type !== "read") { 84 return data; 85 } 86 87 return { 88 search: getFilterValue(data.filter), 89 page: Math.max((data.page || 1) - 1, 0), 90 pageSize: data.pageSize || dropDownPageSize 91 }; 92 } 93 }, 94 schema: { 95 data: "items", 96 total: "totalItems" 97 } 98 }); 99 } 100 101 102 function initializeAddressDropDowns(container) { 103 var $container = container ? $(container) : $(document); 104 105 $container.find("input.js-address-dropdown").each(function () { 106 var $input = $(this); 107 if ($input.data("kendoDropDownList")) { 108 return; 109 } 110 111 var selectedValue = $input.val(); 112 var selectedText = $input.attr("data-selected-text"); 113 var useVirtualScroll = $input.attr("data-virtual-scroll") !== "false"; 114 var dropDownPageSize = getDropDownPageSize($input, useVirtualScroll); 115 var options = { 116 autoBind: $input.attr("data-auto-bind") === "true", 117 dataTextField: "displayText", 118 dataValueField: "addressId", 119 filter: "contains", 120 height: 320, 121 dataSource: createDataSource(dropDownPageSize), 122 template: addressItemTemplate, 123 valueTemplate: addressItemTemplate, 124 select: function (e) { 125 var selectedAddressId = e.dataItem && e.dataItem.addressId ? e.dataItem.addressId : ""; 126 $input.trigger("addressdropdownselecting", [this.value()]); 127 $input.trigger("addressdropdownselected", [selectedAddressId]); 128 }, 129 change: function () { 130 $input.trigger("addressdropdownchange", [this.value()]); 131 }, 132 open: function () { 133 this.popup.element 134 .toggleClass("address-dropdown-popup--virtual", useVirtualScroll) 135 .toggleClass("address-dropdown-popup--wrap", !useVirtualScroll); 136 } 137 }; 138 139 if (useVirtualScroll) { 140 options.virtual = { 141 itemHeight: virtualItemHeight, 142 mapValueTo: "dataItem", 143 valueMapper: function (mapperOptions) { 144 valueMapper($input, mapperOptions); 145 } 146 }; 147 } 148 149 var optionLabel = $input.attr("data-option-label"); 150 if (optionLabel) { 151 var optionLabelValue = $input.attr("data-option-label-value"); 152 options.optionLabel = optionLabelValue ? { 153 displayText: optionLabel, 154 addressId: optionLabelValue 155 } : optionLabel; 156 } 157 158 if (selectedValue && selectedText) { 159 options.value = selectedValue; 160 options.text = selectedText; 161 } 162 163 var addAddressText = $input.attr("data-add-address-text"); 164 if (addAddressText) { 165 options.footerTemplate = '<div class="dropdown-footer"><a href="\\#" class="btn-add-ship-to">' + 166 kendo.htmlEncode(addAddressText) + '</a></div>'; 167 } 168 169 $input.kendoDropDownList(options); 170 171 }); 172 } 173 174 function destroyAddressDropDowns(container) { 175 $(container).find("input.js-address-dropdown").each(function () { 176 var widget = $(this).data("kendoDropDownList"); 177 if (widget) { 178 widget.destroy(); 179 } 180 }); 181 } 182 183 function setAddressDropDownValue(selector, addressId, displayText, triggerChange) { 184 var $input = $(selector); 185 var widget = $input.data("kendoDropDownList"); 186 var item = { 187 addressId: addressId, 188 displayText: displayText || "" 189 }; 190 191 $input.val(addressId); 192 if (displayText) { 193 $input.attr("data-selected-text", displayText); 194 } 195 196 if (widget && displayText) { 197 widget.dataSource.add(item); 198 widget.value(addressId); 199 } 200 201 if (triggerChange) { 202 $input.trigger("addressdropdownchange", [addressId]); 203 } 204 } 205 206 window.initializeAddressDropDowns = initializeAddressDropDowns; 207 window.destroyAddressDropDowns = destroyAddressDropDowns; 208 window.setAddressDropDownValue = setAddressDropDownValue; 209 210 $(function () { 211 initializeAddressDropDowns(document); 212 });
213}(window, jQuery));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.