3 window._w.priceguide = {
10 onPageDestruct : function()
12 App.Event.removeListener('priceguideGridSuFilter', 'SuChange');
15 onPriceGuidePageTemplateReady : function( template, event, eventData )
17 App.DataStore.loadSelectListData('filtermakes', true, 'Stock', 'Make.SelectList');
18 App.DataStore.loadSelectListData('regions', true, 'Location', 'Region.SelectList');
19 _w.priceguide.ti = _t[template];
20 App.DataStore.setData('pgstatuses',
22 {"value":"Updateable Offer", "label":"Updateable Offer"},
23 {"value":"Valid Offer", "label":"Valid Offer"},
24 {"value":"Offer Accepted", "label":"Offer Accepted"},
25 {"value":"Expired", "label":"Expired"},
26 {"value":"Archived", "label":"Archived"}
29 _w.priceguide.ti.hydrate({
30 'gridTitle': 'Price Guide',
31 'gridTitleSubtext': 'Please use the filters below to narrow down the view',
33 constructor: 'Button',
37 id: 'exportPriceGuideGrid',
38 handler: _w.priceguide.exportPriceGuideGrid
42 'gridContextFilter': {
43 constructor: 'GridContextFilter',
46 title: 'Search here:',
47 style: 'filter-input-wrapper hidden-tablet hidden-phone',
48 id: 'gridPriceGuideContext_RefNo',
49 placeholder: 'Ref number',
50 context: 'gridPriceGuideContext'
53 style: 'filter-input-wrapper hidden-tablet hidden-phone',
54 id: 'gridPriceGuideContext_RegNo',
55 placeholder: 'Registration number',
56 context: 'gridPriceGuideContext'
59 style : 'input-append date filter-input-wrapper-date mobile-width12p dfrom hidden-tablet hidden-phone',
60 title: 'Search date created here',
61 id: 'gridPriceGuideContext_DateFrom',
63 context: 'gridPriceGuideContext',
64 append: '<i class="icon-calendar"></i>',
67 $('#gridPriceGuideContext_DateFrom').change(function() {
68 _w.priceguide.dFrom = $(this).val();
73 style : 'input-append date filter-input-wrapper-date mobile-width12p dto hidden-tablet hidden-phone',
74 id: 'gridPriceGuideContext_DateTo',
76 context: 'gridPriceGuideContext',
77 append: '<i class="icon-calendar"></i>',
80 $('#gridPriceGuideContext_DateTo').change(function() {
81 _w.priceguide.dTo = $(this).val();
86 style: 'filter-input-wrapper hidden-desktop',
87 id: 'gridPriceGuideContext_RegNoMobi',
88 placeholder: 'Registration number',
89 context: 'gridPriceGuideContext'
93 style: 'filter-input-wrapper filter-input-select',
94 placeholder: 'Make Mobi',
95 id: 'gridPriceGuideContext_MakeMobi',
96 context: 'gridPriceGuideContext',
97 dataStoreId : 'filtermakes',
98 selectEmpty : 'All Makes',
99 style: 'MakeMobi hidden-desktop ',
100 bind : function(meta){
101 $('#gridAuctionFilter_MakeMobi').change(function(){
102 $('#gridAuctionFilter_Make').selectpicker('val', $(this).val());
107 style: 'filter-input-wrapper filter-input-select ',
108 placeholder: 'Region Mobi',
109 id: 'gridPriceGuideContext_RegionMobi',
110 context: 'gridPriceGuideContext',
111 dataStoreId : 'regions',
112 selectEmpty : 'Regions',
113 style: 'RegionMobi hidden-desktop ',
114 bind : function(meta){
115 $('#gridAuctionFilter_RegionMobi').change(function(){
116 $('#gridAuctionFilter_Region').selectpicker('val', $(this).val());
123 searchId :'btnSearch',
124 bindSearch :_w.priceguide.searchPriceGuideGrid,
125 clearId :'btnClearSearch',
126 bindClear :_w.priceguide.clearPriceGuideGridContext
132 'gridColumnHeaders': {
133 constructor: 'GridColumnHeader',
136 id: 'gridPriceGuideColumn_Make',
139 id: 'gridPriceGuideOrder_MakeAsc',
140 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'make.name', 'ASC')
143 id: 'gridPriceGuideOrder_MakeDesc',
144 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'make.name', 'DESC')
146 style: ' hidden-phone'
149 id: 'gridPriceGuideColumn_Type',
152 id: 'gridPriceGuideOrder_TypeAsc',
153 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'type.name', 'ASC')
156 id: 'gridPriceGuideOrder_TypeDesc',
157 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'type.name', 'DESC')
162 id: 'gridPriceGuideColumn_Year',
165 id: 'gridPriceGuideOrder_YearAsc',
166 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'vehicleYear.name', 'ASC')
169 id: 'gridPriceGuideOrder_YearDesc',
170 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'vehicleYear.name', 'DESC')
175 id: 'gridPriceGuideColumn_KM',
178 id: 'gridPriceGuideOrder_KMAsc',
179 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'stock.km', 'ASC')
182 id: 'gridPriceGuideOrder_KMDesc',
183 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'stock.km', 'DESC')
185 style: 'kms hidden-phone'
188 id: 'gridPriceGuideColumn_Trade',
191 id: 'gridPriceGuideOrder_TradeAsc',
192 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'stock.tradePrice', 'ASC')
195 id: 'gridPriceGuideOrder_TradeDesc',
196 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'stock.tradePrice', 'DESC')
198 style: 'hidden-phone'
201 id: 'gridPriceGuideColumn_List',
202 title: 'NEW LIST PRICE',
204 id: 'gridPriceGuideOrder_ListAsc',
205 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'stock.listPrice', 'ASC')
208 id: 'gridPriceGuideOrder_ListDesc',
209 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'stock.listPrice', 'DESC')
211 style: 'hidden-phone'
214 id: 'gridPriceGuideColumn_Retail',
217 id: 'gridPriceGuideOrder_CompanyAsc',
218 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'company.name', 'ASC')
221 id: 'gridPriceGuideOrder_CompanyDesc',
222 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'company.name', 'DESC')
224 style: 'hidden-phone'
227 id: 'gridPriceGuideColumn_Retail',
230 id: 'gridPriceGuideOrder_RegionAsc',
231 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'region.name', 'ASC')
234 id: 'gridPriceGuideOrder_RegionDesc',
235 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'region.name', 'DESC')
237 style: 'hidden-phone'
240 id: 'gridPriceGuideColumn_Request',
241 title: 'CUSTOMER REQUEST',
243 id: 'gridPriceGuideOrder_RequestAsc',
244 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'valuation.requiredPrice', 'ASC')
247 id: 'gridPriceGuideOrder_RequestDesc',
248 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'valuation.requiredPrice', 'DESC')
250 style: 'hidden-phone'
253 id: 'gridPriceGuideColumn_Offer',
256 id: 'gridPriceGuideOrder_OfferAsc',
257 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'offer.amount', 'ASC')
260 id: 'gridPriceGuideOrder_OfferDesc',
261 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'offer.amount', 'DESC')
263 style: 'offer-submitted'
266 id: 'gridPriceGuideColumn_HighestOffer',
267 title: 'HIGHEST OFFER',
269 id: 'gridPriceGuideOrder_HighestOfferAsc',
270 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'stock.highestOffer', 'ASC')
273 id: 'gridPriceGuideOrder_HighestOfferDesc',
274 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'stock.highestOffer', 'DESC')
276 style: 'offer-submitted hidden-phone'
279 id: 'gridPriceGuideColumn_Time',
285 id: 'gridPriceGuideColumn_Status',
288 id: 'gridPriceGuideOrder_StatusAsc',
289 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'offer.status', 'ASC')
292 id: 'gridPriceGuideOrder_StatusDesc',
293 bind: $.proxy(_w.priceguide.orderPriceGuideGrid, this, 'offer.status', 'DESC')
295 style: ' hidden-phone'
300 'gridColumnFilters': {
301 constructor: 'GridColumnFilter',
304 id: 'gridPriceGuideFilter_Make',
305 context: 'gridPriceGuideFilter',
306 dataStoreId : 'filtermakes',
308 bind : function(meta){
309 _w.priceguide.changes = 0;
310 $('#' + meta.id).change(function(){
311 _w.priceguide.changes++;
312 if (1 == _w.priceguide.changes || 'Active' != _w.priceguide.gridStatus)
316 _w.priceguide.searchPriceGuideGrid();
321 id: 'gridPriceGuideFilter_Type',
322 context: 'gridPriceGuideFilter'
325 id: 'gridPriceGuideFilter_Year',
326 context: 'gridPriceGuideFilter'
329 id: 'gridPriceGuideFilter_KM',
330 context: 'gridPriceGuideFilter'
333 id: 'gridPriceGuideFilter_Trade',
334 context: 'gridPriceGuideFilter'
338 id: 'gridPriceGuideFilter_Company',
339 context: 'gridPriceGuideFilter'
342 id: 'gridPriceGuideFilter_Region',
343 context: 'gridPriceGuideFilter',
344 dataStoreId : 'regions',
346 bind : function(meta){
347 _w.priceguide.changes = 0;
348 $('#' + meta.id).change(function(){
349 _w.priceguide.changes++;
350 if (1 == _w.priceguide.changes || 'Active' != _w.priceguide.gridStatus)
354 _w.priceguide.searchPriceGuideGrid();
360 id: 'gridPriceGuideFilter_Request',
361 context: 'gridPriceGuideFilter'
364 id: 'gridPriceGuideFilter_Offer',
365 context: 'gridPriceGuideFilter'
368 id: 'gridPriceGuideFilter_HighestOffer',
369 context: 'gridPriceGuideFilter'
373 id: 'gridPriceGuideFilter_Status',
374 context: 'gridPriceGuideFilter',
375 dataStoreId : 'pgstatuses',
377 bind : function(meta){
378 _w.priceguide.changes = 0;
379 $('#' + meta.id).change(function(){
380 _w.priceguide.changes++;
381 if (1 == _w.priceguide.changes || 'Active' != _w.priceguide.gridStatus)
385 _w.priceguide.searchPriceGuideGrid();
391 'gridRowRepeater': {},
395 // Retrieve initial grid data.
396 if (null == App.API.taskContract('gridPriceGuide'))
399 'gridPriceGuide', 'PriceGuide', 'PriceGuide.Grid', null,
400 {}, _w.priceguide.loadPriceGuideGrid, _w.taskContractError
405 _w.priceguide.loadPriceGuideGrid( null, {}, {} );
409 onPriceGuideGridPublished : function()
414 var isMobile = 'none' == $('#mobiCheck').css('display');
416 console.log("isMobile", isMobile);
419 //var isMobile = 'none' == $('.header').css('display');
422 // show the mobi menu && hide old menu
423 $("#MobiAuctionPriceGuideMenu").show();
424 $("#MobiPortalMenu").hide();
426 // Check active state
427 $("#mobiAuctionBtn").removeClass("active");
428 $("#mobiPriceGuideBtn").addClass("active");
429 $("#mobiValuationsBtn").removeClass("active");
432 $("#mobiAuctionBtn").click(function() {
433 window.location.hash = '#/auction';
436 $("#mobiValuationsBtn").click(function() {
437 window.location.hash = '#/valuations';
441 $(".gridPriceGuideFilter").keyup(function (evt) {
442 var charCode = evt.charCode || evt.keyCode;
443 if (charCode == 13) { //Enter key's keycode
444 $('#btnSearch').click();
447 $(".gridPriceGuideContext").keyup(function (evt) {
448 var charCode = evt.charCode || evt.keyCode;
449 if (charCode == 13) { //Enter key's keycode
450 $('#btnSearch').click();
455 $('#exportPriceGuideGrid').prop('disabled', !App.permissions.pgGridExport);
457 var setTableFormWidth = function()
459 $('.table-form').css({
460 width : $(window).width() * 0.96
464 $(window).on('resize', setTableFormWidth );
467 App.Event.listen('priceguideGridSuFilter', 'SuChange', $.proxy(_w.priceguide.loadPriceGuideGrid, this), 'Recurring');
469 setTimeout(_w.priceguide.refreshGrid, 120000);
470 $('.dfrom').datepicker({format:"yyyy-mm-dd"});
471 $('.dto').datepicker({format:"yyyy-mm-dd"});
472 $('#gridPriceGuideContext_DateFrom').val(_w.priceguide.dFrom);
473 $('#gridPriceGuideContext_DateTo').val(_w.priceguide.dTo);
476 refreshGrid : function()
478 if ('priceguide' != App.activePage)
482 _w.priceguide.loadPriceGuideGrid( null, {}, {} );
483 setTimeout(_w.priceguide.refreshGrid, 120000);
486 pagePriceGuideGrid : function( page )
488 _w.priceguide.loadPriceGuideGrid( {}, {"Grid":{"Page":page}} );
491 loadPriceGuideGrid : function( contract, data, options )
494 'gridPriceGuide', data, options,
495 _w.priceguide._onPriceGuideGridDataReceived, _w.taskExecError
499 _onPriceGuideGridDataReceived : function( response )
501 _w.priceguide.gridStatus = 'Active';
502 _w.priceguide.ti.hydrateParam('gridRowRepeater', {});
503 _w.populateFilters(response.Data.Meta.Filters, {
504 'stock.registrationNumber': 'gridPriceGuideContext_RegNo',
505 'stock.referenceNumber': 'gridPriceGuideContext_RefNo',
506 'make.id': 'gridPriceGuideFilter_Make',
507 'type.name': 'gridPriceGuideFilter_Type',
508 'vehicleYear.name': 'gridPriceGuideFilter_Year',
509 'stock.km': 'gridPriceGuideFilter_KM',
510 'stock.tradePrice': 'gridPriceGuideFilter_Trade',
511 'stock.listPrice': 'gridPriceGuideFilter_List',
512 'company.name': 'gridPriceGuideFilter_Company',
513 'region.id': 'gridPriceGuideFilter_Region',
514 'valuation.requiredPrice': 'gridPriceGuideFilter_Request',
515 'offer.amount': 'gridPriceGuideFilter_Offer',
516 'stock.highestOffer': 'gridPriceGuideFilter_HighestOffer',
517 'offer.status': 'gridPriceGuideFilter_Status'
519 $('select.gridPriceGuideFilter').each(function(i, elem) {
520 $(elem).selectpicker('refresh');
523 for (var i = 0; i < response.Data.DataSet.length; i++)
525 var row = response.Data.DataSet[i];
529 for (var z in row.offers[0])
531 if (row.offers[0][z].company.id == App.companyData.id)
533 myOffer = row.offers[0][z];
537 if ('Open4Offers' != row.jobState && 'Updateable Offers' != row.jobState)
539 var numDays = App.serverConfig.priceGuideCompletionDays;
540 var hoursLeft = App.Util.calculateTimeLeft(row.created, numDays);
544 var numHours = App.serverConfig.priceGuideOpenDays;
545 var hoursLeft = App.Util.calculateTimeLeftHours(row.created, numHours);
555 CustomerRequest : 'R ',
561 jobState: row.jobState,
562 bind: function(meta) {
563 $('#row' + meta.rowId).click(function(e){
564 window.location='#/' + meta.surl + '?pgId=' + meta.rowId + '&id=' + (meta.myOffer ? meta.myOffer.id : 0);
566 if ('Open4Offers' == meta.jobState || 'Updateable Offers' == meta.jobState)
568 $('#ofr' + meta.rowId).click(function(e) {
576 $('#ofr' + meta.rowId).click(function(e) {
580 $('#modalbody').html('<center>Loading offers...</center>');
581 $('#myModal').modal('toggle');
583 'offerList', 'PriceGuide', 'Offer.List',
584 meta.rowId, {}, function(){
589 console.log("meta.rowId", meta.rowId);
590 var offers = response.Data;
593 var modalbody = '<table class="table table-bordered table-condensed table-striped">';
594 modalbody += '<tr><td>Date Offered</td><td>Amount</td></tr>';
595 for (var x in offers)
597 var isOwn = offers[x].company.id == App.companyData.id
601 '<tr class="modalrow ' + (isOwn ? 'red' : 'black') + '">'
602 + '<td class="date">' + offers[x].created + '</td>'
603 + '<td class="wide">R' + offers[x].amount + '</td>'
606 modalbody += '</table>';
610 var modalbody = '<div style="font-weight:bold;color:#9B2022;">There are no offers!</div>';
612 $('#modalbody').html(modalbody);
615 }, _w.taskContractError
623 Make : 'make hidden-phone',
627 Trade : 'hidden-phone',
628 Company : 'hidden-phone',
629 Region : 'hidden-phone',
630 CustomerRequest: 'hidden-phone',
632 HighestOffer: 'offer hidden-phone',
634 Status : 'status hidden-phone'
637 'id' : {'pgId' : row.id, 'id' : myOffer ? myOffer.id : 0},
638 'Make' : row.stock.type.model.make.name,
639 'Type' : row.stock.type.name,
640 'Year' : row.stock.vehicleYear.name,
642 'Trade' : row.stock.tradePrice,
643 'List' : row.stock.listPrice,
644 'Company' : row.company.name,
645 'Region' : row.company.region.name,
646 'CustomerRequest': row.stock.valuation && row.stock.valuation.requiredPrice
647 ? row.stock.valuation.requiredPrice
650 ? myOffer.amount + '<a class="soda_pop hidden-phone hidden-tablet" id="ofr' + row.id + '"><span>' + row.stock.numberOfOffers + '</span></a>'
651 : '<a class="soda_pop hidden-phone hidden-tablet" id="ofr' + row.id + '"><span>' + row.stock.numberOfOffers + '</span></a>',
652 'HighestOffer' : ('Open4Offers' != row.jobState && 'Updateable Offers' != row.jobState)
653 && row.stock.highestOffer
654 ? row.stock.highestOffer
659 : ('Open4Offers' == row.jobState || 'Updateable Offers' == row.jobState ? '* Open4Offers' : '* Expired')
664 _w.priceguide.ti.hydrateParam('gridRowRepeater', {
665 constructor : 'GridDataRow',
668 response.Data.Meta.itemName = 'stockPager';
669 response.Data.Meta.bind = _w.priceguide.pagePriceGuideGrid;
670 _w.priceguide.ti.hydrateParam('gridPager', {
671 constructor : 'GridPager',
672 items : [response.Data.Meta]
675 // todo: add pager hydration
685 exportPriceGuideGrid : function()
688 'gridPriceGuide', {}, {'ExportToExcel': true},
689 _w.priceguide._onExportReceived, _w.taskExecError,
694 _onExportReceived : function( response )
696 var win = window.open();
697 win.document.write(response);
700 clearPriceGuideGridContext : function()
702 _w.priceguide.gridStatus = 'Inactive';
705 $('select.gridPriceGuideFilter').each(function(i, elem) {
706 $(elem).selectpicker('val', '');
707 $(elem).selectpicker('refresh');
710 catch (err) { console.log(err); }
711 $('.gridPriceGuideContext').val('');
712 $('.gridPriceGuideFilter').val('');
713 _w.priceguide.searchPriceGuideGrid(true);
716 searchPriceGuideGrid : function(resetOrder)
718 _w.priceguide.gridStatus = 'Inactive';
723 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideContext_RegNo', 'stock.registrationNumber');
724 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideContext_RefNo', 'stock.referenceNumber');
725 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideContext_DateFrom', 'priceGuide.created', '>=');
726 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideContext_DateTo', 'priceGuide.created', '<=', ' 23:59:59');
727 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Make', 'make.id');
728 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Type', 'type.name');
729 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Year', 'vehicleYear.name');
730 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_KM', 'stock.km');
731 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Trade', 'stock.tradePrice');
732 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_List', 'stock.listPrice');
733 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Company', 'company.name');
734 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Region', 'region.id');
735 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Request', 'valuation.requiredPrice');
736 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Offer', 'offer.amount');
737 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_HighestOffer', 'stock.highestOffer');
738 filter = _w.filterIfnotEmpty(filter, 'gridPriceGuideFilter_Status', 'offer.status');
739 var request = {"Grid":{
741 "Filter": filter.filters
745 request.Grid.OrderBy = {'priceGuide.created': 'DESC'};
747 _w.priceguide.loadPriceGuideGrid( null, request, {} );
750 orderPriceGuideGrid : function(field, direction)
753 order[field] = direction;
754 _w.priceguide.loadPriceGuideGrid( {}, {"Grid":{"Page": 1, "OrderBy": order}} );