Studiensemester in Variable

This commit is contained in:
cgfhtw
2023-10-05 11:08:52 +02:00
parent d1377b3f4e
commit 484a48e309
7 changed files with 175 additions and 17 deletions
@@ -16,11 +16,15 @@ class Studentenverwaltung extends FHC_Controller
{
$this->load->library('AuthLib');
$this->load->library('PermissionLib');
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->view('Studentenverwaltung', [
'permissions' => [
'student/bpk' => $this->permissionlib->isBerechtigt('student/bpk'),
'student/alias' => $this->permissionlib->isBerechtigt('student/alias')
],
'variables' => [
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell')
]
]);
}
@@ -8,6 +8,9 @@ class Students extends FHC_Controller
{
// TODO(chris): access!
parent::__construct();
$this->load->library('AuthLib');
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
}
/**
@@ -169,8 +172,7 @@ class Students extends FHC_Controller
*/
protected function getStudents($studiengang_kz, $semester = null, $verband = null, $gruppe = null, $gruppe_kurzbz = null, $orgform_kurzbz = null)
{
// TODO(chris): stdSem from Variable
$studiensemester_kurzbz='SS2023';
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
@@ -277,8 +279,7 @@ class Students extends FHC_Controller
*/
protected function getStudent($student_uid)
{
// TODO(chris): stdSem from Variable
$studiensemester_kurzbz='SS2023';
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
@@ -353,8 +354,7 @@ class Students extends FHC_Controller
*/
protected function getPrestudent($prestudent_id)
{
// TODO(chris): stdSem from Variable
$studiensemester_kurzbz='SS2023';
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
@@ -0,0 +1,59 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Studiensemester extends FHC_Controller
{
public function __construct()
{
// TODO(chris): access!
parent::__construct();
}
public function index()
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addOrder('start');
$result = $this->StudiensemesterModel->load();
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
$this->outputJson(getError($result));
} elseif (!hasData($result)) {
$this->output->set_status_header(REST_Controller::HTTP_NOT_FOUND);
$this->outputJson('NOT FOUND');
} else {
$this->outputJson(getData($result));
}
}
public function set()
{
$this->load->library('AuthLib');
$this->load->library('form_validation');
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
if ($this->form_validation->run() == false) {
$this->output->set_status_header(HTTP_BAD_REQUEST);
return $this->outputJson($this->form_validation->error_array());
}
$stdsem = $this->input->post('studiensemester');
$this->load->model('system/Variable_model', 'VariableModel');
$result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem);
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
return $this->outputJson(getError($result));
}
$this->outputJsonSuccess(true);
}
}
@@ -26,6 +26,7 @@
<div id="main">
<router-view
default-semester="<?= $variables['semester_aktuell']; ?>"
active-addons="<?= defined('ACTIVE_ADDONS') ? ACTIVE_ADDONS : ''; ?>"
cis-root="<?= CIS_ROOT; ?>"
:permissions="<?= htmlspecialchars(json_encode($permissions)); ?>"
@@ -20,17 +20,20 @@ import VerticalSplit from "../verticalsplit/verticalsplit.js";
import StvVerband from "./Studentenverwaltung/Verband.js";
import StvList from "./Studentenverwaltung/List.js";
import StvDetails from "./Studentenverwaltung/Details.js";
import StvStudiensemester from "./Studentenverwaltung/Studiensemester.js";
export default {
components: {
FhcSearchbar,
VerticalSplit,
StvVerband,
StvList,
StvDetails,
VerticalSplit
StvStudiensemester
},
props: {
defaultSemester: String,
config: Object,
permissions: Object,
cisRoot: String,
@@ -89,6 +92,9 @@ export default {
},
searchfunction(searchsettings) {
return Vue.$fhcapi.Search.search(searchsettings);
},
studiensemesterChanged() {
this.$refs.stvList.updateUrl();
}
},
mounted() {
@@ -112,7 +118,8 @@ export default {
<div class="offcanvas-header justify-content-end px-1 d-md-none">
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<stv-verband @select-verband="onSelectVerband"></stv-verband>
<stv-verband @select-verband="onSelectVerband" class="col" style="height:0%"></stv-verband>
<stv-studiensemester :default="defaultSemester" @changed="studiensemesterChanged"></stv-studiensemester>
</nav>
<main class="col-md-8 ms-sm-auto col-lg-9 col-xl-10">
<vertical-split>
@@ -78,22 +78,23 @@ export default {
this.$emit('update:selected', data);
},
updateUrl(url) {
this.$refs.table.tabulator.on("dataProcessed", () => {
let rows = this.$refs.table.tabulator.getRows();
if (rows.length && rows.length == 1) {
this.$refs.table.tabulator.selectRow();
}
});
if (url)
url = CoreRESTClient._generateRouterURI(url);
if (!this.$refs.table.tableBuilt)
this.$refs.table.tabulator.on("tableBuilt", () => {
this.$refs.table.tabulator.setData(CoreRESTClient._generateRouterURI(url));
this.$refs.table.tabulator.setData(url);
});
else
this.$refs.table.tabulator.setData(CoreRESTClient._generateRouterURI(url));
this.$refs.table.tabulator.setData(url);
}
},
mounted() {
this.$refs.table.tabulator.on("dataProcessed", () => {
let rows = this.$refs.table.tabulator.getRows();
if (rows.length && rows.length == 1) {
this.$refs.table.tabulator.selectRow();
}
});
},
template: `
<div class="stv-list h-100 pt-3">
@@ -0,0 +1,86 @@
import {CoreRESTClient} from '../../../RESTClient.js';
export default {
emits: [
'changed'
],
props: {
default: {
type: String,
default: ''
}
},
data() {
return {
current: 0,
loading: true,
list: []
};
},
methods: {
set(n) {
this.loading = true;
let fallback = this.current;
this.current = n;
this.save(fallback);
},
next() {
this.loading = true;
let fallback = this.current;
if (this.current++ >= this.list.length)
this.current = this.list.length - 1;
this.save(fallback);
},
prev() {
this.loading = true;
let fallback = this.current;
if (this.current-- < 0)
this.current = 0;
this.save(fallback);
},
save(fallback) {
CoreRESTClient
.post('components/stv/studiensemester/set', {
studiensemester: this.list[this.current]
})
.then(() => {
this.loading = false;
this.$emit('changed');
})
.catch(() => {
this.current = fallback;
// TODO(chris): emit error
});
}
},
created() {
CoreRESTClient
.get('components/stv/studiensemester')
.then(result => result.data)
.then(result => {
this.list = result.map(el => el.studiensemester_kurzbz);
this.loading = false;
this.current = this.list.indexOf(this.default);
})
.catch(error => {
console.error(error);
});
},
template: `
<div class="stv-studiensemester">
<div class="btn-group w-100 dropup" role="group" aria-label="Basic example">
<button type="button" class="btn btn-outline-secondary flex-grow-0" @click="prev"><i class="fa-solid fa-caret-left"></i></button>
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="dropdown" data-bs-display="static" data-bs-offset="0,0" aria-expanded="false">
{{list[current]}}
<i v-if="loading" class="fa-solid fa-spinner fa-spin"></i>
</button>
<ul class="dropdown-menu dropdown-menu-dark overflow-auto w-100" style="max-height:60vh">
<li v-for="(item, index) in list" :key="index">
<a class="dropdown-item" :class="{active: index == current}" :aria-current="index == current ? 'true' : 'false'" href="#" @click="set(index)">{{item}}</a>
</li>
</ul>
<button type="button" class="btn btn-outline-secondary flex-grow-0" @click="next"><i class="fa-solid fa-caret-right"></i></button>
</div>
</div>
`
}