From 815307e392cb245dd696e10edf1ae018040bd5fb Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 4 Mar 2025 07:32:14 +0100 Subject: [PATCH] Reply functionality and Pagination --- application/controllers/NeueNachricht.php | 2 +- .../api/frontend/v1/messages/Messages.php | 82 +++++++++++++++++-- application/models/system/Message_model.php | 4 +- public/js/api/messages/person.js | 7 ++ public/js/apps/Nachrichten.js | 1 + .../Messages/Details/NewMessage/NewDiv.js | 29 +++++-- .../Messages/Details/TableMessages.js | 29 +++++-- public/js/components/Messages/Messages.js | 41 ++++++++-- 8 files changed, 162 insertions(+), 33 deletions(-) diff --git a/application/controllers/NeueNachricht.php b/application/controllers/NeueNachricht.php index 9e9e0a39b..9b61b78ef 100644 --- a/application/controllers/NeueNachricht.php +++ b/application/controllers/NeueNachricht.php @@ -23,7 +23,7 @@ class NeueNachricht extends Auth_Controller //now working $this->load->view('Nachrichten', [ 'permissions' => [ - 'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter', 'suid') + 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'), ] ]); } diff --git a/application/controllers/api/frontend/v1/messages/Messages.php b/application/controllers/api/frontend/v1/messages/Messages.php index 4bc9a13ab..d080cbee3 100644 --- a/application/controllers/api/frontend/v1/messages/Messages.php +++ b/application/controllers/api/frontend/v1/messages/Messages.php @@ -18,6 +18,8 @@ class Messages extends FHCAPI_Controller 'deleteMessage' => ['admin:r', 'assistenz:r'], 'getVorlagentext' => ['admin:r', 'assistenz:r'], 'getPreviewText' => ['admin:r', 'assistenz:r'], + 'getReplyData' => ['admin:r', 'assistenz:r'], + 'getPersonIdFromUid' => ['admin:r', 'assistenz:r'], ]); //Load Models @@ -70,8 +72,6 @@ class Messages extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); $oe_kurzbz = current($data); - // $this->terminateWithError("oe: ". $oe_kurzbz->oe_kurzbz, self::ERROR_TYPE_GENERAL); - $this->load->model('system/Vorlage_model', 'VorlageModel'); //39 Stück Variante OE @@ -129,11 +129,8 @@ class Messages extends FHCAPI_Controller public function getMsgVarsPrestudent($uid) { - //$this->terminateWithError($uid, self::ERROR_TYPE_GENERAL); $prestudent_id = $this-> _getPrestudentIdFromUid($uid); - // $this->terminateWithError("prestudent_id " . $prestudent_id, self::ERROR_TYPE_GENERAL); - $result = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id); $data = $this->getDataOrTerminateWithError($result); @@ -290,6 +287,46 @@ class Messages extends FHCAPI_Controller $this->terminateWithSuccess($bodyParsed); } + public function getReplyData($messageId) + { + // return $this->terminateWithError("in get ReplyBody" . $messageId, self::ERROR_TYPE_GENERAL); + //TODO(Manu) validation of messageId: if number + + + $this->MessageModel->addSelect('public.tbl_msg_message.*'); + $this->MessageModel->addSelect('r.*'); + $this->MessageModel->addSelect('p.nachname'); + $this->MessageModel->addSelect('p.vorname'); + $this->MessageModel->addJoin('public.tbl_msg_recipient r', 'ON (r.message_id = public.tbl_msg_message.message_id)'); + $this->MessageModel->addJoin('public.tbl_person p', 'ON (p.person_id = public.tbl_msg_message.person_id)'); + + $result = $this->MessageModel->loadWhere( + array('r.message_id' => $messageId) + ); + + // $this->terminateWithSuccess((getData($result) ?: [])); + $dataMessage = $this->getDataOrTerminateWithError($result); + + $prefix = "Re: "; // reply subject prefix + +/* $body = current($dataMessage->body); + $subject = $dataMessage->subject;*/ + + $subject = $dataMessage[0]->subject; + $body = $dataMessage[0]->body; + + + $replyBody = $this->_getReplyBody($body, $dataMessage[0]->nachname, $dataMessage[0]->vorname, $dataMessage[0]->insertamum); + + $dataMessage[0]->replyBody = $replyBody; + $dataMessage[0]->rest = "Help Manu"; + $dataMessage[0]->replySubject = $prefix . $subject; + + $this->terminateWithSuccess($dataMessage); + + + } + public function deleteMessage($messageId) { // Start DB transaction @@ -298,7 +335,7 @@ class Messages extends FHCAPI_Controller $result = $this->MessageModel->deleteMessageRecipient($messageId); if (isError($result)) { return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } $result = $this->MessageModel->deleteMessageStatus($messageId); @@ -316,6 +353,19 @@ class Messages extends FHCAPI_Controller $this->terminateWithSuccess($result); } + public function getPersonIdFromUid($uid) + { + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $result = $this->BenutzerModel->loadWhere( + ['uid' => $uid] + ); + + $data = $this->getDataOrTerminateWithError($result); + $benutzer = current($data); + + $this->terminateWithSuccess($benutzer->person_id); + } + private function _getPersonIdFromUid($uid) { $this->load->model('person/Benutzer_model', 'BenutzerModel'); @@ -326,7 +376,6 @@ class Messages extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); $benutzer = current($data); - //return $data->person_id; return $benutzer->person_id; } @@ -342,4 +391,23 @@ class Messages extends FHCAPI_Controller return $student->prestudent_id; } + + private function _getReplyBody($body, $receiverName, $receiverSurname, $sentDate) + { + // To quote a reply body message + $bodyFormat = "
+
+
+ + On %s %s %s wrote: + +
+
+ %s +
"; + return sprintf( + $bodyFormat, + date_format(date_create($sentDate), 'd.m.Y H:i'), $receiverName, $receiverSurname, $body + ); + } } \ No newline at end of file diff --git a/application/models/system/Message_model.php b/application/models/system/Message_model.php index 0fdb39736..38defa383 100644 --- a/application/models/system/Message_model.php +++ b/application/models/system/Message_model.php @@ -275,7 +275,7 @@ class Message_model extends DB_Model JOIN public.tbl_msg_message m USING(message_id) WHERE r.person_id = ? GROUP BY m.message_id, m.subject, m.body, m.insertamum, m.relationmessage_id, sender, recipient, sender_id, recipient_id - ORDER BY insertamum + ORDER BY insertamum DESC "; $parametersArray = array($person_id, $person_id); @@ -287,7 +287,7 @@ class Message_model extends DB_Model * Deletes a messages from tableMessages and tbl_msg_recipient * TODO(MANU) CHECK IF NECESSARY * dependency with other tables - * in case of reply... more messages + * in case of reply... more messages?? delete all dependent ones? * maybe anonimize it * @param $message_id * @return boolean success diff --git a/public/js/api/messages/person.js b/public/js/api/messages/person.js index 5cbb49550..7693c5189 100644 --- a/public/js/api/messages/person.js +++ b/public/js/api/messages/person.js @@ -14,6 +14,9 @@ export default { getMsgVarsPrestudent(uid){ return this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsPrestudent/' + uid); }, + getPersonIdFromUid(uid){ + return this.$fhcApi.get('api/frontend/v1/messages/messages/getPersonIdFromUid/' + uid); + }, getVorlagentext(vorlage_kurzbz){ return this.$fhcApi.get('api/frontend/v1/messages/messages/getVorlagentext/' + vorlage_kurzbz); }, @@ -24,6 +27,10 @@ export default { return this.$fhcApi.post('api/frontend/v1/messages/messages/getPreviewText/' + params.id + '/' + params.type_id, data); }, + getReplyData(messageId){ + return this.$fhcApi.get('api/frontend/v1/messages/messages/getReplyData/' + messageId); + + }, sendMessage(form, id, data) { return this.$fhcApi.post(form,'api/frontend/v1/messages/messages/sendMessage/' + id, data); diff --git a/public/js/apps/Nachrichten.js b/public/js/apps/Nachrichten.js index 0f921a9f8..84b9ddee5 100644 --- a/public/js/apps/Nachrichten.js +++ b/public/js/apps/Nachrichten.js @@ -8,6 +8,7 @@ const router = VueRouter.createRouter({ history: VueRouter.createWebHistory(), routes: [ { path: `/${ciPath}/NeueNachricht/:id/:typeId`, component: NewMessage }, + { path: `/${ciPath}/NeueNachricht/:id/:typeId/:messageId`, component: NewMessage }, ] }); diff --git a/public/js/components/Messages/Details/NewMessage/NewDiv.js b/public/js/components/Messages/Details/NewMessage/NewDiv.js index b31cd9932..1eb59aa20 100644 --- a/public/js/components/Messages/Details/NewMessage/NewDiv.js +++ b/public/js/components/Messages/Details/NewMessage/NewDiv.js @@ -36,6 +36,9 @@ export default { }, typeId(){ return this.$route.params.typeId || this.$props.id; + }, + messageId(){ + return this.$route.params.messageId; } }, data(){ @@ -62,7 +65,8 @@ export default { itemsPerson: [], itemsUser: [], previewText: null, - previewBody: "" + previewBody: "", + replyData: null } }, methods: { @@ -179,9 +183,9 @@ export default { console.error("Editor instance is not available."); } }, - replyMessage(message_id){ +/* replyMessage(message_id){ console.log("auf message " + message_id + " antworten"); - }, + },*/ resetForm(){ this.formData = { vorlage_kurzbz: null, @@ -293,6 +297,19 @@ export default { }) .catch(this.$fhcAlert.handleSystemError); + if(this.messageId != null) { + + //get replayBody.. body receivername, receiverSurname, sentDate of message + this.$fhcApi.factory.messages.person.getReplyData(this.messageId) + .then(result => { + this.replyData = result.data; + this.formData.subject = this.replyData[0].replySubject; + this.formData.body = this.replyData[0].replyBody; + }) + .catch(this.$fhcAlert.handleSystemError); + + } + }, async mounted() { this.initTinyMCE(); @@ -309,13 +326,7 @@ export default {
- - {{id}} || {{typeId}} -

New Message

-
diff --git a/public/js/components/Messages/Details/TableMessages.js b/public/js/components/Messages/Details/TableMessages.js index 7994cbe1d..ab6a76599 100644 --- a/public/js/components/Messages/Details/TableMessages.js +++ b/public/js/components/Messages/Details/TableMessages.js @@ -1,12 +1,12 @@ import {CoreFilterCmpt} from "../../filter/Filter.js"; import FormForm from '../../Form/Form.js'; -import NewMessage from "../Details/NewMessage.js"; +//import NewMessage from "../Details/NewMessage.js"; export default { components: { CoreFilterCmpt, FormForm, - NewMessage, + // NewMessage, }, inject: { cisRoot: { @@ -110,13 +110,15 @@ export default { container.className = "d-flex gap-2"; let button = document.createElement('button'); + if (this.personId != cell.getData().recipient_id) + button.disabled = true; button.className = 'btn btn-outline-secondary btn-action'; button.title = this.$p.t('global', 'reply'); button.innerHTML = ''; button.addEventListener( 'click', (event) => - this.reply(cell.getData().message_id) + this.actionReplyToMessage(cell.getData().message_id) ); container.append(button); @@ -141,6 +143,8 @@ export default { height: '400', selectable: true, selectableRangeMode: 'click', + pagination: true, + // paginationSize: 5, /* layoutColumnsOnNewData: false, selectableRangeMode: 'click', @@ -208,13 +212,11 @@ export default { ], tabulatorData: [], previewBody: "", - open: false + open: false, + personId: null } }, methods: { - reply(message_id){ - console.log("in reply " + message_id); - }, actionDeleteMessage(message_id){ this.$fhcAlert .confirmDelete() @@ -225,7 +227,6 @@ export default { .catch(this.$fhcAlert.handleSystemError); }, deleteMessage(message_id){ - // console.log("deleteMessage " + message_id); return this.$fhcApi.factory.messages.person.deleteMessage(message_id) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); @@ -240,6 +241,9 @@ export default { //console.log("action new message"); }, + actionReplyToMessage(message_id){ + this.$emit('replyToMessage', this.id, this.typeId, message_id); + }, reload() { this.$refs.table.reloadTable(); }, @@ -264,6 +268,15 @@ export default { }); });*/ }, + created(){ + if(this.typeId == 'uid') { + this.$fhcApi.factory.messages.person.getPersonIdFromUid(this.id) + .then(result => { + this.personId = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + } + }, template: `
diff --git a/public/js/components/Messages/Messages.js b/public/js/components/Messages/Messages.js index 49fdbdf79..e6947a72a 100644 --- a/public/js/components/Messages/Messages.js +++ b/public/js/components/Messages/Messages.js @@ -76,6 +76,23 @@ export default { else console.log("no valid openMode"); }, + handleMessage(id, typeId, messageId){ + console.log("in handleMessage " + messageId); + if (this.openMode == "window") { + this.openInNewWindow(id, typeId, messageId); + } + else if (this.openMode == "newTab"){ + this.openInNewTab(id, typeId, messageId); + } + else if (this.openMode == "modal"){ + this.openInModal(id, typeId, messageId); + } + else if (this.openMode == "showDiv"){ + this.$refs.templateNewMessage.showTemplate(id, typeId, messageId); + } + else + console.log("no valid openMode"); + }, openInDiv(id, typeId){ this.$refs.templateNewMessage.showTemplate(id, typeId); //this.showDiv = true; //local variante @@ -85,15 +102,26 @@ export default { //TODO(manu) define bs-modal in this component this.$refs.templateNewMessage.$refs.modalMsg.show(); }, - openInNewTab(id, typeId){ +/* openInNewTab(id, typeId){ //TODO(MANU) check if array of ids... -/* let path = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router; - path += "/NeueNachricht/" + this.id + "/" + this.typeId;*/ - - //als param let path = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router; path += "/NeueNachricht/" + id + "/" + typeId; + const newTab = window.open(path, "_blank"); + },*/ + openInNewTab(id, typeId, messageId=null){ + //TODO(MANU) check if array of ids... + let path = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router; + + if (messageId){ + path += "/NeueNachricht/" + id + "/" + typeId + "/" + messageId; + } + + else { + path += "/NeueNachricht/" + id + "/" + typeId; + } + + const newTab = window.open(path, "_blank"); }, openInNewWindow(id, typeId){ @@ -152,7 +180,8 @@ export default { :endpoint="endpoint" :messageLayout="messageLayout" :openMode="openMode" - @newMessage="newMessage" + @newMessage="newMessage" + @replyToMessage="handleMessage" >