vendor/uvdesk/core-framework/Resources/views/ticketList.html.twig line 1

Open in your IDE?
  1. {% extends "@UVDeskCoreFramework//Templates//layout.html.twig" %}
  2. {% block title %}{{ 'Tickets'|trans }}{% endblock %}
  3. {% block templateCSS %}
  4.     <style>
  5.         .uv-dropdown.asset-visibility li input {
  6.             z-index: 100;
  7.         }
  8.         .uv-dropdown.asset-visibility ul li label {
  9.             color: #333333;
  10.             font-size: 17px;
  11.             font-weight: 500;
  12.             text-transform: capitalize;
  13.             cursor: pointer;
  14.             margin: auto;
  15.         }
  16.         .uv-table td a {
  17.             color: #333333;
  18.         }
  19.         .uv-table.uv-list-view table tbody td.uv-width-100 {
  20.             width: 100px !important;
  21.         }
  22.         .uv-table.uv-list-view td[data-index="agent"] {
  23.             white-space: nowrap;
  24.         }
  25.         .uv-view:not(.uv-stack-view) .uv-table td a {
  26.             display: inline-block;
  27.             width: 100%;
  28.         }
  29.         .uv-action-bar-col-lt.uv-width-100 {
  30.             width: 100% !important;
  31.         }
  32.         #quick-view-modal .uv-view {
  33.             padding: 0;
  34.             overflow-y: visible;
  35.             display: inline-block;
  36.             position: relative;
  37.         }
  38.         #quick-view-modal .uv-view .uv-ticket-section {
  39.             margin-top: 0;
  40.         }
  41.         #quick-view-modal .uv-ticket-head {
  42.             border-top: 1px solid #d3d3d3;
  43.             padding-top: 10px;
  44.             padding-bottom: 10px;
  45.         }
  46.         #quick-view-modal .uv-ticket-strip {
  47.             padding-bottom: 0;
  48.         }
  49.         #quick-view-modal .uv-ticket-strip .uv-btn-tag {
  50.             margin-bottom: 0;
  51.         }
  52.         #quick-view-modal .quick-view-navigation {
  53.             position: absolute;
  54.             right: 50px;
  55.             top: 9px;
  56.         }
  57.         #quick-view-modal .quick-view-navigation ~ a {
  58.             width: calc(100% - 100px);
  59.             display: inline-block;
  60.         }
  61.         #quick-view-modal .uv-btn-tag[disabled="disabled"] {
  62.             opacity: .4;
  63.             cursor: not-allowed;
  64.             border-color: #B1B1AE !important;
  65.         }
  66.         #quick-view-modal .uv-loader {
  67.             transform: scale(0.5);
  68.             top: 14px;
  69.             right: 60px;
  70.         }
  71.         tr.unread {
  72.             background: #f1f1f1;
  73.         }
  74.         .uv-table table tbody tr.not-assigned td {
  75.             border-bottom: 1px solid #ffcacc;
  76.         }
  77.         @media screen and (max-width: 500px) {
  78.             .uv-action-bar label {
  79.                 display: inline-block;
  80.             }
  81.         }
  82.     </style>
  83. {% endblock %}
  84. {% block pageContent %}
  85.     {# Quick View Popup #}
  86.     <div class="uv-pop-up-overlay" id="quick-view-modal">
  87.         <div class="uv-pop-up-box uv-pop-up-wide"></div>
  88.     </div>
  89.     <div class="uv-inner-section">
  90.         {# Ticket Sidebar #}
  91.         <div class="uv-aside" {% if app.request.cookies and app.request.cookies.get('uv-asideView') %} style="display: none;" {% endif %} >
  92.             <div class="uv-aside-default">
  93.                 <div class="uv-aside-head">
  94.                     <div class="uv-aside-title">
  95.                         <h6>{{ 'Tickets'|trans }}</h6>
  96.                     </div>
  97.                     <div class="uv-aside-back">
  98.                         <span onclick="history.length > 1 ? history.go(-1) : window.location = '{{ path("helpdesk_member_dashboard") }}';">{{ 'Back'|trans }}</span>
  99.                     </div>
  100.                 </div>
  101.                 <div class="uv-aside-nav">
  102.                     <ul>
  103.                         {# Predefined Label List #}
  104.                         <ul class="predefined-label-list uv-aside-list">
  105.                             <li>
  106.                                 <a href="#" class="uv-aside-active">{{ 'All'|trans }} <span class="uv-flag-gray uv-flag-dark">0</span></a>
  107.                                 {# Status ticket count list #}
  108.                                 <ul class="status-list">
  109.                                     <li>
  110.                                         <a href="#" data-id="1" class="uv-aside-nav-active"><span class="name">{{ 'Open'|trans }}</span><span class="uv-flag-gray">0</span></a>
  111.                                     </li>
  112.                                     <li>
  113.                                         <a href="#" data-id="2"><span class="name">{{ 'Pending'|trans }}</span><span class="uv-flag-gray">0</span></a>
  114.                                     </li>
  115.                                     <li>
  116.                                         <a href="#" data-id="6"><span class="name">{{ 'Answered'|trans }}</span><span class="uv-flag-gray">0</span></a>
  117.                                     </li>
  118.                                     <li>
  119.                                         <a href="#" data-id="3"><span class="name">{{ 'Resolved'|trans }}</span><span class="uv-flag-gray">0</span></a>
  120.                                     </li>
  121.                                     <li>
  122.                                         <a href="#" data-id="4"><span class="name">{{ 'Closed'|trans }}</span><span class="uv-flag-gray">0</span></a>
  123.                                     </li>
  124.                                     <li>
  125.                                         <a href="#" data-id="5"><span class="name">{{ 'Spam'|trans }}</span><span class="uv-flag-gray">0</span></a>
  126.                                     </li>
  127.                                 </ul>
  128.                             </li>
  129.                             <li>
  130.                                 <a href="#new">{{ 'New'|trans }} <span class="uv-flag-gray uv-flag-dark">0</span></a>
  131.                             </li>
  132.                             <li>
  133.                                 <a href="#unassigned">{{ 'UnAssigned'|trans }} <span class="uv-flag-gray uv-flag-dark">0</span></a>
  134.                             </li>
  135.                             <li>
  136.                                 <a href="#notreplied">{{ 'UnAnswered'|trans }} <span class="uv-flag-gray uv-flag-dark">0</span></a>
  137.                             </li>
  138.                             <li>
  139.                                 <a href="#mine">{{ 'My Tickets'|trans }} <span class="uv-flag-gray uv-flag-dark">0</span></a>
  140.                             </li>
  141.                             <li>
  142.                                 <a href="#starred">{{ 'Starred'|trans }} <span class="uv-flag-gray uv-flag-dark">0</span></a>
  143.                             </li>
  144.                             <li>
  145.                                 <a href="#trashed" style="border-bottom: none">{{ 'Trashed'|trans }} <span class="uv-flag-gray uv-flag-dark">0</span></a>
  146.                             </li>
  147.                         </ul>
  148.                         {# Custom Label List #}
  149.                         <ul class="uv-aside-custom"></ul>
  150.                     </ul>
  151.                 </div>
  152.                 <a class="uv-btn-small add-new-label" href="#"><span class="uv-icon-add"></span> {{ 'Label'|trans }}</a>
  153.             </div>
  154.             <!-- Label add and edit -->
  155.             <div class="uv-add-edit-label" style="display: block"></div>
  156.         </div>
  157.         {# Ticket List #}
  158.         <div class="uv-view {% if app.request.cookies and app.request.cookies.get('uv-asideView') %} uv-aside-view {% endif %}">
  159.             <h1>{{ 'Tickets'|trans }}</h1>
  160.             {# Action Bar #}
  161.             <div class="uv-action-bar">
  162.                 {# Select all checkbox #}
  163.                 <div class="uv-action-select-wrapper">
  164.                     <label class="uv-vertical-align uv-margin-left-27">
  165.                         <div class="uv-checkbox">
  166.                             <input type="checkbox" class="select-all-checkbox"><span class="uv-checkbox-view"></span>
  167.                         </div>
  168.                     </label>
  169.                 </div>
  170.                 {# Filter Options #}
  171.                 <div class="uv-action-col-wrapper">
  172.                     {# Ticket Sort | Asset Visibility #}
  173.                     <div class="uv-action-bar-col-lt">
  174.                         <div class="filter">
  175.                             {# Sort By #}
  176.                             <div class="uv-dropdown sort">
  177.                                 <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Sort By:'|trans }} {{ 'Last Replied'|trans }}</div>
  178.                                 <div class="uv-dropdown-list uv-bottom-left">
  179.                                     <div class="uv-dropdown-container">
  180.                                         <label>{{ 'Sort By'|trans }}</label>
  181.                                         <ul></ul>
  182.                                     </div>
  183.                                 </div>
  184.                             </div>
  185.                             {# Assets Visibilities #}
  186.                             <div class="uv-dropdown asset-visibility">
  187.                                 <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Assets Visibility'|trans }}</div>
  188.                                 <div class="uv-dropdown-list uv-bottom-left" style="width: 215px;">
  189.                                     <div class="uv-dropdown-container">
  190.                                         <label>{{ 'Assets Visibility'|trans }}</label>
  191.                                         <ul>
  192.                                             {# Ticket Source #}
  193.                                             <li class="uv-dropdown-checkbox">
  194.                                                 <label>
  195.                                                     <div class="uv-checkbox">
  196.                                                         <input type="checkbox" id="source" name="assetVisibility[]" value="source" checked>
  197.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  198.                                                     </div>
  199.                                                 </label>
  200.                                                 <label for="source">{{ 'Channel/Source'|trans }}</label>
  201.                                             </li>
  202.                                             {# Ticket Customer Name #}
  203.                                             <li class="uv-dropdown-checkbox">
  204.                                                 <label>
  205.                                                     <div class="uv-checkbox">
  206.                                                         <input type="checkbox" id="customer-name" name="assetVisibility[]" value="customer-name" checked>
  207.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  208.                                                     </div>
  209.                                                 </label>
  210.                                                 <label for="customer-name">{{ 'Customer Name'|trans }}</label>
  211.                                             </li>
  212.                                             {# Ticket Customer Email #}
  213.                                             <li class="uv-dropdown-checkbox">
  214.                                                 <label>
  215.                                                     <div class="uv-checkbox">
  216.                                                         <input type="checkbox" id="customer-email" name="assetVisibility[]" value="customer-email" checked>
  217.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  218.                                                     </div>
  219.                                                 </label>
  220.                                                 <label for="customer-email">{{ 'Customer Email'|trans }}</label>
  221.                                             </li>
  222.                                             {# Ticket Timestamp #}
  223.                                             <li class="uv-dropdown-checkbox">
  224.                                                 <label>
  225.                                                     <div class="uv-checkbox">
  226.                                                         <input type="checkbox" id="timestamp" name="assetVisibility[]" value="timestamp" checked>
  227.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  228.                                                     </div>
  229.                                                 </label>
  230.                                                 <label for="timestamp">{{ 'Timestamp'|trans }}</label>
  231.                                             </li>
  232.                                             {# Ticket Group #}
  233.                                             <li class="uv-dropdown-checkbox">
  234.                                                 <label>
  235.                                                     <div class="uv-checkbox">
  236.                                                         <input type="checkbox" id="group" name="assetVisibility[]" value="group" checked>
  237.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  238.                                                     </div>
  239.                                                 </label>
  240.                                                 <label for="group">{{ 'Group'|trans }}</label>
  241.                                             </li>
  242.                                             {# Ticket Team #}
  243.                                             <li class="uv-dropdown-checkbox">
  244.                                                 <label>
  245.                                                     <div class="uv-checkbox">
  246.                                                         <input type="checkbox" id="team" name="assetVisibility[]" value="team" checked>
  247.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  248.                                                     </div>
  249.                                                 </label>
  250.                                                 <label for="team">{{ 'Team'|trans }}</label>
  251.                                             </li>
  252.                                             {# Ticket Type #}
  253.                                             <li class="uv-dropdown-checkbox">
  254.                                                 <label>
  255.                                                     <div class="uv-checkbox">
  256.                                                         <input type="checkbox" id="type1" name="assetVisibility[]" value="type1" checked>
  257.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  258.                                                     </div>
  259.                                                 </label>
  260.                                                 <label for="type1">{{ 'Type'|trans }}</label>
  261.                                             </li>
  262.                                             {# Ticket Replies #}
  263.                                             <li class="uv-dropdown-checkbox">
  264.                                                 <label>
  265.                                                     <div class="uv-checkbox">
  266.                                                         <input type="checkbox" id="replies" name="assetVisibility[]" value="replies" checked>
  267.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  268.                                                     </div>
  269.                                                 </label>
  270.                                                 <label for="replies">{{ 'Replies'|trans }}</label>
  271.                                             </li>
  272.                                             {# Ticket Agent #}
  273.                                             <li class="uv-dropdown-checkbox">
  274.                                                 <label>
  275.                                                     <div class="uv-checkbox">
  276.                                                         <input type="checkbox" id="agent" name="assetVisibility[]" value="agent" checked>
  277.                                                         <span class="uv-checkbox-view uv-checkbox-dwn"></span>
  278.                                                     </div>
  279.                                                 </label>
  280.                                                 <label for="agent">{{ 'Agent'|trans }}</label>
  281.                                             </li>
  282.                                         </ul>
  283.                                     </div>
  284.                                 </div>
  285.                             </div>
  286.                         </div>
  287.                     </div>
  288.                     {# Ticket Mass Action #}
  289.                     <div class="uv-action-bar-col-lt" style="display: none">
  290.                         <!-- Mass action -->
  291.                         <div class="mass-action">
  292.                             <div class="property-block">
  293.                                 {# Update Assigned Support Agent #}
  294.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_ASSIGN_TICKET') %}
  295.                                     <div class="uv-dropdown">
  296.                                         <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Agent'|trans }}</div>
  297.                                         <div class="uv-dropdown-list uv-bottom-left">
  298.                                             <div class="uv-dropdown-container">
  299.                                                 <label>{{ 'Agent'|trans }}</label>
  300.                                                 <div class="uv-search-sm">
  301.                                                     <input type="text" class="uv-search-field" placeholder="Search">
  302.                                                 </div>
  303.                                             </div>
  304.                                             <ul class="uv-agents-list agent" data-action="agent">
  305.                                                 {% for agent in user_service.getAgentPartialDataCollection() %}
  306.                                                     <li data-index="{{ agent.id }}">
  307.                                                         {% if agent.smallThumbnail != null %}
  308.                                                             <img src="{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('') }}{{ agent.smallThumbnail }}"/>
  309.                                                         {% else %}
  310.                                                             <img src="{{ asset(default_agent_image_path) }}" alt=""/>
  311.                                                         {% endif %}
  312.                                                         {{ agent.name }}
  313.                                                     </li>
  314.                                                 {% endfor %}
  315.                                             </ul>
  316.                                         </div>
  317.                                     </div>
  318.                                 {% endif %}
  319.                                 {# Update Assigned Support Group #}
  320.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_ASSIGN_TICKET_GROUP') %}
  321.                                     <div class="uv-dropdown">
  322.                                         <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Group'|trans }}</div>
  323.                                         <div class="uv-dropdown-list uv-bottom-left">
  324.                                             <div class="uv-dropdown-container">
  325.                                                 <label>{{ 'Group'|trans }}</label>
  326.                                                 <div class="uv-search-sm">
  327.                                                     <input type="text" class="uv-search-field" placeholder="Search">
  328.                                                 </div>
  329.                                             </div>
  330.                                             <ul class="uv-search-list group" data-action="group">
  331.                                                 {% for group in user_service.getSupportGroups() %}
  332.                                                     <li data-index="{{ group.id }}"><a href="#">{{ group.name }}</a></li>
  333.                                                 {% endfor %}
  334.                                             </ul>
  335.                                         </div>
  336.                                     </div>
  337.                                 {% endif %}
  338.                                 {# Update Assigned Support Team #}
  339.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_ASSIGN_TICKET_GROUP') %}
  340.                                     <div class="uv-dropdown">
  341.                                         <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Team'|trans }}</div>
  342.                                         <div class="uv-dropdown-list uv-bottom-left">
  343.                                             <div class="uv-dropdown-container">
  344.                                                 <label>{{ 'Team'|trans }}</label>
  345.                                                 <div class="uv-search-sm">
  346.                                                     <input type="text" class="uv-search-field" placeholder="Search">
  347.                                                 </div>
  348.                                             </div>
  349.                                             <ul class="uv-search-list team" data-action="team">
  350.                                                 {% for team in user_service.getSupportTeams() %}
  351.                                                     <li data-index="{{ team.id }}"><a href="#">{{ team.name }}</a></li>
  352.                                                 {% endfor %}
  353.                                             </ul>
  354.                                         </div>
  355.                                     </div>
  356.                                 {% endif %}
  357.                                 {# Update Ticket Status #}
  358.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_UPDATE_TICKET_STATUS') %}
  359.                                     <div class="uv-dropdown">
  360.                                         <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Status'|trans }}</div>
  361.                                         <div class="uv-dropdown-list uv-bottom-left">
  362.                                             <div class="uv-dropdown-container">
  363.                                                 <label>{{ 'Status'|trans }}</label>
  364.                                                 <ul class="status" data-action="status">
  365.                                                     {% for status in ticketStatusCollection %}
  366.                                                         <li data-index="{{ status.id }}"><a href="#">{{ status.description|trans }}</a></li>
  367.                                                     {% endfor %}
  368.                                                 </ul>
  369.                                             </div>
  370.                                         </div>
  371.                                     </div>
  372.                                 {% endif %}
  373.                                 {# Update Ticket Type #}
  374.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_UPDATE_TICKET_TYPE') %}
  375.                                     <div class="uv-dropdown">
  376.                                         <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Type'|trans }}</div>
  377.                                         <div class="uv-dropdown-list uv-bottom-left">
  378.                                             <div class="uv-dropdown-container">
  379.                                                 <label>{{ 'Type'|trans }}</label>
  380.                                                 <div class="uv-search-sm">
  381.                                                     <input type="text" class="uv-search-field" placeholder="{{ 'Search'|trans }}">
  382.                                                 </div>
  383.                                             </div>
  384.                                             <ul class="uv-search-list type" data-action="type">
  385.                                                 {% for type in ticket_service.getTypes()  %}
  386.                                                     <li data-index="{{ type.id }}"><a href="#">{{ type.name }}</a></li>
  387.                                                 {% endfor %}
  388.                                             </ul>
  389.                                         </div>
  390.                                     </div>
  391.                                 {% endif %}
  392.                                 {# Update Priority #}
  393.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_UPDATE_TICKET_PRIORITY') %}
  394.                                     <div class="uv-dropdown">
  395.                                         <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Priority'|trans }}</div>
  396.                                         <div class="uv-dropdown-list uv-bottom-left">
  397.                                             <div class="uv-dropdown-container">
  398.                                                 <label>{{ 'Priority'|trans }}</label>
  399.                                                 <ul class="priority" data-action="priority">
  400.                                                     {% for priority in ticketPriorityCollection %}
  401.                                                         <li data-index="{{ priority.id }}"><a href="#">{{ priority.description|trans }}</a></li>
  402.                                                     {% endfor %}
  403.                                                 </ul>
  404.                                             </div>
  405.                                         </div>
  406.                                     </div>
  407.                                 {% endif %}
  408.                                 {# Update Label #}
  409.                                 <div class="uv-dropdown">
  410.                                     <div class="uv-dropdown-btn uv-vertical-align uv-margin-right-5">{{ 'Label'|trans }}</div>
  411.                                     <div class="uv-dropdown-list uv-bottom-left">
  412.                                         <div class="uv-dropdown-container">
  413.                                             <label>{{ 'Label'|trans }}</label>
  414.                                             <div class="uv-search-sm">
  415.                                                 <input type="text" class="uv-search-field" placeholder="Search">
  416.                                             </div>
  417.                                         </div>
  418.                                         <ul class="uv-search-list label" data-action="label"></ul>
  419.                                     </div>
  420.                                 </div>
  421.                                 {# Trashe Tickets #}
  422.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_DELETE_TICKET') %}
  423.                                     <a class="uv-btn-stroke uv-margin-right-5" id="mass-delete" data-action="trashed" style="margin-left: 5px;">{{ 'Delete'|trans }}</a>
  424.                                 {% endif %}
  425.                             </div>
  426.                             {# For Trashed Tickets #}
  427.                             <div class="trashed-block" style="display: none">
  428.                                 {# Restore Tickets #}
  429.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_RESTORE_TICKET') %}
  430.                                     <a class="uv-btn-stroke uv-margin-right-5" id="mass-restore" data-action="restore" style="margin-left: 5px;">{{ 'Restore'|trans }}</a>
  431.                                 {% endif %}
  432.                                 {# Delete Tickets Forever #}
  433.                                 {% if user_service.isAccessAuthorized('ROLE_AGENT_DELETE_TICKET') %}
  434.                                     <a class="uv-btn-stroke uv-margin-right-5" id="mass-delete-forever" data-action="delete" style="margin-left: 5px;">{{ 'Delete Forever'|trans }}</a>
  435.                                 {% endif %}
  436.                             </div>
  437.                         </div>
  438.                     </div>
  439.                     {# Ticket Search | Filter Extras #}
  440.                     <div class="uv-action-bar-col-rt">
  441.                         <!-- Search Tickets -->
  442.                         <input type="text" class="uv-search-inline" placeholder="{{ 'Search'|trans }}">
  443.                         <!-- Extra Filters -->
  444.                         <div class="uv-btn-stroke uv-margin-left-15 filter-view-trigger" data-target="uv-filter-view"><span class="uv-icon-filter"></span>{{ 'Filter View'|trans }}</div>
  445.                     </div>
  446.                 </div>
  447.             </div>
  448.             {# Ticket List #}
  449.             <div class="uv-table uv-list-view">
  450.                 <table>
  451.                     <thead>
  452.                     <tr>
  453.                         <th class="uv-width-140"></th>
  454.                         <th>{{ 'ID'|trans }}</th>
  455.                         <th class="uv-min-width-300">{{ 'Subject'|trans }}</th>
  456.                         <th data-index="customer-name">{{ 'Customer Name'|trans }}</th>
  457.                         <th data-index="customer-email">{{ 'Customer Email'|trans }}</th>
  458.                         <th data-index="timestamp">{{ 'Timestamp'|trans }}</th>
  459.                         <th style ="min-width:100px" data-index="lastReply">{{ "Last Reply"|trans }}</th>
  460.                         <th data-index="group">{{ 'Group'|trans }}</th>
  461.                         <th data-index="team">{{ 'Team'|trans }}</th>
  462.                         <th data-index="type1">{{ 'Type'|trans }}</th>
  463.                         <th data-index="replies">{{ 'Replies'|trans }}</th>
  464.                         <th data-index="agent">{{ 'Agent'|trans }}</th>
  465.                     </tr>
  466.                     </thead>
  467.                     <tbody></tbody>
  468.                 </table>
  469.                 <div class="navigation"></div>
  470.             </div>
  471.         </div>
  472.         {# Extra Filters #}
  473.         <div class="uv-filter-view" id="uv-filter-view">
  474.             {# Filter Head #}
  475.             <div class="uv-filter-head">
  476.                 <div class="uv-filter-title">
  477.                     <h6>{{ 'Tickets'|trans }}</h6>
  478.                     <span>{{ 'Save set of filters as a preset to stay more productive'|trans }}</span>
  479.                 </div>
  480.                 <div class="uv-filter-toggle" id="filter-close-trigger"><span></span></div>
  481.             </div>
  482.             {# Filter Content #}
  483.             <div class="uv-filter-paper">
  484.                 {# Filters #}
  485.                 <div class="uv-filter-options">
  486.                     <script>
  487.                         var userFilters = {};
  488.                     </script>
  489.                     {# Saved Filters #}
  490.                     <div class="uv-element-block" style="border-bottom: 1px solid #D3D3D3; padding-bottom: 5px;">
  491.                         <label class="uv-field-label">{{ 'Saved Filters'|trans }}</label>
  492.                         <div class="uv-field-block">
  493.                             <div class="uv-customize-wrapper">
  494.                                 <select class="uv-select uv-select-70" id="saved-filter">
  495.                                     {% set filters = app.user.agentInstance.userSavedFilters %}
  496.                                     {% if filters|length %}
  497.                                         <option value="">-- Saved Filter --</option>
  498.                                         {% for userFilter in filters %}
  499.                                             <option value="{{userFilter.id}}">{{userFilter.name}}</option>
  500.                                         {% endfor %}
  501.                                     {% else %}
  502.                                         <option value="">{{ 'No saved filter created'|trans }}</option>
  503.                                     {% endif %}
  504.                                 </select>
  505.                                 {% for userFilter in app.user.agentInstance.userSavedFilters %}
  506.                                     <script>
  507.                                         {% set isDefault = 0 %}
  508.                                         {% if app.user.agentInstance.defaultFiltering == userFilter.id %}
  509.                                         {% set isDefault = 1 %}
  510.                                         {% endif %}
  511.                                         userFilters[{{userFilter.id}}] = {{ {'id': userFilter.id, 'name': userFilter.name, 'route': userFilter.route, 'is_default': isDefault}|json_encode|raw }};
  512.                                     </script>
  513.                                 {% endfor %}
  514.                                 <span class="uv-customize" style="display: none" data-toggle="tooltip" title="{{ 'Edit Saved Filter'|trans }}"></span>
  515.                             </div>
  516.                         </div>
  517.                     </div>
  518.                     {% set filterContext = {} %}
  519.                     {# agent #}
  520.                     <div class="uv-element-block">
  521.                         <label class="uv-field-label">{{ 'Agent'|trans }}</label>
  522.                         <div class="uv-field-block" id="agent-filter">
  523.                             <input class="uv-field uv-dropdown-other preloaded" type="text" data-filter-type="agent" id="agent-filter-input">
  524.                             <div class="uv-dropdown-list uv-bottom-left">
  525.                                 <div class="uv-dropdown-container">
  526.                                     <label>{{ 'Filter With'|trans }}</label>
  527.                                 </div>
  528.                                 <ul class="uv-agents-list">
  529.                                     {% set options = [] %}
  530.                                     {% for agent in user_service.getAgentsPartialDetails %}
  531.                                         {% set options = options|merge([{'id': agent.id, 'name': agent.name}]) %}
  532.                                         <li data-id="{{agent.id}}">
  533.                                             {% if agent.smallThumbnail != null %}
  534.                                                 <img src="{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('') }}{{ agent.smallThumbnail }}"/>
  535.                                             {% else %}
  536.                                                 <img src="{{ asset(default_agent_image_path) }}"/>
  537.                                             {% endif %}
  538.                                             {{agent.name}}
  539.                                         </li>
  540.                                     {% endfor %}
  541.                                     <li class="uv-no-results" style="display: none;">
  542.                                         {{ 'No result found'|trans }}
  543.                                     </li>
  544.                                     {% set filterContext = filterContext|merge({'agent':options}) %}
  545.                                 </ul>
  546.                             </div>
  547.                             <div class="uv-filtered-tags"></div>
  548.                         </div>
  549.                     </div>
  550.                     <div class="uv-element-block">
  551.                         <label class="uv-field-label">{{ 'Customer'|trans }}</label>
  552.                         <div class="uv-field-block" id="customer-filter">
  553.                             <input class="uv-field uv-dropdown-other" type="text" data-filter-type="customer" id="customer-filter-input">
  554.                             <div class="uv-dropdown-list uv-bottom-left">
  555.                                 <div class="uv-dropdown-container">
  556.                                     <label>{{ 'Filter With'|trans }}</label>
  557.                                 </div>
  558.                                 <ul class="uv-agents-list">
  559.                                     <li class="uv-filter-info">
  560.                                         {{ 'Type atleast 2 letters'|trans }}
  561.                                     </li>
  562.                                     <li class="uv-no-results" style="display: none;">
  563.                                         {{ 'No result found'|trans }}
  564.                                     </li>
  565.                                 </ul>
  566.                             </div>
  567.                             <div class="uv-filtered-tags"></div>
  568.                         </div>
  569.                     </div>
  570.                     <div class="uv-element-block">
  571.                         <label class="uv-field-label">{{ 'Group'|trans }}</label>
  572.                         <div class="uv-field-block" id="group-filter">
  573.                             <input class="uv-field uv-dropdown-other preloaded" type="text" data-filter-type="group" id="group-filter-input">
  574.                             <div class="uv-dropdown-list uv-bottom-left">
  575.                                 <div class="uv-dropdown-container">
  576.                                     <label>{{ 'Filter With'|trans }}</label>
  577.                                     <ul class="">
  578.                                         {% set options = [] %}
  579.                                         {% for group in user_service.getSupportGroups() %}
  580.                                             {% set options = options|merge([{'id': group.id, 'name': group.name}]) %}
  581.                                             <li data-id="{{group.id}}">
  582.                                                 {{group.name}}
  583.                                             </li>
  584.                                         {% endfor %}
  585.                                         <li class="uv-no-results" style="display: none;">
  586.                                             {{ 'No result found'|trans }}
  587.                                         </li>
  588.                                         {% set filterContext = filterContext|merge({'group':options}) %}
  589.                                     </ul>
  590.                                 </div>
  591.                             </div>
  592.                             <div class="uv-filtered-tags"></div>
  593.                         </div>
  594.                     </div>
  595.                     <div class="uv-element-block">
  596.                         <label class="uv-field-label">{{ 'Team'|trans }}</label>
  597.                         <div class="uv-field-block" id="team-filter">
  598.                             <input class="uv-field uv-dropdown-other preloaded" type="text" data-filter-type="team" id="team-filter-input">
  599.                             <div class="uv-dropdown-list uv-bottom-left">
  600.                                 <div class="uv-dropdown-container">
  601.                                     <label>{{ 'Filter With'|trans }}</label>
  602.                                     <ul class="">
  603.                                         {% set options = [] %}
  604.                                         {% for team in user_service.getSupportTeams() %}
  605.                                             {% set options = options|merge([{'id': team.id, 'name': team.name}]) %}
  606.                                             <li data-id="{{team.id}}">
  607.                                                 {{team.name}}
  608.                                             </li>
  609.                                         {% endfor %}
  610.                                         <li class="uv-no-results" style="display: none;">
  611.                                             {{ 'No result found'|trans }}
  612.                                         </li>
  613.                                         {% set filterContext = filterContext|merge({'team':options}) %}
  614.                                     </ul>
  615.                                 </div>
  616.                             </div>
  617.                             <div class="uv-filtered-tags"></div>
  618.                         </div>
  619.                     </div>
  620.                     <div class="uv-element-block">
  621.                         <label class="uv-field-label">{{ 'Type'|trans }}</label>
  622.                         <div class="uv-field-block" id="type-filter">
  623.                             <input class="uv-field uv-dropdown-other preloaded" type="text" data-filter-type="type" id="type-filter-input">
  624.                             <div class="uv-dropdown-list uv-bottom-left">
  625.                                 <div class="uv-dropdown-container">
  626.                                     <label>{{ 'Filter With'|trans }}</label>
  627.                                     <ul class="">
  628.                                         {% set options = [] %}
  629.                                         {% for type in ticket_service.getTypes() %}
  630.                                             {% set options = options|merge([{'id': type.id, 'name': type.name}]) %}
  631.                                             <li data-id="{{type.id}}">
  632.                                                 {{type.name}}
  633.                                             </li>
  634.                                         {% endfor %}
  635.                                         <li class="uv-no-results" style="display: none;">
  636.                                             {{ 'No result found'|trans }}
  637.                                         </li>
  638.                                         {% set filterContext = filterContext|merge({'type':options}) %}
  639.                                     </ul>
  640.                                 </div>
  641.                             </div>
  642.                             <div class="uv-filtered-tags"></div>
  643.                         </div>
  644.                     </div>
  645.                     <div class="uv-element-block">
  646.                         <label class="uv-field-label">{{ 'Priority'|trans }}</label>
  647.                         <div class="uv-field-block" id="priority-filter">
  648.                             <input class="uv-field uv-dropdown-other preloaded" type="text" data-filter-type="priority" id="priority-filter-input">
  649.                             <div class="uv-dropdown-list uv-bottom-left">
  650.                                 <div class="uv-dropdown-container">
  651.                                     <label>{{ 'Filter With'|trans }}</label>
  652.                                     <ul class="">
  653.                                         {% set options = [] %}
  654.                                         {% for priority in ticket_service.getPriorities() %}
  655.                                             {% set options = options|merge([{'id': priority.id, 'name': priority.code, 'color': priority.colorCode}]) %}
  656.                                             <li data-id="{{priority.id}}">
  657.                                                 {{ priority.code|trans }}
  658.                                             </li>
  659.                                         {% endfor %}
  660.                                         <li class="uv-no-results" style="display: none;">
  661.                                             {{ 'No result found'|trans }}
  662.                                         </li>
  663.                                         {% set filterContext = filterContext|merge({'priority':options}) %}
  664.                                     </ul>
  665.                                 </div>
  666.                             </div>
  667.                             <div class="uv-filtered-tags"></div>
  668.                         </div>
  669.                     </div>
  670.                     <div class="uv-element-block">
  671.                         <label class="uv-field-label">{{ 'Tag'|trans }}</label>
  672.                         <div class="uv-field-block" id="tag-filter">
  673.                             <input class="uv-field uv-dropdown-other" type="text" data-filter-type="tag" id="tag-filter-input">
  674.                             <div class="uv-dropdown-list uv-bottom-left">
  675.                                 <div class="uv-dropdown-container">
  676.                                     <label>{{ 'Filter With'|trans }}</label>
  677.                                     <ul class="">
  678.                                         <li class="uv-filter-info">
  679.                                             {{ 'Type atleast 2 letters'|trans }}
  680.                                         </li>
  681.                                         <li class="uv-no-results" style="display: none;">
  682.                                             {{ 'No result found'|trans }}
  683.                                         </li>
  684.                                     </ul>
  685.                                 </div>
  686.                             </div>
  687.                             <div class="uv-filtered-tags"></div>
  688.                         </div>
  689.                     </div>
  690.                     <div class="uv-element-block">
  691.                         <label class="uv-field-label">{{ 'Source'|trans }}</label>
  692.                         <div class="uv-field-block" id="source-filter">
  693.                             <input class="uv-field uv-dropdown-other preloaded" type="text" data-filter-type="source" id="source-filter-input">
  694.                             <div class="uv-dropdown-list uv-bottom-left">
  695.                                 <div class="uv-dropdown-container">
  696.                                     <label>{{ 'Filter With'|trans }}</label>
  697.                                     <ul class="">
  698.                                         {% set options = [] %}
  699.                                         {% for key, source in ticket_service.getAllSources() %}
  700.                                             {% set options = options|merge([{'id': key, 'name': source}]) %}
  701.                                             <li data-id="{{key}}">
  702.                                                 {{ source|trans }}
  703.                                             </li>
  704.                                         {% endfor %}
  705.                                         <li class="uv-no-results" style="display: none;">
  706.                                             {{ 'No result found'|trans }}
  707.                                         </li>
  708.                                         {% set filterContext = filterContext|merge({'source': options}) %}
  709.                                     </ul>
  710.                                 </div>
  711.                             </div>
  712.                             <div class="uv-filtered-tags"></div>
  713.                         </div>
  714.                     </div>
  715.                     <div class="uv-element-block">
  716.                         <label class="uv-field-label">{{ 'Mailbox'|trans }}</label>
  717.                         <div class="uv-field-block" id="mailbox-filter">
  718.                             <input class="uv-field uv-dropdown-other preloaded" type="text" data-filter-type="mailbox" id="mailbox-filter-input">
  719.                             <div class="uv-dropdown-list uv-bottom-left">
  720.                                 <div class="uv-dropdown-container">
  721.                                     <label>{{ 'Filter With'|trans }}</label>
  722.                                     <ul class="">
  723.                                         {% set options = [] %}
  724.                                         {% for mailbox in ticket_service.getAllMailboxes() %}
  725.                                             {% set options = options|merge([{'id': mailbox.email, 'name': mailbox.name}]) %}
  726.                                             <li data-id="{{mailbox.email}}">
  727.                                                 {{ mailbox.name|trans }}
  728.                                             </li>
  729.                                         {% endfor %}
  730.                                         <li class="uv-no-results" style="display: none;">
  731.                                             {{ 'No result found'|trans }}
  732.                                         </li>
  733.                                         {% set filterContext = filterContext|merge({'mailbox': options}) %}
  734.                                     </ul>
  735.                                 </div>
  736.                             </div>
  737.                             <div class="uv-filtered-tags"></div>
  738.                         </div>
  739.                     </div>
  740.                     <div class="uv-element-block">
  741.                         <label class="uv-field-label">{{ 'Before'|trans }}</label>
  742.                         <div class="uv-field-block range" id="before-filter">
  743.                             <input class="uv-field uv-date-picker" type="text" data-filter-type="before" id="before-filter-input">
  744.                         </div>
  745.                     </div>
  746.                     <div class="uv-element-block">
  747.                         <label class="uv-field-label">{{ 'After'|trans }}</label>
  748.                         <div class="uv-field-block range" id="after-filter">
  749.                             <input class="uv-field uv-date-picker" type="text" data-filter-type="after" id="after-filter-input">
  750.                         </div>
  751.                     </div>
  752.                     <div class="uv-element-block">
  753.                         <label class="uv-field-label">{{ 'Replies less than'|trans }}</label>
  754.                         <div class="uv-field-block" id="reply-filter">
  755.                             <input class="uv-field" type="number" min="1" data-filter-type="replies-less" id="repliesLess-filter-input">
  756.                         </div>
  757.                     </div>
  758.                     <div class="uv-element-block">
  759.                         <label class="uv-field-label">{{ 'Replies more than'|trans }}</label>
  760.                         <div class="uv-field-block" id="reply-filter">
  761.                             <input class="uv-field" type="number" min="0" data-filter-type="replies-more" id="repliesMore-filter-input">
  762.                         </div>
  763.                     </div>
  764.                     <div class="uv-action-buttons">
  765.                     </div>
  766.                     {# Clear Filters #}
  767.                     <a class="uv-btn-remove" href="#"><span class="uv-icon-discard"></span> {{ 'Clear All'|trans }}</a>
  768.                 </div>
  769.                 {# Add|Edit Filter #}
  770.                 <div class="uv-filter-edit" style="display: none;"></div>
  771.             </div>
  772.             <script type="text/javascript">
  773.                 var filterContext = {{ filterContext|json_encode|raw }}
  774.             </script>
  775.         </div>
  776.     </div>
  777. {% endblock %}
  778. {% block footer %}
  779.     {{ parent() }}
  780.     {# Sort Ticket View Template #}
  781.     <script id="ticket_list_sorting_tmp" type="text/template">
  782.         <li class="<% if(sort == 'ticket.id') { %>uv-drop-list-active<% } %>">
  783.             <a href="#<% if(queryString != '') { %><%= queryString %>/<% } %><% if(page) { %>page/<%= page %><% } else { %>page/1<% } %>/sort/ticket.id/<% if(sort == 'ticket.id') { %><% if(direction) { %>direction/<%= direction %><% } else { %>direction/desc<% } %><% } else { %>direction/asc<% } %>" data-field="ticket.id">
  784.                 {% trans %}Ticket Id{% endtrans %}
  785.                 <% if(sort == 'ticket.id') { %>
  786.                 <span class="uv-sorting <% if(direction == 'asc') { %> descend <% } else { %> ascend <% } %>"></span>
  787.                 <% } %>
  788.             </a>
  789.         </li>
  790.         <li class="<% if(sort == 'ticket.updatedAt') { %>uv-drop-list-active<% } %>">
  791.             <a href="#<% if(queryString != '') { %><%= queryString %>/<% } %><% if(page) { %>page/<%= page %><% } else { %>page/1<% } %>/sort/ticket.updatedAt/<% if(sort == 'ticket.updatedAt') { %><% if(direction) { %>direction/<%= direction %><% } else { %>direction/desc<% } %><% } else { %>direction/asc<% } %>" data-field="ticket.updatedAt">
  792.                 {% trans %}Last Replied{% endtrans %}
  793.                 <% if(sort == 'ticket.updatedAt') { %>
  794.                 <span class="uv-sorting <% if(direction == 'asc') { %> descend <% } else { %> ascend <% } %>"></span>
  795.                 <% } %>
  796.             </a>
  797.         </li>
  798.         <li class="<% if(sort == 'agentName') { %>uv-drop-list-active<% } %>">
  799.             <a href="#<% if(queryString != '') { %><%= queryString %>/<% } %><% if(page) { %>page/<%= page %><% } else { %>page/1<% } %>/sort/agentName/<% if(sort == 'agentName') { %><% if(direction) { %>direction/<%= direction %><% } else { %>direction/desc<% } %><% } else { %>direction/asc<% } %>" data-field="agentName">
  800.                 {% trans %}Assign To{% endtrans %}
  801.                 <% if(sort == 'agentName') { %>
  802.                 <span class="uv-sorting <% if(direction == 'asc') { %> descend <% } else { %> ascend <% } %>"></span>
  803.                 <% } %>
  804.             </a>
  805.         </li>
  806.         <li class="<% if(sort == 'customerEmail') { %>uv-drop-list-active<% } %>">
  807.             <a href="#<% if(queryString != '') { %><%= queryString %>/<% } %><% if(page) { %>page/<%= page %><% } else { %>page/1<% } %>/sort/customerEmail/<% if(sort == 'customerEmail') { %><% if(direction) { %>direction/<%= direction %><% } else { %>direction/desc<% } %><% } else { %>direction/asc<% } %>" data-field="customerEmail">
  808.                 {% trans %}Customer Email{% endtrans %}
  809.                 <% if(sort == 'customerEmail') { %>
  810.                 <span class="uv-sorting <% if(direction == 'asc') { %> descend <% } else { %> ascend <% } %>"></span>
  811.                 <% } %>
  812.             </a>
  813.         </li>
  814.         <li class="<% if(sort == 'customerName') { %>uv-drop-list-active<% } %>">
  815.             <a href="#<% if(queryString != '') { %><%= queryString %>/<% } %><% if(page) { %>page/<%= page %><% } else { %>page/1<% } %>/sort/customerName/<% if(sort == 'customerName') { %><% if(direction) { %>direction/<%= direction %><% } else { %>direction/desc<% } %><% } else { %>direction/asc<% } %>" data-field="customerName">
  816.                 {% trans %}Customer Name{% endtrans %}
  817.                 <% if(sort == 'customerName') { %>
  818.                 <span class="uv-sorting <% if(direction == 'asc') { %> descend <% } else { %> ascend <% } %>"></span>
  819.                 <% } %>
  820.             </a>
  821.         </li>
  822.     </script>
  823.     {# Ticket Status List Template #}
  824.     <script id="ticket_status_list_tmp" type="text/template">
  825.         <ul class="status-list">
  826.             {% for status in ticketStatusCollection %}
  827.                 <li>
  828.                     <a href="#" class="<% if(active == {{ status.id }} {% if status.id == 1 %} || active == 0{% endif %}) { %>uv-aside-nav-active<% } %>" data-id="{{ status.id }}">
  829.                         <span class="name">{{ status.description|trans }}</span>
  830.                         <span class="uv-flag-gray">
  831.                             <% if(status && status[1] != undefined) { %>
  832.                                 <%= status[{{ status.id }}] %>
  833.                             <% } else { %>
  834.                                 0
  835.                             <% } %>
  836.                         </span>
  837.                     </a>
  838.                 </li>
  839.             {% endfor %}
  840.         </ul>
  841.     </script>
  842.     {# Default Ticket Label View Template #}
  843.     <script id="predefined_label_tmp" type="text/template">
  844.         <li>
  845.             <a href="#" <% if (active == '') { %> class="uv-aside-active" <% } %>>
  846.             {{ 'All'|trans }}
  847.             <span class="uv-flag-gray uv-flag-dark"><%= labelDetails.predefind.all %></span>
  848.             </a>
  849.         </li>
  850.         <li>
  851.             <a href="#new" <% if(active == 'new') { %> class="uv-aside-active" <% } %> >
  852.             {{ 'New'|trans }}
  853.             <span class="uv-flag-gray uv-flag-dark">
  854.                     <%= labelDetails.predefind.new %>
  855.                 </span>
  856.             </a>
  857.         </li>
  858.         <li>
  859.             <a href="#unassigned" <% if(active == 'unassigned') { %> class="uv-aside-active" <% } %> >
  860.             {{ 'UnAssigned'|trans }}
  861.             <span class="uv-flag-gray uv-flag-dark">
  862.                     <%= labelDetails.predefind.unassigned %>
  863.                 </span>
  864.             </a>
  865.         </li>
  866.         <li>
  867.             <a href="#notreplied" <% if(active == 'notreplied') { %> class="uv-aside-active" <% } %> >
  868.             {{ 'UnAnswered'|trans }}
  869.             <span class="uv-flag-gray uv-flag-dark">
  870.                     <%= labelDetails.predefind.notreplied %>
  871.                 </span>
  872.             </a>
  873.         </li>
  874.         <li>
  875.             <a href="#mine" <% if(active == 'mine') { %> class="uv-aside-active" <% } %> >
  876.             {{ 'My Tickets'|trans }}
  877.             <span class="uv-flag-gray uv-flag-dark">
  878.                     <%= labelDetails.predefind.mine %>
  879.                 </span>
  880.             </a>
  881.         </li>
  882.         <li>
  883.             <a href="#starred" <% if(active == 'starred') { %> class="uv-aside-active" <% } %> >
  884.             {{ 'Starred'|trans }}
  885.             <span class="uv-flag-gray uv-flag-dark">
  886.                     <%= labelDetails.predefind.starred %>
  887.                 </span>
  888.             </a>
  889.         </li>
  890.         <li>
  891.             <a href="#trashed" <% if(active == 'trashed') { %> class="uv-aside-active" <% } %>>
  892.             {{ 'Trashed'|trans }}
  893.             <span class="uv-flag-gray uv-flag-dark">
  894.                     <%= labelDetails.predefind.trashed %>
  895.                 </span>
  896.             </a>
  897.         </li>
  898.     </script>
  899.     {# Custom Ticket Label View Template #}
  900.     <script id="custom_label_tmp" type="text/template">
  901.         <a href="#label/<%= id %>"  data-id="<%= id %>">
  902.             <%- name %>
  903.             <span class="uv-flag-gray" style="<% if(colorCode) { %>background-color:<%= colorCode %><% } %>">
  904.                 <%= count %>
  905.             </span>
  906.         </a>
  907.         <span class="uv-customize" data-target="uv-task-view" data-toggle="tooltip" title="{{ 'Edit Label'|trans }}"></span>
  908.     </script>
  909.     {# Add|Edit Ticket Label View Template #}
  910.     <script id="add_edit_label_tmp" type="text/template">
  911.         <div class="uv-aside-head">
  912.             <div class="uv-aside-title">
  913.                 <% if(id) { %>
  914.                 <h6>{{ 'Edit Label'|trans }}</h6>
  915.                 <% } else { %>
  916.                 <h6>{{ 'Add Label'|trans }}</h6>
  917.                 <% } %>
  918.             </div>
  919.             <div class="uv-aside-back" id="back-to-labels">
  920.                 <span>{{ 'Back'|trans }}</span>
  921.             </div>
  922.         </div>
  923.         <div class="uv-aside-option" data-id="<%= id %>">
  924.             <div class="uv-element-block">
  925.                 <label class="uv-field-label">{{ 'Name'|trans }}</label>
  926.                 <div class="uv-field-block">
  927.                     <input class="uv-field" type="text" value="<%- name %>" />
  928.                 </div>
  929.             </div>
  930.             <div class="uv-element-block">
  931.                 <label class="uv-field-label">{{ 'Choose a Color'|trans }}</label>
  932.                 <div class="uv-field-block">
  933.                     <% colors = ['#337CFF','#FEBF00','#E5549F','#27B6BB','#FB8A3F','#43AF52'] %>
  934.                     <% for(var colorTemp in colors) { %>
  935.                     <span class="uv-color-block <% if(colorCode == colors[colorTemp]) { %>uv-color-active<% } %>" data-color="<%- colors[colorTemp] %>" style="background:<%- colors[colorTemp] %>"></span>
  936.                     <% } %>
  937.                 </div>
  938.             </div>
  939.             <div>
  940.                 <a class="uv-btn add-update-btn" href="#">
  941.                     <% if(id) { %>
  942.                     {{ 'Update'|trans }}
  943.                     <% } else { %>
  944.                     {{ 'Create'|trans }}
  945.                     <% } %>
  946.                 </a>
  947.             </div>
  948.             <% if(id) { %>
  949.             <a class="uv-btn-remove"><span class="uv-icon-discard"></span>{{ 'Remove Label'|trans }}</a>
  950.             <% } %>
  951.         </div>
  952.     </script>
  953.     {# Add|Edit Saved Ticket Filter View Template #}
  954.     <script id="add_edit_saved_filter_tmp" type="text/template">
  955.         <form>
  956.             <div class="uv-filter-edit-head">
  957.                 <div class="uv-filter-edit-title">
  958.                     <h6>
  959.                         <% if(id) { %>
  960.                         <input type="hidden" name="id" id="filter-id" value="<%= id %>"/>
  961.                         {{ 'Edit Saved Filter'|trans }}
  962.                         <% } else { %>
  963.                         {{ 'New Saved Filter'|trans }}
  964.                         <% } %>
  965.                     </h6>
  966.                 </div>
  967.                 <div class="uv-filter-edit-back back-to-filter">
  968.                     <span>{{ 'Back'|trans }}</span>
  969.                 </div>
  970.             </div>
  971.             <div class="uv-element-block">
  972.                 <label class="uv-field-label">{{ 'Name'|trans }}</label>
  973.                 <div class="uv-field-block">
  974.                     <input class="uv-field name" name="name" type="text" value="<%- name %>" />
  975.                 </div>
  976.             </div>
  977.             <div class="uv-element-block">
  978.                 <label>
  979.                     <div class="uv-checkbox">
  980.                         <input type="checkbox" name="is_default" <% if(is_default) { %>checked<% } %> />
  981.                         <span class="uv-checkbox-view"></span>
  982.                     </div>
  983.                     <span class="uv-checkbox-label">{{ 'Is Default'|trans }}</span>
  984.                 </label>
  985.             </div>
  986.             <div class="uv-filters-group">
  987.                 <% _.each(filters, function(filter, key){ %>
  988.                 <div class="uv-element-block" data-filter="<%= key %>">
  989.                     <label class="uv-field-label"><%- filter.name %></label>
  990.                     <div class="uv-field-block">
  991.                         <% _.each(filter.options, function(option){ %>
  992.                         <a class="uv-btn-tag" href="#" data-id="<%= option.id %>">
  993.                             <%- option.name %>
  994.                             <span class="uv-icon-remove-dark"></span>
  995.                         </a>
  996.                         <% }); %>
  997.                     </div>
  998.                 </div>
  999.                 <% }); %>
  1000.                 <div class="uv-action-buttons">
  1001.                     <% if(id) { %>
  1002.                     <a class="uv-btn-remove"><span class="uv-icon-discard"></span>{{ 'Remove Saved Filter'|trans }}</a>
  1003.                     <% } %>
  1004.                 </div>
  1005.             </div>
  1006.             <div class="uv-action-buttons">
  1007.                 <a class="uv-btn <% if(id) { %>update-filter<% } else { %>save-filter<% } %>" href="#">
  1008.                     <% if(id) { %>
  1009.                     {{ 'Update'|trans }}
  1010.                     <% } else { %>
  1011.                     {{ 'Create'|trans }}
  1012.                     <% } %>
  1013.                 </a>
  1014.                 <a class="uv-btn back-to-filter" href="#">{{ 'Cancel'|trans }}</a>
  1015.             </div>
  1016.         </form>
  1017.     </script>
  1018.     {# Quick View Ticket View Template #}
  1019.     <script id="ticket_quick_view_tmp" type="text/template">
  1020.         <div class="uv-pull-right quick-view-navigation">
  1021.             <div class="uv-loader" style="display: none">
  1022.                 <span></span>
  1023.                 <span></span>
  1024.                 <span></span>
  1025.             </div>
  1026.             <% if(previous) { %>
  1027.             <span class="uv-btn-tag uv-icon-nav-pre" data-id="<%= previous %>">
  1028.                 </span>
  1029.             <% } else { %>
  1030.             <span class="uv-btn-tag uv-icon-nav-pre" disabled="disabled">
  1031.                 </span>
  1032.             <% } %>
  1033.             <% if(next) { %>
  1034.             <span class="uv-btn-tag uv-icon-nav-nxt"  data-id="<%= next %>">
  1035.                 </span>
  1036.             <% } else { %>
  1037.             <span class="uv-btn-tag uv-icon-nav-nxt" disabled="disabled">
  1038.                 </span>
  1039.             <% } %>
  1040.         </div>
  1041.         <span class="uv-pop-up-close"></span>
  1042.         <a href="<%= path %>"><h2>{{ 'Ticket Info'|trans }} #<%= id %></h2></a>
  1043.         <div class="uv-pop-up-body uv-inner-section">
  1044.             <div class="uv-view">
  1045.                 <div class="uv-ticket-head">
  1046.                     <div class="uv-ticket-strip">
  1047.                         <span>
  1048.                             <span class="uv-ticket-strip-label">
  1049.                                 {{ 'Timestamp'|trans }} -
  1050.                             </span>
  1051.                             <span class="uv-margin-0">
  1052.                                 <%= formatedCreatedAt %>
  1053.                             </span>
  1054.                         </span>
  1055.                         <span>
  1056.                             <span class="uv-ticket-strip-label">
  1057.                                 {{ 'By'|trans }} -
  1058.                             </span>
  1059.                             <%- createThread.user.name %>
  1060.                         </span>
  1061.                         <% if(agent) { %>
  1062.                         <span class="agent-info" style="">
  1063.                                 <span class="uv-ticket-strip-label">
  1064.                                     {{ 'Agent'|trans }} -
  1065.                                 </span>
  1066.                                 <span class="name"><%- agent.name %></span>
  1067.                             </span>
  1068.                         <% } %>
  1069.                     </div>
  1070.                     <div class="uv-ticket-strip">
  1071.                         <span class="uv-btn-tag">
  1072.                             {{ 'Priority'|trans }}
  1073.                             - <%- priority.description %>
  1074.                         </span>
  1075.                         <span class="uv-btn-tag">
  1076.                             {{ 'Status'|trans }}
  1077.                             - <%- status.description %>
  1078.                         </span>
  1079.                         <% if(lastReplyAgentName) { %>
  1080.                         <span class="uv-btn-tag">
  1081.                                 {{ 'Last Replied Agent'|trans }}
  1082.                                 - <%- lastReplyAgentName.name.split(" ")[0] %>
  1083.                             </span>
  1084.                         <% } %>
  1085.                     </div>
  1086.                 </div>
  1087.                 <div class="uv-ticket-head">
  1088.                     <h1><%- subject %></h1>
  1089.                 </div>
  1090.                 <div class="uv-ticket-section">
  1091.                     <div class="uv-ticket-main create">
  1092.                         <div class="uv-ticket-strip">
  1093.                             <span>
  1094.                                 <span class="uv-margin-0 timeago" data-timestamp="<%= createThread.timestamp %>" title="<%= createThread.formatedCreatedAt %>"><%= createThread.formatedCreatedAt %></span>
  1095.                                 - <%- createThread.user.name %>
  1096.                                 <span class="uv-ticket-strip-label">
  1097.                                     {{ 'created Ticket'|trans }}
  1098.                                 </span>
  1099.                             </span>
  1100.                         </div>
  1101.                         <div class="uv-ticket-main-lt">
  1102.                             <% if (createThread.user.smallThumbnail != null) { %>
  1103.                                 <img class='border' src="{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('') }}<%= createThread.user.smallThumbnail %>"/>
  1104.                             <% } else { %>
  1105.                                 <% if (createThread.createdBy == 'customer') { %>
  1106.                                     <img class='border' src="{{ asset(default_customer_image_path) }}"/>
  1107.                                 <% } else { %>
  1108.                                     <img class='border' src="{{ asset(default_agent_image_path) }}"/>
  1109.                                 <% } %>
  1110.                             <% } %>
  1111.                         </div>
  1112.                         <div class="uv-ticket-main-rt">
  1113.                             <% if(createThread.createdBy == 'customer') { %>
  1114.                             <a href="{{ path('helpdesk_member_manage_customer_account') }}/<%= createThread.user.id %>" class="uv-ticket-member-name">
  1115.                                 <% } else { %>
  1116.                                 <% if(createThread.user) { %>
  1117.                                 <a href="{{ path('helpdesk_member_account') }}/<%= createThread.user.id %>" class="uv-ticket-member-name">
  1118.                                     <% } else { %>
  1119.                                     <a class="uv-ticket-member-name">
  1120.                                         <% } %>
  1121.                                         <% } %>
  1122.                                         <%- createThread.user.name %>
  1123.                                     </a>
  1124.                                     <div class="message">
  1125.                                         <p>
  1126.                                             <%= createThread.reply %>
  1127.                                         </p>
  1128.                                     </div>
  1129.                                     <!-- Attachment Block -->
  1130.                                     <% if(createThread.attachments.length) { %>
  1131.                                     <div class="uv-ticket-uploads">
  1132.                                         <h4>{{ 'Uploaded Files'|trans }}</h4>
  1133.                                         <div class="uv-ticket-uploads-strip">
  1134.                                             <% _.each(createThread.attachments, function(file) { %>
  1135.                                             <a href="<%-file.downloadURL %>" target ="_blank" class="uv-ticket-uploads-brick uv-no-pointer-events" data-toggle="tooltip" title="<%- file.name %>">
  1136.                                                 <img src="<%-file.iconURL %>" class="uv-auto-pointer-events">
  1137.                                             </a>
  1138.                                             <% }) %>
  1139.                                         </div>
  1140.                                         <% if(createThread.attachments.length >1) { %>
  1141.                                         <div class="thread-attachments-zip pull-left">
  1142.                                             <div class="uv-upload-actions">
  1143.                                                 <a href="{{ path('helpdesk_member_ticket_download_attachment_zip') }}/<%= createThread.id %>" target="_blank"><span class="uv-icon-attachment"></span> {{ 'Download (as .zip)'|trans }}</a>
  1144.                                             </div>
  1145.                                         </div>
  1146.                                         <% } %>
  1147.                                     </div>
  1148.                                     <% } %>
  1149.                                     <!-- //Attachment Block -->
  1150.                         </div>
  1151.                     </div>
  1152.                     <% if(lastReply) { %>
  1153.                     <div class="uv-ticket-main">
  1154.                         <div class="uv-ticket-strip">
  1155.                                 <span>
  1156.                                     <span class="uv-margin-0 timeago" data-timestamp="<%= lastReply.timestamp %>" title="<%= lastReply.formatedCreatedAt %>"><%= lastReply.formatedCreatedAt %></span>
  1157.                                     - <%- lastReply.user.name %>
  1158.                                     <span class="uv-ticket-strip-label">
  1159.                                         {{ 'made last reply'|trans }}
  1160.                                     </span>
  1161.                                 </span>
  1162.                         </div>
  1163.                         <div class="uv-ticket-main-lt">
  1164.                             <% if (lastReply.user.smallThumbnail != null) { %>
  1165.                                 <img class='border' src="{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('') }}<%= lastReply.user.smallThumbnail %>"/>
  1166.                             <% } else { %>
  1167.                                 <% if (lastReply.createdBy == 'customer') { %>
  1168.                                     <img class='border' src="{{ asset(default_customer_image_path) }}"/>
  1169.                                 <% } else { %>
  1170.                                     <img class='border' src="{{ asset(default_agent_image_path) }}"/>
  1171.                                 <% } %>
  1172.                             <% } %>
  1173.                         </div>
  1174.                         <div class="uv-ticket-main-rt">
  1175.                             <% if(lastReply.createdBy == 'customer') { %>
  1176.                             <a href="{{ path('helpdesk_member_manage_customer_account') }}/<%= lastReply.user.id %>" class="uv-ticket-member-name">
  1177.                                 <% } else { %>
  1178.                                 <% if(lastReply.user) { %>
  1179.                                 <a href="{{ path('helpdesk_member_account') }}/<%= lastReply.user.id %>" class="uv-ticket-member-name">
  1180.                                     <% } else { %>
  1181.                                     <a class="uv-ticket-member-name">
  1182.                                         <% } %>
  1183.                                         <% } %>
  1184.                                         <%- lastReply.user.name %>
  1185.                                     </a>
  1186.                                     <div class="message">
  1187.                                         <p>
  1188.                                             <%= lastReply.reply %>
  1189.                                         </p>
  1190.                                     </div>
  1191.                                     <!-- Attachment Block -->
  1192.                                     <% if(lastReply.attachments.length) { %>
  1193.                                     <div class="uv-ticket-uploads">
  1194.                                         <h4>{{ 'Uploaded Files'|trans }}</h4>
  1195.                                         <div class="uv-ticket-uploads-strip">
  1196.                                             <% _.each(lastReply.attachments, function(file) { %>
  1197.                                             <a href="<%-file.downloadURL %>" target ="_blank" class="uv-ticket-uploads-brick uv-no-pointer-events" data-toggle="tooltip" title="<%- file.name %>">
  1198.                                                 <img src="<%-file.iconURL %>" class="uv-auto-pointer-events">
  1199.                                             </a>
  1200.                                             <% }) %>
  1201.                                         </div>
  1202.                                         <% if(lastReply.attachments.length> 1) { %>
  1203.                                         <div class="thread-attachments-zip pull-left">
  1204.                                             <div class="uv-upload-actions">
  1205.                                                 <a href="{{ path('helpdesk_member_ticket_download_attachment_zip') }}/<%= lastReply.id %>" target="_blank"><span class="uv-icon-attachment"></span> {{ 'Download (as .zip)'|trans }}</a>
  1206.                                             </div>
  1207.                                         </div>
  1208.                                         <% } %>
  1209.                                     </div>
  1210.                                     <% } %>
  1211.                                     <!-- //Attachment Block -->
  1212.                         </div>
  1213.                     </div>
  1214.                     <% } %>
  1215.                 </div>
  1216.             </div>
  1217.         </div>
  1218.     </script>
  1219.     {# Ticket List Item View Template #}
  1220.     <script id="ticket_list_item_tmp" type="text/template">
  1221.         <td class="uv-width-140 uv-no-content">
  1222.             <span class="uv-list-ticket-priority" style="<% if(priority) { %>background: <%=priority.colorCode %><% } %>;"></span>
  1223.             <label class="uv-vertical-align uv-margin-right-5">
  1224.                 <div class="uv-checkbox">
  1225.                     <input type="checkbox" class="mass-action-checkbox" value="<%= id %>"/>
  1226.                     <span class="uv-checkbox-view"></span>
  1227.                 </div>
  1228.             </label>
  1229.             <span class="uv-star <% if(isStarred) { %>uv-star-active<% } %> uv-margin-right-5"></span>
  1230.             <span data-index="source">
  1231.                 <% if(source == 'email') {  %>
  1232.                     <span class="uv-channel uv-channel-email uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="Email"></span>
  1233.                 <% } else if(source == 'facebook') {  %>
  1234.                     <span class="uv-channel uv-channel-facebook uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="Facebook"></span>
  1235.                 <% } else if(source == 'twitter') {  %>
  1236.                     <span class="uv-channel uv-channel-twitter uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="Twitter"></span>
  1237.                 <% } else if(source == 'binaka' || source == 'knock') {  %>
  1238.                     <span class="uv-channel uv-channel-binaka uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="Binaka"></span>
  1239.                 <% } else if(source == 'api') { %>
  1240.                     <span class="uv-channel uv-channel-api uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="API"></span>
  1241.                 <% } else if(source == 'formbuilder') { %>
  1242.                     <span class="uv-channel uv-channel-form-builder uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="Formbuilder"></span>
  1243.                 <% } else if(source == 'disqus-engage') { %>
  1244.                     <span class="uv-channel uv-channel-disqus-engage uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="Disqus"></span>
  1245.                 <% } else if(source == 'ebay') { %>
  1246.                     <span class="uv-channel uv-channel-ebay uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="Ebay"></span>
  1247.                 <% } else if(source == 'youtube') { %>
  1248.                     <span class="uv-channel uv-channel-youtube uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="Youtube"></span>
  1249.                 <% } else { %>
  1250.                     <span class="uv-channel uv-channel-web uv-margin-right-5" data-toggle="tooltip" data-placement="bottom" title="<%- source %>"></span>
  1251.                 <% } %>
  1252.             </span>
  1253.             <span class="uv-quick-view-trigger" data-id="<%= id %>"></span>
  1254.         </td>
  1255.         <td data-value="{{ 'ID'|trans }}" class="uv-width-100">
  1256.             <a href="<%= path %>">
  1257.                 #<%= id %>
  1258.             </a>
  1259.         </td>
  1260.         <td data-value="{{ 'Subject'|trans }}">
  1261.             <a href="<%= path %>">
  1262.                 <%- subject && subject.length <= 300 ? subject : subject.substr(0, 300) + '...'  %>
  1263.             </a>
  1264.         </td>
  1265.         <td data-value="{{ 'Customer Name'|trans }}" data-index="customer-name">
  1266.             <a href="<%= path %>">
  1267.                 <%- customer.name %>
  1268.             </a>
  1269.         </td>
  1270.         <td data-value="{{ 'Customer Email'|trans }}" data-index="customer-email">
  1271.             <a href="<%= path %>">
  1272.                 <%- customer.email %>
  1273.             </a>
  1274.         </td>
  1275.         <td data-value="{{ 'Timestamp'|trans }}" data-index="timestamp">
  1276.             <a href="<%= path %>" class="timeago" data-timestamp="<%= timestamp %>" title="<%= formatedCreatedAt %>">
  1277.                 <%= formatedCreatedAt %>
  1278.             </a>
  1279.         </td>
  1280.         <td data-value="{{ 'Last Reply'|trans }}" data-index="last-reply">
  1281.             <% if(lastReplyTime) { %>
  1282.                 <a href="<%= path %>">
  1283.                     <%= lastReplyTime %>
  1284.                 </a>
  1285.             <% } else { %>
  1286.                     {{ 'N/A'|trans }}
  1287.             <% } %>
  1288.         </td>
  1289.         <td data-value="{{ 'Group'|trans }}" data-index="group">
  1290.             <a href="<%= path %>">
  1291.                 <% if(group) { %>
  1292.                 <%- group %>
  1293.                 <% } else { %>
  1294.                 {{ 'N/A'|trans }}
  1295.                 <% } %>
  1296.             </a>
  1297.         </td>
  1298.         <td data-value="{{ 'Team'|trans }}" data-index="team">
  1299.             <a href="<%= path %>">
  1300.                 <% if(team) { %>
  1301.                 <%- team %>
  1302.                 <% } else { %>
  1303.                 {{ 'N/A'|trans }}
  1304.                 <% } %>
  1305.             </a>
  1306.         </td>
  1307.         <td data-value="{{ 'Type'|trans }}" data-index="type1">
  1308.             <a href="<%= path %>">
  1309.                 <% if(type) { %>
  1310.                 <%- type %>
  1311.                 <% } else { %>
  1312.                 {{ 'N/A'|trans }}
  1313.                 <% } %>
  1314.             </a>
  1315.         </td>
  1316.         <td data-value="{{ 'Replies'|trans }}" data-index="replies">
  1317.             <a href="<%= path %>">
  1318.                 <%= totalThreads %>
  1319.             </a>
  1320.         </td>
  1321.         <td data-value="{{ 'Agent'|trans }}" data-index="agent">
  1322.             <a href="<%= path %>">
  1323.                 <% if(agent) { %>
  1324.                 <% if(agent.smallThumbnail != null) { %>
  1325.                 <img src="{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('') }}<%= agent.smallThumbnail %>" alt=""/>
  1326.                 <% } else { %>
  1327.                 <img src="{{ asset(default_agent_image_path) }}" alt=""/>
  1328.                 <% } %>
  1329.                 <%- agent.name %>
  1330.                 <% } else { %>
  1331.                 {{ 'Unassigned'|trans }}
  1332.                 <% } %>
  1333.             </a>
  1334.         </td>
  1335.     </script>
  1336.     <script type="text/javascript">
  1337.         var isPageJustLoaded = true;
  1338.         var globalMessageResponse = "";
  1339.         var currentUserId = "{{ user_service.getCurrentUser().id }}";
  1340.         var pathToTicket = "{{ path('helpdesk_member_ticket', {'ticketId': 'replaceId' }) }}";
  1341.         $(() => {
  1342.             $('#before-filter-input').datetimepicker({
  1343.                 format: 'DD-MM-YYYY',
  1344.                 maxDate: 'now',
  1345.                 useCurrent: false,
  1346.             });
  1347.             $('#after-filter-input').datetimepicker({
  1348.                 format: 'DD-MM-YYYY',
  1349.                 maxDate: 'now',
  1350.                 useCurrent: false,
  1351.             });
  1352.             // Ticket Model
  1353.             var TicketModel = Backbone.Model.extend({
  1354.                 idAttribute: "id",
  1355.                 defaults: {
  1356.                     path: "",
  1357.                 },
  1358.                 urlRoot: "{{ path('helpdesk_member_ticket_xhr') }}"
  1359.             });
  1360.             // Ticket Label Model
  1361.             var LabelModel = Backbone.Model.extend({
  1362.                 idAttribute: "id",
  1363.                 defaults: {
  1364.                     count: 0,
  1365.                 },
  1366.                 parse: function (resp, options) {
  1367.                     return JSON.parse(resp.label);
  1368.                 },
  1369.                 urlRoot: "{{ path('helpdesk_member_ticket_label_xhr') }}"
  1370.             });
  1371.             // Ticket Quick View Model
  1372.             var TicketQuickViewModel = Backbone.Model.extend({
  1373.                 idAttribute: "id",
  1374.                 defaults: {
  1375.                     path: "",
  1376.                     isSynced: false
  1377.                 }
  1378.             });
  1379.             // Side Filter Model
  1380.             var SideFilterModel = Backbone.Model.extend({
  1381.                 updateModel: function(type,json) {
  1382.                     if(this.has(type)) {
  1383.                         context = this.get(type)
  1384.                         savedOptionsIds = [];
  1385.                         _.each(context, function (option) {
  1386.                             savedOptionsIds.push(parseInt(option.id))
  1387.                         })
  1388.                         if(jQuery.inArray(parseInt(json.id), savedOptionsIds) == -1) {
  1389.                             context.push(json);
  1390.                             this.set(type, context)
  1391.                         }
  1392.                     } else {
  1393.                         this.set(type, [json])
  1394.                     }
  1395.                 },
  1396.                 loadFilterOptions: function(data) {
  1397.                     var self = this;
  1398.                     $.ajax({
  1399.                         url : "{{ path('helpdesk_member_ticket_collection_load_filter_options_xhr') }}",
  1400.                         type : 'POST',
  1401.                         data: data,
  1402.                         dataType : 'json',
  1403.                         success : function(response) {
  1404.                             _.each(response,function(filter,key) {
  1405.                                 _.each(filter, function (item) {
  1406.                                     self.updateModel(key,item)
  1407.                                 })
  1408.                             })
  1409.                             sideFilter.render();
  1410.                         },
  1411.                         error: function (xhr) {
  1412.                             if(url = xhr.getResponseHeader('Location'))
  1413.                                 window.location = url;
  1414.                         }
  1415.                     });
  1416.                 }
  1417.             });
  1418.             // Ticket Label Collection
  1419.             var LabelCollection = Backbone.Collection.extend({
  1420.                 model: LabelModel,
  1421.                 isLabelExist: function(labelName, labelId) {
  1422.                     var flag = 1;
  1423.                     _.each(this.models, function (item) {
  1424.                         if(item.get('name').toUpperCase() == labelName.toUpperCase() && item.id != labelId)
  1425.                             flag = 0;
  1426.                     }, this);
  1427.                     return flag;
  1428.                 }
  1429.             });
  1430.             // Ticket Collection
  1431.             var TicketCollection = AppCollection.extend({
  1432.                 model: TicketModel,
  1433.                 url: "{{ path('helpdesk_member_ticket_collection_xhr') }}",
  1434.                 filterParameters: {
  1435.                     label: "",
  1436.                     new: "",
  1437.                     unassigned: "",
  1438.                     notreplied: "",
  1439.                     mine: "",
  1440.                     starred: "",
  1441.                     trashed: "",
  1442.                     label: "",
  1443.                     status: "",
  1444.                     search: "",
  1445.                     agent: "",
  1446.                     customer: "",
  1447.                     priority: "",
  1448.                     type: "",
  1449.                     group: "",
  1450.                     team: "",
  1451.                     tag: "",
  1452.                     mailbox : "",
  1453.                     source : "",
  1454.                     after: "",
  1455.                     before: "",
  1456.                     repliesLess: "",
  1457.                     repliesMore: "",
  1458.                 },
  1459.                 parseRecords: function (response, options) {
  1460.                     return response.tickets;
  1461.                 },
  1462.                 syncData: function() {
  1463.                     app.appView.showLoader();
  1464.                     $('.select-all-checkbox').prop('checked', false);
  1465.                     this.fetch({
  1466.                         data: this.getValidParameters(),
  1467.                         reset: true,
  1468.                         success: function(model, response) {
  1469.                             ticketQuickViewCollection.reset()
  1470.                             app.appView.hideLoader();
  1471.                             var ticketListView = new TicketList();
  1472.                             app.pager.paginationData = response.pagination;
  1473.                             var url = app.pager.paginationData.url;
  1474.                             if(ticketCollection.length == 0 && app.pager.paginationData.current != "0")
  1475.                                 router.navigate(url.replace('replacePage', app.pager.paginationData.last),{trigger: true});
  1476.                             else {
  1477.                                 app.pager.render();
  1478.                                 statusListDetails = response.tabs;
  1479.                                 labelDetails = response.labels;
  1480.                                 labelListView.render();
  1481.                             }
  1482.                             if (globalMessageResponse) {
  1483.                                 app.appView.renderResponseAlert(globalMessageResponse);
  1484.                             }
  1485.                             globalMessageResponse = null;
  1486.                             sideFilter.backToFilter()
  1487.                         },
  1488.                         error: function (model, xhr, options) {
  1489.                             app.appView.hideLoader();
  1490.                             if(url = xhr.getResponseHeader('Location'))
  1491.                                 window.location = url;
  1492.                         }
  1493.                     });
  1494.                 },
  1495.                 batchOperation: function(data) {
  1496.                     var self = this;
  1497.                     app.appView.showLoader();
  1498.                     $.ajax({
  1499.                         url : "{{ path('helpdesk_member_ticket_collection_mass_action_xhr') }}",
  1500.                         type : 'POST',
  1501.                         data : {data : data},
  1502.                         dataType : 'json',
  1503.                         success : function(response) {
  1504.                             app.appView.hideLoader();
  1505.                             globalMessageResponse = response;
  1506.                             self.syncData();
  1507.                         },
  1508.                         error: function (xhr) {
  1509.                             if(url = xhr.getResponseHeader('Location'))
  1510.                                 window.location = url;
  1511.                             var response = warningResponse;
  1512.                             if(xhr.responseJSON)
  1513.                                 response = xhr.responseJSON;
  1514.                             app.appView.hideLoader();
  1515.                             app.appView.renderResponseAlert(response);
  1516.                             $('.mass-action-checkbox').prop('checked', false);
  1517.                         }
  1518.                     });
  1519.                 }
  1520.             });
  1521.             // Ticket Quick View Collection
  1522.             var TicketQuickViewCollection = Backbone.Collection.extend({
  1523.                 model: TicketQuickViewModel,
  1524.                 isModelSynced: function(id) {
  1525.                     if (model = this.get(id)) {
  1526.                         if (parseInt(model.attributes.isSynced)) {
  1527.                             return model;
  1528.                         }
  1529.                     }
  1530.                     return false;
  1531.                 },
  1532.                 initialize: function() {
  1533.                     _.bindAll(this, 'getNextPrev', 'nextElement', 'previousElement');
  1534.                 },
  1535.                 getNextPrev : function(id) {
  1536.                     var data = {};
  1537.                     currentModel = ticketQuickViewCollection.get(id)
  1538.                     data['next'] = (model = this.nextElement(currentModel)) ? model.id : 0;
  1539.                     data['previous'] = (model = this.previousElement(currentModel)) ? model.id : 0;
  1540.                     return data;
  1541.                 },
  1542.                 nextElement: function(model) {
  1543.                     var index = ticketQuickViewCollection.indexOf(model);
  1544.                     if ((index + 1) === ticketQuickViewCollection.length)
  1545.                         return 0;
  1546.                     return ticketQuickViewCollection.at(index + 1);
  1547.                 },
  1548.                 previousElement: function(model) {
  1549.                     var index = ticketQuickViewCollection.indexOf(model);
  1550.                     if (index === 0 )
  1551.                         return 0;
  1552.                     return ticketQuickViewCollection.at(index - 1);
  1553.                 }
  1554.             });
  1555.             // Filter
  1556.             var Filter = app.Filter.extend({
  1557.                 defaultSortIndex: 'ticket.updatedAt',
  1558.                 sortText: "{% trans %}Sort By:{% endtrans %} ",
  1559.                 defaultSortText: "{% trans %}Sort By:{% endtrans %} {% trans %}Last Replied{% endtrans %}",
  1560.                 template : _.template($("#ticket_list_sorting_tmp").html()),
  1561.                 events : {
  1562.                     'keyup .uv-search-inline' : 'search',
  1563.                     'change .asset-visibility input[type="checkbox"]': 'filterAssetsVisibility'
  1564.                 },
  1565.                 filterAssetsVisibilityOnLoad: function() {
  1566.                     if(localStorage.getItem('assets-visibility')) {
  1567.                         var assets = JSON.parse(localStorage.getItem('assets-visibility'));
  1568.                         $.each(assets, function(asset, assetVal) {
  1569.                             if(assetVal) {
  1570.                                 $('span[data-index="' + asset + '"], td[data-index="' +asset + '"], th[data-index="' + asset + '"]').show()
  1571.                                 $('#' + asset).prop('checked', true);
  1572.                             } else {
  1573.                                 $('span[data-index="' + asset + '"], td[data-index="' +asset + '"], th[data-index="' + asset + '"]').hide()
  1574.                                 $('#' + asset).prop('checked', false);
  1575.                             }
  1576.                         })
  1577.                     }
  1578.                 },
  1579.                 filterAssetsVisibility: function(e) {
  1580.                     var assets = {};
  1581.                     $('.asset-visibility input').each(function() {
  1582.                         var asset = $(this).val();
  1583.                         if($(this).is(':checked')) {
  1584.                             assets[asset] = 1;
  1585.                             $('span[data-index="' + asset + '"], td[data-index="' + asset + '"], th[data-index="' + asset + '"]').show()
  1586.                         } else {
  1587.                             assets[asset] = 0;
  1588.                             $('span[data-index="' + asset + '"], td[data-index="' + asset + '"], th[data-index="' + asset + '"]').hide()
  1589.                         }
  1590.                     });
  1591.                     localStorage.setItem('assets-visibility', JSON.stringify(assets));
  1592.                 },
  1593.                 search : _.debounce(function(e) {
  1594.                     this.collection.reset();
  1595.                     this.collection.state.currentPage = null;
  1596.                     this.collection.filterParameters.search = Backbone.$(e.target).val();
  1597.                     var queryString = app.appView.buildQuery($.param(this.collection.getValidParameters()));
  1598.                     router.navigate(queryString,{trigger: true});
  1599.                 }, 1000)
  1600.             });
  1601.             // Side Filter View
  1602.             var SideFilter = Backbone.View.extend({
  1603.                 el: $(".uv-filter-view"),
  1604.                 isRecurrsiveCalls: 0,
  1605.                 isReadyFlag: 0,
  1606.                 appliedFilterOptions: {},
  1607.                 tempAppliedFilterOptions: {},
  1608.                 events: {
  1609.                     'change #saved-filter': 'applySavedFilter',
  1610.                     'input .uv-field-block input' : 'searchFilterOption',
  1611.                     'click .uv-dropdown-list li' : 'applyFilter',
  1612.                     'dp.change .range input': 'applyFilter',
  1613.                     'click .uv-filtered-tags .uv-btn-tag' : 'removeFilter',
  1614.                     'change .custom-filter' : 'filterByCustom',
  1615.                     'change #repliesLess-filter-input' : 'filterByRepliesLessThan',
  1616.                     'change #repliesMore-filter-input' : 'filterByRepliesMoreThan',
  1617.                     'keyup .search-custom, change .search-custom' : 'filterByCustom',
  1618.                     'click .new-saved-reply, .edit-saved-reply, .uv-filter-paper .uv-customize': 'addEditSavedReply',
  1619.                     'click .back-to-filter': 'backToFilter',
  1620.                     'click .uv-filter-edit .uv-btn-tag': 'removeSavedFilterOption',
  1621.                     'click .uv-filter-edit .save-filter, .uv-filter-edit .update-filter' : "saveSavedFilter",
  1622.                     'click .uv-filter-edit .uv-action-buttons .uv-btn-remove': 'removeSavedFilter'
  1623.                 },
  1624.                 loaderTemplate: _.template($("#loader-tmp").html()),
  1625.                 addEditSavedReplyTemplate: _.template($("#add_edit_saved_filter_tmp").html()),
  1626.                 checkOptionAvailable: function() {
  1627.                     this.isReadyFlag = 0;
  1628.                     var self = this;
  1629.                     var fetchOptions = {};
  1630.                     _.each(ticketCollection.filterParameters, function (filter,key) {
  1631.                         if(jQuery.inArray(key, ['customer','tag','label']) !== -1) {
  1632.                             if(filter != null && filter != '') {
  1633.                                 filter = filter.split(',');
  1634.                                 if(typeof fetchOptions[key] === 'undefined')
  1635.                                     fetchOptions[key] = [];
  1636.                                 savedOptionsIds = [];
  1637.                                 if(sideFilterModel.has(key)) {
  1638.                                     _.each(sideFilterModel.get(key), function (option) {
  1639.                                         savedOptionsIds.push(parseInt(option.id))
  1640.                                     })
  1641.                                 }
  1642.                                 _.each(filter, function (item) {
  1643.                                     if(jQuery.inArray(parseInt(item), savedOptionsIds) == -1) {
  1644.                                         fetchOptions[key].push(parseInt(item));
  1645.                                         self.isReadyFlag = 1;
  1646.                                     }
  1647.                                 })
  1648.                             }
  1649.                         }
  1650.                     });
  1651.                     return fetchOptions;
  1652.                 },
  1653.                 render: function() {
  1654.                     fetchOptions = this.checkOptionAvailable();
  1655.                     if(this.isReadyFlag && !this.isRecurrsiveCalls) {
  1656.                         this.isReadyFlag = 0;
  1657.                         this.isRecurrsiveCalls = 1;
  1658.                         sideFilterModel.loadFilterOptions(fetchOptions)
  1659.                     } else {
  1660.                         var appliedFilterOptions = {};
  1661.                         $('.uv-filtered-tags').html("")
  1662.                         var self = this;
  1663.                         var displayFlag = 0;
  1664.                         _.each(ticketCollection.filterParameters, function (filter, key) {
  1665.                             if(jQuery.inArray(key, ['customer', 'agent', 'priority', 'type', 'group', 'team', 'tag', 'mailbox', 'source', 'after', 'before', 'repliesLess', 'repliesMore']) !== -1) {
  1666.                                 if(filter != null && filter != '') {
  1667.                                     displayFlag = 1;
  1668.                                     filter = filter.split(',');
  1669.                                     appliedFilterOptions[key] = {'name': key.charAt(0).toUpperCase() + key.slice(1)};
  1670.                                     appliedFilterOptions[key]['options'] = [];
  1671.                                     _.each(filter, function (value) {
  1672.                                         if(key == 'after' || key == 'before' || key == 'repliesLess' || key == 'repliesMore') {
  1673.                                             $("#" + key + "-filter-input").val(filter)
  1674.                                             appliedFilterOptions[key]['options'].push({'id': filter, 'name': filter});
  1675.                                         } else {
  1676.                                             savedOptions = sideFilterModel.get(key)
  1677.                                             _.each(savedOptions, function (item) {
  1678.                                                 if(item.id == value) {
  1679.                                                     appliedFilterOptions[key]['options'].push({'id': item.id, 'name': item.name});
  1680.                                                     parent = $('#'+key+'-filter')
  1681.                                                     parent.find('.uv-filtered-tags').append("<a class='uv-btn-tag' href='#' data-id='" + item.id + "'>" + item.name + "<span class='uv-icon-remove-dark'></span></a>")
  1682.                                                     parent.find('input').val('')
  1683.                                                 }
  1684.                                             })
  1685.                                         }
  1686.                                     });
  1687.                                 }
  1688.                             } else if(jQuery.inArray(key, ['new','unassigned','notreplied','mine','starred','trashed']) !== -1) {
  1689.                                 if(filter != null && filter != '') {
  1690.                                     displayFlag = 1;
  1691.                                     appliedFilterOptions[key] = {'name': "{{ 'Label'|trans }}"};
  1692.                                     appliedFilterOptions[key]['options'] = [];
  1693.                                     var optionName = (key == 'mine') ? "{% trans %}Assigned to me{% endtrans %}" : key.charAt(0).toUpperCase() + key.slice(1);
  1694.                                     appliedFilterOptions[key]['options'].push({'id': key, 'name': optionName});
  1695.                                 } else {
  1696.                                     if(!ticketCollection.filterParameters.new && !ticketCollection.filterParameters.unassigned && !ticketCollection.filterParameters.notreplied && !ticketCollection.filterParameters.mine && !ticketCollection.filterParameters.starred && !ticketCollection.filterParameters.trashed &&! ticketCollection.filterParameters.label) {
  1697.                                         appliedFilterOptions['all'] = {'name': "{{ 'Label'|trans }}"};
  1698.                                         appliedFilterOptions['all']['options'] = [];
  1699.                                         appliedFilterOptions['all']['options'].push({'id': 1, 'name': "{{ 'All'|trans }}"});
  1700.                                     }
  1701.                                 }
  1702.                             } else if(key == 'label') {
  1703.                                 if(filter != null && filter != '') {
  1704.                                     displayFlag = 1;
  1705.                                     var labelModel = labelCollection.get(filter);
  1706.                                     appliedFilterOptions[key] = {'name': "{{ 'Label'|trans }}"};
  1707.                                     appliedFilterOptions[key]['options'] = [];
  1708.                                     if(labelModel) {
  1709.                                         appliedFilterOptions[key]['options'] = [];
  1710.                                         appliedFilterOptions[key]['options'].push({'id': labelModel.attributes.id, 'name': labelModel.attributes.name});
  1711.                                     } else {
  1712.                                         savedOptions = sideFilterModel.get(key)
  1713.                                         _.each(savedOptions, function (item) {
  1714.                                             if(item.id == filter) {
  1715.                                                 appliedFilterOptions[key]['options'].push({'id': item.id, 'name': item.name});
  1716.                                             }
  1717.                                         });
  1718.                                     }
  1719.                                 } else {
  1720.                                     if(!ticketCollection.filterParameters.new && !ticketCollection.filterParameters.unassigned && !ticketCollection.filterParameters.notreplied && !ticketCollection.filterParameters.mine && !ticketCollection.filterParameters.starred && !ticketCollection.filterParameters.trashed &&! ticketCollection.filterParameters.label) {
  1721.                                         appliedFilterOptions['all'] = {'name': "{{ 'Label'|trans }}"};
  1722.                                         appliedFilterOptions['all']['options'] = [];
  1723.                                         appliedFilterOptions['all']['options'].push({'id': 1, 'name': "{{ 'All'|trans }}"});
  1724.                                     }
  1725.                                 }
  1726.                             } else if(key == 'status') {
  1727.                                 appliedFilterOptions[key] = {'name': "{{ 'Status'|trans }}"};
  1728.                                 appliedFilterOptions[key]['options'] = []
  1729.                                 if(filter != null && filter != '' && filter != 1) {
  1730.                                     displayFlag = 1;
  1731.                                     appliedFilterOptions[key]['options'].push({'id': filter, 'name': $(".status-list li a[data-id='" + filter + "'] .name").text().trim()});
  1732.                                 } else {
  1733.                                     appliedFilterOptions[key]['options'].push({'id': 1,'name': "{{ 'Open'|trans }}"});
  1734.                                 }
  1735.                             } else if(key == 'search') {
  1736.                                 if(filter != null && filter != '') {
  1737.                                     displayFlag = 1;
  1738.                                     appliedFilterOptions[key] = {'name': "{{ 'Search Query'|trans }}"};
  1739.                                     appliedFilterOptions[key]['options'] = [];
  1740.                                     appliedFilterOptions[key]['options'].push({'id': filter, 'name': filter});
  1741.                                 }
  1742.                             } else if(key == 'custom') {
  1743.                                 if(filter != null && filter != '') {
  1744.                                     self.$el.find('[data-filter="custom"]').remove();
  1745.                                     displayFlag = 1;
  1746.                                     var realKey = key;
  1747.                                     var checkBoxStore = Array();
  1748.                                     var dataValueValueSeprator = '_';
  1749.                                     var columnSeperator = '|';
  1750.                                     var multiOptions = filter.split(columnSeperator);
  1751.                                     var multiKeyValue, multiKeyValueValue, ele, newEle;
  1752.                                     _.each(multiOptions, function(valueData, indexData) {
  1753.                                         if(!valueData)
  1754.                                             return;
  1755.                                         multiKeyValue = valueData.split(dataValueValueSeprator);
  1756.                                         multiKeyValueValue = multiKeyValue[1].split(',');
  1757.                                         eleSelector = '[data-value="' + multiKeyValue[0] + '"]';
  1758.                                         ele = $(eleSelector);
  1759.                                         if(ele[0].type == 'radio') {
  1760.                                             var dataValue = multiKeyValue[0];
  1761.                                             name = ele.parents('.uv-element-block:not(.radio)').find('label:first').text().trim()
  1762.                                             value =  $(eleSelector + '[value="' + multiKeyValue[1] + '"]').parent().next().text();
  1763.                                             appliedFilterOptions['z-'+dataValue] = {'name': name, 'type': 'radio'};
  1764.                                             appliedFilterOptions['z-'+dataValue]['options'] = [];
  1765.                                             appliedFilterOptions['z-'+dataValue]['options'].push({'id': multiKeyValue[1], 'name': value});
  1766.                                         } else if(ele[0].type == 'checkbox') {
  1767.                                             var dataValue = multiKeyValue[0];
  1768.                                             if($.inArray(dataValue, checkBoxStore) >= 0)
  1769.                                                 return;
  1770.                                             checkBoxStore.push(dataValue);
  1771.                                             name = ele.parents('.uv-element-block:not(.checkbox)').find('label:first').text().trim()
  1772.                                             appliedFilterOptions['z-'+dataValue] = {'name': name, 'type': 'checkbox'};
  1773.                                             appliedFilterOptions['z-'+dataValue]['options'] = [];
  1774.                                             var optionName, optionValue;
  1775.                                             _.each(multiKeyValueValue, function(value) {
  1776.                                                 newEle = $(eleSelector + '[value="' + value + '"]')
  1777.                                                 optionValue = dataValue + dataValueValueSeprator + newEle.val();
  1778.                                                 optionName = newEle.parent().next().text();
  1779.                                                 if(optionValue && optionName) {
  1780.                                                     appliedFilterOptions['z-'+dataValue]['options'].push({'id': value, 'name': optionName});
  1781.                                                 }
  1782.                                             });
  1783.                                         } else if(ele[0].type == 'select-multiple') {
  1784.                                             var dataValue = multiKeyValue[0];
  1785.                                             filter = multiKeyValueValue;
  1786.                                             key = ele.attr('id');
  1787.                                             name = ele.parents('.uv-element-block').find('label:first').text().trim()
  1788.                                             appliedFilterOptions['z-'+dataValue] = {'name': name, 'type': 'select-multiple'};
  1789.                                             appliedFilterOptions['z-'+dataValue]['options'] = [];
  1790.                                             _.each(filter, function (value) {
  1791.                                                 var optionName;
  1792.                                                 if(optionName = $("#"+key+" option[value='" + value + "']").text()) {
  1793.                                                     appliedFilterOptions['z-'+dataValue]['options'].push({'id': value, 'name': optionName});
  1794.                                                 }
  1795.                                             });
  1796.                                         } else if(ele[0].type == 'text' || ele[0].type == 'number') {
  1797.                                             filter = multiKeyValue[1];
  1798.                                             if(filter != null && filter != '') {
  1799.                                                 filter = filter.replace(/\+/g,' ');
  1800.                                                 displayFlag = 1;
  1801.                                                 var dataValue = ele.attr('data-value');
  1802.                                                 name = ele.parents('.uv-element-block').find('label:first').text().trim()
  1803.                                                 appliedFilterOptions['z-'+dataValue] = {'name': name, 'type': ele[0].type};
  1804.                                                 appliedFilterOptions['z-'+dataValue]['options'] = [];
  1805.                                                 appliedFilterOptions['z-'+dataValue]['options'].push({'id': 1, 'name': filter});
  1806.                                             }
  1807.                                         }
  1808.                                     })
  1809.                                 }
  1810.                             }
  1811.                             if('after' == key || 'before' == key || 'repliesLess' == key || 'repliesMore' == key) {
  1812.                                 $('#'+ key +'-filter-input').val(filter);
  1813.                             }
  1814.                         })
  1815.                         if(displayFlag) {
  1816.                             self.$el.find('.uv-filter-options .uv-action-buttons').html("")
  1817.                             if($("#saved-filter").val() != null && $("#saved-filter").val() != '' && Backbone.history.getFragment() == userFilters[$("#saved-filter").val()]['route']) {
  1818.                                 self.$el.find('.uv-filter-options .uv-action-buttons').append("<a class='uv-btn edit-saved-reply' href='#'>{{ 'Edit'|trans }}</a>").show();
  1819.                                 $('.uv-filter-paper .uv-customize').show()
  1820.                             } else {
  1821.                                 self.$el.find('.uv-filter-options .uv-action-buttons').append("<a class='uv-btn new-saved-reply' href='#'>{{ 'New'|trans }}</a>").show();
  1822.                                 if($("#saved-filter").val() != null && $("#saved-filter").val() != '') {
  1823.                                     self.$el.find('.uv-filter-options .uv-action-buttons').append("<a class='uv-btn edit-saved-reply' href='#'>{{ 'Update'|trans }}</a>").show();
  1824.                                     $('.uv-filter-paper .uv-customize').show()
  1825.                                 } else {
  1826.                                     $('.uv-filter-paper .uv-customize').hide()
  1827.                                 }
  1828.                             }
  1829.                         } else {
  1830.                             $('.uv-filter-paper .uv-customize').hide()
  1831.                         }
  1832.                         this.appliedFilterOptions = appliedFilterOptions;
  1833.                         this.tempAppliedFilterOptions = jQuery.extend(true, {}, appliedFilterOptions);
  1834.                     }
  1835.                 },
  1836.                 searchFilterOption: function(e) {
  1837.                     self = this;
  1838.                     currentElement = Backbone.$(e.currentTarget);
  1839.                     dropdown = currentElement.siblings('.uv-dropdown-list');
  1840.                     var filterType =  currentElement.attr('data-filter-type');
  1841.                     if(jQuery.inArray(filterType, ['customer', 'tag']) !== -1) {
  1842.                         self.searchFilterXhr(currentElement);
  1843.                     }
  1844.                 },
  1845.                 searchFilterXhr: _.debounce(function(currentElement) {
  1846.                     var parent = currentElement.parent();
  1847.                     if($('.uv-dropdown-other.uv-dropdown-btn-active').parent().attr('id') != parent.attr('id'))
  1848.                         return;
  1849.                     parent.find("li:not(.uv-no-results, .uv-filter-info)").remove();
  1850.                     parent.find(".uv-filter-info").show()
  1851.                     if(currentElement.val().length > 1) {
  1852.                         parent.append(this.loaderTemplate())
  1853.                         parent.find('.uv-filter-info').text("{% trans %}Searching{% endtrans %} ...")
  1854.                         if(self.xhrReq)
  1855.                             self.xhrReq.abort();
  1856.                         self.xhrReq = $.ajax({
  1857.                             url : "{{ path('helpdesk_member_ticket_collection_search_filter_options_xhr') }}",
  1858.                             type : 'GET',
  1859.                             data: {"type" : currentElement.attr('data-filter-type'), "query" : currentElement.val(), 'not' : ticketCollection.filterParameters[currentElement.attr('data-filter-type')]},
  1860.                             dataType : 'json',
  1861.                             success : function(response) {
  1862.                                 self.xhrReq = 0;
  1863.                                 parent.find('.uv-loader').remove()
  1864.                                 parent.find('.uv-filter-info').text("{{ 'Type atleast 2 letters'|trans }}").hide();
  1865.                                 if(response.length == 0) {
  1866.                                     parent.find('.uv-no-results').show()
  1867.                                 } else {
  1868.                                     parent.find('.uv-no-results').hide();
  1869.                                     _.each(response, function(item) {
  1870.                                         if(currentElement.attr('data-filter-type') == 'customer') {
  1871.                                             var img = item.smallThumbnail ? "{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('') }}"+item.smallThumbnail : "{{ asset(default_customer_image_path)}}";
  1872.                                             parent.find('.uv-dropdown-list ul').append("<li data-id='" + item.id + "'><img src='" + img + "'/>" + item.name + "</li>")
  1873.                                         } else
  1874.                                             parent.find('.uv-dropdown-list ul').append("<li data-id='" + item.id + "'>" + item.name + "</li>")
  1875.                                     });
  1876.                                 }
  1877.                             },
  1878.                             error: function (xhr) {
  1879.                                 self.xhrReq = 0;
  1880.                                 parent.find('.uv-loader').remove()
  1881.                                 parent.find('.uv-no-results').hide();
  1882.                                 parent.find('.uv-filter-info').text("{{ 'Type atleast 2 letters'|trans }}").show();
  1883.                                 if(url = xhr.getResponseHeader('Location'))
  1884.                                     window.location = url;
  1885.                             }
  1886.                         });
  1887.                     } else {
  1888.                         parent.find('.uv-no-results').hide();
  1889.                     }
  1890.                 },1000),
  1891.                 applySavedFilter: function(e) {
  1892.                     var element = Backbone.$(e.currentTarget);
  1893.                     if(element.val() != "") {
  1894.                         var element = Backbone.$(e.currentTarget);
  1895.                         router.navigate(userFilters[element.val()]['route'], {trigger: true});
  1896.                     } else {
  1897.                         router.navigate('', {trigger: true});
  1898.                     }
  1899.                 },
  1900.                 applyFilter: function(e) {
  1901.                     currentElement = Backbone.$(e.currentTarget);
  1902.                     if(currentElement.attr("data-id")) {
  1903.                         var flag = 1;
  1904.                         parent = currentElement.parents(".uv-field-block");
  1905.                         filterType = parent.find('input').attr('data-filter-type');
  1906.                         if(filterType == "customer" || filterType == 'tag') {
  1907.                             sideFilterModel.updateModel(filterType, {'id': currentElement.attr('data-id'), 'name': currentElement.text()})
  1908.                             parent.find(".uv-no-results").hide()
  1909.                             parent.find(".uv-filter-info").show().text("{{ 'Type atleast 2 letters'|trans }}")
  1910.                             parent.find("li:not(.uv-no-results, .uv-filter-info)").remove();
  1911.                         } else {
  1912.                             if(ticketCollection.filterParameters[filterType]) {
  1913.                                 ids = ticketCollection.filterParameters[filterType].split(',')
  1914.                                 if(jQuery.inArray(currentElement.attr('data-id'), ids) !== -1)
  1915.                                     flag = 0;
  1916.                             }
  1917.                         }
  1918.                         parent.find('input').val('')
  1919.                         if(jQuery.inArray(filterType, ['agent', 'priority', 'type', 'group', 'team', 'mailbox', 'source']) !== -1) {
  1920.                             parent.find("li:not(.uv-no-results)").show()
  1921.                         }
  1922.                         if(flag) {
  1923.                             parent.find('.uv-filtered-tags').append("<a class='uv-btn-tag' href='#' data-id='" + currentElement.attr('data-id') + "'>"+currentElement.text()+"<span class='uv-icon-remove-dark'></span></a>")
  1924.                             ticketCollection.state.order = null;
  1925.                             ticketCollection.state.sortKey = null;
  1926.                             ticketCollection.state.currentPage = null;
  1927.                             ticketCollection.filterParameters[filterType] = this.joinTagValues(parent.find(".uv-filtered-tags"));
  1928.                             var queryString = app.appView.buildQuery($.param(ticketCollection.getValidParameters()));
  1929.                             router.navigate(queryString, {trigger: true});
  1930.                         }
  1931.                     } else {
  1932.                         filterType = currentElement.attr('data-filter-type');
  1933.                         if(filterType == 'before' || filterType == "after") {
  1934.                             ticketCollection.state.order = null;
  1935.                             ticketCollection.state.sortKey = null;
  1936.                             ticketCollection.state.currentPage = null;
  1937.                             ticketCollection.filterParameters[filterType] = currentElement.val();
  1938.                             var queryString = app.appView.buildQuery($.param(ticketCollection.getValidParameters()));
  1939.                             router.navigate(queryString, {trigger: true});
  1940.                         }
  1941.                     }
  1942.                 },
  1943.                 removeFilter: function(e) {
  1944.                     e.preventDefault()
  1945.                     currentElement = Backbone.$(e.currentTarget);
  1946.                     filterType = currentElement.parents('.uv-field-block').find('input').attr('data-filter-type')
  1947.                     var options = ticketCollection.filterParameters[filterType];
  1948.                     options = options.split(',');
  1949.                     var index = options.indexOf(currentElement.attr('data-id'));
  1950.                     options.splice(index, 1);
  1951.                     ticketCollection.state.order = null;
  1952.                     ticketCollection.state.sortKey = null;
  1953.                     ticketCollection.state.currentPage = null;
  1954.                     ticketCollection.filterParameters[filterType] = options.join(',');
  1955.                     currentElement.remove()
  1956.                     var queryString = app.appView.buildQuery($.param(ticketCollection.getValidParameters()));
  1957.                     router.navigate(queryString, {trigger: true});
  1958.                 },
  1959.                 joinTagValues: function(parent) {
  1960.                     var ids = new Array();
  1961.                     parent.find('.uv-btn-tag').each(function() {
  1962.                         ids.push($(this).attr('data-id'))
  1963.                     });
  1964.                     return ids.join();
  1965.                 },
  1966.                 filterByRepliesMoreThan: _.debounce(function(e) {
  1967.                     ticketCollection.state.order = null;
  1968.                     ticketCollection.state.sortKey = null;
  1969.                     ticketCollection.state.currentPage = null;
  1970.                     ticketCollection.filterParameters.repliesMore = $(e.target).val();
  1971.                     var queryString = app.appView.buildQuery($.param(ticketCollection.getValidParameters()));
  1972.                     router.navigate(queryString, { trigger: true });
  1973.                 }, 1000),
  1974.                 filterByRepliesLessThan: _.debounce(function(e) {
  1975.                     ticketCollection.state.order = null;
  1976.                     ticketCollection.state.sortKey = null;
  1977.                     ticketCollection.state.currentPage = null;
  1978.                     ticketCollection.filterParameters.repliesLess = $(e.target).val();
  1979.                     var queryString = app.appView.buildQuery($.param(ticketCollection.getValidParameters()));
  1980.                     router.navigate(queryString, { trigger: true });
  1981.                 }, 1000),
  1982.                 filterByCustom: _.debounce(function(e) {
  1983.                     var custom = '';
  1984.                     var checkBoxStore = Array();
  1985.                     var indexValueSeperator = '_';
  1986.                     var columnSeperator = '|';
  1987.                     Backbone.$('.custom-filter').each(function(){
  1988.                         if($(this).context.type == 'radio' && $(this).is(':checked')) {
  1989.                             custom += $(this).attr('data-value') + indexValueSeperator + $(this).val() + columnSeperator;
  1990.                         } else if($(this).context.type == 'checkbox' && $(this).is(':checked')) {
  1991.                             var checkboxValue = Array();
  1992.                             var dataValue = $(this).attr('data-value');
  1993.                             if($.inArray(dataValue, checkBoxStore) >= 0)
  1994.                                 return;
  1995.                             $.each($('[data-value="'+ dataValue +'"]:checked'), function() {
  1996.                                 checkboxValue.push($(this).val());
  1997.                             });
  1998.                             checkBoxStore.push(dataValue);
  1999.                             custom += dataValue + indexValueSeperator + checkboxValue.join() + columnSeperator;
  2000.                         } else if($(this).context.type == 'select-multiple' && $(this).val()) {
  2001.                             custom += $(this).attr('data-value') + indexValueSeperator + $(this).val().join() + columnSeperator;
  2002.                         }
  2003.                     })
  2004.                     Backbone.$('.search-custom').each(function(){
  2005.                         if($(this).val()){
  2006.                             custom += $(this).attr('data-value') + indexValueSeperator + $(this).val() + columnSeperator;
  2007.                         }
  2008.                     })
  2009.                     custom = custom.replace(/\|$/, '');
  2010.                     ticketCollection.state.order = null;
  2011.                     ticketCollection.state.sortKey = null;
  2012.                     ticketCollection.state.currentPage = null;
  2013.                     ticketCollection.filterParameters.custom = custom;
  2014.                     var queryString = app.appView.buildQuery($.param(ticketCollection.getValidParameters()));
  2015.                     router.navigate(queryString,{trigger: true});
  2016.                 }, 1000),
  2017.                 backToFilter: function(e) {
  2018.                     if(e)
  2019.                         e.preventDefault()
  2020.                     this.$el.find('.uv-filter-options').show()
  2021.                     this.$el.find('.uv-filter-edit').hide()
  2022.                 },
  2023.                 addEditSavedReply: function(e) {
  2024.                     e.preventDefault()
  2025.                     var context = {};
  2026.                     this.tempAppliedFilterOptions = jQuery.extend(true, {}, this.appliedFilterOptions);
  2027.                     if(Backbone.$(e.currentTarget).is('.new-saved-reply')) {
  2028.                         context = {'id': 0, 'name': '', 'is_default': 0, 'filters': this.tempAppliedFilterOptions};
  2029.                     } else {
  2030.                         context = userFilters[$("#saved-filter").val()];
  2031.                         context.filters = this.tempAppliedFilterOptions;
  2032.                         userFilters[$("#saved-filter").val()]
  2033.                     }
  2034.                     $('.uv-filter-edit').html('')
  2035.                     $('.uv-filter-edit').append(this.addEditSavedReplyTemplate(context));
  2036.                     this.$el.find('.uv-filter-options').hide()
  2037.                     this.$el.find('.uv-filter-edit').show()
  2038.                 },
  2039.                 removeSavedFilterOption: function(e) {
  2040.                     e.preventDefault()
  2041.                     var parent = Backbone.$(e.currentTarget).parents('.uv-element-block');
  2042.                     var elementIndex = Backbone.$(e.currentTarget).index();
  2043.                     var filterType = parent.attr('data-filter');
  2044.                     var filterId = Backbone.$(e.currentTarget).attr('data-id');
  2045.                     delete this.tempAppliedFilterOptions[filterType]['options'][elementIndex]
  2046.                     Backbone.$(e.currentTarget).remove()
  2047.                     if(!parent.find('.uv-btn-tag').length) {
  2048.                         parent.remove()
  2049.                         delete this.tempAppliedFilterOptions[filterType];
  2050.                     }
  2051.                     if(this.getSavedFilterRoute() == '') {
  2052.                         this.backToFilter();
  2053.                     }
  2054.                 },
  2055.                 saveSavedFilter: function(e) {
  2056.                     e.preventDefault()
  2057.                     if(Backbone.$(e.currentTarget).hasClass('save-filter'))
  2058.                         this.saveFilterAjax('POST')
  2059.                     else {
  2060.                         this.saveFilterAjax('PUT')
  2061.                     }
  2062.                 },
  2063.                 saveFilterAjax: function(method) {
  2064.                     var inputElement = $('.uv-filter-edit input.name');
  2065.                     inputElement.removeClass('uv-field-error');
  2066.                     $('.uv-field-message').remove()
  2067.                     if(inputElement.val() != undefined && inputElement.val() == '') {
  2068.                         inputElement.addClass('uv-field-error');
  2069.                         inputElement.parent().after("<span class='uv-field-message'>{{ 'This field is mandatory'|trans }}</span>");
  2070.                     } else {
  2071.                         var data = $('.uv-filter-edit form').serializeObject();
  2072.                         data['route'] = this.getSavedFilterRoute();
  2073.                         app.appView.showLoader();
  2074.                         self = this;
  2075.                         $.ajax({
  2076.                             url : "{{ path('helpdesk_member_saved_filters_xhr') }}",
  2077.                             type : method,
  2078.                             data: data,
  2079.                             dataType : 'json',
  2080.                             success : function(response) {
  2081.                                 app.appView.hideLoader();
  2082.                                 userFilters[response.filter.id] = response.filter;
  2083.                                 $("#saved-filter").html("<option value=''>-- {{ 'Saved Filter'|trans }} --</option>")
  2084.                                 _.each(userFilters, function(filter, key) {
  2085.                                     if(response.filter.is_default && filter.id != response.filter.id)
  2086.                                         userFilters[key]['is_default'] = 0;
  2087.                                     var selected = '';
  2088.                                     if(response.filter.id == filter.id)
  2089.                                         selected = "selected";
  2090.                                     $("#saved-filter").append("<option value='" + filter.id + "' selected='" + selected + "''>" + filter.name + "</option>")
  2091.                                 })
  2092.                                 $("#saved-filter").val(response.filter.id)
  2093.                                 app.appView.renderResponseAlert(response);
  2094.                                 self.render();
  2095.                                 self.backToFilter();
  2096.                             },
  2097.                             error: function (xhr) {
  2098.                                 app.appView.hideLoader();
  2099.                                 if(url = xhr.getResponseHeader('Location'))
  2100.                                     window.location = url;
  2101.                             }
  2102.                         });
  2103.                     }
  2104.                 },
  2105.                 getSavedFilterRoute: function() {
  2106.                     var filterParameters = {};
  2107.                     temp = [];
  2108.                     _.each(this.tempAppliedFilterOptions, function (filter, key) {
  2109.                         if(jQuery.inArray(key, ['customer', 'agent', 'priority', 'type', 'group', 'team', 'tag', 'mailbox', 'source', 'after', 'before', 'repliesLess', 'repliesMore']) !== -1) {
  2110.                             var ids = [];
  2111.                             _.each(filter['options'], function (item) {
  2112.                                 ids.push(item.id)
  2113.                             });
  2114.                             filterParameters[key] = ids.join(',')
  2115.                         } else if(jQuery.inArray(key, ['new','unassigned','notreplied','mine','starred','trashed']) !== -1) {
  2116.                             filterParameters[key] = 1;
  2117.                         } else if(jQuery.inArray(key, ['label', 'status', 'search']) !== -1) {
  2118.                             _.each(filter['options'], function (item) {
  2119.                                 filterParameters[key] = item.id;
  2120.                             });
  2121.                         } else {
  2122.                             custom = key.split("z-")
  2123.                             tempKey = custom[1];
  2124.                             if(filter.type == 'text' || filter.type == 'number') {
  2125.                                 _.each(filter['options'], function (item) {
  2126.                                     temp.push(tempKey + '_' + item.name)
  2127.                                 });
  2128.                             } else if(filter.type == 'radio') {
  2129.                                 var ids = [];
  2130.                                 _.each(filter['options'], function (item) {
  2131.                                     ids.push(item.id)
  2132.                                 });
  2133.                                 temp.push(tempKey + '_' + ids.join(','))
  2134.                             } else if(filter.type == 'checkbox' || filter.type == 'select-multiple') {
  2135.                                 var ids = [];
  2136.                                 _.each(filter['options'], function (item) {
  2137.                                     ids.push(item.id)
  2138.                                 });
  2139.                                 temp.push(tempKey + '_' + ids.join(','))
  2140.                             }
  2141.                         }
  2142.                     })
  2143.                     if(temp.length)
  2144.                         filterParameters['custom'] = temp.join('|');
  2145.                     return app.appView.buildQuery($.param(filterParameters));
  2146.                 },
  2147.                 removeSavedFilter: function(e) {
  2148.                     e.preventDefault()
  2149.                     self = this;
  2150.                     app.appView.showLoader();
  2151.                     $.ajax({
  2152.                         url : "{{ path('helpdesk_member_saved_filters_xhr') }}/" + $("#saved-filter").val(),
  2153.                         type : 'DELETE',
  2154.                         dataType : 'json',
  2155.                         success : function(response) {
  2156.                             app.appView.hideLoader();
  2157.                             delete userFilters[$("#saved-filter").val()];
  2158.                             $("#saved-filter").html("<option value=''>-- {{ 'Saved Filter'|trans }} --</option>")
  2159.                             _.each(userFilters, function(filter, key) {
  2160.                                 $("#saved-filter").append("<option value='" + filter.id + "'>" + filter.name + "</option>")
  2161.                             })
  2162.                             $("#saved-filter").val('')
  2163.                             app.appView.renderResponseAlert(response);
  2164.                             self.render();
  2165.                             self.backToFilter();
  2166.                         },
  2167.                         error: function (xhr) {
  2168.                             app.appView.hideLoader();
  2169.                             if(url = xhr.getResponseHeader('Location'))
  2170.                                 window.location = url;
  2171.                         }
  2172.                     });
  2173.                 }
  2174.             });
  2175.             // Ticket Label Item View
  2176.             var LabelItemView = Backbone.View.extend({
  2177.                 tagName: 'li',
  2178.                 className: 'uv-customize-wrapper',
  2179.                 template: _.template($("#custom_label_tmp").html()),
  2180.                 events: {
  2181.                     'click .delete': 'confirmRemove',
  2182.                     'click .label-color.dropdown .fa-caret-down' : 'showUpdateLabelPopup'
  2183.                 },
  2184.                 render: function() {
  2185.                     this.$el.html(this.template(this.model.toJSON()));
  2186.                     if (ticketCollection.filterParameters.label != '') {
  2187.                         if (ticketCollection.filterParameters.label == this.model.id) {
  2188.                             this.$el.find('a').addClass('uv-aside-active');
  2189.                         }
  2190.                     }
  2191.                     return this;
  2192.                 }
  2193.             });
  2194.             // Ticket List Item View
  2195.             var TicketItem = Backbone.View.extend({
  2196.                 tagName: "tr",
  2197.                 template: _.template($("#ticket_list_item_tmp").html()),
  2198.                 events: {
  2199.                     'click .uv-star': "updateStar",
  2200.                 },
  2201.                 render: function () {
  2202.                     this.model.set({
  2203.                         path: pathToTicket.replace('replaceId', this.model.attributes.id)
  2204.                     });
  2205.                     this.$el.html(this.template(this.model.toJSON()));
  2206.                     if (this.model.attributes.isAgentView != true) {
  2207.                         this.$el.addClass('unread')
  2208.                     }
  2209.                     if (!this.model.attributes.agent) {
  2210.                         this.$el.addClass('not-assigned')
  2211.                     }
  2212.                     return this;
  2213.                 },
  2214.                 updateStar: function(e) {
  2215.                     e.preventDefault();
  2216.                     if (Backbone.$(e.currentTarget).hasClass('uv-star-active')) {
  2217.                         Backbone.$(e.currentTarget).removeClass('uv-star-active');
  2218.                     } else {
  2219.                         Backbone.$(e.currentTarget).addClass('uv-star-active');
  2220.                     }
  2221.                     this.model.save({
  2222.                         id: this.model.id
  2223.                     }, {
  2224.                         patch: true,
  2225.                         url: "{{ path('helpdesk_member_bookmark_ticket_xhr') }}",
  2226.                         success: function (model, response, options) {},
  2227.                         error: function (model, xhr, options) {
  2228.                             if (url = xhr.getResponseHeader('Location')) {
  2229.                                 window.location = url;
  2230.                             }
  2231.                         }
  2232.                     });
  2233.                 }
  2234.             });
  2235.             // Ticket List View
  2236.             var TicketList = Backbone.View.extend({
  2237.                 el: $(".uv-table table"),
  2238.                 initialize: function() {
  2239.                     this.render();
  2240.                 },
  2241.                 events: {
  2242.                     'change .mass-action-checkbox' : 'showBulkOptions',
  2243.                 },
  2244.                 showBulkOptions: function() {
  2245.                     var count = 0;
  2246.                     this.$el.find('.mass-action-checkbox').each(function() {
  2247.                         if ($(this).is(':checked')) {
  2248.                             count++;
  2249.                         }
  2250.                     });
  2251.                     if (count == $('.mass-action-checkbox').length) {
  2252.                         $('.select-all-checkbox').prop('checked', true);
  2253.                     } else {
  2254.                         $('.select-all-checkbox').prop('checked', false);
  2255.                     }
  2256.                     if (count) {
  2257.                         $('.uv-action-bar .filter').parent().hide();
  2258.                         $('.uv-action-bar .mass-action').parent().addClass("uv-width-100").show();
  2259.                         $('.uv-action-bar-col-rt').hide()
  2260.                     } else {
  2261.                         $('.uv-action-bar .mass-action').parent().removeClass("uv-width-100").hide();
  2262.                         $('.uv-action-bar .filter').parent().show();
  2263.                         $('.uv-action-bar-col-rt').show();
  2264.                     }
  2265.                 },
  2266.                 render: function () {
  2267.                     this.$el.find('tbody').html('');
  2268.                     if (ticketCollection.length) {
  2269.                         $('.select-all-checkbox').prop( "disabled", false );
  2270.                         _.each(ticketCollection.models, function (item) {
  2271.                             ticketQuickViewCollection.add(new TicketQuickViewModel({id: item.id}))
  2272.                             this.renderTicket(item);
  2273.                         }, this);
  2274.                     } else {
  2275.                         $('.select-all-checkbox').prop( "disabled", true );
  2276.                         this.$el.find('tbody').append("<tr style='text-align: center;'><td colspan='11'>{% trans %}No Record Found{% endtrans %}</td></tr>")
  2277.                     }
  2278.                     filter.filterAssetsVisibilityOnLoad()
  2279.                     app.appView.relativeTime()
  2280.                 },
  2281.                 renderTicket: function (item) {
  2282.                     var ticketItem = new TicketItem({
  2283.                         model: item
  2284.                     });
  2285.                     this.$el.find('tbody').append(ticketItem.render().el);
  2286.                 }
  2287.             });
  2288.             // Ticket Label List View
  2289.             var LabelListView = Backbone.View.extend({
  2290.                 el: $(".uv-aside"),
  2291.                 template: _.template($("#predefined_label_tmp").html()),
  2292.                 statusTemplate: _.template($("#ticket_status_list_tmp").html()),
  2293.                 addEditLabelTemplate: _.template($("#add_edit_label_tmp").html()),
  2294.                 events: {
  2295.                     'click .status-list li a': "filterByStatus",
  2296.                     'click .add-new-label, .uv-customize': 'addEditLabel',
  2297.                     'click #back-to-labels': 'backToLabels',
  2298.                     'click .uv-color-block': 'setLabelColor',
  2299.                     'click .add-update-btn': 'saveLabel',
  2300.                     'click .uv-add-edit-label .uv-btn-remove': 'removeLabel'
  2301.                 },
  2302.                 render: function() {
  2303.                     var active = "";
  2304.                     if (ticketCollection.filterParameters.new != '') {
  2305.                         active = "new";
  2306.                     } else if (ticketCollection.filterParameters.unassigned != '') {
  2307.                         active = "unassigned";
  2308.                     } else if (ticketCollection.filterParameters.notreplied != '') {
  2309.                         active = "notreplied";
  2310.                     }
  2311.                     if (ticketCollection.filterParameters.mine != '') {
  2312.                         active = "mine";
  2313.                     } else if (ticketCollection.filterParameters.starred != '') {
  2314.                         active = "starred";
  2315.                     } else if (ticketCollection.filterParameters.trashed != '') {
  2316.                         active = "trashed";
  2317.                     } else if (ticketCollection.filterParameters.label != '') {
  2318.                         active = "label";
  2319.                     }
  2320.                     var data = {
  2321.                         'labelDetails' : labelDetails,
  2322.                         'active' : active
  2323.                     }
  2324.                     this.$el.find('.predefined-label-list').html(this.template(data));
  2325.                     labelCollection.reset();
  2326.                     labelCollection.set(labelDetails.custom);
  2327.                     this.updateMassLabelList()
  2328.                 },
  2329.                 updateMassLabelList: function() {
  2330.                     this.$el.find('.uv-aside-custom').html('');
  2331.                     var labelOptionHtml = "";
  2332.                     if(labelCollection.length) {
  2333.                         _.each(labelCollection.models, function (item) {
  2334.                             this.renderLabelItem(item);
  2335.                             labelOptionHtml = labelOptionHtml + "<li data-index='" + item.id + "'><a href='#'>" + item.attributes.name + "</a></li>";
  2336.                         }, this);
  2337.                     }
  2338.                     labelOptionHtml = labelOptionHtml ? labelOptionHtml : "<li data-index='0'>{{ 'No Label Created'|trans }}</li>";
  2339.                     $(".mass-action ul.label").html(labelOptionHtml);
  2340.                     this.renderStatus();
  2341.                 },
  2342.                 renderLabelItem : function (item) {
  2343.                     var labelItem = new LabelItemView({
  2344.                         model: item
  2345.                     });
  2346.                     this.$el.find('.uv-aside-custom').append(labelItem.render().el);
  2347.                 },
  2348.                 renderStatus : function() {
  2349.                     if(typeof ticketCollection.filterParameters.status == "undefined" || ticketCollection.filterParameters.status == null)
  2350.                         var active = 0;
  2351.                     else
  2352.                         var active = ticketCollection.filterParameters.status;
  2353.                     this.$el.find('.uv-aside-active').parent().find('.status-list').remove()
  2354.                     this.$el.find('.uv-aside-active').parent().append(this.statusTemplate({status : statusListDetails, active : active}));
  2355.                 },
  2356.                 filterByStatus : function(e) {
  2357.                     e.preventDefault()
  2358.                     ticketCollection.reset();
  2359.                     ticketCollection.state.order = null;
  2360.                     ticketCollection.state.sortKey = null;
  2361.                     ticketCollection.state.currentPage = null;
  2362.                     ticketCollection.filterParameters.status = Backbone.$(e.currentTarget).attr('data-id');
  2363.                     var queryString = app.appView.buildQuery($.param(ticketCollection.getValidParameters()));
  2364.                     router.navigate(queryString, {trigger: true});
  2365.                 },
  2366.                 addEditLabel: function(e) {
  2367.                     e.preventDefault()
  2368.                     currentElement = Backbone.$(e.currentTarget);
  2369.                     if(currentElement.hasClass('add-new-label'))
  2370.                         $('.uv-add-edit-label').html(this.addEditLabelTemplate({id : 0, name : '', colorCode: ''}))
  2371.                     else
  2372.                         $('.uv-add-edit-label').html(this.addEditLabelTemplate(labelCollection.get(currentElement.siblings('a').attr('data-id')).toJSON()))
  2373.                     $('.uv-aside-default').hide()
  2374.                     $('.uv-add-edit-label').show()
  2375.                 },
  2376.                 backToLabels: function(e) {
  2377.                     if(e)
  2378.                         e.preventDefault()
  2379.                     $('.uv-aside-default').show()
  2380.                     $('.uv-add-edit-label').hide()
  2381.                 },
  2382.                 setLabelColor: function(e) {
  2383.                     $('.uv-color-block').removeClass('uv-color-active');
  2384.                     Backbone.$(e.currentTarget).addClass('uv-color-active');
  2385.                 },
  2386.                 saveLabel : function(e) {
  2387.                     e.preventDefault()
  2388.                     var inputElement = $('.uv-add-edit-label input');
  2389.                     inputElement.removeClass('uv-field-error');
  2390.                     $('.uv-field-message').remove()
  2391.                     var labelName = app.appView.stripHTML(inputElement.val());
  2392.                     if(labelName == "") {
  2393.                         inputElement.addClass('uv-field-error');
  2394.                         inputElement.parent().after("<span class='uv-field-message'>{{ 'This field is mandatory'|trans }}</span>");
  2395.                     } else {
  2396.                         var labelId = parseInt($('.uv-aside-option').attr('data-id'))
  2397.                         model = labelId ? labelCollection.get(labelId) : new LabelModel()
  2398.                         model.set({name: labelName, colorCode: $('.uv-color-block.uv-color-active').attr('data-color')});
  2399.                         self = this;
  2400.                         var flag = labelCollection.isLabelExist(labelName, labelId);
  2401.                         if(flag) {
  2402.                             app.appView.showLoader();
  2403.                             model.save({}, {
  2404.                                 success: function (model, response, options) {
  2405.                                     app.appView.hideLoader();
  2406.                                     if(response.alertClass == "success") {
  2407.                                         if(!labelId) {
  2408.                                             labelCollection.add(model);
  2409.                                         }
  2410.                                         self.updateMassLabelList()
  2411.                                         app.appView.renderResponseAlert(response);
  2412.                                     } else {
  2413.                                         inputElement.addClass('uv-field-error');
  2414.                                         inputElement.parent().after("<span class='uv-field-message'>" + response.alertMessage + "</span>");
  2415.                                     }
  2416.                                     self.backToLabels();
  2417.                                 },
  2418.                                 error: function (model, xhr, options) {
  2419.                                     if(url = xhr.getResponseHeader('Location'))
  2420.                                         window.location = url;
  2421.                                     app.appView.hideLoader();
  2422.                                     app.appView.renderResponseAlert(warningResponse);
  2423.                                 }
  2424.                             });
  2425.                         } else {
  2426.                             inputElement.parent().after("<span class='uv-field-message'>{{ 'Label with same name already exist.'|trans }}</span>");
  2427.                         }
  2428.                     }
  2429.                 },
  2430.                 removeLabel: function(e) {
  2431.                     e.preventDefault()
  2432.                     self = this;
  2433.                     app.appView.showLoader();
  2434.                     model = labelCollection.get($('.uv-aside-option').attr('data-id'))
  2435.                     model.destroy({
  2436.                         success : function (model, response, options) {
  2437.                             app.appView.hideLoader();
  2438.                             self.updateMassLabelList()
  2439.                             app.appView.renderResponseAlert(response);
  2440.                             self.backToLabels();
  2441.                         },
  2442.                         error: function (model, xhr, options) {
  2443.                             if(url = xhr.getResponseHeader('Location'))
  2444.                                 window.location = url;
  2445.                             app.appView.hideLoader();
  2446.                             app.appView.renderResponseAlert(warningResponse);
  2447.                         }
  2448.                     });
  2449.                 }
  2450.             });
  2451.             // Bulk Action View
  2452.             var BulkActionView = Backbone.View.extend({
  2453.                 el: $(".mass-action"),
  2454.                 currentEvent: null,
  2455.                 events: {
  2456.                     'click ul li, #mass-restore': 'massAction',
  2457.                     'click #mass-delete, #mass-delete-forever': 'confirmRemove',
  2458.                     'click #mass-restore': 'confirmRestore'
  2459.                 },
  2460.                 massAction: function(e) {
  2461.                     e.preventDefault();
  2462.                     if(!parseInt(Backbone.$(e.currentTarget).attr('data-index')))
  2463.                         return;
  2464.                     var data = {};
  2465.                     data['actionType'] = Backbone.$(e.currentTarget).parents('ul').attr('data-action') ? Backbone.$(e.currentTarget).parents('ul').attr('data-action') : Backbone.$(e.currentTarget).attr('data-action');
  2466.                     data['targetId'] = Backbone.$(e.currentTarget).attr('data-index');
  2467.                     data['ids'] = this.getCheckedTicketIds();
  2468.                     ticketCollection.batchOperation(data);
  2469.                     this.hideBulkOptions();
  2470.                 },
  2471.                 removeItem: function(e) {
  2472.                     var data = {};
  2473.                     if(Backbone.$(this.currentEvent.currentTarget).is("#mass-delete"))
  2474.                         data['actionType'] = "trashed";
  2475.                     else if(Backbone.$(this.currentEvent.currentTarget).is("#mass-delete-forever"))
  2476.                         data['actionType'] = "delete";
  2477.                     data['ids'] = this.getCheckedTicketIds();
  2478.                     ticketCollection.batchOperation(data);
  2479.                     this.hideBulkOptions();
  2480.                 },
  2481.                 restoreItem: function(e) {
  2482.                     var data = {};
  2483.                     data['actionType'] = "restored";
  2484.                     data['ids'] = this.getCheckedTicketIds();
  2485.                     ticketCollection.batchOperation(data);
  2486.                     this.hideBulkOptions();
  2487.                 },
  2488.                 getCheckedTicketIds: function() {
  2489.                     var ids = new Array();
  2490.                     $('.mass-action-checkbox').each(function() {
  2491.                         if($(this).is(':checked')) {
  2492.                             ids.push($(this).val());
  2493.                         }
  2494.                     });
  2495.                     return ids;
  2496.                 },
  2497.                 confirmRemove: function(e) {
  2498.                     e.preventDefault();
  2499.                     this.currentEvent = e;
  2500.                     app.appView.openConfirmModal(this)
  2501.                 },
  2502.                 confirmRestore: function(e) {
  2503.                     e.preventDefault();
  2504.                     app.appView.openConfirmModal(this, 'restoreItem')
  2505.                 },
  2506.                 hideBulkOptions : function() {
  2507.                     $('.uv-action-bar .mass-action').parent().removeClass("uv-width-100").hide();
  2508.                     $('.uv-action-bar .filter').parent().show();
  2509.                     $('.uv-action-bar-col-rt').show()
  2510.                 }
  2511.             });
  2512.             var PageView = Backbone.View.extend({
  2513.                 el: '.uv-paper',
  2514.                 events : {
  2515.                     'change .select-all-checkbox' : 'selectAll',
  2516.                     'click .uv-quick-view-trigger, .quick-view-navigation .uv-btn-tag': 'navigateQuickView',
  2517.                 },
  2518.                 quickViewTemplate: _.template($("#ticket_quick_view_tmp").html()),
  2519.                 navigateQuickView : function(e) {
  2520.                     e.preventDefault();
  2521.                     //$("#quick-view-modal .uv-loader").hide()
  2522.                     var currentElement = Backbone.$(e.currentTarget);
  2523.                     ticketId = currentElement.attr('data-id');
  2524.                     if(ticketId) {
  2525.                         if(model = ticketQuickViewCollection.isModelSynced(ticketId)) {
  2526.                             this.renderQuickView(model.toJSON())
  2527.                         } else {
  2528.                             var self = this;
  2529.                             if(currentElement.hasClass("uv-quick-view-trigger"))
  2530.                                 app.appView.showLoader();
  2531.                             if(ticketQuickViewCollection.get(ticketId)) {
  2532.                                 navData = ticketQuickViewCollection.getNextPrev(ticketId);
  2533.                                 requiredNext = (!navData.next && app.pager.paginationData.next) ? 1 : 0;
  2534.                                 requiredPrev = (!navData.previous && app.pager.paginationData.previous) ? 1 : 0;
  2535.                             } else
  2536.                                 requiredNext = requiredPrev = 1;
  2537.                             if(self.xhrReq)
  2538.                                 self.xhrReq.abort();
  2539.                             $("#quick-view-modal .uv-loader").show()
  2540.                             self.xhrReq = $.ajax({
  2541.                                 url : "{{ path('helpdesk_member_ticket_quick_view_xhr') }}",
  2542.                                 type : 'GET',
  2543.                                 data : {ticketId : ticketId, next: requiredNext, previous: requiredPrev},
  2544.                                 dataType : 'json',
  2545.                                 success : function(response) {
  2546.                                     self.xhrReq = 0;
  2547.                                     if(currentElement.hasClass("uv-quick-view-trigger"))
  2548.                                         app.appView.hideLoader();
  2549.                                     if(response.next == undefined)
  2550.                                         response.next = navData.next
  2551.                                     if(response.previous == undefined)
  2552.                                         response.previous = navData.previous
  2553.                                     response.isSynced = 1
  2554.                                     response.path = pathToTicket.replace('replaceId', response.incrementId);
  2555.                                     if(ticketQuickViewCollection.get(ticketId))
  2556.                                         ticketQuickViewCollection.set(response,{remove: false})
  2557.                                     else
  2558.                                         ticketQuickViewCollection.add(new TicketQuickViewModel(response))
  2559.                                     self.renderQuickView(response)
  2560.                                 },
  2561.                                 error: function (xhr) {
  2562.                                     self.xhrReq = 0;
  2563.                                     if(url = xhr.getResponseHeader('Location'))
  2564.                                         window.location = url;
  2565.                                     app.appView.hideLoader();
  2566.                                 }
  2567.                             });
  2568.                         }
  2569.                     }
  2570.                 },
  2571.                 renderQuickView: function(response) {
  2572.                     $('#quick-view-modal .uv-pop-up-box').html(this.quickViewTemplate(response));
  2573.                     app.appView.openModal('quick-view-modal')
  2574.                     $('#quick-view-modal .message').find('img').removeAttr('crossorigin');
  2575.                     $('#quick-view-modal .message').find('.uv-icon-ellipsis').remove();
  2576.                     $('#quick-view-modal .message').find('.helpdesk_blockquote').eq(0).before("<span class='uv-icon-ellipsis uv-ellipsis-mirror'></span>").hide();
  2577.                     app.appView.relativeTime();
  2578.                 },
  2579.                 selectAll : function(e) {
  2580.                     if(Backbone.$(e.currentTarget).is(':checked')) {
  2581.                         $('.mass-action-checkbox').prop('checked', true);
  2582.                         $('.uv-action-bar .filter').parent().hide();
  2583.                         $('.uv-action-bar .mass-action').parent().addClass("uv-width-100").show();
  2584.                         $('.uv-action-bar-col-rt').hide()
  2585.                     } else {
  2586.                         var count = 0;
  2587.                         $('.mass-action-checkbox').each(function() {
  2588.                             if($(this).is(':checked'))
  2589.                                 count++;
  2590.                         });
  2591.                         if(count == $('.mass-action-checkbox').length) {
  2592.                             $('.mass-action-checkbox').prop('checked', false);
  2593.                             $('.uv-action-bar .filter').parent().show();
  2594.                             $('.uv-action-bar .mass-action').parent().removeClass("uv-width-100").hide();
  2595.                             $('.uv-action-bar-col-rt').show()
  2596.                         }
  2597.                     }
  2598.                 },
  2599.             });
  2600.             // Ticket Router
  2601.             Router = Backbone.Router.extend({
  2602.                 routes: {
  2603.                     'page/:number(/sort/:sortField)(/direction/:order)' : 'paginate',
  2604.                     'status/:status(/search/:query)(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByStatus',
  2605.                     'search/:query(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByQuery',
  2606.                     'agent/:agent(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByAgent',
  2607.                     'customer/:customer(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByCustomer',
  2608.                     'priority/:priority(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByPriority',
  2609.                     'type/:type(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByType',
  2610.                     'group/:group(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByGroup',
  2611.                     'team/:team(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterBySubGroup',
  2612.                     'tag/:tag(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByTags',
  2613.                     'mailbox/:mailbox(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByMailbox',
  2614.                     'source/:source(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterBySource',
  2615.                     'after/:after(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByAfter',
  2616.                     'before/:before(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByBefore',
  2617.                     'repliesLess/:repliesLess(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByRepliesLesserCount',
  2618.                     'repliesMore/:repliesMore(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByRepliesGreaterCount',
  2619.                     'custom/:custom(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByCustom',
  2620.                     'label/:labelId(/status/:status)(/search/:query)(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterByLabel',
  2621.                     'new(/status/:status)(/search/:query)(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterNew',
  2622.                     'unassigned(/status/:status)(/search/:query)(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterUnassigned',
  2623.                     'notreplied(/status/:status)(/search/:query)(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterNotReplied',
  2624.                     'mine(/status/:status)(/search/:query)(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterMine',
  2625.                     'starred(/status/:status)(/search/:query)(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterstarred',
  2626.                     'trashed(/status/:status)(/search/:query)(/agent/:agent)(/customer/:customer)(/priority/:priority)(/type/:type)(/group/:group)(/team/:team)(/tag/:tag)(/mailbox/:mailbox)(/source/:source)(/after/:after)(/before/:before)(/repliesLess/:repliesLess)(/repliesMore/:repliesMore)(/custom/:custom)(/page/:number)(/sort/:sortField)(/direction/:order)': 'filterTrashed',
  2627.                     '': 'initializeList'
  2628.                 },
  2629.                 initializeList : function() {
  2630.                     $("#saved-filter").val('');
  2631.                     this.resetParams('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
  2632.                     this.fetch(null, null, null);
  2633.                 },
  2634.                 paginate : function(number,sortField,order) {
  2635.                     this.resetParams('','','','','','','','','','','','','','','','','','','','','', '');
  2636.                     this.fetch(number,sortField,order);
  2637.                 },
  2638.                 filterByLabel : function(labelId,status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2639.                     this.resetParams(labelId,'','','','','','',status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2640.                     this.fetch(number,sortField,order);
  2641.                 },
  2642.                 filterNew : function(status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2643.                     this.resetParams('',1,'','','','','',status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2644.                     this.fetch(number,sortField,order);
  2645.                 },
  2646.                 filterUnassigned : function(status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2647.                     this.resetParams('','',1,'','','','',status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2648.                     this.fetch(number,sortField,order);
  2649.                 },
  2650.                 filterNotReplied: function(status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2651.                     this.resetParams('','','',1,'','','',status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2652.                     this.fetch(number,sortField,order);
  2653.                 },
  2654.                 filterMine : function(status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2655.                     this.resetParams('','','','',1,'','',status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2656.                     this.fetch(number,sortField,order);
  2657.                 },
  2658.                 filterstarred : function(status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2659.                     this.resetParams('','','','','',1,'',status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2660.                     this.fetch(number,sortField,order);
  2661.                 },
  2662.                 filterTrashed : function(status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2663.                     this.resetParams('','','','','','',1,status,query,agent,customer,priority,type,group,team,tag,mailbox,source,custom);
  2664.                     this.fetch(number,sortField,order);
  2665.                 },
  2666.                 filterByStatus : function(status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2667.                     this.resetParams('','','','','','','',status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2668.                     this.fetch(number,sortField,order);
  2669.                 },
  2670.                 filterByQuery : function(query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2671.                     this.resetParams('','','','','','','','',query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2672.                     this.fetch(number,sortField,order);
  2673.                 },
  2674.                 filterByAgent : function(agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2675.                     this.resetParams('','','','','','','','','',agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2676.                     this.fetch(number,sortField,order);
  2677.                 },
  2678.                 filterByCustomer : function(customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2679.                     this.resetParams('','','','','','','','','','',customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2680.                     this.fetch(number,sortField,order);
  2681.                 },
  2682.                 filterByPriority : function(priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2683.                     this.resetParams('','','','','','','','','','','',priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2684.                     this.fetch(number,sortField,order);
  2685.                 },
  2686.                 filterByType : function(type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2687.                     this.resetParams('','','','','','','','','','','','',type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2688.                     this.fetch(number,sortField,order);
  2689.                 },
  2690.                 filterByGroup : function(group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2691.                     this.resetParams('','','','','','','','','','','','','',group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2692.                     this.fetch(number,sortField,order);
  2693.                 },
  2694.                 filterBySubGroup : function(team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2695.                     this.resetParams('','','','','','','','','','','','','','',team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2696.                     this.fetch(number,sortField,order);
  2697.                 },
  2698.                 filterByTags : function(tag,mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2699.                     this.resetParams('','','','','','','','','','','','','','','',tag,mailbox,source,after,before,repliesLess,repliesMore,custom);
  2700.                     this.fetch(number,sortField,order);
  2701.                 },
  2702.                 filterByMailbox : function(mailbox,source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2703.                     this.resetParams('','','','','','','','','','','','','','','','',mailbox,source,after,before,repliesLess,repliesMore,custom);
  2704.                     this.fetch(number,sortField,order);
  2705.                 },
  2706.                 filterBySource: function(source,after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2707.                     this.resetParams('','','','','','','','','','','','','','','','','',source,after,before,repliesLess,repliesMore,custom);
  2708.                     this.fetch(number,sortField,order);
  2709.                 },
  2710.                 filterByAfter: function(after,before,repliesLess,repliesMore,custom,number,sortField,order) {
  2711.                     this.resetParams('','','','','','','','','','','','','','','','','','',after,before,repliesLess,repliesMore,custom);
  2712.                     this.fetch(number,sortField,order);
  2713.                 },
  2714.                 filterByBefore: function(before,repliesLess,repliesMore,custom,number,sortField,order) {
  2715.                     this.resetParams('','','','','','','','','','','','','','','','','','','',before,repliesLess,repliesMore,custom);
  2716.                     this.fetch(number,sortField,order);
  2717.                 },
  2718.                 filterByRepliesLesserCount: function(repliesLess, repliesMore, custom, number, sortField, order) {
  2719.                     this.resetParams('','','','','','','','','','','','','','','','','','','','',repliesLess,repliesMore,custom);
  2720.                     this.fetch(number,sortField,order);
  2721.                 },
  2722.                 filterByRepliesGreaterCount: function(repliesMore, custom, number, sortField, order) {
  2723.                     this.resetParams('','','','','','','','','','','','','','','','','','','','','',repliesMore,custom);
  2724.                     this.fetch(number,sortField,order);
  2725.                 },
  2726.                 filterByCustom : function(custom, number, sortField, order) {
  2727.                     this.resetParams('','','','','','','','','','','','','','','','','','','','','','',custom);
  2728.                     this.fetch(number,sortField,order);
  2729.                 },
  2730.                 fetch: function(number, sortField, order) {
  2731.                     ticketCollection.state.currentPage = number;
  2732.                     filter.sortCollection(sortField, order);
  2733.                     ticketCollection.syncData();
  2734.                 },
  2735.                 resetParams : function(labelId,newLabel,unassigned,notreplied,mine,starred,trashed,status,query,agent,customer,priority,type,group,team,tag,mailbox,source,after,before,repliesLess,repliesMore,custom) {
  2736.                     _.each(userFilters, function(filter, index) {
  2737.                         if(Backbone.history.getFragment() == filter['route']) {
  2738.                             $("#saved-filter").val(index);
  2739.                         }
  2740.                     });
  2741.                     isPageJustLoaded = false;
  2742.                     if(query != null)
  2743.                         query = query.replace(/\+/g,' ');
  2744.                     bulkAction.hideBulkOptions();
  2745.                     ticketCollection.filterParameters.label = labelId;
  2746.                     ticketCollection.filterParameters.new = newLabel;
  2747.                     ticketCollection.filterParameters.unassigned = unassigned;
  2748.                     ticketCollection.filterParameters.notreplied = notreplied;
  2749.                     ticketCollection.filterParameters.mine = mine;
  2750.                     ticketCollection.filterParameters.starred = starred;
  2751.                     ticketCollection.filterParameters.trashed = trashed;
  2752.                     ticketCollection.filterParameters.search = query;
  2753.                     $(".uv-search-inline").val(query);
  2754.                     ticketCollection.filterParameters.status = status;
  2755.                     ticketCollection.filterParameters.agent = agent;
  2756.                     ticketCollection.filterParameters.customer = customer;
  2757.                     ticketCollection.filterParameters.priority = priority;
  2758.                     ticketCollection.filterParameters.type = type;
  2759.                     ticketCollection.filterParameters.group = group;
  2760.                     ticketCollection.filterParameters.team = team;
  2761.                     ticketCollection.filterParameters.tag = tag;
  2762.                     ticketCollection.filterParameters.mailbox = mailbox;
  2763.                     ticketCollection.filterParameters.source = source;
  2764.                     ticketCollection.filterParameters.after = after;
  2765.                     ticketCollection.filterParameters.before = before;
  2766.                     ticketCollection.filterParameters.repliesLess = repliesLess;
  2767.                     ticketCollection.filterParameters.repliesMore = repliesMore;
  2768.                     ticketCollection.filterParameters.custom = custom;
  2769.                     $('.custom-fields').find('input[type="text"]').val('');
  2770.                     $('.custom-fields').find('select').val('');
  2771.                     $('.custom-fields').find('input[type="radio"]').prop('checked', false);
  2772.                     $('.custom-fields').find('input[type="checkbox"]').prop('checked', false);
  2773.                     if(custom) {
  2774.                         custom = custom.replace(/\+/g,' ');
  2775.                         var indexValueSeperator = '_';
  2776.                         var columnSeperator = '|';
  2777.                         var multiOptions = custom.split(columnSeperator);
  2778.                         var multiKeyValue, multiKeyValueValue, ele;
  2779.                         _.each(multiOptions, function(valueData, indexData) {
  2780.                             if(!valueData)
  2781.                                 return;
  2782.                             multiKeyValue = valueData.split(indexValueSeperator);
  2783.                             multiKeyValueValue = multiKeyValue[1].split(',');
  2784.                             ele = $('[data-value="' + multiKeyValue[0] + '"]');
  2785.                             if(ele[0].type == 'radio') {
  2786.                                 $('[data-value="' + multiKeyValue[0] + '"][value="' + multiKeyValue[1] + '"]').prop('checked', true);
  2787.                             } else if(ele[0].type == 'checkbox') {
  2788.                                 _.each(ele, function(eleElements) {
  2789.                                     if(multiKeyValueValue.indexOf(eleElements.value) > -1) {
  2790.                                         $(eleElements).prop('checked', true);
  2791.                                     }
  2792.                                 });
  2793.                             } else if(ele[0].type == 'select-multiple') {
  2794.                                 ele.val(multiKeyValueValue);
  2795.                             } else if(ele[0].type == 'text') {
  2796.                                 ele.val(multiKeyValue[1]);
  2797.                             }
  2798.                         })
  2799.                     }
  2800.                     if(trashed) {
  2801.                         $('.property-block').hide();
  2802.                         $('.trashed-block').show();
  2803.                     } else {
  2804.                         $('.property-block').show();
  2805.                         $('.trashed-block').hide();
  2806.                     }
  2807.                     sideFilter.isRecurrsiveCalls = 0;
  2808.                     sideFilter.render();
  2809.                 }
  2810.             });
  2811.             var router = new Router();
  2812.             var pageview = new PageView;
  2813.             var bulkAction = new BulkActionView();
  2814.             var sideFilterModel = new SideFilterModel(filterContext)
  2815.             var sideFilter = new SideFilter();
  2816.             var ticketCollection = new TicketCollection();
  2817.             var ticketQuickViewCollection = new TicketQuickViewCollection();
  2818.             var labelCollection = new LabelCollection();
  2819.             var labelListView = new LabelListView()
  2820.             var filter = new Filter({collection : ticketCollection});
  2821.             Backbone.history.start({
  2822.                 push_state:true
  2823.             });
  2824.         });
  2825.     </script>
  2826. {% endblock %}