Açıklama Yok

case.html 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. {% extends "layouts/default_ext.html" %} {% block title %} Case summary {% endblock title %}
  2. {% block stylesheets %}
  3. {% include 'includes/header_case.html' %}
  4. <link rel="stylesheet" href="/static/assets/css/select2.css">
  5. <link rel="stylesheet" href="/static/assets/css/bootstrap-multiselect.min.css">
  6. <link rel="stylesheet" href="/static/assets/css/bootstrap-select.min.css">
  7. {% endblock stylesheets %}
  8. {% block content %}
  9. {% if current_user.is_authenticated %}
  10. {% include 'includes/navigation_ext.html' %}
  11. {% include 'includes/sidenav.html' %}
  12. <div class="main-panel">
  13. <div class="content">
  14. {% if case.close_date %}
  15. <div class="panel-header bg-close-gradient">
  16. {% else %}
  17. <div class="panel-header bg-info-gradient">
  18. {% endif %}
  19. <div class="page-inner py-5">
  20. <div class="d-flex align-items-left align-items-md-center flex-column flex-md-row mt--3">
  21. <div class="col">
  22. <div class="row">
  23. <div class="col">
  24. <h2 class="text-white pb-2 fw-bold case-name"> {{ case.name|unquote }}
  25. </h2>
  26. </div>
  27. </div>
  28. <div class="row">
  29. <div class="col">
  30. <h5 class="text-white op-7 mb-1"><b>Open on</b> {{ case.open_date }} by {{ case.user.name }}</h5>
  31. <h5 class="text-white op-7 mb-3"><b>Owned by</b> {{ case.owner.name }}</h5>
  32. {% if case.close_date %}
  33. <h5 class="text-warning mb-1">Closed on {{ case.close_date }}</h5>
  34. {% endif %}
  35. </div>
  36. <div class="col mt-auto">
  37. <div class="row">
  38. {% if case.severity %}<span onclick="case_detail('{{ case.case_id }}', true);" class="btn btn-rounded badge-pill hidden-caret btn-sm ml-2 mb-2 ml-auto {% if case.severity.severity_id > 4 %} badge-danger {% elif case.severity.severity_id == 4 %} bg-warning-gradient text-dark {% else %} btn-light {% endif %} ml-2" title="Case severity"><i class="fa-solid fa-bolt mr-1"></i> {{ case.severity.severity_name }}</span>{% endif %}
  39. <span title="Case outcome" class="float-right btn btn-rounded badge-pill hidden-caret btn-sm ml-2 mb-2 {% if case.status_id == 1%}badge-success{% elif case.status_id == 2 %}badge-danger{% else %}btn-light{% endif %}"
  40. onclick="case_detail('{{ case.case_id }}', true);"
  41. ><i class="fa-solid fa-group-arrows-rotate mr-2"></i>{{ case.status_name }}</span>
  42. </div>
  43. <div class="row">
  44. <div class="ml-auto">
  45. <div class="row">
  46. <h5 class="text-white op-7 mb-2 float-right mr-4"><b>Customer</b> : {{ case.client.name }}</h5>
  47. </div>
  48. <div class="row">
  49. {% if case.soc_id %} <h5 class="text-white op-7 mb-2 mr-4"><b>SOC ID :</b> {{ case.soc_id }}</h5> {% endif %}
  50. </div>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. <div class="row mt-2 mb--2">
  58. <div class="ml-2 col">
  59. <div class="row ml-1">
  60. {% if case.state %}<h5 title="Case state" onclick="case_detail('{{ case.case_id }}', true);" style="cursor:pointer;"><span class="btn-rounded badge-pill hidden-caret btn-sm btn-light" title="Case state"><i class="fa-solid fa-business-time mr-1"></i> {{ case.state.state_name }}</span></h5>{% endif %}
  61. {% if case.classification %}<h5 title="Classification" onclick="case_detail('{{ case.case_id }}', true);" style="cursor:pointer;"><span class="btn-rounded badge-pill hidden-caret btn-sm btn-light ml-2"><i class="fa-solid fa-shield-virus mr-1"></i>{{ case.classification.name_expanded }}</span></h5>{% endif %}
  62. {% if case.alerts| length > 0 %}<h5 title="Alerts"><a class="btn-rounded badge-pill hidden-caret btn-sm btn-dark ml-2 bg-warning-gradient text-dark" href="/alerts?cid={{ case.case_id }}&sort=desc&case_id={{ case.case_id }}" target="_blank" rel="noopener"><i class="fa-solid fa-bell mr-1"></i> {{ case.alerts| length }} related alerts</a></h5>{% endif %}
  63. {% if case.review_status.status_name == "Reviewed" %}
  64. <h5 title="Reviewed"> <a class="text-white btn-rounded badge-pill hidden-caret btn-sm ml-2 badge-success"><i class="fa-regular fa-circle-check mr-2"></i>Case reviewed by {% if case.reviewer.id == current_user.id %} you {% else %} {{ case.reviewer.name }} {% endif %}</a></h5>
  65. {% endif %}
  66. </div>
  67. </div>
  68. <div class="col mr-1">
  69. {% if case.case_tags %}
  70. {% for tag in case.case_tags %}
  71. <span class="badge badge-pill badge-light ml-1 pull-right"><i class="fa fa-tag mr-1"></i> {{ tag }}</span>
  72. {% endfor %}
  73. {% endif %}
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. <div class="page-inner mt--5">
  79. <div class="row row-card-no-pd" style="padding-top: 0px;padding-bottom: 3px;">
  80. {% include 'case-nav_landing.html' %}
  81. </div>
  82. <div id="caseReviewState" data-review-state="{{ case.review_status.status_name }}" data-reviewer-id="{{ case.reviewer_id }}" data-reviewer-name="{{ case.reviewer.name }}" style="display: none;"></div>
  83. {% if case.reviewer_id == current_user.id and case.review_status.status_name != "Reviewed" and case.review_status.status_name != "Not reviewed" %}
  84. <div class="row row-card-no-pd review-card mt--3 mb--3 bg-warning-gradient" style="display: none;">
  85. <div class="col-md-12">
  86. <h4 class="font-weight-bold"><i class="fa-solid fa-triangle-exclamation text-danger ml-2 mr-2"></i>Review requested
  87. <button class="btn btn-sm float-right btn-dark mr-3 mt-2 btn-start-review">Start review</button>
  88. <button class="btn btn-sm float-right btn-success mr-3 mt-2 btn-confirm-review" style="display:none">Confirm review</button>
  89. <button class="btn btn-sm float-right btn-light mr-3 mt-2 btn-cancel-review" style="display:none">Cancel review</button></h4>
  90. <span class="ml-2" id="reviewSubtitle">You have been requested to review this case.</span>
  91. </div>
  92. </div>
  93. {% elif case.review_status.status_name == "Review in progress" %}
  94. <div class="row row-card-no-pd mt--3 mb--3 bg-warning-gradient">
  95. <div class="col-md-12">
  96. <h4 class="font-weight-bold mt-1"><i class="fa-solid fa-list-check ml-2 mr-2"></i>Review by {{ case.reviewer.name }} in progress</h4>
  97. </div>
  98. </div>
  99. {% elif case.review_status.status_name == "Pending review" %}
  100. <div class="row row-card-no-pd mt--3 mb--3 bg-warning-gradient">
  101. <div class="col-md-12">
  102. <h4 class="font-weight-bold mt-1"><i class="fa-solid fa-triangle-exclamation text-danger ml-2 mr-2"></i>Review by {{ case.reviewer.name }} pending</h4>
  103. </div>
  104. </div>
  105. {% endif %}
  106. <div class="row row-card-no-pd">
  107. <div class="col-md-12">
  108. <div class="card mb-4" id="rescard1">
  109. <div class="card-header">
  110. <div class="row">
  111. {{ form.hidden_tag() }}
  112. <a href="#case_summary_card" class="d-block nav-link mr-auto" data-toggle="collapse" aria-expanded="true" aria-controls="case_summary_card">
  113. <h4 class="m-0 font-weight-bold">Case summary {{ "(Syncing with DB )" if case.id }}</h4>
  114. </a>
  115. <div class="mr-0 float-right">
  116. <small id="content_typing" class="mr-3 mt-1"></small>
  117. <small id="content_last_saved_by" class="mr-3 mt-1"></small>
  118. <span id="last_saved" class="badge mr-3 ml-2"></span>
  119. <small id="content_last_sync"></small>
  120. <button class="btn btn-sm mr-2 ml-3" onclick="edit_case_summary();" id="sum_edit_btn" >Edit</button>
  121. <button type="button" id="sum_refresh_btn" class="btn btn-sm btn-outline-default mr-3" onclick="sync_editor();">
  122. Refresh
  123. </button>
  124. </div>
  125. </div>
  126. </div>
  127. <div class="collapsed" id="case_summary_card">
  128. <div class="card-body">
  129. <div class="row mb-1">
  130. <div class="col" id="summary_edition_btn" style="display:none;">
  131. <div class="btn btn-sm btn-light mr-1 " title="CTRL-B" onclick="editor.insertSnippet('**${1:$SELECTION}**');editor.focus();"><i class="fa-solid fa-bold"></i></div>
  132. <div class="btn btn-sm btn-light mr-1" title="CTRL-I" onclick="editor.insertSnippet('*${1:$SELECTION}*');editor.focus();"><i class="fa-solid fa-italic"></i></div>
  133. <div class="btn btn-sm btn-light mr-1" title="CTRL-SHIFT-1" onclick="editor.insertSnippet('# ${1:$SELECTION}');editor.focus();">H1</div>
  134. <div class="btn btn-sm btn-light mr-1" title="CTRL-SHIFT-2" onclick="editor.insertSnippet('## ${1:$SELECTION}');editor.focus();">H2</div>
  135. <div class="btn btn-sm btn-light mr-1" title="CTRL-SHIFT-3" onclick="editor.insertSnippet('### ${1:$SELECTION}');editor.focus();">H3</div>
  136. <div class="btn btn-sm btn-light mr-1" title="CTRL-SHIFT-4" onclick="editor.insertSnippet('#### ${1:$SELECTION}');editor.focus();">H4</div>
  137. <div class="btn btn-sm btn-light mr-1" title="Insert code" onclick="editor.insertSnippet('```${1:$SELECTION}```');editor.focus();"><i class="fa-solid fa-code"></i></div>
  138. <div class="btn btn-sm btn-light mr-1" title="Insert link" onclick="editor.insertSnippet('[${1:$SELECTION}](url)');editor.focus();"><i class="fa-solid fa-link"></i></div>
  139. <div class="btn btn-sm btn-light mr-1" title="Insert table" onclick="editor.insertSnippet('|\t|\t|\t|\n|--|--|--|\n|\t|\t|\t|\n|\t|\t|\t|');editor.focus();"><i class="fa-solid fa-table"></i></div>
  140. <div class="btn btn-sm btn-light mr-1" title="Insert bullet list" onclick="editor.insertSnippet('\n- \n- \n- ');editor.focus();"><i class="fa-solid fa-list"></i></div>
  141. <div class="btn btn-sm btn-light mr-1" title="Insert numbered list" onclick="editor.insertSnippet('\n1. a \n2. b \n3. c ');editor.focus();"><i class="fa-solid fa-list-ol"></i></div>
  142. </div>
  143. </div>
  144. <div class="row">
  145. <div class="col-md-6" id="container_editor_summary">
  146. <div style="display: none" id="fetched_crc"></div>
  147. <div id="editor_summary" contenteditable="true" spellcheck="true" data-theme="{% if current_user.in_dark_mode %}dark{% else %}light{% endif %}"></div>
  148. <textarea id="case_summary" rows="10" cols="82" style="display: none"></textarea>
  149. </div>
  150. <div class="col-md-6" id="ctrd_casesum">
  151. <div id="targetDiv"></div>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. </div>
  159. </div>
  160. <div class="modal " tabindex="-1" role="dialog" id="modal_select_report" data-backdrop="true">
  161. <div class="modal-lg modal-dialog" role="document">
  162. <div class="modal-content">
  163. <div class="modal-header">
  164. <h5>Select report template</h5>
  165. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
  166. aria-hidden="true">&times;</span></button>
  167. </div>
  168. <div class="modal-body">
  169. {% if reports| length == 0 %}
  170. <div class="alert alert-warning" role="alert">
  171. <h4 class="alert-heading">No report template found</h4>
  172. <p>Report templates are configured in <a href="/manage/templates?cid={{case.case_id}}">the management section</a>.</p>
  173. </div>
  174. {% else %}
  175. <div class="col">
  176. <p>Since IRIS v2.0.0, the report generation supports images. Integration of images might fail depending on the situation.<br/><code>Safe Mode</code> can be used to generate the report without them.</p>
  177. </div>
  178. <select class="selectpicker form-control bg-outline-success dropdown-submenu" data-show-subtext="true" data-live-search="true" id="select_report">
  179. {% for report in reports %}
  180. <option data-toggle="tooltip" value="{{ report[0] }}" data-subtext="{{ report[3] }}">{{ report[1] }} ({{ report[2].capitalize() }})</option>
  181. {% endfor %}
  182. </select>
  183. </div>
  184. <div class="modal-footer">
  185. <a href="#" class="btn btn-light float-left mt-2 mr-auto" onclick="gen_report(true);">
  186. <span class="btn-label">
  187. <i class="fa fa-file-download"></i>
  188. </span>
  189. Generate in Safe Mode
  190. </a>
  191. <a href="#" class="btn btn-light float-right mt-2 ml-2" onclick="gen_report(false);">
  192. <span class="btn-label">
  193. <i class="fa fa-file-download"></i>
  194. </span>
  195. Generate
  196. </a>
  197. {% endif %}
  198. </div>
  199. </div><!-- /.modal-content -->
  200. </div><!-- /.modal-dialog -->
  201. </div>
  202. <div class="modal " tabindex="-1" role="dialog" id="modal_select_report_act" data-backdrop="true">
  203. <div class="modal-lg modal-dialog" role="document">
  204. <div class="modal-content">
  205. <div class="modal-header">
  206. <h5>Select activity report template</h5>
  207. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
  208. aria-hidden="true">&times;</span></button>
  209. </div>
  210. <div class="modal-body">
  211. {% if reports| length == 0 %}
  212. <div class="alert alert-warning" role="alert">
  213. <h4 class="alert-heading">No report template found</h4>
  214. <p>Report templates are configured in <a href="/manage/templates?cid={{case.case_id}}">the management section</a>.</p>
  215. </div>
  216. {% else %}
  217. <div class="col">
  218. <p>Since IRIS v2.0.0, the report generation supports images. Integration of images might fail depending on the situation.<br/><code>Safe Mode</code> can be used to generate the report without them.</p>
  219. </div>
  220. <select class="selectpicker form-control bg-outline-success dropdown-submenu mb-2" data-show-subtext="true" data-live-search="true" id="select_report_act">
  221. {% for report in reports_act %}
  222. <option data-toggle="tooltip" value="{{ report[0] }}" data-subtext="{{ report[3] }}">{{ report[1] }} ({{ report[2].capitalize() }})</option>
  223. {% endfor %}
  224. </select>
  225. </div>
  226. <div class="modal-footer">
  227. <a href="#" class="btn btn-light float-left mt-2 mr-auto" onclick="gen_act_report(true);">
  228. <span class="btn-label">
  229. <i class="fa fa-file-download"></i>
  230. </span>
  231. Generate in Safe Mode
  232. </a>
  233. <a href="#" class="btn btn-light float-right mt-2 ml-2" onclick="gen_act_report(false);">
  234. <span class="btn-label">
  235. <i class="fa fa-file-download"></i>
  236. </span>
  237. Generate
  238. </a>
  239. {% endif %}
  240. </div>
  241. </div><!-- /.modal-content -->
  242. </div><!-- /.modal-dialog -->
  243. </div>
  244. <div class="modal " tabindex="-1" role="dialog" id="modal_choose_reviewer" data-backdrop="true">
  245. <div class="modal-lg modal-dialog" role="document">
  246. <div class="modal-content">
  247. <form method="post" action="" id="form_choose_reviewer">
  248. <div class="modal-header">
  249. <h5>Choose reviewer</h5>
  250. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
  251. aria-hidden="true">&times;</span></button>
  252. </div>
  253. <div class="modal-body">
  254. <div class="row mb-2">
  255. <div class="col-12">
  256. <div class="form-group">
  257. <select class="selectpicker form-control" data-dropup-auto="false" data-live-search="true" id="reviewer_id">
  258. </select>
  259. </div>
  260. </div>
  261. </div>
  262. <div class="row mt-4">
  263. <div class="col-12 d-flex">
  264. <button type="button" class="btn btn-default mr-auto" data-dismiss="modal">Cancel</button>
  265. <button type="button" class="btn btn-outline-success ml-auto" id="submit_set_reviewer">Request</button>
  266. </div>
  267. </div>
  268. </div>
  269. </form>
  270. </div><!-- /.modal-content -->
  271. </div><!-- /.modal-dialog -->
  272. </div>
  273. <div class="modal" tabindex="-1" role="dialog" id="modal_case_detail" data-backdrop="true">
  274. <div class="modal-xl modal-dialog" role="document">
  275. <div class="modal-content" id="info_case_modal_content">
  276. </div><!-- /.modal-content -->
  277. </div><!-- /.modal-dialog -->
  278. </div>
  279. <div class="modal bg-shadow-gradient" tabindex="-1" role="dialog" id="modal_ac_additional" data-backdrop="true">
  280. </div>
  281. <div class="modal bg-shadow-gradient" tabindex="-1" role="dialog" id="modal_case_review" data-backdrop="static" data-keyboard="false">
  282. <div class="modal-dialog modal-lg" role="document">
  283. <div class="modal-content">
  284. <div class="modal-header">
  285. <h5 class="modal-title">Case Review</h5>
  286. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  287. <span aria-hidden="true">&times;</span>
  288. </button>
  289. </div>
  290. <div class="modal-body">
  291. <div class="row">
  292. <div class="col-12">
  293. <p>Do you confirm that the case has been reviewed?</p>
  294. </div>
  295. </div>
  296. <div class="row">
  297. <div class="col-12">
  298. <button type="button" class="btn btn-danger float-left" data-dismiss="modal">Cancel</button>
  299. <button type="button" class="btn btn-success float-right" id="confirmReview">Confirm Review</button>
  300. </div>
  301. </div>
  302. </div>
  303. </div>
  304. </div>
  305. </div>
  306. </div>
  307. </div>
  308. </div>
  309. {% include 'includes/footer.html' %}
  310. {% endif %} {% endblock content %} {% block javascripts %}
  311. <script src="/static/assets/js/plugin/ace/src-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
  312. <script src="/static/assets/js/plugin/ace/src-noconflict/ext-language_tools.js" type="text/javascript" charset="utf-8"></script>
  313. <script src="/static/assets/js/core/socket.io.js"></script>
  314. <script src="/static/assets/js/plugin/select/select2.js"></script>
  315. <script src="/static/assets/js/plugin/showdown/showdown.min.js"></script>
  316. <script src="/static/assets/js/iris/datatablesUtils.js"></script>
  317. <script src="/static/assets/js/iris/case.js"></script>
  318. <script src="/static/assets/js/iris/manage.cases.common.js"></script>
  319. <script src="/static/assets/js/iris/case.common.js"></script>
  320. <script src="/static/assets/js/iris/case.summary.js"></script>
  321. <script src="/static/assets/js/plugin/select/bootstrap-select.min.js"></script>
  322. <script src="/static/assets/js/plugin/select/bootstrap-multiselect.min.js"></script>
  323. <script>
  324. $('#modal_select_report').selectpicker();
  325. load_menu_mod_options_modal([{{case.case_id}}], 'case', $("#case_modal_quick_actions"));
  326. </script>
  327. {% endblock javascripts %}