prepare basic framework

This commit is contained in:
ma0068
2025-02-06 08:34:34 +01:00
parent a1841a0071
commit 018220594a
12 changed files with 297 additions and 6 deletions
@@ -0,0 +1,45 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Messages extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getMessages' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('system/Message_model', 'MessageModel');
// Additional Permission Checks
//TODO(manu) check permissions
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
public function getMessages($id, $type_id)
{
//$this->terminateWithError("in backend " . $type_id . ": " . $id, self::ERROR_TYPE_GENERAL);
if ($type_id != "person_id")
{
$this->terminateWithError("logic for type_id " . $type_id . " not defined yet", self::ERROR_TYPE_GENERAL);
}
$result = $this->MessageModel->getMessagesOfPerson($id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -91,6 +91,10 @@ class Config extends FHCAPI_Controller
'title' => $this->p->t('stv', 'tab_resources'),
'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js'
];
$result['messages'] = [
'title' => $this->p->t('stv', 'tab_messages'),
'component' => './Stv/Studentenverwaltung/Details/Messages.js'
];
/* TODO(chris): Ausgeblendet für Testing
$result['grades'] = [
'title' => $this->p->t('stv', 'tab_grades'),
@@ -48,7 +48,7 @@ class Favorites extends FHCAPI_Controller
if (!$data)
$this->terminateWithSuccess(null);
else
$this->terminateWithSuccess($data['stv_favorites']);
$this->terminateWithSuccess($data['stv_favorites'] ?? null);
}
public function set()
+6 -3
View File
@@ -85,7 +85,7 @@ class Message_model extends DB_Model
*/
public function getMessagesOfPerson($person_id, $status = null)
{
$sql = 'SELECT m.message_id,
$sql = "SELECT m.message_id,
m.person_id,
m.subject,
m.body,
@@ -109,7 +109,10 @@ class Message_model extends DB_Model
re.vornamen AS revornamen,
s.status,
s.statusinfo,
s.insertamum AS statusamum
s.insertamum AS statusamum,
CONCAT(se.titelpre, ' ', se.vorname, ' ', se.nachname, ' ', se.titelpost) as sender,
CONCAT(re.titelpre, ' ', re.vorname, ' ', re.nachname, ' ', re.titelpost ) as recipient,
TO_CHAR(s.insertamum::timestamp, 'DD.MM.YYYY HH24:MI') AS format_insertamum
FROM public.tbl_msg_message m
JOIN public.tbl_msg_recipient r ON m.message_id = r.message_id
JOIN public.tbl_person se ON (m.person_id = se.person_id)
@@ -122,7 +125,7 @@ class Message_model extends DB_Model
) s ON (m.message_id = s.message_id AND re.person_id = s.person_id)
WHERE se.person_id = ?
OR re.person_id = ?
';
";
if (is_numeric($status))
{
+3 -1
View File
@@ -33,6 +33,7 @@ import ort from "./ort.js";
import cms from "./cms.js";
import lehre from "./lehre.js";
import addons from "./addons.js";
import messages from "./messages.js";
export default {
search,
@@ -52,5 +53,6 @@ export default {
ort,
cms,
lehre,
addons
addons,
messages
};
+5
View File
@@ -0,0 +1,5 @@
import person from "./messages/person.js";
export default {
person
}
+6
View File
@@ -0,0 +1,6 @@
export default {
getMessages(url, config, params){
console.log("in api", params);
return this.$fhcApi.get('api/frontend/v1/messages/messages/getMessages/' + params.id + '/' + params.type);
},
}
@@ -0,0 +1,13 @@
export default {
data(){
return {
}
},
template: `
<div class="messages-detail-newmessage">
<h4>New Message</h4>
</div>
`
}
@@ -0,0 +1,117 @@
import {CoreFilterCmpt} from "../../filter/Filter.js";
export default {
components: {
CoreFilterCmpt,
},
props: {
endpoint: {
type: String,
required: true
},
typeId: String,
id: {
type: [Number, String],
required: true
},
},
//TODO(Manu) endpoint macht Probleme
data(){
return {
tabulatorOptions: {
ajaxURL: 'dummy',
ajaxRequestFunc: this.$fhcApi.factory.messages.person.getMessages,
ajaxParams: () => {
return {
id: this.id,
type: this.typeId
};
},
ajaxResponse: (url, params, response) => response.data,
columns: [
{title: "subject", field: "subject"},
{title: "body", field: "body", visible: false},
{title: "message_id", field: "message_id", visible: false},
{title: "datum", field: "format_insertamum"},
{title: "sender", field: "sender"},
{title: "recipient", field: "recipient"},
{title: "sepersonid", field: "sepersonid"},
{title: "repersonid", field: "repersonid"},
{title: "status", field: "status"},
{
title: 'Aktionen', field: 'actions',
width: 100,
formatter: (cell, formatterParams, onRendered) => {
let container = document.createElement('div');
container.className = "d-flex gap-2";
let button = document.createElement('button');
button.className = 'btn btn-outline-secondary btn-action';
button.title = this.$p.t('ui', 'notiz_edit');
button.innerHTML = '<i class="fa fa-edit"></i>';
button.addEventListener(
'click',
(event) =>
this.actionEditNotiz(cell.getData().notiz_id)
);
container.append(button);
button = document.createElement('button');
button.className = 'btn btn-outline-secondary btn-action';
button.title = this.$p.t('notiz', 'notiz_delete');
button.innerHTML = '<i class="fa fa-xmark"></i>';
button.addEventListener(
'click',
() =>
this.actionDeleteNotiz(cell.getData().notiz_id)
);
container.append(button);
return container;
},
frozen: true
}],
layout: 'fitColumns',
layoutColumnsOnNewData: false,
height: '250',
selectableRangeMode: 'click',
selectable: true,
index: 'message_id',
persistenceID: 'core-message'
},
}
},
/* computed: {
statusText(){
0: this.$p.t('messsages', 'unread'),
1: this.$p.t('messsages', 'read'),
2: this.$p.t('messsages', 'archived'),
0: this.$p.t('messsages', 'unread'),
3: this.$p.t('person', 'deleted'),
}
},*/
template: `
<div class="messages-detail-table">
<h4>Table Messages</h4>
<p>type_id: {{typeId}}</p>
<p>id: {{id}}</p>
<p>endpoint: {{endpoint}}</p>
<!-- {{statusText}}-->
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"
table-only
:side-menu="false"
reload
new-btn-show
:new-btn-label="this.$p.t('global', 'nachricht')"
@click:new="actionNewNotiz"
>
</core-filter-cmpt>
</div>
`
}
+48
View File
@@ -0,0 +1,48 @@
import TableMessages from "./Details/TableMessages.js";
import NewMessage from "./Details/NewMessage.js";
export default {
components: {
TableMessages,
NewMessage
},
props: {
endpoint: {
type: String,
required: true
},
typeId: String,
id: {
type: [Number, String],
required: true
},
showNew: Boolean,
showTable: Boolean
},
data() {
return {}
},
template: `
<div class="core-messages h-100 pb-3">
<p>endpoint: {{endpoint}}</p>
<div v-if="showNew">
<NewMessage
>
</NewMessage>
</div>
<div v-if="showTable">
<TableMessages
:type-id="typeId"
:id="id"
:endpoint="endpoint"
>
</TableMessages>
</div>
</div>
`
}
@@ -0,0 +1,25 @@
import CoreMessages from "../../../Messages/Messages.js";
export default {
components: {
CoreMessages
},
props: {
modelValue: Object
},
template: `
<div class="stv-details-messages h-100 pb-3 overflow-hidden">
<core-messages
ref="formc"
endpoint="$fhcApi.factory.messages.person"
type-id="person_id"
:id="modelValue.person_id"
show-table
>
</core-messages>
</div>
`
};
+24 -1
View File
@@ -37297,7 +37297,30 @@ array(
'insertvon' => 'system'
)
)
)
),
/////////// FHC4 Phrases Messages START ///////////
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'tab_messages',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Nachrichten',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Messages',
'description' => '',
'insertvon' => 'system'
)
)
),
/////////// FHC4 Phrases Messages END ///////////
);