Compare commits

...
Author SHA1 Message Date
Manuela Thamer 80969164ae add changes also to layouts classicFas, twoColumnsFormRight and TwoColumnsFormLeft 2026-08-20 14:59:16 +02:00
Manuela Thamer c5e6760f30 Refactoring of Notizlayout popupModal:
use PV Dropdowns Autocomplete for fields verfasser und bearbeiter
new function getDefaultVerfasser
2026-08-20 14:14:10 +02:00
5 changed files with 240 additions and 128 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ $config['tabs'] =
'showCountNotes' => true,
//if true: section with following fields will be displayed: 'verfasser', 'bearbeiter', 'von', 'bis' and 'erledigt'
'showErweitert' => false,
'showErweitert' => true,
//notizlayout: choose of "classicFas", "twoColumnsFormLeft", twoColumnsFormRight, popupModal"
'notizLayout' => 'popupModal'
@@ -18,7 +18,7 @@ class NotizPerson extends Notiz_Controller
'loadDokumente' => ['admin:r', 'assistenz:r'],
'getMitarbeiter' => ['admin:r', 'assistenz:r'],
'isBerechtigt' => ['admin:r', 'assistenz:r'],
'getCountNotes' => ['admin:r', 'assistenz:r'],
'getCountNotes' => ['admin:r', 'assistenz:r']
]);
//Load Models
+58 -10
View File
@@ -12,7 +12,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
public function __construct($permissions)
{
$default_permissions = [
'getUid' => self::DEFAULT_PERMISSION_R,
'getDefaultVerfasser' => self::DEFAULT_PERMISSION_R,
'getNotizen' => self::DEFAULT_PERMISSION_R,
'loadNotiz' => self::DEFAULT_PERMISSION_R,
'addNewNotiz' => self::DEFAULT_PERMISSION_RW,
@@ -21,7 +21,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
'loadDokumente' => self::DEFAULT_PERMISSION_R,
'getMitarbeiter' => self::DEFAULT_PERMISSION_R,
'isBerechtigt' => self::DEFAULT_PERMISSION_R,
'getCountNotes' => self::DEFAULT_PERMISSION_R,
'getCountNotes' => self::DEFAULT_PERMISSION_R
];
if(!is_array($permissions))
@@ -46,9 +46,20 @@ abstract class Notiz_Controller extends FHCAPI_Controller
]);
}
public function getUid()
public function getDefaultVerfasser()
{
$this->terminateWithSuccess(getAuthUID());
$uid = getAuthUID();
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->MitarbeiterModel->addSelect('p.person_id, p.nachname, p.vorname, p.titelpost, p.titelpre, ben.uid');
$this->MitarbeiterModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = public.tbl_mitarbeiter.mitarbeiter_uid)', 'LEFT');
$this->MitarbeiterModel->addJoin('public.tbl_person p', 'ON (p.person_id = ben.person_id)', 'LEFT');
$result = $this->MitarbeiterModel->loadWhere(
array('mitarbeiter_uid' => $uid)
);
if(hasData($result))
$data = getData($result);
$this->terminateWithSuccess(current($data));
}
@@ -106,7 +117,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
}
public function loadNotiz()
/* public function loadNotiz()
{
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
@@ -118,6 +129,43 @@ abstract class Notiz_Controller extends FHCAPI_Controller
THEN public.tbl_notiz.updateamum ELSE public.tbl_notiz.insertamum END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate");
$this->NotizModel->addLimit(1);
$result = $this->NotizModel->loadWhere(
array('notiz_id' => $notiz_id)
);
if (isError($result))
{
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
elseif (!hasData($result))
{
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=>'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
else
{
$this->terminateWithSuccess(current(getData($result)));
}
}*/
public function loadNotiz()
{
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
$notiz_id = $this->input->post('notiz_id');
$this->NotizModel->addSelect('public.tbl_notiz.*');
$this->NotizModel->addSelect("TO_CHAR(CASE WHEN public.tbl_notiz.updateamum >= public.tbl_notiz.insertamum
THEN public.tbl_notiz.updateamum ELSE public.tbl_notiz.insertamum END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate");
$this->NotizModel->addSelect('perb.person_id AS perb_person_id, perb.vorname AS perb_vorname, perb.nachname AS perb_nachname,
perb.titelpre AS perb_titelpre, perb.titelpost AS perb_titelpost, benb.uid AS perb_uid');
$this->NotizModel->addSelect('perv.person_id AS perv_person_id, perv.vorname AS perv_vorname, perv.nachname AS perv_nachname,
perv.titelpre AS perv_titelpre, perv.titelpost AS perv_titelpost, benv.uid AS perv_uid');
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'notiz_id', 'LEFT');
$this->NotizModel->addJoin('public.tbl_benutzer benb', 'ON (benb.uid = public.tbl_notiz.bearbeiter_uid)', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person perb', 'ON (perb.person_id = benb.person_id)', 'LEFT');
$this->NotizModel->addJoin('public.tbl_benutzer benv', 'ON (benv.uid = public.tbl_notiz.verfasser_uid)', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person perv', 'ON (perv.person_id = benv.person_id)', 'LEFT');
$this->NotizModel->addLimit(1);
$result = $this->NotizModel->loadWhere(
array('notiz_id' => $notiz_id)
);
@@ -238,7 +286,6 @@ abstract class Notiz_Controller extends FHCAPI_Controller
public function updateNotiz()
{
$this->load->library('form_validation');
$this->load->library('DmsLib');
@@ -269,7 +316,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$uid = getAuthUID();
$titel = $post_data['titel'];
$text = $post_data['text'];
$bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : $post_data['bearbeiter_uid'];
$bearbeiter_uid = $post_data['bearbeiter'];
$erledigt = $post_data['erledigt'];
$start = $post_data['start'];
$ende = $post_data['ende'];
@@ -436,14 +483,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->terminateWithSuccess(getData($result));
}
public function getMitarbeiter($searchString)
public function getMitarbeiter()
{
$searchString = $this->input->get('searchString') ?? '';
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString);
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad');
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result);
$this->terminateWithSuccess($result ?: []);
}
public function getCountNotes($person_id)
+9 -2
View File
@@ -28,6 +28,12 @@ export default {
url: 'api/frontend/v1/notiz/notizPerson/getUid/'
};
},
getDefaultVerfasser() {
return {
method: 'get',
url: 'api/frontend/v1/notiz/notizPerson/getDefaultVerfasser/'
};
},
addNewNotiz(id, params) {
return {
method: 'post',
@@ -71,10 +77,11 @@ export default {
params
};
},
getMitarbeiter(event) {
getMitarbeiter(searchString) {
return {
method: 'get',
url: 'api/frontend/v1/notiz/notizPerson/getMitarbeiter/' + event
url: 'api/frontend/v1/notiz/notizPerson/getMitarbeiter',
params: { searchString }
};
},
isBerechtigt(id, type_id) {
+171 -114
View File
@@ -4,7 +4,7 @@ import {CoreFilterCmpt} from "../filter/Filter.js";
import BsModal from "../Bootstrap/Modal.js";
import FormForm from '../Form/Form.js';
import FormInput from '../Form/Input.js';
import PvAutoComplete from "../../../../index.ci.php/public/js/components/primevue/autocomplete/autocomplete.esm.min.js";
export default {
components: {
@@ -13,7 +13,8 @@ export default {
FormUploadDms,
FormForm,
FormInput,
BsModal
BsModal,
PvAutoComplete
},
props: {
endpoint: {
@@ -52,7 +53,6 @@ export default {
multiupload: true,
mitarbeiter: [],
filteredMitarbeiter: [],
zwischenvar: '',
editorInitialized: false,
editor: null,
notizData: {
@@ -85,7 +85,11 @@ export default {
showId: false,
showLastupdate: false
},
currentVerfasserUid: null
selectedBearbeiter: null,
selectedVerfasser: null,
abortController: {
mitarbeiter: null
}
}
},
computed: {
@@ -297,6 +301,15 @@ export default {
},
actionEditNotiz(notiz_id) {
this.loadNotiz(notiz_id).then(() => {
this.selectedBearbeiter = {
label: this.getLabelUid(this.notizData.perb_titelpre, this.notizData.perb_nachname, this.notizData.perb_vorname, this.notizData.perb_titelpost, this.notizData.perb_uid),
uid: this.notizData.perb_uid
}
this.selectedVerfasser = {
label: this.getLabelUid(this.notizData.perv_titelpre, this.notizData.perv_nachname, this.notizData.perv_vorname, this.notizData.perv_titelpost, this.notizData.perv_uid),
uid: this.notizData.perv_uid
}
if (this.notizen.notiz_id) {
this.notizData.typeId = this.typeId;
this.notizData.titel = this.notizen.titel;
@@ -308,8 +321,13 @@ export default {
this.notizData.bis = this.notizen.ende;
this.notizData.document = this.notizen.dms_id;
this.notizData.erledigt = this.notizen.erledigt;
this.notizData.intBearbeiter = this.notizen.bearbeiter_uid;
this.notizData.bearbeiter = this.notizen.bearbeiter_uid;
//this.notizData.bearbeiter_uid = this.notizen.bearbeiter_uid;
//for saving
//this.notizData.intBearbeiter = this.notizen.bearbeiter_uid;
//this.notizData.bearbeiter = this.notizen.bearbeiter_uid;
//new way
this.notizData.bearbeiter = this.selectedBearbeiter.uid;
this.notizData.verfasser = this.selectedVerfasser.uid;
}
})
.then(() => {
@@ -323,7 +341,9 @@ export default {
});
},
actionNewNotiz() {
console.log("auf plus");
this.resetFormData();
this.getDefaultVerfasser();
if(this.notizLayout == 'popupModal') {
this.$refs.NotizModal.show();
}
@@ -374,7 +394,6 @@ export default {
this.notizData = result.data;
this.notizData.typeId = this.typeId;
this.notizData.anhang = [];
this.currentVerfasserUid = result.data.verfasser_uid;
return result;
})
.catch(this.$fhcAlert.handleSystemError);
@@ -431,24 +450,54 @@ export default {
bearbeiter: null,
anhang: [],
};
this.currentVerfasserUid = this.uid
this.selectedBearbeiter = null;
this.selectedVerfasser = null;
},
getUid() {
getDefaultVerfasser() {
return this.$api
.call(this.endpoint.getUid())
.call(this.endpoint.getDefaultVerfasser())
.then(result => {
this.currentVerfasserUid = result.data;
this.uid = result.data;
const verfasser = result.data;
this.selectedVerfasser = {
label: this.getLabelUid(verfasser.titelpre, verfasser.nachname, verfasser.vorname, verfasser.titelpost, verfasser.mitarbeiter_uid),
uid: verfasser.uid
}
})
.catch(this.$fhcAlert.handleSystemError);
},
search(event) {
searchMitarbeiter(event) {
if (this.abortController.mitarbeiter) {
this.abortController.mitarbeiter.abort();
}
this.abortController.mitarbeiter = new AbortController();
return this.$api
.call(this.endpoint.getMitarbeiter(event.query))
.then(result => {
this.filteredMitarbeiter = result.data.retval;
//this.filteredMitarbeiter = result.data.retval;
this.filteredMitarbeiter = [];
for (let mitarbeiter of result.data.retval) {
this.filteredMitarbeiter.push(
{
label: this.getLabelUid(
mitarbeiter.titelpre,
mitarbeiter.nachname,
mitarbeiter.vorname,
mitarbeiter.titelpost,
mitarbeiter.mitarbeiter_uid
),
uid: mitarbeiter.mitarbeiter_uid
}
);
}
});
},
getLabelUid(titelpre, nachname, vorname, titelpost, uid) {
if (!nachname && !vorname && !uid)
return '';
return nachname + ' ' + vorname + (titelpre ? ' ' + titelpre : '') + (titelpost ? ' ' + titelpost : '') + (uid ? ' (' + uid + ')' : '');
},
initTinyMCE() {
const vm = this;
tinymce.init({
@@ -491,7 +540,7 @@ export default {
},
created() {
this.initializeShowVariables();
this.getUid();
this.getDefaultVerfasser();
},
async mounted() {
if (this.showTinyMce) {
@@ -512,18 +561,14 @@ export default {
}
}
},
//Watcher für autocomplete Bearbeiter und Verfasser
'notizData.intBearbeiter': {
handler(newVal) {
if (typeof newVal === 'object') {
this.notizData.bearbeiter = newVal.mitarbeiter_uid;
}
},
deep: true
},
id() {
this.reload();
},
selectedBearbeiter(newVal) {
this.notizData.bearbeiter = newVal?.uid || null;
},
selectedVerfasser(newVal) {
this.notizData.verfasser = newVal?.uid || null;
}
},
beforeUnmount() {
@@ -621,9 +666,21 @@ export default {
<div class="row mb-3">
<label for="bis" class="form-label col-sm-2">{{$p.t('notiz','verfasser')}}</label>
<div class="col-sm-3">
<input type="text" readonly="readonly" class="form-control" id="name" v-model="currentVerfasserUid">
</div>
<form-input
type="autocomplete"
container-class="col-3"
v-model="selectedVerfasser"
optionLabel="label"
optionValue="uid"
disabled
dropdown
forceSelection
name="bearbeiter"
:suggestions="filteredMitarbeiter"
@complete="searchMitarbeiter"
:min-length="3"
>
</form-input>
<label for="von" class="form-label col-sm-1">{{$p.t('global','gueltigVon')}}</label>
<div class="col-sm-3">
@@ -644,21 +701,20 @@ export default {
<div class="row mb-3">
<label for="bis" class="form-label col-sm-2">{{$p.t('notiz','bearbeiter')}}</label>
<div v-if="notizData.bearbeiter_uid" class="col-sm-3">
<input type="text" class="form-control" id="name" v-model="notizData.bearbeiter_uid">
</div>
<div v-else class="col-sm-3">
<form-input
type="autocomplete"
v-model="notizData.intBearbeiter"
:suggestions="filteredMitarbeiter"
@complete="search"
optionLabel="mitarbeiter"
minlength="3"
<form-input
type="autocomplete"
container-class="col-3"
v-model="selectedBearbeiter"
optionLabel="label"
optionValue="uid"
dropdown
forceSelection
name="bearbeiter"
:suggestions="filteredMitarbeiter"
@complete="searchMitarbeiter"
:min-length="3"
>
</form-input>
</div>
</form-input>
<label for="bis" class="form-label col-sm-1">{{$p.t('global','gueltigBis')}}</label>
@@ -816,35 +872,36 @@ export default {
</div>
<div class="row mb-3">
<form-input
<form-input
type="autocomplete"
container-class="col-6"
:label="$p.t('notiz', 'verfasser')"
type="text"
readonly="readonly"
v-model="currentVerfasserUid"
name="verfasser"
v-model="selectedVerfasser"
optionLabel="label"
optionValue="uid"
disabled
dropdown
forceSelection
name="bearbeiter"
:suggestions="filteredMitarbeiter"
@complete="searchMitarbeiter"
:min-length="3"
>
</form-input>
<form-input
v-if="notizData.bearbeiter_uid"
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
v-model="notizData.bearbeiter_uid"
minlength="3"
>
</form-input>
<form-input
v-else
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
type="autocomplete"
v-model="notizData.intBearbeiter"
:suggestions="filteredMitarbeiter"
@complete="search"
optionLabel="mitarbeiter"
minlength="3"
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
v-model="selectedBearbeiter"
optionLabel="label"
optionValue="uid"
dropdown
forceSelection
name="bearbeiter"
:suggestions="filteredMitarbeiter"
@complete="searchMitarbeiter"
:min-length="3"
>
</form-input>
</div>
@@ -969,37 +1026,38 @@ export default {
<div class="row mb-3">
<form-input
<form-input
type="autocomplete"
container-class="col-6"
:label="$p.t('notiz', 'verfasser')"
type="text"
readonly="readonly"
v-model="currentVerfasserUid"
name="verfasser"
v-model="selectedVerfasser"
optionLabel="label"
optionValue="uid"
disabled
dropdown
forceSelection
name="bearbeiter"
:suggestions="filteredMitarbeiter"
@complete="searchMitarbeiter"
:min-length="3"
>
</form-input>
<form-input
v-if="notizData.bearbeiter_uid"
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
v-model="notizData.bearbeiter_uid"
minlength="3"
>
</form-input>
<form-input
v-else
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
type="autocomplete"
v-model="notizData.intBearbeiter"
:suggestions="filteredMitarbeiter"
@complete="search"
optionLabel="mitarbeiter"
minlength="3"
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
v-model="selectedBearbeiter"
optionLabel="label"
optionValue="uid"
dropdown
forceSelection
name="bearbeiter"
:suggestions="filteredMitarbeiter"
@complete="searchMitarbeiter"
:min-length="3"
>
</form-input>
</form-input>
</div>
<div class="row mb-3">
@@ -1140,44 +1198,43 @@ export default {
>
</form-input>
</div>
<div class="row mb-3">
<form-input
<form-input
type="autocomplete"
container-class="col-6"
:label="$p.t('notiz', 'verfasser')"
type="text"
readonly="readonly"
v-model="currentVerfasserUid"
name="verfasser"
>
</form-input>
<form-input
v-if="notizData.bearbeiter_uid"
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
v-model="notizData.bearbeiter_uid"
v-model="selectedVerfasser"
optionLabel="label"
optionValue="uid"
disabled
dropdown
forceSelection
name="bearbeiter"
minlength="3"
:suggestions="filteredMitarbeiter"
@complete="searchMitarbeiter"
:min-length="3"
>
</form-input>
<form-input
v-else
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
type="autocomplete"
v-model="notizData.intBearbeiter"
:suggestions="filteredMitarbeiter"
@complete="search"
optionLabel="mitarbeiter"
container-class="col-6"
:label="$p.t('notiz', 'bearbeiter')"
v-model="selectedBearbeiter"
optionLabel="label"
optionValue="uid"
dropdown
forceSelection
name="bearbeiter"
minlength="3"
:suggestions="filteredMitarbeiter"
@complete="searchMitarbeiter"
:min-length="3"
>
</form-input>
</form-input>
</div>
<div class="row mb-3">
<div class="col-2 pt-4 d-flex align-items-center">
<form-input