Subversion Repositories SmartDukaan

Rev

Rev 37651 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
35548 aman 1
$(function () {
2
    $(document).on('click', ".lead", function () {
3
        loadLead("main-content");
4
    });
29598 tejbeer 5
 
35548 aman 6
    $(document).on('click', ".team-commitment", function () {
7
        loadTeamCommitment("main-content");
8
    });
30439 tejbeer 9
 
10
 
35548 aman 11
    $(document).on('click', ".partner-health", function () {
12
        loadPartnerHealth("main-content");
13
    });
29598 tejbeer 14
 
37651 vikas 15
    // Sidebar "Import Meta Leads". The menu row's action_class becomes the anchor's css class,
16
    // which is how every other menu entry in this app is wired.
17
    $(document).on('click', ".meta-lead-import", function () {
18
        doGetAjaxRequestHandler(context + "/lms/meta-import", function (response) {
19
            $('#main-content').html(response);
20
        });
21
    });
22
 
23
    // Lead id -> LMS record. Delegated because the lead lists are re-rendered by ajax, and the
24
    // record itself is a fragment that replaces #main-content, same as every other screen here.
25
    $(document).on('click', ".lms-open-record", function (e) {
26
        e.preventDefault();
27
        e.stopPropagation();
28
        var leadId = $(this).data('leadid');
29
        if (!leadId) { return; }
30
        doGetAjaxRequestHandler(context + "/leadRecord?leadId=" + leadId, function (response) {
31
            $('#main-content').html(response);
32
        });
33
    });
34
 
35548 aman 35
    $(document).on('click', ".lead-detail", function () {
36
        loadLeadDetail("main-content");
37
    });
30439 tejbeer 38
 
31370 tejbeer 39
 
35548 aman 40
    $(document).on('click', ".submitCommitment",
41
        function () {
42
            var startDateTime = getDatesFromPicker('input[name="commitmentDate"]').startDate;
43
            doGetAjaxRequestHandler(context + "/getTeamCommitment?date="
44
                + startDateTime, function (response) {
45
                $('.teamcommitmentcontainer').html(response);
31370 tejbeer 46
 
35548 aman 47
            });
48
        });
30439 tejbeer 49
 
50
 
35548 aman 51
    $(document).on('click', ".submitDateWiseLead", function () {
30439 tejbeer 52
 
35769 amit 53
        var startDate = $("#startDate").val();
54
        var endDate = $("#endDate").val();
35548 aman 55
        var status = $("#statusFilter").val();
56
        var color = $("#colorFilter").val();
31370 tejbeer 57
 
35548 aman 58
        if (color == null) {
59
            color = "";
60
        }
31370 tejbeer 61
 
35769 amit 62
        if (startDate && endDate) {
63
            var start = new Date(startDate);
64
            var end = new Date(endDate);
65
            if (end < start) {
66
                alert("End date must be after start date");
67
                return;
68
            }
69
        }
31370 tejbeer 70
 
35769 amit 71
        doGetAjaxRequestHandler(context + "/getOpenLead?leadStatus=" + status + "&color=" + color + "&startDate=" + startDate + "&endDate=" + endDate, function (response) {
35548 aman 72
            $('#' + 'main-content').html(response);
73
        });
29598 tejbeer 74
 
75
 
35548 aman 76
    })
77
    ;$(document).on('click', ".downloadDateWiseLead", function () {
29598 tejbeer 78
 
35769 amit 79
        var startDate = $("#startDate").val();
80
        var endDate = $("#endDate").val();
35548 aman 81
        var status = $("#statusFilter").val();
82
        var color = $("#colorFilter").val();
29598 tejbeer 83
 
35548 aman 84
        if (color == null) {
85
            color = "";
86
        }
29598 tejbeer 87
 
35769 amit 88
        if (startDate && endDate) {
89
            var start = new Date(startDate);
90
            var end = new Date(endDate);
91
            if (end < start) {
92
                alert("End date must be after start date");
93
                return;
94
            }
95
        }
96
 
37821 aman 97
        // Send the table's current search text too, so the CSV matches the rows on screen.
98
        var searchTerm = $.trim($('#lead-table_filter input').val() || $('#lead-table-bottom-filter').val() || "");
99
        let endPoint = `${context}/downloadDateWiseLead?leadStatus=${status}&color=${color}&startDate=${startDate}&endDate=${endDate}&searchTerm=${encodeURIComponent(searchTerm)}`;
35548 aman 100
        window.location.href = endPoint;
31249 tejbeer 101
 
35548 aman 102
    });
34650 aman.kumar 103
 
37046 aman 104
    // Lead-table Search boxes (top DataTables box + bottom mirror below the table/pagination) =
105
    // GLOBAL partner search: matches ANY lead by name / mobile / outlet / city across ALL statuses
106
    // and ALL dates (this year, last year, anytime) - not just the loaded date-scoped rows. It
107
    // searches AS YOU TYPE (debounced) so old partners surface without needing to press Enter;
108
    // Enter still triggers an immediate search. Results render into #global-search-results above
109
    // the date-scoped table; the view auto-scrolls there so a search from the bottom box is visible
110
    // without the user having to scroll back up manually.
111
    var LEAD_SEARCH_BOXES = "#lead-table_filter input, #lead-table-bottom-filter";
37021 aman 112
    var leadGlobalSearchTimer = null;
113
 
37048 ranu 114
    function clearInjectedGlobalRows() {
115
        if ($.fn.dataTable.isDataTable('#lead-table')) {
116
            $('#lead-table').DataTable()
117
                .rows('.global-search-row')
118
                .remove()
119
                .draw(false);
120
        }
121
    }
122
 
37050 ranu 123
    // Exposed so handlers outside the $(function () { ... }) scope (e.g. #vrSendBtn) can
124
    // refresh the search view after they mutate a lead.
125
    window.runGlobalLeadSearch = function (term) {
126
        runGlobalLeadSearch(term);
127
    };
128
 
37021 aman 129
    function runGlobalLeadSearch(term) {
130
        term = $.trim(term || "");
131
        if (term.length < 2) {
132
            $('#global-search-results').html("");
37048 ranu 133
            clearInjectedGlobalRows();
37021 aman 134
            return;
135
        }
136
        var safeTerm = $('<div>').text(term).html();
137
        doGetAjaxRequestHandler(context + "/globalLeadSearch?searchTerm=" + encodeURIComponent(term),
138
            function (response) {
139
                $('#global-search-results').html(
140
                    '<h4 style="margin:15px 0 8px;">Search results — all partners, any date '
141
                    + '<small class="text-muted">(matching "' + safeTerm + '")</small></h4>' + response);
37046 aman 142
                var resultsEl = document.getElementById('global-search-results');
143
                if (resultsEl) {
144
                    resultsEl.scrollIntoView({behavior: 'smooth', block: 'start'});
145
                }
37048 ranu 146
 
147
                // Mirror the hits into the main #lead-table so the same row is findable there too.
148
                // Rows carry class .global-search-row so we can clear them on the next search.
149
                clearInjectedGlobalRows();
150
                var $hiddenRows = $('#global-search-main-rows tbody tr');
151
                if ($hiddenRows.length && $.fn.dataTable.isDataTable('#lead-table')) {
152
                    var dt = $('#lead-table').DataTable();
37050 ranu 153
                    // Collect lead ids already in the main table (from the initial date-scoped
154
                    // render) so we don't inject a duplicate row for the same lead.
155
                    var existingIds = {};
156
                    dt.rows().nodes().to$().each(function () {
157
                        var id = $(this).attr('data');
158
                        if (id) existingIds[id] = true;
159
                    });
37048 ranu 160
                    $hiddenRows.each(function () {
37050 ranu 161
                        var id = $(this).attr('data');
162
                        if (id && existingIds[id]) return;
37048 ranu 163
                        dt.row.add(this);
164
                    });
165
                    dt.draw(false);
166
                }
37021 aman 167
            });
168
    }
169
 
37046 aman 170
    $(document).on('keydown', LEAD_SEARCH_BOXES, function (e) {
36984 aman 171
        if (e.which === 13) {
172
            e.preventDefault();
37021 aman 173
            clearTimeout(leadGlobalSearchTimer);
174
            runGlobalLeadSearch($(this).val());
36984 aman 175
        }
176
    });
34650 aman.kumar 177
 
37046 aman 178
    $(document).on('input', LEAD_SEARCH_BOXES, function () {
37021 aman 179
        var term = $(this).val();
180
        clearTimeout(leadGlobalSearchTimer);
181
        leadGlobalSearchTimer = setTimeout(function () {
182
            runGlobalLeadSearch(term);
183
        }, 350);
36984 aman 184
    });
185
 
37046 aman 186
    // Bottom box isn't a native DataTables filter element, so mirror it into the DataTable's own
187
    // search + keep both boxes showing the same value regardless of which one the user typed into.
188
    $(document).on('keyup input', '#lead-table-bottom-filter', function () {
189
        var term = $(this).val();
190
        $('#lead-table_filter input').val(term);
191
        if ($.fn.dataTable.isDataTable('#lead-table')) {
192
            $('#lead-table').DataTable().search(term).draw();
193
        }
194
    });
36984 aman 195
 
37046 aman 196
    $(document).on('keyup input', '#lead-table_filter input', function () {
197
        $('#lead-table-bottom-filter').val($(this).val());
198
    });
199
 
200
 
35548 aman 201
    $(document).on('click', ".visit-request-plan", function () {
34650 aman.kumar 202
 
35548 aman 203
        doGetAjaxRequestHandler(context + "/visitPlan", function (response) {
204
            $('#' + 'main-content').html(response);
205
        });
34650 aman.kumar 206
 
35548 aman 207
    });
34650 aman.kumar 208
 
35548 aman 209
    $(document).on('click', ".visitPlan", function () {
25980 tejbeer 210
 
35548 aman 211
        let dateWisePlan = $("#dateVisitSearch").val();
31249 tejbeer 212
 
35548 aman 213
        doGetAjaxRequestHandler(context + "/visit/getVisitPlan?date=" + dateWisePlan, function (response) {
214
            $('#' + 'main-content').html(response);
215
        });
31249 tejbeer 216
 
35548 aman 217
    });
31249 tejbeer 218
 
35548 aman 219
    $(document).on('click', ".lead-close", function () {
220
        loadClosedLead("main-content");
221
    });
31249 tejbeer 222
 
35548 aman 223
    $(document).on('click', "#lead-close-paginated .next",
224
        function () {
31249 tejbeer 225
 
35548 aman 226
            var searchText = $("#authUser").val();
227
            // var searchTxt=$("#scheme-search-text").val();
228
            console.log(searchText);
229
            if (typeof (searchText) == "undefined" || !searchText) {
230
                searchText = "";
231
            }
31249 tejbeer 232
 
35548 aman 233
            if ((searchText)) {
234
                var params = {};
235
                params['searchTerm'] = searchText;
236
                loadPaginatedNextItems('/searchLeadPaginated', params,
237
                    'lead-close-paginated', 'close-lead-table',
238
                    'lead-close-container');
239
            } else {
31249 tejbeer 240
 
35548 aman 241
                loadPaginatedNextItems('/getPaginatedClosedLeads', null,
242
                    'lead-close-paginated', 'close-lead-table',
243
                    'lead-close-container');
244
            }
245
            $(this).blur();
246
        });
31249 tejbeer 247
 
35548 aman 248
    $(document).on('click', "#lead-close-paginated .previous",
249
        function () {
250
            var searchText = $("#authUser").val();
251
            // var searchTxt=$("#scheme-search-text").val();
252
            console.log(searchText);
253
            if (typeof (searchText) == "undefined" || !searchText) {
254
                searchText = "";
255
            }
25988 tejbeer 256
 
35548 aman 257
            if ((searchText)) {
258
                var params = {};
259
                params['searchTerm'] = searchText;
260
                loadPaginatedPreviousItems('/searchLeadPaginated', params,
261
                    'lead-close-paginated', 'close-lead-table',
262
                    'lead-close-container');
263
            } else {
264
                loadPaginatedPreviousItems('/getPaginatedClosedLeads',
265
                    null, 'lead-close-paginated', 'close-lead-table',
266
                    'lead-close-container');
267
            }
268
            $(this).blur();
269
        });
25988 tejbeer 270
 
35548 aman 271
    $(document).on('click', "#close-lead-search-button", function () {
272
        var searchText = $("#authUser").val();
273
        if (typeof (searchText) == "undefined" || !searchText) {
274
            searchText = "";
275
        }
276
        loadLeadSearchInfo(searchText);
277
    });
25988 tejbeer 278
 
35548 aman 279
    $(document).on("keyup", "#authUser", function (e) {
280
        var keyCode = e.keyCode || e.which;
281
        if (keyCode == 13) {
282
            $("#close-lead-search-button").click();
283
        }
284
    });
285
    $(document).on('click', ".view",
286
        function () {
287
            var id = $(this).data('requestid');
288
            console.log(id);
289
            doGetAjaxRequestHandler(context + "/getLeadActivity?leadId="
290
                + id, function (response) {
25988 tejbeer 291
 
35548 aman 292
                console.log(response)
25988 tejbeer 293
 
35548 aman 294
                $('#fetchLeadActivityData .modal-content').html(response);
25988 tejbeer 295
 
35548 aman 296
            });
297
        });
25988 tejbeer 298
 
35548 aman 299
    $(document).on('click', ".newLead", function () {
300
        $('#newEntryLeadModal').modal('show');
301
        $("#scheduleTime").hide();
302
    });
25988 tejbeer 303
 
35548 aman 304
    $(document).on('click', ".show-lead", function () {
305
        var status = $("#statusFilter").val();
306
        doGetAjaxRequestHandler(context + "/getOpenLead?leadStatus=" + status, function (response) {
307
            $('#' + 'main-content').html(response);
308
        });
309
    });
25980 tejbeer 310
 
31370 tejbeer 311
 
35548 aman 312
    $(document).on('click', ".show-colowise-lead", function () {
313
        var status = $("#statusFilter").val();
314
        var color = $("#colorFilter").val();
315
        doGetAjaxRequestHandler(context + "/getOpenLead?leadStatus=" + status + "&color=" + color, function (response) {
316
            $('#' + 'main-content').html(response);
317
        });
318
    });
25980 tejbeer 319
 
35548 aman 320
    $(document).on('click', "#uploadIvoryLead", function () {
25980 tejbeer 321
 
35548 aman 322
        window.location.href = context + "/downloadIvoryLead";
323
    });
25980 tejbeer 324
 
35548 aman 325
    $(document).on('click', ".submitLeadGenerate", function () {
27609 tejbeer 326
 
35548 aman 327
        console.log("hello");
328
        if (confirm('Confirm upload ?')) {
329
            var fileSelector = $(this)[0];
330
            if (fileSelector != undefined) {
331
                var url = `${context}/csvFileAndSetLead`;
332
                console.log(url);
333
                var file = $(".fileLeadGenerate")[0].files[0];
334
                let fileInput = $(this);
335
                console.log("file" + file);
336
                console.log("fileInput" + fileInput);
337
                doAjaxUploadRequestHandler(
338
                    url,
339
                    'POST',
340
                    file, function (response) {
27642 tejbeer 341
 
35548 aman 342
                        console.log("reponse" + response);
31370 tejbeer 343
 
35548 aman 344
                        if (response == true) {
345
                            alert("successfully uploaded");
31370 tejbeer 346
 
347
 
35548 aman 348
                        }
349
                    });
29598 tejbeer 350
 
35548 aman 351
            }
352
        } else {
353
            // Do nothing!
354
        }
355
    });
27642 tejbeer 356
 
357
 
35548 aman 358
    $(document).on('click', ".lead-request",
359
        function () {
29598 tejbeer 360
 
35548 aman 361
            var firstName = $('input[name="firstName"]').val();
362
            var lastName = $('input[name="lastName"]').val();
363
            var mobile = $('input[name="mobile"]').val();
364
            var address = $('input[name="address"]').val();
365
            var status = $("#status").val();
366
            var city = $('input[name="city"]').val();
367
            var state = $("#state").val();
368
            var remark = $("#createRemark").val();
369
            var assignTo = $("#createAssignTo").val();
370
            var source = $("#leadSource").val();
371
            var communicationType = $("#communicationTye").val();
29427 manish 372
 
35548 aman 373
            var conversionprobability = $("#conversionprobabilit").val();
29598 tejbeer 374
 
375
 
35548 aman 376
            var outletName = $('input[name="leadoutletName"]').val();
377
            var counterSize = $('input[name="leadcounterSize"]').val();
378
            var table = document.getElementById('brandtable');
379
            var brandValueJson = [];
380
            var leadBrands;
29598 tejbeer 381
 
35548 aman 382
            console.log(conversionprobability)
29598 tejbeer 383
 
384
 
35548 aman 385
            if (firstName === "" && lastName === "" && mobile === ""
386
                && address === "" && status === "" && city === ""
387
                && state === "" && remark === "" && source === "") {
388
                alert("Field can't be empty");
389
                return;
390
            }
29598 tejbeer 391
 
25980 tejbeer 392
 
35548 aman 393
            if (firstName === "") {
394
                alert("First Name is required");
395
                return;
396
            }
397
            if (lastName === "") {
398
                alert("Last Name is required");
399
                return;
400
            }
401
            if (mobile === "") {
402
                alert("Mobile is required");
403
                return;
404
            }
405
            if (status === "") {
406
                alert("Status is required");
407
                return;
408
            }
409
            if (address === "") {
410
                alert("address is required");
411
                return;
412
            }
413
            if (city === "") {
414
                alert("city is required");
415
                return;
416
            }
32471 tejbeer 417
 
35548 aman 418
            if (state === "") {
419
                alert("state is required");
420
                return;
421
            }
422
            if (source === "") {
423
                alert("Source is required")
424
                return;
425
            }
32471 tejbeer 426
 
35548 aman 427
            if (remark === "") {
428
                alert("Remark is required");
429
                return;
430
            }
32471 tejbeer 431
 
35548 aman 432
            if (conversionprobability === "") {
433
                alert("Conversion Probability is required");
434
                return;
435
            }
436
            if (status == "followUp" || status == "pending" || status == "finalized") {
437
                if (outletName === "") {
438
                    alert("Outlet Name is required");
439
                    return;
440
                }
25980 tejbeer 441
 
35548 aman 442
                if (counterSize === "") {
443
                    alert("Counter Size is required");
444
                    return;
445
                }
32464 tejbeer 446
 
35548 aman 447
                if (localStorage.getItem("frontph") == "undefined" && localStorage.getItem("frontph") == null) {
448
                    alert("Front Document is required");
449
                    return;
450
                }
32464 tejbeer 451
 
35548 aman 452
                if (localStorage.getItem("internalMarketh") == "undefined" || localStorage.getItem("internalMarketh") == null) {
453
                    alert("Front With Market Document is required");
454
                    return;
455
                }
25980 tejbeer 456
 
35548 aman 457
                if (localStorage.getItem("leftShoth") == "undefined" || localStorage.getItem("leftShoth") == null) {
458
                    alert("Internal Left Shot Document is required");
459
                    return;
460
                }
32464 tejbeer 461
 
35548 aman 462
                if (localStorage.getItem("leftWallh") == "undefined" || localStorage.getItem("leftWallh") == null) {
463
                    alert("Internal Left Wall Document is required");
464
                    return;
465
                }
25980 tejbeer 466
 
467
 
35548 aman 468
                if (localStorage.getItem("rightWallh") == "undefined" || localStorage.getItem("rightWallh") == null) {
469
                    alert("Internal Right Wall Document is required");
470
                    return;
471
                }
25980 tejbeer 472
 
32464 tejbeer 473
 
35548 aman 474
                for (i = 1; i < table.rows.length; i++) {
32464 tejbeer 475
 
35548 aman 476
                    var objCells = table.rows[i].cells;
32464 tejbeer 477
 
35548 aman 478
                    leadBrands = {
479
                        brand: objCells[0].innerText,
480
                        value: objCells[1].getElementsByTagName('input')[0].value
481
                    }
482
                    brandValueJson.push(leadBrands);
483
                }
32464 tejbeer 484
 
485
 
35548 aman 486
            }
32464 tejbeer 487
 
488
 
35548 aman 489
            var leaddetailData = {}
490
            leaddetailData['firstName'] = firstName;
491
            leaddetailData['lastName'] = lastName
492
            leaddetailData['mobile'] = mobile
493
            leaddetailData['address'] = address
494
            leaddetailData['city'] = city
495
            leaddetailData['state'] = state
496
            leaddetailData['status'] = status
497
            leaddetailData['remark'] = remark
498
            leaddetailData['assignTo'] = assignTo
499
            leaddetailData['source'] = source
500
            leaddetailData['colorCheck'] = conversionprobability
32464 tejbeer 501
 
502
 
35548 aman 503
            if (status == "followUp") {
504
                leaddetailData['schelduleTimestamp'] = getDatesFromPicker('#scheduleTime').startDate;
32464 tejbeer 505
 
35548 aman 506
                leaddetailData['communicationType'] = communicationType
507
            }
32464 tejbeer 508
 
509
 
35548 aman 510
            leaddetailData['outletName'] = outletName;
32464 tejbeer 511
 
35548 aman 512
            leaddetailData['counterSize'] = counterSize;
32464 tejbeer 513
 
514
 
35548 aman 515
            leaddetailData['leadBrands'] = brandValueJson;
32464 tejbeer 516
 
35548 aman 517
            console.log(localStorage.getItem("frontp"));
32464 tejbeer 518
 
519
 
35548 aman 520
            leaddetailData['frontp'] = localStorage
521
                .getItem("frontph");
31249 tejbeer 522
 
32464 tejbeer 523
 
35548 aman 524
            leaddetailData['frontWithMarket'] = localStorage
525
                .getItem("internalMarketh");
32464 tejbeer 526
 
527
 
35548 aman 528
            leaddetailData['internalLongShot'] = localStorage
529
                .getItem("leftShoth");
32464 tejbeer 530
 
531
 
35548 aman 532
            leaddetailData['internalLeftWall'] = localStorage
533
                .getItem("leftWallh");
32464 tejbeer 534
 
535
 
35548 aman 536
            leaddetailData['internalRightWall'] = localStorage
537
                .getItem("rightWallh");
32464 tejbeer 538
 
35548 aman 539
            console.log(leaddetailData);
32464 tejbeer 540
 
35548 aman 541
            if (confirm("Are you sure you want to add lead!") == true) {
542
                doPostAjaxRequestWithJsonHandler(context + "/createLead",
543
                    JSON.stringify(leaddetailData), function (response) {
544
                        if (response == 'true') {
545
                            alert("successfully Add");
546
                            $('#newEntryLeadModal').modal('hide');
547
                            $('.modal-backdrop').remove();
548
                            loadLead("main-content");
549
                        } else {
550
                            alert(response);
551
                        }
552
                    });
32464 tejbeer 553
 
35548 aman 554
                return false;
555
            }
556
        });
36642 ranu 557
    window.leadId = null;
35548 aman 558
    var row = null;
37003 ranu 559
    // Turn Assign To into a search-select. We attempt initialisation at 3 points to be
560
    // robust against ordering / DOM-timing issues:
561
    //   1. Immediately at load time (element is in DOM per lead.vm)
562
    //   2. On the modal's shown.bs.modal event (post-transition)
563
    //   3. As a fallback in the click handler with a small delay
564
    function initAssignToSelect2() {
565
        if (!$.fn.select2) {
566
            console.warn('[lead.js] select2 not loaded — falling back to native <select>');
567
            return;
568
        }
569
        var $assign = $('#assignTo');
570
        if ($assign.length === 0) return;
571
        if ($assign.hasClass('select2-hidden-accessible')) return; // already applied
572
        $assign.select2({
573
            placeholder: 'Assign To',
574
            allowClear: true,
575
            width: '100%',
576
            dropdownParent: $('#editLeadData'),
577
            // Hide disabled options — VISIT/TELEPHONIC filter uses .prop('disabled', true).
578
            matcher: function (params, data) {
579
                if (data.element && $(data.element).prop('disabled')) return null;
580
                if (!params.term || $.trim(params.term) === '') return data;
581
                if (data.text && data.text.toLowerCase().indexOf(params.term.toLowerCase()) > -1) return data;
582
                return null;
583
            }
584
        });
585
        console.log('[lead.js] select2 applied to #assignTo');
586
    }
587
 
588
    initAssignToSelect2();
589
    $(document).on('shown.bs.modal', '#editLeadData', initAssignToSelect2);
590
 
35548 aman 591
    $(document).on('click', ".editLead", function () {
592
        $('#editLeadData').modal('show');
37003 ranu 593
        // Belt-and-braces: also try after the modal transition completes.
594
        setTimeout(initAssignToSelect2, 300);
32464 tejbeer 595
 
35548 aman 596
        $("#remark").val("");
37003 ranu 597
        $("#assignTo").val("").trigger('change');
35548 aman 598
        $("#editStatus").val("");
599
        $("#reason").val("");
600
        $("#editCity").val("");
601
        $("#editState").val("");
35769 amit 602
        $("#editSource").val("");
35548 aman 603
        $("#editScheduleTime").hide();
32464 tejbeer 604
 
605
 
35548 aman 606
        localStorage.removeItem("frontph");
607
        localStorage.removeItem("leftShoth");
608
        localStorage.removeItem("rightWallh");
609
        localStorage.removeItem("leftWallh");
610
        localStorage.removeItem("internalMarketh");
32464 tejbeer 611
 
35548 aman 612
        row = $(this).closest("tr");
613
        leadId = $(this).data('leadid');
32464 tejbeer 614
 
35548 aman 615
        doAjaxRequestHandler(
616
            context + "/getLeadDetailByLeadId?leadId=" + leadId,
617
            "GET",
618
            function (response) {
32464 tejbeer 619
 
35548 aman 620
                var data = response.response;
621
                if (!data) return;
622
                console.log(data);
623
                $("#editCity").val(data.city);
624
                $("#editState").val(data.state);
625
                $("input[name='outletName']").val(data.outletName);
626
                $("input[name='counterSize']").val(data.counterSize);
627
            }
628
        );
629
    });
32464 tejbeer 630
 
631
 
35548 aman 632
    $(document).on('click', ".lead-edit-request",
633
        function () {
32464 tejbeer 634
 
36761 ranu 635
            // Gate the assign/status submit on approved geo. Modal stays open so the
636
            // user can still work the other sub-forms (lead detail, etc.).
637
            var clickedBtn = $(this);
36789 ranu 638
            // notInterested is a close-out — no geo / no beat / no assignee
639
            // needed. Skip the geo gate and submit straight through with just
640
            // the activity (status + reason + remark).
641
            var currentStatus = $('#editStatus').val();
642
            if (currentStatus === 'notInterested') {
643
                submitLeadEdit();
644
                return;
645
            }
36792 ranu 646
            // Non-sales assignees (BGC / other internal hand-offs) don't need
647
            // geo or a beat-day — the lead just routes to their queue. Skip the
648
            // geo gate and submit straight through, same as the legacy flow.
649
            var assigneeId = parseInt($('#assignTo').val(), 10);
650
            var isSalesAssignee = !isNaN(assigneeId)
651
                && typeof salesUserIds !== 'undefined'
652
                && salesUserIds.indexOf(assigneeId) !== -1;
653
            if (!isSalesAssignee) {
654
                submitLeadEdit();
655
                return;
656
            }
36761 ranu 657
            if (clickedBtn.data('geoChecking')) return;
658
            clickedBtn.data('geoChecking', true);
659
            doAjaxRequestHandler(
660
                context + "/lead-geo/check/" + leadId,
661
                "GET",
662
                function (response) {
663
                    clickedBtn.removeData('geoChecking');
664
                    var hasGeo = response && response.response && response.response.hasApprovedGeo;
665
                    if (!hasGeo) {
666
                        alert('Live geo-location for this lead has not been approved yet. Please approve the geo-location before assigning / updating status.');
667
                        return;
668
                    }
669
                    submitLeadEdit();
670
                }
671
            );
672
        });
25980 tejbeer 673
 
36761 ranu 674
    function submitLeadEdit() {
675
 
35548 aman 676
            console.log(row);
677
            var remark = $('input[name="remark"]').val();
678
            var assignTo = $("#assignTo").val();
679
            var editStatus = $("#editStatus").val();
680
            var city = $('input[name="editCity"]').val();
681
            var state = $("#editState").val();
682
            var reason = $("#reason").val();
25980 tejbeer 683
 
35769 amit 684
            var startDate = $("#startDate").val();
685
            var endDate = $("#endDate").val();
35548 aman 686
            var leadStatus = $("#statusFilter").val();
687
            var color = $("#colorFilter").val();
688
            var communicationType = $("#communicationType").val();
29640 tejbeer 689
 
35548 aman 690
            var conversionprobability = $("#conversionprobability").val();
35769 amit 691
            var editSource = $("#editSource").val();
29640 tejbeer 692
 
35548 aman 693
            console.log(conversionprobability)
29640 tejbeer 694
 
31473 tejbeer 695
 
35769 amit 696
            console.log(startDate)
35548 aman 697
            console.log(leadStatus)
31370 tejbeer 698
 
35548 aman 699
            console.log(color)
700
            console.log(reason)
31370 tejbeer 701
 
35548 aman 702
            if (remark === "" && assignTo === "" && editStatus === "") {
703
                alert("All fields is required");
704
                return;
705
            }
31370 tejbeer 706
 
36789 ranu 707
        // For notInterested (close-out) the lead doesn't need an assignee
708
        // — it's just a status + reason + remark write. Only enforce
709
        // assignTo for the other statuses where scheduling matters.
710
        if (assignTo === "" && editStatus !== "notInterested") {
35548 aman 711
                alert("assignTo is required");
712
                return;
713
            }
31409 tejbeer 714
 
35548 aman 715
            if (remark === "") {
716
                alert("Remark is required");
717
                return;
718
            }
31370 tejbeer 719
 
720
 
35548 aman 721
            if (editStatus === "") {
722
                alert("status is required");
723
                return;
724
            }
31370 tejbeer 725
 
35548 aman 726
            if (editStatus === "notInterested") {
36789 ranu 727
                if (reason == null || reason === "") {
35548 aman 728
                    alert("Reason  is required");
729
                    return;
730
                }
731
            }
732
            var leadActivityData = {}
733
            leadActivityData['id'] = leadId;
734
            leadActivityData['remark'] = remark;
735
            leadActivityData['assignTo'] = assignTo
736
            leadActivityData['status'] = editStatus
737
            leadActivityData['reason'] = reason
36741 ranu 738
            leadActivityData['colorCheck'] = (conversionprobability === "true" || conversionprobability === true)
35548 aman 739
            if (city && city.trim() !== "") {
740
                leadActivityData.city = city;
741
            }
25980 tejbeer 742
 
35548 aman 743
            if (state && state.trim() !== "") {
744
                leadActivityData.state = state;
745
            }
29473 manish 746
 
35769 amit 747
            if (editSource && editSource.trim() !== "") {
748
                leadActivityData.source = editSource;
749
            }
29598 tejbeer 750
 
35769 amit 751
 
35548 aman 752
            if (editStatus == "followUp") {
36642 ranu 753
                leadActivityData['communicationType'] = communicationType
36792 ranu 754
                var assigneeIdForBeat = parseInt(assignTo, 10);
755
                var isSalesAssigneeForBeat = !isNaN(assigneeIdForBeat)
756
                    && typeof salesUserIds !== 'undefined'
757
                    && salesUserIds.indexOf(assigneeIdForBeat) !== -1;
36741 ranu 758
                var beatVal = $('#beatDate').val();
36792 ranu 759
                // Beat-day gate only applies to sales assignees. Non-sales
760
                // (BGC / other) hand-offs are just routed to the user's queue
761
                // without a beat attachment — same as the legacy flow.
762
                if (isSalesAssigneeForBeat) {
763
                    if (!beatVal) {
764
                        var hasBadges = $('#beatBadges .beat-badge').length > 0;
765
                        if (!hasBadges) {
766
                            alert('No upcoming beat is available for this assignee. Cannot schedule the lead until they have a beat.');
767
                        } else {
768
                            alert('Please select a beat date for the assignee before submitting.');
769
                        }
770
                        return;
36761 ranu 771
                    }
36792 ranu 772
                    var beatDate = beatVal.split('|')[0];
773
                    leadActivityData['scheldule'] = beatDate + 'T12:00:00';
774
                    leadActivityData['beatSelection'] = beatVal;
37064 ranu 775
                } else {
776
                    // Non-sales assignee: no beat-day panel. Fall back to the manual
777
                    // #editScheduleTime picker so the user's chosen date/time is still
778
                    // persisted on lead_activity.schedule_timestamp.
779
                    try {
780
                        var picker = $('#editScheduleTime').data('daterangepicker');
781
                        if (picker && picker.startDate) {
782
                            leadActivityData['scheldule'] = picker.startDate.format(moment.HTML5_FMT.DATETIME_LOCAL_SECONDS);
783
                        }
784
                    } catch (e) {
785
                        // no picker attached / no date — leave scheldule unset
786
                    }
36642 ranu 787
                }
35548 aman 788
            }
29598 tejbeer 789
 
35548 aman 790
            console.log(leadActivityData);
791
            if (confirm("Are you sure you want to add lead!") == true) {
792
                doPostAjaxRequestWithJsonHandler(context + "/editLead", JSON.stringify(leadActivityData), function (response) {
793
                    console.log(response);
794
                    $('#editLeadData').modal('hide');
795
                    $('.modal-backdrop').remove();
37050 ranu 796
                    // Inline row replace only works when the row's column layout matches the
797
                    // main #lead-table (that's what edit-lead.vm renders for). The upper
798
                    // search-results table has fewer columns, so let the search re-run
799
                    // repaint it cleanly instead.
800
                    if (row && !row.closest('#global-search-results').length) {
801
                        row.html(response);
802
                    }
803
                    var activeTerm = $.trim($('#lead-table_filter input').val() || $('#lead-table-bottom-filter').val() || "");
804
                    if (activeTerm.length >= 2 && $('#global-search-results').children().length) {
805
                        runGlobalLeadSearch(activeTerm);
806
                    }
35548 aman 807
                });
808
            }
29598 tejbeer 809
 
36761 ranu 810
    }
32477 tejbeer 811
 
812
 
35548 aman 813
    $(document).on('click', ".show-partner-health",
814
        function () {
29598 tejbeer 815
 
35548 aman 816
            var email = $("#authUserFilter").val();
25980 tejbeer 817
 
35548 aman 818
            console.log(email)
819
            doGetAjaxRequestHandler(context + "/partnerHealth?email="
820
                + email, function (response) {
821
                console.log(response)
822
                $('#' + 'main-content').html(response);
25980 tejbeer 823
 
35548 aman 824
            });
825
        });
25980 tejbeer 826
 
827
 
35548 aman 828
    $(document).on('click', ".lead-detail-entry",
829
        function () {
28200 tejbeer 830
 
35548 aman 831
            console.log("hello");
832
            var outletName = $('input[name="outletName"]').val();
833
            var counterSize = $('input[name="counterSize"]').val();
834
            var table = document.getElementById('editbrandtable');
835
            var brandValueJson = [];
836
            var leadBrands;
25980 tejbeer 837
 
35548 aman 838
            if (outletName === "") {
839
                alert("Outlet Name is required");
840
                return;
841
            }
29598 tejbeer 842
 
35548 aman 843
            if (counterSize === "") {
844
                alert("Counter Size is required");
845
                return;
846
            }
32471 tejbeer 847
 
35548 aman 848
            if (localStorage.getItem("frontph") == "undefined" && localStorage.getItem("frontph") == null) {
849
                alert("Front Document is required");
850
                return;
851
            }
31249 tejbeer 852
 
35548 aman 853
            if (localStorage.getItem("internalMarketh") == "undefined" || localStorage.getItem("internalMarketh") == null) {
854
                alert("Front With Market Document is required");
855
                return;
856
            }
25980 tejbeer 857
 
35548 aman 858
            if (localStorage.getItem("leftShoth") == "undefined" || localStorage.getItem("leftShoth") == null) {
859
                alert("Internal Left Shot Document is required");
860
                return;
861
            }
27605 tejbeer 862
 
35548 aman 863
            if (localStorage.getItem("leftWallh") == "undefined" || localStorage.getItem("leftWallh") == null) {
864
                alert("Internal Left Wall Document is required");
865
                return;
866
            }
27605 tejbeer 867
 
30185 tejbeer 868
 
35548 aman 869
            if (localStorage.getItem("rightWallh") == "undefined" || localStorage.getItem("rightWallh") == null) {
870
                alert("Internal Right Wall Document is required");
871
                return;
872
            }
30185 tejbeer 873
 
874
 
35548 aman 875
            for (i = 1; i < table.rows.length; i++) {
30185 tejbeer 876
 
35548 aman 877
                var objCells = table.rows[i].cells;
30185 tejbeer 878
 
35548 aman 879
                leadBrands = {
880
                    brand: objCells[0].innerText,
881
                    value: objCells[1].getElementsByTagName('input')[0].value
882
                }
883
                brandValueJson.push(leadBrands);
884
            }
30185 tejbeer 885
 
30416 tejbeer 886
 
35548 aman 887
            var leadDetailObject = {};
31402 tejbeer 888
 
35548 aman 889
            leadDetailObject['leadId'] = leadId;
30416 tejbeer 890
 
891
 
35548 aman 892
            leadDetailObject['outletName'] = outletName;
31370 tejbeer 893
 
35548 aman 894
            leadDetailObject['counterSize'] = counterSize;
31370 tejbeer 895
 
35548 aman 896
            leadDetailObject['leadBrands'] = brandValueJson;
31370 tejbeer 897
 
31402 tejbeer 898
 
35548 aman 899
            console.log(localStorage.getItem("frontp"));
31402 tejbeer 900
 
901
 
35548 aman 902
            leadDetailObject['frontp'] = localStorage
903
                .getItem("frontph");
31402 tejbeer 904
 
905
 
35548 aman 906
            leadDetailObject['frontWithMarket'] = localStorage
907
                .getItem("internalMarketh");
31370 tejbeer 908
 
909
 
35548 aman 910
            leadDetailObject['internalLongShot'] = localStorage
911
                .getItem("leftShoth");
31370 tejbeer 912
 
913
 
35548 aman 914
            leadDetailObject['internalLeftWall'] = localStorage
915
                .getItem("leftWallh");
31370 tejbeer 916
 
917
 
35548 aman 918
            leadDetailObject['internalRightWall'] = localStorage
919
                .getItem("rightWallh");
31370 tejbeer 920
 
35548 aman 921
            console.log(leadDetailObject);
31370 tejbeer 922
 
35548 aman 923
            if (confirm("Are you sure you want to add lead detail!") == true) {
924
                doPostAjaxRequestWithJsonHandler(context + "/leadDetail", JSON.stringify(leadDetailObject), function (response) {
925
                    console.log(response);
926
                    if (response == 'true') {
927
                        alert("Submit Successfully");
928
                    }
31370 tejbeer 929
 
35548 aman 930
                });
931
            }
31370 tejbeer 932
 
35548 aman 933
        });
31370 tejbeer 934
 
935
 
35548 aman 936
    $(document).on('change', '.frontp',
937
        function () {
31370 tejbeer 938
 
35548 aman 939
            if (confirm('Document has been selected, Do you want to upload ?')) {
31370 tejbeer 940
 
35548 aman 941
                var documentId = uploadImage(this, "frontph");
31370 tejbeer 942
 
943
 
35548 aman 944
            } else {
31370 tejbeer 945
 
35548 aman 946
            }
947
        });
31456 tejbeer 948
 
35548 aman 949
    $(document).on('change', '.internalMarket',
950
        function () {
31456 tejbeer 951
 
35548 aman 952
            if (confirm('Document has been selected, Do you want to upload ?')) {
31456 tejbeer 953
 
35548 aman 954
                var documentId = uploadImage(this, "internalMarketh");
31456 tejbeer 955
 
35548 aman 956
            } else {
31456 tejbeer 957
 
35548 aman 958
            }
959
        });
31370 tejbeer 960
 
35548 aman 961
    $(document).on('change', '.leftShot',
31370 tejbeer 962
 
35548 aman 963
        function () {
964
            if (confirm('Document has been selected, Do you want to upload ?')) {
965
                var documentId = uploadImage(this, "leftShoth");
966
            } else {
31370 tejbeer 967
 
35548 aman 968
            }
969
        });
31370 tejbeer 970
 
35548 aman 971
    $(document).on('change', '.leftWall',
972
        function () {
973
            if (confirm('Document has been selected, Do you want to upload ?')) {
974
                var documentId = uploadImage(this, "leftWallh");
975
            } else {
31370 tejbeer 976
 
35548 aman 977
            }
978
        });
31370 tejbeer 979
 
35548 aman 980
    $(document).on('change', '.rightWall',
981
        function () {
982
            if (confirm('Document has been selected, Do you want to upload ?')) {
983
                var documentId = uploadImage(this, "rightWallh");
984
            } else {
985
            }
986
        });
31370 tejbeer 987
 
988
 
25980 tejbeer 989
});
990
 
31404 tejbeer 991
function uploadImage(fileSelector, attrName) {
35548 aman 992
    var documentId;
993
    if (fileSelector != undefined
994
        && fileSelector.files[0] != undefined) {
995
        var url = context
996
            + '/document-upload';
31370 tejbeer 997
 
35548 aman 998
        console.log(url);
999
        var file = fileSelector.files[0];
31370 tejbeer 1000
 
35548 aman 1001
        console.log(file)
1002
        doAjaxUploadRequestHandler(
1003
            url,
1004
            'POST',
1005
            file,
1006
            function (response) {
1007
                console.log(response)
1008
                documentId = response.response.document_id;
1009
                console
1010
                    .log("documentId : "
1011
                        + documentId);
31370 tejbeer 1012
 
1013
 
35548 aman 1014
                localStorage
1015
                    .setItem(
1016
                        attrName,
1017
                        documentId);
31402 tejbeer 1018
 
35548 aman 1019
            });
1020
        return documentId;
1021
    }
31370 tejbeer 1022
 
1023
}
1024
 
1025
 
25980 tejbeer 1026
function loadLead(domId) {
35548 aman 1027
    doGetAjaxRequestHandler(context + "/getOpenLead", function (response) {
1028
        $('#' + domId).html(response);
1029
    });
25980 tejbeer 1030
}
1031
 
25988 tejbeer 1032
function loadClosedLead(domId, searchTerm) {
35548 aman 1033
    doGetAjaxRequestHandler(context + "/getClosedLead", function (response) {
1034
        $('#' + domId).html(response);
1035
    })
25988 tejbeer 1036
}
1037
 
25980 tejbeer 1038
function statusAction() {
35548 aman 1039
    var val = $('#status').val();
1040
    if (val == "followUp") {
1041
        $("#scheduleTime").show();
1042
    } else {
1043
        $("#scheduleTime").hide();
1044
    }
25980 tejbeer 1045
 
1046
}
27605 tejbeer 1047
 
1048
 
1049
function editStatusAction() {
35548 aman 1050
    var val = $('#editStatus').val();
1051
    if (val == "followUp") {
36642 ranu 1052
        // Show communication type and schedule date
1053
        $("#communicationTypeSection").show();
35548 aman 1054
        $("#editScheduleTime").show();
36642 ranu 1055
        $("#beatDateSelection").hide();
1056
 
36761 ranu 1057
        // Reset communication type only; preserve the assignee the user picked.
36642 ranu 1058
        $('#communicationType').val('');
37003 ranu 1059
        $('#assignTo option').prop('disabled', false);
36642 ranu 1060
 
1061
        // Check if lead has approved geolocation to decide VISIT option
1062
        doAjaxRequestHandler(context + "/lead-geo/check/" + leadId, "GET", function (response) {
1063
            var hasGeo = response.response.hasApprovedGeo;
1064
            var commDropdown = $('#communicationType');
1065
            commDropdown.empty();
1066
            commDropdown.append('<option value="" disabled selected>Communication Type</option>');
1067
            commDropdown.append('<option value="TELEPHONIC">TELEPHONIC</option>');
1068
            if (hasGeo) {
1069
                commDropdown.append('<option value="VISIT">VISIT</option>');
1070
            }
1071
        });
35548 aman 1072
    } else {
36642 ranu 1073
        $("#communicationTypeSection").hide();
35548 aman 1074
        $("#editScheduleTime").hide();
36642 ranu 1075
        $("#beatDateSelection").hide();
37003 ranu 1076
        $('#assignTo option').prop('disabled', false);
35548 aman 1077
    }
27605 tejbeer 1078
 
1079
}
1080
 
25988 tejbeer 1081
function loadLeadSearchInfo(search_text) {
35548 aman 1082
    loadSearchLead("main-content", search_text);
25988 tejbeer 1083
}
1084
 
30185 tejbeer 1085
function loadTeamCommitment(domId) {
35548 aman 1086
    doGetAjaxRequestHandler(context + "/teamCommitment",
1087
        function (response) {
1088
            $('#' + domId).html(response);
1089
        });
30185 tejbeer 1090
}
1091
 
31370 tejbeer 1092
function loadLeadDetail(domId) {
35548 aman 1093
    doGetAjaxRequestHandler(context + "/getLeadDetail",
1094
        function (response) {
1095
            $('#' + domId).html(response);
1096
        });
31370 tejbeer 1097
}
1098
 
30416 tejbeer 1099
function loadPartnerHealth(domId) {
35548 aman 1100
    doGetAjaxRequestHandler(context + "/partnerHealth",
1101
        function (response) {
1102
            $('#' + domId).html(response);
1103
        });
30416 tejbeer 1104
}
1105
 
25988 tejbeer 1106
function loadSearchLead(domId, search_text) {
35548 aman 1107
    doGetAjaxRequestHandler(context + "/searchLeads?searchTerm=" + search_text,
1108
        function (response) {
1109
            $('#' + domId).html(response);
1110
        });
25988 tejbeer 1111
}
33917 ranu 1112
 
1113
$(document).on('click', ".arr-button-mk",
35548 aman 1114
    function () {
1115
        var startDate = $('.arr-start_date').val();
1116
        doGetAjaxRequestHandler(context + "/rbmTodayArr?startDate=" + startDate, function (response) {
1117
            $('#main-content').html(response);
33917 ranu 1118
 
35548 aman 1119
        });
1120
    });
33917 ranu 1121
 
1122
$(document).on('click', ".rbm-today-arr",
35548 aman 1123
    function () {
1124
        doGetAjaxRequestHandler(context + "/rbmTodayArr", function (response) {
1125
            $('#main-content').html(response);
33917 ranu 1126
 
35548 aman 1127
        });
1128
    });
1129
$(document).on('click', '.reassign', function () {
1130
    $('#bulkReassignFile').val(null);
1131
    $('#bulkReassignFile').click();
1132
});
1133
 
1134
$(document).on('change', '#bulkReassignFile', function () {
1135
 
1136
    if (!confirm("Confirm bulk reassign upload?")) {
1137
        return;
1138
    }
1139
 
1140
    var file = this.files[0];
1141
    if (!file) {
1142
        alert("No file selected");
1143
        return;
1144
    }
1145
 
1146
    doAjaxUploadRequestHandler(
1147
        context + "/upload-assign-id",
1148
        'POST',
1149
        file,
1150
        function (response) {
1151
            alert("Bulk reassignment completed");
1152
            loadLead("main-content");
1153
        }
1154
    );
1155
});
1156
 
36642 ranu 1157
// ==================== GEO LOCATION HANDLERS ====================
1158
 
1159
// Communication type change: filter assignTo based on type
1160
$(document).on('change', '#communicationType', function () {
1161
    var val = $(this).val();
1162
    var assignDropdown = $('#assignTo');
1163
 
36741 ranu 1164
    // Reset beat + restore manual date input
36642 ranu 1165
    $('#beatDate').val('');
1166
    $('#beatBadges').empty();
1167
    $("#beatDateSelection").hide();
36741 ranu 1168
    $("#editScheduleTime").show();
36642 ranu 1169
 
1170
    if (val == 'VISIT') {
37003 ranu 1171
        // Filter assignTo to sales users only (no BGC). Uses .prop('disabled', ...)
1172
        // instead of .hide()/.show() because select2 doesn't respect hidden <option>s
1173
        // in its dropdown UI. Disabled options are filtered out by our matcher above.
36642 ranu 1174
        if (typeof salesUserIds !== 'undefined') {
1175
            assignDropdown.find('option').each(function () {
1176
                var optVal = parseInt($(this).val());
1177
                if (optVal && salesUserIds.indexOf(optVal) === -1) {
37003 ranu 1178
                    $(this).prop('disabled', true);
36642 ranu 1179
                } else {
37003 ranu 1180
                    $(this).prop('disabled', false);
36642 ranu 1181
                }
1182
            });
1183
        }
1184
    } else {
37003 ranu 1185
        // TELEPHONIC — enable all users
1186
        assignDropdown.find('option').prop('disabled', false);
36642 ranu 1187
    }
37003 ranu 1188
    // Nudge select2 to re-render its dropdown with the new enabled/disabled state.
1189
    if ($.fn.select2 && assignDropdown.hasClass('select2-hidden-accessible')) {
1190
        assignDropdown.trigger('change.select2');
1191
    }
36741 ranu 1192
    // Both VISIT and TELEPHONIC offer beat-day slots when an assignee is set
1193
    // (TELEPHONIC just uses the beat date as the call slot; backend won't
1194
    // attach a LeadRoute for it). Non-sales assignees simply get an empty list.
1195
    if (val && assignDropdown.val()) {
1196
        fetchBeatDates();
1197
    }
36642 ranu 1198
});
1199
 
36741 ranu 1200
// Fetch beats when assignTo changes (works for both VISIT and TELEPHONIC)
1201
$(document).on('change', '#assignTo', function () {
36642 ranu 1202
    var commType = $('#communicationType').val();
1203
    var salesAuthId = $('#assignTo').val();
36741 ranu 1204
    if (commType && salesAuthId && leadId) {
36642 ranu 1205
        fetchBeatDates();
36741 ranu 1206
    } else if (!commType) {
36642 ranu 1207
        $("#beatDateSelection").hide();
1208
    }
1209
});
1210
 
1211
function fetchBeatDates() {
1212
    var salesAuthId = $('#assignTo').val();
1213
    if (!salesAuthId || !leadId) return;
1214
 
36792 ranu 1215
    // Beat slots only make sense for sales assignees. BGC / other internal
1216
    // hand-offs skip the entire beat panel (and the visit-request CTA that
1217
    // sits inside it). Mirrors the server-side carve-out in /editLead.
1218
    var assigneeIntId = parseInt(salesAuthId, 10);
1219
    var isSalesAssigneeFetch = !isNaN(assigneeIntId)
1220
        && typeof salesUserIds !== 'undefined'
1221
        && salesUserIds.indexOf(assigneeIntId) !== -1;
1222
    if (!isSalesAssigneeFetch) {
1223
        $('#beatBadges').empty();
1224
        $('#beatDate').val('');
1225
        $('#beatDateSelection').hide();
1226
        return;
1227
    }
1228
 
36642 ranu 1229
    var badgesDiv = $('#beatBadges');
1230
    badgesDiv.html('<span style="color:#999; font-size:12px;">Loading beats...</span>');
1231
    $("#beatDateSelection").show();
1232
    $('#beatDate').val('');
1233
 
1234
    var url = context + "/lead-geo/beat-dates?leadId=" + leadId + "&salesAuthId=" + salesAuthId;
1235
 
1236
    $.ajax({
1237
        url: url,
1238
        method: 'GET',
1239
        success: function (response) {
1240
            var data = response.response || response;
1241
            badgesDiv.empty();
36644 ranu 1242
 
36741 ranu 1243
            // Stores within radius of the lead — show count + top 3 inline.
1244
            var radius = (data && data.radiusKm) ? data.radiusKm : 30;
1245
            var stores = (data && data.nearestStores) || [];
1246
            if (stores.length > 0) {
1247
                var preview = stores.slice(0, 3).map(function (s) {
1248
                    return '<strong>' + s.code + ' - ' + s.name + '</strong> (' + s.distanceKm + ' km)';
1249
                }).join(', ');
1250
                var more = stores.length > 3 ? ' +' + (stores.length - 3) + ' more' : '';
36644 ranu 1251
                badgesDiv.append('<div style="font-size:12px; color:#333; margin-bottom:6px;">' +
36741 ranu 1252
                    stores.length + ' partner store(s) within ' + radius + ' km of this lead: ' +
1253
                    preview + more + '</div>');
36644 ranu 1254
            }
1255
 
36741 ranu 1256
            // All upcoming beat-dates for the assignee that touch any nearby store.
36642 ranu 1257
            if (data && data.beats && data.beats.length > 0) {
36644 ranu 1258
                badgesDiv.append('<div style="font-weight:bold; font-size:11px; color:#666; margin-bottom:4px;">Available Slots (near this lead):</div>');
36741 ranu 1259
                var beats = data.beats;
36642 ranu 1260
                for (var i = 0; i < beats.length; i++) {
1261
                    var beat = beats[i];
36644 ranu 1262
                    var nearTxt = beat.nearStore ? ' &middot; near ' + beat.nearStore : '';
36642 ranu 1263
                    var badge = $('<span class="beat-badge" style="' +
1264
                        'display:inline-block; background:#337ab7; color:#fff; padding:6px 12px; ' +
1265
                        'margin:4px 6px 4px 0; border-radius:16px; cursor:pointer; font-size:12px; ' +
1266
                        'border:2px solid #337ab7; transition:all 0.2s;">' +
36644 ranu 1267
                        beat.planDate + ' &middot; ' + beat.beatName + ' (' + beat.stops + ' stops)' + nearTxt +
36642 ranu 1268
                        '</span>');
1269
                    badge.data('value', beat.planDate + '|' + beat.beatName + '|' + beat.planGroupId);
1270
                    badgesDiv.append(badge);
1271
                }
1272
            } else {
36787 ranu 1273
                // No beat-days available for this assignee. Surface a CTA so the
1274
                // user can fire a visit request to the assignee's hierarchy instead
1275
                // of being stuck. The pre-existing 'beats > 0' branch above is
1276
                // untouched — this only fires for the empty-beats case.
1277
                var nearestId = (stores.length > 0 && stores[0].storeId) ? stores[0].storeId : '';
1278
                badgesDiv.append(
1279
                    '<div style="background:#fff8e1; border:1px solid #f0e0a0; border-radius:6px; padding:8px 10px; margin-top:4px;">'
1280
                    + '<div style="font-size:12px; color:#7c5a00; margin-bottom:6px;">'
1281
                    + 'No upcoming beat is available for this assignee.'
1282
                    + '</div>'
1283
                    + '<div style="display:flex; gap:8px; align-items:center;">'
1284
                    + '<label style="font-size:11px; color:#666; margin:0;">Preferred date (optional):</label>'
1285
                    + '<input type="date" id="vrPreferredDate" class="input-sm" style="font-size:12px; padding:3px 6px;">'
1286
                    + '<button type="button" id="vrSendBtn" class="btn btn-warning btn-sm" '
1287
                    + 'data-nearest="' + nearestId + '" style="font-size:12px;">Send Visit Request</button>'
1288
                    + '</div>'
1289
                    + '<div style="font-size:11px; color:#888; margin-top:6px;">'
1290
                    + 'The request goes to the assignee\'s reporting head (and up). Once they approve and pick a beat-day, the lead lands on that beat.'
1291
                    + '</div>'
1292
                    + '</div>');
36642 ranu 1293
            }
1294
        },
1295
        error: function () {
1296
            badgesDiv.html('<span style="color:#d9534f; font-size:12px;">Error loading beats</span>');
1297
        }
1298
    });
1299
}
1300
 
36787 ranu 1301
// Send Visit Request when no beats are available for the chosen assignee.
1302
// Posts to /visitRequest/create. Existing beat-pick + Submit flow is unchanged.
1303
$(document).on('click', '#vrSendBtn', function () {
1304
    var $btn = $(this);
1305
    var assigneeAuthId = parseInt($('#assignTo').val());
1306
    var commType = $('#communicationType').val() || null;
1307
    var nearestStoreId = parseInt($btn.data('nearest'));
1308
    var preferred = $('#vrPreferredDate').val() || null;
37050 ranu 1309
    var selectedStatus = $('#editStatus').val() || null;
36787 ranu 1310
    if (!leadId || !assigneeAuthId) {
1311
        alert('Pick an assignee first.');
1312
        return;
1313
    }
1314
    $btn.prop('disabled', true).text('Sending...');
1315
    var payload = {
1316
        leadId: leadId,
1317
        assigneeAuthId: assigneeAuthId,
1318
        communicationType: commType,
1319
        reason: 'No upcoming beats for assignee'
1320
    };
1321
    if (!isNaN(nearestStoreId) && nearestStoreId > 0) payload.nearestStoreId = nearestStoreId;
1322
    if (preferred) payload.requestedDate = preferred;
37050 ranu 1323
    // Ship the picked status too — server (VisitRequestController.create) reads
1324
    // it via parseLeadStatus and updates lead.status through reassignLeadAndLog.
1325
    // Without it, the visit request is raised but the lead status never moves
1326
    // off its previous value (e.g. stays notInterested while user picked followUp).
1327
    if (selectedStatus) payload.status = selectedStatus;
36787 ranu 1328
 
1329
    doPostAjaxRequestWithJsonHandler(context + '/visitRequest/create', JSON.stringify(payload),
1330
        function (response) {
1331
            $btn.prop('disabled', false).text('Send Visit Request');
1332
            var data = (response && response.response) || response || {};
1333
            if (data && data.id) {
1334
                alert('Visit request sent. The assignee\'s manager has been notified.');
1335
                $('#editLeadData').modal('hide');
1336
                $('.modal-backdrop').remove();
37050 ranu 1337
                // Repaint the affected rows so the new status is visible without
1338
                // a manual refresh. If a global search is active, re-run it (this
1339
                // also refreshes the injected rows in #lead-table).
1340
                var activeTerm = $.trim($('#lead-table_filter input').val() || $('#lead-table-bottom-filter').val() || "");
1341
                if (activeTerm.length >= 2 && $('#global-search-results').children().length && typeof window.runGlobalLeadSearch === 'function') {
1342
                    window.runGlobalLeadSearch(activeTerm);
1343
                }
36787 ranu 1344
            } else {
1345
                var msg = (data && data.message) || (data && data.error) || 'Could not send request.';
1346
                alert(msg);
1347
            }
1348
        });
1349
});
1350
 
36741 ranu 1351
// Click on beat badge to select it. A picked beat becomes the schedule
1352
// source — the manual date input is hidden (not needed when scheduling by beat).
36642 ranu 1353
$(document).on('click', '.beat-badge', function () {
1354
    $('.beat-badge').css({'background': '#337ab7', 'border-color': '#337ab7'});
1355
    $(this).css({'background': '#1a5276', 'border-color': '#f39c12', 'border-width': '2px'});
1356
    $('#beatDate').val($(this).data('value'));
36741 ranu 1357
    $("#editScheduleTime").hide();
36642 ranu 1358
});
1359
 
1360
// Generate Geo Link for lead
1361
$(document).on('click', '.generateGeoLink', function (e) {
1362
    e.stopPropagation();
1363
    var lid = $(this).data('leadid');
1364
    doAjaxRequestHandler(context + "/lead-geo/generate-link?leadId=" + lid, "GET", function (response) {
1365
        var url = response.response;
1366
        if (navigator.clipboard) {
1367
            navigator.clipboard.writeText(url).then(function () {
1368
                alert("Link copied to clipboard:\n" + url);
1369
            });
1370
        } else {
1371
            prompt("Share this link with the prospect:", url);
1372
        }
1373
    });
1374
});
1375
 
36868 ranu 1376
// Manual geo verification — for cases where the prospect refused to tap the
1377
// verification link. Team-member confirms lat/lng over phone (or pastes a
1378
// Maps URL the prospect shared) and writes it APPROVED directly.
1379
function ensureManualVerifyModal() {
1380
    if ($('#manualVerifyGeoModal').length) return;
1381
    var html =
1382
        '<div id="manualVerifyGeoModal" class="modal" role="dialog" tabindex="-1">' +
1383
        '  <div class="modal-dialog modal-lg">' +
1384
        '    <div class="modal-content">' +
1385
        '      <div class="modal-header">' +
1386
        '        <button type="button" class="close" data-dismiss="modal">&times;</button>' +
1387
        '        <h4 class="modal-title">Verify Lead Location Manually</h4>' +
1388
        '      </div>' +
1389
        '      <div class="modal-body" style="max-height:75vh;overflow-y:auto;">' +
1390
        '        <input type="hidden" id="manualVerifyLeadId">' +
1391
        '        <div class="form-group">' +
1392
        '          <label>Address <small class="text-muted">(include city, state, pincode for best result)</small></label>' +
1393
        '          <div class="input-group">' +
1394
        '            <input type="text" class="form-control" id="manualVerifyAddress" placeholder="e.g. Shop 12, Sector 18, Noida, UP, 201301">' +
1395
        '            <span class="input-group-btn">' +
1396
        '              <button type="button" class="btn btn-default" id="manualVerifyGeocodeBtn">Find on map</button>' +
1397
        '            </span>' +
1398
        '          </div>' +
1399
        '        </div>' +
1400
        '        <div class="form-group">' +
1401
        '          <label>Latitude, Longitude</label>' +
1402
        '          <div class="input-group">' +
1403
        '            <input type="text" class="form-control" id="manualVerifyLatLng" placeholder="28.6139,77.2090">' +
1404
        '            <span class="input-group-btn">' +
1405
        '              <button type="button" class="btn btn-default" id="manualVerifyPreviewBtn">Show on map</button>' +
1406
        '            </span>' +
1407
        '          </div>' +
1408
        '          <small class="text-muted">You can also paste a Google Maps URL containing coords.</small>' +
1409
        '        </div>' +
1410
        '        <div class="form-group" id="manualVerifyMapWrap" style="display:none;">' +
1411
        '          <label>Map preview <small class="text-muted">(confirm the pin is right)</small></label>' +
1412
        '          <div style="border:1px solid #ddd;border-radius:3px;overflow:hidden;">' +
1413
        '            <iframe id="manualVerifyMapFrame" width="100%" height="260" frameborder="0" style="border:0;" allowfullscreen></iframe>' +
1414
        '          </div>' +
1415
        '          <small><a href="#" id="manualVerifyOpenMap" target="_blank">Open in Google Maps</a></small>' +
1416
        '        </div>' +
1417
        '        <div class="form-group">' +
1418
        '          <label>Store-board photo <span class="text-danger">*</span> <small class="text-muted">(required &mdash; proves the verification)</small></label>' +
1419
        '          <input type="file" id="manualVerifyPhoto" accept="image/jpeg,image/png" required>' +
1420
        '          <div id="manualVerifyPhotoPreview" style="margin-top:6px;display:none;">' +
1421
        '            <img id="manualVerifyPhotoImg" src="" style="max-height:120px;border:1px solid #ddd;border-radius:3px;padding:2px;">' +
1422
        '          </div>' +
1423
        '        </div>' +
1424
        '        <div class="form-group">' +
1425
        '          <label>Remark <small class="text-muted">(optional)</small></label>' +
1426
        '          <input type="text" class="form-control" id="manualVerifyRemark" placeholder="e.g. Confirmed on call with prospect">' +
1427
        '        </div>' +
1428
        '        <div id="manualVerifyErr" class="text-danger" style="display:none;"></div>' +
1429
        '      </div>' +
1430
        '      <div class="modal-footer">' +
1431
        '        <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>' +
1432
        '        <button type="button" class="btn btn-success" id="manualVerifySaveBtn">Save &amp; Verify</button>' +
1433
        '      </div>' +
1434
        '    </div>' +
1435
        '  </div>' +
1436
        '</div>';
1437
    $('body').append(html);
1438
}
1439
 
1440
function manualVerifyShowMap(lat, lng) {
1441
    var src = 'https://www.google.com/maps?q=' + lat + ',' + lng + '&z=17&output=embed';
1442
    $('#manualVerifyMapFrame').attr('src', src);
1443
    $('#manualVerifyOpenMap').attr('href', 'https://www.google.com/maps?q=' + lat + ',' + lng);
1444
    $('#manualVerifyMapWrap').show();
1445
}
1446
 
1447
// Parses raw "lat,lng" or a Google Maps URL containing the coords.
1448
// Maps formats covered: /@lat,lng, /maps?q=lat,lng, ?ll=lat,lng, ?destination=lat,lng.
1449
function parseLatLngInput(raw) {
1450
    if (!raw) return null;
1451
    var s = String(raw).trim();
1452
    // Strip any leading "lat:" / "lng:" tokens
1453
    var direct = s.match(/(-?\d{1,3}\.\d+)\s*,\s*(-?\d{1,3}\.\d+)/);
1454
    if (direct) return {lat: parseFloat(direct[1]), lng: parseFloat(direct[2])};
1455
    return null;
1456
}
1457
 
1458
$(document).on('click', '.verifyGeoManual', function (e) {
1459
    e.stopPropagation();
1460
    var lid = $(this).data('leadid');
1461
    ensureManualVerifyModal();
1462
    $('#manualVerifyLeadId').val(lid);
1463
    $('#manualVerifyAddress').val('');
1464
    $('#manualVerifyLatLng').val('');
1465
    $('#manualVerifyRemark').val('');
1466
    $('#manualVerifyErr').hide().text('');
1467
    $('#manualVerifyMapWrap').hide();
1468
    $('#manualVerifyMapFrame').attr('src', '');
1469
    $('#manualVerifyPhoto').val('');
1470
    $('#manualVerifyPhotoImg').attr('src', '');
1471
    $('#manualVerifyPhotoPreview').hide();
1472
    $('#manualVerifyGeoModal').modal('show');
1473
});
1474
 
1475
// Local thumbnail preview as soon as the user picks a file (no upload yet —
1476
// upload happens on Save so we don't orphan documents on cancel).
1477
$(document).on('change', '#manualVerifyPhoto', function () {
1478
    var f = this.files && this.files[0];
1479
    if (!f) {
1480
        $('#manualVerifyPhotoPreview').hide();
1481
        return;
1482
    }
1483
    var reader = new FileReader();
1484
    reader.onload = function (ev) {
1485
        $('#manualVerifyPhotoImg').attr('src', ev.target.result);
1486
        $('#manualVerifyPhotoPreview').show();
1487
    };
1488
    reader.readAsDataURL(f);
1489
});
1490
 
1491
// Address -> coords via server (uses existing GeocodingService).
1492
// On success, fills the lat/lng box and renders the map preview.
1493
$(document).on('click', '#manualVerifyGeocodeBtn', function () {
1494
    var addr = ($('#manualVerifyAddress').val() || '').trim();
1495
    if (!addr) {
1496
        $('#manualVerifyErr').text('Enter an address first.').show();
1497
        return;
1498
    }
1499
    $('#manualVerifyErr').hide();
1500
    var btn = $(this);
1501
    btn.prop('disabled', true).text('Finding...');
1502
    $.ajax({
1503
        url: context + '/lead-geo/geocode-address',
1504
        type: 'POST',
1505
        data: {address: addr},
1506
        success: function (resp) {
1507
            btn.prop('disabled', false).text('Find on map');
1508
            var r = resp && resp.response ? resp.response : resp;
1509
            if (!r || !r.success) {
1510
                $('#manualVerifyErr').text((r && r.message) || 'Could not geocode that address.').show();
1511
                return;
1512
            }
1513
            $('#manualVerifyLatLng').val(r.latitude + ',' + r.longitude);
1514
            manualVerifyShowMap(r.latitude, r.longitude);
1515
        },
1516
        error: function () {
1517
            btn.prop('disabled', false).text('Find on map');
1518
            $('#manualVerifyErr').text('Geocode request failed. Try again.').show();
1519
        }
1520
    });
1521
});
1522
 
1523
// "Show on map" — re-render the iframe from whatever is in the lat/lng input.
1524
// Useful after the user nudges the coords manually.
1525
$(document).on('click', '#manualVerifyPreviewBtn', function () {
1526
    var parsed = parseLatLngInput($('#manualVerifyLatLng').val());
1527
    if (!parsed) {
1528
        $('#manualVerifyErr').text('Enter latitude,longitude first.').show();
1529
        return;
1530
    }
1531
    $('#manualVerifyErr').hide();
1532
    manualVerifyShowMap(parsed.lat, parsed.lng);
1533
});
1534
 
1535
$(document).on('click', '#manualVerifySaveBtn', function () {
1536
    var lid = $('#manualVerifyLeadId').val();
1537
    var raw = $('#manualVerifyLatLng').val();
1538
    var remark = $('#manualVerifyRemark').val() || '';
1539
    var parsed = parseLatLngInput(raw);
1540
    if (!parsed) {
1541
        $('#manualVerifyErr').text('Could not read latitude/longitude. Paste like 28.6139,77.2090').show();
1542
        return;
1543
    }
1544
    if (parsed.lat < -90 || parsed.lat > 90 || parsed.lng < -180 || parsed.lng > 180
1545
        || (parsed.lat === 0 && parsed.lng === 0)) {
1546
        $('#manualVerifyErr').text('Latitude/longitude out of range.').show();
1547
        return;
1548
    }
1549
    var fileInput = document.getElementById('manualVerifyPhoto');
1550
    var pickedFile = fileInput && fileInput.files && fileInput.files[0];
1551
    if (!pickedFile) {
1552
        $('#manualVerifyErr').text('Please attach a store-board photo to verify.').show();
1553
        return;
1554
    }
1555
    $('#manualVerifyErr').hide();
1556
    var btn = $('#manualVerifySaveBtn');
1557
    btn.prop('disabled', true).text('Verifying...');
1558
 
1559
    function callVerify(docId) {
1560
        $.ajax({
1561
            url: context + '/lead-geo/manual-verify',
1562
            type: 'POST',
1563
            data: {
1564
                leadId: lid,
1565
                latitude: parsed.lat,
1566
                longitude: parsed.lng,
1567
                remark: remark,
1568
                imageDocumentId: docId || 0
1569
            },
1570
            success: function () {
1571
                btn.prop('disabled', false).text('Save & Verify');
1572
                $('#manualVerifyGeoModal').modal('hide');
1573
                // Replace the cell of this lead row with the Verified badge so
1574
                // the user sees the result without reloading the whole list.
1575
                var $cell = $('.verifyGeoManual[data-leadid="' + lid + '"]').closest('td');
1576
                if ($cell.length) {
1577
                    var photoBtn = docId > 0
1578
                        ? '  <a href="' + context + '/open-attachment?documentId=' + docId + '" target="_blank" class="btn btn-xs btn-default" style="margin-bottom:2px;">View Photo</a>'
1579
                        : '';
1580
                    $cell.html(
1581
                        '<div class="btn-group-vertical" style="width:100%">' +
1582
                        '  <span class="label label-success" style="margin-bottom:4px;">Verified</span>' +
1583
                        '  <a href="https://www.google.com/maps?q=' + parsed.lat + ',' + parsed.lng + '" target="_blank" class="btn btn-xs btn-default" style="margin-bottom:2px;">View Map</a>' +
1584
                        photoBtn +
1585
                        '  <button class="btn btn-xs btn-danger reject-geo" data-leadid="' + lid + '">Revoke</button>' +
1586
                        '</div>'
1587
                    );
1588
                }
1589
            },
1590
            error: function (xhr) {
1591
                btn.prop('disabled', false).text('Save & Verify');
1592
                var msg = 'Failed to verify. Please try again.';
1593
                try {
1594
                    var j = xhr.responseJSON || JSON.parse(xhr.responseText || '{}');
1595
                    if (j && j.response) msg = j.response;
1596
                    else if (j && j.message) msg = j.message;
1597
                } catch (e) {
1598
                }
1599
                $('#manualVerifyErr').text(msg).show();
1600
            }
1601
        });
1602
    }
1603
 
1604
    // Upload first, then verify with the returned document id. Photo is
1605
    // required (gate at the top of the handler), so we always go through this.
1606
    btn.text('Uploading photo...');
1607
    var formData = new FormData();
1608
    formData.append('file', pickedFile, pickedFile.name || 'store-photo.jpg');
1609
    $.ajax({
1610
        url: context + '/lead-geo/upload-image',
1611
        type: 'POST',
1612
        data: formData,
1613
        processData: false,
1614
        contentType: false,
1615
        success: function (resp) {
1616
            var r = resp && resp.response ? resp.response : resp;
1617
            var docId = r && (r.document_id || r.documentId || r.id);
1618
            if (!docId) {
1619
                btn.prop('disabled', false).text('Save & Verify');
1620
                $('#manualVerifyErr').text('Photo upload failed. Try again or remove the photo.').show();
1621
                return;
1622
            }
1623
            btn.text('Verifying...');
1624
            callVerify(docId);
1625
        },
1626
        error: function () {
1627
            btn.prop('disabled', false).text('Save & Verify');
1628
            $('#manualVerifyErr').text('Photo upload failed. Try again or remove the photo.').show();
1629
        }
1630
    });
1631
});
1632
 
36642 ranu 1633
// Geo Review navigation
1634
$(document).on('click', '.geo-review', function () {
1635
    doGetAjaxRequestHandler(context + "/lead-geo/pending-reviews", function (response) {
1636
        $('#main-content').html(response);
1637
    });
1638
});
1639
 
1640
// Visit Approvals navigation
1641
$(document).on('click', '.visit-approvals', function () {
1642
    doGetAjaxRequestHandler(context + "/visit-approvals", function (response) {
1643
        $('#main-content').html(response);
1644
    });
1645
});
1646
 
36650 ranu 1647
// Beat Day View — load inline into dashboard
1648
$(document).on('click', '.beat-plan-dayview', function (e) {
1649
    e.preventDefault();
1650
    doGetAjaxRequestHandler(context + '/beatPlan/dayView', function (response) {
1651
        $('#main-content').html(response);
1652
    });
1653
});
1654
 
36655 ranu 1655
// Base Location manager — load inline into dashboard
1656
$(document).on('click', '.base-location', function (e) {
1657
    e.preventDefault();
1658
    doGetAjaxRequestHandler(context + '/beatPlan/baseLocationPage', function (response) {
1659
        $('#main-content').html(response);
1660
    });
1661
});
1662
 
37187 amit 1663
// Agenda Config — standalone full page (allow-list gated server-side),
1664
// so navigate instead of loading into #main-content.
1665
$(document).on('click', '.agenda-config', function (e) {
1666
    e.preventDefault();
1667
    window.location.href = context + '/agenda-config';
1668
});
1669
 
36740 ranu 1670
// Deferred Partners — load inline into dashboard
1671
$(document).on('click', '.beat-plan-deferred', function (e) {
1672
    e.preventDefault();
1673
    doGetAjaxRequestHandler(context + '/beatPlan/deferredView', function (response) {
1674
        $('#main-content').html(response);
1675
    });
1676
});
1677
 
36642 ranu 1678
// Approve geolocation from lead table
1679
$(document).on('click', '.approve-geo', function (e) {
1680
    e.stopPropagation();
1681
    var lid = $(this).data('leadid');
1682
    if (!confirm('Approve geolocation for Lead #' + lid + '?')) return;
1683
 
1684
    var btn = $(this);
1685
    var cell = btn.closest('td');
1686
 
1687
    doPostAjaxRequestWithParamsHandler(
1688
        context + '/lead-geo/review',
1689
        {leadId: lid, status: 'APPROVED', remark: ''},
1690
        function (response) {
1691
            cell.html('<span class="label label-success">Verified</span>');
1692
        }
1693
    );
1694
});
1695
 
1696
// Reject geolocation from lead table
1697
$(document).on('click', '.reject-geo', function (e) {
1698
    e.stopPropagation();
1699
    var lid = $(this).data('leadid');
1700
    var reason = prompt('Reason for rejection:');
1701
    if (reason === null) return;
1702
 
1703
    var btn = $(this);
1704
    var cell = btn.closest('td');
1705
 
1706
    doPostAjaxRequestWithParamsHandler(
1707
        context + '/lead-geo/review',
1708
        {leadId: lid, status: 'REJECTED', remark: reason},
1709
        function (response) {
1710
            cell.html('<button class="btn btn-xs btn-warning generateGeoLink" data-leadid="' + lid + '">Rejected - Resend</button>');
1711
        }
1712
    );
1713
});
1714