Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
24417 govind 1
<script>
37498 amit 2
    // Fragment is re-injected with .html(), which re-runs this script; clear the
3
    // namespace first so handlers replace rather than stack. Must sit OUTSIDE
4
    // ready() - that callback fires async, after the top-level binds below.
5
    $(document).off('.ticket');
35606 amit 6
    $(document).ready(function () {
7
        // Cleanup for myModal (activity/message modal)
8
        $('#myModal').on('hidden.bs.modal', function (e) {
9
            $(".activity-container .modal-body").empty();
10
        });
35602 amit 11
 
35606 amit 12
        // Cleanup for theModal (edit/assign ticket modal)
13
        $('#theModal').on('hidden.bs.modal', function (e) {
14
            $("#theModal .modal-content").empty();
35602 amit 15
            $('body').removeClass('modal-open');
16
            $('.modal-backdrop').remove();
35606 amit 17
        });
35602 amit 18
 
35606 amit 19
        // Ensure backdrop is removed on any modal close
37498 amit 20
        $(document).on('hidden.bs.modal.ticket', '.modal', function () {
35606 amit 21
            if ($('.modal:visible').length === 0) {
22
                $('body').removeClass('modal-open');
23
                $('.modal-backdrop').remove();
24
            }
25
        });
26
 
35592 amit 27
        getPartnerAheadOptions($("#typeaheadpartnernameforassignee"), function (selectedPartner) {
28
            $("#assignee-ticket-search-by-partner-name").data('id', selectedPartner.partnerId);
29
            $("#assignee-partner-name-input").val(selectedPartner.partnerId);
30
        });
31762 tejbeer 31
 
36040 ranu 32
        // Quick filter functionality for table
33
        initTableQuickFilter();
35592 amit 34
    });
36040 ranu 35
 
36
    // Table quick filter function
37
    function initTableQuickFilter() {
38
        var filterInput = jQuery('#table-quick-filter');
39
        var clearBtn = jQuery('#clear-quick-filter');
40
        var resultCount = jQuery('#filter-result-count');
41
 
42
        filterInput.on('keyup', function () {
43
            var searchText = jQuery(this).val().toLowerCase().trim();
44
            filterTable(searchText);
45
 
46
            // Show/hide clear button
47
            if (searchText.length > 0) {
48
                clearBtn.show();
49
            } else {
50
                clearBtn.hide();
51
                resultCount.text('');
52
            }
53
        });
54
 
55
        clearBtn.on('click', function () {
56
            filterInput.val('');
57
            filterTable('');
58
            jQuery(this).hide();
59
            resultCount.text('');
60
        });
61
    }
62
 
63
    function filterTable(searchText) {
64
        var table = jQuery('#ticket-table');
65
        var tbody = table.find('tbody');
66
        var rows = tbody.find('tr');
67
        var resultCount = jQuery('#filter-result-count');
68
        var visibleCount = 0;
69
        var totalCount = rows.length;
70
 
71
        // If no search text, show all rows
72
        if (!searchText) {
73
            rows.show();
74
            resultCount.text('');
75
            return;
76
        }
77
 
78
        // Filter rows based on search text
79
        rows.each(function () {
80
            var row = jQuery(this);
81
            var rowText = row.text().toLowerCase();
82
 
83
            // Check if any cell contains the search text
84
            if (rowText.indexOf(searchText) > -1) {
85
                row.show();
86
                visibleCount++;
87
            } else {
88
                row.hide();
89
            }
90
        });
91
 
92
        // Update result count
93
        if (visibleCount === 0) {
94
            resultCount.html('<span class="text-danger">No matches found</span>');
95
        } else {
96
            resultCount.text('Showing ' + visibleCount + ' of ' + totalCount + ' rows');
97
        }
98
    }
99
 
100
    // Re-apply filter when new content is loaded via AJAX (pagination, etc.)
37498 amit 101
    jQuery(document).on('ajaxComplete.ticket', function (event, xhr, settings) {
36040 ranu 102
        // Check if this is a ticket-related AJAX call
103
        if (settings.url && settings.url.indexOf('ticket') > -1) {
104
            var searchText = jQuery('#table-quick-filter').val();
105
            if (searchText) {
106
                // Small delay to ensure DOM is updated
107
                setTimeout(function () {
108
                    filterTable(searchText.toLowerCase().trim());
109
                }, 100);
110
            }
111
        }
112
    });
113
 
114
    // Clear filter when status or order dropdowns change (these change the dataset)
37498 amit 115
    jQuery(document).on('change.ticket', '#ticketStatus, #orderBy', function () {
36040 ranu 116
        clearQuickFilter();
117
    });
118
 
119
    function clearQuickFilter() {
120
        jQuery('#table-quick-filter').val('');
121
        jQuery('#clear-quick-filter').hide();
122
        jQuery('#filter-result-count').text('');
123
    }
37559 ranu 124
 
125
    // Download all tickets for the currently-selected status/order (ignores pagination)
126
    jQuery(document).off('click.ticketDownload').on('click.ticketDownload', '#downloadTicketsBtn', function () {
127
        var ticketStatus = jQuery('#ticketStatus').val() || 'OPENED';
128
        var orderBy = jQuery('#orderBy').val() || 'DESCENDING';
129
        var url = context + '/cs/downloadMyTickets?ticketStatus=' + encodeURIComponent(ticketStatus)
130
                + '&orderby=' + encodeURIComponent(orderBy);
131
        window.location.href = url;
132
    });
24417 govind 133
</script>
35626 amit 134
<style>
135
    .pagination-wrapper {
136
        display: flex;
137
        align-items: center;
138
        justify-content: space-between;
139
        padding: 10px 0;
140
        flex-wrap: wrap;
141
    }
142
    .pagination-wrapper .pagination {
143
        margin: 0;
144
    }
145
    .pagination-wrapper .page-size-select {
146
        width: auto;
147
        display: inline-block;
148
    }
149
    .pagination-info {
150
        color: #666;
151
    }
152
    .search-form {
153
        margin-bottom: 15px;
154
    }
155
    .search-form .form-group {
156
        margin-bottom: 0;
157
    }
158
    tr.ticket-unread {
159
        background-color: #f0f7ff !important;
160
        font-weight: bold;
161
    }
162
    tr.ticket-unread td {
163
        font-weight: bold;
164
    }
165
    .unread-badge {
166
        display: inline-block;
167
        width: 8px;
168
        height: 8px;
169
        background-color: #007bff;
170
        border-radius: 50%;
171
        margin-right: 4px;
172
        vertical-align: middle;
173
    }
174
    .last-activity-preview {
175
        font-size: 11px;
176
        color: #666;
177
        font-weight: normal;
178
        display: block;
179
        white-space: nowrap;
180
        overflow: hidden;
181
        text-overflow: ellipsis;
182
        max-width: 200px;
183
    }
36040 ranu 184
 
185
    /* Quick filter styles */
186
    #table-quick-filter {
187
        border-left: none;
188
    }
189
 
190
    #table-quick-filter:focus {
191
        border-color: #66afe9;
192
        box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
193
    }
194
 
195
    #clear-quick-filter {
196
        border-left: none;
197
    }
198
 
199
    .input-group-addon {
200
        background-color: #fff;
201
        border-right: none;
202
    }
203
 
204
    #filter-result-count {
205
        font-size: 13px;
206
    }
207
 
208
    #ticket-table tbody tr.filter-highlight td {
209
        background-color: #fff3cd !important;
210
    }
35626 amit 211
</style>
35571 amit 212
#parse("activity-modal-styles.vm")
24417 govind 213
<section class="wrapper">
35592 amit 214
    <div class="row">
215
        <div class="col-lg-12">
216
            <h3 class="page-header"><i class="icon_document_alt"></i>TICKET</h3>
217
            <ol class="breadcrumb">
218
                <li><i class="fa fa-home"></i><a href="${rc.contextPath}/dashboard">Home</a></li>
219
                <li><i class="icon_document_alt"></i>My Ticket</li>
220
            </ol>
221
        </div>
222
    </div>
35626 amit 223
 
224
    ## Search Form
225
    <div class="row search-form">
226
        <div class="col-lg-12">
36040 ranu 227
            #*<form id="ticket-search-form" class="form-inline" onsubmit="return false;">
35626 amit 228
                <div class="form-group">
229
                    <input type="text" id="ticket-search-input" class="form-control" style="width: 300px;"
230
                           placeholder="Search ticket ID, partner, category, creator..."
231
                           value="$!searchText">
232
                </div>
233
                <button type="submit" class="btn btn-primary" id="ticket-search-btn">Search</button>
234
                <a href="javascript:void(0)" class="btn btn-default" id="ticket-search-clear"
235
                   style="#if(!$searchText || $searchText == '')display:none;#end">Clear</a>
36040 ranu 236
            </form>*#
237
            <div class="row" style="margin-bottom: 10px;">
238
                <div class="col-lg-4">
239
                    <div class="input-group">
240
                        <span class="input-group-addon"><i class="fa fa-search"></i></span>
241
                        <input type="text" id="table-quick-filter" class="form-control"
242
                               placeholder="Filter current page...">
243
                        <span class="input-group-btn">
244
                    <button class="btn btn-default" type="button" id="clear-quick-filter" style="display:none;">
245
                        <i class="fa fa-times"></i>
246
                    </button>
247
                </span>
248
                    </div>
249
                </div>
250
                <div class="col-lg-2">
251
                    <span id="filter-result-count" class="text-muted" style="line-height: 34px;"></span>
252
                </div>
253
            </div>
35626 amit 254
        </div>
255
    </div>
256
 
35592 amit 257
    <div class="row">
258
        <div class="col-lg-2 form-group">
259
            <select class="form-control input-sm" id="ticketStatus" name="ticketStatus" placeholder="Type">
260
                #foreach($ticketStatus in $ticketStatusValues)
261
                    #if($ticketStatus=="RESOLVED")
262
                        #if($roleType)
263
                            #if($selectedticketStatus==$ticketStatus)
264
                                <option value="$ticketStatus" selected>$ticketStatus</option>
265
                            #else
266
                                <option value="$ticketStatus">$ticketStatus</option>
267
                            #end
268
                        #end
269
                    #else
270
                        #if($selectedticketStatus==$ticketStatus)
271
                            <option value="$ticketStatus" selected>$ticketStatus</option>
272
                        #else
273
                            <option value="$ticketStatus">$ticketStatus</option>
274
                        #end
275
                    #end
276
                #end
277
            </select>
278
        </div>
279
        <div class="col-lg-2 form-group">
280
            <select class="form-control input-sm" id="orderBy" name="orderBy" placeholder="Type">
281
                #foreach($orderby in $orderByValues)
282
                    #if($orderby=="UNSORTED")
283
                    #else
284
                        #if($selectedorderby==$orderby)
285
                            #if($orderby=="ASCENDING")
286
                                <option value="$orderby" selected>OLD TO NEW</option>
287
                            #else
288
                                <option value="$orderby" selected>NEW TO OLD</option>
289
                            #end
290
                        #else
291
                            #if($orderby=="ASCENDING")
292
                                <option value="$orderby">OLD TO NEW</option>
293
                            #else
294
                                <option value="$orderby">NEW TO OLD</option>
295
                            #end
296
                        #end
297
                    #end
298
                #end
299
            </select>
300
        </div>
37559 ranu 301
        <div class="col-lg-2 form-group">
302
            <button type="button" id="downloadTicketsBtn" class="btn btn-success btn-sm">
303
                <i class="fa fa-download"></i> Download
304
            </button>
305
        </div>
35592 amit 306
        #if($roleType)
307
        <div class="col-lg-6 form-group pull-right">
36040 ranu 308
            ## Quick Filter for Table
309
 
310
            #*<div class="col-lg-6">
35592 amit 311
                <select class="form-control" id="assigneesearchType" name="assigneesearchType"
312
                        placeholder="Search Type">
313
                    <option value="" disabled selected>Search Type</option>
314
                    #foreach($searchType1 in $ticketSearchTypes)
315
                        #if($ticketSearchType.getValue()==$searchType1.getValue())
316
                            <option value="$searchType1" selected>$ticketSearchType.getValue()</option>
317
                        #else
318
                            <option value="$searchType1">$searchType1.getValue()</option>
319
                        #end
320
                    #end
321
                </select>
36040 ranu 322
            </div>*#
35592 amit 323
 
324
 
36040 ranu 325
            #*<div class="col-lg-6">
35592 amit 326
                <input type="hidden" id="assignee-partner-name-input" name="assignee-partner-name-input" value="">
327
                <div class="assigneebyPartnerName" style="display: none;">
328
                    <div class="input-group">
329
                        <input placeholder="Partner Name" type="text" class="typeahead form-control"
330
                               id="typeaheadpartnernameforassignee" value="" name="Item" data-provide="typeahead"
331
                               autocomplete="off">
332
                        <span class="input-group-btn">
333
	      			<button class="btn btn-primary" id="assignee-ticket-search-by-partner-name" type="button"
334
                            data-id="">Go!</button>
24787 govind 335
	    		</span>
35592 amit 336
                    </div>
337
                </div>
338
                <div class="assigneebyTicketId" style="display: none;">
339
                    <div class="input-group">
340
                        <input placeholder="Ticket Id" type="text" class="form-control" id="assignee-search-by-ticketId"
341
                               value="">
342
                        <span class="input-group-btn">
343
	      			<button class="btn btn-primary" id="assignee-retailer-details-search-button-by-ticketId"
344
                            type="button">Go!</button>
24787 govind 345
	    		</span>
35592 amit 346
                    </div>
347
                </div>
36040 ranu 348
            </div>*#
35592 amit 349
        #end
24417 govind 350
    </div>
35592 amit 351
    </div>
31762 tejbeer 352
 
36040 ranu 353
 
35626 amit 354
    <div id="ticket-content-area">
355
    #parse("ticket-content.vm")
35592 amit 356
    </div>
357
 
358
</section>
24417 govind 359
<div id="ticket-details-container" style="background:white;background-color:white;">
360
</div>
35571 amit 361
#set($showFileUpload = true)
362
#parse("activity-modal.vm")
35594 amit 363
 
364
## Edit ticket modal for CRM users to assign tickets
365
#if($isCrmUser)
366
<div class="edit-container">
35602 amit 367
    <div class="modal fade text-center" id="theModal" tabindex="-1" role="dialog" data-backdrop="true" data-keyboard="true">
368
        <div class="modal-dialog" role="document">
35594 amit 369
            <div class="modal-content">
370
            </div>
371
        </div>
372
    </div>
373
</div>
374
#end