adapt headerFilter, remove frontend filter, add backend filter aktiv mitarbeiter

This commit is contained in:
ma0068
2025-09-02 20:29:23 +02:00
parent ea85cce957
commit e5cf417ac0
8 changed files with 147 additions and 71 deletions
@@ -0,0 +1,29 @@
<?php
$filterCmptArray = array(
"app" => 'core',
'datasetName' => 'vertragsverwaltung',
'query' => '
SELECT
b.uid , p.person_id,
p.vorname, p.nachname,
gebdatum,
COALESCE(b.alias, b.uid) AS email,
STRING_AGG(DISTINCT va.bezeichnung, \', \') AS Vertragsarten,
STRING_AGG(DISTINCT u.bezeichnung, \', \') AS Unternehmen,
STRING_AGG(d.dienstverhaeltnis_id::TEXT, \', \') AS ids,
CASE
WHEN b.aktiv = true THEN \'aktiv\'
ELSE \'naktiv\'
END AS "aktiv"
FROM
hr.tbl_dienstverhaeltnis d
JOIN public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid
JOIN public.tbl_person p ON p.person_id = b.person_id
JOIN public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz
JOIN hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz
WHERE b.aktiv = true
GROUP BY b.uid, p.person_id, p.vorname, p.nachname, b.alias, b.aktiv
ORDER BY nachname, vorname
',
'requiredPermissions' => 'vertrag/mitarbeiter'
);
+1
View File
@@ -332,4 +332,5 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
'target' => '_blank',
'requiredPermissions' => array('admin:rw')
),
);
@@ -9,6 +9,7 @@ class Vertragsverwaltung extends Auth_Controller
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['vertrag/mitarbeiter:r'];
#$permissions[$router->method] = ['admin:rw'];
parent::__construct($permissions);
// Load Libraries
@@ -126,6 +126,7 @@ export default {
params
};
},
//loaded by mitarbeiter_header_js
getMitarbeiter(){
return {
method: 'get',
@@ -181,13 +181,13 @@ export default {
</template>
<template v-if="typeHeader==='mitarbeiter'">
<div class="row">
<div class="col-md-2 d-flex justify-content-start align-items-center w-30 pb-3 gap-3 position-relative"
style="max-height: 8rem; max-width: 6rem; overflow: hidden;">
<div class="col-md-2 d-flex justify-content-start align-items-center w-30 pb-3 gap-3 mt-3 position-relative" style="max-height: 8rem; max-width: 6rem; overflow: hidden;">
<img
class="d-block h-100 rounded"
class="d-block w-100 h-100 rounded"
alt="Profilbild"
:src="'data:image/jpeg;base64,' + headerDataMa.foto"
style="object-fit: contain;"
/>
<template v-if="headerDataMa.foto_sperre">
<i
@@ -198,28 +198,42 @@ export default {
</div>
<!--show Ma-Details-->
<div class="col-md-10">
<h5>{{headerDataMa.titelpre}} {{headerDataMa.vorname}} {{headerDataMa.nachname}}<span v-if="headerDataMa?.titelpost">, </span> {{headerDataMa.titelpost}}
</h5>
<div class="col-md-9 text-nowrap mt-2">
<h4>{{headerDataMa.titelpre}} {{headerDataMa.vorname}} {{headerDataMa.nachname}}<span v-if="headerDataMa?.titelpost">, </span> {{headerDataMa.titelpost}}</h4>
<strong class="text-muted">{{departmentData.organisationseinheittyp_kurzbz}}</strong>
{{departmentData.bezeichnung}}
<span v-if="leitungData.uid"> | </span>
<strong v-if="leitungData.uid" class="text-muted">Vorgesetzte*r </strong>
<a href="#" @click.prevent="redirectToLeitung">
<a href="#" @click.prevent="redirectToLeitung" >
{{leitungData.titelpre}} {{leitungData.vorname}} {{leitungData.nachname}}
</a>
<p>
<strong class="text-muted">Email </strong>
<span v-if="!headerDataMa?.alias">
<a :href="'mailto:'+headerDataMa?.uid+'@'+domain">{{headerDataMa.uid}}@{{domain}}</a>
<span v-if="headerDataMa && (headerDataMa.alias === undefined || headerDataMa.alias === null || headerDataMa.alias === '')">
<a :href="'mailto:' + mitarbeiter_uid + '@' + domain">
{{ mitarbeiter_uid }}@{{ domain }}
</a>
</span>
<span v-if="headerDataMa?.alias">
<span v-else>
<a :href="'mailto:'+headerDataMa?.alias+'@'+domain">{{headerDataMa.alias}}@{{domain}}</a>
</span>
<span v-if="headerDataMa?.telefonklappe" class="mb-2"> | <strong class="text-muted">DW </strong>{{headerDataMa?.telefonklappe}}</span>
</p>
</div>
</div>
<div class="col-md-1 d-flex flex-column align-items-end justify-content-start ms-auto">
<div class="d-flex py-1">
<div class="px-2">
<h4 class="mb-1">PNr</h4>
<h6 class="text-muted">{{ headerDataMa?.person_id }}</h6>
</div>
<div class="px-2" style="border-left: 1px solid #EEE">
<h4 class="mb-1">UID</h4>
<h6 class="text-muted">{{ mitarbeiter_uid }}</h6>
</div>
</div>
</div>
</template>
</div>
`
@@ -15,9 +15,14 @@ export default {
type: Object,
required: true
},
domain: {
type: String,
required: true
}
},
data() {
return {
tabulatorData: [],
tabulatorOptions: {
ajaxURL: 'dummy',
ajaxRequestFunc: () => this.$api.call(
@@ -25,23 +30,15 @@ export default {
),
ajaxResponse: (url, params, response) => response.data,
columns: [
{title: "UID", field: "uid", headerFilter:"input"},
{title: "personID", field: "person_id", visible: false, headerFilter:"input"},
{title: "Nachname", field: "nachname", headerFilter:"input"},
{title: "Vorname", field: "vorname", headerFilter:"input"},
{
title: "Aktiv", field: "aktiv", headerFilter: "input",
formatter:"tickCross",
hozAlign:"center",
formatterParams: {
tickElement: '<i class="fa fa-check text-success"></i>',
crossElement: '<i class="fa fa-xmark text-danger"></i>'
}
},
{title: "UID", field: "uid", headerFilter: "input"},
{title: "personID", field: "person_id", visible: false, headerFilter: "input"},
{title: "Nachname", field: "nachname", visible: true, headerFilter: "input"},
{title: "Vorname", field: "vorname", visible: true, headerFilter: "input"},
{
title: "Geburtsdatum",
field: "gebdatum",
headerFilter:"input",
headerFilter: "input",
visible: true,
formatter: function (cell) {
const dateStr = cell.getValue();
const date = new Date(dateStr);
@@ -52,12 +49,38 @@ export default {
});
}
},
{title: "Unternehmen", field: "unternehmen", headerFilter:"input"},
{title: "Vertragsarten", field: "vertragsarten", headerFilter:"input"},
{title: "Ids Dienstverträge", field: "ids", headerFilter:"input"},
{
title: "Aktiv", field: "aktiv", visible: false, headerFilter: true, width: 85,
formatter:"tickCross",
hozAlign:"center",
formatter: function(cell) {
return cell.getValue() === "aktiv"
? '<i class="fa fa-check text-success"></i>'
: '<i class="fa fa-xmark text-danger"></i>';
}
},
{title: "Unternehmen", field: "unternehmen", visible: false, headerFilter: "input"},
{title: "Vertragsarten", field: "vertragsarten", visible: true, headerFilter: "input"},
{title: "Ids Dienstverträge", field: "ids", visible: true, headerFilter: "input"},
{
title: "email", field: "email", headerFilter: "input",
visible: false,
formatter: (cell, formatterParams, onRendered) => {
let email = cell.getValue() + '@';
let container = document.createElement('div');
container.className = "d-flex";
container.append(email);
container.append(cell.getData().emailDomain);
return container;
},
},
],
layout: 'fitColumns',
persistenceID: 'core-mitarbeiter',
persistenceID: 'core-mitarbeiter_20250901',
footerElement: '<div>&sum; <span id="search_count"></span> / <span id="total_count"></span></div>',
selectableRangeMode: 'click',
selectable: true,
},
@@ -74,18 +97,21 @@ export default {
let cm = this.$refs.table.tabulator.columnManager;
cm.getColumnByField('uid').component.updateDefinition({
visible: true
});
cm.getColumnByField('person_id').component.updateDefinition({
title: this.$p.t('person', 'person_id')
});
cm.getColumnByField('nachname').component.updateDefinition({
title: this.$p.t('person', 'nachname')
title: this.$p.t('person', 'nachname'),
visible: true
});
cm.getColumnByField('vorname').component.updateDefinition({
title: this.$p.t('person', 'vorname')
});
cm.getColumnByField('aktiv').component.updateDefinition({
title: this.$p.t('global', 'aktiv')
title: this.$p.t('person', 'vorname'),
visible: true
});
cm.getColumnByField('gebdatum').component.updateDefinition({
title: this.$p.t('person', 'geburtsdatum')
@@ -94,17 +120,41 @@ export default {
title: this.$p.t('person', 'firma')
});
cm.getColumnByField('vertragsarten').component.updateDefinition({
title: this.$p.t('vertrag', 'vertragsarten')
title: this.$p.t('vertrag', 'vertragsarten'),
visible: true
});
cm.getColumnByField('ids').component.updateDefinition({
title: this.$p.t('vertrag', 'idsDienstverhaeltnisse')
title: this.$p.t('vertrag', 'idsDienstverhaeltnisse'),
visible: true
});
cm.getColumnByField('aktiv').component.updateDefinition({
title: this.$p.t('global', 'aktiv'),
width: 45
});
}
}
},
{
event: "dataFiltered",
handler: function(filters, rows) {
let el = document.getElementById("search_count");
el.innerHTML = rows.length;
}
},
{
event: 'dataLoaded',
handler: (data) => {
let el = document.getElementById("total_count");
el.innerHTML = data.length;
this.tabulatorData = data.map(item => {
item.emailDomain = document.createElement('div');
return item;
});
}
},
],
selectedPerson: null,
selectedUid: null,
isFilterSet: false,
}
},
methods: {
@@ -117,41 +167,22 @@ export default {
uid: this.selectedUid
});
},
onSwitchChange() {
if (this.isFilterSet) {
this.$refs.table.tabulator.setFilter("aktiv", "=", true);
}
else {
this.$refs.table.tabulator.clearFilter();
}
},
},
template: `
<div class="core-mitarbeiter-header">
<h4>{{$p.t('vertrag', 'vertragsverwaltung')}}</h4>
<!-- filter: show only active employees-->
<div class="justify-content-end py-3">
<form-input
container-class="form-switch"
type="checkbox"
:label="$p.t('vertrag/nurAktiveMaAnzeigen')"
v-model="isFilterSet"
@change="onSwitchChange"
>
</form-input>
</div>
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"
:tabulator-events="tabulatorEvents"
table-only
filter-type="Vertragsverwaltung"
:side-menu="false"
>
</core-filter-cmpt>
</div>`
<Teleport v-for="data in tabulatorData" :key="data.uid" :to="data.emailDomain">
{{domain}}
</Teleport>
`
}
@@ -46,12 +46,12 @@ export default {
<core-navigation-cmpt/>
<div class="vv">
<main>
<vertical-split ref="vsplit">
<template #top>
<div class="d-flex flex-column" style="height: 100%;">
<mitarbeiter-header
:endpoint="endpoint"
:domain="config.domain"
@selectionChanged="handleSelection"
/>
</div>
@@ -72,7 +72,6 @@ export default {
</div>
</template>
</vertical-split>
</main>
</div>
`
}
+5 -5
View File
@@ -1567,7 +1567,7 @@ $filters = array(
'default_filter' => true,
'filter' => '
{
"name": "Vertragsverwaltung",
"name": "MA Vertragsverwaltung (aktiv)",
"columns": [
{"name": "UID"},
{"name": "PersonId"},
@@ -1579,13 +1579,13 @@ $filters = array(
{"name": "Firma"},
{"name": "Vertragsarten"},
{"name": "IDs Dienstverhältnis"},
{"name": "email"}
],
"filters": []
}
',
"filters": [
]
}',
'oe_kurzbz' => null,
),
);
// Loop through the filters array