Files
luos/resources/assets/js/home/CaseDetail.vue

517 lines
15 KiB
Vue
Raw Normal View History

2020-12-07 14:33:27 -04:00
<template>
<div id="case-detail" ref="case-detail" class="v-container-case-detail">
2020-12-07 18:52:12 +00:00
<div>
2020-12-16 18:26:40 +00:00
<b-alert
:show="dataAlert.dismissCountDown"
dismissible
:variant="dataAlert.variant"
@dismissed="dataAlert.dismissCountDown = 0"
@dismiss-count-down="countDownChanged"
>
{{ dataAlert.message }}
</b-alert>
2020-12-11 19:36:41 +00:00
<p class="">
<b-icon icon="arrow-left"></b-icon>
<button type="button" class="btn btn-link" @click="$emit('onLastPage')">
{{ $t("ID_BACK") }}
</button>
<button-fleft :data="newCase"></button-fleft>
2020-12-07 18:52:12 +00:00
</p>
2020-12-11 19:36:41 +00:00
<modal-new-request ref="newRequest"></modal-new-request>
2020-12-07 18:52:12 +00:00
</div>
<div class="row">
2020-12-09 16:22:30 +00:00
<div class="col-sm-9">
2020-12-07 18:52:12 +00:00
<div id="pending-task" ref="pending-task">
<v-server-table
:data="tableData"
:columns="columns"
:options="options"
v-show="showTable"
2020-12-07 18:52:12 +00:00
ref="vueTable"
>
<div slot="task" slot-scope="props">
<TaskCell :data="props.row.TASK" />
2020-12-07 18:52:12 +00:00
</div>
<div slot="case_title" slot-scope="props">
{{ props.row.CASE_TITLE }}
</div>
<div slot="assignee" slot-scope="props">
{{ props.row.ASSIGNEE }}
</div>
<div slot="status" slot-scope="props">
{{ props.row.STATUS }}
2020-12-07 14:33:27 -04:00
</div>
2020-12-07 18:52:12 +00:00
<div slot="due_date" slot-scope="props">
{{ props.row.DUE_DATE }}
2020-12-07 14:33:27 -04:00
</div>
<div slot="actions" slot-scope="props">
<b-button v-if="props.row.STATUS === 'OPEN'" @click="onClick(props)" variant="outline-primary">{{$t("ID_CONTINUE")}}</b-button>
2020-12-07 18:52:12 +00:00
</div>
</v-server-table>
</div>
2020-12-09 16:22:30 +00:00
<TabsCaseDetail
:dataCaseSummary="dataCaseSummaryTab"
:dataCase="dataCase"
></TabsCaseDetail>
2020-12-10 15:19:14 +00:00
<ModalCancelCase ref="modal-cancel-case"></ModalCancelCase>
2020-12-07 18:52:12 +00:00
</div>
2020-12-09 16:22:30 +00:00
<div class="col-sm-3">
<case-summary
v-if="dataCaseSummary"
:data="dataCaseSummary"
></case-summary>
<io-documents
v-if="
dataIoDocuments.inputDocuments.length > 0 ||
dataIoDocuments.outputDocuments.length > 0
"
:data="dataIoDocuments"
></io-documents>
</div>
</div>
<div class="row">
2020-12-09 16:22:30 +00:00
<div class="col-sm-9">
2020-12-08 13:43:33 +00:00
<case-comments
2020-12-15 23:56:44 +00:00
ref="case-comments"
2020-12-08 13:43:33 +00:00
:data="dataComments"
:onClick="onClickComment"
:postComment="postComment"
2020-12-15 23:56:44 +00:00
:dropFiles="dropFiles"
2020-12-08 13:43:33 +00:00
/>
</div>
2020-12-09 16:22:30 +00:00
<div class="col-sm-3">
2020-12-11 19:36:41 +00:00
<attached-documents
2020-12-15 23:56:44 +00:00
v-if="dataAttachedDocuments.items.length > 0 && !attachDocuments"
2020-12-11 19:36:41 +00:00
:data="dataAttachedDocuments"
></attached-documents>
2020-12-15 23:56:44 +00:00
<attached-documents-edit
v-if="dataAttachedDocuments.items.length > 0 && attachDocuments"
:data="dataAttachedDocuments"
:onRemove="onRemoveAttachedDocument"
></attached-documents-edit>
2020-12-07 18:52:12 +00:00
</div>
2020-12-07 14:33:27 -04:00
</div>
2020-12-07 18:52:12 +00:00
</div>
2020-12-07 14:33:27 -04:00
</template>
<script>
2020-12-07 18:52:12 +00:00
import IoDocuments from "../components/home/caseDetail/IoDocuments.vue";
import CaseSummary from "../components/home/caseDetail/CaseSummary.vue";
import AttachedDocuments from "../components/home/caseDetail/AttachedDocuments.vue";
2020-12-15 23:56:44 +00:00
import AttachedDocumentsEdit from "../components/home/caseDetail/AttachedDocumentsEdit.vue";
import CaseComment from "../components/home/caseDetail/CaseComment";
import CaseComments from "../components/home/caseDetail/CaseComments";
2020-12-08 19:12:30 +00:00
import TabsCaseDetail from "../home/TabsCaseDetail.vue";
2020-12-11 19:36:41 +00:00
import ButtonFleft from "../components/home/ButtonFleft.vue";
2020-12-10 15:19:14 +00:00
import ModalCancelCase from "../home/modal/ModalCancelCase.vue";
2020-12-11 19:36:41 +00:00
import ModalNewRequest from "./ModalNewRequest.vue";
import TaskCell from "../components/vuetable/TaskCell.vue";
import Api from "../api/index";
2020-12-07 14:33:27 -04:00
export default {
2020-12-07 18:52:12 +00:00
name: "CaseDetail",
components: {
2020-12-08 19:12:30 +00:00
TabsCaseDetail,
2020-12-07 18:52:12 +00:00
IoDocuments,
CaseSummary,
AttachedDocuments,
2020-12-15 23:56:44 +00:00
AttachedDocumentsEdit,
CaseComment,
CaseComments,
2020-12-10 15:19:14 +00:00
ModalCancelCase,
2020-12-11 19:36:41 +00:00
ButtonFleft,
ModalNewRequest,
2020-12-15 23:56:44 +00:00
TaskCell,
2020-12-07 18:52:12 +00:00
},
props: {},
data() {
return {
2020-12-16 18:26:40 +00:00
dataAlert: {
dismissSecs: 5,
dismissCountDown: 0,
message: "",
variant: "info",
},
dataCase: null,
2020-12-11 19:36:41 +00:00
newCase: {
title: this.$i18n.t("ID_NEW_CASE"),
class: "btn-success",
onClick: () => {
this.$refs["newRequest"].show();
},
},
2020-12-07 18:52:12 +00:00
columns: [
"task",
"case_title",
"assignee",
"status",
"due_date",
"actions",
],
showTable: true,
tableData: [],
2020-12-07 18:52:12 +00:00
options: {
headings: {
task: this.$i18n.t("ID_TASK"),
case_title: this.$i18n.t("ID_CASE_TITLE"),
assignee: this.$i18n.t("ID_ASSIGNEE"),
status: this.$i18n.t("ID_STATUS"),
due_date: this.$i18n.t("ID_DUE_DATE"),
actions: this.$i18n.t("ID_ACTIONS"),
2020-12-07 14:33:27 -04:00
},
2020-12-07 18:52:12 +00:00
selectable: {
mode: "single", // or 'multiple'
only: function (row) {
return true; // any condition
},
selectAllMode: "all", // or 'page',
programmatic: false,
2020-12-07 14:33:27 -04:00
},
2020-12-07 18:52:12 +00:00
filterable: false,
requestFunction() {
return this.$parent.$parent.getCasesForVueTable();
},
2020-12-07 18:52:12 +00:00
},
dataCaseSummary: null,
2020-12-08 19:12:30 +00:00
dataCaseSummaryTab: null,
2020-12-07 18:52:12 +00:00
dataIoDocuments: {
titleInput: this.$i18n.t("ID_REQUEST_DOCUMENTS"),
titleOutput: this.$i18n.t("ID_OUTPUT_DOCUMENTS"),
inputDocuments: [],
outputDocuments: [],
2020-12-07 18:52:12 +00:00
},
dataAttachedDocuments: {
title: "Attached Documents",
items: [],
2020-12-07 18:52:12 +00:00
},
2020-12-15 23:56:44 +00:00
attachDocuments: false,
dataComments: {
title: "Comments",
items: [],
},
2020-12-07 18:52:12 +00:00
};
},
mounted() {
let that = this;
this.dataCase = this.$parent.dataCase;
2020-12-07 18:52:12 +00:00
this.$el.getElementsByClassName("VuePagination__count")[0].remove();
this.getDataCaseSummary();
this.getInputDocuments();
this.getOutputDocuments();
this.getCasesNotes();
2020-12-07 18:52:12 +00:00
},
methods: {
2020-12-15 23:56:44 +00:00
postComment(comment, send, files) {
2020-12-08 13:43:33 +00:00
let that = this;
Api.caseNotes
.post(
_.extend({}, this.dataCase, {
COMMENT: comment,
SEND_MAIL: send,
2020-12-15 23:56:44 +00:00
FILES: files,
2020-12-08 13:43:33 +00:00
})
)
.then((response) => {
2020-12-16 18:26:40 +00:00
if (
response.data.success === "success" &&
response.data.message == ""
) {
2020-12-15 23:56:44 +00:00
that.attachDocuments = false;
2020-12-16 18:26:40 +00:00
that.dataAttachedDocuments.items = [];
2020-12-08 13:43:33 +00:00
that.getCasesNotes();
2020-12-16 18:26:40 +00:00
} else {
that.showAlert(response.data.message, "danger");
that.dataAttachedDocuments.items = [];
2020-12-08 13:43:33 +00:00
}
});
},
onClickComment(data) {
let att = [];
this.dataAttachedDocuments.items = [];
_.each(data.data.attachments, (a) => {
att.push({
data: a,
title: a.APP_DOC_FILENAME,
extension: a.APP_DOC_FILENAME.split(".").pop(),
onClick: () => {},
});
});
this.dataAttachedDocuments.items = att;
},
2020-12-07 18:52:12 +00:00
getDataCaseSummary() {
2021-01-13 19:25:01 +00:00
let action,
option,
that = this;
Api.cases
.casesummary(this.dataCase)
2020-12-07 18:52:12 +00:00
.then((response) => {
var data = response.data;
2020-12-08 19:12:30 +00:00
this.formatCaseSummary(response.data);
2020-12-07 18:52:12 +00:00
this.dataCaseSummary = {
2020-12-10 15:19:14 +00:00
title: this.$i18n.t("ID_SUMMARY"),
titleActions: this.$i18n.t("ID_ACTIONS"),
btnLabel: this.$i18n.t("ID_CANCEL_CASE"),
2020-12-07 18:52:12 +00:00
btnType: false,
2021-01-13 19:25:01 +00:00
onClick: null,
2020-12-07 18:52:12 +00:00
label: {
numberCase: data[2].label,
process: data[0].label,
status: data[3].label,
caseTitle: data[1].label,
created: data[6].label,
delegationDate: response.data[11].label,
2020-12-10 15:19:14 +00:00
duration: this.$i18n.t("ID_DURATION"),
2020-12-07 18:52:12 +00:00
},
text: {
numberCase: data[2].value,
process: data[0].value,
status: data[3].value,
caseTitle: data[1].value,
created: data[6].value,
delegationDate: response.data[11].value.split(" ")[0],
duration: response.data[11].value.split(" ")[1],
},
};
2021-01-13 19:25:01 +00:00
// Hack for identify the cancel case button
Api.cases
.actions(this.dataCase).then((response)=>{
action = _.find(response.data, function(o) { return o.id == "ACTIONS"; });
if(action){
option = _.find(action.options, function(o) { return o.fn == "cancelCase"; });
if(!option.hide){
that.dataCaseSummary.onClick = () => {
that.$refs["modal-cancel-case"].show();
};
}
}
});
2020-12-07 18:52:12 +00:00
})
.catch((err) => {
throw new Error(err);
});
},
getInputDocuments() {
Api.cases
.inputdocuments(this.dataCase)
2020-12-07 18:52:12 +00:00
.then((response) => {
let data = response.data,
2020-12-07 18:52:12 +00:00
document = data.data,
i,
info;
if (data.totalCount > 0 && document !== []) {
this.dataIoDocuments.inputDocuments = [];
for (i = 0; i < data.totalCount; i += 1) {
info = {
title: document[i].TITLE,
extension: document[i].TITLE.split(".")[1],
2020-12-15 23:56:44 +00:00
onClick: () => {},
data: document[i],
2020-12-07 18:52:12 +00:00
};
this.dataIoDocuments.inputDocuments.push(info);
}
}
})
.catch((err) => {
throw new Error(err);
});
},
getOutputDocuments() {
Api.cases
.outputdocuments(this.dataCase)
2020-12-07 18:52:12 +00:00
.then((response) => {
var data = response.data,
document = data.data,
i,
info;
if (data.totalCount > 0 && document !== []) {
this.dataIoDocuments.outputDocuments = [];
for (i = 0; i < data.totalCount; i += 1) {
info = {
title: document[i].TITLE,
extension: document[i].TITLE.split(".")[1],
2020-12-15 23:56:44 +00:00
onClick: () => {},
data: document[i],
2020-12-07 18:52:12 +00:00
};
this.dataIoDocuments.outputDocuments.push(info);
}
}
})
.catch((err) => {
throw new Error(err);
});
},
2020-12-15 23:56:44 +00:00
dropFiles(files) {
this.attachDocuments = true;
this.dataAttachedDocuments.items = files;
},
onRemoveAttachedDocument(file) {
this.$refs["case-comments"].removeFile(file);
},
/**
* Get for user format name configured in Processmaker Environment Settings
*
* @param {string} name
* @param {string} lastName
* @param {string} userName
* @return {string} nameFormat
*/
nameFormatCases(name, lastName, userName) {
let nameFormat = "";
if (/^\s*$/.test(name) && /^\s*$/.test(lastName)) {
return nameFormat;
}
if (this.nameFormat === "@firstName @lastName") {
nameFormat = name + " " + lastName;
} else if (this.nameFormat === "@firstName @lastName (@userName)") {
nameFormat = name + " " + lastName + " (" + userName + ")";
} else if (this.nameFormat === "@userName") {
nameFormat = userName;
} else if (this.nameFormat === "@userName (@firstName @lastName)") {
nameFormat = userName + " (" + name + " " + lastName + ")";
} else if (this.nameFormat === "@lastName @firstName") {
nameFormat = lastName + " " + name;
} else if (this.nameFormat === "@lastName, @firstName") {
nameFormat = lastName + ", " + name;
} else if (this.nameFormat === "@lastName, @firstName (@userName)") {
nameFormat = lastName + ", " + name + " (" + userName + ")";
} else {
nameFormat = name + " " + lastName;
}
return nameFormat;
},
getCasesNotes() {
let that = this;
Api.cases
.casenotes(this.dataCase)
.then((response) => {
that.formatResponseCaseNotes(response.data.notes);
that.dataComments.noPerms = response.data.noPerms || 0;
})
.catch((err) => {
throw new Error(err);
});
},
formatResponseCaseNotes(notes) {
let that = this,
notesArray = [];
_.each(notes, (n) => {
notesArray.push({
user: that.nameFormatCases(
n.USR_FIRSTNAME,
n.USR_LASTNAME,
n.USR_USERNAME
),
date: n.NOTE_DATE,
comment: n.NOTE_CONTENT,
data: n,
});
});
this.dataComments.items = notesArray;
},
2020-12-08 19:12:30 +00:00
formatCaseSummary(data) {
let index,
sections = [];
this.dataCaseSummaryTab = [];
_.each(data, (o) => {
if (
(index = _.findIndex(sections, (s) => {
return s.title == o.section;
})) == -1
) {
sections.push({
title: o.section,
items: [],
});
index = 0;
}
sections[index].items.push(o);
});
this.dataCaseSummaryTab = sections;
},
getCasesForVueTable() {
let that = this,
dt;
return new Promise((resolutionFunc, rejectionFunc) => {
Api.cases
2020-12-15 23:56:44 +00:00
.pendingtask(that.$parent.dataCase)
.then((response) => {
dt = that.formatDataResponse(response.data);
resolutionFunc({
data: dt,
count: response.data.length,
});
that.showTable = response.data.length > 0 ? true : false;
})
.catch((err) => {
throw new Error(err);
});
});
},
formatDataResponse(response) {
let data = [];
_.forEach(response, (v) => {
data.push({
TASK: [{
TITLE: v.TAS_TITLE,
CODE_COLOR: v.TAS_COLOR,
2020-12-15 23:56:44 +00:00
COLOR: v.TAS_COLOR_LABEL,
}],
CASE_TITLE: v.DEL_TITLE,
ASSIGNEE: v.USR_FIRSTNAME + " " + v.USR_LASTNAME,
STATUS: v.DEL_THREAD_STATUS,
DUE_DATE: v.DEL_TASK_DUE_DATE,
2020-12-15 23:56:44 +00:00
TASK_COLOR: v.TAS_COLOR_LABEL,
APP_UID: v.APP_UID,
DEL_INDEX: v.DEL_INDEX,
PRO_UID:v.PRO_UID,
TAS_UID:v.TAS_UID
2020-12-15 23:56:44 +00:00
});
});
return data;
2020-12-15 23:56:44 +00:00
},
2020-12-16 18:26:40 +00:00
/**
* Show the alert message
* @param {string} message - message to be displayen in the body
* @param {string} type - alert type
*/
showAlert(message, type) {
this.dataAlert.message = message;
this.dataAlert.variant = type || "info";
this.dataAlert.dismissCountDown = this.dataAlert.dismissSecs;
},
/**
* Updates the alert dismiss value to update
* dismissCountDown and decrease
* @param {mumber}
*/
countDownChanged(dismissCountDown) {
this.dataAlert.dismissCountDown = dismissCountDown;
},
onClick(data) {
this.$emit("onUpdateDataCase", {
APP_UID: data.row.APP_UID,
DEL_INDEX: data.row.DEL_INDEX,
PRO_UID: data.row.PRO_UID,
TAS_UID: data.row.TAS_UID,
ACTION: "todo",
});
this.$emit("onUpdatePage", "XCase");
}
2020-12-07 18:52:12 +00:00
},
};
</script>
<style>
.v-container-case-detail {
padding-top: 20px;
padding-bottom: 20px;
padding-left: 50px;
2020-12-11 19:36:41 +00:00
padding-right: 20px;
}
</style>