mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
added set language feature; phrasen plugin with optional reload if non responsive phrasen are used; stundenplan header mode & buttons reworked
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
<?php
|
||||
// Header menu
|
||||
|
||||
if(defined('CIS4') && CIS4) {
|
||||
$root = APP_ROOT;
|
||||
} else {
|
||||
$root = CIS_ROOT;
|
||||
}
|
||||
|
||||
$config['navigation_header'] = array(
|
||||
'*' => array(
|
||||
'fhcomplete' => array(
|
||||
@@ -50,7 +56,7 @@ $config['navigation_header'] = array(
|
||||
'requiredPermissions' => 'basis/vilesci:r',
|
||||
'children' => array(
|
||||
'cis' => array(
|
||||
'link' => CIS_ROOT,
|
||||
'link' => $root,
|
||||
'icon' => '',
|
||||
'description' => 'CIS',
|
||||
'sort' => 10
|
||||
@@ -223,7 +229,7 @@ $config['navigation_menu']['organisation/Reihungstest/index'] = array(
|
||||
'target' => '_blank'
|
||||
),
|
||||
'auswertung' => array(
|
||||
'link' => CIS_ROOT.'/cis/testtool/admin/auswertung.php',
|
||||
'link' => $root.'/cis/testtool/admin/auswertung.php',
|
||||
'description' => 'Auswertung',
|
||||
'icon' => 'list-alt',
|
||||
'sort' => 1,
|
||||
@@ -319,5 +325,4 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
|
||||
'target' => '_blank',
|
||||
'requiredPermissions' => array('admin:rw')
|
||||
),
|
||||
);
|
||||
|
||||
);
|
||||
@@ -34,6 +34,7 @@ class Cis4 extends FHC_Controller
|
||||
show_error("name couldn't be loaded for username ".getAuthUID());
|
||||
}
|
||||
$begruesung = getData($begruesung);
|
||||
|
||||
$this->load->view('CisVue/Dashboard.php',["name"=> $begruesung]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,15 @@ class Dashboard extends Auth_Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->load->view('CisVue/Dashboard.php');
|
||||
|
||||
$this->load->model('person/Person_model','PersonModel');
|
||||
$begruesung = $this->PersonModel->getFirstName(getAuthUID());
|
||||
if(isError($begruesung))
|
||||
{
|
||||
show_error("name couldn't be loaded for username ".getAuthUID());
|
||||
}
|
||||
$begruesung = getData($begruesung);
|
||||
$this->load->view('CisVue/Dashboard.php',["name"=> $begruesung]);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,8 +28,11 @@ class Phrasen extends FHCAPI_Controller
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'loadModule' => self::PERM_ANONYMOUS
|
||||
'loadModule' => self::PERM_ANONYMOUS,
|
||||
'setLanguage' => self::PERM_ANONYMOUS
|
||||
]);
|
||||
|
||||
$this->load->helper('hlp_language');
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
@@ -43,4 +46,18 @@ class Phrasen extends FHCAPI_Controller
|
||||
$this->load->library('PhrasesLib', [$module], 'pj');
|
||||
$this->terminateWithSuccess(json_decode($this->pj->getJSON()));
|
||||
}
|
||||
}
|
||||
|
||||
public function setLanguage()
|
||||
{
|
||||
$postParams = $this->getPostJSON();
|
||||
$language = $postParams->language;
|
||||
$categories = $postParams->categories;
|
||||
|
||||
setUserLanguage($language);
|
||||
|
||||
$this->load->library('PhrasesLib', array($categories, $language), 'p');
|
||||
|
||||
$phrases = $this->p->setPhrases($categories, $language);
|
||||
$this->terminateWithSuccess($phrases);
|
||||
}
|
||||
}
|
||||
@@ -200,6 +200,17 @@ class PhrasesLib
|
||||
return '<< PHRASE '.$phrase.' >>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Workaround to reload the phrases array on an already constructed library.
|
||||
* @parameters -> look for _setPhrases docs
|
||||
*/
|
||||
public function setPhrases($categories, $language)
|
||||
{
|
||||
if (count($categories) > 0) $this->_setPhrases($categories, $language);
|
||||
|
||||
return $this->_phrases;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Private methods
|
||||
|
||||
@@ -319,6 +330,7 @@ class PhrasesLib
|
||||
{
|
||||
$this->_phrases = $phrases->retval;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -329,4 +341,4 @@ class PhrasesLib
|
||||
{
|
||||
return json_encode($this->_phrases);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -36,11 +36,13 @@ if (!isset($menu)) {
|
||||
logo-url="<?= base_url('/public/images/logo-300x160.png'); ?>"
|
||||
avatar-url="<?= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>"
|
||||
logout-url="<?= site_url('Cis/Auth/logout'); ?>"
|
||||
:selectedtypes="selectedtypes"
|
||||
at-flag-url="<?= base_url('/public/images/icons/at.png'); ?>"
|
||||
uk-flag-url="<?= base_url('/public/images/icons/uk.png'); ?>"
|
||||
:selectedtypes="selectedtypes"
|
||||
:searchbaroptions="searchbaroptions"
|
||||
:searchfunction="searchfunction"
|
||||
:menu="<?= htmlspecialchars(json_encode(array_values($menu)), ENT_QUOTES, 'UTF-8') ?>"
|
||||
></cis-menu>
|
||||
</header>
|
||||
|
||||
<main id="cis-main" class="flex-grow-1 overflow-scroll p-4">
|
||||
<main id="cis-main" class="flex-grow-1 p-4">
|
||||
+32
-1
@@ -218,12 +218,27 @@ html {
|
||||
max-height: calc(100vh - var(--fhc-cis-header-height));
|
||||
}
|
||||
|
||||
#nav-user-menu img {
|
||||
object-fit: cover;
|
||||
height: calc( 3 * var(--fhc-cis-header-py));
|
||||
}
|
||||
|
||||
#fhc-languages {
|
||||
display: flex;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#fhc-languages .btn {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/* desktop */
|
||||
@media (min-width: 992px) {
|
||||
body {
|
||||
display: flex;
|
||||
padding-top: var(--fhc-cis-header-height);
|
||||
width: 100vw;
|
||||
width: 99vw;
|
||||
/* overflow: visible !important; */
|
||||
}
|
||||
#cis-header {
|
||||
@@ -310,6 +325,22 @@ html {
|
||||
min-width: var(--fhc-cis-menu-width);
|
||||
background-color: var(--fhc-cis-menu-lvl-2-bg);
|
||||
}
|
||||
|
||||
#nav-user-menu img {
|
||||
object-fit: cover;
|
||||
height: calc( 3 * var(--fhc-cis-header-py));
|
||||
}
|
||||
|
||||
#fhc-languages {
|
||||
display: flex;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#fhc-languages .btn {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#nav-main-menu {
|
||||
height: 100%;
|
||||
background-color: var(--fhc-cis-menu-bg);
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.5 KiB |
@@ -18,5 +18,9 @@
|
||||
export default {
|
||||
loadCategory(category) {
|
||||
return this.$fhcApi.get('/api/frontend/v1/phrasen/loadModule/' + category);
|
||||
},
|
||||
setLanguage(categories,language) {
|
||||
const payload = {categories, language}
|
||||
return this.$fhcApi.post('/api/frontend/v1/phrasen/setLanguage', payload);
|
||||
}
|
||||
};
|
||||
};
|
||||
@@ -1,10 +1,11 @@
|
||||
import FhcSearchbar from "../components/searchbar/searchbar.js";
|
||||
import CisMenu from "../components/Cis/Menu.js";
|
||||
|
||||
import FhcApi from '../plugin/FhcApi.js';
|
||||
import Phrasen from '../plugin/Phrasen.js';
|
||||
import fhcapifactory from "./api/fhcapifactory.js";
|
||||
Vue.$fhcapi = fhcapifactory;
|
||||
|
||||
Vue.createApp({
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
FhcSearchbar,
|
||||
CisMenu
|
||||
@@ -90,4 +91,7 @@ Vue.createApp({
|
||||
|
||||
},
|
||||
}
|
||||
}).mount('#cis-header');
|
||||
});
|
||||
app.use(FhcApi);
|
||||
app.use(Phrasen);
|
||||
app.mount('#cis-header');
|
||||
@@ -35,6 +35,6 @@ const app = Vue.createApp({
|
||||
},
|
||||
});
|
||||
app.use(primevue.config.default, { zIndex: { overlay: 9999 } });
|
||||
app.use(Phrasen);
|
||||
app.use(Phrasen, {reload: true});
|
||||
app.mount("#cms");
|
||||
//#cms [data-confirm], #cms [data-href]
|
||||
//#cms [data-confirm], #cms [data-href]
|
||||
@@ -1,12 +1,13 @@
|
||||
import Phrasen from '../../mixins/Phrasen.js';
|
||||
// import Phrasen from '../../mixins/Phrasen.js';
|
||||
import Phrasen from '../../plugin/Phrasen.js';
|
||||
//import {TabulatorFull as Tabulator} from '../../../../vendor/olifolkerd/tabulator5/dist/js/tabulator_esm.min.js';
|
||||
//import CssLib from '../../helpers/CssLib.js';
|
||||
//CssLib.import('../../vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css');
|
||||
|
||||
const app = Vue.createApp({
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
// mixins: [
|
||||
// Phrasen
|
||||
// ],
|
||||
data() {
|
||||
return {
|
||||
inscriptiontable: null,
|
||||
@@ -90,4 +91,5 @@ const app = Vue.createApp({
|
||||
});
|
||||
}
|
||||
});
|
||||
app.use(Phrasen, {reload: true});
|
||||
app.mount('#content');
|
||||
@@ -5,4 +5,4 @@ Vue.createApp({
|
||||
components: {
|
||||
MylvStudent
|
||||
}
|
||||
}).use(Phrasen).mount('#content');
|
||||
}).use(Phrasen, {reload: true}).mount('#content');
|
||||
@@ -109,5 +109,5 @@ const app = Vue.createApp({
|
||||
`
|
||||
});
|
||||
app.config.unwrapInjectedRef = true;
|
||||
app.use(Phrasen);
|
||||
app.use(Phrasen, {reload: true});
|
||||
app.mount('#content');
|
||||
@@ -1,7 +1,9 @@
|
||||
import {CoreNavigationCmpt} from '../components/navigation/Navigation.js';
|
||||
import CoreDashboard from '../components/Dashboard/Dashboard.js';
|
||||
import FhcApi from '../../plugin/FhcApi.js';
|
||||
import Phrasen from '../../plugin/Phrasen.js';
|
||||
|
||||
Vue.createApp({
|
||||
const app = Vue.createApp({
|
||||
data: () => ({
|
||||
appSideMenuEntries: {}
|
||||
}),
|
||||
@@ -9,4 +11,7 @@ Vue.createApp({
|
||||
CoreNavigationCmpt,
|
||||
CoreDashboard
|
||||
}
|
||||
}).mount('#main');
|
||||
})
|
||||
app.use(FhcApi);
|
||||
app.use(Phrasen);
|
||||
app.mount('#main');
|
||||
@@ -20,5 +20,5 @@ const app = Vue.createApp({
|
||||
}
|
||||
});
|
||||
app
|
||||
.use(Phrasen)
|
||||
.mount('#wrapper');
|
||||
.use(Phrasen, {reload: true})
|
||||
.mount('#wrapper');
|
||||
@@ -5,7 +5,6 @@ export default {
|
||||
modes:{
|
||||
week:"Woche",
|
||||
month:"Monat",
|
||||
years:"Jahre",
|
||||
},
|
||||
}
|
||||
},
|
||||
@@ -44,9 +43,23 @@ export default {
|
||||
},
|
||||
template: `
|
||||
<div class="calendar-header card-header w-100" :class="classHeader">
|
||||
|
||||
<div class="row justify-content-end" style="position: absolute; width: 98%; pointer-events: none;">
|
||||
<div class="col-auto" style="pointer-events: all;">
|
||||
<div role="group" aria-label="Kalender Modus">
|
||||
<button type="button" :class="{'active':mode_kurzbz == mode}" style="margin-right: 4px;" @click.prevent="$emit('updateMode',mode_kurzbz)" class="btn btn-outline-secondary" v-for="(mode_bezeichnung,mode_kurzbz) in modes">
|
||||
<i v-if="mode_kurzbz == 'week'" class="fa fa-calendar-week"></i>
|
||||
<i v-else-if="mode_kurzbz == 'month'" class="fa fa-calendar-days"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<button class="btn btn-outline-secondary border-0 col-auto" :class="{'btn-sm':!this.size}" @click="$emit('prev')"><i class="fa fa-chevron-left"></i></button>
|
||||
<div class="col text-center">
|
||||
<div class="col-5 d-flex justify-content-end">
|
||||
<button class="btn btn-outline-secondary border-0" :class="{'btn-sm':!this.size}" @click="$emit('prev')"><i class="fa fa-chevron-left"></i></button>
|
||||
</div>
|
||||
<div class="justify-content-center text-center col-2">
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
<button class="btn btn-link link-secondary text-decoration-none" :class="{'btn-sm': !this.size}" @click="$emit('click')">
|
||||
{{ title }}
|
||||
@@ -54,14 +67,9 @@ export default {
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<button class="col-auto btn btn-outline-secondary border-0" :class="{'btn-sm': !this.size}" @click="$emit('next')"><i class="fa fa-chevron-right"></i></button>
|
||||
</div>
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-auto">
|
||||
<div class="btn-group" role="group" aria-label="Kalender Modus">
|
||||
<button type="button" :class="{'active':mode_kurzbz == mode}" @click.prevent="$emit('updateMode',mode_kurzbz)" class="btn btn-outline-secondary" v-for="(mode_bezeichnung,mode_kurzbz) in modes">{{mode_bezeichnung}}</button>
|
||||
</div>
|
||||
<div class="col-5 d-flex justify-content-start">
|
||||
<button class="btn btn-outline-secondary border-0" :class="{'btn-sm': !this.size}" @click="$emit('next')"><i class="fa fa-chevron-right"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>`
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,8 @@ export default {
|
||||
logoUrl: String,
|
||||
avatarUrl: String,
|
||||
logoutUrl: String,
|
||||
atFlagUrl: String,
|
||||
ukFlagUrl: String,
|
||||
selectedtypes: Array,
|
||||
searchbaroptions: Object,
|
||||
searchfunction: Function
|
||||
@@ -60,10 +62,14 @@ export default {
|
||||
|
||||
setActiveEntry(content_id){
|
||||
this.activeEntry = content_id;
|
||||
},
|
||||
handleChangeLanguage(lang) {
|
||||
this.$p.setLanguage(lang, this.$fhcApi)
|
||||
}
|
||||
},
|
||||
mounted(){
|
||||
this.entries = this.menu;
|
||||
this.$p.loadCategory(['ui', 'global'])
|
||||
},
|
||||
template: /*html*/`
|
||||
<!--<p>CISVUE HEADER</p>
|
||||
@@ -83,6 +89,10 @@ export default {
|
||||
<ul id="nav-user-menu" class="collapse list-unstyled" aria-labelledby="nav-user-btn">
|
||||
<li><a class="btn btn-level-2 rounded-0 d-block" href="#" id="menu-profil">Profil</a></li>
|
||||
<li><a class="btn btn-level-2 rounded-0 d-block" href="#">Ampeln</a></li>
|
||||
<li class="fhc-languages" style="text-align: center;">
|
||||
<a class="btn btn-level-2 rounded-0" href="#" @click="handleChangeLanguage('German')"><img :src="atFlagUrl"/></a>
|
||||
<a class="btn btn-level-2 rounded-0" href="#" @click="handleChangeLanguage('English')"><img :src="ukFlagUrl"/></a>
|
||||
</li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="btn btn-level-2 rounded-0 d-block" :href="logoutUrl">Logout</a></li>
|
||||
</ul>
|
||||
|
||||
@@ -2,6 +2,7 @@ import FhcApi from './FhcApi.js';
|
||||
|
||||
const categories = Vue.reactive({});
|
||||
const loadingModules = {};
|
||||
let reload = false;
|
||||
|
||||
function extractCategory(obj, category) {
|
||||
return obj.filter(e => e.category == category).reduce((res, elem) => {
|
||||
@@ -19,8 +20,19 @@ function getValueForLoadedPhrase(category, phrase, params) {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
const phrasen = {
|
||||
setLanguage(language, api) {
|
||||
const catArray = Object.keys(categories)
|
||||
return api.factory.phrasen.setLanguage(catArray, language).then(res => {
|
||||
if(reload) window.location.reload()
|
||||
|
||||
res.data.forEach(row => {
|
||||
categories[row.category][row.phrase] = row.text
|
||||
})
|
||||
|
||||
return res
|
||||
})
|
||||
},
|
||||
loadCategory(category) {
|
||||
if (Array.isArray(category))
|
||||
return Promise.all(category.map(this.config.globalProperties
|
||||
@@ -63,12 +75,14 @@ const phrasen = {
|
||||
|
||||
export default {
|
||||
install(app, options) {
|
||||
reload = options?.reload ?? reload
|
||||
app.use(FhcApi, options?.fhcApi || undefined);
|
||||
app.config.globalProperties.$p = {
|
||||
t: phrasen.t,
|
||||
loadCategory: cat => phrasen.loadCategory.call(app, cat),
|
||||
setLanguage: phrasen.setLanguage,
|
||||
t_ref: phrasen.t_ref
|
||||
};
|
||||
app.provide('$p', app.config.globalProperties.$p);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user