Quickview.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. <template>
  2. <div class="overlay">
  3. <div class="summary">
  4. <h1>Appointment/Interaction Summary</h1>
  5. <button
  6. type="button"
  7. class="btn btn-danger btn-block"
  8. v-on:click="closeSummary()"
  9. >
  10. <span class="glyphicon glyphicon-remove"></span>
  11. Done
  12. </button>
  13. <hr />
  14. <div class="mfsw-row">
  15. <div class="column">
  16. <p v-if="detail.contactId">
  17. <router-link
  18. :to="{ name: 'Record', params: { id: detail.contactId } }"
  19. >
  20. {{ detail.contactName }}
  21. </router-link>
  22. </p>
  23. <p v-else>{{ detail.name }}</p>
  24. </div>
  25. </div>
  26. <div class="mfsw-row">
  27. <div class="column left">
  28. <strong>Team</strong>
  29. </div>
  30. <div class="column right">
  31. <span>{{ detail.teamName }}</span>
  32. </div>
  33. </div>
  34. <div class="mfsw-row">
  35. <div class="column left">
  36. <strong>Appointment</strong>
  37. </div>
  38. <div class="column right">
  39. <span>{{ detail.id }}</span>
  40. </div>
  41. </div>
  42. <div class="mfsw-row">
  43. <div class="column left">
  44. <strong>Interaction</strong>
  45. </div>
  46. <div class="column right">
  47. <span>{{ detail.interactionId }}</span>
  48. </div>
  49. </div>
  50. <div class="mfsw-row">
  51. <div class="column left">
  52. <strong>Here for</strong>
  53. </div>
  54. <div class="column right">
  55. <span>{{ detail.apptType }}</span>
  56. </div>
  57. </div>
  58. <div class="mfsw-row">
  59. <div class="column left">
  60. <strong>Signed in at</strong>
  61. </div>
  62. <div class="column right">
  63. <span>{{ detail.interactionCreatedOn }}</span>
  64. </div>
  65. </div>
  66. <div class="mfsw-row">
  67. <div class="column left">
  68. <strong>Here to see</strong>
  69. </div>
  70. <div class="column right">
  71. <span>{{ detail.ownerName }}</span
  72. >&nbsp;
  73. <button
  74. v-if="hasPermission"
  75. type="button"
  76. class="btn btn-default"
  77. v-on:click="reassigning = !reassigning"
  78. >
  79. <span class="glyphicon glyphicon-edit"></span>
  80. </button>
  81. <form v-show="reassigning" v-on:submit.prevent>
  82. <select class="form-control" v-model="reassignOwnerId">
  83. <option value="">Choose One</option>
  84. <option
  85. v-for="current in users"
  86. v-bind:key="current.id"
  87. :value="current.id"
  88. >
  89. {{ current.name }}</option
  90. >
  91. </select>
  92. <button
  93. v-show="reassignOwnerId"
  94. type="button"
  95. class="btn btn-warning"
  96. v-on:click="reassignAppointment()"
  97. :disabled="loadingReassign"
  98. >
  99. <span :class="reassignClass"></span>
  100. Reassign Appointment
  101. </button>
  102. </form>
  103. </div>
  104. </div>
  105. <div class="mfsw-row">
  106. <div class="column left">
  107. <strong>Meeting with</strong>
  108. </div>
  109. <div class="column right">
  110. <span>{{ detail.interactionOwnerName }}</span>
  111. </div>
  112. </div>
  113. <div class="mfsw-row">
  114. <div class="column left">
  115. <strong>Major asserted</strong>
  116. </div>
  117. <div class="column right">
  118. <span>{{ detail.major }}</span>
  119. </div>
  120. </div>
  121. <div class="mfsw-row">
  122. <div class="column left">
  123. <strong>Preprof asserted</strong>
  124. </div>
  125. <div class="column right">
  126. <span>{{ detail.preprof }}</span>
  127. </div>
  128. </div>
  129. <div class="mfsw-row">
  130. <div class="column left">
  131. <strong>Honors asserted</strong>
  132. </div>
  133. <div class="column right">
  134. <span>{{ detail.honors }}</span>
  135. </div>
  136. </div>
  137. <div class="mfsw-row">
  138. <div class="column left">
  139. <strong>Expected grad</strong>
  140. </div>
  141. <div class="column right">
  142. <span>{{ detail.gradExpected }}</span>
  143. </div>
  144. </div>
  145. <div class="mfsw-row">
  146. <div class="column left">
  147. <strong>State</strong>
  148. </div>
  149. <div class="column right">
  150. <span>{{ detail.condition }}</span>
  151. </div>
  152. </div>
  153. <div class="mfsw-row">
  154. <div class="column left">
  155. <strong>Subject</strong>
  156. </div>
  157. <div class="column right">
  158. <span>{{ detail.subject }}</span
  159. >&nbsp;
  160. <router-link
  161. v-show="detail.interactionId"
  162. class="btn btn-primary"
  163. :to="{ name: 'Appointment', params: { id: detail.interactionId } }"
  164. >
  165. <span class="glyphicon glyphicon-link"></span>
  166. </router-link>
  167. </div>
  168. </div>
  169. <div class="mfsw-row">
  170. <div class="column left">
  171. <strong>Name</strong>
  172. </div>
  173. <div class="column right">
  174. <span>{{ detail.name }}</span>
  175. </div>
  176. </div>
  177. <div class="mfsw-row">
  178. <div class="column left">
  179. <strong>Reasons</strong>
  180. </div>
  181. <div class="column right">
  182. <span>{{ detail.reasons }}</span>
  183. </div>
  184. </div>
  185. <div class="mfsw-row">
  186. <div class="column left">
  187. <strong>Notes</strong>
  188. </div>
  189. <div class="column right">
  190. <span>{{ detail.notes }}</span>
  191. </div>
  192. </div>
  193. <div class="mfsw-row">
  194. <div class="column left">
  195. <strong>Appointment Start</strong>
  196. </div>
  197. <div class="column right">
  198. <span>{{ detail.startOn }}</span>
  199. </div>
  200. </div>
  201. <hr />
  202. <button
  203. v-if="hasPermission"
  204. type="button"
  205. class="btn btn-success btn-block"
  206. v-on:click="takeBegin()"
  207. :disabled="loadingTakeBegin"
  208. >
  209. <span :class="takeBeginClass"></span>
  210. <span>Begin Session</span>
  211. </button>
  212. </div>
  213. <div v-show="devmode">
  214. <pre v-if="blob">{{ blob }}</pre>
  215. <pre v-if="errorPrompt">{{ errorPrompt }}</pre>
  216. </div>
  217. </div>
  218. </template>
  219. <script>
  220. export default {
  221. name: "Quickview",
  222. props: [
  223. "apptUsers",
  224. "currentUserId",
  225. "detail",
  226. "devmode",
  227. "hasPermission",
  228. "reassign",
  229. "takebegin"
  230. ],
  231. data() {
  232. return {
  233. loadingReassign: false,
  234. loadingTakeBegin: false,
  235. reassigning: false,
  236. reassignOwnerId: "",
  237. blob: "",
  238. errorPrompt: "",
  239. users: ""
  240. };
  241. },
  242. computed: {
  243. reassignClass: function() {
  244. return this.loadingReassign
  245. ? "glyphicon glyphicon-transfer"
  246. : "glyphicon glyphicon-check";
  247. },
  248. takeBeginClass: function() {
  249. return this.loadingTakeBegin
  250. ? "glyphicon glyphicon-transfer"
  251. : "glyphicon glyphicon-forward";
  252. }
  253. },
  254. methods: {
  255. closeSummary() {
  256. this.reassigning = false;
  257. this.reassignOwnerId = "";
  258. this.$emit("closeSummary");
  259. },
  260. getUsers(teamId) {
  261. const endpoint = this.apptUsers;
  262. if (endpoint) {
  263. fetch(`${endpoint}?apptUsersTeamId=${teamId}`)
  264. .then(response => response.json())
  265. .then(json => {
  266. if (json) {
  267. this.users = json;
  268. } else {
  269. this.errorPrompt = "Response failed.";
  270. }
  271. })
  272. .catch(error => {
  273. this.errorPrompt = `Request failed. ${error}`;
  274. });
  275. } else {
  276. this.errorPrompt = "No configuration for Users.";
  277. }
  278. },
  279. reassignAppointment() {
  280. const endpoint = this.reassign;
  281. const payload = { id: this.detail.id, ownerId: this.reassignOwnerId };
  282. this.loadingReassign = true;
  283. if (endpoint) {
  284. fetch(endpoint, {
  285. method: "POST",
  286. cache: "no-cache",
  287. headers: {
  288. "Content-Type": "application/json"
  289. },
  290. body: JSON.stringify(payload)
  291. })
  292. .then(response => response.json())
  293. .then(json => {
  294. if (json && json.status === "success") {
  295. this.blob = json;
  296. this.$emit("refresh");
  297. setTimeout(
  298. function() {
  299. this.loadingReassign = false;
  300. }.bind(this),
  301. 1000
  302. );
  303. } else {
  304. this.errorPrompt = "Response failed.";
  305. this.loadingReassign = false;
  306. }
  307. })
  308. .catch(error => {
  309. this.errorPrompt = `Request failed. ${error}`;
  310. this.loadingReassign = false;
  311. });
  312. } else {
  313. this.errorPrompt = "No configuration.";
  314. this.loadingReassign = false;
  315. }
  316. },
  317. takeBegin() {
  318. const endpoint = this.takebegin;
  319. const payload = { id: this.detail.id, ownerId: this.currentUserId };
  320. this.loadingTakeBegin = true;
  321. if (endpoint) {
  322. fetch(endpoint, {
  323. method: "POST",
  324. cache: "no-cache",
  325. headers: {
  326. "Content-Type": "application/json"
  327. },
  328. body: JSON.stringify(payload)
  329. })
  330. .then(response => response.json())
  331. .then(json => {
  332. if (
  333. json &&
  334. json.status === "success" &&
  335. json.appointment.interactionId
  336. ) {
  337. this.blob = json;
  338. setTimeout(
  339. function() {
  340. this.$router.push({
  341. name: "Appointment",
  342. params: { id: json.appointment.interactionId }
  343. });
  344. this.loadingTakeBegin = false;
  345. }.bind(this),
  346. 1000
  347. );
  348. } else {
  349. this.errorPrompt = "Response failed.";
  350. this.loadingTakeBegin = false;
  351. }
  352. })
  353. .catch(error => {
  354. this.errorPrompt = `Request failed. ${error}`;
  355. this.loadingTakeBegin = false;
  356. });
  357. } else {
  358. this.errorPrompt = "No configuration.";
  359. this.loadingTakeBegin = false;
  360. }
  361. }
  362. },
  363. mounted() {
  364. this.getUsers(this.detail.teamId);
  365. }
  366. };
  367. </script>
  368. <style scoped>
  369. .mfsw-row .column {
  370. float: left;
  371. padding: 0 10px;
  372. min-width: 120px;
  373. }
  374. .mfsw-row .left {
  375. width: 30%;
  376. }
  377. .mfsw-row .right {
  378. width: 70%;
  379. }
  380. .mfsw-row:after {
  381. content: "";
  382. display: block;
  383. clear: both;
  384. }
  385. </style>